Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Strategist | 13245954 | 1288 days ago | IN | 0 ETH | 0.00140967 | ||||
Set Rewards | 13245852 | 1288 days ago | IN | 0 ETH | 0.00479884 | ||||
Set Keeper | 13245674 | 1288 days ago | IN | 0 ETH | 0.00240754 | ||||
Harvest | 13225980 | 1291 days ago | IN | 0 ETH | 0.11666564 | ||||
Harvest | 13213877 | 1293 days ago | IN | 0 ETH | 0.08881771 | ||||
Harvest | 13182915 | 1298 days ago | IN | 0 ETH | 0.05636101 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
StrategyConvex3CrvRewardsClonable
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-07 */ // 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: IConvexDeposit interface IConvexDeposit { // deposit into convex, receive a tokenized deposit. parameter to stake immediately (we always do this). function deposit( uint256 _pid, uint256 _amount, bool _stake ) external returns (bool); // burn a tokenized deposit (Convex deposit tokens) to receive curve lp tokens back function withdraw(uint256 _pid, uint256 _amount) external returns (bool); // give us info about a pool based on its pid function poolInfo(uint256) external view returns ( address, address, address, address, address, bool ); } // Part: IConvexRewards interface IConvexRewards { // strategy's staked balance in the synthetix staking contract function balanceOf(address account) external view returns (uint256); // read how much claimable CRV a strategy has function earned(address account) external view returns (uint256); // stake a convex tokenized deposit function stake(uint256 _amount) external returns (bool); // withdraw to a convex tokenized deposit, probably never need to use this function withdraw(uint256 _amount, bool _claim) external returns (bool); // withdraw directly to curve LP token, this is what we primarily use function withdrawAndUnwrap(uint256 _amount, bool _claim) external returns (bool); // claim rewards, with an option to claim extra rewards or not function getReward(address _account, bool _claimExtras) external returns (bool); // check if we have rewards on a pool function extraRewardsLength() external view returns (uint256); // if we have rewards, see what the address is function extraRewards(uint256 _reward) external view returns (address); // read our rewards token function rewardToken() external view returns (address); } // Part: ICurveFi interface ICurveFi { function get_virtual_price() external view returns (uint256); function add_liquidity( // EURt uint256[2] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( // Compound, sAave uint256[2] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // Iron Bank, Aave uint256[3] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // 3Crv Metapools address pool, uint256[4] calldata amounts, uint256 min_mint_amount ) external; function add_liquidity( // Y and yBUSD uint256[4] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( // 3pool uint256[3] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( // sUSD uint256[4] calldata amounts, uint256 min_mint_amount ) external payable; function remove_liquidity_imbalance( uint256[2] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity(uint256 _amount, uint256[2] calldata amounts) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function balances(uint256) external view returns (uint256); function get_dy( int128 from, int128 to, uint256 _from_amount ) external view returns (uint256); // EURt function calc_token_amount(uint256[2] calldata _amounts, bool _is_deposit) external view returns (uint256); // 3Crv Metapools function calc_token_amount( address _pool, uint256[4] calldata _amounts, bool _is_deposit ) external view returns (uint256); // sUSD, Y pool, etc function calc_token_amount(uint256[4] calldata _amounts, bool _is_deposit) external view returns (uint256); // 3pool, Iron Bank, etc function calc_token_amount(uint256[3] calldata _amounts, bool _is_deposit) external view returns (uint256); function calc_withdraw_one_coin(uint256 amount, int128 i) external view returns (uint256); } // Part: IUniswapV2Router01 interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); 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 swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // 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]/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]/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: yearn/[email protected]/HealthCheck interface HealthCheck { function check( uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding, uint256 totalDebt ) external view returns (bool); } // Part: IUniswapV2Router02 interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // 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: yearn/[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: yearn/[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; // health checks bool public doHealthCheck; address public healthCheck; /** * @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.4.3"; } /** * @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 view virtual 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 view virtual 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 onlyEmergencyAuthorized() { require( msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!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" ); _; } modifier onlyVaultManagers() { require(msg.sender == vault.management() || msg.sender == governance(), "!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. * @param _strategist The address to assign as `strategist`. * The strategist is able to change the reward address * @param _rewards The address to use for pulling rewards. * @param _keeper The adddress of the _keeper. _keeper * can harvest and tend a 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 } function setHealthCheck(address _healthCheck) external onlyVaultManagers { healthCheck = _healthCheck; } function setDoHealthCheck(bool _doHealthCheck) external onlyVaultManagers { doHealthCheck = _doHealthCheck; } /** * @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 conversion from `_amtInWei` (denominated in wei) * to `want` (using the native decimal characteristics of `want`). * @dev * Care must be taken when working with decimals to assure that the conversion * is compatible. As an example: * * given 1e17 wei (0.1 ETH) as input, and want is USDC (6 decimals), * with USDC/ETH = 1800, this should give back 1800000000 (180 USDC) * * @param _amtInWei The amount (in wei/1e-18 ETH) to convert to `want` * @return The amount in `want` of `_amtInEth` converted to `want` **/ function ethToWant(uint256 _amtInWei) public view virtual returns (uint256); /** * @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 view virtual 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`). * * `_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. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * Liquidate everything and returns the amount that got freed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. */ function liquidateAllPositions() internal virtual returns (uint256 _amountFreed); /** * @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 * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCostInWei The keeper's estimated gas cost to call `tend()` (in wei). * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCostInWei) public view virtual 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. // If your implementation uses the cost of the call in want, you can // use uint256 callCost = ethToWant(callCostInWei); 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 * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * 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/main/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 callCostInWei The keeper's estimated gas cost to call `harvest()` (in wei). * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCostInWei) public view virtual returns (bool) { uint256 callCost = ethToWant(callCostInWei); 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 amountFreed = liquidateAllPositions(); if (amountFreed < debtOutstanding) { loss = debtOutstanding.sub(amountFreed); } else if (amountFreed > debtOutstanding) { profit = amountFreed.sub(debtOutstanding); } debtPayment = debtOutstanding.sub(loss); } 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. uint256 totalDebt = vault.strategies(address(this)).totalDebt; debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); // call healthCheck contract if (doHealthCheck && healthCheck != address(0)) { require(HealthCheck(healthCheck).check(profit, loss, debtPayment, debtOutstanding, totalDebt), "!healthcheck"); } else { doHealthCheck = true; } 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 the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * The migration process should be carefully performed to make sure all * the assets are migrated to the new address, which should have never * interacted with the vault before. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault)); 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 onlyEmergencyAuthorized { 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 view virtual 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: StrategyConvexBase abstract contract StrategyConvexBase is BaseStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ // these should stay the same across different wants. // convex stuff address public constant depositContract = 0xF403C135812408BFbE8713b5A23a04b3D48AAE31; // this is the deposit contract that all pools use, aka booster address public rewardsContract; // This is unique to each curve pool uint256 public pid; // this is unique to each pool // keepCRV stuff uint256 public keepCRV; // the percentage of CRV we re-lock for boost (in basis points) address public constant voter = 0xF147b8125d2ef93FB6965Db97D6746952a133934; // Yearn's veCRV voter, we send some extra CRV here uint256 public constant FEE_DENOMINATOR = 10000; // this means all of our fee values are in bips // Swap stuff address public constant sushiswap = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // default to sushiswap, more CRV and CVX liquidity there address[] public crvPath; // path to sell CRV address[] public convexTokenPath; // path to sell CVX IERC20 public constant crv = IERC20(0xD533a949740bb3306d119CC777fa900bA034cd52); IERC20 public constant convexToken = IERC20(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); IERC20 public constant weth = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); // keeper stuff uint256 public harvestProfitNeeded; // we use this to set our dollar target (in USDT) for harvest sells bool internal forceHarvestTriggerOnce; // only set this to true when we want to trigger our keepers to harvest for us string internal stratName; // we use this to be able to adjust our strategy's name // convex-specific variables bool public claimRewards; // boolean if we should always claim rewards when withdrawing, usually withdrawAndUnwrap (generally this should be false) /* ========== CONSTRUCTOR ========== */ constructor(address _vault) public BaseStrategy(_vault) {} /* ========== VIEWS ========== */ function name() external view override returns (string memory) { return stratName; } function stakedBalance() public view returns (uint256) { // how much want we have staked in Convex return IConvexRewards(rewardsContract).balanceOf(address(this)); } function balanceOfWant() public view returns (uint256) { // balance of want sitting in our strategy return want.balanceOf(address(this)); } function claimableBalance() public view returns (uint256) { // how much CRV we can claim from the staking contract return IConvexRewards(rewardsContract).earned(address(this)); } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(stakedBalance()); } /* ========== CONSTANT FUNCTIONS ========== */ // these should stay the same across different wants. function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit) { return; } // Send all of our Curve pool tokens to be deposited uint256 _toInvest = balanceOfWant(); // deposit into convex and stake immediately but only if we have something to invest if (_toInvest > 0) { IConvexDeposit(depositContract).deposit(pid, _toInvest, true); } } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { uint256 _wantBal = balanceOfWant(); if (_amountNeeded > _wantBal) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { IConvexRewards(rewardsContract).withdrawAndUnwrap( Math.min(_stakedBal, _amountNeeded.sub(_wantBal)), claimRewards ); } uint256 _withdrawnBal = balanceOfWant(); _liquidatedAmount = Math.min(_amountNeeded, _withdrawnBal); _loss = _amountNeeded.sub(_liquidatedAmount); } else { // we have enough balance to cover the liquidation available return (_amountNeeded, 0); } } // fire sale, get rid of it all! function liquidateAllPositions() internal override returns (uint256) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { // don't bother withdrawing zero IConvexRewards(rewardsContract).withdrawAndUnwrap( _stakedBal, claimRewards ); } return balanceOfWant(); } // Sells our harvested CRV into the selected output (ETH). function _sellCrv(uint256 _crvAmount) internal { IUniswapV2Router02(sushiswap).swapExactTokensForTokens( _crvAmount, uint256(0), crvPath, address(this), block.timestamp ); } // Sells our harvested CVX into the selected output (ETH). function _sellConvex(uint256 _convexAmount) internal { IUniswapV2Router02(sushiswap).swapExactTokensForTokens( _convexAmount, uint256(0), convexTokenPath, address(this), block.timestamp ); } // in case we need to exit into the convex deposit token, this will allow us to do that // make sure to check claimRewards before this step if needed // plan to have gov sweep convex deposit tokens from strategy after this function withdrawToConvexDepositTokens() external onlyAuthorized { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { IConvexRewards(rewardsContract).withdraw(_stakedBal, claimRewards); } } // we don't want for these tokens to be swept out. We allow gov to sweep out cvx vault tokens; we would only be holding these if things were really, really rekt. function protectedTokens() internal view override returns (address[] memory) {} /* ========== SETTERS ========== */ // These functions are useful for setting parameters of the strategy that may need to be adjusted. // Set the amount of CRV to be locked in Yearn's veCRV voter from each harvest. Default is 10%. function setKeepCRV(uint256 _keepCRV) external onlyAuthorized { require(_keepCRV <= 10_000); keepCRV = _keepCRV; } // We usually don't need to claim rewards on withdrawals, but might change our mind for migrations etc function setClaimRewards(bool _claimRewards) external onlyAuthorized { claimRewards = _claimRewards; } // This determines when we tell our keepers to harvest based on profit. this is how much in USDT we need to make. remember, 6 decimals! function setHarvestProfitNeeded(uint256 _harvestProfitNeeded) external onlyAuthorized { harvestProfitNeeded = _harvestProfitNeeded; } // This allows us to manually harvest with our keeper as needed function setForceHarvestTriggerOnce(bool _forceHarvestTriggerOnce) external onlyAuthorized { forceHarvestTriggerOnce = _forceHarvestTriggerOnce; } } // File: StrategyConvex3CrvRewardsClonable.sol contract StrategyConvex3CrvRewardsClonable is StrategyConvexBase { /* ========== STATE VARIABLES ========== */ // these will likely change across different wants. // Curve stuff address public curve; // Curve Pool, this is our pool specific to this vault ICurveFi public constant zapContract = ICurveFi(0xA79828DF1850E8a3A3064576f380D90aECDD3359); // this is used for depositing to all 3Crv metapools // we use these to deposit to our curve pool uint256 public optimal; // this is the optimal token to deposit back to our curve pool. 0 DAI, 1 USDC, 2 USDT IERC20 public constant usdt = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); IERC20 public constant usdc = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); IERC20 public constant dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); // rewards token info. we can have more than 1 reward token but this is rare, so we don't include this in the template IERC20 public rewardsToken; bool public hasRewards; address[] public rewardsPath; // check for cloning bool internal isOriginal = true; /* ========== CONSTRUCTOR ========== */ constructor( address _vault, uint256 _pid, address _curvePool, string memory _name ) public StrategyConvexBase(_vault) { _initializeStrat(_pid, _curvePool, _name); } /* ========== CLONING ========== */ event Cloned(address indexed clone); // we use this to clone our original strategy to other vaults function cloneConvex3CrvRewards( address _vault, address _strategist, address _rewardsToken, address _keeper, uint256 _pid, address _curvePool, string memory _name ) external returns (address newStrategy) { require(isOriginal); // Copied from https://github.com/optionality/clone-factory/blob/master/contracts/CloneFactory.sol bytes20 addressBytes = bytes20(address(this)); assembly { // EIP-1167 bytecode let clone_code := mload(0x40) mstore( clone_code, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(clone_code, 0x14), addressBytes) mstore( add(clone_code, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) newStrategy := create(0, clone_code, 0x37) } StrategyConvex3CrvRewardsClonable(newStrategy).initialize( _vault, _strategist, _rewardsToken, _keeper, _pid, _curvePool, _name ); emit Cloned(newStrategy); } // this will only be called by the clone function above function initialize( address _vault, address _strategist, address _rewards, address _keeper, uint256 _pid, address _curvePool, string memory _name ) public { _initialize(_vault, _strategist, _rewards, _keeper); _initializeStrat(_pid, _curvePool, _name); } // this is called by our original strategy, as well as any clones function _initializeStrat( uint256 _pid, address _curvePool, string memory _name ) internal { // make sure that we haven't initialized this before require(address(curve) == address(0)); // already initialized. // You can set these parameters on deployment to whatever you want maxReportDelay = 7 days; // 7 days in seconds, if we hit this then harvestTrigger = True debtThreshold = 5 * 1e18; // set a bit of a buffer profitFactor = 10_000; // in this strategy, profitFactor is only used for telling keep3rs when to move funds from vault to strategy (what previously was an earn call) harvestProfitNeeded = 20_000 * 1e6; // this is how much in USDT we need to make. remember, 6 decimals! healthCheck = 0xDDCea799fF1699e98EDF118e0629A974Df7DF012; // health.ychad.eth // want = Curve LP want.approve(address(depositContract), type(uint256).max); crv.approve(sushiswap, type(uint256).max); convexToken.approve(sushiswap, type(uint256).max); // set our keepCRV keepCRV = 1000; // this is the pool specific to this vault, but we only use it as an address curve = address(_curvePool); // setup our rewards contract pid = _pid; // this is the pool ID on convex, we use this to determine what the reweardsContract address is address lptoken; (lptoken, , , rewardsContract, , ) = IConvexDeposit(depositContract) .poolInfo(_pid); // check that our LP token based on our pid matches our want require(address(lptoken) == address(want)); if (IConvexRewards(rewardsContract).extraRewardsLength() == 1) { address _virtualRewardsPool = IConvexRewards(rewardsContract).extraRewards(0); rewardsToken = IERC20( IConvexRewards(_virtualRewardsPool).rewardToken() ); rewardsToken.approve(sushiswap, type(uint256).max); rewardsPath = [address(rewardsToken), address(weth), address(dai)]; hasRewards = true; } // set our strategy's name stratName = _name; // these are our approvals and path specific to this contract dai.approve(address(zapContract), type(uint256).max); usdt.safeApprove(address(zapContract), type(uint256).max); // USDT requires safeApprove(), funky token usdc.approve(address(zapContract), type(uint256).max); // set our paths crvPath = [address(crv), address(weth), address(dai)]; convexTokenPath = [address(convexToken), address(weth), address(dai)]; } /* ========== VARIABLE FUNCTIONS ========== */ // these will likely change across different wants. function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { // if we have anything staked, then harvest CRV and CVX from the rewards contract if (claimableBalance() > 0) { // this claims our CRV, CVX, and any extra tokens like SNX or ANKR. set to false if these tokens don't exist, true if they do. IConvexRewards(rewardsContract).getReward(address(this), true); uint256 crvBalance = crv.balanceOf(address(this)); uint256 convexBalance = convexToken.balanceOf(address(this)); uint256 _sendToVoter = crvBalance.mul(keepCRV).div(FEE_DENOMINATOR); if (_sendToVoter > 0) { crv.safeTransfer(voter, _sendToVoter); } uint256 crvRemainder = crvBalance.sub(_sendToVoter); if (crvRemainder > 0) { _sellCrv(crvRemainder); } if (convexBalance > 0) { _sellConvex(convexBalance); } // claim and sell our rewards if we have them if (hasRewards) { uint256 _rewardsBalance = IERC20(rewardsToken).balanceOf(address(this)); if (_rewardsBalance > 0) { _sellRewards(_rewardsBalance); } } // deposit our balance to Curve if we have any if (optimal == 0) { uint256 daiBalance = dai.balanceOf(address(this)); zapContract.add_liquidity(curve, [0, daiBalance, 0, 0], 0); } else if (optimal == 1) { uint256 usdcBalance = usdc.balanceOf(address(this)); zapContract.add_liquidity(curve, [0, 0, usdcBalance, 0], 0); } else { uint256 usdtBalance = usdt.balanceOf(address(this)); zapContract.add_liquidity(curve, [0, 0, 0, usdtBalance], 0); } } // debtOustanding will only be > 0 in the event of revoking or if we need to rebalance from a withdrawal or lowering the debtRatio if (_debtOutstanding > 0) { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { IConvexRewards(rewardsContract).withdrawAndUnwrap( Math.min(_stakedBal, _debtOutstanding), claimRewards ); } uint256 _withdrawnBal = balanceOfWant(); _debtPayment = Math.min(_debtOutstanding, _withdrawnBal); } // serious loss should never happen, but if it does (for instance, if Curve is hacked), let's record it accurately uint256 assets = estimatedTotalAssets(); uint256 debt = vault.strategies(address(this)).totalDebt; // if assets are greater than debt, things are working great! if (assets > debt) { _profit = assets.sub(debt); uint256 _wantBal = balanceOfWant(); if (_profit.add(_debtPayment) > _wantBal) { // this should only be hit following donations to strategy liquidateAllPositions(); } } // if assets are less than debt, we are in trouble else { _loss = debt.sub(assets); } // we're done harvesting, so reset our trigger if we used it forceHarvestTriggerOnce = false; } // migrate our want token to a new strategy if needed, make sure to check claimRewards first // also send over any CRV or CVX that is claimed; for migrations we definitely want to claim function prepareMigration(address _newStrategy) internal override { uint256 _stakedBal = stakedBalance(); if (_stakedBal > 0) { IConvexRewards(rewardsContract).withdrawAndUnwrap( _stakedBal, claimRewards ); } crv.safeTransfer(_newStrategy, crv.balanceOf(address(this))); convexToken.safeTransfer( _newStrategy, convexToken.balanceOf(address(this)) ); } // Sells our harvested reward token into the selected output. function _sellRewards(uint256 _amount) internal { IUniswapV2Router02(sushiswap).swapExactTokensForTokens( _amount, uint256(0), rewardsPath, address(this), block.timestamp ); } /* ========== KEEP3RS ========== */ function harvestTrigger(uint256 callCostinEth) public view override returns (bool) { // trigger if we want to manually harvest if (forceHarvestTriggerOnce) { return true; } // harvest if we have a profit to claim if (claimableProfitInUsdt() > harvestProfitNeeded) { return true; } // Should not trigger if strategy is not active (no assets and no debtRatio). This means we don't need to adjust keeper job. if (!isActive()) { return false; } return super.harvestTrigger(callCostinEth); } // we will need to add rewards token here if we have them function claimableProfitInUsdt() internal view returns (uint256) { // calculations pulled directly from CVX's contract for minting CVX per CRV claimed uint256 totalCliffs = 1_000; uint256 maxSupply = 100 * 1_000_000 * 1e18; // 100mil uint256 reductionPerCliff = 100_000 * 1e18; // 100,000 uint256 supply = convexToken.totalSupply(); uint256 mintableCvx; uint256 cliff = supply.div(reductionPerCliff); uint256 _claimableBal = claimableBalance(); //mint if below total cliffs if (cliff < totalCliffs) { //for reduction% take inverse of current cliff uint256 reduction = totalCliffs.sub(cliff); //reduce mintableCvx = _claimableBal.mul(reduction).div(totalCliffs); //supply cap check uint256 amtTillMax = maxSupply.sub(supply); if (mintableCvx > amtTillMax) { mintableCvx = amtTillMax; } } address[] memory crv_usd_path = new address[](3); crv_usd_path[0] = address(crv); crv_usd_path[1] = address(weth); crv_usd_path[2] = address(usdt); address[] memory cvx_usd_path = new address[](3); cvx_usd_path[0] = address(convexToken); cvx_usd_path[1] = address(weth); cvx_usd_path[2] = address(usdt); uint256 crvValue; if (_claimableBal > 0) { uint256[] memory crvSwap = IUniswapV2Router02(sushiswap).getAmountsOut( _claimableBal, crv_usd_path ); crvValue = crvSwap[crvSwap.length - 1]; } uint256 cvxValue; if (mintableCvx > 0) { uint256[] memory cvxSwap = IUniswapV2Router02(sushiswap).getAmountsOut( mintableCvx, cvx_usd_path ); cvxValue = cvxSwap[cvxSwap.length - 1]; } uint256 rewardsValue; if (hasRewards) { address[] memory rewards_usd_path = new address[](3); rewards_usd_path[0] = address(rewardsToken); rewards_usd_path[1] = address(weth); rewards_usd_path[2] = address(usdt); address _virtualRewardsPool = IConvexRewards(rewardsContract).extraRewards(0); uint256 _claimableBonusBal = IConvexRewards(_virtualRewardsPool).earned(address(this)); if (_claimableBonusBal > 0) { uint256[] memory rewardSwap = IUniswapV2Router02(sushiswap).getAmountsOut( _claimableBonusBal, rewards_usd_path ); rewardsValue = rewardSwap[rewardSwap.length - 1]; } } return crvValue.add(cvxValue).add(rewardsValue); } // convert our keeper's eth cost into want function ethToWant(uint256 _ethAmount) public view override returns (uint256) { uint256 callCostInWant; if (_ethAmount > 0) { address[] memory ethPath = new address[](2); ethPath[0] = address(weth); ethPath[1] = address(dai); uint256[] memory _callCostInDaiTuple = IUniswapV2Router02(sushiswap).getAmountsOut( _ethAmount, ethPath ); uint256 _callCostInDai = _callCostInDaiTuple[_callCostInDaiTuple.length - 1]; callCostInWant = zapContract.calc_token_amount( curve, [0, _callCostInDai, 0, 0], true ); } return callCostInWant; } /* ========== SETTERS ========== */ // These functions are useful for setting parameters of the strategy that may need to be adjusted. // Set optimal token to sell harvested funds for depositing to Curve. // Default is DAI, but can be set to USDC or USDT as needed by strategist or governance. function setOptimal(uint256 _optimal) external onlyAuthorized { if (_optimal == 0) { crvPath[2] = address(dai); convexTokenPath[2] = address(dai); if (hasRewards) { rewardsPath[2] = address(dai); } optimal = 0; } else if (_optimal == 1) { crvPath[2] = address(usdc); convexTokenPath[2] = address(usdc); if (hasRewards) { rewardsPath[2] = address(usdc); } optimal = 1; } else if (_optimal == 2) { crvPath[2] = address(usdt); convexTokenPath[2] = address(usdt); if (hasRewards) { rewardsPath[2] = address(usdt); } optimal = 2; } else { revert("incorrect token"); } } // Use to add or update rewards function updateRewards(address _rewardsToken) external onlyGovernance { // reset allowance to zero for our previous token if we had one if (address(rewardsToken) != address(0)) { rewardsToken.approve(sushiswap, uint256(0)); } // update with our new token, use dai as default rewardsToken = IERC20(_rewardsToken); rewardsToken.approve(sushiswap, type(uint256).max); rewardsPath = [address(rewardsToken), address(weth), address(dai)]; hasRewards = true; } // Use to turn off extra rewards claiming function turnOffRewards() external onlyGovernance { hasRewards = false; if (address(rewardsToken) != address(0)) { rewardsToken.approve(sushiswap, uint256(0)); } rewardsToken = IERC20(address(0)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clone","type":"address"}],"name":"Cloned","type":"event"},{"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":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"cloneConvex3CrvRewards","outputs":[{"internalType":"address","name":"newStrategy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convexToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"convexTokenPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crvPath","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":"dai","outputs":[{"internalType":"contract IERC20","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":[],"name":"depositContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doHealthCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"ethToWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestProfitNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCostinEth","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"healthCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","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":[],"name":"optimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_doHealthCheck","type":"bool"}],"name":"setDoHealthCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_forceHarvestTriggerOnce","type":"bool"}],"name":"setForceHarvestTriggerOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestProfitNeeded","type":"uint256"}],"name":"setHarvestProfitNeeded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_healthCheck","type":"address"}],"name":"setHealthCheck","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":"_optimal","type":"uint256"}],"name":"setOptimal","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":"stakedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCostInWei","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"turnOffRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"updateRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"contract IERC20","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":"contract IERC20","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"},{"inputs":[],"name":"zapContract","outputs":[{"internalType":"contract ICurveFi","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526017805460ff191660011790553480156200001e57600080fd5b50604051620071bb380380620071bb833981016040819052620000419162000f98565b838062000051813380806200006b565b506200006190508383836200024f565b5050505062001297565b6006546001600160a01b031615620000a05760405162461bcd60e51b8152600401620000979062001128565b60405180910390fd5b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015620000fd57600080fd5b505afa15801562000112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000138919062000ee7565b600680546001600160a01b0319166001600160a01b0392831617908190556200017291168560001962000ad7602090811b62002d7d17901c565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393620001f2939116916000199101620010d1565b602060405180830381600087803b1580156200020d57600080fd5b505af115801562000222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024891906200105e565b5050505050565b60135461010090046001600160a01b0316156200026b57600080fd5b62093a80600855674563918244f40000600a556127106009556404a817c80060105560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df0120017905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002ff9073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401620010d1565b602060405180830381600087803b1580156200031a57600080fd5b505af11580156200032f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035591906200105e565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b390620003a79073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060001990600401620010d1565b602060405180830381600087803b158015620003c257600080fd5b505af1158015620003d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fd91906200105e565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b3906200044f9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060001990600401620010d1565b602060405180830381600087803b1580156200046a57600080fd5b505af11580156200047f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a591906200105e565b506103e8600d5560138054610100600160a81b0319166101006001600160a01b03851602179055600c839055604051631526fe2760e01b815260009073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906200050d908790600401620010ea565b60c06040518083038186803b1580156200052657600080fd5b505afa1580156200053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000561919062000f0c565b5050600b8054610100600160a81b0319166101006001600160a01b0393841602179055600654939450928316928416929092149150620005a2905057600080fd5b600b60019054906101000a90046001600160a01b03166001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f157600080fd5b505afa15801562000606573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200062c919062001080565b600114156200085f57600b54604051632061aa2360e11b815260009161010090046001600160a01b0316906340c35446906200066d908490600401620010ea565b60206040518083038186803b1580156200068657600080fd5b505afa1580156200069b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006c1919062000ee7565b9050806001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015620006fd57600080fd5b505afa15801562000712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000738919062000ee7565b601580546001600160a01b0319166001600160a01b03928316179081905560405163095ea7b360e01b815291169063095ea7b390620007949073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060001990600401620010d1565b602060405180830381600087803b158015620007af57600080fd5b505af1158015620007c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ea91906200105e565b50604080516060810182526015546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f918101919091526200084990601690600362000da6565b50506015805460ff60a01b1916600160a01b1790555b81516200087490601290602085019062000e10565b5060405163095ea7b360e01b8152736b175474e89094c44da98b954eedeac495271d0f9063095ea7b390620008c69073a79828df1850e8a3a3064576f380d90aecdd33599060001990600401620010d1565b602060405180830381600087803b158015620008e157600080fd5b505af1158015620008f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200091c91906200105e565b506200096073dac17f958d2ee523a2206206994597c13d831ec773a79828df1850e8a3a3064576f380d90aecdd335960001962000ad7602090811b62002d7d17901c565b60405163095ea7b360e01b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b390620009b19073a79828df1850e8a3a3064576f380d90aecdd33599060001990600401620010d1565b602060405180830381600087803b158015620009cc57600080fd5b505af1158015620009e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a0791906200105e565b506040805160608101825273d533a949740bb3306d119cc777fa900ba034cd52815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f9181019190915262000a6f90600e90600362000da6565b5060408051606081018252734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f918101919091526200024890600f90600362000da6565b80158062000b665750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000b109030908690600401620010b7565b60206040518083038186803b15801562000b2957600080fd5b505afa15801562000b3e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b64919062001080565b155b62000b855760405162461bcd60e51b81526004016200009790620011e0565b62000be08363095ea7b360e01b848460405160240162000ba7929190620010d1565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000be516565b505050565b606062000c41826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000c8160201b62002e7c179092919060201c565b80519091501562000be0578080602001905181019062000c6291906200105e565b62000be05760405162461bcd60e51b8152600401620000979062001196565b606062000c92848460008562000c9a565b949350505050565b606062000ca78562000d6c565b62000cc65760405162461bcd60e51b815260040162000097906200115f565b60006060866001600160a01b0316858760405162000ce5919062001099565b60006040518083038185875af1925050503d806000811462000d24576040519150601f19603f3d011682016040523d82523d6000602084013e62000d29565b606091505b5091509150811562000d3f57915062000c929050565b80511562000d505780518082602001fd5b8360405162461bcd60e51b8152600401620000979190620010f3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000c92575050151592915050565b82805482825590600052602060002090810192821562000dfe579160200282015b8281111562000dfe57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000dc7565b5062000e0c92915062000e91565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000e5357805160ff191683800117855562000e83565b8280016001018555821562000e83579182015b8281111562000e8357825182559160200191906001019062000e66565b5062000e0c92915062000eb2565b5b8082111562000e0c5780546001600160a01b031916815560010162000e92565b5b8082111562000e0c576000815560010162000eb3565b80516001600160a01b038116811462000ee157600080fd5b92915050565b60006020828403121562000ef9578081fd5b62000f05838362000ec9565b9392505050565b60008060008060008060c0878903121562000f25578182fd5b62000f31888862000ec9565b955062000f42886020890162000ec9565b945062000f53886040890162000ec9565b935062000f64886060890162000ec9565b925062000f75886080890162000ec9565b915060a0870151801515811462000f8a578182fd5b809150509295509295509295565b6000806000806080858703121562000fae578384fd5b62000fba868662000ec9565b93506020850151925062000fd2866040870162000ec9565b60608601519092506001600160401b038082111562000fef578283fd5b818701915087601f83011262001003578283fd5b81518181111562001012578384fd5b62001027601f8201601f19166020016200123d565b91508082528860208285010111156200103e578384fd5b6200105181602084016020860162001264565b5094979396509194505050565b60006020828403121562001070578081fd5b8151801515811462000f05578182fd5b60006020828403121562001092578081fd5b5051919050565b60008251620010ad81846020870162001264565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b90815260200190565b60006020825282518060208401526200111481604085016020870162001264565b601f01601f19169190910160400192915050565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b6040518181016001600160401b03811182821017156200125c57600080fd5b604052919050565b60005b838110156200128157818101518382015260200162001267565b8381111562001291576000848401525b50505050565b615f1480620012a76000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c8063748747e611610236578063c7b9d5301161013b578063ecf04e15116100c3578063f4b9fa7511610087578063f4b9fa75146107b5578063f6fe3aa7146107bd578063fbfa77cf146107c5578063fcf2d0ad146107cd578063fd82d58b146107d557610433565b8063ecf04e1514610777578063ed882c2b1461077f578063efbb5cb014610792578063f017c92f1461079a578063f1068454146107ad57610433565b8063d1af0c7d1161010a578063d1af0c7d14610744578063d73792a91461074c578063e89133b214610754578063e94ad65b1461075c578063ec38a8621461076457610433565b8063c7b9d530146106f8578063cc4849691461070b578063ce5494bb1461071e578063cffed5a51461073157610433565b80639be28785116101be578063aced16611161018d578063aced1661146106c5578063ad409500146106cd578063b252720b146106e0578063c1a3d44c146106e8578063c4f45423146106f057610433565b80639be287851461068f5780639ec5a89414610697578063a98f92961461069f578063ac00ff26146106b257610433565b80638cdfe166116102055780638cdfe166146106515780638e6350e21461065957806391397ab414610661578063955383bd1461067457806395e80c501461068757610433565b8063748747e614610610578063750521f514610623578063780022a0146106365780637fef901a1461064957610433565b806339a172a81161033c57806352f9c763116102c4578063650d188011610293578063650d1880146105d25780636718835f146105e55780636a4874a1146105ed5780636c3d9186146105f55780637165485d1461060857610433565b806352f9c763146105a75780635641ec03146105af5780635b9f0016146105b75780635fd61965146105bf57610433565b80634641257d1161030b5780634641257d1461056957806346c96aac146105715780634d24044c146105795780635075e01014610581578063520009df1461059457610433565b806339a172a81461053e5780633e413bee146105515780633fc8cef314610559578063440368a31461056157610433565b8063220cce97116103bf57806328b7ccf71161038e57806328b7ccf71461050b5780632e1a7d4d146105135780632f48ab7d1461052657806334659dc51461052e578063372500ab1461053657610433565b8063220cce97146104de57806322f3e2d4146104e65780632549dad9146104fb578063258294101461050357610433565b80630f969b87116104065780630f969b871461048657806311bc8245146104995780631d12f28b146104ac5780631f1fcd51146104c15780631fe4a686146104d657610433565b806301681a621461043857806303ee438c1461044d57806306fdde031461046b5780630ada4dab14610473575b600080fd5b61044b6104463660046154ce565b6107e8565b005b610455610987565b6040516104629190615a2d565b60405180910390f35b610455610a15565b61044b610481366004615714565b610aab565b61044b610494366004615837565b610b0b565b61044b6104a73660046154ce565b610b98565b6104b4610c99565b60405161046291906159f5565b6104c9610c9f565b60405161046291906158d8565b6104c9610cae565b6104c9610cbd565b6104ee610cd1565b60405161046291906159ea565b6104c9610d73565b610455610d8b565b6104b4610daa565b6104b4610521366004615837565b610db0565b6104c9610e0b565b61044b610e23565b6104ee610f12565b61044b61054c366004615837565b610f1b565b6104c9610f9d565b6104c9610fb5565b61044b610fcd565b61044b6111f6565b6104c96116cf565b6104b46116e7565b6104c961058f366004615837565b6116ed565b61044b6105a2366004615837565b611714565b61044b611ab1565b6104ee611bad565b6104b4611bb6565b61044b6105cd3660046154ce565b611c3c565b6104ee6105e0366004615837565b611e37565b6104ee611e3f565b6104c9611e48565b61044b61060336600461558c565b611e60565b6104c9611e80565b61044b61061e3660046154ce565b611e94565b61044b61063136600461574c565b611f3f565b6104b4610644366004615837565b611fd6565b6104b46121fc565b6104b4612202565b6104b4612208565b61044b61066f366004615837565b61220d565b61044b610682366004615837565b61228f565b6104b46122f0565b6104c96122f6565b6104c9612308565b61044b6106ad366004615714565b612317565b61044b6106c0366004615714565b612377565b6104c9612463565b6104c96106db366004615837565b612472565b6104c961247f565b6104b4612493565b6104b46124c4565b61044b6107063660046154ce565b6124f8565b6104c961071936600461558c565b6125a3565b61044b61072c3660046154ce565b6126aa565b61044b61073f366004615837565b6127f5565b6104c9612847565b6104b4612856565b6104c961285c565b6104c9612874565b61044b6107723660046154ce565b61288c565b6104ee612a1f565b6104ee61078d366004615837565b612a2f565b6104b4612a7b565b61044b6107a8366004615837565b612a96565b6104b4612b18565b6104c9612b1e565b6104b4612b36565b6104c9612b3c565b61044b612b4b565b6104c96107e3366004615837565b612d70565b6107f0612e93565b6001600160a01b0316336001600160a01b0316146108295760405162461bcd60e51b815260040161082090615bfa565b60405180910390fd5b6006546001600160a01b03828116911614156108575760405162461bcd60e51b815260040161082090615a65565b6002546001600160a01b03828116911614156108855760405162461bcd60e51b815260040161082090615ba2565b606061088f612f10565b905060005b81518110156108ea578181815181106108a957fe5b60200260200101516001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260040161082090615c69565b600101610894565b506109836108f6612e93565b6040516370a0823160e01b81526001600160a01b038516906370a08231906109229030906004016158d8565b60206040518083038186803b15801561093a57600080fd5b505afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610972919061584f565b6001600160a01b0385169190612f15565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b505050505081565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b6003546001600160a01b0316331480610adc5750610ac7612e93565b6001600160a01b0316336001600160a01b0316145b610af85760405162461bcd60e51b815260040161082090615bfa565b6011805460ff1916911515919091179055565b6003546001600160a01b0316331480610b3c5750610b27612e93565b6001600160a01b0316336001600160a01b0316145b610b585760405162461bcd60e51b815260040161082090615bfa565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610b8d9083906159f5565b60405180910390a150565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610be657600080fd5b505afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e91906154ea565b6001600160a01b0316336001600160a01b03161480610c555750610c40612e93565b6001600160a01b0316336001600160a01b0316145b610c715760405162461bcd60e51b815260040161082090615bfa565b600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b600b5461010090046001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610d069030906004016158d8565b6101206040518083038186803b158015610d1f57600080fd5b505afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906157b9565b604001511180610d6e57506000610d6c612a7b565b115b905090565b73a79828df1850e8a3a3064576f380d90aecdd335981565b604080518082019091526005815264302e342e3360d81b602082015290565b60085481565b6002546000906001600160a01b03163314610ddd5760405162461bcd60e51b815260040161082090615b82565b6000610de883612f34565b600654909350909150610e05906001600160a01b03163383612f15565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6003546001600160a01b0316331480610e545750610e3f612e93565b6001600160a01b0316336001600160a01b0316145b610e705760405162461bcd60e51b815260040161082090615bfa565b6000610e7a611bb6565b90508015610f0f57600b54601354604051631c683a1b60e11b81526101009092046001600160a01b0316916338d0743691610ebd91859160ff1690600401615d39565b602060405180830381600087803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190615730565b50565b60135460ff1681565b6003546001600160a01b0316331480610f4c5750610f37612e93565b6001600160a01b0316336001600160a01b0316145b610f685760405162461bcd60e51b815260040161082090615bfa565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610b8d9083906159f5565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6005546001600160a01b0316331480610ff057506003546001600160a01b031633145b806110135750610ffe612e93565b6001600160a01b0316336001600160a01b0316145b806110b45750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561106757600080fd5b505afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f91906154ea565b6001600160a01b0316336001600160a01b0316145b806111555750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561110857600080fd5b505afa15801561111c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114091906154ea565b6001600160a01b0316336001600160a01b0316145b6111715760405162461bcd60e51b815260040161082090615bfa565b6002546040805163bf3759b560e01b815290516111f4926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef919061584f565b613041565b565b6005546001600160a01b031633148061121957506003546001600160a01b031633145b8061123c5750611227612e93565b6001600160a01b0316336001600160a01b0316145b806112dd5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c891906154ea565b6001600160a01b0316336001600160a01b0316145b8061137e5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136991906154ea565b6001600160a01b0316336001600160a01b0316145b61139a5760405162461bcd60e51b815260040161082090615bfa565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ed57600080fd5b505afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611425919061584f565b600b5490915060009060ff16156114825760006114406130f3565b90508281101561145b5761145483826131a3565b9350611470565b828111156114705761146d81846131a3565b94505b61147a83856131a3565b915050611493565b61148b826131ec565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf823906114c49030906004016158d8565b6101206040518083038186803b1580156114dd57600080fd5b505afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151591906157b9565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc9061154e90889088908790600401615dd4565b602060405180830381600087803b15801561156857600080fd5b505af115801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a0919061584f565b92506115ab83613041565b60015460ff1680156115cc575060015461010090046001600160a01b031615155b1561167e5760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b9061160d9088908890879089908890600401615e05565b60206040518083038186803b15801561162557600080fd5b505afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190615730565b6116795760405162461bcd60e51b815260040161082090615abb565b61168b565b6001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509858584866040516116c09493929190615dea565b60405180910390a15050505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b60145481565b601681815481106116fa57fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b03163314806117455750611730612e93565b6001600160a01b0316336001600160a01b0316145b6117615760405162461bcd60e51b815260040161082090615bfa565b8061187157736b175474e89094c44da98b954eedeac495271d0f600e60028154811061178957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550736b175474e89094c44da98b954eedeac495271d0f600f6002815481106117da57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff161561186757736b175474e89094c44da98b954eedeac495271d0f601660028154811061183857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6000601455610f0f565b80600114156119855773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600e60028154811061189d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600f6002815481106118ee57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff161561197b5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601660028154811061194c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001601455610f0f565b8060021415611a995773dac17f958d2ee523a2206206994597c13d831ec7600e6002815481106119b157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073dac17f958d2ee523a2206206994597c13d831ec7600f600281548110611a0257fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff1615611a8f5773dac17f958d2ee523a2206206994597c13d831ec76016600281548110611a6057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6002601455610f0f565b60405162461bcd60e51b815260040161082090615ae1565b611ab9612e93565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161082090615bfa565b6015805460ff60a01b1981169091556001600160a01b031615611b9b5760155460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611b4790600080516020615ebf833981519152906000906004016159d1565b602060405180830381600087803b158015611b6157600080fd5b505af1158015611b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b999190615730565b505b601580546001600160a01b0319169055565b600b5460ff1681565b600b546040516370a0823160e01b815260009161010090046001600160a01b0316906370a0823190611bec9030906004016158d8565b60206040518083038186803b158015611c0457600080fd5b505afa158015611c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e919061584f565b611c44612e93565b6001600160a01b0316336001600160a01b031614611c745760405162461bcd60e51b815260040161082090615bfa565b6015546001600160a01b031615611d1a5760155460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611cc690600080516020615ebf833981519152906000906004016159d1565b602060405180830381600087803b158015611ce057600080fd5b505af1158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d189190615730565b505b601580546001600160a01b0319166001600160a01b03838116919091179182905560405163095ea7b360e01b815291169063095ea7b390611d7190600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015611d8b57600080fd5b505af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc39190615730565b50604080516060810182526015546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f91810191909152611e20906016906003615301565b50506015805460ff60a01b1916600160a01b179055565b60005b919050565b60015460ff1681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b611e6c87878787613a05565b611e77838383613bc5565b50505050505050565b60135461010090046001600160a01b031681565b6003546001600160a01b0316331480611ec55750611eb0612e93565b6001600160a01b0316336001600160a01b0316145b611ee15760405162461bcd60e51b815260040161082090615bfa565b6001600160a01b038116611ef457600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610b8d9083906158d8565b6003546001600160a01b0316331480611f705750611f5b612e93565b6001600160a01b0316336001600160a01b0316145b611f8c5760405162461bcd60e51b815260040161082090615bfa565b611f9860008383615366565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611fca9291906159fe565b60405180910390a15050565b60008082156121f657604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061202157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050736b175474e89094c44da98b954eedeac495271d0f8160018151811061206357fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f906120b19088908690600401615ce3565b60006040518083038186803b1580156120c957600080fd5b505afa1580156120dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612105919081019061567f565b905060008160018351038151811061211957fe5b6020026020010151905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0601360019054906101000a90046001600160a01b031660405180608001604052806000815260200185815260200160008152602001600081525060016040518463ffffffff1660e01b81526004016121a09392919061595e565b60206040518083038186803b1580156121b857600080fd5b505afa1580156121cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f0919061584f565b93505050505b92915050565b600d5481565b60095481565b600090565b6003546001600160a01b031633148061223e5750612229612e93565b6001600160a01b0316336001600160a01b0316145b61225a5760405162461bcd60e51b815260040161082090615bfa565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610b8d9083906159f5565b6003546001600160a01b03163314806122c057506122ab612e93565b6001600160a01b0316336001600160a01b0316145b6122dc5760405162461bcd60e51b815260040161082090615bfa565b6127108111156122eb57600080fd5b600d55565b60075481565b600080516020615ebf83398151915281565b6004546001600160a01b031681565b6003546001600160a01b03163314806123485750612333612e93565b6001600160a01b0316336001600160a01b0316145b6123645760405162461bcd60e51b815260040161082090615bfa565b6013805460ff1916911515919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c557600080fd5b505afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906154ea565b6001600160a01b0316336001600160a01b03161480612434575061241f612e93565b6001600160a01b0316336001600160a01b0316145b6124505760405162461bcd60e51b815260040161082090615bfa565b6001805460ff1916911515919091179055565b6005546001600160a01b031681565b600e81815481106116fa57fe5b60015461010090046001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611bec9030906004016158d8565b600b546040516246613160e11b815260009161010090046001600160a01b031690628cc26290611bec9030906004016158d8565b6003546001600160a01b03163314806125295750612514612e93565b6001600160a01b0316336001600160a01b0316145b6125455760405162461bcd60e51b815260040161082090615bfa565b6001600160a01b03811661255857600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610b8d9083906158d8565b60175460009060ff166125b557600080fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b6028830152906037816000f060405163361ec8c360e11b81529093506001600160a01b0384169150636c3d918690612638908c908c908c908c908c908c908c90600401615906565b600060405180830381600087803b15801561265257600080fd5b505af1158015612666573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a250979650505050505050565b6002546001600160a01b031633146126c157600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561270857600080fd5b505afa15801561271c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274091906154ea565b6001600160a01b03161461275357600080fd5b61275c816143ea565b6006546040516370a0823160e01b8152610f0f9183916001600160a01b03909116906370a08231906127929030906004016158d8565b60206040518083038186803b1580156127aa57600080fd5b505afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e2919061584f565b6006546001600160a01b03169190612f15565b6003546001600160a01b03163314806128265750612811612e93565b6001600160a01b0316336001600160a01b0316145b6128425760405162461bcd60e51b815260040161082090615bfa565b601055565b6015546001600160a01b031681565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6003546001600160a01b031633146128b65760405162461bcd60e51b815260040161082090615a40565b6001600160a01b0381166128c957600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b3936129009390911691600091016159d1565b602060405180830381600087803b15801561291a57600080fd5b505af115801561292e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129529190615730565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b39361299d93169160001991016159d1565b602060405180830381600087803b1580156129b757600080fd5b505af11580156129cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ef9190615730565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610b8d91906158d8565b601554600160a01b900460ff1681565b60115460009060ff1615612a4557506001611e3a565b601054612a506145dd565b1115612a5e57506001611e3a565b612a66610cd1565b612a7257506000611e3a565b6121f682614cca565b6000610d6e612a88611bb6565b612a90612493565b90614f54565b6003546001600160a01b0316331480612ac75750612ab2612e93565b6001600160a01b0316336001600160a01b0316145b612ae35760405162461bcd60e51b815260040161082090615bfa565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610b8d9083906159f5565b600c5481565b736b175474e89094c44da98b954eedeac495271d0f81565b60105481565b6002546001600160a01b031681565b6003546001600160a01b0316331480612b7c5750612b67612e93565b6001600160a01b0316336001600160a01b0316145b80612c1d5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015612bd057600080fd5b505afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906154ea565b6001600160a01b0316336001600160a01b0316145b80612cbe5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7157600080fd5b505afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca991906154ea565b6001600160a01b0316336001600160a01b0316145b612cda5760405162461bcd60e51b815260040161082090615bfa565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b158015612d2d57600080fd5b505af1158015612d41573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b600f81815481106116fa57fe5b801580612e055750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612db390309086906004016158ec565b60206040518083038186803b158015612dcb57600080fd5b505afa158015612ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e03919061584f565b155b612e215760405162461bcd60e51b815260040161082090615c8d565b612e778363095ea7b360e01b8484604051602401612e409291906159d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f79565b505050565b6060612e8b8484600085615008565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b158015612ed857600080fd5b505afa158015612eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e91906154ea565b606090565b612e778363a9059cbb60e01b8484604051602401612e409291906159d1565b6000806000612f41612493565b90508084111561302d576000612f55611bb6565b9050801561300257600b5461010090046001600160a01b031663c32e7202612f8683612f8189876131a3565b6150cc565b6013546040516001600160e01b031960e085901b168152612fae929160ff1690600401615d39565b602060405180830381600087803b158015612fc857600080fd5b505af1158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130009190615730565b505b600061300c612493565b905061301886826150cc565b945061302486866131a3565b9350505061303a565b836000925092505061303c565b505b915091565b600b5460ff161561305157610f0f565b600061305b612493565b9050801561098357600c546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916130a191908590600190600401615dbc565b602060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e779190615730565b6000806130fe611bb6565b9050801561319557600b54601354604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161314191859160ff1690600401615d39565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131939190615730565b505b61319d612493565b91505090565b60006131e583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506150e2565b9392505050565b6000806000806131fa6124c4565b111561383e57600b54604051637050ccd960e01b81526101009091046001600160a01b031690637050ccd9906132379030906001906004016159b6565b602060405180830381600087803b15801561325157600080fd5b505af1158015613265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132899190615730565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906132c49030906004016158d8565b60206040518083038186803b1580156132dc57600080fd5b505afa1580156132f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613314919061584f565b6040516370a0823160e01b8152909150600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906133519030906004016158d8565b60206040518083038186803b15801561336957600080fd5b505afa15801561337d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a1919061584f565b905060006133c66127106133c0600d548661510e90919063ffffffff16565b90615148565b905080156134015761340173d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612f15565b600061340d84836131a3565b9050801561341e5761341e8161518a565b821561342d5761342d8361521b565b601554600160a01b900460ff16156134d3576015546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134709030906004016158d8565b60206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c0919061584f565b905080156134d1576134d181615256565b505b60145461360a576040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a08231906135149030906004016158d8565b60206040518083038186803b15801561352c57600080fd5b505afa158015613540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613564919061584f565b6013546040805160808101825260008082526020820185905281830181905260608201819052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db936135d2936101009091046001600160a01b0316929160040161598b565b600060405180830381600087803b1580156135ec57600080fd5b505af1158015613600573d6000803e3d6000fd5b5050505050613839565b6014546001141561370d576040516370a0823160e01b815260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a082319061364f9030906004016158d8565b60206040518083038186803b15801561366757600080fd5b505afa15801561367b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369f919061584f565b6013546040805160808101825260008082526020820181905281830185905260608201819052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db936135d2936101009091046001600160a01b0316929160040161598b565b6040516370a0823160e01b815260009073dac17f958d2ee523a2206206994597c13d831ec7906370a08231906137479030906004016158d8565b60206040518083038186803b15801561375f57600080fd5b505afa158015613773573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613797919061584f565b6013546040805160808101825260008082526020820181905281830181905260608201859052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db93613805936101009091046001600160a01b0316929160040161598b565b600060405180830381600087803b15801561381f57600080fd5b505af1158015613833573d6000803e3d6000fd5b50505050505b505050505b831561390d57600061384e611bb6565b905080156138f257600b5461010090046001600160a01b031663c32e720261387683886150cc565b6013546040516001600160e01b031960e085901b16815261389e929160ff1690600401615d39565b602060405180830381600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f09190615730565b505b60006138fc612493565b905061390886826150cc565b925050505b6000613917612a7b565b6002546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061394d9030906004016158d8565b6101206040518083038186803b15801561396657600080fd5b505afa15801561397a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399e91906157b9565b60c001519050808211156139e5576139b682826131a3565b945060006139c2612493565b9050806139cf8786614f54565b11156139df576139dd6130f3565b505b506139f2565b6139ef81836131a3565b93505b50506011805460ff191690559193909250565b6006546001600160a01b031615613a2e5760405162461bcd60e51b815260040161082090615b0a565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac291906154ea565b600680546001600160a01b0319166001600160a01b039283161790819055613aee911685600019612d7d565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393613b6c9391169160001991016159d1565b602060405180830381600087803b158015613b8657600080fd5b505af1158015613b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbe9190615730565b5050505050565b60135461010090046001600160a01b031615613be057600080fd5b62093a80600855674563918244f40000600a556127106009556404a817c80060105560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df0120017905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390613c729073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016159d1565b602060405180830381600087803b158015613c8c57600080fd5b505af1158015613ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc49190615730565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b390613d0e90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015613d2857600080fd5b505af1158015613d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d609190615730565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b390613daa90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015613dc457600080fd5b505af1158015613dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfc9190615730565b506103e8600d5560138054610100600160a81b0319166101006001600160a01b03851602179055600c839055604051631526fe2760e01b815260009073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe2790613e629087906004016159f5565b60c06040518083038186803b158015613e7a57600080fd5b505afa158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190615506565b5050600b8054610100600160a81b0319166101006001600160a01b0393841602179055600654939450928316928416929092149150613ef2905057600080fd5b600b60019054906101000a90046001600160a01b03166001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4057600080fd5b505afa158015613f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f78919061584f565b6001141561419257600b54604051632061aa2360e11b815260009161010090046001600160a01b0316906340c3544690613fb69084906004016159f5565b60206040518083038186803b158015613fce57600080fd5b505afa158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400691906154ea565b9050806001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b15801561404157600080fd5b505afa158015614055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407991906154ea565b601580546001600160a01b0319166001600160a01b03928316179081905560405163095ea7b360e01b815291169063095ea7b3906140cd90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b1580156140e757600080fd5b505af11580156140fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411f9190615730565b50604080516060810182526015546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f9181019190915261417c906016906003615301565b50506015805460ff60a01b1916600160a01b1790555b81516141a59060129060208501906153e0565b5060405163095ea7b360e01b8152736b175474e89094c44da98b954eedeac495271d0f9063095ea7b3906141f59073a79828df1850e8a3a3064576f380d90aecdd335990600019906004016159d1565b602060405180830381600087803b15801561420f57600080fd5b505af1158015614223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142479190615730565b5061427d73dac17f958d2ee523a2206206994597c13d831ec773a79828df1850e8a3a3064576f380d90aecdd3359600019612d7d565b60405163095ea7b360e01b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b3906142cc9073a79828df1850e8a3a3064576f380d90aecdd335990600019906004016159d1565b602060405180830381600087803b1580156142e657600080fd5b505af11580156142fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431e9190615730565b506040805160608101825273d533a949740bb3306d119cc777fa900ba034cd52815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f9181019190915261438490600e906003615301565b5060408051606081018252734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f91810191909152613bbe90600f906003615301565b60006143f4611bb6565b9050801561448b57600b54601354604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161443791859160ff1690600401615d39565b602060405180830381600087803b15801561445157600080fd5b505af1158015614465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144899190615730565b505b6040516370a0823160e01b815261453490839073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906144c89030906004016158d8565b60206040518083038186803b1580156144e057600080fd5b505afa1580156144f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614518919061584f565b73d533a949740bb3306d119cc777fa900ba034cd529190612f15565b6040516370a0823160e01b8152610983908390734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906145719030906004016158d8565b60206040518083038186803b15801561458957600080fd5b505afa15801561459d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c1919061584f565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612f15565b6000806103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561465357600080fd5b505afa158015614667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061468b919061584f565b905060008061469a8385615148565b905060006146a66124c4565b9050868210156146eb5760006146bc88846131a3565b90506146cc886133c0848461510e565b935060006146da88876131a3565b9050808511156146e8578094505b50505b6040805160038082526080820190925260609160208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061472f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061477157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec7816002815181106147b357fe5b6001600160a01b03929092166020928302919091018201526040805160038082526080820190925260609290919082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160008151811061481057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061485257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec78160028151811061489457fe5b6001600160a01b03909216602092830291909101909101526000831561495c5760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f906148ea9088908890600401615ce3565b60006040518083038186803b15801561490257600080fd5b505afa158015614916573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261493e919081019061567f565b90508060018251038151811061495057fe5b60200260200101519150505b60008615614a0c5760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f9061499a908b908890600401615ce3565b60006040518083038186803b1580156149b257600080fd5b505afa1580156149c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526149ee919081019061567f565b905080600182510381518110614a0057fe5b60200260200101519150505b601554600090600160a01b900460ff1615614cab5760408051600380825260808201909252606091602082018380368337505060155482519293506001600160a01b031691839150600090614a5d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110614a9f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec781600281518110614ae157fe5b6001600160a01b039283166020918202929092010152600b54604051632061aa2360e11b8152600092610100909204909116906340c3544690614b289084906004016159f5565b60206040518083038186803b158015614b4057600080fd5b505afa158015614b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7891906154ea565b90506000816001600160a01b0316628cc262306040518263ffffffff1660e01b8152600401614ba791906158d8565b60206040518083038186803b158015614bbf57600080fd5b505afa158015614bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bf7919061584f565b90508015614ca75760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f90614c359085908890600401615ce3565b60006040518083038186803b158015614c4d57600080fd5b505afa158015614c61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614c89919081019061567f565b905080600182510381518110614c9b57fe5b60200260200101519450505b5050505b614cb981612a908585614f54565b9c5050505050505050505050505090565b600080614cd683611fd6565b9050614ce061544e565b6002546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390614d109030906004016158d8565b6101206040518083038186803b158015614d2957600080fd5b505afa158015614d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d6191906157b9565b9050806020015160001415614d7b57600092505050611e3a565b60075460a0820151614d8e9042906131a3565b1015614d9f57600092505050611e3a565b60085460a0820151614db29042906131a3565b10614dc257600192505050611e3a565b6002546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015614e0757600080fd5b505afa158015614e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e3f919061584f565b9050600a54811115614e575760019350505050611e3a565b6000614e61612a7b565b90508260c00151614e7d600a5483614f5490919063ffffffff16565b1015614e90576001945050505050611e3a565b60008360c00151821115614eb15760c0840151614eae9083906131a3565b90505b6002546040805163112c1f9b60e01b815290516000926001600160a01b03169163112c1f9b916004808301926020929190829003018186803b158015614ef657600080fd5b505afa158015614f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2e919061584f565b9050614f3a8183614f54565b600954614f47908861510e565b1098975050505050505050565b6000828201838110156131e55760405162461bcd60e51b815260040161082090615a84565b6060614fce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e7c9092919063ffffffff16565b805190915015612e775780806020019051810190614fec9190615730565b612e775760405162461bcd60e51b815260040161082090615c1f565b606061501385615291565b61502f5760405162461bcd60e51b815260040161082090615bc3565b60006060866001600160a01b0316858760405161504c91906158bc565b60006040518083038185875af1925050503d8060008114615089576040519150601f19603f3d011682016040523d82523d6000602084013e61508e565b606091505b509150915081156150a2579150612e8b9050565b8051156150b25780518082602001fd5b8360405162461bcd60e51b81526004016108209190615a2d565b60008183106150db57816131e5565b5090919050565b600081848411156151065760405162461bcd60e51b81526004016108209190615a2d565b505050900390565b60008261511d575060006121f6565b8282028284828161512a57fe5b04146131e55760405162461bcd60e51b815260040161082090615b41565b60006131e583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506152ca565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c5908490600090600e9030904290600401615d49565b600060405180830381600087803b1580156151df57600080fd5b505af11580156151f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610983919081019061567f565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c5908490600090600f9030904290600401615d49565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c590849060009060169030904290600401615d49565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612e8b575050151592915050565b600081836152eb5760405162461bcd60e51b81526004016108209190615a2d565b5060008385816152f757fe5b0495945050505050565b828054828255906000526020600020908101928215615356579160200282015b8281111561535657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615321565b5061536292915061549a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a75782800160ff198235161785556153d4565b828001600101855582156153d4579182015b828111156153d45782358255916020019190600101906153b9565b506153629291506154b9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061542157805160ff19168380011785556153d4565b828001600101855582156153d4579182015b828111156153d4578251825591602001919060010190615433565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156153625780546001600160a01b031916815560010161549b565b5b8082111561536257600081556001016154ba565b6000602082840312156154df578081fd5b81356131e581615e9b565b6000602082840312156154fb578081fd5b81516131e581615e9b565b60008060008060008060c0878903121561551e578182fd5b865161552981615e9b565b602088015190965061553a81615e9b565b604088015190955061554b81615e9b565b606088015190945061555c81615e9b565b608088015190935061556d81615e9b565b60a088015190925061557e81615eb0565b809150509295509295509295565b600080600080600080600060e0888a0312156155a6578081fd5b87356155b181615e9b565b96506020888101356155c281615e9b565b965060408901356155d281615e9b565b955060608901356155e281615e9b565b94506080890135935060a08901356155f981615e9b565b925060c089013567ffffffffffffffff80821115615615578384fd5b818b0191508b601f830112615628578384fd5b813581811115615636578485fd5b615648601f8201601f19168501615e28565b91508082528c8482850101111561565d578485fd5b8084840185840137848482840101525080935050505092959891949750929550565b60006020808385031215615691578182fd5b825167ffffffffffffffff8111156156a7578283fd5b8301601f810185136156b7578283fd5b80516156ca6156c582615e4f565b615e28565b81815283810190838501858402850186018910156156e6578687fd5b8694505b838510156157085780518352600194909401939185019185016156ea565b50979650505050505050565b600060208284031215615725578081fd5b81356131e581615eb0565b600060208284031215615741578081fd5b81516131e581615eb0565b6000806020838503121561575e578182fd5b823567ffffffffffffffff80821115615775578384fd5b818501915085601f830112615788578384fd5b813581811115615796578485fd5b8660208285010111156157a7578485fd5b60209290920196919550909350505050565b60006101208083850312156157cc578182fd5b6157d581615e28565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060208284031215615848578081fd5b5035919050565b600060208284031215615860578081fd5b5051919050565b8060005b600481101561588a57815184526020938401939091019060010161586b565b50505050565b600081518084526158a8816020860160208601615e6f565b601f01601f19169290920160200192915050565b600082516158ce818460208701615e6f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03888116825287811660208301528681166040830152858116606083015260808201859052831660a082015260e060c0820181905260009061595190830184615890565b9998505050505050505050565b6001600160a01b038416815260c0810161597b6020830185615867565b82151560a0830152949350505050565b6001600160a01b038416815260c081016159a86020830185615867565b8260a0830152949350505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082526131e56020830184615890565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252600f908201526e34b731b7b93932b1ba103a37b5b2b760891b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60006040820184835260206040818501528185518084526060860191508287019350845b81811015615d2c5784516001600160a01b031683529383019391830191600101615d07565b5090979650505050505050565b9182521515602082015260400190565b600060a082018783526020878185015260a0604085015281875480845260c0860191508885528285209350845b81811015615d9b5784546001600160a01b031683526001948501949284019201615d76565b50506001600160a01b03969096166060850152505050608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff81118282101715615e4757600080fd5b604052919050565b600067ffffffffffffffff821115615e65578081fd5b5060209081020190565b60005b83811015615e8a578181015183820152602001615e72565b8381111561588a5750506000910152565b6001600160a01b0381168114610f0f57600080fd5b8015158114610f0f57600080fdfe000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9fa2646970667358221220fca4a4d0f2c17705e5fad47fc9b7d6ee7655bcd68c077594bf007c62a3a95c8164736f6c634300060c00330000000000000000000000002dfb14e32e2f8156ec15a2c21c3a6c053af52be800000000000000000000000000000000000000000000000000000000000000280000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000115374726174656779436f6e7665784d494d000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104335760003560e01c8063748747e611610236578063c7b9d5301161013b578063ecf04e15116100c3578063f4b9fa7511610087578063f4b9fa75146107b5578063f6fe3aa7146107bd578063fbfa77cf146107c5578063fcf2d0ad146107cd578063fd82d58b146107d557610433565b8063ecf04e1514610777578063ed882c2b1461077f578063efbb5cb014610792578063f017c92f1461079a578063f1068454146107ad57610433565b8063d1af0c7d1161010a578063d1af0c7d14610744578063d73792a91461074c578063e89133b214610754578063e94ad65b1461075c578063ec38a8621461076457610433565b8063c7b9d530146106f8578063cc4849691461070b578063ce5494bb1461071e578063cffed5a51461073157610433565b80639be28785116101be578063aced16611161018d578063aced1661146106c5578063ad409500146106cd578063b252720b146106e0578063c1a3d44c146106e8578063c4f45423146106f057610433565b80639be287851461068f5780639ec5a89414610697578063a98f92961461069f578063ac00ff26146106b257610433565b80638cdfe166116102055780638cdfe166146106515780638e6350e21461065957806391397ab414610661578063955383bd1461067457806395e80c501461068757610433565b8063748747e614610610578063750521f514610623578063780022a0146106365780637fef901a1461064957610433565b806339a172a81161033c57806352f9c763116102c4578063650d188011610293578063650d1880146105d25780636718835f146105e55780636a4874a1146105ed5780636c3d9186146105f55780637165485d1461060857610433565b806352f9c763146105a75780635641ec03146105af5780635b9f0016146105b75780635fd61965146105bf57610433565b80634641257d1161030b5780634641257d1461056957806346c96aac146105715780634d24044c146105795780635075e01014610581578063520009df1461059457610433565b806339a172a81461053e5780633e413bee146105515780633fc8cef314610559578063440368a31461056157610433565b8063220cce97116103bf57806328b7ccf71161038e57806328b7ccf71461050b5780632e1a7d4d146105135780632f48ab7d1461052657806334659dc51461052e578063372500ab1461053657610433565b8063220cce97146104de57806322f3e2d4146104e65780632549dad9146104fb578063258294101461050357610433565b80630f969b87116104065780630f969b871461048657806311bc8245146104995780631d12f28b146104ac5780631f1fcd51146104c15780631fe4a686146104d657610433565b806301681a621461043857806303ee438c1461044d57806306fdde031461046b5780630ada4dab14610473575b600080fd5b61044b6104463660046154ce565b6107e8565b005b610455610987565b6040516104629190615a2d565b60405180910390f35b610455610a15565b61044b610481366004615714565b610aab565b61044b610494366004615837565b610b0b565b61044b6104a73660046154ce565b610b98565b6104b4610c99565b60405161046291906159f5565b6104c9610c9f565b60405161046291906158d8565b6104c9610cae565b6104c9610cbd565b6104ee610cd1565b60405161046291906159ea565b6104c9610d73565b610455610d8b565b6104b4610daa565b6104b4610521366004615837565b610db0565b6104c9610e0b565b61044b610e23565b6104ee610f12565b61044b61054c366004615837565b610f1b565b6104c9610f9d565b6104c9610fb5565b61044b610fcd565b61044b6111f6565b6104c96116cf565b6104b46116e7565b6104c961058f366004615837565b6116ed565b61044b6105a2366004615837565b611714565b61044b611ab1565b6104ee611bad565b6104b4611bb6565b61044b6105cd3660046154ce565b611c3c565b6104ee6105e0366004615837565b611e37565b6104ee611e3f565b6104c9611e48565b61044b61060336600461558c565b611e60565b6104c9611e80565b61044b61061e3660046154ce565b611e94565b61044b61063136600461574c565b611f3f565b6104b4610644366004615837565b611fd6565b6104b46121fc565b6104b4612202565b6104b4612208565b61044b61066f366004615837565b61220d565b61044b610682366004615837565b61228f565b6104b46122f0565b6104c96122f6565b6104c9612308565b61044b6106ad366004615714565b612317565b61044b6106c0366004615714565b612377565b6104c9612463565b6104c96106db366004615837565b612472565b6104c961247f565b6104b4612493565b6104b46124c4565b61044b6107063660046154ce565b6124f8565b6104c961071936600461558c565b6125a3565b61044b61072c3660046154ce565b6126aa565b61044b61073f366004615837565b6127f5565b6104c9612847565b6104b4612856565b6104c961285c565b6104c9612874565b61044b6107723660046154ce565b61288c565b6104ee612a1f565b6104ee61078d366004615837565b612a2f565b6104b4612a7b565b61044b6107a8366004615837565b612a96565b6104b4612b18565b6104c9612b1e565b6104b4612b36565b6104c9612b3c565b61044b612b4b565b6104c96107e3366004615837565b612d70565b6107f0612e93565b6001600160a01b0316336001600160a01b0316146108295760405162461bcd60e51b815260040161082090615bfa565b60405180910390fd5b6006546001600160a01b03828116911614156108575760405162461bcd60e51b815260040161082090615a65565b6002546001600160a01b03828116911614156108855760405162461bcd60e51b815260040161082090615ba2565b606061088f612f10565b905060005b81518110156108ea578181815181106108a957fe5b60200260200101516001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260040161082090615c69565b600101610894565b506109836108f6612e93565b6040516370a0823160e01b81526001600160a01b038516906370a08231906109229030906004016158d8565b60206040518083038186803b15801561093a57600080fd5b505afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610972919061584f565b6001600160a01b0385169190612f15565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b505050505081565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b6003546001600160a01b0316331480610adc5750610ac7612e93565b6001600160a01b0316336001600160a01b0316145b610af85760405162461bcd60e51b815260040161082090615bfa565b6011805460ff1916911515919091179055565b6003546001600160a01b0316331480610b3c5750610b27612e93565b6001600160a01b0316336001600160a01b0316145b610b585760405162461bcd60e51b815260040161082090615bfa565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610b8d9083906159f5565b60405180910390a150565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610be657600080fd5b505afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e91906154ea565b6001600160a01b0316336001600160a01b03161480610c555750610c40612e93565b6001600160a01b0316336001600160a01b0316145b610c715760405162461bcd60e51b815260040161082090615bfa565b600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b600b5461010090046001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610d069030906004016158d8565b6101206040518083038186803b158015610d1f57600080fd5b505afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906157b9565b604001511180610d6e57506000610d6c612a7b565b115b905090565b73a79828df1850e8a3a3064576f380d90aecdd335981565b604080518082019091526005815264302e342e3360d81b602082015290565b60085481565b6002546000906001600160a01b03163314610ddd5760405162461bcd60e51b815260040161082090615b82565b6000610de883612f34565b600654909350909150610e05906001600160a01b03163383612f15565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6003546001600160a01b0316331480610e545750610e3f612e93565b6001600160a01b0316336001600160a01b0316145b610e705760405162461bcd60e51b815260040161082090615bfa565b6000610e7a611bb6565b90508015610f0f57600b54601354604051631c683a1b60e11b81526101009092046001600160a01b0316916338d0743691610ebd91859160ff1690600401615d39565b602060405180830381600087803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190615730565b50565b60135460ff1681565b6003546001600160a01b0316331480610f4c5750610f37612e93565b6001600160a01b0316336001600160a01b0316145b610f685760405162461bcd60e51b815260040161082090615bfa565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610b8d9083906159f5565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6005546001600160a01b0316331480610ff057506003546001600160a01b031633145b806110135750610ffe612e93565b6001600160a01b0316336001600160a01b0316145b806110b45750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561106757600080fd5b505afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f91906154ea565b6001600160a01b0316336001600160a01b0316145b806111555750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561110857600080fd5b505afa15801561111c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114091906154ea565b6001600160a01b0316336001600160a01b0316145b6111715760405162461bcd60e51b815260040161082090615bfa565b6002546040805163bf3759b560e01b815290516111f4926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef919061584f565b613041565b565b6005546001600160a01b031633148061121957506003546001600160a01b031633145b8061123c5750611227612e93565b6001600160a01b0316336001600160a01b0316145b806112dd5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c891906154ea565b6001600160a01b0316336001600160a01b0316145b8061137e5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561133157600080fd5b505afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136991906154ea565b6001600160a01b0316336001600160a01b0316145b61139a5760405162461bcd60e51b815260040161082090615bfa565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ed57600080fd5b505afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611425919061584f565b600b5490915060009060ff16156114825760006114406130f3565b90508281101561145b5761145483826131a3565b9350611470565b828111156114705761146d81846131a3565b94505b61147a83856131a3565b915050611493565b61148b826131ec565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf823906114c49030906004016158d8565b6101206040518083038186803b1580156114dd57600080fd5b505afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151591906157b9565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc9061154e90889088908790600401615dd4565b602060405180830381600087803b15801561156857600080fd5b505af115801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a0919061584f565b92506115ab83613041565b60015460ff1680156115cc575060015461010090046001600160a01b031615155b1561167e5760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b9061160d9088908890879089908890600401615e05565b60206040518083038186803b15801561162557600080fd5b505afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190615730565b6116795760405162461bcd60e51b815260040161082090615abb565b61168b565b6001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509858584866040516116c09493929190615dea565b60405180910390a15050505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b60145481565b601681815481106116fa57fe5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b03163314806117455750611730612e93565b6001600160a01b0316336001600160a01b0316145b6117615760405162461bcd60e51b815260040161082090615bfa565b8061187157736b175474e89094c44da98b954eedeac495271d0f600e60028154811061178957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550736b175474e89094c44da98b954eedeac495271d0f600f6002815481106117da57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff161561186757736b175474e89094c44da98b954eedeac495271d0f601660028154811061183857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6000601455610f0f565b80600114156119855773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600e60028154811061189d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600f6002815481106118ee57fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff161561197b5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601660028154811061194c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001601455610f0f565b8060021415611a995773dac17f958d2ee523a2206206994597c13d831ec7600e6002815481106119b157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073dac17f958d2ee523a2206206994597c13d831ec7600f600281548110611a0257fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055601554600160a01b900460ff1615611a8f5773dac17f958d2ee523a2206206994597c13d831ec76016600281548110611a6057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6002601455610f0f565b60405162461bcd60e51b815260040161082090615ae1565b611ab9612e93565b6001600160a01b0316336001600160a01b031614611ae95760405162461bcd60e51b815260040161082090615bfa565b6015805460ff60a01b1981169091556001600160a01b031615611b9b5760155460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611b4790600080516020615ebf833981519152906000906004016159d1565b602060405180830381600087803b158015611b6157600080fd5b505af1158015611b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b999190615730565b505b601580546001600160a01b0319169055565b600b5460ff1681565b600b546040516370a0823160e01b815260009161010090046001600160a01b0316906370a0823190611bec9030906004016158d8565b60206040518083038186803b158015611c0457600080fd5b505afa158015611c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e919061584f565b611c44612e93565b6001600160a01b0316336001600160a01b031614611c745760405162461bcd60e51b815260040161082090615bfa565b6015546001600160a01b031615611d1a5760155460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390611cc690600080516020615ebf833981519152906000906004016159d1565b602060405180830381600087803b158015611ce057600080fd5b505af1158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d189190615730565b505b601580546001600160a01b0319166001600160a01b03838116919091179182905560405163095ea7b360e01b815291169063095ea7b390611d7190600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015611d8b57600080fd5b505af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc39190615730565b50604080516060810182526015546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f91810191909152611e20906016906003615301565b50506015805460ff60a01b1916600160a01b179055565b60005b919050565b60015460ff1681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b611e6c87878787613a05565b611e77838383613bc5565b50505050505050565b60135461010090046001600160a01b031681565b6003546001600160a01b0316331480611ec55750611eb0612e93565b6001600160a01b0316336001600160a01b0316145b611ee15760405162461bcd60e51b815260040161082090615bfa565b6001600160a01b038116611ef457600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610b8d9083906158d8565b6003546001600160a01b0316331480611f705750611f5b612e93565b6001600160a01b0316336001600160a01b0316145b611f8c5760405162461bcd60e51b815260040161082090615bfa565b611f9860008383615366565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611fca9291906159fe565b60405180910390a15050565b60008082156121f657604080516002808252606080830184529260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061202157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050736b175474e89094c44da98b954eedeac495271d0f8160018151811061206357fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f906120b19088908690600401615ce3565b60006040518083038186803b1580156120c957600080fd5b505afa1580156120dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612105919081019061567f565b905060008160018351038151811061211957fe5b6020026020010151905073a79828df1850e8a3a3064576f380d90aecdd33596001600160a01b031663861cdef0601360019054906101000a90046001600160a01b031660405180608001604052806000815260200185815260200160008152602001600081525060016040518463ffffffff1660e01b81526004016121a09392919061595e565b60206040518083038186803b1580156121b857600080fd5b505afa1580156121cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f0919061584f565b93505050505b92915050565b600d5481565b60095481565b600090565b6003546001600160a01b031633148061223e5750612229612e93565b6001600160a01b0316336001600160a01b0316145b61225a5760405162461bcd60e51b815260040161082090615bfa565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610b8d9083906159f5565b6003546001600160a01b03163314806122c057506122ab612e93565b6001600160a01b0316336001600160a01b0316145b6122dc5760405162461bcd60e51b815260040161082090615bfa565b6127108111156122eb57600080fd5b600d55565b60075481565b600080516020615ebf83398151915281565b6004546001600160a01b031681565b6003546001600160a01b03163314806123485750612333612e93565b6001600160a01b0316336001600160a01b0316145b6123645760405162461bcd60e51b815260040161082090615bfa565b6013805460ff1916911515919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c557600080fd5b505afa1580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd91906154ea565b6001600160a01b0316336001600160a01b03161480612434575061241f612e93565b6001600160a01b0316336001600160a01b0316145b6124505760405162461bcd60e51b815260040161082090615bfa565b6001805460ff1916911515919091179055565b6005546001600160a01b031681565b600e81815481106116fa57fe5b60015461010090046001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611bec9030906004016158d8565b600b546040516246613160e11b815260009161010090046001600160a01b031690628cc26290611bec9030906004016158d8565b6003546001600160a01b03163314806125295750612514612e93565b6001600160a01b0316336001600160a01b0316145b6125455760405162461bcd60e51b815260040161082090615bfa565b6001600160a01b03811661255857600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610b8d9083906158d8565b60175460009060ff166125b557600080fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b6028830152906037816000f060405163361ec8c360e11b81529093506001600160a01b0384169150636c3d918690612638908c908c908c908c908c908c908c90600401615906565b600060405180830381600087803b15801561265257600080fd5b505af1158015612666573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a250979650505050505050565b6002546001600160a01b031633146126c157600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561270857600080fd5b505afa15801561271c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274091906154ea565b6001600160a01b03161461275357600080fd5b61275c816143ea565b6006546040516370a0823160e01b8152610f0f9183916001600160a01b03909116906370a08231906127929030906004016158d8565b60206040518083038186803b1580156127aa57600080fd5b505afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e2919061584f565b6006546001600160a01b03169190612f15565b6003546001600160a01b03163314806128265750612811612e93565b6001600160a01b0316336001600160a01b0316145b6128425760405162461bcd60e51b815260040161082090615bfa565b601055565b6015546001600160a01b031681565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6003546001600160a01b031633146128b65760405162461bcd60e51b815260040161082090615a40565b6001600160a01b0381166128c957600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b3936129009390911691600091016159d1565b602060405180830381600087803b15801561291a57600080fd5b505af115801561292e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129529190615730565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b39361299d93169160001991016159d1565b602060405180830381600087803b1580156129b757600080fd5b505af11580156129cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ef9190615730565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610b8d91906158d8565b601554600160a01b900460ff1681565b60115460009060ff1615612a4557506001611e3a565b601054612a506145dd565b1115612a5e57506001611e3a565b612a66610cd1565b612a7257506000611e3a565b6121f682614cca565b6000610d6e612a88611bb6565b612a90612493565b90614f54565b6003546001600160a01b0316331480612ac75750612ab2612e93565b6001600160a01b0316336001600160a01b0316145b612ae35760405162461bcd60e51b815260040161082090615bfa565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610b8d9083906159f5565b600c5481565b736b175474e89094c44da98b954eedeac495271d0f81565b60105481565b6002546001600160a01b031681565b6003546001600160a01b0316331480612b7c5750612b67612e93565b6001600160a01b0316336001600160a01b0316145b80612c1d5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015612bd057600080fd5b505afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906154ea565b6001600160a01b0316336001600160a01b0316145b80612cbe5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7157600080fd5b505afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca991906154ea565b6001600160a01b0316336001600160a01b0316145b612cda5760405162461bcd60e51b815260040161082090615bfa565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b158015612d2d57600080fd5b505af1158015612d41573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b600f81815481106116fa57fe5b801580612e055750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612db390309086906004016158ec565b60206040518083038186803b158015612dcb57600080fd5b505afa158015612ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e03919061584f565b155b612e215760405162461bcd60e51b815260040161082090615c8d565b612e778363095ea7b360e01b8484604051602401612e409291906159d1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614f79565b505050565b6060612e8b8484600085615008565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b158015612ed857600080fd5b505afa158015612eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e91906154ea565b606090565b612e778363a9059cbb60e01b8484604051602401612e409291906159d1565b6000806000612f41612493565b90508084111561302d576000612f55611bb6565b9050801561300257600b5461010090046001600160a01b031663c32e7202612f8683612f8189876131a3565b6150cc565b6013546040516001600160e01b031960e085901b168152612fae929160ff1690600401615d39565b602060405180830381600087803b158015612fc857600080fd5b505af1158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130009190615730565b505b600061300c612493565b905061301886826150cc565b945061302486866131a3565b9350505061303a565b836000925092505061303c565b505b915091565b600b5460ff161561305157610f0f565b600061305b612493565b9050801561098357600c546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916130a191908590600190600401615dbc565b602060405180830381600087803b1580156130bb57600080fd5b505af11580156130cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e779190615730565b6000806130fe611bb6565b9050801561319557600b54601354604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161314191859160ff1690600401615d39565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131939190615730565b505b61319d612493565b91505090565b60006131e583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506150e2565b9392505050565b6000806000806131fa6124c4565b111561383e57600b54604051637050ccd960e01b81526101009091046001600160a01b031690637050ccd9906132379030906001906004016159b6565b602060405180830381600087803b15801561325157600080fd5b505af1158015613265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132899190615730565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906132c49030906004016158d8565b60206040518083038186803b1580156132dc57600080fd5b505afa1580156132f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613314919061584f565b6040516370a0823160e01b8152909150600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906133519030906004016158d8565b60206040518083038186803b15801561336957600080fd5b505afa15801561337d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a1919061584f565b905060006133c66127106133c0600d548661510e90919063ffffffff16565b90615148565b905080156134015761340173d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612f15565b600061340d84836131a3565b9050801561341e5761341e8161518a565b821561342d5761342d8361521b565b601554600160a01b900460ff16156134d3576015546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134709030906004016158d8565b60206040518083038186803b15801561348857600080fd5b505afa15801561349c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c0919061584f565b905080156134d1576134d181615256565b505b60145461360a576040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a08231906135149030906004016158d8565b60206040518083038186803b15801561352c57600080fd5b505afa158015613540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613564919061584f565b6013546040805160808101825260008082526020820185905281830181905260608201819052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db936135d2936101009091046001600160a01b0316929160040161598b565b600060405180830381600087803b1580156135ec57600080fd5b505af1158015613600573d6000803e3d6000fd5b5050505050613839565b6014546001141561370d576040516370a0823160e01b815260009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a082319061364f9030906004016158d8565b60206040518083038186803b15801561366757600080fd5b505afa15801561367b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369f919061584f565b6013546040805160808101825260008082526020820181905281830185905260608201819052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db936135d2936101009091046001600160a01b0316929160040161598b565b6040516370a0823160e01b815260009073dac17f958d2ee523a2206206994597c13d831ec7906370a08231906137479030906004016158d8565b60206040518083038186803b15801561375f57600080fd5b505afa158015613773573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613797919061584f565b6013546040805160808101825260008082526020820181905281830181905260608201859052915163384e03db60e01b815293945073a79828df1850e8a3a3064576f380d90aecdd33599363384e03db93613805936101009091046001600160a01b0316929160040161598b565b600060405180830381600087803b15801561381f57600080fd5b505af1158015613833573d6000803e3d6000fd5b50505050505b505050505b831561390d57600061384e611bb6565b905080156138f257600b5461010090046001600160a01b031663c32e720261387683886150cc565b6013546040516001600160e01b031960e085901b16815261389e929160ff1690600401615d39565b602060405180830381600087803b1580156138b857600080fd5b505af11580156138cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f09190615730565b505b60006138fc612493565b905061390886826150cc565b925050505b6000613917612a7b565b6002546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061394d9030906004016158d8565b6101206040518083038186803b15801561396657600080fd5b505afa15801561397a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399e91906157b9565b60c001519050808211156139e5576139b682826131a3565b945060006139c2612493565b9050806139cf8786614f54565b11156139df576139dd6130f3565b505b506139f2565b6139ef81836131a3565b93505b50506011805460ff191690559193909250565b6006546001600160a01b031615613a2e5760405162461bcd60e51b815260040161082090615b0a565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015613a8a57600080fd5b505afa158015613a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac291906154ea565b600680546001600160a01b0319166001600160a01b039283161790819055613aee911685600019612d7d565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393613b6c9391169160001991016159d1565b602060405180830381600087803b158015613b8657600080fd5b505af1158015613b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbe9190615730565b5050505050565b60135461010090046001600160a01b031615613be057600080fd5b62093a80600855674563918244f40000600a556127106009556404a817c80060105560018054610100600160a81b03191674ddcea799ff1699e98edf118e0629a974df7df0120017905560065460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390613c729073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016159d1565b602060405180830381600087803b158015613c8c57600080fd5b505af1158015613ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc49190615730565b5060405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529063095ea7b390613d0e90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015613d2857600080fd5b505af1158015613d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d609190615730565b5060405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063095ea7b390613daa90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b158015613dc457600080fd5b505af1158015613dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dfc9190615730565b506103e8600d5560138054610100600160a81b0319166101006001600160a01b03851602179055600c839055604051631526fe2760e01b815260009073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe2790613e629087906004016159f5565b60c06040518083038186803b158015613e7a57600080fd5b505afa158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190615506565b5050600b8054610100600160a81b0319166101006001600160a01b0393841602179055600654939450928316928416929092149150613ef2905057600080fd5b600b60019054906101000a90046001600160a01b03166001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4057600080fd5b505afa158015613f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f78919061584f565b6001141561419257600b54604051632061aa2360e11b815260009161010090046001600160a01b0316906340c3544690613fb69084906004016159f5565b60206040518083038186803b158015613fce57600080fd5b505afa158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061400691906154ea565b9050806001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b15801561404157600080fd5b505afa158015614055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407991906154ea565b601580546001600160a01b0319166001600160a01b03928316179081905560405163095ea7b360e01b815291169063095ea7b3906140cd90600080516020615ebf83398151915290600019906004016159d1565b602060405180830381600087803b1580156140e757600080fd5b505af11580156140fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411f9190615730565b50604080516060810182526015546001600160a01b0316815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f9181019190915261417c906016906003615301565b50506015805460ff60a01b1916600160a01b1790555b81516141a59060129060208501906153e0565b5060405163095ea7b360e01b8152736b175474e89094c44da98b954eedeac495271d0f9063095ea7b3906141f59073a79828df1850e8a3a3064576f380d90aecdd335990600019906004016159d1565b602060405180830381600087803b15801561420f57600080fd5b505af1158015614223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142479190615730565b5061427d73dac17f958d2ee523a2206206994597c13d831ec773a79828df1850e8a3a3064576f380d90aecdd3359600019612d7d565b60405163095ea7b360e01b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b3906142cc9073a79828df1850e8a3a3064576f380d90aecdd335990600019906004016159d1565b602060405180830381600087803b1580156142e657600080fd5b505af11580156142fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431e9190615730565b506040805160608101825273d533a949740bb3306d119cc777fa900ba034cd52815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f9181019190915261438490600e906003615301565b5060408051606081018252734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26020820152736b175474e89094c44da98b954eedeac495271d0f91810191909152613bbe90600f906003615301565b60006143f4611bb6565b9050801561448b57600b54601354604051636197390160e11b81526101009092046001600160a01b03169163c32e72029161443791859160ff1690600401615d39565b602060405180830381600087803b15801561445157600080fd5b505af1158015614465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144899190615730565b505b6040516370a0823160e01b815261453490839073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906144c89030906004016158d8565b60206040518083038186803b1580156144e057600080fd5b505afa1580156144f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614518919061584f565b73d533a949740bb3306d119cc777fa900ba034cd529190612f15565b6040516370a0823160e01b8152610983908390734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906145719030906004016158d8565b60206040518083038186803b15801561458957600080fd5b505afa15801561459d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145c1919061584f565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612f15565b6000806103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561465357600080fd5b505afa158015614667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061468b919061584f565b905060008061469a8385615148565b905060006146a66124c4565b9050868210156146eb5760006146bc88846131a3565b90506146cc886133c0848461510e565b935060006146da88876131a3565b9050808511156146e8578094505b50505b6040805160038082526080820190925260609160208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061472f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061477157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec7816002815181106147b357fe5b6001600160a01b03929092166020928302919091018201526040805160038082526080820190925260609290919082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160008151811061481057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061485257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec78160028151811061489457fe5b6001600160a01b03909216602092830291909101909101526000831561495c5760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f906148ea9088908890600401615ce3565b60006040518083038186803b15801561490257600080fd5b505afa158015614916573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261493e919081019061567f565b90508060018251038151811061495057fe5b60200260200101519150505b60008615614a0c5760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f9061499a908b908890600401615ce3565b60006040518083038186803b1580156149b257600080fd5b505afa1580156149c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526149ee919081019061567f565b905080600182510381518110614a0057fe5b60200260200101519150505b601554600090600160a01b900460ff1615614cab5760408051600380825260808201909252606091602082018380368337505060155482519293506001600160a01b031691839150600090614a5d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110614a9f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec781600281518110614ae157fe5b6001600160a01b039283166020918202929092010152600b54604051632061aa2360e11b8152600092610100909204909116906340c3544690614b289084906004016159f5565b60206040518083038186803b158015614b4057600080fd5b505afa158015614b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7891906154ea565b90506000816001600160a01b0316628cc262306040518263ffffffff1660e01b8152600401614ba791906158d8565b60206040518083038186803b158015614bbf57600080fd5b505afa158015614bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bf7919061584f565b90508015614ca75760405163d06ca61f60e01b8152606090600080516020615ebf8339815191529063d06ca61f90614c359085908890600401615ce3565b60006040518083038186803b158015614c4d57600080fd5b505afa158015614c61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614c89919081019061567f565b905080600182510381518110614c9b57fe5b60200260200101519450505b5050505b614cb981612a908585614f54565b9c5050505050505050505050505090565b600080614cd683611fd6565b9050614ce061544e565b6002546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390614d109030906004016158d8565b6101206040518083038186803b158015614d2957600080fd5b505afa158015614d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d6191906157b9565b9050806020015160001415614d7b57600092505050611e3a565b60075460a0820151614d8e9042906131a3565b1015614d9f57600092505050611e3a565b60085460a0820151614db29042906131a3565b10614dc257600192505050611e3a565b6002546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015614e0757600080fd5b505afa158015614e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e3f919061584f565b9050600a54811115614e575760019350505050611e3a565b6000614e61612a7b565b90508260c00151614e7d600a5483614f5490919063ffffffff16565b1015614e90576001945050505050611e3a565b60008360c00151821115614eb15760c0840151614eae9083906131a3565b90505b6002546040805163112c1f9b60e01b815290516000926001600160a01b03169163112c1f9b916004808301926020929190829003018186803b158015614ef657600080fd5b505afa158015614f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2e919061584f565b9050614f3a8183614f54565b600954614f47908861510e565b1098975050505050505050565b6000828201838110156131e55760405162461bcd60e51b815260040161082090615a84565b6060614fce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e7c9092919063ffffffff16565b805190915015612e775780806020019051810190614fec9190615730565b612e775760405162461bcd60e51b815260040161082090615c1f565b606061501385615291565b61502f5760405162461bcd60e51b815260040161082090615bc3565b60006060866001600160a01b0316858760405161504c91906158bc565b60006040518083038185875af1925050503d8060008114615089576040519150601f19603f3d011682016040523d82523d6000602084013e61508e565b606091505b509150915081156150a2579150612e8b9050565b8051156150b25780518082602001fd5b8360405162461bcd60e51b81526004016108209190615a2d565b60008183106150db57816131e5565b5090919050565b600081848411156151065760405162461bcd60e51b81526004016108209190615a2d565b505050900390565b60008261511d575060006121f6565b8282028284828161512a57fe5b04146131e55760405162461bcd60e51b815260040161082090615b41565b60006131e583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506152ca565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c5908490600090600e9030904290600401615d49565b600060405180830381600087803b1580156151df57600080fd5b505af11580156151f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610983919081019061567f565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c5908490600090600f9030904290600401615d49565b6040516338ed173960e01b8152600080516020615ebf833981519152906338ed1739906151c590849060009060169030904290600401615d49565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612e8b575050151592915050565b600081836152eb5760405162461bcd60e51b81526004016108209190615a2d565b5060008385816152f757fe5b0495945050505050565b828054828255906000526020600020908101928215615356579160200282015b8281111561535657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190615321565b5061536292915061549a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a75782800160ff198235161785556153d4565b828001600101855582156153d4579182015b828111156153d45782358255916020019190600101906153b9565b506153629291506154b9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061542157805160ff19168380011785556153d4565b828001600101855582156153d4579182015b828111156153d4578251825591602001919060010190615433565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156153625780546001600160a01b031916815560010161549b565b5b8082111561536257600081556001016154ba565b6000602082840312156154df578081fd5b81356131e581615e9b565b6000602082840312156154fb578081fd5b81516131e581615e9b565b60008060008060008060c0878903121561551e578182fd5b865161552981615e9b565b602088015190965061553a81615e9b565b604088015190955061554b81615e9b565b606088015190945061555c81615e9b565b608088015190935061556d81615e9b565b60a088015190925061557e81615eb0565b809150509295509295509295565b600080600080600080600060e0888a0312156155a6578081fd5b87356155b181615e9b565b96506020888101356155c281615e9b565b965060408901356155d281615e9b565b955060608901356155e281615e9b565b94506080890135935060a08901356155f981615e9b565b925060c089013567ffffffffffffffff80821115615615578384fd5b818b0191508b601f830112615628578384fd5b813581811115615636578485fd5b615648601f8201601f19168501615e28565b91508082528c8482850101111561565d578485fd5b8084840185840137848482840101525080935050505092959891949750929550565b60006020808385031215615691578182fd5b825167ffffffffffffffff8111156156a7578283fd5b8301601f810185136156b7578283fd5b80516156ca6156c582615e4f565b615e28565b81815283810190838501858402850186018910156156e6578687fd5b8694505b838510156157085780518352600194909401939185019185016156ea565b50979650505050505050565b600060208284031215615725578081fd5b81356131e581615eb0565b600060208284031215615741578081fd5b81516131e581615eb0565b6000806020838503121561575e578182fd5b823567ffffffffffffffff80821115615775578384fd5b818501915085601f830112615788578384fd5b813581811115615796578485fd5b8660208285010111156157a7578485fd5b60209290920196919550909350505050565b60006101208083850312156157cc578182fd5b6157d581615e28565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060208284031215615848578081fd5b5035919050565b600060208284031215615860578081fd5b5051919050565b8060005b600481101561588a57815184526020938401939091019060010161586b565b50505050565b600081518084526158a8816020860160208601615e6f565b601f01601f19169290920160200192915050565b600082516158ce818460208701615e6f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03888116825287811660208301528681166040830152858116606083015260808201859052831660a082015260e060c0820181905260009061595190830184615890565b9998505050505050505050565b6001600160a01b038416815260c0810161597b6020830185615867565b82151560a0830152949350505050565b6001600160a01b038416815260c081016159a86020830185615867565b8260a0830152949350505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082526131e56020830184615890565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252600f908201526e34b731b7b93932b1ba103a37b5b2b760891b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60006040820184835260206040818501528185518084526060860191508287019350845b81811015615d2c5784516001600160a01b031683529383019391830191600101615d07565b5090979650505050505050565b9182521515602082015260400190565b600060a082018783526020878185015260a0604085015281875480845260c0860191508885528285209350845b81811015615d9b5784546001600160a01b031683526001948501949284019201615d76565b50506001600160a01b03969096166060850152505050608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff81118282101715615e4757600080fd5b604052919050565b600067ffffffffffffffff821115615e65578081fd5b5060209081020190565b60005b83811015615e8a578181015183820152602001615e72565b8381111561588a5750506000910152565b6001600160a01b0381168114610f0f57600080fd5b8015158114610f0f57600080fdfe000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9fa2646970667358221220fca4a4d0f2c17705e5fad47fc9b7d6ee7655bcd68c077594bf007c62a3a95c8164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002dfb14e32e2f8156ec15a2c21c3a6c053af52be800000000000000000000000000000000000000000000000000000000000000280000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000115374726174656779436f6e7665784d494d000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _vault (address): 0x2DfB14E32e2F8156ec15a2c21c3A6c053af52Be8
Arg [1] : _pid (uint256): 40
Arg [2] : _curvePool (address): 0x5a6A4D54456819380173272A5E8E9B9904BdF41B
Arg [3] : _name (string): StrategyConvexMIM
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000002dfb14e32e2f8156ec15a2c21c3a6c053af52be8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [2] : 0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [5] : 5374726174656779436f6e7665784d494d000000000000000000000000000000
Deployed Bytecode Sourcemap
72397:17629:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64280:444;;;;;;:::i;:::-;;:::i;:::-;;35509:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66968:98;;;:::i;72157:183::-;;;;;;:::i;:::-;;:::i;45882:175::-;;;;;;:::i;:::-;;:::i;41450:118::-;;;;;;:::i;:::-;;:::i;38788:28::-;;;:::i;:::-;;;;;;;:::i;37536:18::-;;;:::i;:::-;;;;;;;:::i;37445:25::-;;;:::i;65217:30::-;;;:::i;49284:148::-;;;:::i;:::-;;;;;;;:::i;72679:100::-;;;:::i;35908:91::-;;;:::i;38424:29::-;;;:::i;60684:515::-;;;;;;:::i;:::-;;:::i;73006:89::-;;;:::i;70596:243::-;;;:::i;66659:24::-;;;:::i;43931:154::-;;;;;;:::i;:::-;;:::i;73102:89::-;;;:::i;66182:::-;;;:::i;54381:170::-;;;:::i;58860:1580::-;;;:::i;65464:74::-;;;:::i;72891:22::-;;;:::i;73481:28::-;;;;;;:::i;:::-;;:::i;88255:873::-;;;;;;:::i;:::-;;:::i;89771:252::-;;;:::i;38867:25::-;;;:::i;67074:188::-;;;:::i;89173:543::-;;;;;;:::i;:::-;;:::i;53620:432::-;;;;;;:::i;:::-;;:::i;35565:25::-;;;:::i;65984:88::-;;;:::i;75366:346::-;;;;;;:::i;:::-;;:::i;72597:20::-;;;:::i;42688:174::-;;;;;;:::i;:::-;;:::i;46360:171::-;;;;;;:::i;:::-;;:::i;87081:848::-;;;;;;:::i;:::-;;:::i;65371:22::-;;;:::i;38610:27::-;;;:::i;37315:94::-;;;:::i;45156:169::-;;;;;;:::i;:::-;;:::i;71392:137::-;;;;;;:::i;:::-;;:::i;38273:29::-;;;:::i;65720:87::-;;;:::i;37477:22::-;;;:::i;71645:116::-;;;;;;:::i;:::-;;:::i;41576:123::-;;;;;;:::i;:::-;;:::i;37506:21::-;;;:::i;65872:24::-;;;;;;:::i;:::-;;:::i;35597:26::-;;;:::i;67270:162::-;;;:::i;67440:201::-;;;:::i;41932:202::-;;;;;;:::i;:::-;;:::i;74013:1284::-;;;;;;:::i;:::-;;:::i;61971:281::-;;;;;;:::i;:::-;;:::i;71910:170::-;;;;;;:::i;:::-;;:::i;73419:26::-;;;:::i;65597:47::-;;;:::i;66079:96::-;;;:::i;65053:93::-;;;:::i;43151:263::-;;;;;;:::i;:::-;;:::i;73452:22::-;;;:::i;83322:667::-;;;;;;:::i;:::-;;:::i;67649:133::-;;;:::i;44602:154::-;;;;;;:::i;:::-;;:::i;65291:18::-;;;:::i;73198:88::-;;;:::i;66301:34::-;;;:::i;37417:21::-;;;:::i;62681:173::-;;;:::i;65923:32::-;;;;;;:::i;:::-;;:::i;64280:444::-;39493:12;:10;:12::i;:::-;-1:-1:-1;;;;;39479:26:0;:10;-1:-1:-1;;;;;39479:26:0;;39471:50;;;;-1:-1:-1;;;39471:50:0;;;;;;;:::i;:::-;;;;;;;;;64372:4:::1;::::0;-1:-1:-1;;;;;64354:23:0;;::::1;64372:4:::0;::::1;64354:23;;64346:41;;;;-1:-1:-1::0;;;64346:41:0::1;;;;;;;:::i;:::-;64424:5;::::0;-1:-1:-1;;;;;64406:24:0;;::::1;64424:5:::0;::::1;64406:24;;64398:44;;;;-1:-1:-1::0;;;64398:44:0::1;;;;;;;:::i;:::-;64455:33;64491:17;:15;:17::i;:::-;64455:53;;64524:9;64519:102;64539:16;:23;64535:1;:27;64519:102;;;64587:16;64604:1;64587:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;64577:29:0::1;:6;-1:-1:-1::0;;;;;64577:29:0::1;;;64569:52;;;;-1:-1:-1::0;;;64569:52:0::1;;;;;;;:::i;:::-;64564:3;;64519:102;;;;64634:82;64662:12;:10;:12::i;:::-;64676:39;::::0;-1:-1:-1;;;64676:39:0;;-1:-1:-1;;;;;64676:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;64709:4:::1;::::0;64676:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64634:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;39532:1;64280:444:::0;:::o;35509:25::-;;;;;;;;;;;;;;;-1:-1:-1;;35509:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66968:98::-;67049:9;67042:16;;;;;;;;-1:-1:-1;;67042:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67016:13;;67042:16;;67049:9;;67042:16;;67049:9;67042:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66968:98;:::o;72157:183::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;72282:23:::1;:50:::0;;-1:-1:-1;;72282:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72157:183::o;45882:175::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;45967:13:::1;:30:::0;;;46013:36:::1;::::0;::::1;::::0;::::1;::::0;45983:14;;46013:36:::1;:::i;:::-;;;;;;;;45882:175:::0;:::o;41450:118::-;39950:5;;;;;;;;;-1:-1:-1;;;;;39950:5:0;-1:-1:-1;;;;;39950:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39936:32:0;:10;-1:-1:-1;;;;;39936:32:0;;:62;;;;39986:12;:10;:12::i;:::-;-1:-1:-1;;;;;39972:26:0;:10;-1:-1:-1;;;;;39972:26:0;;39936:62;39928:86;;;;-1:-1:-1;;;39928:86:0;;;;;;;:::i;:::-;41534:11:::1;:26:::0;;-1:-1:-1;;;;;41534:26:0;;::::1;;;-1:-1:-1::0;;;;;;41534:26:0;;::::1;::::0;;;::::1;::::0;;41450:118::o;38788:28::-;;;;:::o;37536:18::-;;;-1:-1:-1;;;;;37536:18:0;;:::o;37445:25::-;;;-1:-1:-1;;;;;37445:25:0;;:::o;65217:30::-;;;;;;-1:-1:-1;;;;;65217:30:0;;:::o;49284:148::-;49349:5;;:31;;-1:-1:-1;;;49349:31:0;;49325:4;;;;-1:-1:-1;;;;;49349:5:0;;;;:16;;:31;;49374:4;;49349:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;49423:1;49398:22;:20;:22::i;:::-;:26;49349:75;49342:82;;49284:148;:::o;72679:100::-;72736:42;72679:100;:::o;35908:91::-;35977:14;;;;;;;;;;;;-1:-1:-1;;;35977:14:0;;;;35908:91;:::o;38424:29::-;;;;:::o;60684:515::-;60799:5;;60743:13;;-1:-1:-1;;;;;60799:5:0;60777:10;:28;60769:47;;;;-1:-1:-1;;;60769:47:0;;;;;;;:::i;:::-;60902:19;60955:32;60973:13;60955:17;:32::i;:::-;61079:4;;60932:55;;-1:-1:-1;60932:55:0;;-1:-1:-1;61079:42:0;;-1:-1:-1;;;;;61079:4:0;61097:10;60932:55;61079:17;:42::i;:::-;60684:515;;;;:::o;73006:89::-;73052:42;73006:89;:::o;70596:243::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;70672:18:::1;70693:15;:13;:15::i;:::-;70672:36:::0;-1:-1:-1;70723:14:0;;70719:113:::1;;70769:15;::::0;70807:12:::1;::::0;70754:66:::1;::::0;-1:-1:-1;;;70754:66:0;;70769:15:::1;::::0;;::::1;-1:-1:-1::0;;;;;70769:15:0::1;::::0;70754:40:::1;::::0;:66:::1;::::0;70795:10;;70807:12:::1;;::::0;70754:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70719:113::-;39045:1;70596:243::o:0;66659:24::-;;;;;;:::o;43931:154::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;44009:14:::1;:23:::0;;;44048:29:::1;::::0;::::1;::::0;::::1;::::0;44026:6;;44048:29:::1;:::i;73102:89::-:0;73148:42;73102:89;:::o;66182:::-;66228:42;66182:89;:::o;54381:170::-;39619:6;;-1:-1:-1;;;;;39619:6:0;39605:10;:20;;:65;;-1:-1:-1;39660:10:0;;-1:-1:-1;;;;;39660:10:0;39646;:24;39605:65;:112;;;;39705:12;:10;:12::i;:::-;-1:-1:-1;;;;;39691:26:0;:10;-1:-1:-1;;;;;39691:26:0;;39605:112;:163;;;;39752:5;;;;;;;;;-1:-1:-1;;;;;39752:5:0;-1:-1:-1;;;;;39752:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39738:30:0;:10;-1:-1:-1;;;;;39738:30:0;;39605:163;:216;;;;39803:5;;;;;;;;;-1:-1:-1;;;;;39803:5:0;-1:-1:-1;;;;;39803:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39789:32:0;:10;-1:-1:-1;;;;;39789:32:0;;39605:216;39583:277;;;;-1:-1:-1;;;39583:277:0;;;;;;;:::i;:::-;54519:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;54519:23:0;;;;54504:39:::1;::::0;-1:-1:-1;;;;;54519:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54504:14;:39::i;:::-;54381:170::o:0;58860:1580::-;39619:6;;-1:-1:-1;;;;;39619:6:0;39605:10;:20;;:65;;-1:-1:-1;39660:10:0;;-1:-1:-1;;;;;39660:10:0;39646;:24;39605:65;:112;;;;39705:12;:10;:12::i;:::-;-1:-1:-1;;;;;39691:26:0;:10;-1:-1:-1;;;;;39691:26:0;;39605:112;:163;;;;39752:5;;;;;;;;;-1:-1:-1;;;;;39752:5:0;-1:-1:-1;;;;;39752:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39738:30:0;:10;-1:-1:-1;;;;;39738:30:0;;39605:163;:216;;;;39803:5;;;;;;;;;-1:-1:-1;;;;;39803:5:0;-1:-1:-1;;;;;39803:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39789:32:0;:10;-1:-1:-1;;;;;39789:32:0;;39605:216;39583:277;;;;-1:-1:-1;;;39583:277:0;;;;;;;:::i;:::-;58911:14:::1;58940:12:::0;58967:23:::1;58993:5;;;;;;;;;-1:-1:-1::0;;;;;58993:5:0::1;-1:-1:-1::0;;;;;58993:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59065:13;::::0;58967:49;;-1:-1:-1;59027:19:0::1;::::0;59065:13:::1;;59061:580;;;59147:19;59169:23;:21;:23::i;:::-;59147:45;;59225:15;59211:11;:29;59207:226;;;59268:32;:15:::0;59288:11;59268:19:::1;:32::i;:::-;59261:39;;59207:226;;;59340:15;59326:11;:29;59322:111;;;59385:32;:11:::0;59401:15;59385::::1;:32::i;:::-;59376:41;;59322:111;59461:25;:15:::0;59481:4;59461:19:::1;:25::i;:::-;59447:39;;59061:580;;;;59599:30;59613:15;59599:13;:30::i;:::-;59569:60:::0;;-1:-1:-1;59569:60:0;-1:-1:-1;59569:60:0;-1:-1:-1;59061:580:0::1;59857:5;::::0;:31:::1;::::0;-1:-1:-1;;;59857:31:0;;59837:17:::1;::::0;-1:-1:-1;;;;;59857:5:0::1;::::0;:16:::1;::::0;:31:::1;::::0;59882:4:::1;::::0;59857:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;::::0;59927:5:::1;::::0;:39:::1;::::0;-1:-1:-1;;;59927:39:0;;59857:41;;-1:-1:-1;;;;;;59927:5:0::1;::::0;:12:::1;::::0;:39:::1;::::0;59940:6;;59948:4;;59954:11;;59927:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59909:57;;60042:31;60057:15;60042:14;:31::i;:::-;60128:13;::::0;::::1;;:42:::0;::::1;;;-1:-1:-1::0;60145:11:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;60145:11:0::1;:25:::0;::::1;60128:42;60124:238;;;60207:11;::::0;60195:85:::1;::::0;-1:-1:-1;;;60195:85:0;;60207:11:::1;::::0;;::::1;-1:-1:-1::0;;;;;60207:11:0::1;::::0;60195:30:::1;::::0;:85:::1;::::0;60226:6;;60234:4;;60240:11;;60253:15;;60270:9;;60195:85:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60187:110;;;;-1:-1:-1::0;;;60187:110:0::1;;;;;;;:::i;:::-;60124:238;;;60346:4;60330:20:::0;;-1:-1:-1;;60330:20:0::1;::::0;::::1;::::0;;60124:238:::1;60379:53;60389:6;60397:4;60403:11;60416:15;60379:53;;;;;;;;;:::i;:::-;;;;;;;;39871:1;;;;;58860:1580::o:0;65464:74::-;65496:42;65464:74;:::o;72891:22::-;;;;:::o;73481:28::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73481:28:0;;-1:-1:-1;73481:28:0;:::o;88255:873::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;88332:13;88328:793:::1;;73243:42;88362:7;88370:1;88362:10;;;;;;;;;;;;;;;;:25;;;;;-1:-1:-1::0;;;;;88362:25:0::1;;;;;-1:-1:-1::0;;;;;88362:25:0::1;;;;;;73243:42;88402:15;88418:1;88402:18;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:33:::0;;-1:-1:-1;;;;;;88402:33:0::1;-1:-1:-1::0;;;;;88402:33:0;;;::::1;::::0;;;::::1;::::0;;88454:10:::1;::::0;-1:-1:-1;;;88454:10:0;::::1;;;88450:80;;;73243:42;88485:11;88497:1;88485:14;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1::0;;;;;88485:29:0::1;;;;;-1:-1:-1::0;;;;;88485:29:0::1;;;;;;88450:80;88554:1;88544:7;:11:::0;88328:793:::1;;;88577:8;88589:1;88577:13;88573:548;;;73148:42;88607:7;88615:1;88607:10;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;88607:26:0::1;;;;;-1:-1:-1::0;;;;;88607:26:0::1;;;;;;73148:42;88648:15;88664:1;88648:18;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:34:::0;;-1:-1:-1;;;;;;88648:34:0::1;-1:-1:-1::0;;;;;88648:34:0;;;::::1;::::0;;;::::1;::::0;;88701:10:::1;::::0;-1:-1:-1;;;88701:10:0;::::1;;;88697:81;;;73148:42;88732:11;88744:1;88732:14;;;;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;88732:30:0::1;;;;;-1:-1:-1::0;;;;;88732:30:0::1;;;;;;88697:81;88802:1;88792:7;:11:::0;88573:548:::1;;;88825:8;88837:1;88825:13;88821:300;;;73052:42;88855:7;88863:1;88855:10;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;88855:26:0::1;;;;;-1:-1:-1::0;;;;;88855:26:0::1;;;;;;73052:42;88896:15;88912:1;88896:18;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:34:::0;;-1:-1:-1;;;;;;88896:34:0::1;-1:-1:-1::0;;;;;88896:34:0;;;::::1;::::0;;;::::1;::::0;;88949:10:::1;::::0;-1:-1:-1;;;88949:10:0;::::1;;;88945:81;;;73052:42;88980:11;88992:1;88980:14;;;;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;88980:30:0::1;;;;;-1:-1:-1::0;;;;;88980:30:0::1;;;;;;88945:81;89050:1;89040:7;:11:::0;88821:300:::1;;;89084:25;;-1:-1:-1::0;;;89084:25:0::1;;;;;;;:::i;89771:252::-:0;39493:12;:10;:12::i;:::-;-1:-1:-1;;;;;39479:26:0;:10;-1:-1:-1;;;;;39479:26:0;;39471:50;;;;-1:-1:-1;;;39471:50:0;;;;;;;:::i;:::-;89832:10:::1;:18:::0;;-1:-1:-1;;;;89832:18:0;::::1;::::0;;;-1:-1:-1;;;;;89873:12:0;89865:35;89861:111:::1;;89917:12;::::0;:43:::1;::::0;-1:-1:-1;;;89917:43:0;;-1:-1:-1;;;;;89917:12:0;;::::1;::::0;:20:::1;::::0;:43:::1;::::0;-1:-1:-1;;;;;;;;;;;65765:42:0;89917:12:::1;::::0;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;89861:111;89982:12;:33:::0;;-1:-1:-1;;;;;;89982:33:0::1;::::0;;89771:252::o;38867:25::-;;;;;;:::o;67074:188::-;67213:15;;67198:56;;-1:-1:-1;;;67198:56:0;;67120:7;;67213:15;;;-1:-1:-1;;;;;67213:15:0;;67198:41;;:56;;67248:4;;67198:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;89173:543::-;39493:12;:10;:12::i;:::-;-1:-1:-1;;;;;39479:26:0;:10;-1:-1:-1;;;;;39479:26:0;;39471:50;;;;-1:-1:-1;;;39471:50:0;;;;;;;:::i;:::-;89339:12:::1;::::0;-1:-1:-1;;;;;89339:12:0::1;89331:35:::0;89327:111:::1;;89383:12;::::0;:43:::1;::::0;-1:-1:-1;;;89383:43:0;;-1:-1:-1;;;;;89383:12:0;;::::1;::::0;:20:::1;::::0;:43:::1;::::0;-1:-1:-1;;;;;;;;;;;65765:42:0;89383:12:::1;::::0;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;89327:111;89506:12;:36:::0;;-1:-1:-1;;;;;;89506:36:0::1;-1:-1:-1::0;;;;;89506:36:0;;::::1;::::0;;;::::1;::::0;;;;89553:50:::1;::::0;-1:-1:-1;;;89553:50:0;;:12;::::1;::::0;:20:::1;::::0;:50:::1;::::0;-1:-1:-1;;;;;;;;;;;65765:42:0;-1:-1:-1;;89585:17:0;89553:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;89614:66:0::1;::::0;;::::1;::::0;::::1;::::0;;89637:12:::1;::::0;-1:-1:-1;;;;;89637:12:0::1;89614:66:::0;;66228:42:::1;89614:66;::::0;::::1;::::0;73243:42:::1;89614:66:::0;;;;;;;::::1;::::0;:11:::1;::::0;:66:::1;;:::i;:::-;-1:-1:-1::0;;89691:10:0::1;:17:::0;;-1:-1:-1;;;;89691:17:0::1;-1:-1:-1::0;;;89691:17:0::1;::::0;;89173:543::o;53620:432::-;53693:4;53620:432;;;;:::o;35565:25::-;;;;;;:::o;65984:88::-;66029:42;65984:88;:::o;75366:346::-;75601:51;75613:6;75621:11;75634:8;75644:7;75601:11;:51::i;:::-;75663:41;75680:4;75686:10;75698:5;75663:16;:41::i;:::-;75366:346;;;;;;;:::o;72597:20::-;;;;;;-1:-1:-1;;;;;72597:20:0;;:::o;42688:174::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42767:21:0;::::1;42759:30;;;::::0;::::1;;42800:6;:16:::0;;-1:-1:-1;;;;;;42800:16:0::1;-1:-1:-1::0;;;;;42800:16:0;::::1;;::::0;;42832:22:::1;::::0;::::1;::::0;::::1;::::0;42800:16;;42832:22:::1;:::i;46360:171::-:0;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;46449:26:::1;:11;46463:12:::0;;46449:26:::1;:::i;:::-;;46491:32;46510:12;;46491:32;;;;;;;:::i;:::-;;;;;;;;46360:171:::0;;:::o;87081:848::-;87186:7;;87248:14;;87244:646;;87306:16;;;87320:1;87306:16;;;87279:24;87306:16;;;;;87279:24;87306:16;;;;;;;;;;-1:-1:-1;87306:16:0;87279:43;;66228:42;87337:7;87345:1;87337:10;;;;;;;;;;;;;:26;-1:-1:-1;;;;;87337:26:0;;;-1:-1:-1;;;;;87337:26:0;;;;;73243:42;87378:7;87386:1;87378:10;;;;;;;;-1:-1:-1;;;;;87378:25:0;;;:10;;;;;;;;;;;:25;87476:125;;-1:-1:-1;;;87476:125:0;;87420:36;;-1:-1:-1;;;;;;;;;;;65765:42:0;87476:43;;:125;;87542:10;;87575:7;;87476:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87476:125:0;;;;;;;;;;;;:::i;:::-;87420:181;;87618:22;87660:19;87709:1;87680:19;:26;:30;87660:51;;;;;;;;;;;;;;87618:93;;72736:42;-1:-1:-1;;;;;87743:29:0;;87791:5;;;;;;;;;-1:-1:-1;;;;;87791:5:0;87743:135;;;;;;;;87816:1;87743:135;;;;87819:14;87743:135;;;;87835:1;87743:135;;;;87838:1;87743:135;;;87859:4;87743:135;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87726:152;;87244:646;;;;87907:14;87081:848;-1:-1:-1;;87081:848:0:o;65371:22::-;;;;:::o;38610:27::-;;;;:::o;37315:94::-;37373:7;37315:94;:::o;45156:169::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;45239:12:::1;:28:::0;;;45283:34:::1;::::0;::::1;::::0;::::1;::::0;45254:13;;45283:34:::1;:::i;71392:137::-:0;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;71485:6:::1;71473:8;:18;;71465:27;;;::::0;::::1;;71503:7;:18:::0;71392:137::o;38273:29::-;;;;:::o;65720:87::-;-1:-1:-1;;;;;;;;;;;65720:87:0;:::o;37477:22::-;;;-1:-1:-1;;;;;37477:22:0;;:::o;71645:116::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;71725:12:::1;:28:::0;;-1:-1:-1;;71725:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71645:116::o;41576:123::-;39950:5;;;;;;;;;-1:-1:-1;;;;;39950:5:0;-1:-1:-1;;;;;39950:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39936:32:0;:10;-1:-1:-1;;;;;39936:32:0;;:62;;;;39986:12;:10;:12::i;:::-;-1:-1:-1;;;;;39972:26:0;:10;-1:-1:-1;;;;;39972:26:0;;39936:62;39928:86;;;;-1:-1:-1;;;39928:86:0;;;;;;;:::i;:::-;41661:13:::1;:30:::0;;-1:-1:-1;;41661:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41576:123::o;37506:21::-;;;-1:-1:-1;;;;;37506:21:0;;:::o;65872:24::-;;;;;;;;;;35597:26;;;;;;-1:-1:-1;;;;;35597:26:0;;:::o;67270:162::-;67395:4;;:29;;-1:-1:-1;;;67395:29:0;;67316:7;;-1:-1:-1;;;;;67395:4:0;;:14;;:29;;67418:4;;67395:29;;;:::i;67440:201::-;67595:15;;67580:53;;-1:-1:-1;;;67580:53:0;;67489:7;;67595:15;;;-1:-1:-1;;;;;67595:15:0;;67580:38;;:53;;67627:4;;67580:53;;;:::i;41932:202::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42019:25:0;::::1;42011:34;;;::::0;::::1;;42056:10;:24:::0;;-1:-1:-1;;;;;;42056:24:0::1;-1:-1:-1::0;;;;;42056:24:0;::::1;;::::0;;42096:30:::1;::::0;::::1;::::0;::::1;::::0;42056:24;;42096:30:::1;:::i;74013:1284::-:0;74305:10;;74265:19;;74305:10;;74297:19;;;;;;74573:4;74567:11;-1:-1:-1;;;74592:135:0;;74474:4;74458:22;;74764:4;74748:21;;74741:43;;;-1:-1:-1;;;74839:4:0;74823:21;;74798:146;74458:22;74995:4;74567:11;74435:20;74973:27;75023:229;;-1:-1:-1;;;75023:229:0;;74958:42;;-1:-1:-1;;;;;;75023:57:0;;;-1:-1:-1;75023:57:0;;:229;;75095:6;;75116:11;;75142:13;;75170:7;;75192:4;;75211:10;;75236:5;;75023:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75270:19:0;;-1:-1:-1;;;;;75270:19:0;;;-1:-1:-1;75270:19:0;;-1:-1:-1;75270:19:0;;;74013:1284;;;;;;;;;;:::o;61971:281::-;62060:5;;-1:-1:-1;;;;;62060:5:0;62038:10;:28;62030:37;;;;;;62124:5;;62086:34;;;-1:-1:-1;;;62086:34:0;;;;-1:-1:-1;;;;;62124:5:0;;;;62086:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62086:43:0;;62078:52;;;;;;62141:30;62158:12;62141:16;:30::i;:::-;62214:4;;:29;;-1:-1:-1;;;62214:29:0;;62182:62;;62200:12;;-1:-1:-1;;;;;62214:4:0;;;;:14;;:29;;62237:4;;62214:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62182:4;;-1:-1:-1;;;;;62182:4:0;;:62;:17;:62::i;71910:170::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;72030:19:::1;:42:::0;71910:170::o;73419:26::-;;;-1:-1:-1;;;;;73419:26:0;;:::o;65597:47::-;65639:5;65597:47;:::o;66079:96::-;66132:42;66079:96;:::o;65053:93::-;65104:42;65053:93;:::o;43151:263::-;39380:10;;-1:-1:-1;;;;;39380:10:0;39366;:24;39358:48;;;;-1:-1:-1;;;39358:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43232:22:0;::::1;43224:31;;;::::0;::::1;;43266:5;::::0;43280:7:::1;::::0;;43266:25:::1;::::0;-1:-1:-1;;;43266:25:0;;-1:-1:-1;;;;;43266:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;43280:7;;::::1;::::0;43266:5:::1;::::0;:25:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43302:7:0::1;:18:::0;;-1:-1:-1;;;;;;43302:18:0::1;-1:-1:-1::0;;;;;43302:18:0;;::::1;::::0;;;::::1;::::0;;;43331:5:::1;::::0;:35:::1;::::0;-1:-1:-1;;;43331:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;43345:7:::1;::::0;-1:-1:-1;;43362:2:0;43331:35:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43382:24;43397:8;43382:24;;;;;;:::i;73452:22::-:0;;;-1:-1:-1;;;73452:22:0;;;;;:::o;83322:667::-;83512:23;;83435:4;;83512:23;;83508:67;;;-1:-1:-1;83559:4:0;83552:11;;83508:67;83666:19;;83640:23;:21;:23::i;:::-;:45;83636:89;;;-1:-1:-1;83709:4:0;83702:11;;83636:89;83876:10;:8;:10::i;:::-;83871:56;;-1:-1:-1;83910:5:0;83903:12;;83871:56;83946:35;83967:13;83946:20;:35::i;67649:133::-;67711:7;67738:36;67758:15;:13;:15::i;:::-;67738;:13;:15::i;:::-;:19;;:36::i;44602:154::-;38978:10;;-1:-1:-1;;;;;38978:10:0;38964;:24;;:54;;;39006:12;:10;:12::i;:::-;-1:-1:-1;;;;;38992:26:0;:10;-1:-1:-1;;;;;38992:26:0;;38964:54;38956:78;;;;-1:-1:-1;;;38956:78:0;;;;;;;:::i;:::-;44680:14:::1;:23:::0;;;44719:29:::1;::::0;::::1;::::0;::::1;::::0;44697:6;;44719:29:::1;:::i;65291:18::-:0;;;;:::o;73198:88::-;73243:42;73198:88;:::o;66301:34::-;;;;:::o;37417:21::-;;;-1:-1:-1;;;;;37417:21:0;;:::o;62681:173::-;39144:10;;-1:-1:-1;;;;;39144:10:0;39130;:24;;:54;;;39172:12;:10;:12::i;:::-;-1:-1:-1;;;;;39158:26:0;:10;-1:-1:-1;;;;;39158:26:0;;39130:54;:88;;;;39202:5;;;;;;;;;-1:-1:-1;;;;;39202:5:0;-1:-1:-1;;;;;39202:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39188:30:0;:10;-1:-1:-1;;;;;39188:30:0;;39130:88;:124;;;;39236:5;;;;;;;;;-1:-1:-1;;;;;39236:5:0;-1:-1:-1;;;;;39236:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39222:32:0;:10;-1:-1:-1;;;;;39222:32:0;;39130:124;39108:185;;;;-1:-1:-1;;;39108:185:0;;;;;;;:::i;:::-;62753:13:::1;:20:::0;;-1:-1:-1;;62753:20:0::1;62769:4;62753:20;::::0;;62784:5:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;62784:22:0;;;;-1:-1:-1;;;;;62784:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;62753:13:::1;::::0;62784:22;;;;;;;;62753:13;62784:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62824:22:0::1;::::0;::::1;::::0;-1:-1:-1;62824:22:0;;-1:-1:-1;62824:22:0::1;62681:173::o:0;65923:32::-;;;;;;;;;;27760:622;28130:10;;;28129:62;;-1:-1:-1;28146:39:0;;-1:-1:-1;;;28146:39:0;;-1:-1:-1;;;;;28146:15:0;;;;;:39;;28170:4;;28177:7;;28146:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;28129:62;28121:152;;;;-1:-1:-1;;;28121:152:0;;;;;;;:::i;:::-;28284:90;28304:5;28334:22;;;28358:7;28367:5;28311:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28311:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28311:62:0;-1:-1:-1;;;;;;28311:62:0;;;;;;;;;;28284:19;:90::i;:::-;27760:622;;;:::o;13487:196::-;13590:12;13622:53;13645:6;13653:4;13659:1;13662:12;13622:22;:53::i;:::-;13615:60;13487:196;-1:-1:-1;;;;13487:196:0:o;46685:98::-;46757:5;;:18;;;-1:-1:-1;;;46757:18:0;;;;46730:7;;-1:-1:-1;;;;;46757:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71014:120::-;71109:16;71014:120;:::o;27101:177::-;27184:86;27204:5;27234:23;;;27259:2;27263:5;27211:58;;;;;;;;;:::i;68368:869::-;68472:25;68499:13;68530:16;68549:15;:13;:15::i;:::-;68530:34;;68595:8;68579:13;:24;68575:655;;;68620:18;68641:15;:13;:15::i;:::-;68620:36;-1:-1:-1;68675:14:0;;68671:230;;68725:15;;;;;-1:-1:-1;;;;;68725:15:0;68710:49;68782;68791:10;68803:27;:13;68821:8;68803:17;:27::i;:::-;68782:8;:49::i;:::-;68854:12;;68710:175;;-1:-1:-1;;;;;;68710:175:0;;;;;;;;;;68854:12;;;68710:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68671:230;68915:21;68939:15;:13;:15::i;:::-;68915:39;;68989:38;68998:13;69013;68989:8;:38::i;:::-;68969:58;-1:-1:-1;69050:36:0;:13;68969:58;69050:17;:36::i;:::-;69042:44;;68575:655;;;;;69201:13;69216:1;69193:25;;;;;;;68575:655;68368:869;;;;;:::o;67903:457::-;67986:13;;;;67982:52;;;68016:7;;67982:52;68106:17;68126:15;:13;:15::i;:::-;68106:35;-1:-1:-1;68250:13:0;;68246:107;;68320:3;;68280:61;;-1:-1:-1;;;68280:61:0;;65104:42;;68280:39;;:61;;68320:3;68325:9;;68336:4;;68280:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;69283:384::-;69343:7;69363:18;69384:15;:13;:15::i;:::-;69363:36;-1:-1:-1;69414:14:0;;69410:217;;69506:15;;69588:12;;69491:124;;-1:-1:-1;;;69491:124:0;;69506:15;;;;-1:-1:-1;;;;;69506:15:0;;69491:49;;:124;;69559:10;;69588:12;;;69491:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69410:217;69644:15;:13;:15::i;:::-;69637:22;;;69283:384;:::o;20822:136::-;20880:7;20907:43;20911:1;20914;20907:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;20900:50;20822:136;-1:-1:-1;;;20822:136:0:o;78638:3594::-;78755:15;78785:13;78813:20;78977:1;78956:18;:16;:18::i;:::-;:22;78952:1797;;;79150:15;;79135:62;;-1:-1:-1;;;79135:62:0;;79150:15;;;;-1:-1:-1;;;;;79150:15:0;;79135:41;;:62;;79185:4;;79150:15;;79135:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;79235:28:0;;-1:-1:-1;;;79235:28:0;;79214:18;;66029:42;;79235:13;;:28;;79257:4;;79235:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79302:36;;-1:-1:-1;;;79302:36:0;;79214:49;;-1:-1:-1;79278:21:0;;66132:42;;79302:21;;:36;;79332:4;;79302:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79278:60;;79355:20;79378:44;65639:5;79378:23;79393:7;;79378:10;:14;;:23;;;;:::i;:::-;:27;;:44::i;:::-;79355:67;-1:-1:-1;79441:16:0;;79437:94;;79478:37;66029:42;65496;79502:12;79478:16;:37::i;:::-;79545:20;79568:28;:10;79583:12;79568:14;:28::i;:::-;79545:51;-1:-1:-1;79617:16:0;;79613:79;;79654:22;79663:12;79654:8;:22::i;:::-;79712:17;;79708:84;;79750:26;79762:13;79750:11;:26::i;:::-;79871:10;;-1:-1:-1;;;79871:10:0;;;;79867:258;;;79956:12;;79949:45;;-1:-1:-1;;;79949:45:0;;79902:23;;-1:-1:-1;;;;;79956:12:0;;79949:30;;:45;;79988:4;;79949:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79902:92;-1:-1:-1;80017:19:0;;80013:97;;80061:29;80074:15;80061:12;:29::i;:::-;79867:258;;80205:7;;80201:537;;80259:28;;-1:-1:-1;;;80259:28:0;;80238:18;;73243:42;;80259:13;;:28;;80281:4;;80259:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80332:5;;80306:58;;;;;;;;-1:-1:-1;80306:58:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;80306:58:0;;80238:49;;-1:-1:-1;72736:42:0;;80306:25;;:58;;80332:5;;;;-1:-1:-1;;;;;80332:5:0;;80306:58;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80201:537;;;;80390:7;;80401:1;80390:12;80386:352;;;80445:29;;-1:-1:-1;;;80445:29:0;;80423:19;;73148:42;;80445:14;;:29;;80468:4;;80445:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80519:5;;80493:59;;;;;;;;-1:-1:-1;80493:59:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;80493:59:0;;80423:51;;-1:-1:-1;72736:42:0;;80493:25;;:59;;80519:5;;;;-1:-1:-1;;;;;80519:5:0;;80493:59;;;;:::i;80386:352::-;80615:29;;-1:-1:-1;;;80615:29:0;;80593:19;;73052:42;;80615:14;;:29;;80638:4;;80615:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80689:5;;80663:59;;;;;;;;-1:-1:-1;80663:59:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;80663:59:0;;80593:51;;-1:-1:-1;72736:42:0;;80663:25;;:59;;80689:5;;;;-1:-1:-1;;;;;80689:5:0;;80663:59;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80386:352;;78952:1797;;;;;80905:20;;80901:447;;80942:18;80963:15;:13;:15::i;:::-;80942:36;-1:-1:-1;80997:14:0;;80993:219;;81047:15;;;;;-1:-1:-1;;;;;81047:15:0;81032:49;81104:38;81113:10;81125:16;81104:8;:38::i;:::-;81165:12;;81032:164;;-1:-1:-1;;;;;;81032:164:0;;;;;;;;;;81165:12;;;81032:164;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80993:219;81226:21;81250:15;:13;:15::i;:::-;81226:39;;81295:41;81304:16;81322:13;81295:8;:41::i;:::-;81280:56;;80901:447;;;81484:14;81501:22;:20;:22::i;:::-;81549:5;;:31;;-1:-1:-1;;;81549:31:0;;81484:39;;-1:-1:-1;81534:12:0;;-1:-1:-1;;;;;81549:5:0;;;;:16;;:31;;81574:4;;81549:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;81534:56;;81687:4;81678:6;:13;81674:437;;;81718:16;:6;81729:4;81718:10;:16::i;:::-;81708:26;;81749:16;81768:15;:13;:15::i;:::-;81749:34;-1:-1:-1;81749:34:0;81802:25;:7;81814:12;81802:11;:25::i;:::-;:36;81798:176;;;81935:23;:21;:23::i;:::-;;81798:176;81674:437;;;;82083:16;:4;82092:6;82083:8;:16::i;:::-;82075:24;;81674:437;-1:-1:-1;;82193:23:0;:31;;-1:-1:-1;;82193:31:0;;;78638:3594;;;;-1:-1:-1;78638:3594:0:o;40715:727::-;40887:4;;-1:-1:-1;;;;;40887:4:0;40879:27;40871:68;;;;-1:-1:-1;;;40871:68:0;;;;;;;:::i;:::-;40952:5;:24;;-1:-1:-1;;;;;;40952:24:0;-1:-1:-1;;;;;40952:24:0;;;;;;;;;;;41001:13;;;-1:-1:-1;;;41001:13:0;;;;:5;;;;;:11;;:13;;;;;;;;;;;;;;;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40987:4;:28;;-1:-1:-1;;;;;;40987:28:0;-1:-1:-1;;;;;40987:28:0;;;;;;;;41026:37;;:4;41043:6;-1:-1:-1;;41026:16:0;:37::i;:::-;41122:10;:24;;-1:-1:-1;;;;;41122:24:0;;;-1:-1:-1;;;;;;41122:24:0;;;;;;;41157:7;:18;;;;;;;;;;;;41186:6;:16;;;;;;;;;;;;;;41122:10;41248:14;:18;;;41294:5;41277:14;:22;41325:3;41310:12;:18;41339:13;:17;41369:5;;:35;;-1:-1:-1;;;41369:35:0;;:5;;;;:13;;:35;;41383:7;;;-1:-1:-1;;;41369:35:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40715:727;;;;:::o;75791:2728::-;76004:5;;;;;-1:-1:-1;;;;;76004:5:0;75996:28;75988:37;;;;;;76155:6;76138:14;:23;76252:8;76236:13;:24;76311:6;76296:12;:21;76494:12;76472:19;:34;-1:-1:-1;76584:56:0;;-1:-1:-1;;;;;;76584:56:0;;;;;76701:4;;:57;;-1:-1:-1;;;76701:57:0;;-1:-1:-1;;;;;76701:4:0;;;;:12;;:57;;65104:42;;-1:-1:-1;;;76701:57:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76769:41:0;;-1:-1:-1;;;76769:41:0;;66029:42;;76769:11;;:41;;-1:-1:-1;;;;;;;;;;;65765:42:0;-1:-1:-1;;76792:17:0;76769:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76821:49:0;;-1:-1:-1;;;76821:49:0;;66132:42;;76821:19;;:49;;-1:-1:-1;;;;;;;;;;;65765:42:0;-1:-1:-1;;76852:17:0;76821:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76921:4:0;76911:7;:14;77024:5;:27;;-1:-1:-1;;;;;;77024:27:0;;-1:-1:-1;;;;;77024:27:0;;;;;;77103:3;:10;;;77283:60;;-1:-1:-1;;;77283:60:0;;-1:-1:-1;;65104:42:0;;77283:54;;:60;;77103:10;;77283:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;77260:15:0;77246:97;;-1:-1:-1;;;;;;77246:97:0;;-1:-1:-1;;;;;77246:97:0;;;;;;;77462:4;;77246:97;;-1:-1:-1;77462:4:0;;;77434:33;;;;;;;;-1:-1:-1;77426:42:0;;-1:-1:-1;77426:42:0;;;;;77500:15;;;;;;;;;-1:-1:-1;;;;;77500:15:0;-1:-1:-1;;;;;77485:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77541:1;77485:57;77481:481;;;77621:15;;77606:47;;-1:-1:-1;;;77606:47:0;;77559:27;;77621:15;;;-1:-1:-1;;;;;77621:15:0;;77606:44;;:47;;77559:27;;77606:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77559:94;;77723:19;-1:-1:-1;;;;;77708:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77668:12;:104;;-1:-1:-1;;;;;;77668:104:0;-1:-1:-1;;;;;77668:104:0;;;;;;;;77787:50;;-1:-1:-1;;;77787:50:0;;:12;;;:20;;:50;;-1:-1:-1;;;;;;;;;;;65765:42:0;-1:-1:-1;;77819:17:0;77787:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77852:66:0;;;;;;;;77875:12;;-1:-1:-1;;;;;77875:12:0;77852:66;;66228:42;77852:66;;;;73243:42;77852:66;;;;;;;;;:11;;:66;;:::i;:::-;-1:-1:-1;;77933:10:0;:17;;-1:-1:-1;;;;77933:17:0;-1:-1:-1;;;77933:17:0;;;77481:481;78010:17;;;;:9;;:17;;;;;:::i;:::-;-1:-1:-1;78111:52:0;;-1:-1:-1;;;78111:52:0;;73243:42;;78111:11;;:52;;72736:42;;-1:-1:-1;;78145:17:0;78111:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;78174:57:0;73052:42;72736;-1:-1:-1;;78174:16:0;:57::i;:::-;78286:53;;-1:-1:-1;;;78286:53:0;;73148:42;;78286:12;;:53;;72736:42;;-1:-1:-1;;78321:17:0;78286:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;78378:53:0;;;;;;;;66029:42;78378:53;;66228:42;78378:53;;;;73243:42;78378:53;;;;;;;;;:7;;:53;;:::i;:::-;-1:-1:-1;78442:69:0;;;;;;;;66132:42;78442:69;;66228:42;78442:69;;;;73243:42;78442:69;;;;;;;;;:15;;:69;;:::i;82436:497::-;82513:18;82534:15;:13;:15::i;:::-;82513:36;-1:-1:-1;82564:14:0;;82560:171;;82610:15;;82692:12;;82595:124;;-1:-1:-1;;;82595:124:0;;82610:15;;;;-1:-1:-1;;;;;82610:15:0;;82595:49;;:124;;82663:10;;82692:12;;;82595:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;82560:171;82772:28;;-1:-1:-1;;;82772:28:0;;82741:60;;82758:12;;66029:42;;82772:13;;:28;;82794:4;;82772:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66029:42;;82741:60;:16;:60::i;:::-;82878:36;;-1:-1:-1;;;82878:36:0;;82812:113;;82851:12;;66132:42;;82878:21;;:36;;82908:4;;82878:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66132:42;;82812:113;:24;:113::i;84060:2965::-;84116:7;84229:19;84251:5;84229:27;;84267:17;84287:22;84267:42;;84330:25;84358:14;84330:42;;84394:14;66132:42;-1:-1:-1;;;;;84411:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84394:42;-1:-1:-1;84447:19:0;;84495:29;84394:42;84506:17;84495:10;:29::i;:::-;84479:45;;84535:21;84559:18;:16;:18::i;:::-;84535:42;;84638:11;84630:5;:19;84626:444;;;84726:17;84746:22;:11;84762:5;84746:15;:22::i;:::-;84726:42;-1:-1:-1;84819:45:0;84852:11;84819:28;:13;84726:42;84819:17;:28::i;:45::-;84805:59;-1:-1:-1;84913:18:0;84934:21;:9;84948:6;84934:13;:21::i;:::-;84913:42;;84988:10;84974:11;:24;84970:89;;;85033:10;85019:24;;84970:89;84626:444;;;85114:16;;;85128:1;85114:16;;;;;;;;;85082:29;;85114:16;;;85082:29;;85114:16;;;;;-1:-1:-1;85114:16:0;85082:48;;66029:42;85141:12;85154:1;85141:15;;;;;;;;;;;;;:30;-1:-1:-1;;;;;85141:30:0;;;-1:-1:-1;;;;;85141:30:0;;;;;66228:42;85182:12;85195:1;85182:15;;;;;;;;;;;;;:31;-1:-1:-1;;;;;85182:31:0;;;-1:-1:-1;;;;;85182:31:0;;;;;73052:42;85224:12;85237:1;85224:15;;;;;;;;-1:-1:-1;;;;;85224:31:0;;;;:15;;;;;;;;;;:31;85300:16;;;85314:1;85300:16;;;;;;;;;85268:29;;85300:16;;85314:1;85300:16;;85268:29;;85300:16;;;;;-1:-1:-1;85300:16:0;85268:48;;66132:42;85327:12;85340:1;85327:15;;;;;;;;;;;;;:38;-1:-1:-1;;;;;85327:38:0;;;-1:-1:-1;;;;;85327:38:0;;;;;66228:42;85376:12;85389:1;85376:15;;;;;;;;;;;;;:31;-1:-1:-1;;;;;85376:31:0;;;-1:-1:-1;;;;;85376:31:0;;;;;73052:42;85418:12;85431:1;85418:15;;;;;;;;-1:-1:-1;;;;;85418:31:0;;;:15;;;;;;;;;;;:31;85462:16;85493:17;;85489:280;;85571:133;;-1:-1:-1;;;85571:133:0;;85527:24;;-1:-1:-1;;;;;;;;;;;65765:42:0;85571:43;;:133;;85637:13;;85673:12;;85571:133;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85571:133:0;;;;;;;;;;;;:::i;:::-;85527:177;;85730:7;85755:1;85738:7;:14;:18;85730:27;;;;;;;;;;;;;;85719:38;;85489:280;;85781:16;85812:15;;85808:276;;85888:131;;-1:-1:-1;;;85888:131:0;;85844:24;;-1:-1:-1;;;;;;;;;;;65765:42:0;85888:43;;:131;;85954:11;;85988:12;;85888:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85888:131:0;;;;;;;;;;;;:::i;:::-;85844:175;;86045:7;86070:1;86053:7;:14;:18;86045:27;;;;;;;;;;;;;;86034:38;;85808:276;;86131:10;;86096:20;;-1:-1:-1;;;86131:10:0;;;;86127:831;;;86194:16;;;86208:1;86194:16;;;;;;;;;86158:33;;86194:16;;;86158:33;;86194:16;;;-1:-1:-1;;86255:12:0;;86225:19;;;;-1:-1:-1;;;;;;86255:12:0;;86225:19;;-1:-1:-1;86255:12:0;;86225:19;;;;;;;;;:43;-1:-1:-1;;;;;86225:43:0;;;-1:-1:-1;;;;;86225:43:0;;;;;66228:42;86283:16;86300:1;86283:19;;;;;;;;;;;;;:35;-1:-1:-1;;;;;86283:35:0;;;-1:-1:-1;;;;;86283:35:0;;;;;73052:42;86333:16;86350:1;86333:19;;;;;;;;-1:-1:-1;;;;;86333:35:0;;;:19;;;;;;;;;:35;86447:15;;86432:47;;-1:-1:-1;;;86432:47:0;;86385:27;;86447:15;;;;;;;;86432:44;;:47;;86385:27;;86432:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86385:94;;86494:26;86555:19;-1:-1:-1;;;;;86540:42:0;;86591:4;86540:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86494:103;-1:-1:-1;86616:22:0;;86612:335;;86710:154;;-1:-1:-1;;;86710:154:0;;86659:27;;-1:-1:-1;;;;;;;;;;;65765:42:0;86710:43;;:154;;86780:18;;86825:16;;86710:154;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86710:154:0;;;;;;;;;;;;:::i;:::-;86659:205;;86898:10;86929:1;86909:10;:17;:21;86898:33;;;;;;;;;;;;;;86883:48;;86612:335;;86127:831;;;;86977:40;87004:12;86977:22;:8;86990;86977:12;:22::i;:40::-;86970:47;;;;;;;;;;;;;;84060:2965;:::o;56318:1736::-;56394:4;56411:16;56430:24;56440:13;56430:9;:24::i;:::-;56411:43;;56465:28;;:::i;:::-;56496:5;;:31;;-1:-1:-1;;;56496:31:0;;-1:-1:-1;;;;;56496:5:0;;;;:16;;:31;;56521:4;;56496:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56465:62;;56604:6;:17;;;56625:1;56604:22;56600:40;;;56635:5;56628:12;;;;;;56600:40;56785:14;;56764:17;;;;56744:38;;:15;;:19;:38::i;:::-;:55;56740:73;;;56808:5;56801:12;;;;;;56740:73;56932:14;;56910:17;;;;56890:38;;:15;;:19;:38::i;:::-;:56;56886:73;;56955:4;56948:11;;;;;;56886:73;57389:5;;:23;;;-1:-1:-1;;;57389:23:0;;;;57367:19;;-1:-1:-1;;;;;57389:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57367:45;;57441:13;;57427:11;:27;57423:44;;;57463:4;57456:11;;;;;;;57423:44;57521:13;57537:22;:20;:22::i;:::-;57521:38;;57649:6;:16;;;57622:24;57632:13;;57622:5;:9;;:24;;;;:::i;:::-;:43;57618:60;;;57674:4;57667:11;;;;;;;;57618:60;57691:14;57732:6;:16;;;57724:5;:24;57720:66;;;57769:16;;;;57759:27;;:5;;:9;:27::i;:::-;57750:36;;57720:66;57956:5;;:23;;;-1:-1:-1;;;57956:23:0;;;;57939:14;;-1:-1:-1;;;;;57956:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57939:40;-1:-1:-1;58027:18:0;57939:40;58038:6;58027:10;:18::i;:::-;57998:12;;:26;;58015:8;57998:16;:26::i;:::-;:47;;56318:1736;-1:-1:-1;;;;;;;;56318:1736:0:o;20358:181::-;20416:7;20448:5;;;20472:6;;;;20464:46;;;;-1:-1:-1;;;20464:46:0;;;;;;;:::i;29406:761::-;29830:23;29856:69;29884:4;29856:69;;;;;;;;;;;;;;;;;29864:5;-1:-1:-1;;;;;29856:27:0;;;:69;;;;;:::i;:::-;29940:17;;29830:95;;-1:-1:-1;29940:21:0;29936:224;;30082:10;30071:30;;;;;;;;;;;;:::i;:::-;30063:85;;;;-1:-1:-1;;;30063:85:0;;;;;;;:::i;14864:979::-;14994:12;15027:18;15038:6;15027:10;:18::i;:::-;15019:60;;;;-1:-1:-1;;;15019:60:0;;;;;;;:::i;:::-;15153:12;15167:23;15194:6;-1:-1:-1;;;;;15194:11:0;15214:8;15225:4;15194:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15152:78;;;;15245:7;15241:595;;;15276:10;-1:-1:-1;15269:17:0;;-1:-1:-1;15269:17:0;15241:595;15390:17;;:21;15386:439;;15653:10;15647:17;15714:15;15701:10;15697:2;15693:19;15686:44;15601:148;15796:12;15789:20;;-1:-1:-1;;;15789:20:0;;;;;;;;:::i;19030:106::-;19088:7;19119:1;19115;:5;:13;;19127:1;19115:13;;;-1:-1:-1;19123:1:0;;19030:106;-1:-1:-1;19030:106:0:o;21261:192::-;21347:7;21383:12;21375:6;;;;21367:29;;;;-1:-1:-1;;;21367:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;21419:5:0;;;21261:192::o;21712:471::-;21770:7;22015:6;22011:47;;-1:-1:-1;22045:1:0;22038:8;;22011:47;22082:5;;;22086:1;22082;:5;:1;22106:5;;;;;:10;22098:56;;;;-1:-1:-1;;;22098:56:0;;;;;;;:::i;22659:132::-;22717:7;22744:39;22748:1;22751;22744:39;;;;;;;;;;;;;;;;;:3;:39::i;69739:261::-;69797:195;;-1:-1:-1;;;69797:195:0;;-1:-1:-1;;;;;;;;;;;65765:42:0;69797:54;;:195;;69866:10;;69899:1;;69916:7;;69946:4;;69966:15;;69797:195;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69797:195:0;;;;;;;;;;;;:::i;70072:278::-;70136:206;;-1:-1:-1;;;70136:206:0;;-1:-1:-1;;;;;;;;;;;65765:42:0;70136:54;;:206;;70205:13;;70241:1;;70258:15;;70296:4;;70316:15;;70136:206;;;:::i;83008:263::-;83067:196;;-1:-1:-1;;;83067:196:0;;-1:-1:-1;;;;;;;;;;;65765:42:0;83067:54;;:196;;83136:7;;83166:1;;83183:11;;83217:4;;83237:15;;83067:196;;;:::i;10372:619::-;10432:4;10900:20;;10743:66;10940:23;;;;;;:42;;-1:-1:-1;;10967:15:0;;;10932:51;-1:-1:-1;;10372:619:0:o;23287:278::-;23373:7;23408:12;23401:5;23393:28;;;;-1:-1:-1;;;23393:28:0;;;;;;;;:::i;:::-;;23432:9;23448:1;23444;:5;;;;;;;23287:278;-1:-1:-1;;;;;23287:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4265:241;;4369:2;4357:9;4348:7;4344:23;4340:32;4337:2;;;-1:-1;;4375:12;4337:2;85:6;72:20;97:33;124:5;97:33;:::i;4513:263::-;;4628:2;4616:9;4607:7;4603:23;4599:32;4596:2;;;-1:-1;;4634:12;4596:2;226:6;220:13;238:33;265:5;238:33;:::i;4783:940::-;;;;;;;4980:3;4968:9;4959:7;4955:23;4951:33;4948:2;;;-1:-1;;4987:12;4948:2;226:6;220:13;238:33;265:5;238:33;:::i;:::-;5150:2;5200:22;;220:13;5039:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5269:2;5319:22;;220:13;5158:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5388:2;5438:22;;220:13;5277:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5507:3;5558:22;;220:13;5396:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;5627:3;5675:22;;1237:13;5516:74;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;5636:71;;;;4942:781;;;;;;;;:::o;5730:1101::-;;;;;;;;5946:3;5934:9;5925:7;5921:23;5917:33;5914:2;;;-1:-1;;5953:12;5914:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6005:63;-1:-1;6105:2;6144:22;;;72:20;97:33;72:20;97:33;:::i;:::-;6113:63;-1:-1;6213:2;6252:22;;72:20;97:33;72:20;97:33;:::i;:::-;6221:63;-1:-1;6321:2;6360:22;;72:20;97:33;72:20;97:33;:::i;:::-;6329:63;-1:-1;6429:3;6469:22;;4054:20;;-1:-1;6538:3;6578:22;;72:20;97:33;72:20;97:33;:::i;:::-;6547:63;-1:-1;6675:3;6660:19;;6647:33;6700:18;6689:30;;;6686:2;;;-1:-1;;6722:12;6686:2;6798:6;6787:9;6783:22;;;1935:3;1928:4;1920:6;1916:17;1912:27;1902:2;;-1:-1;;1943:12;1902:2;1990:6;1977:20;6700:18;35270:6;35267:30;35264:2;;;-1:-1;;35300:12;35264:2;2012:65;35373:9;35354:17;;-1:-1;;35350:33;35431:15;;2012:65;:::i;:::-;2003:74;;2097:6;2090:5;2083:21;2201:3;6105:2;2192:6;2125;2183:16;;2180:25;2177:2;;;-1:-1;;2208:12;2177:2;39298:6;6105:2;2125:6;2121:17;6105:2;2159:5;2155:16;39275:30;-1:-1;6105:2;39345:6;2159:5;39336:16;;39329:27;;6742:73;;;;;;5908:923;;;;;;;;;;:::o;6838:392::-;;6978:2;;6966:9;6957:7;6953:23;6949:32;6946:2;;;-1:-1;;6984:12;6946:2;7035:17;7029:24;7073:18;7065:6;7062:30;7059:2;;;-1:-1;;7095:12;7059:2;7182: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;;;4202:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;7115:99;6940:290;-1:-1;;;;;;;6940:290::o;7237:235::-;;7338:2;7326:9;7317:7;7313:23;7309:32;7306:2;;;-1:-1;;7344:12;7306:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;7479:257::-;;7591:2;7579:9;7570:7;7566:23;7562:32;7559:2;;;-1:-1;;7597:12;7559:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;8047:367::-;;;8171:2;8159:9;8150:7;8146:23;8142:32;8139:2;;;-1:-1;;8177:12;8139:2;8235:17;8222:31;8273:18;;8265:6;8262:30;8259:2;;;-1:-1;;8295:12;8259:2;8381:6;8370:9;8366:22;;;1602:3;1595:4;1587:6;1583:17;1579:27;1569:2;;-1:-1;;1610:12;1569:2;1653:6;1640:20;8273:18;1672:6;1669:30;1666:2;;;-1:-1;;1702:12;1666:2;1797:3;8171:2;1777:17;1738:6;1763:32;;1760:41;1757:2;;;-1:-1;;1804:12;1757:2;8171;1734:17;;;;;8315:83;;-1:-1;8133:281;;-1:-1;;;;8133:281::o;8421:324::-;;8566:3;;8554:9;8545:7;8541:23;8537:33;8534:2;;;-1:-1;;8573:12;8534:2;2479:22;8566:3;2479:22;:::i;:::-;2470:31;;2625:22;4202:13;2575:16;2568:86;2721:2;2790:9;2786:22;4202:13;2721:2;2740:5;2736:16;2729:86;2881:2;2950:9;2946:22;4202:13;2881:2;2900:5;2896:16;2889:86;3049:2;3118:9;3114:22;4202:13;3049:2;3068:5;3064:16;3057:86;3217:3;3287:9;3283:22;4202:13;3217:3;3237:5;3233:16;3226:86;3379:3;3449:9;3445:22;4202:13;3379:3;3399:5;3395:16;3388:86;3540:3;3610:9;3606:22;4202:13;3540:3;3560:5;3556:16;3549:86;3701:3;3771:9;3767:22;4202:13;3701:3;3721:5;3717:16;3710:86;3862:3;;3934:9;3930:22;4202:13;3862:3;3882:5;3878:18;3871:88;;8625:104;;;;8528:217;;;;:::o;8752:241::-;;8856:2;8844:9;8835:7;8831:23;8827:32;8824:2;;;-1:-1;;8862:12;8824:2;-1:-1;4054:20;;8818:175;-1:-1;8818:175::o;9000:263::-;;9115:2;9103:9;9094:7;9090:23;9086:32;9083:2;;;-1:-1;;9121:12;9083:2;-1:-1;4202:13;;9077:186;-1:-1;9077:186::o;11374:660::-;11737:21;11779:1;11764:258;36291:4;11786:1;11783:13;11764:258;;;11850:13;;18630:37;;9615:4;9606:14;;;;36658;;;;11811:1;11804:9;11764:258;;;11768:14;;11486:548;;:::o;13491:347::-;;13636:5;36008:12;37040:6;37035:3;37028:19;13730:52;13775:6;37077:4;37072:3;37068:14;37077:4;13756:5;13752:16;13730:52;:::i;:::-;35373:9;40028:14;-1:-1;;40024:28;13794:39;;;;37077:4;13794:39;;13583:255;-1:-1;;13583:255::o;18799:271::-;;12313:5;36008:12;12424:52;12469:6;12464:3;12457:4;12450:5;12446:16;12424:52;:::i;:::-;12488:16;;;;;18933:137;-1:-1;;18933:137::o;19077:222::-;-1:-1;;;;;37645:54;;;;9695:37;;19204:2;19189:18;;19175:124::o;19306:333::-;-1:-1;;;;;37645:54;;;9695:37;;37645:54;;19625:2;19610:18;;9695:37;19461:2;19446:18;;19432:207::o;19646:980::-;-1:-1;;;;;37645:54;;;9695:37;;37645:54;;;20126:2;20111:18;;9695:37;37645:54;;;20209:2;20194:18;;9695:37;37645:54;;;20292:2;20277:18;;9695:37;20375:3;20360:19;;18630:37;;;37645:54;;37656:42;20444:19;;9695:37;19961:3;20497;20482:19;;20475:49;;;19646:980;;20538:78;;19946:19;;20602:6;20538:78;:::i;:::-;20530:86;19932:694;-1:-1;;;;;;;;;19932:694::o;20633:526::-;-1:-1;;;;;37645:54;;9695:37;;20856:3;20841:19;;20953:118;21067:2;21052:18;;21043:6;20953:118;:::i;:::-;12134:5;37875:13;37868:21;21144:3;21133:9;21129:19;12107:34;20827:332;;;;;;:::o;21166:554::-;-1:-1;;;;;37645:54;;9695:37;;21403:3;21388:19;;21500:118;21614:2;21599:18;;21590:6;21500:118;:::i;:::-;13139:5;21705:3;21694:9;21690:19;13088:58;21374:346;;;;;;:::o;21727:321::-;-1:-1;;;;;37645:54;;;;9695:37;;37875:13;37868:21;22034:2;22019:18;;12107:34;21876:2;21861:18;;21847:201::o;22055:349::-;-1:-1;;;;;37645:54;;;;9695:37;;22390:2;22375:18;;13088:58;22218:2;22203:18;;22189:215::o;22751:210::-;37875:13;;37868:21;12107:34;;22872:2;22857:18;;22843:118::o;23749:238::-;13088:58;;;23884:2;23869:18;;23855:132::o;23994:330::-;;24151:2;24172:17;24165:47;37040:6;24151:2;24140:9;24136:18;37028:19;39298:6;39293:3;37068:14;24140:9;37068:14;39275:30;39336:16;;;37068:14;39336:16;;;39329:27;;;;35373:9;40028:14;;;-1:-1;;40024:28;13438:39;;;24122:202;-1:-1;24122:202::o;24331:310::-;;24478:2;24499:17;24492:47;24553:78;24478:2;24467:9;24463:18;24617:6;24553:78;:::i;24648:416::-;24848:2;24862:47;;;14070:2;24833:18;;;37028:19;-1:-1;;;37068:14;;;14086:34;14139:12;;;24819:245::o;25071:416::-;25271:2;25285:47;;;14390:1;25256:18;;;37028:19;-1:-1;;;37068:14;;;14405:28;14452:12;;;25242:245::o;25494:416::-;25694:2;25708:47;;;14703:2;25679:18;;;37028:19;14739:29;37068:14;;;14719:50;14788:12;;;25665:245::o;25917:416::-;26117:2;26131:47;;;15039:2;26102:18;;;37028:19;-1:-1;;;37068:14;;;15055:35;15109:12;;;26088:245::o;26340:416::-;26540:2;26554:47;;;15360:2;26525:18;;;37028:19;-1:-1;;;37068:14;;;15376:38;15433:12;;;26511:245::o;26763:416::-;26963:2;26977:47;;;15684:2;26948:18;;;37028:19;15720:30;37068:14;;;15700:51;15770:12;;;26934:245::o;27186:416::-;27386:2;27400:47;;;16021:2;27371:18;;;37028:19;16057:34;37068:14;;;16037:55;-1:-1;;;16112:12;;;16105:25;16149:12;;;27357:245::o;27609:416::-;27809:2;27823:47;;;16400:1;27794:18;;;37028:19;-1:-1;;;37068:14;;;16415:29;16463:12;;;27780:245::o;28032:416::-;28232:2;28246:47;;;16714:1;28217:18;;;37028:19;-1:-1;;;37068:14;;;16729:30;16778:12;;;28203:245::o;28455:416::-;28655:2;28669:47;;;17029:2;28640:18;;;37028:19;17065:31;37068:14;;;17045:52;17116:12;;;28626:245::o;28878:416::-;29078:2;29092:47;;;17367:2;29063:18;;;37028:19;-1:-1;;;37068:14;;;17383:34;17436:12;;;29049:245::o;29301:416::-;29501:2;29515:47;;;17687:2;29486:18;;;37028:19;17723:34;37068:14;;;17703:55;-1:-1;;;17778:12;;;17771:34;17824:12;;;29472:245::o;29724:416::-;29924:2;29938:47;;;18075:2;29909:18;;;37028:19;-1:-1;;;37068:14;;;18091:33;18143:12;;;29895:245::o;30147:416::-;30347:2;30361:47;;;18394:2;30332:18;;;37028:19;18430:34;37068:14;;;18410:55;-1:-1;;;18485:12;;;18478:46;18543:12;;;30318:245::o;30799:481::-;;31004:2;30993:9;30989:18;18660:5;18637:3;18630:37;31122:2;31004;31122;31111:9;31107:18;31100:48;31162:108;10088:5;36008:12;37040:6;37035:3;37028:19;37068:14;30993:9;37068:14;10100:93;;31122:2;10264:5;35578:14;10276:21;;-1:-1;10303:260;10328:6;10325:1;10322:13;10303:260;;;10389:13;;-1:-1;;;;;37645:54;9695:37;;36658:14;;;;9424;;;;6700:18;10343:9;10303:260;;;-1:-1;31154:116;;30975:305;-1:-1;;;;;;;30975:305::o;31287:321::-;18630:37;;;37875:13;37868:21;31594:2;31579:18;;12107:34;31436:2;31421:18;;31407:201::o;31615:810::-;;31901:3;31890:9;31886:19;18660:5;18637:3;18630:37;32066:2;18660:5;32066:2;32055:9;32051:18;18630:37;31901:3;32103:2;32092:9;32088:18;32081:48;32143:105;10811:5;36155:12;37040:6;37035:3;37028:19;37068:14;31890:9;37068:14;10823:93;;35741:3;-1:-1;35731:14;32066:2;-1:-1;35760:18;10996:21;;-1:-1;11023:288;11048:6;11045:1;11042:13;11023:288;;;39936:11;;-1:-1;;;;;37645:54;9695:37;;6700:18;36770:14;;;;9424;;;;11063:9;11023:288;;;-1:-1;;;;;;;37645:54;;;;32327:2;32312:18;;9695:37;-1:-1;;;32410:3;32395:19;18630:37;32135:113;31872:553;-1:-1;;;31872:553::o;32432:432::-;18630:37;;;32773:2;32758:18;;18630:37;;;;37875:13;37868:21;32850:2;32835:18;;12107:34;32609:2;32594:18;;32580:284::o;32871:444::-;18630:37;;;33218:2;33203:18;;18630:37;;;;33301:2;33286:18;;18630:37;33054:2;33039:18;;33025:290::o;33322:556::-;18630:37;;;33698:2;33683:18;;18630:37;;;;33781:2;33766:18;;18630:37;33864:2;33849:18;;18630:37;33533:3;33518:19;;33504:374::o;33885:668::-;18630:37;;;34289:2;34274:18;;18630:37;;;;34372:2;34357:18;;18630:37;;;;34455:2;34440:18;;18630:37;34538:3;34523:19;;18630:37;34124:3;34109:19;;34095:458::o;34560:256::-;34622:2;34616:9;34648:17;;;34723:18;34708:34;;34744:22;;;34705:62;34702:2;;;34780:1;;34770:12;34702:2;34622;34789:22;34600:216;;-1:-1;34600:216::o;34823:304::-;;34982:18;34974:6;34971:30;34968:2;;;-1:-1;;35004:12;34968:2;-1:-1;35049:4;35037:17;;;35102:15;;34905:222::o;39371:268::-;39436:1;39443:101;39457:6;39454:1;39451:13;39443:101;;;39524:11;;;39518:18;39505:11;;;39498:39;39479:2;39472:10;39443:101;;;39559:6;39556:1;39553:13;39550:2;;;-1:-1;;39436:1;39606:16;;39599:27;39420:219::o;40175:117::-;-1:-1;;;;;37645:54;;40234:35;;40224:2;;40283:1;;40273:12;40299:111;40380:5;37875:13;37868:21;40358:5;40355:32;40345:2;;40401:1;;40391:12
Swarm Source
ipfs://fca4a4d0f2c17705e5fad47fc9b7d6ee7655bcd68c077594bf007c62a3a95c81
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.