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
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Keeper | 12570830 | 1339 days ago | IN | 0 ETH | 0.00051299 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Strategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-04 */ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: Booster interface Booster { struct PoolInfo { address lptoken; address token; address gauge; address crvRewards; address stash; bool shutdown; } function poolInfo(uint256) external view returns(address,address,address,address,address, bool); // deposit lp tokens and stake function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool); // deposit all lp tokens and stake function depositAll(uint256 _pid, bool _stake) external returns(bool); // withdraw lp tokens function withdraw(uint256 _pid, uint256 _amount) external returns(bool); // withdraw all lp tokens function withdrawAll(uint256 _pid) external returns(bool); // claim crv + extra rewards function earmarkRewards(uint256 _pid) external returns(bool); // claim rewards on stash (msg.sender == stash) function claimRewards(uint256 _pid, address _gauge) external returns(bool); // delegate address votes on dao (needs to be voteDelegate) function vote(uint256 _voteId, address _votingAddress, bool _support) external returns(bool); function voteGaugeWeight(address[] calldata _gauge, uint256[] calldata _weight ) external returns(bool); } // Part: ICurveFi interface ICurveFi { function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount ) external payable; // crv.finance: Curve.fi Factory USD Metapool v2 function add_liquidity( address pool, uint256[4] calldata amounts, uint256 min_mint_amount ) external; function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function exchange_underlying( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256); function balances(int128) external view returns (uint256); function get_virtual_price() external view returns (uint256); } // Part: IERC20Metadata interface IERC20Metadata { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // Part: IStakedAave interface IStakedAave { function COOLDOWN_SECONDS() external view returns (uint256); function UNSTAKE_WINDOW() external view returns (uint256); function getTotalRewardsBalance(address) external view returns (uint256); function stakerRewardsToClaim(address) external view returns (uint256); function stakersCooldowns(address) external view returns (uint256); function stake(address to, uint256 amount) external; function redeem(address to, uint256 amount) external; function cooldown() external; function claimRewards(address to, uint256 amount) external; } // Part: Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/SafeMath /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: Rewards interface Rewards{ function pid() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function earned(address account) external view returns (uint256); function extraRewardsLength() external view returns (uint256); function extraRewards(uint256) external view returns (address); function rewardPerToken() external view returns (uint256); function rewardPerTokenStored() external view returns (uint256); function rewardRate() external view returns (uint256); function rewardToken() external view returns (address); function rewards(address) external view returns (uint256); function userRewardPerTokenPaid(address) external view returns (uint256); function stakingToken() external view returns (address); function stake(uint256) external returns (bool); function stakeAll() external returns (bool); function stakeFor(address, uint256) external returns (bool); function withdraw(uint256 amount, bool claim) external returns (bool); function withdrawAll(bool claim) external returns (bool); function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool); function withdrawAllAndUnwrap(bool claim) external; function getReward() external returns(bool); function getReward(address _account, bool _claimExtras) external returns(bool); function donate(uint256 _amount) external returns(bool); } // Part: Uni interface Uni { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); /* Uniswap V3 */ struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } function exactInput( ExactInputParams calldata params ) external payable returns (uint256 amountOut); function quoteExactInput( bytes calldata path, uint256 amountIn ) external view returns (uint256 amountOut); } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: iearn-finance/[email protected]/VaultAPI interface VaultAPI is IERC20 { function name() external view returns (string calldata); function symbol() external view returns (string calldata); function decimals() external view returns (uint256); function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: iearn-finance/[email protected]/BaseStrategy /** * @title Yearn Base Strategy * @author yearn.finance * @notice * BaseStrategy implements all of the required functionality to interoperate * closely with the Vault contract. This contract should be inherited and the * abstract methods implemented to adapt the Strategy to the particular needs * it has to create a return. * * Of special interest is the relationship between `harvest()` and * `vault.report()'. `harvest()` may be called simply because enough time has * elapsed since the last report, and not because any funds need to be moved * or positions adjusted. This is critical so that the Vault may maintain an * accurate picture of the Strategy's performance. See `vault.report()`, * `harvest()`, and `harvestTrigger()` for further details. */ abstract contract BaseStrategy { using SafeMath for uint256; using SafeERC20 for IERC20; string public metadataURI; /** * @notice * Used to track which version of `StrategyAPI` this Strategy * implements. * @dev The Strategy's version must match the Vault's `API_VERSION`. * @return A string which holds the current API version of this contract. */ function apiVersion() public pure returns (string memory) { return "0.3.5"; } /** * @notice This Strategy's name. * @dev * You can use this field to manage the "version" of this Strategy, e.g. * `StrategySomethingOrOtherV1`. However, "API Version" is managed by * `apiVersion()` function above. * @return This Strategy's name. */ function name() external virtual view returns (string memory); /** * @notice * The amount (priced in want) of the total assets managed by this strategy should not count * towards Yearn's TVL calculations. * @dev * You can override this field to set it to a non-zero value if some of the assets of this * Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault. * Note that this value must be strictly less than or equal to the amount provided by * `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets. * Also note that this value is used to determine the total assets under management by this * strategy, for the purposes of computing the management fee in `Vault` * @return * The amount of assets this strategy manages that should not be included in Yearn's Total Value * Locked (TVL) calculation across it's ecosystem. */ function delegatedAssets() external virtual view returns (uint256) { return 0; } VaultAPI public vault; address public strategist; address public rewards; address public keeper; IERC20 public want; // So indexers can keep track of this event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding); event UpdatedStrategist(address newStrategist); event UpdatedKeeper(address newKeeper); event UpdatedRewards(address rewards); event UpdatedMinReportDelay(uint256 delay); event UpdatedMaxReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); event UpdatedMetadataURI(string metadataURI); // The minimum number of seconds between harvest calls. See // `setMinReportDelay()` for more details. uint256 public minReportDelay; // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay; // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyStrategist() { require(msg.sender == strategist, "!strategist"); _; } modifier onlyGovernance() { require(msg.sender == governance(), "!authorized"); _; } modifier onlyKeepers() { require( msg.sender == keeper || msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } constructor(address _vault) public { _initialize(_vault, msg.sender, msg.sender, msg.sender); } /** * @notice * Initializes the Strategy, this is called only once, when the * contract is deployed. * @dev `_vault` should implement `VaultAPI`. * @param _vault The address of the Vault responsible for this Strategy. */ function _initialize( address _vault, address _strategist, address _rewards, address _keeper ) internal { require(address(want) == address(0), "Strategy already initialized"); vault = VaultAPI(_vault); want = IERC20(vault.token()); want.safeApprove(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = _strategist; rewards = _rewards; keeper = _keeper; // initialize variables minReportDelay = 0; maxReportDelay = 86400; profitFactor = 100; debtThreshold = 0; vault.approve(rewards, uint256(-1)); // Allow rewards to be pulled } /** * @notice * Used to change `strategist`. * * This may only be called by governance or the existing strategist. * @param _strategist The new address to assign as `strategist`. */ function setStrategist(address _strategist) external onlyAuthorized { require(_strategist != address(0)); strategist = _strategist; emit UpdatedStrategist(_strategist); } /** * @notice * Used to change `keeper`. * * `keeper` is the only address that may call `tend()` or `harvest()`, * other than `governance()` or `strategist`. However, unlike * `governance()` or `strategist`, `keeper` may *only* call `tend()` * and `harvest()`, and no other authorized functions, following the * principle of least privilege. * * This may only be called by governance or the strategist. * @param _keeper The new address to assign as `keeper`. */ function setKeeper(address _keeper) external onlyAuthorized { require(_keeper != address(0)); keeper = _keeper; emit UpdatedKeeper(_keeper); } /** * @notice * Used to change `rewards`. EOA or smart contract which has the permission * to pull rewards from the vault. * * This may only be called by the strategist. * @param _rewards The address to use for pulling rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); vault.approve(rewards, 0); rewards = _rewards; vault.approve(rewards, uint256(-1)); emit UpdatedRewards(_rewards); } /** * @notice * Used to change `minReportDelay`. `minReportDelay` is the minimum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the minimum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The minimum number of seconds to wait between harvests. */ function setMinReportDelay(uint256 _delay) external onlyAuthorized { minReportDelay = _delay; emit UpdatedMinReportDelay(_delay); } /** * @notice * Used to change `maxReportDelay`. `maxReportDelay` is the maximum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the maximum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The maximum number of seconds to wait between harvests. */ function setMaxReportDelay(uint256 _delay) external onlyAuthorized { maxReportDelay = _delay; emit UpdatedMaxReportDelay(_delay); } /** * @notice * Used to change `profitFactor`. `profitFactor` is used to determine * if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _profitFactor A ratio to multiply anticipated * `harvest()` gas cost against. */ function setProfitFactor(uint256 _profitFactor) external onlyAuthorized { profitFactor = _profitFactor; emit UpdatedProfitFactor(_profitFactor); } /** * @notice * Sets how far the Strategy can go into loss without a harvest and report * being required. * * By default this is 0, meaning any losses would cause a harvest which * will subsequently report the loss to the Vault for tracking. (See * `harvestTrigger()` for more details.) * * This may only be called by governance or the strategist. * @param _debtThreshold How big of a loss this Strategy may carry without * being required to report to the Vault. */ function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized { debtThreshold = _debtThreshold; emit UpdatedDebtThreshold(_debtThreshold); } /** * @notice * Used to change `metadataURI`. `metadataURI` is used to store the URI * of the file describing the strategy. * * This may only be called by governance or the strategist. * @param _metadataURI The URI that describe the strategy. */ function setMetadataURI(string calldata _metadataURI) external onlyAuthorized { metadataURI = _metadataURI; emit UpdatedMetadataURI(_metadataURI); } /** * Resolve governance address from Vault contract, used to make assertions * on protected functions in the Strategy. */ function governance() internal view returns (address) { return vault.governance(); } /** * @notice * Provide an accurate estimate for the total amount of assets * (principle + return) that this Strategy is currently managing, * denominated in terms of `want` tokens. * * This total should be "realizable" e.g. the total value that could * *actually* be obtained from this Strategy if it were to divest its * entire position based on current on-chain conditions. * @dev * Care must be taken in using this function, since it relies on external * systems, which could be manipulated by the attacker to give an inflated * (or reduced) value produced by this function, based on current on-chain * conditions (e.g. this function is possible to influence through * flashloan attacks, oracle manipulations, or other DeFi attack * mechanisms). * * It is up to governance to use this function to correctly order this * Strategy relative to its peers in the withdrawal queue to minimize * losses for the Vault based on sudden withdrawals. This value should be * higher than the total debt of the Strategy and higher than its expected * value to be "safe". * @return The estimated total assets in this Strategy. */ function estimatedTotalAssets() public virtual view returns (uint256); /* * @notice * Provide an indication of whether this strategy is currently "active" * in that it is managing an active position, or will manage a position in * the future. This should correlate to `harvest()` activity, so that Harvest * events can be tracked externally by indexing agents. * @return True if the strategy is actively managing a position. */ function isActive() public view returns (bool) { return vault.strategies(address(this)).debtRatio > 0 || estimatedTotalAssets() > 0; } /** * Perform any Strategy unwinding or other calls necessary to capture the * "free return" this Strategy has generated since the last time its core * position(s) were adjusted. Examples include unwrapping extra rewards. * This call is only used during "normal operation" of a Strategy, and * should be optimized to minimize losses as much as possible. * * This method returns any realized profits and/or realized losses * incurred, and should return the total amounts of profits/losses/debt * payments (in `want` tokens) for the Vault's accounting (e.g. * `want.balanceOf(this) >= _debtPayment + _profit - _loss`). * * `_debtOutstanding` will be 0 if the Strategy is not past the configured * debt limit, otherwise its value will be how far past the debt limit * the Strategy is. The Strategy's debt limit is configured in the Vault. * * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`. * It is okay for it to be less than `_debtOutstanding`, as that * should only used as a guide for how much is left to pay back. * Payments should be made to minimize loss from slippage, debt, * withdrawal fees, etc. * * See `vault.debtOutstanding()`. */ function prepareReturn(uint256 _debtOutstanding) internal virtual returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ); /** * Perform any adjustments to the core position(s) of this Strategy given * what change the Vault made in the "investable capital" available to the * Strategy. Note that all "free capital" in the Strategy after the report * was made is available for reinvestment. Also note that this number * could be 0, and you should handle that scenario accordingly. * * See comments regarding `_debtOutstanding` on `prepareReturn()`. */ function adjustPosition(uint256 _debtOutstanding) internal virtual; /** * Liquidate up to `_amountNeeded` of `want` of this strategy's positions, * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`. * This function should return the amount of `want` tokens made available by the * liquidation. If there is a difference between them, `_loss` indicates whether the * difference is due to a realized loss, or if there is some other sitution at play * (e.g. locked funds) where the amount made available is less than what is needed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * @notice * Provide a signal to the keeper that `tend()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `tend()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `tend()` is not called * shortly, then this can return `true` even if the keeper might be * "at a loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCost The keeper's estimated cast cost to call `tend()`. * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCost) public virtual view returns (bool) { // We usually don't need tend, but if there are positions that need // active maintainence, overriding this function is how you would // signal for that. return false; } /** * @notice * Adjust the Strategy's position. The purpose of tending isn't to * realize gains, but to maximize yield by reinvesting any returns. * * See comments on `adjustPosition()`. * * This may only be called by governance, the strategist, or the keeper. */ function tend() external onlyKeepers { // Don't take profits with this call, but adjust for better gains adjustPosition(vault.debtOutstanding()); } /** * @notice * Provide a signal to the keeper that `harvest()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `harvest()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `harvest()` is not called * shortly, then this can return `true` even if the keeper might be "at a * loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `tendTrigger` should never return `true` at the * same time. * * See `min/maxReportDelay`, `profitFactor`, `debtThreshold` to adjust the * strategist-controlled parameters that will influence whether this call * returns `true` or not. These parameters will be used in conjunction * with the parameters reported to the Vault (see `params`) to determine * if calling `harvest()` is merited. * * It is expected that an external system will check `harvestTrigger()`. * This could be a script run off a desktop or cloud bot (e.g. * https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py), * or via an integration with the Keep3r network (e.g. * https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol). * @param callCost The keeper's estimated cast cost to call `harvest()`. * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCost) public virtual view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should not trigger if we haven't waited long enough since previous harvest if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; // Should trigger if hasn't been called in a while if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; // If some amount is owed, pay it back // NOTE: Since debt is based on deposits, it makes sense to guard against large // changes to the value from triggering a harvest directly through user // behavior. This should ensure reasonable resistance to manipulation // from user-initiated withdrawals as the outstanding debt fluctuates. uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; // Check for profits and losses uint256 total = estimatedTotalAssets(); // Trigger if we have a loss to report if (total.add(debtThreshold) < params.totalDebt) return true; uint256 profit = 0; if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit! // Otherwise, only trigger if it "makes sense" economically (gas cost // is <N% of value moved) uint256 credit = vault.creditAvailable(); return (profitFactor.mul(callCost) < credit.add(profit)); } /** * @notice * Harvests the Strategy, recognizing any profits or losses and adjusting * the Strategy's position. * * In the rare case the Strategy is in emergency shutdown, this will exit * the Strategy's position. * * This may only be called by governance, the strategist, or the keeper. * @dev * When `harvest()` is called, the Strategy reports to the Vault (via * `vault.report()`), so in some cases `harvest()` must be called in order * to take in profits, to borrow newly available funds from the Vault, or * otherwise adjust its position. In other cases `harvest()` must be * called to report to the Vault on the Strategy's position, especially if * any losses have occurred. */ function harvest() external onlyKeepers { uint256 profit = 0; uint256 loss = 0; uint256 debtOutstanding = vault.debtOutstanding(); uint256 debtPayment = 0; if (emergencyExit) { // Free up as much capital as possible uint256 totalAssets = estimatedTotalAssets(); // NOTE: use the larger of total assets or debt outstanding to book losses properly (debtPayment, loss) = liquidatePosition(totalAssets > debtOutstanding ? totalAssets : debtOutstanding); // NOTE: take up any remainder here as profit if (debtPayment > debtOutstanding) { profit = debtPayment.sub(debtOutstanding); debtPayment = debtOutstanding; } } else { // Free up returns for Vault to pull (profit, loss, debtPayment) = prepareReturn(debtOutstanding); } // Allow Vault to take up to the "harvested" balance of this contract, // which is the amount it has earned since the last time it reported to // the Vault. debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); emit Harvested(profit, loss, debtPayment, debtOutstanding); } /** * @notice * Withdraws `_amountNeeded` to `vault`. * * This may only be called by the Vault. * @param _amountNeeded How much `want` to withdraw. * @return _loss Any realized losses */ function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) { require(msg.sender == address(vault), "!vault"); // Liquidate as much as possible to `want`, up to `_amountNeeded` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.safeTransfer(msg.sender, amountFreed); // NOTE: Reinvest anything leftover on next `tend`/`harvest` } /** * Do anything necessary to prepare this Strategy for migration, such as * transferring any reserve or LP tokens, CDPs, or other tokens or stores of * value. */ function prepareMigration(address _newStrategy) internal virtual; /** * @notice * Transfers all `want` from this Strategy to `_newStrategy`. * * This may only be called by governance or the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault) || msg.sender == governance()); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.safeTransfer(_newStrategy, want.balanceOf(address(this))); } /** * @notice * Activates emergency exit. Once activated, the Strategy will exit its * position upon the next harvest, depositing all funds into the Vault as * quickly as is reasonable given on-chain conditions. * * This may only be called by governance or the strategist. * @dev * See `vault.setEmergencyShutdown()` and `harvest()` for further details. */ function setEmergencyExit() external onlyAuthorized { emergencyExit = true; vault.revokeStrategy(); emit EmergencyExitEnabled(); } /** * Override this to add all tokens/tokenized positions this contract * manages on a *persistent* basis (e.g. not just for swapping back to * want ephemerally). * * NOTE: Do *not* include `want`, already included in `sweep` below. * * Example: * * function protectedTokens() internal override view returns (address[] memory) { * address[] memory protected = new address[](3); * protected[0] = tokenA; * protected[1] = tokenB; * protected[2] = tokenC; * return protected; * } */ function protectedTokens() internal virtual view returns (address[] memory); /** * @notice * Removes tokens from this Strategy that are not the type of tokens * managed by this Strategy. This may be used in case of accidentally * sending the wrong kind of token to this Strategy. * * Tokens will be sent to `governance()`. * * This will fail if an attempt is made to sweep `want`, or any tokens * that are protected by this Strategy. * * This may only be called by governance. * @dev * Implement `protectedTokens()` to specify any additional tokens that * should be protected from sweeping in addition to `want`. * @param _token The token to transfer out of this vault. */ function sweep(address _token) external onlyGovernance { require(_token != address(want), "!want"); require(_token != address(vault), "!shares"); address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).safeTransfer(governance(), IERC20(_token).balanceOf(address(this))); } } // Part: ConvexStable abstract contract ConvexStable is BaseStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant voter = address(0xF147b8125d2ef93FB6965Db97D6746952a133934); address public constant booster = address(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); address public constant cvx = address(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); address public constant crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); address public constant weth = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address public constant dai = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); // address public constant usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); // address public constant usdt = address(0xdAC17F958D2ee523a2206206994597C13D831ec7); // address public constant quoter = address(0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6); // address public constant uniswapv3 = address(0xE592427A0AEce92De3Edee1F18E0157C05861564); address public constant uniswap = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public constant sushiswap = address(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); uint256 public constant DENOMINATOR = 10000; bool public isClaimRewards; bool public isClaimExtras; uint256 public id; address public rewardContract; address public curve; address[] public dex; uint256 public keepCRV; constructor(address _vault) public BaseStrategy(_vault) { minReportDelay = 12 hours; maxReportDelay = 3 days; profitFactor = 1000; debtThreshold = 1e24; keepCRV = 1000; } function _approveBasic() internal { want.approve(booster, 0); want.approve(booster, type(uint256).max); IERC20(dai).safeApprove(curve, 0); IERC20(dai).safeApprove(curve, type(uint256).max); // IERC20(usdc).safeApprove(curve, 0); // IERC20(usdc).safeApprove(curve, type(uint256).max); // IERC20(usdt).safeApprove(curve, 0); // IERC20(usdt).safeApprove(curve, type(uint256).max); } function _approveDex() internal virtual { IERC20(crv).approve(dex[0], 0); IERC20(crv).approve(dex[0], type(uint256).max); IERC20(cvx).approve(dex[1], 0); IERC20(cvx).approve(dex[1], type(uint256).max); } function approveAll() external onlyAuthorized { _approveBasic(); _approveDex(); } function setKeepCRV(uint256 _keepCRV) external onlyAuthorized { keepCRV = _keepCRV; } function switchDex(uint256 _id, address _dex) external onlyAuthorized { dex[_id] = _dex; _approveDex(); } function setIsClaimRewards(bool _isClaimRewards) external onlyAuthorized { isClaimRewards = _isClaimRewards; } function setIsClaimExtras(bool _isClaimExtras) external onlyAuthorized { isClaimExtras = _isClaimExtras; } function withdrawToConvexDepositTokens() external onlyAuthorized { uint256 staked = Rewards(rewardContract).balanceOf(address(this)); Rewards(rewardContract).withdraw(staked, isClaimRewards); } function name() external view override returns (string memory) { return string(abi.encodePacked("Convex", IERC20Metadata(address(want)).symbol())); } function balanceOfWant() public view returns (uint256) { return want.balanceOf(address(this)); } function balanceOfPool() public view returns (uint256) { return Rewards(rewardContract).balanceOf(address(this)); } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit) return; uint256 _want = want.balanceOf(address(this)); if (_want > 0) { Booster(booster).deposit(id, _want, true); } } function _withdrawSome(uint256 _amount) internal returns (uint256) { _amount = Math.min(_amount, balanceOfPool()); uint _before = balanceOfWant(); Rewards(rewardContract).withdrawAndUnwrap(_amount, false); return balanceOfWant().sub(_before); } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { uint256 _balance = balanceOfWant(); if (_balance < _amountNeeded) { _liquidatedAmount = _withdrawSome(_amountNeeded.sub(_balance)); _liquidatedAmount = _liquidatedAmount.add(_balance); _loss = _amountNeeded.sub(_liquidatedAmount); // this should be 0. o/w there must be an error } else { _liquidatedAmount = _amountNeeded; } } function prepareMigration(address _newStrategy) internal override { Rewards(rewardContract).withdrawAllAndUnwrap(isClaimRewards); _migrateRewards(_newStrategy); } function _migrateRewards(address _newStrategy) internal virtual { IERC20(crv).safeTransfer(_newStrategy, IERC20(crv).balanceOf(address(this))); IERC20(cvx).safeTransfer(_newStrategy, IERC20(cvx).balanceOf(address(this))); } function _adjustCRV(uint256 _crv) internal returns (uint256) { uint256 _keepCRV = _crv.mul(keepCRV).div(DENOMINATOR); if (_keepCRV > 0) IERC20(crv).safeTransfer(voter, _keepCRV); return _crv.sub(_keepCRV); } function _claimableBasicInETH() internal view returns (uint256) { uint256 _crv = Rewards(rewardContract).earned(address(this)); // calculations pulled directly from CVX's contract for minting CVX per CRV claimed uint256 totalCliffs = 1000; uint256 maxSupply = 1e8 * 1e18; // 100m uint256 reductionPerCliff = 1e5 * 1e18; // 100k uint256 supply = IERC20(cvx).totalSupply(); uint256 _cvx; uint256 cliff = supply.div(reductionPerCliff); // mint if below total cliffs if (cliff < totalCliffs) { // for reduction% take inverse of current cliff uint256 reduction = totalCliffs.sub(cliff); // reduce _cvx = _crv.mul(reduction).div(totalCliffs); // supply cap check uint256 amtTillMax = maxSupply.sub(supply); if (_cvx > amtTillMax) { _cvx = amtTillMax; } } uint256 crvValue; if (_crv > 0) { address[] memory path = new address[](2); path[0] = crv; path[1] = weth; uint256[] memory crvSwap = Uni(dex[0]).getAmountsOut(_crv, path); crvValue = crvSwap[1]; } uint256 cvxValue; if (_cvx > 0) { address[] memory path = new address[](2); path[0] = cvx; path[1] = weth; uint256[] memory cvxSwap = Uni(dex[1]).getAmountsOut(_cvx, path); cvxValue = cvxSwap[1]; } return crvValue.add(cvxValue); } function _claimableInETH() internal virtual view returns (uint256 _claimable) { _claimable = _claimableBasicInETH(); } // NOTE: Can override `tendTrigger` and `harvestTrigger` if necessary function harvestTrigger(uint256 callCost) public override view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); if (params.activation == 0) return false; if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; uint256 total = estimatedTotalAssets(); if (total.add(debtThreshold) < params.totalDebt) return true; return (profitFactor.mul(callCost) < _claimableInETH()); } } // File: saave.sol contract Strategy is ConvexStable { address public constant stkaave = address(0x4da27a545c0c5B758a6BA100e3a049001de870f5); address public constant aave = address(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); address[] public pathTarget; constructor(address _vault) public ConvexStable(_vault) { curve = address(0xEB16Ae0052ed37f479f7fe63849198Df1765a733); id = 26; isClaimRewards = true; // default is true, turn off in emergency isClaimExtras = true; // add this if there are extra rewards (address _lp,,,address _reward,,) = Booster(booster).poolInfo(id); require(_lp == address(want), "constructor: incorrect lp token"); rewardContract = _reward; _approveBasic(); pathTarget = new address[](3); pathTarget[0] = dai; // crv path target pathTarget[1] = dai; // cvx path targe pathTarget[2] = dai; // aave path target dex = new address[](3); dex[0] = sushiswap; // crv dex[1] = sushiswap; // cvx dex[2] = sushiswap; // aave _approveDex(); } // >>> approve other rewards on dex function _approveDex() internal override { super._approveDex(); IERC20(aave).approve(dex[2], 0); IERC20(aave).approve(dex[2], type(uint256).max); } // >>> include other rewards function _migrateRewards(address _newStrategy) internal override { super._migrateRewards(_newStrategy); claim(); IERC20(stkaave).safeTransfer(_newStrategy, IERC20(stkaave).balanceOf(address(this))); IERC20(aave).safeTransfer(_newStrategy, IERC20(aave).balanceOf(address(this))); } // >>> include all other rewards in eth besides _claimableBasicInETH() function _claimableInETH() internal override view returns (uint256 _claimable) { _claimable = super._claimableInETH(); uint256 _aave = IERC20(aave).balanceOf(address(this)); if (_aave > 0) { address[] memory path = new address[](2); path[0] = aave; path[1] = weth; uint256[] memory swap = Uni(dex[2]).getAmountsOut(_aave, path); _claimable = _claimable.add(swap[1]); } } function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { uint before = balanceOfWant(); Rewards(rewardContract).getReward(address(this), isClaimExtras); uint256 _crv = IERC20(crv).balanceOf(address(this)); if (_crv > 0) { _crv = _adjustCRV(_crv); address[] memory path = new address[](3); path[0] = crv; path[1] = weth; path[2] = pathTarget[0]; Uni(dex[0]).swapExactTokensForTokens(_crv, uint256(0), path, address(this), now); } uint256 _cvx = IERC20(cvx).balanceOf(address(this)); if (_cvx > 0) { address[] memory path = new address[](3); path[0] = cvx; path[1] = weth; path[2] = pathTarget[1]; Uni(dex[1]).swapExactTokensForTokens(_cvx, uint256(0), path, address(this), now); } uint256 _stkaave = IERC20(stkaave).balanceOf(address(this)); if (_stkaave > 0) { (bool isCooldown, uint cooldown, uint cooldown_seconds, uint unstake_window) = _checkCooldown(); if (isCooldown) { claim(); // claim aave rewards IStakedAave(stkaave).redeem(address(this), _stkaave); } if (cooldown == 0 || block.timestamp > cooldown_seconds.add(unstake_window)) { IStakedAave(stkaave).cooldown(); } } uint256 _aave = IERC20(aave).balanceOf(address(this)); if (_aave > 0) { address[] memory path = new address[](3); path[0] = aave; path[1] = weth; path[2] = pathTarget[2]; Uni(dex[2]).swapExactTokensForTokens(_aave, uint256(0), path, address(this), now); } uint256 _dai = IERC20(dai).balanceOf(address(this)); if (_dai > 0) { ICurveFi(curve).add_liquidity([_dai, 0], 0, true); } _profit = want.balanceOf(address(this)).sub(before); uint _total = estimatedTotalAssets(); uint _debt = vault.strategies(address(this)).totalDebt; if(_total < _debt) { _loss = _debt - _total; _profit = 0; } if (_debtOutstanding > 0) { _withdrawSome(_debtOutstanding); _debtPayment = Math.min(_debtOutstanding, balanceOfWant().sub(_profit)); } } function claim() public { // claim aave rewards IStakedAave(stkaave).claimRewards(address(this), type(uint256).max); } function _checkCooldown() public view returns ( bool isCooldown, uint cooldown, uint cooldown_seconds, uint unstake_window ) { cooldown = IStakedAave(stkaave).stakersCooldowns(address(this)); cooldown_seconds = IStakedAave(stkaave).COOLDOWN_SECONDS(); unstake_window = IStakedAave(stkaave).UNSTAKE_WINDOW(); cooldown_seconds = cooldown.add(cooldown_seconds); isCooldown = ( cooldown != 0 && block.timestamp > cooldown_seconds && block.timestamp <= cooldown_seconds.add(unstake_window) ); } function protectedTokens() internal view override returns (address[] memory) { address[] memory protected = new address[](3); protected[0] = crv; protected[1] = cvx; protected[2] = aave; return protected; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_checkCooldown","outputs":[{"internalType":"bool","name":"isCooldown","type":"bool"},{"internalType":"uint256","name":"cooldown","type":"uint256"},{"internalType":"uint256","name":"cooldown_seconds","type":"uint256"},{"internalType":"uint256","name":"unstake_window","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimatedTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pathTarget","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isClaimExtras","type":"bool"}],"name":"setIsClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isClaimRewards","type":"bool"}],"name":"setIsClaimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCRV","type":"uint256"}],"name":"setKeepCRV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMinReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFactor","type":"uint256"}],"name":"setProfitFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stkaave","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_dex","type":"address"}],"name":"switchDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToConvexDepositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620060a9380380620060a9833981016040819052620000349162000f19565b80806200004481338080620003f9565b505061a8c06006556203f4806007556103e8600881905569d3c21bcecceda1000000600955600f55600d80546001600160a01b03191673eb16ae0052ed37f479f7fe63849198df1765a733179055601a600b819055600a805462ff00001961ff0019909116610100171662010000179055604051631526fe2760e01b8152600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe2791620000f29190600401620011d7565b60c06040518083038186803b1580156200010b57600080fd5b505afa15801562000120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000146919062000f3e565b5050600554939550935050506001600160a01b03808416911614620001885760405162461bcd60e51b81526004016200017f906200108b565b60405180910390fd5b600c80546001600160a01b0319166001600160a01b038316179055620001ad620005d5565b60408051600380825260808201909252906020820160608036833750508151620001df92601092506020019062000e70565b50600080516020620060898339815191526010600081548110620001ff57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000805160206200608983398151915260106001815481106200024c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000805160206200608983398151915260106002815481106200029957fe5b60009182526020918290200180546001600160a01b0319166001600160a01b0393909316929092179091556040805160038082526080820190925291820160608036833750508151620002f492600e92506020019062000e70565b5073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e6000815481106200031957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e6001815481106200036b57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e600281548110620003bd57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055620003f062000785565b50505062001213565b6005546001600160a01b031615620004255760405162461bcd60e51b81526004016200017f90620010c2565b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156200048257600080fd5b505afa15801562000497573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004bd919062000f19565b600580546001600160a01b0319166001600160a01b039283161790819055620004f791168560001962000924602090811b6200227317901c565b600280546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617908190556004805485851693169290921782556000600681905562015180600755606460085560095560015460405163095ea7b360e01b81529084169363095ea7b39362000578939091169160001991016200103d565b602060405180830381600087803b1580156200059357600080fd5b505af1158015620005a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ce919062000fca565b5050505050565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906200061e9073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016200103d565b602060405180830381600087803b1580156200063957600080fd5b505af11580156200064e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000674919062000fca565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620006bf9073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016200103d565b602060405180830381600087803b158015620006da57600080fd5b505af1158015620006ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000715919062000fca565b50600d546200074c9060008051602062006089833981519152906001600160a01b0316600062000924602090811b6200227317901c565b600d54620007839060008051602062006089833981519152906001600160a01b031660001962000924602090811b6200227317901c565b565b6200079a62000a3260201b620023721760201c565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e600281548110620007cc57fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000806926001600160a01b0390921691906004016200103d565b602060405180830381600087803b1580156200082157600080fd5b505af115801562000836573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085c919062000fca565b50737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e6002815481106200088f57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152620008cb916001600160a01b031690600019906004016200103d565b602060405180830381600087803b158015620008e657600080fd5b505af1158015620008fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000921919062000fca565b50565b801580620009b35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906200095d903090869060040162001023565b60206040518083038186803b1580156200097657600080fd5b505afa1580156200098b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009b1919062000fec565b155b620009d25760405162461bcd60e51b81526004016200017f906200117a565b62000a2d8363095ea7b360e01b8484604051602401620009f49291906200103d565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000caf16565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811062000a6457fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000a9e926001600160a01b0390921691906004016200103d565b602060405180830381600087803b15801562000ab957600080fd5b505af115801562000ace573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000af4919062000fca565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811062000b2757fe5b6000918252602090912001546040516001600160e01b031960e084901b16815262000b63916001600160a01b031690600019906004016200103d565b602060405180830381600087803b15801562000b7e57600080fd5b505af115801562000b93573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bb9919062000fca565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811062000bec57fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000c26926001600160a01b0390921691906004016200103d565b602060405180830381600087803b15801562000c4157600080fd5b505af115801562000c56573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c7c919062000fca565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106200088f57fe5b606062000d0b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000d4b60201b62002665179092919060201c565b80519091501562000a2d578080602001905181019062000d2c919062000fca565b62000a2d5760405162461bcd60e51b81526004016200017f9062001130565b606062000d5c848460008562000d64565b949350505050565b606062000d718562000e36565b62000d905760405162461bcd60e51b81526004016200017f90620010f9565b60006060866001600160a01b0316858760405162000daf919062001005565b60006040518083038185875af1925050503d806000811462000dee576040519150601f19603f3d011682016040523d82523d6000602084013e62000df3565b606091505b5091509150811562000e0957915062000d5c9050565b80511562000e1a5780518082602001fd5b8360405162461bcd60e51b81526004016200017f919062001056565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000d5c575050151592915050565b82805482825590600052602060002090810192821562000ec8579160200282015b8281111562000ec857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000e91565b5062000ed692915062000eda565b5090565b5b8082111562000ed65780546001600160a01b031916815560010162000edb565b80516001600160a01b038116811462000f1357600080fd5b92915050565b60006020828403121562000f2b578081fd5b62000f37838362000efb565b9392505050565b60008060008060008060c0878903121562000f57578182fd5b62000f63888862000efb565b955062000f74886020890162000efb565b945062000f85886040890162000efb565b935062000f96886060890162000efb565b925062000fa7886080890162000efb565b915060a0870151801515811462000fbc578182fd5b809150509295509295509295565b60006020828403121562000fdc578081fd5b8151801515811462000f37578182fd5b60006020828403121562000ffe578081fd5b5051919050565b6000825162001019818460208701620011e0565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262001077816040850160208701620011e0565b601f01601f19169190910160400192915050565b6020808252601f908201527f636f6e7374727563746f723a20696e636f7272656374206c7020746f6b656e00604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b60005b83811015620011fd578181015183820152602001620011e3565b838111156200120d576000848401525b50505050565b614e6680620012236000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80637165485d116101f45780639be287851161011a578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f14610691578063f4b9fa75146106a4578063fbfa77cf146106ac578063fcf2d0ad146106b4576103af565b8063ce5494bb14610650578063ec38a86214610663578063ed882c2b14610676578063efbb5cb014610689576103af565b8063c1a3d44c116100e9578063c1a3d44c1461061a578063c6def07614610622578063c76878031461062a578063c7b9d5301461063d576103af565b80639be28785146105fa5780639ec5a89414610602578063aced16611461060a578063af640d0f14610612576103af565b80638cdfe16611610192578063923c1d6111610161578063923c1d61146105bf578063955383bd146105c757806395e80c50146105da578063986905f0146105e2576103af565b80638cdfe166146105945780638e6350e21461059c57806391397ab4146105a4578063918f8674146105b7576103af565b80637fef901a116101ce5780637fef901a1461055e57806381639eda14610566578063819faf7b146105795780638516c2c814610581576103af565b80637165485d14610530578063748747e614610538578063750521f51461054b576103af565b80632e1a7d4d116102d957806346c96aac11610277578063650d188011610246578063650d188014610505578063693448e3146105185780636a4874a1146105205780636ea69d6214610528576103af565b806346c96aac146104da5780634e71d92d146104e25780635641ec03146104ea578063565399a0146104f2576103af565b806339a172a8116102b357806339a172a8146104af5780633fc8cef3146104c2578063440368a3146104ca5780634641257d146104d2576103af565b80632e1a7d4d1461048c57806334659dc51461049f578063380d0c08146104a7576103af565b80631d12f28b1161035157806324d16c1a1161032057806324d16c1a1461046157806325829410146104745780632681f7e41461047c57806328b7ccf714610484576103af565b80631d12f28b146104345780631f1fcd511461043c5780631fe4a6861461045157806322f3e2d414610459576103af565b80630acd095b1161038d5780630acd095b146103ef5780630f969b871461040457806311588086146104175780631c459a7f1461042c576103af565b806301681a62146103b457806303ee438c146103c957806306fdde03146103e7575b600080fd5b6103c76103c2366004614631565b6106bc565b005b6103d161085b565b6040516103de9190614a93565b60405180910390f35b6103d16108e9565b6103f761098e565b6040516103de9190614a3c565b6103c76104123660046148ad565b61099c565b61041f610a29565b6040516103de9190614ce3565b6103f7610aaf565b61041f610abe565b610444610ac4565b6040516103de9190614999565b610444610ad3565b6103f7610ae2565b61044461046f3660046148ad565b610b83565b6103d1610baa565b610444610bc9565b61041f610be1565b61041f61049a3660046148ad565b610be7565b6103c7610c42565b6103c7610da1565b6103c76104bd3660046148ad565b610e00565b610444610e82565b6103c7610e9a565b6103c76110c1565b61044461142b565b6103c7611443565b6103f76114b2565b6104446105003660046148ad565b6114bb565b6103f76105133660046148ad565b6114c8565b6104446114d0565b6104446114e8565b610444611500565b61044461150f565b6103c7610546366004614631565b61151e565b6103c7610559366004614736565b6115c9565b61041f611660565b6103c76105743660046148dd565b611666565b6104446116f7565b6103c761058f3660046146fe565b61170f565b61041f611778565b61041f61177e565b6103c76105b23660046148ad565b611783565b61041f611805565b61044461180b565b6103c76105d53660046148ad565b611823565b61041f611875565b6105ea61187b565b6040516103de9493929190614a47565b610444611a58565b610444611a70565b610444611a7f565b61041f611a8e565b61041f611a94565b610444611ac5565b6103c76106383660046146fe565b611add565b6103c761064b366004614631565b611b44565b6103c761065e366004614631565b611bef565b6103c7610671366004614631565b611d60565b6103f76106843660046148ad565b611ef7565b61041f6120cb565b6103c761069f3660046148ad565b6120e6565b610444612168565b610444612180565b6103c761218f565b6106c461267c565b6001600160a01b0316336001600160a01b0316146106fd5760405162461bcd60e51b81526004016106f490614bfa565b60405180910390fd5b6005546001600160a01b038281169116141561072b5760405162461bcd60e51b81526004016106f490614aeb565b6001546001600160a01b03828116911614156107595760405162461bcd60e51b81526004016106f490614ba2565b60606107636126f9565b905060005b81518110156107be5781818151811061077d57fe5b60200260200101516001600160a01b0316836001600160a01b031614156107b65760405162461bcd60e51b81526004016106f490614c69565b600101610768565b506108576107ca61267c565b6040516370a0823160e01b81526001600160a01b038516906370a08231906107f6903090600401614999565b60206040518083038186803b15801561080e57600080fd5b505afa158015610822573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084691906148c5565b6001600160a01b03851691906127e1565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561092e57600080fd5b505afa158015610942573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261096a91908101906147a3565b60405160200161097a919061496b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b03163314806109cd57506109b861267c565b6001600160a01b0316336001600160a01b0316145b6109e95760405162461bcd60e51b81526004016106f490614bfa565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a1e908390614ce3565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a5a903090600401614999565b60206040518083038186803b158015610a7257600080fd5b505afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa91906148c5565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b17903090600401614999565b6101206040518083038186803b158015610b3057600080fd5b505afa158015610b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b68919061482f565b604001511180610aaa57506000610b7d6120cb565b11905090565b600e8181548110610b9057fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610c145760405162461bcd60e51b81526004016106f490614b82565b6000610c1f83612800565b600554909350909150610c3c906001600160a01b031633836127e1565b50919050565b6002546001600160a01b0316331480610c735750610c5e61267c565b6001600160a01b0316336001600160a01b0316145b610c8f5760405162461bcd60e51b81526004016106f490614bfa565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610cc0903090600401614999565b60206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906148c5565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610d4f918591610100900460ff1690600401614d05565b602060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610857919061471a565b6002546001600160a01b0316331480610dd25750610dbd61267c565b6001600160a01b0316336001600160a01b0316145b610dee5760405162461bcd60e51b81526004016106f490614bfa565b610df6612852565b610dfe6129e2565b565b6002546001600160a01b0316331480610e315750610e1c61267c565b6001600160a01b0316336001600160a01b0316145b610e4d5760405162461bcd60e51b81526004016106f490614bfa565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a1e908390614ce3565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610ebd57506002546001600160a01b031633145b80610ee05750610ecb61267c565b6001600160a01b0316336001600160a01b0316145b80610f815750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3457600080fd5b505afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c919061464d565b6001600160a01b0316336001600160a01b0316145b806110225750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d919061464d565b6001600160a01b0316336001600160a01b0316145b61103e5760405162461bcd60e51b81526004016106f490614bfa565b6001546040805163bf3759b560e01b81529051610dfe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc91906148c5565b612ad7565b6004546001600160a01b03163314806110e457506002546001600160a01b031633145b8061110757506110f261267c565b6001600160a01b0316336001600160a01b0316145b806111a85750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611193919061464d565b6001600160a01b0316336001600160a01b0316145b806112495750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611234919061464d565b6001600160a01b0316336001600160a01b0316145b6112655760405162461bcd60e51b81526004016106f490614bfa565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f091906148c5565b600a5490915060009060ff161561134657600061130b6120cb565b905061132483821161131d578361131f565b815b612800565b94509150828211156113405761133a8284612c00565b94508291505b50611357565b61134f82612c4b565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061138b90879087908690600401614d69565b602060405180830381600087803b1580156113a557600080fd5b505af11580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906148c5565b91506113e882612ad7565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5098484838560405161141d9493929190614d7f565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b6040516309a99b4f60e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590639a99b4f09061147e903090600019906004016149e2565b600060405180830381600087803b15801561149857600080fd5b505af11580156114ac573d6000803e3d6000fd5b50505050565b600a5460ff1681565b60108181548110610b9057fe5b60005b919050565b734da27a545c0c5b758a6ba100e3a049001de870f581565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b031633148061154f575061153a61267c565b6001600160a01b0316336001600160a01b0316145b61156b5760405162461bcd60e51b81526004016106f490614bfa565b6001600160a01b03811661157e57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a1e908390614999565b6002546001600160a01b03163314806115fa57506115e561267c565b6001600160a01b0316336001600160a01b0316145b6116165760405162461bcd60e51b81526004016106f490614bfa565b61162260008383614556565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611654929190614a64565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611697575061168261267c565b6001600160a01b0316336001600160a01b0316145b6116b35760405162461bcd60e51b81526004016106f490614bfa565b80600e83815481106116c157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506108576129e2565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae981565b6002546001600160a01b0316331480611740575061172b61267c565b6001600160a01b0316336001600160a01b0316145b61175c5760405162461bcd60e51b81526004016106f490614bfa565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b03163314806117b4575061179f61267c565b6001600160a01b0316336001600160a01b0316145b6117d05760405162461bcd60e51b81526004016106f490614bfa565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a1e908390614ce3565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611854575061183f61267c565b6001600160a01b0316336001600160a01b0316145b6118705760405162461bcd60e51b81526004016106f490614bfa565b600f55565b60065481565b600080600080734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663091030c3306040518263ffffffff1660e01b81526004016118c19190614999565b60206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191191906148c5565b9250734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b03166372b49d636040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199891906148c5565b9150734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663359c4a966040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e757600080fd5b505afa1580156119fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1f91906148c5565b9050611a2b83836137de565b91508215801590611a3b57508142115b8015611a505750611a4c82826137de565b4211155b935090919293565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a5a903090600401614999565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611b0e5750611af961267c565b6001600160a01b0316336001600160a01b0316145b611b2a5760405162461bcd60e51b81526004016106f490614bfa565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611b755750611b6061267c565b6001600160a01b0316336001600160a01b0316145b611b915760405162461bcd60e51b81526004016106f490614bfa565b6001600160a01b038116611ba457600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a1e908390614999565b6001546001600160a01b0316331480611c205750611c0b61267c565b6001600160a01b0316336001600160a01b0316145b611c2957600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611c7057600080fd5b505afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca8919061464d565b6001600160a01b031614611cbb57600080fd5b611cc481613803565b6005546040516370a0823160e01b8152611d5d9183916001600160a01b03909116906370a0823190611cfa903090600401614999565b60206040518083038186803b158015611d1257600080fd5b505afa158015611d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4a91906148c5565b6005546001600160a01b031691906127e1565b50565b6002546001600160a01b03163314611d8a5760405162461bcd60e51b81526004016106f490614ac6565b6001600160a01b038116611d9d57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611dd4929116906000906004016149e2565b602060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e26919061471a565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611e7592911690600019906004016149e2565b602060405180830381600087803b158015611e8f57600080fd5b505af1158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec7919061471a565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a1e9190614999565b6000611f016145d0565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611f31903090600401614999565b6101206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f82919061482f565b9050806020015160001415611f9b5760009150506114cb565b60065460a0820151611fae904290612c00565b1015611fbe5760009150506114cb565b60075460a0820151611fd1904290612c00565b10611fe05760019150506114cb565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906148c5565b9050600954811115612074576001925050506114cb565b600061207e6120cb565b90508260c0015161209a600954836137de90919063ffffffff16565b10156120ac57600193505050506114cb565b6120b4613879565b6008546120c19087613a8d565b1095945050505050565b6000610aaa6120d8610a29565b6120e0611a94565b906137de565b6002546001600160a01b0316331480612117575061210261267c565b6001600160a01b0316336001600160a01b0316145b6121335760405162461bcd60e51b81526004016106f490614bfa565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a1e908390614ce3565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b03163314806121c057506121ab61267c565b6001600160a01b0316336001600160a01b0316145b6121dc5760405162461bcd60e51b81526004016106f490614bfa565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561223057600080fd5b505af1158015612244573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122fb5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906122a990309086906004016149ad565b60206040518083038186803b1580156122c157600080fd5b505afa1580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f991906148c5565b155b6123175760405162461bcd60e51b81526004016106f490614c8d565b61236d8363095ea7b360e01b84846040516024016123369291906149e2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ac7565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106123a357fe5b60009182526020822001546040516001600160e01b031960e085901b1681526123db926001600160a01b0390921691906004016149e2565b602060405180830381600087803b1580156123f557600080fd5b505af1158015612409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242d919061471a565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061245f57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612499916001600160a01b031690600019906004016149e2565b602060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb919061471a565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061251d57fe5b60009182526020822001546040516001600160e01b031960e085901b168152612555926001600160a01b0390921691906004016149e2565b602060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a7919061471a565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106125d957fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612613916001600160a01b031690600019906004016149e2565b602060405180830381600087803b15801561262d57600080fd5b505af1158015612641573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061471a565b60606126748484600085613b56565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa919061464d565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061274057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061278257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816002815181106127c457fe5b6001600160a01b0390921660209283029190910190910152905090565b61236d8363a9059cbb60e01b84846040516024016123369291906149e2565b600080600061280d611a94565b905083811015612848576128296128248583612c00565b613c1a565b925061283583826137de565b92506128418484612c00565b915061284c565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906128999073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016149e2565b602060405180830381600087803b1580156128b357600080fd5b505af11580156128c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128eb919061471a565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906129349073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016149e2565b602060405180830381600087803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612986919061471a565b50600d546129b490736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612273565b600d54610dfe90736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612273565b6129ea612372565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e600281548110612a1b57fe5b60009182526020822001546040516001600160e01b031960e085901b168152612a53926001600160a01b0390921691906004016149e2565b602060405180830381600087803b158015612a6d57600080fd5b505af1158015612a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa5919061471a565b50737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e6002815481106125d957fe5b600a5460ff1615612ae757611d5d565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612b18903090600401614999565b60206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6891906148c5565b9050801561085757600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612bae91908590600190600401614d51565b602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236d919061471a565b6000612c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cce565b90505b92915050565b600080600080612c59611a94565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612c9991309162010000900460ff16906004016149c7565b602060405180830381600087803b158015612cb357600080fd5b505af1158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ceb919061471a565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612d26903090600401614999565b60206040518083038186803b158015612d3e57600080fd5b505afa158015612d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7691906148c5565b90508015612f2f57612d8781613cfa565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612dcf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e1157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612e3f57fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612e6a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612e9857fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612ed6918691869030904290600401614d15565b600060405180830381600087803b158015612ef057600080fd5b505af1158015612f04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f2c9190810190614669565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612f69903090600401614999565b60206040518083038186803b158015612f8157600080fd5b505afa158015612f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb991906148c5565b905080156131655760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160008151811061300557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061304757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060018154811061307557fe5b9060005260206000200160009054906101000a90046001600160a01b0316816002815181106130a057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e6001815481106130ce57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed17399161310c918691869030904290600401614d15565b600060405180830381600087803b15801561312657600080fd5b505af115801561313a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131629190810190614669565b50505b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a082319061319f903090600401614999565b60206040518083038186803b1580156131b757600080fd5b505afa1580156131cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ef91906148c5565b9050801561330e5760008060008061320561187b565b935093509350935083156132875761321b611443565b6040516301e9a69560e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590631e9a69509061325490309089906004016149e2565b600060405180830381600087803b15801561326e57600080fd5b505af1158015613282573d6000803e3d6000fd5b505050505b82158061329c575061329982826137de565b42115b1561330957734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156132f057600080fd5b505af1158015613304573d6000803e3d6000fd5b505050505b505050505b6040516370a0823160e01b8152600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190613348903090600401614999565b60206040518083038186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339891906148c5565b905080156135445760408051600380825260808201909252606091602082018380368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106133e457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061342657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060028154811061345457fe5b9060005260206000200160009054906101000a90046001600160a01b03168160028151811061347f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e6002815481106134ad57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed1739916134eb918691869030904290600401614d15565b600060405180830381600087803b15801561350557600080fd5b505af1158015613519573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135419190810190614669565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a082319061357e903090600401614999565b60206040518083038186803b15801561359657600080fd5b505afa1580156135aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ce91906148c5565b9050801561367057600d54604080518082018252838152600060208201819052915163ee22be2360e01b81526001600160a01b039093169263ee22be239261361c92916001906004016149fb565b602060405180830381600087803b15801561363657600080fd5b505af115801561364a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366e91906148c5565b505b6005546040516370a0823160e01b81526136fc9188916001600160a01b03909116906370a08231906136a6903090600401614999565b60206040518083038186803b1580156136be57600080fd5b505afa1580156136d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f691906148c5565b90612c00565b985060006137086120cb565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061373e903090600401614999565b6101206040518083038186803b15801561375757600080fd5b505afa15801561376b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378f919061482f565b60c001519050808210156137a757818103995060009a505b8b156137cf576137b68c613c1a565b506137cc8c6137c78d6136f6611a94565b613d63565b98505b50505050505050509193909250565b600082820183811015612c425760405162461bcd60e51b81526004016106f490614b0a565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a29161383e9161010090910460ff1690600401614a3c565b600060405180830381600087803b15801561385857600080fd5b505af115801561386c573d6000803e3d6000fd5b50505050611d5d81613d79565b6000613883613edc565b6040516370a0823160e01b8152909150600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a08231906138c0903090600401614999565b60206040518083038186803b1580156138d857600080fd5b505afa1580156138ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391091906148c5565b90508015613a89576040805160028082526060808301845292602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061395a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061399c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6002815481106139cc57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613a079086908690600401614cec565b60006040518083038186803b158015613a1f57600080fd5b505afa158015613a33573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a5b9190810190614669565b9050613a8481600181518110613a6d57fe5b6020026020010151856137de90919063ffffffff16565b935050505b5090565b600082613a9c57506000612c45565b82820282848281613aa957fe5b0414612c425760405162461bcd60e51b81526004016106f490614b41565b6060613b1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126659092919063ffffffff16565b80519091501561236d5780806020019051810190613b3a919061471a565b61236d5760405162461bcd60e51b81526004016106f490614c1f565b6060613b6185613ee6565b613b7d5760405162461bcd60e51b81526004016106f490614bc3565b60006060866001600160a01b03168587604051613b9a919061494f565b60006040518083038185875af1925050503d8060008114613bd7576040519150601f19603f3d011682016040523d82523d6000602084013e613bdc565b606091505b50915091508115613bf05791506126749050565b805115613c005780518082602001fd5b8360405162461bcd60e51b81526004016106f49190614a93565b6000613c28826137c7610a29565b91506000613c34611a94565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613c68908690600090600401614d05565b602060405180830381600087803b158015613c8257600080fd5b505af1158015613c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cba919061471a565b50613cc7816136f6611a94565b9392505050565b60008184841115613cf25760405162461bcd60e51b81526004016106f49190614a93565b505050900390565b600080613d1e612710613d18600f5486613a8d90919063ffffffff16565b90613f1f565b90508015613d5957613d5973d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a133934836127e1565b613cc78382612c00565b6000818310613d725781612c42565b5090919050565b613d8281613f61565b613d8a611443565b6040516370a0823160e01b8152613e33908290734da27a545c0c5b758a6ba100e3a049001de870f5906370a0823190613dc7903090600401614999565b60206040518083038186803b158015613ddf57600080fd5b505afa158015613df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1791906148c5565b734da27a545c0c5b758a6ba100e3a049001de870f591906127e1565b6040516370a0823160e01b8152611d5d908290737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190613e70903090600401614999565b60206040518083038186803b158015613e8857600080fd5b505afa158015613e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec091906148c5565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae991906127e1565b6000610aaa6140b3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612674575050151592915050565b6000612c4283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061451f565b6040516370a0823160e01b815261400a90829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613f9e903090600401614999565b60206040518083038186803b158015613fb657600080fd5b505afa158015613fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fee91906148c5565b73d533a949740bb3306d119cc777fa900ba034cd5291906127e1565b6040516370a0823160e01b8152611d5d908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190614047903090600401614999565b60206040518083038186803b15801561405f57600080fd5b505afa158015614073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409791906148c5565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b91906127e1565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc262906140e6903090600401614999565b60206040518083038186803b1580156140fe57600080fd5b505afa158015614112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413691906148c5565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141ad57600080fd5b505afa1580156141c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141e591906148c5565b90506000806141f48385613f1f565b90508581101561423957600061420a8783612c00565b905061421a87613d188a84613a8d565b925060006142288786612c00565b905080841115614236578093505b50505b600087156143a057604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061428357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106142c557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6000815481106142f557fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90614330908d908690600401614cec565b60006040518083038186803b15801561434857600080fd5b505afa15801561435c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143849190810190614669565b90508060018151811061439357fe5b6020026020010151925050505b60008315614507576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106143ea57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061442c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60018154811061445c57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906144979089908690600401614cec565b60006040518083038186803b1580156144af57600080fd5b505afa1580156144c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144eb9190810190614669565b9050806001815181106144fa57fe5b6020026020010151925050505b61451182826137de565b995050505050505050505090565b600081836145405760405162461bcd60e51b81526004016106f49190614a93565b50600083858161454c57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106145975782800160ff198235161785556145c4565b828001600101855582156145c4579182015b828111156145c45782358255916020019190600101906145a9565b50613a8992915061461c565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613a89576000815560010161461d565b600060208284031215614642578081fd5b8135612c4281614e0d565b60006020828403121561465e578081fd5b8151612c4281614e0d565b6000602080838503121561467b578182fd5b825167ffffffffffffffff811115614691578283fd5b8301601f810185136146a1578283fd5b80516146b46146af82614dc1565b614d9a565b81815283810190838501858402850186018910156146d0578687fd5b8694505b838510156146f25780518352600194909401939185019185016146d4565b50979650505050505050565b60006020828403121561470f578081fd5b8135612c4281614e22565b60006020828403121561472b578081fd5b8151612c4281614e22565b60008060208385031215614748578081fd5b823567ffffffffffffffff8082111561475f578283fd5b818501915085601f830112614772578283fd5b813581811115614780578384fd5b866020828501011115614791578384fd5b60209290920196919550909350505050565b6000602082840312156147b4578081fd5b815167ffffffffffffffff808211156147cb578283fd5b818401915084601f8301126147de578283fd5b8151818111156147ec578384fd5b6147ff601f8201601f1916602001614d9a565b9150808252856020828501011115614815578384fd5b614826816020840160208601614de1565b50949350505050565b6000610120808385031215614842578182fd5b61484b81614d9a565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156148be578081fd5b5035919050565b6000602082840312156148d6578081fd5b5051919050565b600080604083850312156148ef578182fd5b82359150602083013561490181614e0d565b809150509250929050565b6000815180845260208085019450808401835b838110156149445781516001600160a01b03168752958201959082019060010161491f565b509495945050505050565b60008251614961818460208701614de1565b9190910192915050565b600065086dedceccaf60d31b8252825161498c816006850160208701614de1565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60808101818560005b6002811015614a23578151835260209283019290910190600101614a04565b5050508360408301528215156060830152949350505050565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152614ab2816040850160208701614de1565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600083825260406020830152612674604083018461490c565b9182521515602082015260400190565b600086825285602083015260a06040830152614d3460a083018661490c565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614db957600080fd5b604052919050565b600067ffffffffffffffff821115614dd7578081fd5b5060209081020190565b60005b83811015614dfc578181015183820152602001614de4565b838111156114ac5750506000910152565b6001600160a01b0381168114611d5d57600080fd5b8015158114611d5d57600080fdfea2646970667358221220e86748eb7a9e74e491e86c5844215db40246eca32df517bbe1d68c587697801e64736f6c634300060c00330000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000b4d1be44bff40ad6e506edf43156577a3f8672ec
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103af5760003560e01c80637165485d116101f45780639be287851161011a578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f14610691578063f4b9fa75146106a4578063fbfa77cf146106ac578063fcf2d0ad146106b4576103af565b8063ce5494bb14610650578063ec38a86214610663578063ed882c2b14610676578063efbb5cb014610689576103af565b8063c1a3d44c116100e9578063c1a3d44c1461061a578063c6def07614610622578063c76878031461062a578063c7b9d5301461063d576103af565b80639be28785146105fa5780639ec5a89414610602578063aced16611461060a578063af640d0f14610612576103af565b80638cdfe16611610192578063923c1d6111610161578063923c1d61146105bf578063955383bd146105c757806395e80c50146105da578063986905f0146105e2576103af565b80638cdfe166146105945780638e6350e21461059c57806391397ab4146105a4578063918f8674146105b7576103af565b80637fef901a116101ce5780637fef901a1461055e57806381639eda14610566578063819faf7b146105795780638516c2c814610581576103af565b80637165485d14610530578063748747e614610538578063750521f51461054b576103af565b80632e1a7d4d116102d957806346c96aac11610277578063650d188011610246578063650d188014610505578063693448e3146105185780636a4874a1146105205780636ea69d6214610528576103af565b806346c96aac146104da5780634e71d92d146104e25780635641ec03146104ea578063565399a0146104f2576103af565b806339a172a8116102b357806339a172a8146104af5780633fc8cef3146104c2578063440368a3146104ca5780634641257d146104d2576103af565b80632e1a7d4d1461048c57806334659dc51461049f578063380d0c08146104a7576103af565b80631d12f28b1161035157806324d16c1a1161032057806324d16c1a1461046157806325829410146104745780632681f7e41461047c57806328b7ccf714610484576103af565b80631d12f28b146104345780631f1fcd511461043c5780631fe4a6861461045157806322f3e2d414610459576103af565b80630acd095b1161038d5780630acd095b146103ef5780630f969b871461040457806311588086146104175780631c459a7f1461042c576103af565b806301681a62146103b457806303ee438c146103c957806306fdde03146103e7575b600080fd5b6103c76103c2366004614631565b6106bc565b005b6103d161085b565b6040516103de9190614a93565b60405180910390f35b6103d16108e9565b6103f761098e565b6040516103de9190614a3c565b6103c76104123660046148ad565b61099c565b61041f610a29565b6040516103de9190614ce3565b6103f7610aaf565b61041f610abe565b610444610ac4565b6040516103de9190614999565b610444610ad3565b6103f7610ae2565b61044461046f3660046148ad565b610b83565b6103d1610baa565b610444610bc9565b61041f610be1565b61041f61049a3660046148ad565b610be7565b6103c7610c42565b6103c7610da1565b6103c76104bd3660046148ad565b610e00565b610444610e82565b6103c7610e9a565b6103c76110c1565b61044461142b565b6103c7611443565b6103f76114b2565b6104446105003660046148ad565b6114bb565b6103f76105133660046148ad565b6114c8565b6104446114d0565b6104446114e8565b610444611500565b61044461150f565b6103c7610546366004614631565b61151e565b6103c7610559366004614736565b6115c9565b61041f611660565b6103c76105743660046148dd565b611666565b6104446116f7565b6103c761058f3660046146fe565b61170f565b61041f611778565b61041f61177e565b6103c76105b23660046148ad565b611783565b61041f611805565b61044461180b565b6103c76105d53660046148ad565b611823565b61041f611875565b6105ea61187b565b6040516103de9493929190614a47565b610444611a58565b610444611a70565b610444611a7f565b61041f611a8e565b61041f611a94565b610444611ac5565b6103c76106383660046146fe565b611add565b6103c761064b366004614631565b611b44565b6103c761065e366004614631565b611bef565b6103c7610671366004614631565b611d60565b6103f76106843660046148ad565b611ef7565b61041f6120cb565b6103c761069f3660046148ad565b6120e6565b610444612168565b610444612180565b6103c761218f565b6106c461267c565b6001600160a01b0316336001600160a01b0316146106fd5760405162461bcd60e51b81526004016106f490614bfa565b60405180910390fd5b6005546001600160a01b038281169116141561072b5760405162461bcd60e51b81526004016106f490614aeb565b6001546001600160a01b03828116911614156107595760405162461bcd60e51b81526004016106f490614ba2565b60606107636126f9565b905060005b81518110156107be5781818151811061077d57fe5b60200260200101516001600160a01b0316836001600160a01b031614156107b65760405162461bcd60e51b81526004016106f490614c69565b600101610768565b506108576107ca61267c565b6040516370a0823160e01b81526001600160a01b038516906370a08231906107f6903090600401614999565b60206040518083038186803b15801561080e57600080fd5b505afa158015610822573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084691906148c5565b6001600160a01b03851691906127e1565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561092e57600080fd5b505afa158015610942573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261096a91908101906147a3565b60405160200161097a919061496b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b03163314806109cd57506109b861267c565b6001600160a01b0316336001600160a01b0316145b6109e95760405162461bcd60e51b81526004016106f490614bfa565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a1e908390614ce3565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a5a903090600401614999565b60206040518083038186803b158015610a7257600080fd5b505afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa91906148c5565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b17903090600401614999565b6101206040518083038186803b158015610b3057600080fd5b505afa158015610b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b68919061482f565b604001511180610aaa57506000610b7d6120cb565b11905090565b600e8181548110610b9057fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610c145760405162461bcd60e51b81526004016106f490614b82565b6000610c1f83612800565b600554909350909150610c3c906001600160a01b031633836127e1565b50919050565b6002546001600160a01b0316331480610c735750610c5e61267c565b6001600160a01b0316336001600160a01b0316145b610c8f5760405162461bcd60e51b81526004016106f490614bfa565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610cc0903090600401614999565b60206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906148c5565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610d4f918591610100900460ff1690600401614d05565b602060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610857919061471a565b6002546001600160a01b0316331480610dd25750610dbd61267c565b6001600160a01b0316336001600160a01b0316145b610dee5760405162461bcd60e51b81526004016106f490614bfa565b610df6612852565b610dfe6129e2565b565b6002546001600160a01b0316331480610e315750610e1c61267c565b6001600160a01b0316336001600160a01b0316145b610e4d5760405162461bcd60e51b81526004016106f490614bfa565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a1e908390614ce3565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610ebd57506002546001600160a01b031633145b80610ee05750610ecb61267c565b6001600160a01b0316336001600160a01b0316145b80610f815750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3457600080fd5b505afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c919061464d565b6001600160a01b0316336001600160a01b0316145b806110225750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d919061464d565b6001600160a01b0316336001600160a01b0316145b61103e5760405162461bcd60e51b81526004016106f490614bfa565b6001546040805163bf3759b560e01b81529051610dfe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc91906148c5565b612ad7565b6004546001600160a01b03163314806110e457506002546001600160a01b031633145b8061110757506110f261267c565b6001600160a01b0316336001600160a01b0316145b806111a85750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611193919061464d565b6001600160a01b0316336001600160a01b0316145b806112495750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611234919061464d565b6001600160a01b0316336001600160a01b0316145b6112655760405162461bcd60e51b81526004016106f490614bfa565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f091906148c5565b600a5490915060009060ff161561134657600061130b6120cb565b905061132483821161131d578361131f565b815b612800565b94509150828211156113405761133a8284612c00565b94508291505b50611357565b61134f82612c4b565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061138b90879087908690600401614d69565b602060405180830381600087803b1580156113a557600080fd5b505af11580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906148c5565b91506113e882612ad7565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5098484838560405161141d9493929190614d7f565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b6040516309a99b4f60e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590639a99b4f09061147e903090600019906004016149e2565b600060405180830381600087803b15801561149857600080fd5b505af11580156114ac573d6000803e3d6000fd5b50505050565b600a5460ff1681565b60108181548110610b9057fe5b60005b919050565b734da27a545c0c5b758a6ba100e3a049001de870f581565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b031633148061154f575061153a61267c565b6001600160a01b0316336001600160a01b0316145b61156b5760405162461bcd60e51b81526004016106f490614bfa565b6001600160a01b03811661157e57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a1e908390614999565b6002546001600160a01b03163314806115fa57506115e561267c565b6001600160a01b0316336001600160a01b0316145b6116165760405162461bcd60e51b81526004016106f490614bfa565b61162260008383614556565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611654929190614a64565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611697575061168261267c565b6001600160a01b0316336001600160a01b0316145b6116b35760405162461bcd60e51b81526004016106f490614bfa565b80600e83815481106116c157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506108576129e2565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae981565b6002546001600160a01b0316331480611740575061172b61267c565b6001600160a01b0316336001600160a01b0316145b61175c5760405162461bcd60e51b81526004016106f490614bfa565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b03163314806117b4575061179f61267c565b6001600160a01b0316336001600160a01b0316145b6117d05760405162461bcd60e51b81526004016106f490614bfa565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a1e908390614ce3565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611854575061183f61267c565b6001600160a01b0316336001600160a01b0316145b6118705760405162461bcd60e51b81526004016106f490614bfa565b600f55565b60065481565b600080600080734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663091030c3306040518263ffffffff1660e01b81526004016118c19190614999565b60206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191191906148c5565b9250734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b03166372b49d636040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199891906148c5565b9150734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663359c4a966040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e757600080fd5b505afa1580156119fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1f91906148c5565b9050611a2b83836137de565b91508215801590611a3b57508142115b8015611a505750611a4c82826137de565b4211155b935090919293565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a5a903090600401614999565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611b0e5750611af961267c565b6001600160a01b0316336001600160a01b0316145b611b2a5760405162461bcd60e51b81526004016106f490614bfa565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611b755750611b6061267c565b6001600160a01b0316336001600160a01b0316145b611b915760405162461bcd60e51b81526004016106f490614bfa565b6001600160a01b038116611ba457600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a1e908390614999565b6001546001600160a01b0316331480611c205750611c0b61267c565b6001600160a01b0316336001600160a01b0316145b611c2957600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611c7057600080fd5b505afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca8919061464d565b6001600160a01b031614611cbb57600080fd5b611cc481613803565b6005546040516370a0823160e01b8152611d5d9183916001600160a01b03909116906370a0823190611cfa903090600401614999565b60206040518083038186803b158015611d1257600080fd5b505afa158015611d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4a91906148c5565b6005546001600160a01b031691906127e1565b50565b6002546001600160a01b03163314611d8a5760405162461bcd60e51b81526004016106f490614ac6565b6001600160a01b038116611d9d57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611dd4929116906000906004016149e2565b602060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e26919061471a565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611e7592911690600019906004016149e2565b602060405180830381600087803b158015611e8f57600080fd5b505af1158015611ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec7919061471a565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a1e9190614999565b6000611f016145d0565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611f31903090600401614999565b6101206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f82919061482f565b9050806020015160001415611f9b5760009150506114cb565b60065460a0820151611fae904290612c00565b1015611fbe5760009150506114cb565b60075460a0820151611fd1904290612c00565b10611fe05760019150506114cb565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906148c5565b9050600954811115612074576001925050506114cb565b600061207e6120cb565b90508260c0015161209a600954836137de90919063ffffffff16565b10156120ac57600193505050506114cb565b6120b4613879565b6008546120c19087613a8d565b1095945050505050565b6000610aaa6120d8610a29565b6120e0611a94565b906137de565b6002546001600160a01b0316331480612117575061210261267c565b6001600160a01b0316336001600160a01b0316145b6121335760405162461bcd60e51b81526004016106f490614bfa565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a1e908390614ce3565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b03163314806121c057506121ab61267c565b6001600160a01b0316336001600160a01b0316145b6121dc5760405162461bcd60e51b81526004016106f490614bfa565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561223057600080fd5b505af1158015612244573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122fb5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906122a990309086906004016149ad565b60206040518083038186803b1580156122c157600080fd5b505afa1580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f991906148c5565b155b6123175760405162461bcd60e51b81526004016106f490614c8d565b61236d8363095ea7b360e01b84846040516024016123369291906149e2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ac7565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106123a357fe5b60009182526020822001546040516001600160e01b031960e085901b1681526123db926001600160a01b0390921691906004016149e2565b602060405180830381600087803b1580156123f557600080fd5b505af1158015612409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242d919061471a565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061245f57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612499916001600160a01b031690600019906004016149e2565b602060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb919061471a565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061251d57fe5b60009182526020822001546040516001600160e01b031960e085901b168152612555926001600160a01b0390921691906004016149e2565b602060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a7919061471a565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106125d957fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612613916001600160a01b031690600019906004016149e2565b602060405180830381600087803b15801561262d57600080fd5b505af1158015612641573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061471a565b60606126748484600085613b56565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa919061464d565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061274057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061278257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816002815181106127c457fe5b6001600160a01b0390921660209283029190910190910152905090565b61236d8363a9059cbb60e01b84846040516024016123369291906149e2565b600080600061280d611a94565b905083811015612848576128296128248583612c00565b613c1a565b925061283583826137de565b92506128418484612c00565b915061284c565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906128999073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016149e2565b602060405180830381600087803b1580156128b357600080fd5b505af11580156128c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128eb919061471a565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906129349073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016149e2565b602060405180830381600087803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612986919061471a565b50600d546129b490736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612273565b600d54610dfe90736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612273565b6129ea612372565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e600281548110612a1b57fe5b60009182526020822001546040516001600160e01b031960e085901b168152612a53926001600160a01b0390921691906004016149e2565b602060405180830381600087803b158015612a6d57600080fd5b505af1158015612a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa5919061471a565b50737fc66500c84a76ad7e9c93437bfc5ac33e2ddae96001600160a01b031663095ea7b3600e6002815481106125d957fe5b600a5460ff1615612ae757611d5d565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612b18903090600401614999565b60206040518083038186803b158015612b3057600080fd5b505afa158015612b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6891906148c5565b9050801561085757600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612bae91908590600190600401614d51565b602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236d919061471a565b6000612c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cce565b90505b92915050565b600080600080612c59611a94565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612c9991309162010000900460ff16906004016149c7565b602060405180830381600087803b158015612cb357600080fd5b505af1158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ceb919061471a565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612d26903090600401614999565b60206040518083038186803b158015612d3e57600080fd5b505afa158015612d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d7691906148c5565b90508015612f2f57612d8781613cfa565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612dcf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e1157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612e3f57fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612e6a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612e9857fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612ed6918691869030904290600401614d15565b600060405180830381600087803b158015612ef057600080fd5b505af1158015612f04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f2c9190810190614669565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612f69903090600401614999565b60206040518083038186803b158015612f8157600080fd5b505afa158015612f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb991906148c5565b905080156131655760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160008151811061300557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061304757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060018154811061307557fe5b9060005260206000200160009054906101000a90046001600160a01b0316816002815181106130a057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e6001815481106130ce57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed17399161310c918691869030904290600401614d15565b600060405180830381600087803b15801561312657600080fd5b505af115801561313a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131629190810190614669565b50505b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a082319061319f903090600401614999565b60206040518083038186803b1580156131b757600080fd5b505afa1580156131cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ef91906148c5565b9050801561330e5760008060008061320561187b565b935093509350935083156132875761321b611443565b6040516301e9a69560e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590631e9a69509061325490309089906004016149e2565b600060405180830381600087803b15801561326e57600080fd5b505af1158015613282573d6000803e3d6000fd5b505050505b82158061329c575061329982826137de565b42115b1561330957734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156132f057600080fd5b505af1158015613304573d6000803e3d6000fd5b505050505b505050505b6040516370a0823160e01b8152600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190613348903090600401614999565b60206040518083038186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339891906148c5565b905080156135445760408051600380825260808201909252606091602082018380368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106133e457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061342657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060028154811061345457fe5b9060005260206000200160009054906101000a90046001600160a01b03168160028151811061347f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e6002815481106134ad57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed1739916134eb918691869030904290600401614d15565b600060405180830381600087803b15801561350557600080fd5b505af1158015613519573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135419190810190614669565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a082319061357e903090600401614999565b60206040518083038186803b15801561359657600080fd5b505afa1580156135aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ce91906148c5565b9050801561367057600d54604080518082018252838152600060208201819052915163ee22be2360e01b81526001600160a01b039093169263ee22be239261361c92916001906004016149fb565b602060405180830381600087803b15801561363657600080fd5b505af115801561364a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366e91906148c5565b505b6005546040516370a0823160e01b81526136fc9188916001600160a01b03909116906370a08231906136a6903090600401614999565b60206040518083038186803b1580156136be57600080fd5b505afa1580156136d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f691906148c5565b90612c00565b985060006137086120cb565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061373e903090600401614999565b6101206040518083038186803b15801561375757600080fd5b505afa15801561376b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378f919061482f565b60c001519050808210156137a757818103995060009a505b8b156137cf576137b68c613c1a565b506137cc8c6137c78d6136f6611a94565b613d63565b98505b50505050505050509193909250565b600082820183811015612c425760405162461bcd60e51b81526004016106f490614b0a565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a29161383e9161010090910460ff1690600401614a3c565b600060405180830381600087803b15801561385857600080fd5b505af115801561386c573d6000803e3d6000fd5b50505050611d5d81613d79565b6000613883613edc565b6040516370a0823160e01b8152909150600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a08231906138c0903090600401614999565b60206040518083038186803b1580156138d857600080fd5b505afa1580156138ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391091906148c5565b90508015613a89576040805160028082526060808301845292602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061395a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061399c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6002815481106139cc57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613a079086908690600401614cec565b60006040518083038186803b158015613a1f57600080fd5b505afa158015613a33573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a5b9190810190614669565b9050613a8481600181518110613a6d57fe5b6020026020010151856137de90919063ffffffff16565b935050505b5090565b600082613a9c57506000612c45565b82820282848281613aa957fe5b0414612c425760405162461bcd60e51b81526004016106f490614b41565b6060613b1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126659092919063ffffffff16565b80519091501561236d5780806020019051810190613b3a919061471a565b61236d5760405162461bcd60e51b81526004016106f490614c1f565b6060613b6185613ee6565b613b7d5760405162461bcd60e51b81526004016106f490614bc3565b60006060866001600160a01b03168587604051613b9a919061494f565b60006040518083038185875af1925050503d8060008114613bd7576040519150601f19603f3d011682016040523d82523d6000602084013e613bdc565b606091505b50915091508115613bf05791506126749050565b805115613c005780518082602001fd5b8360405162461bcd60e51b81526004016106f49190614a93565b6000613c28826137c7610a29565b91506000613c34611a94565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613c68908690600090600401614d05565b602060405180830381600087803b158015613c8257600080fd5b505af1158015613c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cba919061471a565b50613cc7816136f6611a94565b9392505050565b60008184841115613cf25760405162461bcd60e51b81526004016106f49190614a93565b505050900390565b600080613d1e612710613d18600f5486613a8d90919063ffffffff16565b90613f1f565b90508015613d5957613d5973d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a133934836127e1565b613cc78382612c00565b6000818310613d725781612c42565b5090919050565b613d8281613f61565b613d8a611443565b6040516370a0823160e01b8152613e33908290734da27a545c0c5b758a6ba100e3a049001de870f5906370a0823190613dc7903090600401614999565b60206040518083038186803b158015613ddf57600080fd5b505afa158015613df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1791906148c5565b734da27a545c0c5b758a6ba100e3a049001de870f591906127e1565b6040516370a0823160e01b8152611d5d908290737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190613e70903090600401614999565b60206040518083038186803b158015613e8857600080fd5b505afa158015613e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec091906148c5565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae991906127e1565b6000610aaa6140b3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612674575050151592915050565b6000612c4283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061451f565b6040516370a0823160e01b815261400a90829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613f9e903090600401614999565b60206040518083038186803b158015613fb657600080fd5b505afa158015613fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fee91906148c5565b73d533a949740bb3306d119cc777fa900ba034cd5291906127e1565b6040516370a0823160e01b8152611d5d908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190614047903090600401614999565b60206040518083038186803b15801561405f57600080fd5b505afa158015614073573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061409791906148c5565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b91906127e1565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc262906140e6903090600401614999565b60206040518083038186803b1580156140fe57600080fd5b505afa158015614112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413691906148c5565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141ad57600080fd5b505afa1580156141c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141e591906148c5565b90506000806141f48385613f1f565b90508581101561423957600061420a8783612c00565b905061421a87613d188a84613a8d565b925060006142288786612c00565b905080841115614236578093505b50505b600087156143a057604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061428357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106142c557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6000815481106142f557fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90614330908d908690600401614cec565b60006040518083038186803b15801561434857600080fd5b505afa15801561435c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143849190810190614669565b90508060018151811061439357fe5b6020026020010151925050505b60008315614507576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106143ea57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061442c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60018154811061445c57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906144979089908690600401614cec565b60006040518083038186803b1580156144af57600080fd5b505afa1580156144c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144eb9190810190614669565b9050806001815181106144fa57fe5b6020026020010151925050505b61451182826137de565b995050505050505050505090565b600081836145405760405162461bcd60e51b81526004016106f49190614a93565b50600083858161454c57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106145975782800160ff198235161785556145c4565b828001600101855582156145c4579182015b828111156145c45782358255916020019190600101906145a9565b50613a8992915061461c565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613a89576000815560010161461d565b600060208284031215614642578081fd5b8135612c4281614e0d565b60006020828403121561465e578081fd5b8151612c4281614e0d565b6000602080838503121561467b578182fd5b825167ffffffffffffffff811115614691578283fd5b8301601f810185136146a1578283fd5b80516146b46146af82614dc1565b614d9a565b81815283810190838501858402850186018910156146d0578687fd5b8694505b838510156146f25780518352600194909401939185019185016146d4565b50979650505050505050565b60006020828403121561470f578081fd5b8135612c4281614e22565b60006020828403121561472b578081fd5b8151612c4281614e22565b60008060208385031215614748578081fd5b823567ffffffffffffffff8082111561475f578283fd5b818501915085601f830112614772578283fd5b813581811115614780578384fd5b866020828501011115614791578384fd5b60209290920196919550909350505050565b6000602082840312156147b4578081fd5b815167ffffffffffffffff808211156147cb578283fd5b818401915084601f8301126147de578283fd5b8151818111156147ec578384fd5b6147ff601f8201601f1916602001614d9a565b9150808252856020828501011115614815578384fd5b614826816020840160208601614de1565b50949350505050565b6000610120808385031215614842578182fd5b61484b81614d9a565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156148be578081fd5b5035919050565b6000602082840312156148d6578081fd5b5051919050565b600080604083850312156148ef578182fd5b82359150602083013561490181614e0d565b809150509250929050565b6000815180845260208085019450808401835b838110156149445781516001600160a01b03168752958201959082019060010161491f565b509495945050505050565b60008251614961818460208701614de1565b9190910192915050565b600065086dedceccaf60d31b8252825161498c816006850160208701614de1565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60808101818560005b6002811015614a23578151835260209283019290910190600101614a04565b5050508360408301528215156060830152949350505050565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152614ab2816040850160208701614de1565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600083825260406020830152612674604083018461490c565b9182521515602082015260400190565b600086825285602083015260a06040830152614d3460a083018661490c565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614db957600080fd5b604052919050565b600067ffffffffffffffff821115614dd7578081fd5b5060209081020190565b60005b83811015614dfc578181015183820152602001614de4565b838111156114ac5750506000910152565b6001600160a01b0381168114611d5d57600080fd5b8015158114611d5d57600080fdfea2646970667358221220e86748eb7a9e74e491e86c5844215db40246eca32df517bbe1d68c587697801e64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b4d1be44bff40ad6e506edf43156577a3f8672ec
-----Decoded View---------------
Arg [0] : _vault (address): 0xb4D1Be44BfF40ad6e506edf43156577a3f8672eC
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4d1be44bff40ad6e506edf43156577a3f8672ec
Deployed Bytecode Sourcemap
66177:6053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57440:444;;;;;;:::i;:::-;;:::i;:::-;;31264:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61219:163;;;:::i;59224:26::-;;;:::i;:::-;;;;;;;:::i;40586:175::-;;;;;;:::i;:::-;;:::i;61508:129::-;;;:::i;:::-;;;;;;;:::i;59257:25::-;;;:::i;34454:28::-;;;:::i;33202:18::-;;;:::i;:::-;;;;;;;:::i;33111:25::-;;;:::i;43259:148::-;;;:::i;59378:20::-;;;;;;:::i;:::-;;:::i;31574:91::-;;;:::i;58984:85::-;;;:::i;34090:29::-;;;:::i;54020:515::-;;;;;;:::i;:::-;;:::i;60995:216::-;;;:::i;60380:104::-;;;:::i;38635:154::-;;;;;;:::i;:::-;;:::i;58430:82::-;;;:::i;48012:170::-;;;:::i;52405:1371::-;;;:::i;58070:83::-;;;:::i;71087:141::-;;;:::i;34533:25::-;;;:::i;66399:27::-;;;;;;:::i;:::-;;:::i;47397:286::-;;;;;;:::i;:::-;;:::i;66218:85::-;;;:::i;58342:81::-;;;:::i;59313:29::-;;;:::i;59349:20::-;;;:::i;37392:174::-;;;;;;:::i;:::-;;:::i;41064:171::-;;;;;;:::i;:::-;;:::i;59405:22::-;;;:::i;60599:128::-;;;;;;:::i;:::-;;:::i;66310:82::-;;;:::i;60867:120::-;;;;;;:::i;:::-;;:::i;34276:27::-;;;:::i;32981:94::-;;;:::i;39860:169::-;;;;;;:::i;:::-;;:::i;59172:43::-;;;:::i;58254:81::-;;;:::i;60492:99::-;;;;;;:::i;:::-;;:::i;33939:29::-;;;:::i;71236:686::-;;;:::i;:::-;;;;;;;;;;:::i;59076:87::-;;;:::i;33143:22::-;;;:::i;33172:21::-;;;:::i;59289:17::-;;;:::i;61390:110::-;;;:::i;58160:85::-;;;:::i;60735:124::-;;;;;;:::i;:::-;;:::i;36636:202::-;;;;;;:::i;:::-;;:::i;55126:311::-;;;;;;:::i;:::-;;:::i;37855:263::-;;;;;;:::i;:::-;;:::i;65461:687::-;;;;;;:::i;:::-;;:::i;61645:133::-;;;:::i;39306:154::-;;;;;;:::i;:::-;;:::i;58519:81::-;;;:::i;33083:21::-;;;:::i;55866:164::-;;;:::i;57440:444::-;34900:12;:10;:12::i;:::-;-1:-1:-1;;;;;34886:26:0;:10;-1:-1:-1;;;;;34886:26:0;;34878:50;;;;-1:-1:-1;;;34878:50:0;;;;;;;:::i;:::-;;;;;;;;;57532:4:::1;::::0;-1:-1:-1;;;;;57514:23:0;;::::1;57532:4:::0;::::1;57514:23;;57506:41;;;;-1:-1:-1::0;;;57506:41:0::1;;;;;;;:::i;:::-;57584:5;::::0;-1:-1:-1;;;;;57566:24:0;;::::1;57584:5:::0;::::1;57566:24;;57558:44;;;;-1:-1:-1::0;;;57558:44:0::1;;;;;;;:::i;:::-;57615:33;57651:17;:15;:17::i;:::-;57615:53;;57684:9;57679:102;57699:16;:23;57695:1;:27;57679:102;;;57747:16;57764:1;57747:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;57737:29:0::1;:6;-1:-1:-1::0;;;;;57737:29:0::1;;;57729:52;;;;-1:-1:-1::0;;;57729:52:0::1;;;;;;;:::i;:::-;57724:3;;57679:102;;;;57794:82;57822:12;:10;:12::i;:::-;57836:39;::::0;-1:-1:-1;;;57836:39:0;;-1:-1:-1;;;;;57836:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;57869:4:::1;::::0;57836:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57794:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;34939:1;57440:444:::0;:::o;31264:25::-;;;;;;;;;;;;;;;-1:-1:-1;;31264:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61219:163::-;61357:4;;61334:38;;;-1:-1:-1;;;61334:38:0;;;;61267:13;;-1:-1:-1;;;;;61357:4:0;;61334:36;;:38;;;;;61357:4;;61334:38;;;;;;;61357:4;61334:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61334:38:0;;;;;;;;;;;;:::i;:::-;61307:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;61293:81;;61219:163;:::o;59224:26::-;;;;;;;;;:::o;40586:175::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;40671:13:::1;:30:::0;;;40717:36:::1;::::0;::::1;::::0;::::1;::::0;40687:14;;40717:36:::1;:::i;:::-;;;;;;;;40586:175:::0;:::o;61508:129::-;61589:14;;61581:48;;-1:-1:-1;;;61581:48:0;;61554:7;;-1:-1:-1;;;;;61589:14:0;;61581:33;;:48;;61623:4;;61581:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61574:55;;61508:129;:::o;59257:25::-;;;;;;;;;:::o;34454:28::-;;;;:::o;33202:18::-;;;-1:-1:-1;;;;;33202:18:0;;:::o;33111:25::-;;;-1:-1:-1;;;;;33111:25:0;;:::o;43259:148::-;43324:5;;:31;;-1:-1:-1;;;43324:31:0;;43300:4;;;;-1:-1:-1;;;;;43324:5:0;;;;:16;;:31;;43349:4;;43324:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;43398:1;43373:22;:20;:22::i;:::-;:26;43317:82;;43259:148;:::o;59378:20::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59378:20:0;;-1:-1:-1;59378:20:0;:::o;31574:91::-;31643:14;;;;;;;;;;;;-1:-1:-1;;;31643:14:0;;;;31574:91;:::o;58984:85::-;59026:42;58984:85;:::o;34090:29::-;;;;:::o;54020:515::-;54135:5;;54079:13;;-1:-1:-1;;;;;54135:5:0;54113:10;:28;54105:47;;;;-1:-1:-1;;;54105:47:0;;;;;;;:::i;:::-;54238:19;54291:32;54309:13;54291:17;:32::i;:::-;54415:4;;54268:55;;-1:-1:-1;54268:55:0;;-1:-1:-1;54415:42:0;;-1:-1:-1;;;;;54415:4:0;54433:10;54268:55;54415:17;:42::i;:::-;54020:515;;;;:::o;60995:216::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;61096:14:::1;::::0;61088:48:::1;::::0;-1:-1:-1;;;61088:48:0;;61071:14:::1;::::0;-1:-1:-1;;;;;61096:14:0::1;::::0;61088:33:::1;::::0;:48:::1;::::0;61130:4:::1;::::0;61088:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61155:14;::::0;61188::::1;::::0;61147:56:::1;::::0;-1:-1:-1;;;61147:56:0;;61071:65;;-1:-1:-1;;;;;;61155:14:0;;::::1;::::0;61147:32:::1;::::0;:56:::1;::::0;61071:65;;61155:14:::1;61188::::0;::::1;;;::::0;61147:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60380:104::-:0;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;60437:15:::1;:13;:15::i;:::-;60463:13;:11;:13::i;:::-;60380:104::o:0;38635:154::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;38713:14:::1;:23:::0;;;38752:29:::1;::::0;::::1;::::0;::::1;::::0;38730:6;;38752:29:::1;:::i;58430:82::-:0;58469:42;58430:82;:::o;48012:170::-;35026:6;;-1:-1:-1;;;;;35026:6:0;35012:10;:20;;:65;;-1:-1:-1;35067:10:0;;-1:-1:-1;;;;;35067:10:0;35053;:24;35012:65;:112;;;;35112:12;:10;:12::i;:::-;-1:-1:-1;;;;;35098:26:0;:10;-1:-1:-1;;;;;35098:26:0;;35012:112;:163;;;;35159:5;;;;;;;;;-1:-1:-1;;;;;35159:5:0;-1:-1:-1;;;;;35159:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35145:30:0;:10;-1:-1:-1;;;;;35145:30:0;;35012:163;:216;;;;35210:5;;;;;;;;;-1:-1:-1;;;;;35210:5:0;-1:-1:-1;;;;;35210:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35196:32:0;:10;-1:-1:-1;;;;;35196:32:0;;35012:216;34990:277;;;;-1:-1:-1;;;34990:277:0;;;;;;;:::i;:::-;48150:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;48150:23:0;;;;48135:39:::1;::::0;-1:-1:-1;;;;;48150:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48135:14;:39::i;52405:1371::-:0;35026:6;;-1:-1:-1;;;;;35026:6:0;35012:10;:20;;:65;;-1:-1:-1;35067:10:0;;-1:-1:-1;;;;;35067:10:0;35053;:24;35012:65;:112;;;;35112:12;:10;:12::i;:::-;-1:-1:-1;;;;;35098:26:0;:10;-1:-1:-1;;;;;35098:26:0;;35012:112;:163;;;;35159:5;;;;;;;;;-1:-1:-1;;;;;35159:5:0;-1:-1:-1;;;;;35159:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35145:30:0;:10;-1:-1:-1;;;;;35145:30:0;;35012:163;:216;;;;35210:5;;;;;;;;;-1:-1:-1;;;;;35210:5:0;-1:-1:-1;;;;;35210:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35196:32:0;:10;-1:-1:-1;;;;;35196:32:0;;35012:216;34990:277;;;;-1:-1:-1;;;34990:277:0;;;;;;;:::i;:::-;52456:14:::1;52485:12:::0;52512:23:::1;52538:5;;;;;;;;;-1:-1:-1::0;;;;;52538:5:0::1;-1:-1:-1::0;;;;;52538:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52610:13;::::0;52512:49;;-1:-1:-1;52572:19:0::1;::::0;52610:13:::1;;52606:731;;;52692:19;52714:22;:20;:22::i;:::-;52692:44;;52870:80;52902:15;52888:11;:29;:61;;52934:15;52888:61;;;52920:11;52888:61;52870:17;:80::i;:::-;52848:102:::0;-1:-1:-1;52848:102:0;-1:-1:-1;53028:29:0;;::::1;53024:159;;;53087:32;:11:::0;53103:15;53087::::1;:32::i;:::-;53078:41;;53152:15;53138:29;;53024:159;52606:731;;;;53295:30;53309:15;53295:13;:30::i;:::-;53265:60:::0;;-1:-1:-1;53265:60:0;-1:-1:-1;53265:60:0;-1:-1:-1;52606:731:0::1;53551:5;::::0;:39:::1;::::0;-1:-1:-1;;;53551:39:0;;-1:-1:-1;;;;;53551:5:0;;::::1;::::0;:12:::1;::::0;:39:::1;::::0;53564:6;;53572:4;;53578:11;;53551:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53533:57;;53666:31;53681:15;53666:14;:31::i;:::-;53715:53;53725:6;53733:4;53739:11;53752:15;53715:53;;;;;;;;;:::i;:::-;;;;;;;;35278:1;;;;52405:1371::o:0;58070:83::-;58110:42;58070:83;:::o;71087:141::-;71153:67;;-1:-1:-1;;;71153:67:0;;66260:42;;71153:33;;:67;;71195:4;;-1:-1:-1;;71202:17:0;71153:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71087:141::o;34533:25::-;;;;;;:::o;66399:27::-;;;;;;;;;;47397:286;47465:4;47397:286;;;;:::o;66218:85::-;66260:42;66218:85;:::o;58342:81::-;58380:42;58342:81;:::o;59313:29::-;;;-1:-1:-1;;;;;59313:29:0;;:::o;59349:20::-;;;-1:-1:-1;;;;;59349:20:0;;:::o;37392:174::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37471:21:0;::::1;37463:30;;;::::0;::::1;;37504:6;:16:::0;;-1:-1:-1;;;;;;37504:16:0::1;-1:-1:-1::0;;;;;37504:16:0;::::1;;::::0;;37536:22:::1;::::0;::::1;::::0;::::1;::::0;37504:16;;37536:22:::1;:::i;41064:171::-:0;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;41153:26:::1;:11;41167:12:::0;;41153:26:::1;:::i;:::-;;41195:32;41214:12;;41195:32;;;;;;;:::i;:::-;;;;;;;;41064:171:::0;;:::o;59405:22::-;;;;:::o;60599:128::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;60691:4:::1;60680:3;60684;60680:8;;;;;;;;;;;;;;;;:15;;;;;-1:-1:-1::0;;;;;60680:15:0::1;;;;;-1:-1:-1::0;;;;;60680:15:0::1;;;;;;60706:13;:11;:13::i;66310:82::-:0;66349:42;66310:82;:::o;60867:120::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;60949:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;60949:30:0;;::::1;::::0;;;::::1;::::0;;60867:120::o;34276:27::-;;;;:::o;32981:94::-;33039:7;32981:94;:::o;39860:169::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;39943:12:::1;:28:::0;;;39987:34:::1;::::0;::::1;::::0;::::1;::::0;39958:13;;39987:34:::1;:::i;59172:43::-:0;59210:5;59172:43;:::o;58254:81::-;58292:42;58254:81;:::o;60492:99::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;60565:7:::1;:18:::0;60492:99::o;33939:29::-;;;;:::o;71236:686::-;71327:15;71358:13;71387:21;71424:19;66260:42;-1:-1:-1;;;;;71482:37:0;;71528:4;71482:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71471:63;;66260:42;-1:-1:-1;;;;;71564:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71545:58;;66260:42;-1:-1:-1;;;;;71631:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71614:54;-1:-1:-1;71698:30:0;:8;71711:16;71698:12;:30::i;:::-;71679:49;-1:-1:-1;71767:13:0;;;;;:64;;;71815:16;71797:15;:34;71767:64;:136;;;;-1:-1:-1;71867:36:0;:16;71888:14;71867:20;:36::i;:::-;71848:15;:55;;71767:136;71739:175;;71236:686;;;;:::o;59076:87::-;59120:42;59076:87;:::o;33143:22::-;;;-1:-1:-1;;;;;33143:22:0;;:::o;33172:21::-;;;-1:-1:-1;;;;;33172:21:0;;:::o;59289:17::-;;;;:::o;61390:110::-;61463:4;;:29;;-1:-1:-1;;;61463:29:0;;61436:7;;-1:-1:-1;;;;;61463:4:0;;:14;;:29;;61486:4;;61463:29;;;:::i;58160:85::-;58202:42;58160:85;:::o;60735:124::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;60819:14:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;60819:32:0;;::::1;::::0;;;::::1;::::0;;60735:124::o;36636:202::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36723:25:0;::::1;36715:34;;;::::0;::::1;;36760:10;:24:::0;;-1:-1:-1;;;;;;36760:24:0::1;-1:-1:-1::0;;;;;36760:24:0;::::1;;::::0;;36800:30:::1;::::0;::::1;::::0;::::1;::::0;36760:24;;36800:30:::1;:::i;55126:311::-:0;55215:5;;-1:-1:-1;;;;;55215:5:0;55193:10;:28;;:58;;;55239:12;:10;:12::i;:::-;-1:-1:-1;;;;;55225:26:0;:10;-1:-1:-1;;;;;55225:26:0;;55193:58;55185:67;;;;;;55309:5;;55271:34;;;-1:-1:-1;;;55271:34:0;;;;-1:-1:-1;;;;;55309:5:0;;;;55271:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55271:43:0;;55263:52;;;;;;55326:30;55343:12;55326:16;:30::i;:::-;55399:4;;:29;;-1:-1:-1;;;55399:29:0;;55367:62;;55385:12;;-1:-1:-1;;;;;55399:4:0;;;;:14;;:29;;55422:4;;55399:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55367:4;;-1:-1:-1;;;;;55367:4:0;;:62;:17;:62::i;:::-;55126:311;:::o;37855:263::-;34787:10;;-1:-1:-1;;;;;34787:10:0;34773;:24;34765:48;;;;-1:-1:-1;;;34765:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37936:22:0;::::1;37928:31;;;::::0;::::1;;37970:5;::::0;37984:7:::1;::::0;37970:25:::1;::::0;-1:-1:-1;;;37970:25:0;;-1:-1:-1;;;;;37970:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;37984:7;::::1;::::0;37970:5:::1;::::0;:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38006:7:0::1;:18:::0;;-1:-1:-1;;;;;;38006:18:0::1;-1:-1:-1::0;;;;;38006:18:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;38035:5:0;:35:::1;::::0;-1:-1:-1;;;38035:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;38049:7;::::1;::::0;-1:-1:-1;;38066:2:0;38035:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38086:24;38101:8;38086:24;;;;;;:::i;65461:687::-:0;65533:4;65550:28;;:::i;:::-;65581:5;;:31;;-1:-1:-1;;;65581:31:0;;-1:-1:-1;;;;;65581:5:0;;;;:16;;:31;;65606:4;;65581:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65550:62;;65629:6;:17;;;65650:1;65629:22;65625:40;;;65660:5;65653:12;;;;;65625:40;65723:14;;65702:17;;;;65682:38;;:15;;:19;:38::i;:::-;:55;65678:73;;;65746:5;65739:12;;;;;65678:73;65810:14;;65788:17;;;;65768:38;;:15;;:19;:38::i;:::-;:56;65764:73;;65833:4;65826:11;;;;;65764:73;65872:5;;:23;;;-1:-1:-1;;;65872:23:0;;;;65850:19;;-1:-1:-1;;;;;65872:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65850:45;;65924:13;;65910:11;:27;65906:44;;;65946:4;65939:11;;;;;;65906:44;65963:13;65979:22;:20;:22::i;:::-;65963:38;;66043:6;:16;;;66016:24;66026:13;;66016:5;:9;;:24;;;;:::i;:::-;:43;66012:60;;;66068:4;66061:11;;;;;;;66012:60;66122:17;:15;:17::i;:::-;66093:12;;:26;;66110:8;66093:16;:26::i;:::-;:46;;65461:687;-1:-1:-1;;;;;65461:687:0:o;61645:133::-;61707:7;61734:36;61754:15;:13;:15::i;:::-;61734;:13;:15::i;:::-;:19;;:36::i;39306:154::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;39384:14:::1;:23:::0;;;39423:29:::1;::::0;::::1;::::0;::::1;::::0;39401:6;;39423:29:::1;:::i;58519:81::-:0;58557:42;58519:81;:::o;33083:21::-;;;-1:-1:-1;;;;;33083:21:0;;:::o;55866:164::-;34644:10;;-1:-1:-1;;;;;34644:10:0;34630;:24;;:54;;;34672:12;:10;:12::i;:::-;-1:-1:-1;;;;;34658:26:0;:10;-1:-1:-1;;;;;34658:26:0;;34630:54;34622:78;;;;-1:-1:-1;;;34622:78:0;;;;;;;:::i;:::-;55929:13:::1;:20:::0;;-1:-1:-1;;55929:20:0::1;55945:4;55929:20:::0;;::::1;::::0;;;55960:5;:22:::1;::::0;;-1:-1:-1;;;55960:22:0;;;;-1:-1:-1;;;;;55960:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;55929:13:::1;::::0;55960:22;;;;;;;;55929:13;55960:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56000:22:0::1;::::0;::::1;::::0;-1:-1:-1;56000:22:0;;-1:-1:-1;56000:22:0::1;55866:164::o:0;23501:622::-;23871:10;;;23870:62;;-1:-1:-1;23887:39:0;;-1:-1:-1;;;23887:39:0;;-1:-1:-1;;;;;23887:15:0;;;;;:39;;23911:4;;23918:7;;23887:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23870:62;23862:152;;;;-1:-1:-1;;;23862:152:0;;;;;;;:::i;:::-;24025:90;24045:5;24075:22;;;24099:7;24108:5;24052:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24052:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24052:62:0;-1:-1:-1;;;;;;24052:62:0;;;;;;;;;;24025:19;:90::i;:::-;23501:622;;;:::o;60128:244::-;58380:42;-1:-1:-1;;;;;60179:19:0;;60199:3;60203:1;60199:6;;;;;;;;;;;;;;;;;60179:30;;-1:-1:-1;;;;;;60179:30:0;;;;;;;;;-1:-1:-1;;;;;60199:6:0;;;;;60179:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58380:42;-1:-1:-1;;;;;60220:19:0;;60240:3;60244:1;60240:6;;;;;;;;;;;;;;;;;;60220:46;;-1:-1:-1;;;;;;60220:46:0;;;;;;;;;-1:-1:-1;;;;;60240:6:0;;-1:-1:-1;;60248:17:0;60220:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58292:42;-1:-1:-1;;;;;60277:19:0;;60297:3;60301:1;60297:6;;;;;;;;;;;;;;;;;60277:30;;-1:-1:-1;;;;;;60277:30:0;;;;;;;;;-1:-1:-1;;;;;60297:6:0;;;;;60277:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58292:42;-1:-1:-1;;;;;60318:19:0;;60338:3;60342:1;60338:6;;;;;;;;;;;;;;;;;;60318:46;;-1:-1:-1;;;;;;60318:46:0;;;;;;;;;-1:-1:-1;;;;;60338:6:0;;-1:-1:-1;;60346:17:0;60318:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9108:196::-;9211:12;9243:53;9266:6;9274:4;9280:1;9283:12;9243:22;:53::i;:::-;9236:60;9108:196;-1:-1:-1;;;;9108:196:0:o;41389:98::-;41461:5;;:18;;;-1:-1:-1;;;41461:18:0;;;;41434:7;;-1:-1:-1;;;;;41461:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71930:297::-;72088:16;;;72102:1;72088:16;;;;;;;;;72025;;;;72088;;;;72025;;72088;;;;;-1:-1:-1;72088:16:0;72059:45;;58380:42;72115:9;72125:1;72115:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;72115:18:0;;;-1:-1:-1;;;;;72115:18:0;;;;;58292:42;72144:9;72154:1;72144:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;72144:18:0;;;-1:-1:-1;;;;;72144:18:0;;;;;66349:42;72173:9;72183:1;72173:12;;;;;;;;-1:-1:-1;;;;;72173:19:0;;;:12;;;;;;;;;;;:19;72210:9;-1:-1:-1;71930:297:0;:::o;22842:177::-;22925:86;22945:5;22975:23;;;23000:2;23004:5;22952:58;;;;;;;;;:::i;62348:581::-;62452:25;62479:13;62510:16;62529:15;:13;:15::i;:::-;62510:34;;62570:13;62559:8;:24;62555:367;;;62620:42;62634:27;:13;62652:8;62634:17;:27::i;:::-;62620:13;:42::i;:::-;62600:62;-1:-1:-1;62697:31:0;62600:62;62719:8;62697:21;:31::i;:::-;62677:51;-1:-1:-1;62751:36:0;:13;62677:51;62751:17;:36::i;:::-;62743:44;;62555:367;;;62897:13;62877:33;;62555:367;62348:581;;;;:::o;59664:456::-;59709:4;;:24;;-1:-1:-1;;;59709:24:0;;-1:-1:-1;;;;;59709:4:0;;;;:12;;:24;;58202:42;;59709:4;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59744:4:0;;:40;;-1:-1:-1;;;59744:40:0;;-1:-1:-1;;;;;59744:4:0;;;;:12;;:40;;58202:42;;-1:-1:-1;;59766:17:0;59744:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59819:5:0;;59795:33;;58557:42;;-1:-1:-1;;;;;59819:5:0;;59795:23;:33::i;:::-;59863:5;;59839:49;;58557:42;;-1:-1:-1;;;;;59863:5:0;-1:-1:-1;;59839:23:0;:49::i;67351:179::-;67403:19;:17;:19::i;:::-;66349:42;-1:-1:-1;;;;;67433:20:0;;67454:3;67458:1;67454:6;;;;;;;;;;;;;;;;;67433:31;;-1:-1:-1;;;;;;67433:31:0;;;;;;;;;-1:-1:-1;;;;;67454:6:0;;;;;67433:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66349:42;-1:-1:-1;;;;;67475:20:0;;67496:3;67500:1;67496:6;;;;;;;61786:261;61869:13;;;;61865:26;;;61884:7;;61865:26;61917:4;;:29;;-1:-1:-1;;;61917:29:0;;61901:13;;-1:-1:-1;;;;;61917:4:0;;:14;;:29;;61940:4;;61917:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61901:45;-1:-1:-1;61961:9:0;;61957:83;;62012:2;;61987:41;;-1:-1:-1;;;61987:41:0;;58202:42;;61987:24;;:41;;62012:2;62016:5;;62023:4;;61987:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15612:136::-;15670:7;15697:43;15701:1;15704;15697:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15690:50;;15612:136;;;;;:::o;68463:2616::-;68580:15;68610:13;68638:20;68686:11;68700:15;:13;:15::i;:::-;68734:14;;68775:13;;68726:63;;-1:-1:-1;;;68726:63:0;;68686:29;;-1:-1:-1;;;;;;68734:14:0;;;;68726:33;;:63;;68768:4;;68775:13;;;;;;68726:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68815:36:0;;-1:-1:-1;;;68815:36:0;;68800:12;;58380:42;;68815:21;;:36;;68845:4;;68815:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68800:51;-1:-1:-1;68866:8:0;;68862:313;;68898:16;68909:4;68898:10;:16::i;:::-;68955;;;68969:1;68955:16;;;;;;;;;68891:23;;-1:-1:-1;68931:21:0;;68955:16;;;;68931:21;;68955:16;;;;;-1:-1:-1;68955:16:0;68931:40;;58380:42;68986:4;68991:1;68986:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;68986:13:0;;;-1:-1:-1;;;;;68986:13:0;;;;;58469:42;69014:4;69019:1;69014:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;69014:14:0;;;-1:-1:-1;;;;;69014:14:0;;;;;69053:10;69064:1;69053:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69053:13:0;69043:4;69048:1;69043:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;69043:23:0;;;-1:-1:-1;;;;;69043:23:0;;;;;69087:3;69091:1;69087:6;;;;;;;;;;;;;;;;;69083:80;;-1:-1:-1;;;69083:80:0;;-1:-1:-1;;;;;69087:6:0;;;;69083:36;;:80;;69120:4;;69138;;69152;;69159:3;;69083:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69083:80:0;;;;;;;;;;;;:::i;:::-;;68862:313;;69200:36;;-1:-1:-1;;;69200:36:0;;69185:12;;58292:42;;69200:21;;:36;;69230:4;;69200:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69185:51;-1:-1:-1;69251:8:0;;69247:273;;69300:16;;;69314:1;69300:16;;;;;;;;;69276:21;;69300:16;;;69276:21;;69300:16;;;;;-1:-1:-1;69300:16:0;69276:40;;58292:42;69331:4;69336:1;69331:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;69331:13:0;;;-1:-1:-1;;;;;69331:13:0;;;;;58469:42;69359:4;69364:1;69359:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;69359:14:0;;;-1:-1:-1;;;;;69359:14:0;;;;;69398:10;69409:1;69398:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69398:13:0;69388:4;69393:1;69388:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;69388:23:0;;;-1:-1:-1;;;;;69388:23:0;;;;;69432:3;69436:1;69432:6;;;;;;;;;;;;;;;;;69428:80;;-1:-1:-1;;;69428:80:0;;-1:-1:-1;;;;;69432:6:0;;;;69428:36;;:80;;69465:4;;69483;;69497;;69504:3;;69428:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69428:80:0;;;;;;;;;;;;:::i;:::-;;69247:273;;69549:40;;-1:-1:-1;;;69549:40:0;;69530:16;;66260:42;;69549:25;;:40;;69583:4;;69549:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69530:59;-1:-1:-1;69604:12:0;;69600:498;;69634:15;69651:13;69684:21;69707:19;69730:16;:14;:16::i;:::-;69633:113;;;;;;;;69765:10;69761:151;;;69796:7;:5;:7::i;:::-;69844:52;;-1:-1:-1;;;69844:52:0;;66260:42;;69844:27;;:52;;69880:4;;69887:8;;69844:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69761:151;69930:13;;;:89;;-1:-1:-1;69983:36:0;:16;70004:14;69983:20;:36::i;:::-;69965:15;:54;69930:89;69926:161;;;66260:42;-1:-1:-1;;;;;70040:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69926:161;69600:498;;;;;70124:37;;-1:-1:-1;;;70124:37:0;;70108:13;;66349:42;;70124:22;;:37;;70155:4;;70124:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70108:53;-1:-1:-1;70176:9:0;;70172:276;;70226:16;;;70240:1;70226:16;;;;;;;;;70202:21;;70226:16;;;70202:21;;70226:16;;;;;-1:-1:-1;70226:16:0;70202:40;;66349:42;70257:4;70262:1;70257:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;70257:14:0;;;-1:-1:-1;;;;;70257:14:0;;;;;58469:42;70286:4;70291:1;70286:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;70286:14:0;;;-1:-1:-1;;;;;70286:14:0;;;;;70325:10;70336:1;70325:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70325:13:0;70315:4;70320:1;70315:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;70315:23:0;;;-1:-1:-1;;;;;70315:23:0;;;;;70359:3;70363:1;70359:6;;;;;;;;;;;;;;;;;70355:81;;-1:-1:-1;;;70355:81:0;;-1:-1:-1;;;;;70359:6:0;;;;70355:36;;:81;;70392:5;;70411:4;;70425;;70432:3;;70355:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70355:81:0;;;;;;;;;;;;:::i;:::-;;70172:276;;70473:36;;-1:-1:-1;;;70473:36:0;;70458:12;;58557:42;;70473:21;;:36;;70503:4;;70473:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70458:51;-1:-1:-1;70524:8:0;;70520:90;;70558:5;;70549:49;;;;;;;;;;;70558:5;70549:49;;;;;;;;-1:-1:-1;;;70549:49:0;;-1:-1:-1;;;;;70558:5:0;;;;70549:29;;:49;;;70558:5;;70549:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70520:90;70630:4;;:29;;-1:-1:-1;;;70630:29:0;;:41;;70664:6;;-1:-1:-1;;;;;70630:4:0;;;;:14;;:29;;70653:4;;70630:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;:41::i;:::-;70620:51;;70684:11;70698:22;:20;:22::i;:::-;70744:5;;:31;;-1:-1:-1;;;70744:31:0;;70684:36;;-1:-1:-1;70731:10:0;;-1:-1:-1;;;;;70744:5:0;;;;:16;;:31;;70769:4;;70744:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;70731:54;;70808:5;70799:6;:14;70796:94;;;70846:6;70838:5;:14;70830:22;;70877:1;70867:11;;70796:94;70906:20;;70902:170;;70943:31;70957:16;70943:13;:31::i;:::-;;71004:56;71013:16;71031:28;71051:7;71031:15;:13;:15::i;:28::-;71004:8;:56::i;:::-;70989:71;;70902:170;68463:2616;;;;;;;;;;;;;:::o;15148:181::-;15206:7;15238:5;;;15262:6;;;;15254:46;;;;-1:-1:-1;;;15254:46:0;;;;;;;:::i;62937:185::-;63022:14;;63059;;63014:60;;-1:-1:-1;;;63014:60:0;;-1:-1:-1;;;;;63022:14:0;;;;63014:44;;:60;;63022:14;63059;;;;;;63014:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63085:29;63101:12;63085:15;:29::i;67977:478::-;68036:18;68080:23;:21;:23::i;:::-;68132:37;;-1:-1:-1;;;68132:37:0;;68067:36;;-1:-1:-1;68116:13:0;;66349:42;;68132:22;;:37;;68163:4;;68132:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68116:53;-1:-1:-1;68184:9:0;;68180:268;;68234:16;;;68248:1;68234:16;;;68210:21;68234:16;;;;;68210:21;68234:16;;;;;;;;;;-1:-1:-1;68234:16:0;68210:40;;66349:42;68265:4;68270:1;68265:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68265:14:0;;;-1:-1:-1;;;;;68265:14:0;;;;;58469:42;68294:4;68299:1;68294:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68294:14:0;;;-1:-1:-1;;;;;68294:14:0;;;;;68323:21;68351:3;68355:1;68351:6;;;;;;;;;;;;;;;;;;68347:38;;-1:-1:-1;;;68347:38:0;;-1:-1:-1;;;;;68351:6:0;;;;68347:25;;:38;;68373:5;;68380:4;;68347:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68347:38:0;;;;;;;;;;;;:::i;:::-;68323:62;;68413:23;68428:4;68433:1;68428:7;;;;;;;;;;;;;;68413:10;:14;;:23;;;;:::i;:::-;68400:36;;68180:268;;;67977:478;;:::o;16502:471::-;16560:7;16805:6;16801:47;;-1:-1:-1;16835:1:0;16828:8;;16801:47;16872:5;;;16876:1;16872;:5;:1;16896:5;;;;;:10;16888:56;;;;-1:-1:-1;;;16888:56:0;;;;;;;:::i;25147:761::-;25571:23;25597:69;25625:4;25597:69;;;;;;;;;;;;;;;;;25605:5;-1:-1:-1;;;;;25597:27:0;;;:69;;;;;:::i;:::-;25681:17;;25571:95;;-1:-1:-1;25681:21:0;25677:224;;25823:10;25812:30;;;;;;;;;;;;:::i;:::-;25804:85;;;;-1:-1:-1;;;25804:85:0;;;;;;;:::i;10485:979::-;10615:12;10648:18;10659:6;10648:10;:18::i;:::-;10640:60;;;;-1:-1:-1;;;10640:60:0;;;;;;;:::i;:::-;10774:12;10788:23;10815:6;-1:-1:-1;;;;;10815:11:0;10835:8;10846:4;10815:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10773:78;;;;10866:7;10862:595;;;10897:10;-1:-1:-1;10890:17:0;;-1:-1:-1;10890:17:0;10862:595;11011:17;;:21;11007:439;;11274:10;11268:17;11335:15;11322:10;11318:2;11314:19;11307:44;11222:148;11417:12;11410:20;;-1:-1:-1;;;11410:20:0;;;;;;;;:::i;62055:285::-;62113:7;62143:34;62152:7;62161:15;:13;:15::i;62143:34::-;62133:44;;62188:12;62203:15;:13;:15::i;:::-;62237:14;;62229:57;;-1:-1:-1;;;62229:57:0;;62188:30;;-1:-1:-1;;;;;;62237:14:0;;62229:41;;:57;;62271:7;;62237:14;;62229:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62304:28;62324:7;62304:15;:13;:15::i;:28::-;62297:35;62055:285;-1:-1:-1;;;62055:285:0:o;16051:192::-;16137:7;16173:12;16165:6;;;;16157:29;;;;-1:-1:-1;;;16157:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;16209:5:0;;;16051:192::o;63384:239::-;63436:7;63456:16;63475:34;59210:5;63475:17;63484:7;;63475:4;:8;;:17;;;;:::i;:::-;:21;;:34::i;:::-;63456:53;-1:-1:-1;63524:12:0;;63520:59;;63538:41;58380:42;58110;63570:8;63538:24;:41::i;:::-;63597:18;:4;63606:8;63597;:18::i;4825:106::-;4883:7;4914:1;4910;:5;:13;;4922:1;4910:13;;;-1:-1:-1;4918:1:0;;4825:106;-1:-1:-1;4825:106:0:o;67572:321::-;67648:35;67670:12;67648:21;:35::i;:::-;67694:7;:5;:7::i;:::-;67755:40;;-1:-1:-1;;;67755:40:0;;67712:84;;67741:12;;66260:42;;67755:25;;:40;;67789:4;;67755:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66260:42;;67712:84;:28;:84::i;:::-;67847:37;;-1:-1:-1;;;67847:37:0;;67807:78;;67833:12;;66349:42;;67847:22;;:37;;67878:4;;67847:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66349:42;;67807:78;:25;:78::i;65246:132::-;65304:18;65348:22;:20;:22::i;5993:619::-;6053:4;6521:20;;6364:66;6561:23;;;;;;:42;;-1:-1:-1;;6588:15:0;;;6553:51;-1:-1:-1;;5993:619:0:o;17449:132::-;17507:7;17534:39;17538:1;17541;17534:39;;;;;;;;;;;;;;;;;:3;:39::i;63130:246::-;63244:36;;-1:-1:-1;;;63244:36:0;;63205:76;;63230:12;;58380:42;;63244:21;;:36;;63274:4;;63244:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58380:42;;63205:76;:24;:76::i;:::-;63331:36;;-1:-1:-1;;;63331:36:0;;63292:76;;63317:12;;58292:42;;63331:21;;:36;;63361:4;;63331:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58292:42;;63292:76;:24;:76::i;63631:1607::-;63729:14;;63721:45;;-1:-1:-1;;;63721:45:0;;63686:7;;;;-1:-1:-1;;;;;63729:14:0;;;;63721:30;;:45;;63760:4;;63721:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63706:60;;63872:19;63894:4;63872:26;;63909:17;63929:10;63909:30;;63958:25;63986:10;63958:38;;64015:14;58292:42;-1:-1:-1;;;;;64032:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64015:42;-1:-1:-1;64068:12:0;;64109:29;64015:42;64120:17;64109:10;:29::i;:::-;64093:45;;64200:11;64192:5;:19;64188:417;;;64289:17;64309:22;:11;64325:5;64309:15;:22::i;:::-;64289:42;-1:-1:-1;64376:36:0;64400:11;64376:19;:4;64289:42;64376:8;:19::i;:36::-;64369:43;-1:-1:-1;64462:18:0;64483:21;:9;64497:6;64483:13;:21::i;:::-;64462:42;;64530:10;64523:4;:17;64519:75;;;64568:10;64561:17;;64519:75;64188:417;;;64617:16;64648:8;;64644:253;;64697:16;;;64711:1;64697:16;;;64673:21;64697:16;;;;;64673:21;64697:16;;;;;;;;;;-1:-1:-1;64697:16:0;64673:40;;58380:42;64728:4;64733:1;64728:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64728:13:0;;;-1:-1:-1;;;;;64728:13:0;;;;;58469:42;64756:4;64761:1;64756:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;64756:14:0;;;-1:-1:-1;;;;;64756:14:0;;;;;64785:24;64816:3;64820:1;64816:6;;;;;;;;;;;;;;;;;;64812:37;;-1:-1:-1;;;64812:37:0;;-1:-1:-1;;;;;64816:6:0;;;;64812:25;;:37;;64838:4;;64844;;64812:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64812:37:0;;;;;;;;;;;;:::i;:::-;64785:64;;64875:7;64883:1;64875:10;;;;;;;;;;;;;;64864:21;;64644:253;;;64909:16;64940:8;;64936:253;;64989:16;;;65003:1;64989:16;;;64965:21;64989:16;;;;;64965:21;64989:16;;;;;;;;;;-1:-1:-1;64989:16:0;64965:40;;58292:42;65020:4;65025:1;65020:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;65020:13:0;;;-1:-1:-1;;;;;65020:13:0;;;;;58469:42;65048:4;65053:1;65048:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;65048:14:0;;;-1:-1:-1;;;;;65048:14:0;;;;;65077:24;65108:3;65112:1;65108:6;;;;;;;;;;;;;;;;;;65104:37;;-1:-1:-1;;;65104:37:0;;-1:-1:-1;;;;;65108:6:0;;;;65104:25;;:37;;65130:4;;65136;;65104:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65104:37:0;;;;;;;;;;;;:::i;:::-;65077:64;;65167:7;65175:1;65167:10;;;;;;;;;;;;;;65156:21;;64936:253;;;65208:22;:8;65221;65208:12;:22::i;:::-;65201:29;;;;;;;;;;;63631:1607;:::o;18077:278::-;18163:7;18198:12;18191:5;18183:28;;;;-1:-1:-1;;;18183:28:0;;;;;;;;:::i;:::-;;18222:9;18238:1;18234;:5;;;;;;;18077:278;-1:-1:-1;;;;;18077:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;4267:241;;4371:2;4359:9;4350:7;4346:23;4342:32;4339:2;;;-1:-1;;4377:12;4339:2;85:6;72:20;97:33;124:5;97:33;:::i;4515:263::-;;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;-1:-1;;4636:12;4598:2;226:6;220:13;238:33;265:5;238:33;:::i;4785:392::-;;4925:2;;4913:9;4904:7;4900:23;4896:32;4893:2;;;-1:-1;;4931:12;4893:2;4982:17;4976:24;5020:18;5012:6;5009:30;5006:2;;;-1:-1;;5042:12;5006:2;5129:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;4204:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;5062:99;4887:290;-1:-1;;;;;;;4887:290::o;5184:235::-;;5285:2;5273:9;5264:7;5260:23;5256:32;5253:2;;;-1:-1;;5291:12;5253:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;5426:257::-;;5538:2;5526:9;5517:7;5513:23;5509:32;5506:2;;;-1:-1;;5544:12;5506:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;5994:367::-;;;6118:2;6106:9;6097:7;6093:23;6089:32;6086:2;;;-1:-1;;6124:12;6086:2;6182:17;6169:31;6220:18;;6212:6;6209:30;6206:2;;;-1:-1;;6242:12;6206:2;6328:6;6317:9;6313:22;;;1602:3;1595:4;1587:6;1583:17;1579:27;1569:2;;-1:-1;;1610:12;1569:2;1653:6;1640:20;6220:18;1672:6;1669:30;1666:2;;;-1:-1;;1702:12;1666:2;1797:3;6118:2;1777:17;1738:6;1763:32;;1760:41;1757:2;;;-1:-1;;1804:12;1757:2;6118;1734:17;;;;;6262:83;;-1:-1;6080:281;;-1:-1;;;;6080:281::o;6368:362::-;;6493:2;6481:9;6472:7;6468:23;6464:32;6461:2;;;-1:-1;;6499:12;6461:2;6550:17;6544:24;6588:18;;6580:6;6577:30;6574:2;;;-1:-1;;6610:12;6574:2;6697:6;6686:9;6682:22;;;1946:3;1939:4;1931:6;1927:17;1923:27;1913:2;;-1:-1;;1954:12;1913:2;1994:6;1988:13;6588:18;29903:6;29900:30;29897:2;;;-1:-1;;29933:12;29897:2;2016:65;30006:9;29987:17;;-1:-1;;29983:33;6493:2;30064:15;2016:65;:::i;:::-;2007:74;;2101:6;2094:5;2087:21;2205:3;6493:2;2196:6;2129;2187:16;;2184:25;2181:2;;;-1:-1;;2212:12;2181:2;2232:39;2264:6;6493:2;2163:5;2159:16;6493:2;2129:6;2125:17;2232:39;:::i;:::-;-1:-1;6630:84;6455:275;-1:-1;;;;6455:275::o;6737:324::-;;6882:3;;6870:9;6861:7;6857:23;6853:33;6850:2;;;-1:-1;;6889:12;6850:2;2481:22;6882:3;2481:22;:::i;:::-;2472:31;;2627:22;4204:13;2577:16;2570:86;2723:2;2792:9;2788:22;4204:13;2723:2;2742:5;2738:16;2731:86;2883:2;2952:9;2948:22;4204:13;2883:2;2902:5;2898:16;2891:86;3051:2;3120:9;3116:22;4204:13;3051:2;3070:5;3066:16;3059:86;3219:3;3289:9;3285:22;4204:13;3219:3;3239:5;3235:16;3228:86;3381:3;3451:9;3447:22;4204:13;3381:3;3401:5;3397:16;3390:86;3542:3;3612:9;3608:22;4204:13;3542:3;3562:5;3558:16;3551:86;3703:3;3773:9;3769:22;4204:13;3703:3;3723:5;3719:16;3712:86;3864:3;;3936:9;3932:22;4204:13;3864:3;3884:5;3880:18;3873:88;;6941:104;;;;6844:217;;;;:::o;7068:241::-;;7172:2;7160:9;7151:7;7147:23;7143:32;7140:2;;;-1:-1;;7178:12;7140:2;-1:-1;4056:20;;7134:175;-1:-1;7134:175::o;7316:263::-;;7431:2;7419:9;7410:7;7406:23;7402:32;7399:2;;;-1:-1;;7437:12;7399:2;-1:-1;4204:13;;7393:186;-1:-1;7393:186::o;7586:366::-;;;7707:2;7695:9;7686:7;7682:23;7678:32;7675:2;;;-1:-1;;7713:12;7675:2;4069:6;4056:20;7765:63;;7865:2;7908:9;7904:22;72:20;97:33;124:5;97:33;:::i;:::-;7873:63;;;;7669:283;;;;;:::o;8584:690::-;;8777:5;30461:12;31233:6;31228:3;31221:19;31270:4;;31265:3;31261:14;8789:93;;31270:4;8953:5;30211:14;-1:-1;8992:260;9017:6;9014:1;9011:13;8992:260;;;9078:13;;-1:-1;;;;;32284:54;8384:37;;8113:14;;;;30963;;;;5020:18;9032:9;8992:260;;;-1:-1;9258:10;;8708:566;-1:-1;;;;;8708:566::o;16309:271::-;;10254:5;30461:12;10365:52;10410:6;10405:3;10398:4;10391:5;10387:16;10365:52;:::i;:::-;10429:16;;;;;16443:137;-1:-1;;16443:137::o;16587:542::-;;-1:-1;;;13240:11;13233:29;10254:5;30461:12;10365:52;10410:6;13218:1;13285:3;13281:11;10398:4;10391:5;10387:16;10365:52;:::i;:::-;10429:16;;;;13218:1;10429:16;;16824:305;-1:-1;;16824:305::o;17136:222::-;-1:-1;;;;;32284:54;;;;8384:37;;17263:2;17248:18;;17234:124::o;17365:333::-;-1:-1;;;;;32284:54;;;8384:37;;32284:54;;17684:2;17669:18;;8384:37;17520:2;17505:18;;17491:207::o;17705:321::-;-1:-1;;;;;32284:54;;;;8384:37;;32081:13;32074:21;18012:2;17997:18;;10048:34;17854:2;17839:18;;17825:201::o;18033:349::-;-1:-1;;;;;32284:54;;;;8384:37;;18368:2;18353:18;;10864:58;18196:2;18181:18;;18167:215::o;18729:541::-;18960:3;18945:19;;18949:9;9678:21;18729:541;9705:258;30596:4;9727:1;9724:13;9705:258;;;9791:13;;16140:37;;8304:4;8295:14;;;;30963;;;;9752:1;9745:9;9705:258;;;9709:14;;;33095:24;19179:2;19168:9;19164:18;10864:58;10075:5;32081:13;32074:21;19256:2;19245:9;19241:18;10048:34;18931:339;;;;;;:::o;19277:210::-;32081:13;;32074:21;10048:34;;19398:2;19383:18;;19369:118::o;19494:544::-;32081:13;;32074:21;10048:34;;19858:2;19843:18;;16140:37;;;;19941:2;19926:18;;16140:37;20024:2;20009:18;;16140:37;19699:3;19684:19;;19670:368::o;20565:330::-;;20722:2;20743:17;20736:47;31233:6;20722:2;20711:9;20707:18;31221:19;33213:6;33208:3;31261:14;20711:9;31261:14;33190:30;33251:16;;;31261:14;33251:16;;;33244:27;;;;30006:9;33630:14;;;-1:-1;;33626:28;11214:39;;;20693:202;-1:-1;20693:202::o;20902:310::-;;21049:2;21070:17;21063:47;11412:5;30461:12;31233:6;21049:2;21038:9;21034:18;31221:19;11506:52;11551:6;31261:14;21038:9;31261:14;21049:2;11532:5;11528:16;11506:52;:::i;:::-;30006:9;33630:14;-1:-1;;33626:28;11570:39;;;;31261:14;11570:39;;21020:192;-1:-1;;21020:192::o;21219:416::-;21419:2;21433:47;;;12213:2;21404:18;;;31221:19;-1:-1;;;31261:14;;;12229:34;12282:12;;;21390:245::o;21642:416::-;21842:2;21856:47;;;12533:1;21827:18;;;31221:19;-1:-1;;;31261:14;;;12548:28;12595:12;;;21813:245::o;22065:416::-;22265:2;22279:47;;;12846:2;22250:18;;;31221:19;12882:29;31261:14;;;12862:50;12931:12;;;22236:245::o;22488:416::-;22688:2;22702:47;;;13531:2;22673:18;;;31221:19;13567:34;31261:14;;;13547:55;-1:-1;;;13622:12;;;13615:25;13659:12;;;22659:245::o;22911:416::-;23111:2;23125:47;;;13910:1;23096:18;;;31221:19;-1:-1;;;31261:14;;;13925:29;13973:12;;;23082:245::o;23334:416::-;23534:2;23548:47;;;14224:1;23519:18;;;31221:19;-1:-1;;;31261:14;;;14239:30;14288:12;;;23505:245::o;23757:416::-;23957:2;23971:47;;;14539:2;23942:18;;;31221:19;14575:31;31261:14;;;14555:52;14626:12;;;23928:245::o;24180:416::-;24380:2;24394:47;;;14877:2;24365:18;;;31221:19;-1:-1;;;31261:14;;;14893:34;14946:12;;;24351:245::o;24603:416::-;24803:2;24817:47;;;15197:2;24788:18;;;31221:19;15233:34;31261:14;;;15213:55;-1:-1;;;15288:12;;;15281:34;15334:12;;;24774:245::o;25026:416::-;25226:2;25240:47;;;15585:2;25211:18;;;31221:19;-1:-1;;;31261:14;;;15601:33;15653:12;;;25197:245::o;25449:416::-;25649:2;25663:47;;;15904:2;25634:18;;;31221:19;15940:34;31261:14;;;15920:55;-1:-1;;;15995:12;;;15988:46;16053:12;;;25620:245::o;25872:222::-;16140:37;;;25999:2;25984:18;;25970:124::o;26101:481::-;;16170:5;16147:3;16140:37;26306:2;26424;26413:9;26409:18;26402:48;26464:108;26306:2;26295:9;26291:18;26558:6;26464:108;:::i;26589:321::-;16140:37;;;32081:13;32074:21;26896:2;26881:18;;10048:34;26738:2;26723:18;;26709:201::o;26917:816::-;;16170:5;16147:3;16140:37;16170:5;27371:2;27360:9;27356:18;16140:37;27206:3;27408:2;27397:9;27393:18;27386:48;27448:108;27206:3;27195:9;27191:19;27542:6;27448:108;:::i;:::-;-1:-1;;;;;32284:54;;;;27635:2;27620:18;;8384:37;-1:-1;27718:3;27703:19;16140:37;27440:116;27177:556;-1:-1;;;27177:556::o;27740:432::-;16140:37;;;28081:2;28066:18;;16140:37;;;;32081:13;32074:21;28158:2;28143:18;;10048:34;27917:2;27902:18;;27888:284::o;28179:444::-;16140:37;;;28526:2;28511:18;;16140:37;;;;28609:2;28594:18;;16140:37;28362:2;28347:18;;28333:290::o;28630:556::-;16140:37;;;29006:2;28991:18;;16140:37;;;;29089:2;29074:18;;16140:37;29172:2;29157:18;;16140:37;28841:3;28826:19;;28812:374::o;29193:256::-;29255:2;29249:9;29281:17;;;29356:18;29341:34;;29377:22;;;29338:62;29335:2;;;29413:1;;29403:12;29335:2;29255;29422:22;29233:216;;-1:-1;29233:216::o;29456:304::-;;29615:18;29607:6;29604:30;29601:2;;;-1:-1;;29637:12;29601:2;-1:-1;29682:4;29670:17;;;29735:15;;29538:222::o;33286:268::-;33351:1;33358:101;33372:6;33369:1;33366:13;33358:101;;;33439:11;;;33433:18;33420:11;;;33413:39;33394:2;33387:10;33358:101;;;33474:6;33471:1;33468:13;33465:2;;;-1:-1;;33351:1;33521:16;;33514:27;33335:219::o;33667:117::-;-1:-1;;;;;32284:54;;33726:35;;33716:2;;33775:1;;33765:12;33791:111;33872:5;32081:13;32074:21;33850:5;33847:32;33837:2;;33893:1;;33883:12
Swarm Source
ipfs://e86748eb7a9e74e491e86c5844215db40246eca32df517bbe1d68c587697801e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.