More Info
Private Name Tags
ContractCreator
Latest 13 from a total of 13 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Clone Aave Lende... | 15491904 | 931 days ago | IN | 0 ETH | 0.00838965 | ||||
Clone Aave Lende... | 15484507 | 932 days ago | IN | 0 ETH | 0.00558711 | ||||
Clone Aave Lende... | 15346391 | 954 days ago | IN | 0 ETH | 0.00537151 | ||||
Harvest | 13010709 | 1322 days ago | IN | 0 ETH | 0.03797927 | ||||
Harvest | 12941123 | 1333 days ago | IN | 0 ETH | 0.04069081 | ||||
Harvest | 12870695 | 1344 days ago | IN | 0 ETH | 0.02449677 | ||||
Harvest | 12805195 | 1354 days ago | IN | 0 ETH | 0.00907288 | ||||
Harvest | 12728822 | 1366 days ago | IN | 0 ETH | 0.01165933 | ||||
Harvest | 12653825 | 1378 days ago | IN | 0 ETH | 0.02086762 | ||||
Harvest | 12587589 | 1388 days ago | IN | 0 ETH | 0.01419447 | ||||
Harvest | 12517414 | 1399 days ago | IN | 0 ETH | 0.03532023 | ||||
Harvest | 12447300 | 1410 days ago | IN | 0 ETH | 0.0913264 | ||||
Harvest | 12373493 | 1421 days ago | IN | 0 ETH | 0.01206123 |
Latest 11 internal transactions
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x3d602d80 | 15849936 | 879 days ago | Contract Creation | 0 ETH | |||
0x3d602d80 | 15491904 | 931 days ago | Contract Creation | 0 ETH | |||
0x3d602d80 | 15484507 | 932 days ago | Contract Creation | 0 ETH | |||
0x3d602d80 | 15346391 | 954 days ago | Contract Creation | 0 ETH | |||
- | 14627575 | 1070 days ago | Contract Creation | 0 ETH | |||
- | 14329261 | 1116 days ago | Contract Creation | 0 ETH | |||
- | 13513457 | 1244 days ago | Contract Creation | 0 ETH | |||
- | 12815108 | 1352 days ago | Contract Creation | 0 ETH | |||
- | 12729477 | 1366 days ago | Contract Creation | 0 ETH | |||
- | 12322484 | 1429 days ago | Contract Creation | 0 ETH | |||
- | 12321544 | 1429 days ago | Contract Creation | 0 ETH |
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:
GenericAave
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-26 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs library DataTypes { // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties. struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; //the current stable borrow rate. Expressed in ray uint128 currentStableBorrowRate; uint40 lastUpdateTimestamp; //tokens addresses address aTokenAddress; address stableDebtTokenAddress; address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //the id of the reserve. Represents the position in the list of the active reserves uint8 id; } struct ReserveConfigurationMap { //bit 0-15: LTV //bit 16-31: Liq. threshold //bit 32-47: Liq. bonus //bit 48-55: Decimals //bit 56: Reserve is active //bit 57: reserve is frozen //bit 58: borrowing is enabled //bit 59: stable rate borrowing enabled //bit 60-63: reserved //bit 64-79: reserve factor uint256 data; } struct UserConfigurationMap { uint256 data; } enum InterestRateMode {NONE, STABLE, VARIABLE} } struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: IAaveIncentivesController interface IAaveIncentivesController { /** * @dev Returns the total of rewards of an user, already accrued + not yet accrued * @param user The address of the user * @return The rewards **/ function getRewardsBalance(address[] calldata assets, address user) external view returns (uint256); /** * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards * @param amount Amount of rewards to claim * @param to Address that will be receiving the rewards * @return Rewards claimed **/ function claimRewards( address[] calldata assets, uint256 amount, address to ) external returns (uint256); /** * @dev Claims reward for an user on behalf, on all the assets of the lending pool, accumulating the pending rewards. The caller must * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager * @param amount Amount of rewards to claim * @param user Address to check and claim rewards * @param to Address that will be receiving the rewards * @return Rewards claimed **/ function claimRewardsOnBehalf( address[] calldata assets, uint256 amount, address user, address to ) external returns (uint256); /** * @dev returns the unclaimed rewards of the user * @param user the address of the user * @return the unclaimed user rewards */ function getUserUnclaimedRewards(address user) external view returns (uint256); /** * @dev for backward compatibility with previous implementation of the Incentives controller */ function REWARD_TOKEN() external view returns (address); function getDistributionEnd() external view returns (uint256); function getAssetData(address asset) external view returns (uint256, uint256, uint256); } // Part: IBaseStrategy interface IBaseStrategy { function apiVersion() external pure returns (string memory); function name() external pure returns (string memory); function vault() external view returns (address); function keeper() external view returns (address); function tendTrigger(uint256 callCost) external view returns (bool); function tend() external; function harvestTrigger(uint256 callCost) external view returns (bool); function harvest() external; function strategist() external view returns (address); } // Part: IGenericLender interface IGenericLender { function lenderName() external view returns (string memory); function nav() external view returns (uint256); function strategy() external view returns (address); function apr() external view returns (uint256); function weightedApr() external view returns (uint256); function withdraw(uint256 amount) external returns (uint256); function emergencyWithdraw(uint256 amount) external; function deposit() external; function withdrawAll() external returns (bool); function hasAssets() external view returns (bool); function aprAfterDeposit(uint256 amount) external view returns (uint256); function setDust(uint256 _dust) external; function sweep(address _token) external; } // Part: ILendingPoolAddressesProvider /** * @title LendingPoolAddressesProvider contract * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles * - Acting also as factory of proxies and admin of those, so with right to change its implementations * - Owned by the Aave Governance * @author Aave **/ interface ILendingPoolAddressesProvider { event MarketIdSet(string newMarketId); event LendingPoolUpdated(address indexed newAddress); event ConfigurationAdminUpdated(address indexed newAddress); event EmergencyAdminUpdated(address indexed newAddress); event LendingPoolConfiguratorUpdated(address indexed newAddress); event LendingPoolCollateralManagerUpdated(address indexed newAddress); event PriceOracleUpdated(address indexed newAddress); event LendingRateOracleUpdated(address indexed newAddress); event ProxyCreated(bytes32 id, address indexed newAddress); event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy); function getMarketId() external view returns (string memory); function setMarketId(string calldata marketId) external; function setAddress(bytes32 id, address newAddress) external; function setAddressAsProxy(bytes32 id, address impl) external; function getAddress(bytes32 id) external view returns (address); function getLendingPool() external view returns (address); function setLendingPoolImpl(address pool) external; function getLendingPoolConfigurator() external view returns (address); function setLendingPoolConfiguratorImpl(address configurator) external; function getLendingPoolCollateralManager() external view returns (address); function setLendingPoolCollateralManager(address manager) external; function getPoolAdmin() external view returns (address); function setPoolAdmin(address admin) external; function getEmergencyAdmin() external view returns (address); function setEmergencyAdmin(address admin) external; function getPriceOracle() external view returns (address); function setPriceOracle(address priceOracle) external; function getLendingRateOracle() external view returns (address); function setLendingRateOracle(address lendingRateOracle) external; } // Part: IReserveInterestRateStrategy /** * @title IReserveInterestRateStrategyInterface interface * @dev Interface for the calculation of the interest rates * @author Aave */ interface IReserveInterestRateStrategy { function baseVariableBorrowRate() external view returns (uint256); function getMaxVariableBorrowRate() external view returns (uint256); function calculateInterestRates( address reserve, uint256 utilizationRate, uint256 totalStableDebt, uint256 totalVariableDebt, uint256 averageStableBorrowRate, uint256 reserveFactor ) external view returns ( uint256 liquidityRate, uint256 stableBorrowRate, uint256 variableBorrowRate ); } // Part: IScaledBalanceToken interface IScaledBalanceToken { /** * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the * updated stored balance divided by the reserve's liquidity index at the moment of the update * @param user The user whose balance is calculated * @return The scaled balance of the user **/ function scaledBalanceOf(address user) external view returns (uint256); /** * @dev Returns the scaled balance of the user and the scaled total supply. * @param user The address of the user * @return The scaled balance of the user * @return The scaled balance and the scaled total supply **/ function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); /** * @dev Returns the scaled total supply of the variable debt token. Represents sum(debt/index) * @return The scaled total supply **/ function scaledTotalSupply() external view returns (uint256); } // Part: IStakedAave interface IStakedAave { function stake(address to, uint256 amount) external; function redeem(address to, uint256 amount) external; function cooldown() external; function claimRewards(address to, uint256 amount) external; function getTotalRewardsBalance(address) external view returns (uint256); function COOLDOWN_SECONDS() external view returns (uint256); function stakersCooldowns(address) external view returns (uint256); function UNSTAKE_WINDOW() 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]/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: ILendingPool interface ILendingPool { /** * @dev Emitted on deposit() * @param reserve The address of the underlying asset of the reserve * @param user The address initiating the deposit * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens * @param amount The amount deposited * @param referral The referral code used **/ event Deposit(address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint16 indexed referral); /** * @dev Emitted on withdraw() * @param reserve The address of the underlyng asset being withdrawn * @param user The address initiating the withdrawal, owner of aTokens * @param to Address that will receive the underlying * @param amount The amount to be withdrawn **/ event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); /** * @dev Emitted on borrow() and flashLoan() when debt needs to be opened * @param reserve The address of the underlying asset being borrowed * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just * initiator of the transaction on flashLoan() * @param onBehalfOf The address that will be getting the debt * @param amount The amount borrowed out * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable * @param borrowRate The numeric rate at which the user has borrowed * @param referral The referral code used **/ event Borrow( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint256 borrowRateMode, uint256 borrowRate, uint16 indexed referral ); /** * @dev Emitted on repay() * @param reserve The address of the underlying asset of the reserve * @param user The beneficiary of the repayment, getting his debt reduced * @param repayer The address of the user initiating the repay(), providing the funds * @param amount The amount repaid **/ event Repay(address indexed reserve, address indexed user, address indexed repayer, uint256 amount); /** * @dev Emitted on swapBorrowRateMode() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user swapping his rate mode * @param rateMode The rate mode that the user wants to swap to **/ event Swap(address indexed reserve, address indexed user, uint256 rateMode); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); /** * @dev Emitted on rebalanceStableBorrowRate() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user for which the rebalance has been executed **/ event RebalanceStableBorrowRate(address indexed reserve, address indexed user); /** * @dev Emitted on flashLoan() * @param target The address of the flash loan receiver contract * @param initiator The address initiating the flash loan * @param asset The address of the asset being flash borrowed * @param amount The amount flash borrowed * @param premium The fee flash borrowed * @param referralCode The referral code used **/ event FlashLoan( address indexed target, address indexed initiator, address indexed asset, uint256 amount, uint256 premium, uint16 referralCode ); /** * @dev Emitted when the pause is triggered. */ event Paused(); /** * @dev Emitted when the pause is lifted. */ event Unpaused(); /** * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via * LendingPoolCollateral manager using a DELEGATECALL * This allows to have the events in the generated ABI for LendingPool. * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator * @param liquidator The address of the liquidator * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, address indexed user, uint256 debtToCover, uint256 liquidatedCollateralAmount, address liquidator, bool receiveAToken ); /** * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal, * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it * gets added to the LendingPool ABI * @param reserve The address of the underlying asset of the reserve * @param liquidityRate The new liquidity rate * @param stableBorrowRate The new stable borrow rate * @param variableBorrowRate The new variable borrow rate * @param liquidityIndex The new liquidity index * @param variableBorrowIndex The new variable borrow index **/ event ReserveDataUpdated( address indexed reserve, uint256 liquidityRate, uint256 stableBorrowRate, uint256 variableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex ); /** * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. * - E.g. User deposits 100 USDC and gets in return 100 aUSDC * @param asset The address of the underlying asset to deposit * @param amount The amount to be deposited * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens * is a different wallet * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function deposit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; /** * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC * @param asset The address of the underlying asset to withdraw * @param amount The underlying amount to be withdrawn * - Send the value type(uint256).max in order to withdraw the whole aToken balance * @param to Address that will receive the underlying, same as msg.sender if the user * wants to receive it on his own wallet, or a different address if the beneficiary is a * different wallet * @return The final amount withdrawn **/ function withdraw( address asset, uint256 amount, address to ) external returns (uint256); /** * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower * already deposited enough collateral, or he was given enough allowance by a credit delegator on the * corresponding debt token (StableDebtToken or VariableDebtToken) * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet * and 100 stable/variable debt tokens, depending on the `interestRateMode` * @param asset The address of the underlying asset to borrow * @param amount The amount to be borrowed * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator * if he has been given credit delegation allowance **/ function borrow( address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf ) external; /** * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address * @param asset The address of the borrowed underlying asset previously borrowed * @param amount The amount to repay * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the * user calling the function if he wants to reduce/remove his own debt, or the address of any other * other borrower whose debt should be removed * @return The final amount repaid **/ function repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) external returns (uint256); /** * @dev Allows a borrower to swap his debt between stable and variable mode, or viceversa * @param asset The address of the underlying asset borrowed * @param rateMode The rate mode that the user wants to swap to **/ function swapBorrowRateMode(address asset, uint256 rateMode) external; /** * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. * - Users can be rebalanced if the following conditions are satisfied: * 1. Usage ratio is above 95% * 2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been * borrowed at a stable rate and depositors are not earning enough * @param asset The address of the underlying asset borrowed * @param user The address of the user to be rebalanced **/ function rebalanceStableBorrowRate(address asset, address user) external; /** * @dev Allows depositors to enable/disable a specific deposited asset as collateral * @param asset The address of the underlying asset deposited * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise **/ function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; /** * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ function liquidationCall( address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken ) external; /** * @dev Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration. * For further details please visit https://developers.aave.com * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface * @param assets The addresses of the assets being flash-borrowed * @param amounts The amounts amounts being flash-borrowed * @param modes Types of the debt to open if the flash loan is not returned: * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 * @param params Variadic packed params to pass to the receiver as extra information * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function flashLoan( address receiverAddress, address[] calldata assets, uint256[] calldata amounts, uint256[] calldata modes, address onBehalfOf, bytes calldata params, uint16 referralCode ) external; /** * @dev Returns the user account data across all the reserves * @param user The address of the user * @return totalCollateralETH the total collateral in ETH of the user * @return totalDebtETH the total debt in ETH of the user * @return availableBorrowsETH the borrowing power left of the user * @return currentLiquidationThreshold the liquidation threshold of the user * @return ltv the loan to value of the user * @return healthFactor the current health factor of the user **/ function getUserAccountData(address user) external view returns ( uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor ); function initReserve( address reserve, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress ) external; function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external; function setConfiguration(address reserve, uint256 configuration) external; /** * @dev Returns the configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The configuration of the reserve **/ function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory); /** * @dev Returns the configuration of the user across all the reserves * @param user The user address * @return The configuration of the user **/ function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory); /** * @dev Returns the normalized income normalized income of the reserve * @param asset The address of the underlying asset of the reserve * @return The reserve's normalized income */ function getReserveNormalizedIncome(address asset) external view returns (uint256); /** * @dev Returns the normalized variable debt per unit of asset * @param asset The address of the underlying asset of the reserve * @return The reserve normalized variable debt */ function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); /** * @dev Returns the state and configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The state of the reserve **/ function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); function finalizeTransfer( address asset, address from, address to, uint256 amount, uint256 balanceFromAfter, uint256 balanceToBefore ) external; function getReservesList() external view returns (address[] memory); function getAddressesProvider() external view returns (ILendingPoolAddressesProvider); function setPause(bool val) external; function paused() external view returns (bool); } // Part: IProtocolDataProvider interface IProtocolDataProvider { struct TokenData { string symbol; address tokenAddress; } function ADDRESSES_PROVIDER() external view returns (ILendingPoolAddressesProvider); function getAllReservesTokens() external view returns (TokenData[] memory); function getAllATokens() external view returns (TokenData[] memory); function getReserveConfigurationData(address asset) external view returns ( uint256 decimals, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus, uint256 reserveFactor, bool usageAsCollateralEnabled, bool borrowingEnabled, bool stableBorrowRateEnabled, bool isActive, bool isFrozen ); function getReserveData(address asset) external view returns ( uint256 availableLiquidity, uint256 totalStableDebt, uint256 totalVariableDebt, uint256 liquidityRate, uint256 variableBorrowRate, uint256 stableBorrowRate, uint256 averageStableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex, uint40 lastUpdateTimestamp ); function getUserReserveData(address asset, address user) external view returns ( uint256 currentATokenBalance, uint256 currentStableDebt, uint256 currentVariableDebt, uint256 principalStableDebt, uint256 scaledVariableDebt, uint256 stableBorrowRate, uint256 liquidityRate, uint40 stableRateLastUpdated, bool usageAsCollateralEnabled ); function getReserveTokensAddresses(address asset) external view returns ( address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress ); } // 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: iearn-finance/[email protected]/VaultAPI interface VaultAPI is IERC20 { function name() external view returns (string calldata); function symbol() external view returns (string calldata); function decimals() external view returns (uint256); function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: GenericLenderBase abstract contract GenericLenderBase is IGenericLender { using SafeERC20 for IERC20; VaultAPI public vault; address public override strategy; IERC20 public want; string public override lenderName; uint256 public dust; event Cloned(address indexed clone); constructor(address _strategy, string memory _name) public { _initialize(_strategy, _name); } function _initialize(address _strategy, string memory _name) internal { require(address(strategy) == address(0), "Lender already initialized"); strategy = _strategy; vault = VaultAPI(IBaseStrategy(strategy).vault()); want = IERC20(vault.token()); lenderName = _name; dust = 10000; want.safeApprove(_strategy, uint256(-1)); } function initialize(address _strategy, string memory _name) external virtual { _initialize(_strategy, _name); } function _clone(address _strategy, string memory _name) internal returns (address newLender) { // 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) newLender := create(0, clone_code, 0x37) } GenericLenderBase(newLender).initialize(_strategy, _name); emit Cloned(newLender); } function setDust(uint256 _dust) external virtual override management { dust = _dust; } function sweep(address _token) external virtual override management { address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).safeTransfer(vault.governance(), IERC20(_token).balanceOf(address(this))); } function protectedTokens() internal view virtual returns (address[] memory); //make sure to use modifier management() { require( msg.sender == address(strategy) || msg.sender == vault.governance() || msg.sender == IBaseStrategy(strategy).strategist(), "!management" ); _; } } // Part: IInitializableAToken /** * @title IInitializableAToken * @notice Interface for the initialize function on AToken * @author Aave **/ interface IInitializableAToken { /** * @dev Emitted when an aToken is initialized * @param underlyingAsset The address of the underlying asset * @param pool The address of the associated lending pool * @param treasury The address of the treasury * @param incentivesController The address of the incentives controller for this aToken * @param aTokenDecimals the decimals of the underlying * @param aTokenName the name of the aToken * @param aTokenSymbol the symbol of the aToken * @param params A set of encoded parameters for additional initialization **/ event Initialized( address indexed underlyingAsset, address indexed pool, address treasury, address incentivesController, uint8 aTokenDecimals, string aTokenName, string aTokenSymbol, bytes params ); /** * @dev Initializes the aToken * @param pool The address of the lending pool where this aToken will be used * @param treasury The address of the Aave treasury, receiving the fees on this aToken * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) * @param incentivesController The smart contract managing potential incentives distribution * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's * @param aTokenName The name of the aToken * @param aTokenSymbol The symbol of the aToken */ function initialize( ILendingPool pool, address treasury, address underlyingAsset, IAaveIncentivesController incentivesController, uint8 aTokenDecimals, string calldata aTokenName, string calldata aTokenSymbol, bytes calldata params ) external; } // Part: IAToken interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { /** * @dev Emitted after the mint action * @param from The address performing the mint * @param value The amount being * @param index The new liquidity index of the reserve **/ event Mint(address indexed from, uint256 value, uint256 index); /** * @dev Mints `amount` aTokens to `user` * @param user The address receiving the minted tokens * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve * @return `true` if the the previous balance of the user was 0 */ function mint( address user, uint256 amount, uint256 index ) external returns (bool); /** * @dev Emitted after aTokens are burned * @param from The owner of the aTokens, getting them burned * @param target The address that will receive the underlying * @param value The amount being burned * @param index The new liquidity index of the reserve **/ event Burn(address indexed from, address indexed target, uint256 value, uint256 index); /** * @dev Emitted during the transfer action * @param from The user whose tokens are being transferred * @param to The recipient * @param value The amount being transferred * @param index The new liquidity index of the reserve **/ event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); /** * @dev Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` * @param user The owner of the aTokens, getting them burned * @param receiverOfUnderlying The address that will receive the underlying * @param amount The amount being burned * @param index The new liquidity index of the reserve **/ function burn( address user, address receiverOfUnderlying, uint256 amount, uint256 index ) external; /** * @dev Mints aTokens to the reserve treasury * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve */ function mintToTreasury(uint256 amount, uint256 index) external; /** * @dev Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken * @param from The address getting liquidated, current owner of the aTokens * @param to The recipient * @param value The amount of tokens getting transferred **/ function transferOnLiquidation( address from, address to, uint256 value ) external; /** * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer * assets in borrow(), withdraw() and flashLoan() * @param user The recipient of the underlying * @param amount The amount getting transferred * @return The amount transferred **/ function transferUnderlyingTo(address user, uint256 amount) external returns (uint256); /** * @dev Invoked to execute actions on the aToken side after a repayment. * @param user The user executing the repayment * @param amount The amount getting repaid **/ function handleRepayment(address user, uint256 amount) external; /** * @dev Returns the address of the incentives controller contract **/ function getIncentivesController() external view returns (IAaveIncentivesController); /** * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) **/ function UNDERLYING_ASSET_ADDRESS() external view returns (address); } // File: GenericAave.sol /******************** * A lender plugin for LenderYieldOptimiser for any erc20 asset on Aave * Made by SamPriestley.com & jmonteer * https://github.com/Grandthrax/yearnv2/blob/master/contracts/GenericLender/GenericAave.sol * ********************* */ contract GenericAave is GenericLenderBase { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; IProtocolDataProvider public constant protocolDataProvider = IProtocolDataProvider(address(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d)); IAToken public aToken; IStakedAave public constant stkAave = IStakedAave(0x4da27a545c0c5B758a6BA100e3a049001de870f5); address public keep3r; bool public isIncentivised; uint16 internal constant DEFAULT_REFERRAL = 179; // jmonteer's referral code uint16 internal customReferral; address public constant WETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address public constant AAVE = address(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); IUniswapV2Router02 public constant router = IUniswapV2Router02(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)); uint256 constant internal SECONDS_IN_YEAR = 365 days; constructor( address _strategy, string memory name, IAToken _aToken, bool _isIncentivised ) public GenericLenderBase(_strategy, name) { _initialize(_aToken, _isIncentivised); } function initialize(IAToken _aToken, bool _isIncentivised) external { _initialize(_aToken, _isIncentivised); } function cloneAaveLender( address _strategy, string memory _name, IAToken _aToken, bool _isIncentivised ) external returns (address newLender) { newLender = _clone(_strategy, _name); GenericAave(newLender).initialize(_aToken, _isIncentivised); } // for the management to activate / deactivate incentives functionality function setIsIncentivised(bool _isIncentivised) external management { // NOTE: if the aToken is not incentivised, getIncentivesController() might revert (aToken won't implement it) // to avoid calling it, we use the OR and lazy evaluation require(!_isIncentivised || address(aToken.getIncentivesController()) != address(0), "!aToken does not have incentives controller set up"); isIncentivised = _isIncentivised; } function setReferralCode(uint16 _customReferral) external management { require(_customReferral != 0, "!invalid referral code"); customReferral = _customReferral; } function setKeep3r(address _keep3r) external management { keep3r = _keep3r; } function withdraw(uint256 amount) external override management returns (uint256) { return _withdraw(amount); } //emergency withdraw. sends balance plus amount to governance function emergencyWithdraw(uint256 amount) external override management { _lendingPool().withdraw(address(want), amount, address(this)); want.safeTransfer(vault.governance(), want.balanceOf(address(this))); } function deposit() external override management { uint256 balance = want.balanceOf(address(this)); _deposit(balance); } function withdrawAll() external override management returns (bool) { uint256 invested = _nav(); uint256 returned = _withdraw(invested); return returned >= invested; } function startCooldown() external management { // for emergency cases IStakedAave(stkAave).cooldown(); // it will revert if balance of stkAave == 0 } function nav() external view override returns (uint256) { return _nav(); } function underlyingBalanceStored() public view returns (uint256 balance) { balance = aToken.balanceOf(address(this)); } function apr() external view override returns (uint256) { return _apr(); } function weightedApr() external view override returns (uint256) { uint256 a = _apr(); return a.mul(_nav()); } // calculates APR from Liquidity Mining Program function _incentivesRate(uint256 totalLiquidity) public view returns (uint256) { // only returns != 0 if the incentives are in place at the moment. // it will fail if the isIncentivised is set to true but there is no incentives if(isIncentivised && block.timestamp < _incentivesController().getDistributionEnd()) { uint256 _emissionsPerSecond; (, _emissionsPerSecond, ) = _incentivesController().getAssetData(address(aToken)); if(_emissionsPerSecond > 0) { uint256 emissionsInWant = _AAVEtoWant(_emissionsPerSecond); // amount of emissions in want uint256 incentivesRate = emissionsInWant.mul(SECONDS_IN_YEAR).mul(1e18).div(totalLiquidity); // APRs are in 1e18 return incentivesRate.mul(9_500).div(10_000); // 95% of estimated APR to avoid overestimations } } return 0; } function aprAfterDeposit(uint256 extraAmount) external view override returns (uint256) { // i need to calculate new supplyRate after Deposit (when deposit has not been done yet) DataTypes.ReserveData memory reserveData = _lendingPool().getReserveData(address(want)); (uint256 availableLiquidity, uint256 totalStableDebt, uint256 totalVariableDebt, , , , uint256 averageStableBorrowRate, , , ) = protocolDataProvider.getReserveData(address(want)); uint256 newLiquidity = availableLiquidity.add(extraAmount); (, , , , uint256 reserveFactor, , , , , ) = protocolDataProvider.getReserveConfigurationData(address(want)); (uint256 newLiquidityRate, , ) = IReserveInterestRateStrategy(reserveData.interestRateStrategyAddress).calculateInterestRates( address(want), newLiquidity, totalStableDebt, totalVariableDebt, averageStableBorrowRate, reserveFactor ); uint256 incentivesRate = _incentivesRate(newLiquidity.add(totalStableDebt).add(totalVariableDebt)); // total supplied liquidity in Aave v2 return newLiquidityRate.div(1e9).add(incentivesRate); // divided by 1e9 to go from Ray to Wad } function hasAssets() external view override returns (bool) { return aToken.balanceOf(address(this)) > 0; } // Only for incentivised aTokens // this is a manual trigger to claim rewards once each 10 days // only callable if the token is incentivised by Aave Governance (_checkCooldown returns true) function harvest() external keepers{ require(_checkCooldown(), "!conditions are not met"); // redeem AAVE from stkAave uint256 stkAaveBalance = IERC20(address(stkAave)).balanceOf(address(this)); if(stkAaveBalance > 0) { stkAave.redeem(address(this), stkAaveBalance); } // sell AAVE for want uint256 aaveBalance = IERC20(AAVE).balanceOf(address(this)); _sellAAVEForWant(aaveBalance); // deposit want in lending protocol uint256 balance = want.balanceOf(address(this)); if(balance > 0) { _deposit(balance); } // claim rewards address[] memory assets = new address[](1); assets[0] = address(aToken); uint256 pendingRewards = _incentivesController().getRewardsBalance(assets, address(this)); if(pendingRewards > 0) { _incentivesController().claimRewards(assets, pendingRewards, address(this)); } // request start of cooldown period if(IERC20(address(stkAave)).balanceOf(address(this)) > 0) { stkAave.cooldown(); } } function harvestTrigger(uint256 callcost) external view returns (bool) { return _checkCooldown(); } function _initialize(IAToken _aToken, bool _isIncentivised) internal { require(address(aToken) == address(0), "GenericAave already initialized"); require(!_isIncentivised || address(_aToken.getIncentivesController()) != address(0), "!aToken does not have incentives controller set up"); isIncentivised = _isIncentivised; aToken = _aToken; require(_lendingPool().getReserveData(address(want)).aTokenAddress == address(_aToken), "WRONG ATOKEN"); IERC20(address(want)).safeApprove(address(_lendingPool()), type(uint256).max); } function _nav() internal view returns (uint256) { return want.balanceOf(address(this)).add(underlyingBalanceStored()); } function _apr() internal view returns (uint256) { uint256 liquidityRate = uint256(_lendingPool().getReserveData(address(want)).currentLiquidityRate).div(1e9);// dividing by 1e9 to pass from ray to wad (uint256 availableLiquidity, uint256 totalStableDebt, uint256 totalVariableDebt, , , , , , , ) = protocolDataProvider.getReserveData(address(want)); uint256 incentivesRate = _incentivesRate(availableLiquidity.add(totalStableDebt).add(totalVariableDebt)); // total supplied liquidity in Aave v2 return liquidityRate.add(incentivesRate); } //withdraw an amount including any want balance function _withdraw(uint256 amount) internal returns (uint256) { uint256 balanceUnderlying = aToken.balanceOf(address(this)); uint256 looseBalance = want.balanceOf(address(this)); uint256 total = balanceUnderlying.add(looseBalance); if (amount > total) { //cant withdraw more than we own amount = total; } if (looseBalance >= amount) { want.safeTransfer(address(strategy), amount); return amount; } //not state changing but OK because of previous call uint256 liquidity = want.balanceOf(address(aToken)); if (liquidity > 1) { uint256 toWithdraw = amount.sub(looseBalance); if (toWithdraw <= liquidity) { //we can take all _lendingPool().withdraw(address(want), toWithdraw, address(this)); } else { //take all we can _lendingPool().withdraw(address(want), liquidity, address(this)); } } looseBalance = want.balanceOf(address(this)); want.safeTransfer(address(strategy), looseBalance); return looseBalance; } function _deposit(uint256 amount) internal { ILendingPool lp = _lendingPool(); // NOTE: check if allowance is enough and acts accordingly // allowance might not be enough if // i) initial allowance has been used (should take years) // ii) lendingPool contract address has changed (Aave updated the contract address) if(want.allowance(address(this), address(lp)) < amount){ IERC20(address(want)).safeApprove(address(lp), 0); IERC20(address(want)).safeApprove(address(lp), type(uint256).max); } uint16 referral; uint16 _customReferral = customReferral; if(_customReferral != 0) { referral = _customReferral; } else { referral = DEFAULT_REFERRAL; } lp.deposit(address(want), amount, address(this), referral); } function _lendingPool() internal view returns (ILendingPool lendingPool) { lendingPool = ILendingPool(protocolDataProvider.ADDRESSES_PROVIDER().getLendingPool()); } function _checkCooldown() internal view returns (bool) { if(!isIncentivised) { return false; } uint256 cooldownStartTimestamp = IStakedAave(stkAave).stakersCooldowns(address(this)); uint256 COOLDOWN_SECONDS = IStakedAave(stkAave).COOLDOWN_SECONDS(); uint256 UNSTAKE_WINDOW = IStakedAave(stkAave).UNSTAKE_WINDOW(); if(block.timestamp >= cooldownStartTimestamp.add(COOLDOWN_SECONDS)) { return block.timestamp.sub(cooldownStartTimestamp.add(COOLDOWN_SECONDS)) <= UNSTAKE_WINDOW || cooldownStartTimestamp == 0; } else { return false; } } function _AAVEtoWant(uint256 _amount) internal view returns (uint256) { if(_amount == 0) { return 0; } address[] memory path; if(address(want) == address(WETH)) { path = new address[](2); path[0] = address(AAVE); path[1] = address(want); } else { path = new address[](3); path[0] = address(AAVE); path[1] = address(WETH); path[2] = address(want); } uint256[] memory amounts = router.getAmountsOut(_amount, path); return amounts[amounts.length - 1]; } function _sellAAVEForWant(uint256 _amount) internal { if (_amount == 0) { return; } address[] memory path; if(address(want) == address(WETH)) { path = new address[](2); path[0] = address(AAVE); path[1] = address(want); } else { path = new address[](3); path[0] = address(AAVE); path[1] = address(WETH); path[2] = address(want); } if(IERC20(AAVE).allowance(address(this), address(router)) < _amount) { IERC20(AAVE).safeApprove(address(router), 0); IERC20(AAVE).safeApprove(address(router), type(uint256).max); } router.swapExactTokensForTokens( _amount, 0, path, address(this), now ); } function _incentivesController() internal view returns (IAaveIncentivesController) { if(isIncentivised) { return aToken.getIncentivesController(); } else { return IAaveIncentivesController(0); } } function protectedTokens() internal view override returns (address[] memory) { address[] memory protected = new address[](2); protected[0] = address(want); protected[1] = address(aToken); return protected; } modifier keepers() { require( msg.sender == address(keep3r) || msg.sender == address(strategy) || msg.sender == vault.governance() || msg.sender == IBaseStrategy(strategy).strategist(), "!keepers" ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"contract IAToken","name":"_aToken","type":"address"},{"internalType":"bool","name":"_isIncentivised","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clone","type":"address"}],"name":"Cloned","type":"event"},{"inputs":[],"name":"AAVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"}],"name":"_incentivesRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aToken","outputs":[{"internalType":"contract IAToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"extraAmount","type":"uint256"}],"name":"aprAfterDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"contract IAToken","name":"_aToken","type":"address"},{"internalType":"bool","name":"_isIncentivised","type":"bool"}],"name":"cloneAaveLender","outputs":[{"internalType":"address","name":"newLender","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dust","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callcost","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAToken","name":"_aToken","type":"address"},{"internalType":"bool","name":"_isIncentivised","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isIncentivised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keep3r","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lenderName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolDataProvider","outputs":[{"internalType":"contract IProtocolDataProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dust","type":"uint256"}],"name":"setDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isIncentivised","type":"bool"}],"name":"setIsIncentivised","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keep3r","type":"address"}],"name":"setKeep3r","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_customReferral","type":"uint16"}],"name":"setReferralCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stkAave","outputs":[{"internalType":"contract IStakedAave","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategy","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":"underlyingBalanceStored","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weightedApr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620059f3380380620059f3833981016040819052620000349162000948565b83836200004282826200005b565b50620000519050828262000223565b5050505062000e3c565b6001546001600160a01b031615620000905760405162461bcd60e51b8152600401620000879062000d92565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117918290556040805163fbfa77cf60e01b81529051929091169163fbfa77cf91600480820192602092909190829003018186803b158015620000ed57600080fd5b505afa15801562000102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000128919062000922565b600080546001600160a01b0319166001600160a01b03928316179081905560408051637e062a3560e11b81529051919092169163fc0c546a916004808301926020929190829003018186803b1580156200018157600080fd5b505afa15801562000196573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bc919062000922565b600280546001600160a01b0319166001600160a01b03929092169190911790558051620001f1906003906020840190620007fa565b506127106004556002546200021f906001600160a01b03168360001962000427602090811b6200258817901c565b5050565b6005546001600160a01b0316156200024f5760405162461bcd60e51b8152600401620000879062000c7d565b801580620002e4575060006001600160a01b0316826001600160a01b03166375d264136040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029d57600080fd5b505afa158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d8919062000922565b6001600160a01b031614155b620003035760405162461bcd60e51b8152600401620000879062000c05565b6006805460ff60a01b1916600160a01b83151502179055600580546001600160a01b0319166001600160a01b0384169081179091556200034262000535565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a7592620003759291169060040162000b89565b6101806040518083038186803b1580156200038f57600080fd5b505afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000a3c565b60e001516001600160a01b031614620003f75760405162461bcd60e51b8152600401620000879062000c57565b6200021f6200040562000535565b6002546001600160a01b03169060001962000427602090811b6200258817901c565b801580620004b65750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000460903090869060040162000b9d565b60206040518083038186803b1580156200047957600080fd5b505afa1580156200048e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b4919062000b52565b155b620004d55760405162461bcd60e51b8152600401620000879062000d35565b620005308363095ea7b360e01b8484604051602401620004f792919062000bb7565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200063916565b505050565b600073057835ad21a177dbdd3090bb1cae03eacf78fc6d6001600160a01b0316630542975c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200058557600080fd5b505afa1580156200059a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005c0919062000922565b6001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f957600080fd5b505afa1580156200060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000634919062000922565b905090565b606062000695826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620006d560201b62002687179092919060201c565b805190915015620005305780806020019051810190620006b6919062000a1a565b620005305760405162461bcd60e51b8152600401620000879062000ceb565b6060620006e68484600085620006ee565b949350505050565b6060620006fb85620007c0565b6200071a5760405162461bcd60e51b8152600401620000879062000cb4565b60006060866001600160a01b0316858760405162000739919062000b6b565b60006040518083038185875af1925050503d806000811462000778576040519150601f19603f3d011682016040523d82523d6000602084013e6200077d565b606091505b5091509150811562000793579150620006e69050565b805115620007a45780518082602001fd5b8360405162461bcd60e51b815260040162000087919062000bd0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590620006e6575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200083d57805160ff19168380011785556200086d565b828001600101855582156200086d579182015b828111156200086d57825182559160200191906001019062000850565b506200087b9291506200087f565b5090565b5b808211156200087b576000815560010162000880565b8051620008a38162000e23565b92915050565b80518015158114620008a357600080fd5b600060208284031215620008cc578081fd5b620008d8602062000dc9565b9151825250919050565b80516001600160801b0381168114620008a357600080fd5b805164ffffffffff81168114620008a357600080fd5b805160ff81168114620008a357600080fd5b60006020828403121562000934578081fd5b8151620009418162000e23565b9392505050565b600080600080608085870312156200095e578283fd5b84516200096b8162000e23565b60208601519094506001600160401b038082111562000988578485fd5b818701915087601f8301126200099c578485fd5b815181811115620009ab578586fd5b620009c0601f8201601f191660200162000dc9565b9150808252886020828501011115620009d7578586fd5b620009ea81602084016020860162000df0565b509350620009fe9050866040870162000896565b915062000a0f8660608701620008a9565b905092959194509250565b60006020828403121562000a2c578081fd5b8151801515811462000941578182fd5b600061018080838503121562000a50578182fd5b62000a5b8162000dc9565b905062000a698484620008ba565b815262000a7a8460208501620008e2565b602082015262000a8e8460408501620008e2565b604082015262000aa28460608501620008e2565b606082015262000ab68460808501620008e2565b608082015262000aca8460a08501620008e2565b60a082015262000ade8460c08501620008fa565b60c082015262000af28460e0850162000896565b60e082015261010062000b088582860162000896565b9082015261012062000b1d8585830162000896565b9082015261014062000b328585830162000896565b9082015261016062000b478585830162000910565b908201529392505050565b60006020828403121562000b64578081fd5b5051919050565b6000825162000b7f81846020870162000df0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000bf181604085016020870162000df0565b601f01601f19169190910160400192915050565b60208082526032908201527f2161546f6b656e20646f6573206e6f74206861766520696e63656e7469766573604082015271020636f6e74726f6c6c6572207365742075760741b606082015260800190565b6020808252600c908201526b2ba927a7239020aa27a5a2a760a11b604082015260600190565b6020808252601f908201527f47656e657269634161766520616c726561647920696e697469616c697a656400604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b6020808252601a908201527f4c656e64657220616c726561647920696e697469616c697a6564000000000000604082015260600190565b6040518181016001600160401b038111828210171562000de857600080fd5b604052919050565b60005b8381101562000e0d57818101518382015260200162000df3565b8381111562000e1d576000848401525b50505050565b6001600160a01b038116811462000e3957600080fd5b50565b614ba78062000e4c6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063680ff45811610125578063d0e30db0116100ad578063f887ea401161007c578063f887ea40146103be578063fa43b69c146103c6578063fad9aba3146103d9578063fbfa77cf146103e1578063ffe36b8a146103e957610211565b8063d0e30db01461037d578063e5dd053f14610385578063ed882c2b14610398578063f399e22e146103ab57610211565b8063a0c1f15e116100f4578063a0c1f15e14610355578063a8c62e761461035d578063ad5c464814610365578063c1590cd71461036d578063c6afba3c1461037557610211565b8063680ff4581461031d5780637c4a391014610325578063853828b6146103385780638b2021761461034057610211565b8063437552c0116101a85780634cc18e57116101775780634cc18e57146102df5780635312ea8e146102f257806357ded9c9146103055780635be9b2d31461030d578063634c7bb51461031557610211565b8063437552c0146102b45780634641257d146102c7578063476062a4146102cf57806348ccda3c146102d757610211565b80632e1a7d4d116101e45780632e1a7d4d1461027157806332b79021146102845780633f843bce14610299578063400ada75146102a157610211565b806301681a6214610216578063116ac4a31461022b578063149a4ae4146102495780631f1fcd511461025c575b600080fd5b6102296102243660046140ce565b6103fc565b005b6102336106e4565b6040516102409190614a7d565b60405180910390f35b6102336102573660046143e9565b61070a565b6102646109de565b60405161024091906145f2565b61023361027f3660046143e9565b6109ed565b61028c610b69565b604051610240919061473d565b610264610b79565b6102296102af366004614294565b610b91565b6102296102c23660046143e9565b610b9b565b610229610d0a565b610264611347565b61026461135f565b6102296102ed3660046140ce565b611377565b6102296103003660046143e9565b611503565b610233611811565b61028c611820565b6102646118ab565b6102296118ba565b61022961033336600461425c565b611a8d565b61028c611cc2565b610348611e51565b6040516102409190614763565b610264611edf565b610264611eee565b610264611efd565b610233611f15565b610233611f1f565b610229611fa0565b6102336103933660046143e9565b612196565b61028c6103a63660046143e9565b612323565b6102296103b9366004614106565b61232d565b610264612337565b6102296103d43660046143c7565b61234f565b6102336124fc565b610264612502565b6102646103f7366004614154565b612511565b6001546001600160a01b03163314806104a9575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561045c57600080fd5b505afa158015610470573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049491906140ea565b6001600160a01b0316336001600160a01b0316145b8061054a5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156104fd57600080fd5b505afa158015610511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053591906140ea565b6001600160a01b0316336001600160a01b0316145b61056f5760405162461bcd60e51b81526004016105669061495d565b60405180910390fd5b606061057961269e565b905060005b81518110156105d45781818151811061059357fe5b60200260200101516001600160a01b0316836001600160a01b031614156105cc5760405162461bcd60e51b8152600401610566906149cc565b60010161057e565b5060005460408051635aa6e67560e01b815290516106e0926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561061b57600080fd5b505afa15801561062f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065391906140ea565b6040516370a0823160e01b81526001600160a01b038516906370a082319061067f9030906004016145f2565b60206040518083038186803b15801561069757600080fd5b505afa1580156106ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cf9190614401565b6001600160a01b0385169190612724565b5050565b6000806106ef612743565b90506107036106fc6128c7565b8290612954565b9150505b90565b6000610714613ee7565b61071c612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a759261074d929116906004016145f2565b6101806040518083038186803b15801561076657600080fd5b505afa15801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e91906142cc565b6002546040516335ea6a7560e01b815291925060009182918291829173057835ad21a177dbdd3090bb1cae03eacf78fc6d916335ea6a75916107ee916001600160a01b03909116906004016145f2565b6101406040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f91906144ec565b505050965050505093509350935060006108628886612a8c90919063ffffffff16565b600254604051633e15014160e01b815291925060009173057835ad21a177dbdd3090bb1cae03eacf78fc6d91633e150141916108aa916001600160a01b0316906004016145f2565b6101406040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb9190614446565b5050506101408e01516002546040516312b09be560e31b8152949950600098506001600160a01b039182169750639584df28965061094a955016928992508c91508b908b908a906004016146ad565b60606040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099a9190614419565b50909150600090506109b9610393876109b3878b612a8c565b90612a8c565b90506109cd816109b384633b9aca00612ab1565b99505050505050505050505b919050565b6002546001600160a01b031681565b6001546000906001600160a01b0316331480610a9d575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5057600080fd5b505afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8891906140ea565b6001600160a01b0316336001600160a01b0316145b80610b3e5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2991906140ea565b6001600160a01b0316336001600160a01b0316145b610b5a5760405162461bcd60e51b81526004016105669061495d565b610b6382612af3565b92915050565b600654600160a01b900460ff1681565b73057835ad21a177dbdd3090bb1cae03eacf78fc6d81565b6106e08282612ec3565b6001546001600160a01b0316331480610c48575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfb57600080fd5b505afa158015610c0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3391906140ea565b6001600160a01b0316336001600160a01b0316145b80610ce95750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b505afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906140ea565b6001600160a01b0316336001600160a01b0316145b610d055760405162461bcd60e51b81526004016105669061495d565b600455565b6006546001600160a01b0316331480610d2d57506001546001600160a01b031633145b80610dcc575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7f57600080fd5b505afa158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db791906140ea565b6001600160a01b0316336001600160a01b0316145b80610e6d5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2057600080fd5b505afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5891906140ea565b6001600160a01b0316336001600160a01b0316145b610e895760405162461bcd60e51b815260040161056690614825565b610e916130a1565b610ead5760405162461bcd60e51b815260040161056690614926565b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a0823190610ee79030906004016145f2565b60206040518083038186803b158015610eff57600080fd5b505afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190614401565b90508015610fab576040516301e9a69560e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590631e9a695090610f789030908590600401614644565b600060405180830381600087803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b505050505b6040516370a0823160e01b8152600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190610fe59030906004016145f2565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190614401565b9050611040816132a1565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a08231906110719030906004016145f2565b60206040518083038186803b15801561108957600080fd5b505afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c19190614401565b905080156110d2576110d2816135db565b60408051600180825281830190925260609160208083019080368337505060055482519293506001600160a01b03169183915060009061110e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000611138613737565b6001600160a01b0316638b599f2683306040518363ffffffff1660e01b81526004016111659291906146e0565b60206040518083038186803b15801561117d57600080fd5b505afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190614401565b90508015611248576111c5613737565b6001600160a01b0316633111e7b38383306040518463ffffffff1660e01b81526004016111f49392919061470a565b602060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614401565b505b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a08231906112829030906004016145f2565b60206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190614401565b111561134057734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561132757600080fd5b505af115801561133b573d6000803e3d6000fd5b505050505b5050505050565b734da27a545c0c5b758a6ba100e3a049001de870f581565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae981565b6001546001600160a01b0316331480611424575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d757600080fd5b505afa1580156113eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140f91906140ea565b6001600160a01b0316336001600160a01b0316145b806114c55750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561147857600080fd5b505afa15801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b091906140ea565b6001600160a01b0316336001600160a01b0316145b6114e15760405162461bcd60e51b81526004016105669061495d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806115b0575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561156357600080fd5b505afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b91906140ea565b6001600160a01b0316336001600160a01b0316145b806116515750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561160457600080fd5b505afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c91906140ea565b6001600160a01b0316336001600160a01b0316145b61166d5760405162461bcd60e51b81526004016105669061495d565b611675612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec926116aa929116908590309060040161465d565b602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190614401565b5060005460408051635aa6e67560e01b8152905161180e926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561174357600080fd5b505afa158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b91906140ea565b6002546040516370a0823160e01b81526001600160a01b03909116906370a08231906117ab9030906004016145f2565b60206040518083038186803b1580156117c357600080fd5b505afa1580156117d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fb9190614401565b6002546001600160a01b03169190612724565b50565b600061181b612743565b905090565b6005546040516370a0823160e01b815260009182916001600160a01b03909116906370a08231906118559030906004016145f2565b60206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a59190614401565b11905090565b6006546001600160a01b031681565b6001546001600160a01b0316331480611967575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906140ea565b6001600160a01b0316336001600160a01b0316145b80611a085750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f391906140ea565b6001600160a01b0316336001600160a01b0316145b611a245760405162461bcd60e51b81526004016105669061495d565b734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b50505050565b6001546001600160a01b0316331480611b3a575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2591906140ea565b6001600160a01b0316336001600160a01b0316145b80611bdb5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc691906140ea565b6001600160a01b0316336001600160a01b0316145b611bf75760405162461bcd60e51b81526004016105669061495d565b801580611c885750600554604080516375d2641360e01b815290516000926001600160a01b0316916375d26413916004808301926020929190829003018186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c91906140ea565b6001600160a01b031614155b611ca45760405162461bcd60e51b815260040161056690614776565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6001546000906001600160a01b0316331480611d72575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2557600080fd5b505afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906140ea565b6001600160a01b0316336001600160a01b0316145b80611e135750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe91906140ea565b6001600160a01b0316336001600160a01b0316145b611e2f5760405162461bcd60e51b81526004016105669061495d565b6000611e396128c7565b90506000611e4682612af3565b919091101591505090565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ed75780601f10611eac57610100808354040283529160200191611ed7565b820191906000526020600020905b815481529060010190602001808311611eba57829003601f168201915b505050505081565b6005546001600160a01b031681565b6001546001600160a01b031681565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600061181b6128c7565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611f509030906004016145f2565b60206040518083038186803b158015611f6857600080fd5b505afa158015611f7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190614401565b6001546001600160a01b031633148061204d575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203891906140ea565b6001600160a01b0316336001600160a01b0316145b806120ee5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a157600080fd5b505afa1580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d991906140ea565b6001600160a01b0316336001600160a01b0316145b61210a5760405162461bcd60e51b81526004016105669061495d565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061213b9030906004016145f2565b60206040518083038186803b15801561215357600080fd5b505afa158015612167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218b9190614401565b905061180e816135db565b600654600090600160a01b900460ff16801561222857506121b5613737565b6001600160a01b031663cc69afec6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ed57600080fd5b505afa158015612201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122259190614401565b42105b1561231b576000612237613737565b600554604051631652e7b760e01b81526001600160a01b0392831692631652e7b792612268929116906004016145f2565b60606040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190614419565b5091505080156123195760006122cd826137e1565b905060006122fb856122f5670de0b6b3a76400006122ef866301e13380612954565b90612954565b90612ab1565b905061230f6127106122f58361251c612954565b93505050506109d9565b505b506000919050565b6000610b636130a1565b6106e08282613a2f565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6001546001600160a01b03163314806123fc575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156123af57600080fd5b505afa1580156123c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e791906140ea565b6001600160a01b0316336001600160a01b0316145b8061249d5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561245057600080fd5b505afa158015612464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248891906140ea565b6001600160a01b0316336001600160a01b0316145b6124b95760405162461bcd60e51b81526004016105669061495d565b61ffff81166124da5760405162461bcd60e51b8152600401610566906148f6565b6006805461ffff909216600160a81b0261ffff60a81b19909216919091179055565b60045481565b6000546001600160a01b031681565b600061251d8585613bcf565b60405163400ada7560e01b81529091506001600160a01b0382169063400ada759061254e9086908690600401614748565b600060405180830381600087803b15801561256857600080fd5b505af115801561257c573d6000803e3d6000fd5b50505050949350505050565b8015806126105750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906125be9030908690600401614606565b60206040518083038186803b1580156125d657600080fd5b505afa1580156125ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260e9190614401565b155b61262c5760405162461bcd60e51b8152600401610566906149f0565b6126828363095ea7b360e01b848460405160240161264b929190614644565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613cb6565b505050565b60606126968484600085613d45565b949350505050565b604080516002808252606080830184529283929190602083019080368337505060025482519293506001600160a01b0316918391506000906126dc57fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061270757fe5b6001600160a01b0390921660209283029190910190910152905090565b6126828363a9059cbb60e01b848460405160240161264b929190614644565b6000806127eb633b9aca00612756612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a7592612787929116906004016145f2565b6101806040518083038186803b1580156127a057600080fd5b505afa1580156127b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d891906142cc565b606001516001600160801b031690612ab1565b6002546040516335ea6a7560e01b81529192506000918291829173057835ad21a177dbdd3090bb1cae03eacf78fc6d916335ea6a7591612837916001600160a01b0316906004016145f2565b6101406040518083038186803b15801561285057600080fd5b505afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288891906144ec565b5050505050505092509250925060006128b1610393836109b38688612a8c90919063ffffffff16565b90506128bd8582612a8c565b9550505050505090565b600061181b6128d4611f1f565b6002546040516370a0823160e01b81526001600160a01b03909116906370a08231906129049030906004016145f2565b60206040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190614401565b60008261296357506000610b63565b8282028284828161297057fe5b041461298e5760405162461bcd60e51b815260040161056690614847565b9392505050565b600073057835ad21a177dbdd3090bb1cae03eacf78fc6d6001600160a01b0316630542975c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e457600080fd5b505afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c91906140ea565b6001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5457600080fd5b505afa158015612a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b91906140ea565b60008282018381101561298e5760405162461bcd60e51b8152600401610566906147c8565b600061298e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e09565b6005546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190612b289030906004016145f2565b60206040518083038186803b158015612b4057600080fd5b505afa158015612b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b789190614401565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612bae9030906004016145f2565b60206040518083038186803b158015612bc657600080fd5b505afa158015612bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bfe9190614401565b90506000612c0c8383612a8c565b905080851115612c1a578094505b848210612c4957600154600254612c3e916001600160a01b03918216911687612724565b8493505050506109d9565b6002546005546040516370a0823160e01b81526000926001600160a01b03908116926370a0823192612c8192909116906004016145f2565b60206040518083038186803b158015612c9957600080fd5b505afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190614401565b90506001811115612e19576000612ce88785613e40565b9050818111612d8657612cf9612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec92612d2e929116908590309060040161465d565b602060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d809190614401565b50612e17565b612d8e612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec92612dc3929116908690309060040161465d565b602060405180830381600087803b158015612ddd57600080fd5b505af1158015612df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e159190614401565b505b505b6002546040516370a0823160e01b81526001600160a01b03909116906370a0823190612e499030906004016145f2565b60206040518083038186803b158015612e6157600080fd5b505afa158015612e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e999190614401565b600154600254919450612eb9916001600160a01b03908116911685612724565b5090949350505050565b6005546001600160a01b031615612eec5760405162461bcd60e51b815260040161056690614888565b801580612f7c575060006001600160a01b0316826001600160a01b03166375d264136040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3857600080fd5b505afa158015612f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7091906140ea565b6001600160a01b031614155b612f985760405162461bcd60e51b815260040161056690614776565b6006805460ff60a01b1916600160a01b83151502179055600580546001600160a01b0319166001600160a01b038416908117909155612fd5612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a7592613006929116906004016145f2565b6101806040518083038186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305791906142cc565b60e001516001600160a01b0316146130815760405162461bcd60e51b8152600401610566906147ff565b6106e061308c612995565b6002546001600160a01b031690600019612588565b600654600090600160a01b900460ff166130bd57506000610707565b60405163091030c360e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f59063091030c3906130f79030906004016145f2565b60206040518083038186803b15801561310f57600080fd5b505afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131479190614401565b90506000734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b03166372b49d636040518163ffffffff1660e01b815260040160206040518083038186803b15801561319857600080fd5b505afa1580156131ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d09190614401565b90506000734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663359c4a966040518163ffffffff1660e01b815260040160206040518083038186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132599190614401565b90506132658383612a8c565b421061329557806132806132798585612a8c565b4290613e40565b11158061328b575082155b9350505050610707565b60009350505050610707565b806132ab5761180e565b6002546060906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415613367576040805160028082526060820183529091602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061331757fe5b6001600160a01b03928316602091820292909201015260025482519116908290600190811061334257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613437565b604080516003808252608082019092529060208201606080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106133aa57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133ec57fe5b6001600160a01b039283166020918202929092010152600280548351921691839190811061341657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051636eb1769f60e11b81528290737fc66500c84a76ad7e9c93437bfc5ac33e2ddae99063dd62ed3e90613486903090737a250d5630b4cf539739df2c5dacb4c659f2488d90600401614606565b60206040518083038186803b15801561349e57600080fd5b505afa1580156134b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d69190614401565b101561354557613510737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9737a250d5630b4cf539739df2c5dacb4c659f2488d6000612588565b613545737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9737a250d5630b4cf539739df2c5dacb4c659f2488d600019612588565b6040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed173990613585908590600090869030904290600401614a9f565b600060405180830381600087803b15801561359f57600080fd5b505af11580156135b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261268291908101906141c7565b60006135e5612995565b600254604051636eb1769f60e11b815291925083916001600160a01b039091169063dd62ed3e9061361c9030908690600401614606565b60206040518083038186803b15801561363457600080fd5b505afa158015613648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366c9190614401565b10156136a35760025461368a906001600160a01b0316826000612588565b6002546136a3906001600160a01b031682600019612588565b600654600090600160a81b900461ffff1680156136c2578091506136c7565b60b391505b60025460405163e8eda9df60e01b81526001600160a01b038581169263e8eda9df926136ff9290911690889030908890600401614680565b600060405180830381600087803b15801561371957600080fd5b505af115801561372d573d6000803e3d6000fd5b5050505050505050565b600654600090600160a01b900460ff16156137d957600560009054906101000a90046001600160a01b03166001600160a01b03166375d264136040518163ffffffff1660e01b815260040160206040518083038186803b15801561379a57600080fd5b505afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d291906140ea565b9050610707565b506000610707565b6000816137f0575060006109d9565b6002546060906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156138ac576040805160028082526060820183529091602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061385c57fe5b6001600160a01b03928316602091820292909201015260025482519116908290600190811061388757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061397c565b604080516003808252608082019092529060208201606080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106138ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061393157fe5b6001600160a01b039283166020918202929092010152600280548351921691839190811061395b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906139b89087908690600401614a86565b60006040518083038186803b1580156139d057600080fd5b505afa1580156139e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a0c91908101906141c7565b905080600182510381518110613a1e57fe5b602002602001015192505050919050565b6001546001600160a01b031615613a585760405162461bcd60e51b815260040161056690614a46565b600180546001600160a01b0319166001600160a01b0384811691909117918290556040805163fbfa77cf60e01b81529051929091169163fbfa77cf91600480820192602092909190829003018186803b158015613ab457600080fd5b505afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec91906140ea565b600080546001600160a01b0319166001600160a01b03928316179081905560408051637e062a3560e11b81529051919092169163fc0c546a916004808301926020929190829003018186803b158015613b4457600080fd5b505afa158015613b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7c91906140ea565b600280546001600160a01b0319166001600160a01b03929092169190911790558051613baf906003906020840190613f52565b506127106004556002546106e0906001600160a01b031683600019612588565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b602883015260009160378184f06040516379ccf11760e11b81529093506001600160a01b038416915063f399e22e90613c499087908790600401614620565b600060405180830381600087803b158015613c6357600080fd5b505af1158015613c77573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a25092915050565b6060613d0b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126879092919063ffffffff16565b8051909150156126825780806020019051810190613d299190614278565b6126825760405162461bcd60e51b815260040161056690614982565b6060613d5085613e82565b613d6c5760405162461bcd60e51b8152600401610566906148bf565b60006060866001600160a01b03168587604051613d8991906145d6565b60006040518083038185875af1925050503d8060008114613dc6576040519150601f19603f3d011682016040523d82523d6000602084013e613dcb565b606091505b50915091508115613ddf5791506126969050565b805115613def5780518082602001fd5b8360405162461bcd60e51b81526004016105669190614763565b60008183613e2a5760405162461bcd60e51b81526004016105669190614763565b506000838581613e3657fe5b0495945050505050565b600061298e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ebb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612696575050151592915050565b60008184841115613edf5760405162461bcd60e51b81526004016105669190614763565b505050900390565b604051806101800160405280613efb613fd0565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f9357805160ff1916838001178555613fc0565b82800160010185558215613fc0579182015b82811115613fc0578251825591602001919060010190613fa5565b50613fcc929150613fe3565b5090565b6040518060200160405280600081525090565b5b80821115613fcc5760008155600101613fe4565b8051610b6381614b4e565b600082601f830112614013578081fd5b813567ffffffffffffffff811115614029578182fd5b61403c601f8201601f1916602001614adb565b915080825283602082850101111561405357600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561407d578081fd5b6140876020614adb565b9151825250919050565b80516001600160801b0381168114610b6357600080fd5b805164ffffffffff81168114610b6357600080fd5b805160ff81168114610b6357600080fd5b6000602082840312156140df578081fd5b813561298e81614b4e565b6000602082840312156140fb578081fd5b815161298e81614b4e565b60008060408385031215614118578081fd5b823561412381614b4e565b9150602083013567ffffffffffffffff81111561413e578182fd5b61414a85828601614003565b9150509250929050565b60008060008060808587031215614169578182fd5b843561417481614b4e565b9350602085013567ffffffffffffffff81111561418f578283fd5b61419b87828801614003565b93505060408501356141ac81614b4e565b915060608501356141bc81614b63565b939692955090935050565b600060208083850312156141d9578182fd5b825167ffffffffffffffff8111156141ef578283fd5b8301601f810185136141ff578283fd5b805161421261420d82614b02565b614adb565b818152838101908385018584028501860189101561422e578687fd5b8694505b83851015614250578051835260019490940193918501918501614232565b50979650505050505050565b60006020828403121561426d578081fd5b813561298e81614b63565b600060208284031215614289578081fd5b815161298e81614b63565b600080604083850312156142a6578182fd5b82356142b181614b4e565b915060208301356142c181614b63565b809150509250929050565b60006101808083850312156142df578182fd5b6142e881614adb565b90506142f4848461406c565b81526143038460208501614091565b60208201526143158460408501614091565b60408201526143278460608501614091565b60608201526143398460808501614091565b608082015261434b8460a08501614091565b60a082015261435d8460c085016140a8565b60c082015261436f8460e08501613ff8565b60e082015261010061438385828601613ff8565b9082015261012061439685858301613ff8565b908201526101406143a985858301613ff8565b908201526101606143bc858583016140bd565b908201529392505050565b6000602082840312156143d8578081fd5b813561ffff8116811461298e578182fd5b6000602082840312156143fa578081fd5b5035919050565b600060208284031215614412578081fd5b5051919050565b60008060006060848603121561442d578081fd5b8351925060208401519150604084015190509250925092565b6000806000806000806000806000806101408b8d031215614465578788fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b015161449381614b63565b60c08c01519095506144a481614b63565b60e08c01519094506144b581614b63565b6101008c01519093506144c781614b63565b6101208c01519092506144d981614b63565b809150509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d03121561450b578384fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506145568c6101208d016140a8565b90509295989b9194979a5092959850565b6000815180845260208085019450808401835b8381101561459f5781516001600160a01b03168752958201959082019060010161457a565b509495945050505050565b600081518084526145c2816020860160208601614b22565b601f01601f19169290920160200192915050565b600082516145e8818460208701614b22565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0383168152604060208201819052600090612696908301846145aa565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b6001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b6000604082526146f36040830185614567565b905060018060a01b03831660208301529392505050565b60006060825261471d6060830186614567565b6020830194909452506001600160a01b0391909116604090910152919050565b901515815260200190565b6001600160a01b039290921682521515602082015260400190565b60006020825261298e60208301846145aa565b60208082526032908201527f2161546f6b656e20646f6573206e6f74206861766520696e63656e7469766573604082015271020636f6e74726f6c6c6572207365742075760741b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b2ba927a7239020aa27a5a2a760a11b604082015260600190565b602080825260089082015267216b65657065727360c01b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601f908201527f47656e657269634161766520616c726561647920696e697469616c697a656400604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526016908201527521696e76616c696420726566657272616c20636f646560501b604082015260600190565b60208082526017908201527f21636f6e646974696f6e7320617265206e6f74206d6574000000000000000000604082015260600190565b6020808252600b908201526a085b585b9859d95b595b9d60aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252601a908201527f4c656e64657220616c726561647920696e697469616c697a6564000000000000604082015260600190565b90815260200190565b6000838252604060208301526126966040830184614567565b600086825285602083015260a06040830152614abe60a0830186614567565b6001600160a01b0394909416606083015250608001529392505050565b60405181810167ffffffffffffffff81118282101715614afa57600080fd5b604052919050565b600067ffffffffffffffff821115614b18578081fd5b5060209081020190565b60005b83811015614b3d578181015183820152602001614b25565b83811115611a875750506000910152565b6001600160a01b038116811461180e57600080fd5b801515811461180e57600080fdfea264697066735822122074acbee843ed9b411379eac6ebcd29b40b2c8d880ac94b3e4c44089b6eb8253664736f6c634300060c003300000000000000000000000032b8c26d0439e1959cea6262cbabc12320b384c40000000000000000000000000000000000000000000000000000000000000080000000000000000000000000028171bca77440897b824ca71d1c56cac55b68a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d416176654441494c656e64657200000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063680ff45811610125578063d0e30db0116100ad578063f887ea401161007c578063f887ea40146103be578063fa43b69c146103c6578063fad9aba3146103d9578063fbfa77cf146103e1578063ffe36b8a146103e957610211565b8063d0e30db01461037d578063e5dd053f14610385578063ed882c2b14610398578063f399e22e146103ab57610211565b8063a0c1f15e116100f4578063a0c1f15e14610355578063a8c62e761461035d578063ad5c464814610365578063c1590cd71461036d578063c6afba3c1461037557610211565b8063680ff4581461031d5780637c4a391014610325578063853828b6146103385780638b2021761461034057610211565b8063437552c0116101a85780634cc18e57116101775780634cc18e57146102df5780635312ea8e146102f257806357ded9c9146103055780635be9b2d31461030d578063634c7bb51461031557610211565b8063437552c0146102b45780634641257d146102c7578063476062a4146102cf57806348ccda3c146102d757610211565b80632e1a7d4d116101e45780632e1a7d4d1461027157806332b79021146102845780633f843bce14610299578063400ada75146102a157610211565b806301681a6214610216578063116ac4a31461022b578063149a4ae4146102495780631f1fcd511461025c575b600080fd5b6102296102243660046140ce565b6103fc565b005b6102336106e4565b6040516102409190614a7d565b60405180910390f35b6102336102573660046143e9565b61070a565b6102646109de565b60405161024091906145f2565b61023361027f3660046143e9565b6109ed565b61028c610b69565b604051610240919061473d565b610264610b79565b6102296102af366004614294565b610b91565b6102296102c23660046143e9565b610b9b565b610229610d0a565b610264611347565b61026461135f565b6102296102ed3660046140ce565b611377565b6102296103003660046143e9565b611503565b610233611811565b61028c611820565b6102646118ab565b6102296118ba565b61022961033336600461425c565b611a8d565b61028c611cc2565b610348611e51565b6040516102409190614763565b610264611edf565b610264611eee565b610264611efd565b610233611f15565b610233611f1f565b610229611fa0565b6102336103933660046143e9565b612196565b61028c6103a63660046143e9565b612323565b6102296103b9366004614106565b61232d565b610264612337565b6102296103d43660046143c7565b61234f565b6102336124fc565b610264612502565b6102646103f7366004614154565b612511565b6001546001600160a01b03163314806104a9575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561045c57600080fd5b505afa158015610470573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049491906140ea565b6001600160a01b0316336001600160a01b0316145b8061054a5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156104fd57600080fd5b505afa158015610511573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053591906140ea565b6001600160a01b0316336001600160a01b0316145b61056f5760405162461bcd60e51b81526004016105669061495d565b60405180910390fd5b606061057961269e565b905060005b81518110156105d45781818151811061059357fe5b60200260200101516001600160a01b0316836001600160a01b031614156105cc5760405162461bcd60e51b8152600401610566906149cc565b60010161057e565b5060005460408051635aa6e67560e01b815290516106e0926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561061b57600080fd5b505afa15801561062f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065391906140ea565b6040516370a0823160e01b81526001600160a01b038516906370a082319061067f9030906004016145f2565b60206040518083038186803b15801561069757600080fd5b505afa1580156106ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cf9190614401565b6001600160a01b0385169190612724565b5050565b6000806106ef612743565b90506107036106fc6128c7565b8290612954565b9150505b90565b6000610714613ee7565b61071c612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a759261074d929116906004016145f2565b6101806040518083038186803b15801561076657600080fd5b505afa15801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e91906142cc565b6002546040516335ea6a7560e01b815291925060009182918291829173057835ad21a177dbdd3090bb1cae03eacf78fc6d916335ea6a75916107ee916001600160a01b03909116906004016145f2565b6101406040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f91906144ec565b505050965050505093509350935060006108628886612a8c90919063ffffffff16565b600254604051633e15014160e01b815291925060009173057835ad21a177dbdd3090bb1cae03eacf78fc6d91633e150141916108aa916001600160a01b0316906004016145f2565b6101406040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb9190614446565b5050506101408e01516002546040516312b09be560e31b8152949950600098506001600160a01b039182169750639584df28965061094a955016928992508c91508b908b908a906004016146ad565b60606040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099a9190614419565b50909150600090506109b9610393876109b3878b612a8c565b90612a8c565b90506109cd816109b384633b9aca00612ab1565b99505050505050505050505b919050565b6002546001600160a01b031681565b6001546000906001600160a01b0316331480610a9d575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5057600080fd5b505afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8891906140ea565b6001600160a01b0316336001600160a01b0316145b80610b3e5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2991906140ea565b6001600160a01b0316336001600160a01b0316145b610b5a5760405162461bcd60e51b81526004016105669061495d565b610b6382612af3565b92915050565b600654600160a01b900460ff1681565b73057835ad21a177dbdd3090bb1cae03eacf78fc6d81565b6106e08282612ec3565b6001546001600160a01b0316331480610c48575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfb57600080fd5b505afa158015610c0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3391906140ea565b6001600160a01b0316336001600160a01b0316145b80610ce95750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9c57600080fd5b505afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906140ea565b6001600160a01b0316336001600160a01b0316145b610d055760405162461bcd60e51b81526004016105669061495d565b600455565b6006546001600160a01b0316331480610d2d57506001546001600160a01b031633145b80610dcc575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7f57600080fd5b505afa158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db791906140ea565b6001600160a01b0316336001600160a01b0316145b80610e6d5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2057600080fd5b505afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5891906140ea565b6001600160a01b0316336001600160a01b0316145b610e895760405162461bcd60e51b815260040161056690614825565b610e916130a1565b610ead5760405162461bcd60e51b815260040161056690614926565b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a0823190610ee79030906004016145f2565b60206040518083038186803b158015610eff57600080fd5b505afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190614401565b90508015610fab576040516301e9a69560e41b8152734da27a545c0c5b758a6ba100e3a049001de870f590631e9a695090610f789030908590600401614644565b600060405180830381600087803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b505050505b6040516370a0823160e01b8152600090737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9906370a0823190610fe59030906004016145f2565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190614401565b9050611040816132a1565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a08231906110719030906004016145f2565b60206040518083038186803b15801561108957600080fd5b505afa15801561109d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c19190614401565b905080156110d2576110d2816135db565b60408051600180825281830190925260609160208083019080368337505060055482519293506001600160a01b03169183915060009061110e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000611138613737565b6001600160a01b0316638b599f2683306040518363ffffffff1660e01b81526004016111659291906146e0565b60206040518083038186803b15801561117d57600080fd5b505afa158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190614401565b90508015611248576111c5613737565b6001600160a01b0316633111e7b38383306040518463ffffffff1660e01b81526004016111f49392919061470a565b602060405180830381600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614401565b505b6040516370a0823160e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f5906370a08231906112829030906004016145f2565b60206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190614401565b111561134057734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561132757600080fd5b505af115801561133b573d6000803e3d6000fd5b505050505b5050505050565b734da27a545c0c5b758a6ba100e3a049001de870f581565b737fc66500c84a76ad7e9c93437bfc5ac33e2ddae981565b6001546001600160a01b0316331480611424575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d757600080fd5b505afa1580156113eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140f91906140ea565b6001600160a01b0316336001600160a01b0316145b806114c55750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561147857600080fd5b505afa15801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b091906140ea565b6001600160a01b0316336001600160a01b0316145b6114e15760405162461bcd60e51b81526004016105669061495d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806115b0575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561156357600080fd5b505afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b91906140ea565b6001600160a01b0316336001600160a01b0316145b806116515750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561160457600080fd5b505afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c91906140ea565b6001600160a01b0316336001600160a01b0316145b61166d5760405162461bcd60e51b81526004016105669061495d565b611675612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec926116aa929116908590309060040161465d565b602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190614401565b5060005460408051635aa6e67560e01b8152905161180e926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561174357600080fd5b505afa158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b91906140ea565b6002546040516370a0823160e01b81526001600160a01b03909116906370a08231906117ab9030906004016145f2565b60206040518083038186803b1580156117c357600080fd5b505afa1580156117d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fb9190614401565b6002546001600160a01b03169190612724565b50565b600061181b612743565b905090565b6005546040516370a0823160e01b815260009182916001600160a01b03909116906370a08231906118559030906004016145f2565b60206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a59190614401565b11905090565b6006546001600160a01b031681565b6001546001600160a01b0316331480611967575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906140ea565b6001600160a01b0316336001600160a01b0316145b80611a085750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f391906140ea565b6001600160a01b0316336001600160a01b0316145b611a245760405162461bcd60e51b81526004016105669061495d565b734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663787a08a66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b50505050565b6001546001600160a01b0316331480611b3a575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2591906140ea565b6001600160a01b0316336001600160a01b0316145b80611bdb5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc691906140ea565b6001600160a01b0316336001600160a01b0316145b611bf75760405162461bcd60e51b81526004016105669061495d565b801580611c885750600554604080516375d2641360e01b815290516000926001600160a01b0316916375d26413916004808301926020929190829003018186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c91906140ea565b6001600160a01b031614155b611ca45760405162461bcd60e51b815260040161056690614776565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6001546000906001600160a01b0316331480611d72575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2557600080fd5b505afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906140ea565b6001600160a01b0316336001600160a01b0316145b80611e135750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe91906140ea565b6001600160a01b0316336001600160a01b0316145b611e2f5760405162461bcd60e51b81526004016105669061495d565b6000611e396128c7565b90506000611e4682612af3565b919091101591505090565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ed75780601f10611eac57610100808354040283529160200191611ed7565b820191906000526020600020905b815481529060010190602001808311611eba57829003601f168201915b505050505081565b6005546001600160a01b031681565b6001546001600160a01b031681565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600061181b6128c7565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611f509030906004016145f2565b60206040518083038186803b158015611f6857600080fd5b505afa158015611f7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b9190614401565b6001546001600160a01b031633148061204d575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203891906140ea565b6001600160a01b0316336001600160a01b0316145b806120ee5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a157600080fd5b505afa1580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d991906140ea565b6001600160a01b0316336001600160a01b0316145b61210a5760405162461bcd60e51b81526004016105669061495d565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061213b9030906004016145f2565b60206040518083038186803b15801561215357600080fd5b505afa158015612167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218b9190614401565b905061180e816135db565b600654600090600160a01b900460ff16801561222857506121b5613737565b6001600160a01b031663cc69afec6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ed57600080fd5b505afa158015612201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122259190614401565b42105b1561231b576000612237613737565b600554604051631652e7b760e01b81526001600160a01b0392831692631652e7b792612268929116906004016145f2565b60606040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190614419565b5091505080156123195760006122cd826137e1565b905060006122fb856122f5670de0b6b3a76400006122ef866301e13380612954565b90612954565b90612ab1565b905061230f6127106122f58361251c612954565b93505050506109d9565b505b506000919050565b6000610b636130a1565b6106e08282613a2f565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6001546001600160a01b03163314806123fc575060008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156123af57600080fd5b505afa1580156123c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e791906140ea565b6001600160a01b0316336001600160a01b0316145b8061249d5750600160009054906101000a90046001600160a01b03166001600160a01b0316631fe4a6866040518163ffffffff1660e01b815260040160206040518083038186803b15801561245057600080fd5b505afa158015612464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248891906140ea565b6001600160a01b0316336001600160a01b0316145b6124b95760405162461bcd60e51b81526004016105669061495d565b61ffff81166124da5760405162461bcd60e51b8152600401610566906148f6565b6006805461ffff909216600160a81b0261ffff60a81b19909216919091179055565b60045481565b6000546001600160a01b031681565b600061251d8585613bcf565b60405163400ada7560e01b81529091506001600160a01b0382169063400ada759061254e9086908690600401614748565b600060405180830381600087803b15801561256857600080fd5b505af115801561257c573d6000803e3d6000fd5b50505050949350505050565b8015806126105750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906125be9030908690600401614606565b60206040518083038186803b1580156125d657600080fd5b505afa1580156125ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260e9190614401565b155b61262c5760405162461bcd60e51b8152600401610566906149f0565b6126828363095ea7b360e01b848460405160240161264b929190614644565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613cb6565b505050565b60606126968484600085613d45565b949350505050565b604080516002808252606080830184529283929190602083019080368337505060025482519293506001600160a01b0316918391506000906126dc57fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061270757fe5b6001600160a01b0390921660209283029190910190910152905090565b6126828363a9059cbb60e01b848460405160240161264b929190614644565b6000806127eb633b9aca00612756612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a7592612787929116906004016145f2565b6101806040518083038186803b1580156127a057600080fd5b505afa1580156127b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d891906142cc565b606001516001600160801b031690612ab1565b6002546040516335ea6a7560e01b81529192506000918291829173057835ad21a177dbdd3090bb1cae03eacf78fc6d916335ea6a7591612837916001600160a01b0316906004016145f2565b6101406040518083038186803b15801561285057600080fd5b505afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288891906144ec565b5050505050505092509250925060006128b1610393836109b38688612a8c90919063ffffffff16565b90506128bd8582612a8c565b9550505050505090565b600061181b6128d4611f1f565b6002546040516370a0823160e01b81526001600160a01b03909116906370a08231906129049030906004016145f2565b60206040518083038186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190614401565b60008261296357506000610b63565b8282028284828161297057fe5b041461298e5760405162461bcd60e51b815260040161056690614847565b9392505050565b600073057835ad21a177dbdd3090bb1cae03eacf78fc6d6001600160a01b0316630542975c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129e457600080fd5b505afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c91906140ea565b6001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5457600080fd5b505afa158015612a68573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b91906140ea565b60008282018381101561298e5760405162461bcd60e51b8152600401610566906147c8565b600061298e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e09565b6005546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190612b289030906004016145f2565b60206040518083038186803b158015612b4057600080fd5b505afa158015612b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b789190614401565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612bae9030906004016145f2565b60206040518083038186803b158015612bc657600080fd5b505afa158015612bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bfe9190614401565b90506000612c0c8383612a8c565b905080851115612c1a578094505b848210612c4957600154600254612c3e916001600160a01b03918216911687612724565b8493505050506109d9565b6002546005546040516370a0823160e01b81526000926001600160a01b03908116926370a0823192612c8192909116906004016145f2565b60206040518083038186803b158015612c9957600080fd5b505afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190614401565b90506001811115612e19576000612ce88785613e40565b9050818111612d8657612cf9612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec92612d2e929116908590309060040161465d565b602060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d809190614401565b50612e17565b612d8e612995565b600254604051631a4ca37b60e21b81526001600160a01b03928316926369328dec92612dc3929116908690309060040161465d565b602060405180830381600087803b158015612ddd57600080fd5b505af1158015612df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e159190614401565b505b505b6002546040516370a0823160e01b81526001600160a01b03909116906370a0823190612e499030906004016145f2565b60206040518083038186803b158015612e6157600080fd5b505afa158015612e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e999190614401565b600154600254919450612eb9916001600160a01b03908116911685612724565b5090949350505050565b6005546001600160a01b031615612eec5760405162461bcd60e51b815260040161056690614888565b801580612f7c575060006001600160a01b0316826001600160a01b03166375d264136040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3857600080fd5b505afa158015612f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7091906140ea565b6001600160a01b031614155b612f985760405162461bcd60e51b815260040161056690614776565b6006805460ff60a01b1916600160a01b83151502179055600580546001600160a01b0319166001600160a01b038416908117909155612fd5612995565b6002546040516335ea6a7560e01b81526001600160a01b03928316926335ea6a7592613006929116906004016145f2565b6101806040518083038186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305791906142cc565b60e001516001600160a01b0316146130815760405162461bcd60e51b8152600401610566906147ff565b6106e061308c612995565b6002546001600160a01b031690600019612588565b600654600090600160a01b900460ff166130bd57506000610707565b60405163091030c360e01b8152600090734da27a545c0c5b758a6ba100e3a049001de870f59063091030c3906130f79030906004016145f2565b60206040518083038186803b15801561310f57600080fd5b505afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131479190614401565b90506000734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b03166372b49d636040518163ffffffff1660e01b815260040160206040518083038186803b15801561319857600080fd5b505afa1580156131ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d09190614401565b90506000734da27a545c0c5b758a6ba100e3a049001de870f56001600160a01b031663359c4a966040518163ffffffff1660e01b815260040160206040518083038186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132599190614401565b90506132658383612a8c565b421061329557806132806132798585612a8c565b4290613e40565b11158061328b575082155b9350505050610707565b60009350505050610707565b806132ab5761180e565b6002546060906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415613367576040805160028082526060820183529091602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061331757fe5b6001600160a01b03928316602091820292909201015260025482519116908290600190811061334257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613437565b604080516003808252608082019092529060208201606080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106133aa57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133ec57fe5b6001600160a01b039283166020918202929092010152600280548351921691839190811061341657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051636eb1769f60e11b81528290737fc66500c84a76ad7e9c93437bfc5ac33e2ddae99063dd62ed3e90613486903090737a250d5630b4cf539739df2c5dacb4c659f2488d90600401614606565b60206040518083038186803b15801561349e57600080fd5b505afa1580156134b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d69190614401565b101561354557613510737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9737a250d5630b4cf539739df2c5dacb4c659f2488d6000612588565b613545737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9737a250d5630b4cf539739df2c5dacb4c659f2488d600019612588565b6040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed173990613585908590600090869030904290600401614a9f565b600060405180830381600087803b15801561359f57600080fd5b505af11580156135b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261268291908101906141c7565b60006135e5612995565b600254604051636eb1769f60e11b815291925083916001600160a01b039091169063dd62ed3e9061361c9030908690600401614606565b60206040518083038186803b15801561363457600080fd5b505afa158015613648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366c9190614401565b10156136a35760025461368a906001600160a01b0316826000612588565b6002546136a3906001600160a01b031682600019612588565b600654600090600160a81b900461ffff1680156136c2578091506136c7565b60b391505b60025460405163e8eda9df60e01b81526001600160a01b038581169263e8eda9df926136ff9290911690889030908890600401614680565b600060405180830381600087803b15801561371957600080fd5b505af115801561372d573d6000803e3d6000fd5b5050505050505050565b600654600090600160a01b900460ff16156137d957600560009054906101000a90046001600160a01b03166001600160a01b03166375d264136040518163ffffffff1660e01b815260040160206040518083038186803b15801561379a57600080fd5b505afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d291906140ea565b9050610707565b506000610707565b6000816137f0575060006109d9565b6002546060906001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156138ac576040805160028082526060820183529091602083019080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae98160008151811061385c57fe5b6001600160a01b03928316602091820292909201015260025482519116908290600190811061388757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061397c565b604080516003808252608082019092529060208201606080368337019050509050737fc66500c84a76ad7e9c93437bfc5ac33e2ddae9816000815181106138ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061393157fe5b6001600160a01b039283166020918202929092010152600280548351921691839190811061395b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906139b89087908690600401614a86565b60006040518083038186803b1580156139d057600080fd5b505afa1580156139e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a0c91908101906141c7565b905080600182510381518110613a1e57fe5b602002602001015192505050919050565b6001546001600160a01b031615613a585760405162461bcd60e51b815260040161056690614a46565b600180546001600160a01b0319166001600160a01b0384811691909117918290556040805163fbfa77cf60e01b81529051929091169163fbfa77cf91600480820192602092909190829003018186803b158015613ab457600080fd5b505afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec91906140ea565b600080546001600160a01b0319166001600160a01b03928316179081905560408051637e062a3560e11b81529051919092169163fc0c546a916004808301926020929190829003018186803b158015613b4457600080fd5b505afa158015613b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7c91906140ea565b600280546001600160a01b0319166001600160a01b03929092169190911790558051613baf906003906020840190613f52565b506127106004556002546106e0906001600160a01b031683600019612588565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b602883015260009160378184f06040516379ccf11760e11b81529093506001600160a01b038416915063f399e22e90613c499087908790600401614620565b600060405180830381600087803b158015613c6357600080fd5b505af1158015613c77573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a25092915050565b6060613d0b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126879092919063ffffffff16565b8051909150156126825780806020019051810190613d299190614278565b6126825760405162461bcd60e51b815260040161056690614982565b6060613d5085613e82565b613d6c5760405162461bcd60e51b8152600401610566906148bf565b60006060866001600160a01b03168587604051613d8991906145d6565b60006040518083038185875af1925050503d8060008114613dc6576040519150601f19603f3d011682016040523d82523d6000602084013e613dcb565b606091505b50915091508115613ddf5791506126969050565b805115613def5780518082602001fd5b8360405162461bcd60e51b81526004016105669190614763565b60008183613e2a5760405162461bcd60e51b81526004016105669190614763565b506000838581613e3657fe5b0495945050505050565b600061298e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ebb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612696575050151592915050565b60008184841115613edf5760405162461bcd60e51b81526004016105669190614763565b505050900390565b604051806101800160405280613efb613fd0565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f9357805160ff1916838001178555613fc0565b82800160010185558215613fc0579182015b82811115613fc0578251825591602001919060010190613fa5565b50613fcc929150613fe3565b5090565b6040518060200160405280600081525090565b5b80821115613fcc5760008155600101613fe4565b8051610b6381614b4e565b600082601f830112614013578081fd5b813567ffffffffffffffff811115614029578182fd5b61403c601f8201601f1916602001614adb565b915080825283602082850101111561405357600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561407d578081fd5b6140876020614adb565b9151825250919050565b80516001600160801b0381168114610b6357600080fd5b805164ffffffffff81168114610b6357600080fd5b805160ff81168114610b6357600080fd5b6000602082840312156140df578081fd5b813561298e81614b4e565b6000602082840312156140fb578081fd5b815161298e81614b4e565b60008060408385031215614118578081fd5b823561412381614b4e565b9150602083013567ffffffffffffffff81111561413e578182fd5b61414a85828601614003565b9150509250929050565b60008060008060808587031215614169578182fd5b843561417481614b4e565b9350602085013567ffffffffffffffff81111561418f578283fd5b61419b87828801614003565b93505060408501356141ac81614b4e565b915060608501356141bc81614b63565b939692955090935050565b600060208083850312156141d9578182fd5b825167ffffffffffffffff8111156141ef578283fd5b8301601f810185136141ff578283fd5b805161421261420d82614b02565b614adb565b818152838101908385018584028501860189101561422e578687fd5b8694505b83851015614250578051835260019490940193918501918501614232565b50979650505050505050565b60006020828403121561426d578081fd5b813561298e81614b63565b600060208284031215614289578081fd5b815161298e81614b63565b600080604083850312156142a6578182fd5b82356142b181614b4e565b915060208301356142c181614b63565b809150509250929050565b60006101808083850312156142df578182fd5b6142e881614adb565b90506142f4848461406c565b81526143038460208501614091565b60208201526143158460408501614091565b60408201526143278460608501614091565b60608201526143398460808501614091565b608082015261434b8460a08501614091565b60a082015261435d8460c085016140a8565b60c082015261436f8460e08501613ff8565b60e082015261010061438385828601613ff8565b9082015261012061439685858301613ff8565b908201526101406143a985858301613ff8565b908201526101606143bc858583016140bd565b908201529392505050565b6000602082840312156143d8578081fd5b813561ffff8116811461298e578182fd5b6000602082840312156143fa578081fd5b5035919050565b600060208284031215614412578081fd5b5051919050565b60008060006060848603121561442d578081fd5b8351925060208401519150604084015190509250925092565b6000806000806000806000806000806101408b8d031215614465578788fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b015161449381614b63565b60c08c01519095506144a481614b63565b60e08c01519094506144b581614b63565b6101008c01519093506144c781614b63565b6101208c01519092506144d981614b63565b809150509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d03121561450b578384fd5b8a51995060208b0151985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506145568c6101208d016140a8565b90509295989b9194979a5092959850565b6000815180845260208085019450808401835b8381101561459f5781516001600160a01b03168752958201959082019060010161457a565b509495945050505050565b600081518084526145c2816020860160208601614b22565b601f01601f19169290920160200192915050565b600082516145e8818460208701614b22565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0383168152604060208201819052600090612696908301846145aa565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b6001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b6000604082526146f36040830185614567565b905060018060a01b03831660208301529392505050565b60006060825261471d6060830186614567565b6020830194909452506001600160a01b0391909116604090910152919050565b901515815260200190565b6001600160a01b039290921682521515602082015260400190565b60006020825261298e60208301846145aa565b60208082526032908201527f2161546f6b656e20646f6573206e6f74206861766520696e63656e7469766573604082015271020636f6e74726f6c6c6572207365742075760741b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600c908201526b2ba927a7239020aa27a5a2a760a11b604082015260600190565b602080825260089082015267216b65657065727360c01b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601f908201527f47656e657269634161766520616c726561647920696e697469616c697a656400604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526016908201527521696e76616c696420726566657272616c20636f646560501b604082015260600190565b60208082526017908201527f21636f6e646974696f6e7320617265206e6f74206d6574000000000000000000604082015260600190565b6020808252600b908201526a085b585b9859d95b595b9d60aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252601a908201527f4c656e64657220616c726561647920696e697469616c697a6564000000000000604082015260600190565b90815260200190565b6000838252604060208301526126966040830184614567565b600086825285602083015260a06040830152614abe60a0830186614567565b6001600160a01b0394909416606083015250608001529392505050565b60405181810167ffffffffffffffff81118282101715614afa57600080fd5b604052919050565b600067ffffffffffffffff821115614b18578081fd5b5060209081020190565b60005b83811015614b3d578181015183820152602001614b25565b83811115611a875750506000910152565b6001600160a01b038116811461180e57600080fd5b801515811461180e57600080fdfea264697066735822122074acbee843ed9b411379eac6ebcd29b40b2c8d880ac94b3e4c44089b6eb8253664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000032b8c26d0439e1959cea6262cbabc12320b384c40000000000000000000000000000000000000000000000000000000000000080000000000000000000000000028171bca77440897b824ca71d1c56cac55b68a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d416176654441494c656e64657200000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _strategy (address): 0x32b8C26d0439e1959CEa6262CBabC12320b384c4
Arg [1] : name (string): AaveDAILender
Arg [2] : _aToken (address): 0x028171bCA77440897B824Ca71D1c56caC55b68A3
Arg [3] : _isIncentivised (bool): True
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000032b8c26d0439e1959cea6262cbabc12320b384c4
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000028171bca77440897b824ca71d1c56cac55b68a3
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 416176654441494c656e64657200000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67052:14608:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60475:354;;;;;;:::i;:::-;;:::i;:::-;;70882:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72014:1312;;;;;;:::i;:::-;;:::i;58770:18::-;;;:::i;:::-;;;;;;;:::i;69573:124::-;;;;;;:::i;:::-;;:::i;67503:26::-;;;:::i;:::-;;;;;;;:::i;67201:135::-;;;:::i;68290:124::-;;;;;;:::i;:::-;;:::i;60367:100::-;;;;;;:::i;:::-;;:::i;73668:1174::-;;;:::i;67371:93::-;;;:::i;67757:91::-;;;:::i;69474:::-;;;;;;:::i;:::-;;:::i;69772:233::-;;;;;;:::i;:::-;;:::i;70786:88::-;;;:::i;73334:120::-;;;:::i;67473:21::-;;;:::i;70369:172::-;;;:::i;68816:456::-;;;;;;:::i;:::-;;:::i;70163:198::-;;;:::i;58795:33::-;;;:::i;:::-;;;;;;;:::i;67343:21::-;;;:::i;58731:32::-;;;:::i;67657:91::-;;;:::i;70549:88::-;;;:::i;70645:133::-;;;:::i;70013:142::-;;;:::i;71076:930::-;;;;;;:::i;:::-;;:::i;74850:113::-;;;;;;:::i;:::-;;:::i;59426:125::-;;;;;;:::i;:::-;;:::i;67857:124::-;;;:::i;69280:186::-;;;;;;:::i;:::-;;:::i;58835:19::-;;;:::i;58703:21::-;;;:::i;68422:309::-;;;;;;:::i;:::-;;:::i;60475:354::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;;;;;;;;;60554:33:::1;60590:17;:15;:17::i;:::-;60554:53;;60623:9;60618:102;60638:16;:23;60634:1;:27;60618:102;;;60686:16;60703:1;60686:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;60676:29:0::1;:6;-1:-1:-1::0;;;;;60676:29:0::1;;;60668:52;;;;-1:-1:-1::0;;;60668:52:0::1;;;;;;;:::i;:::-;60663:3;;60618:102;;;-1:-1:-1::0;60761:5:0::1;::::0;:18:::1;::::0;;-1:-1:-1;;;60761:18:0;;;;60733:88:::1;::::0;-1:-1:-1;;;;;60761:5:0::1;::::0;:16:::1;::::0;:18:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:18;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60781:39;::::0;-1:-1:-1;;;60781:39:0;;-1:-1:-1;;;;;60781:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;60814:4:::1;::::0;60781:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60733:27:0;::::1;::::0;:88;:27:::1;:88::i;:::-;61171:1;60475:354:::0;:::o;70882:132::-;70937:7;70957:9;70969:6;:4;:6::i;:::-;70957:18;;70993:13;70999:6;:4;:6::i;:::-;70993:1;;:5;:13::i;:::-;70986:20;;;70882:132;;:::o;72014:1312::-;72092:7;72210:40;;:::i;:::-;72253:14;:12;:14::i;:::-;72291:4;;72253:44;;-1:-1:-1;;;72253:44:0;;-1:-1:-1;;;;;72253:29:0;;;;;;:44;;72291:4;;;72253:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72495:4;;72451:50;;-1:-1:-1;;;72451:50:0;;72210:87;;-1:-1:-1;72311:26:0;;;;;;;;67292:42;;72451:35;;:50;;-1:-1:-1;;;;;72495:4:0;;;;72451:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72310:191;;;;;;;;;;;;;;72514:20;72537:35;72560:11;72537:18;:22;;:35;;;;:::i;:::-;72686:4;;72629:63;;-1:-1:-1;;;72629:63:0;;72514:58;;-1:-1:-1;72594:21:0;;67292:42;;72629:48;;:63;;-1:-1:-1;;;;;72686:4:0;;72629:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;72780:39:0;;;;72870:4;;72751:314;;-1:-1:-1;;;72751:314:0;;72585:107;;-1:-1:-1;72706:24:0;;-1:-1:-1;;;;;;72751:92:0;;;;-1:-1:-1;72751:92:0;;-1:-1:-1;72751:314:0;;-1:-1:-1;72870:4:0;;72894:12;;-1:-1:-1;72925:15:0;;-1:-1:-1;72959:17:0;;72995:23;;72585:107;;72751:314;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;72705:360:0;;-1:-1:-1;73078:22:0;;-1:-1:-1;73103:73:0;73119:56;73157:17;73119:33;:12;73136:15;73119:16;:33::i;:::-;:37;;:56::i;73103:73::-;73078:98;-1:-1:-1;73233:45:0;73078:98;73233:25;:16;73254:3;73233:20;:25::i;:45::-;73226:52;;;;;;;;;;;72014:1312;;;;:::o;58770:18::-;;;-1:-1:-1;;;;;58770:18:0;;:::o;69573:124::-;61022:8;;69645:7;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;69672:17:::1;69682:6;69672:9;:17::i;:::-;69665:24:::0;69573:124;-1:-1:-1;;69573:124:0:o;67503:26::-;;;-1:-1:-1;;;67503:26:0;;;;;:::o;67201:135::-;67292:42;67201:135;:::o;68290:124::-;68369:37;68381:7;68390:15;68369:11;:37::i;60367:100::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;60447:4:::1;:12:::0;60367:100::o;73668:1174::-;81469:6;;-1:-1:-1;;;;;81469:6:0;81447:10;:29;;:64;;-1:-1:-1;81502:8:0;;-1:-1:-1;;;;;81502:8:0;81480:10;:31;81447:64;:100;;;;81529:5;;;;;;;;-1:-1:-1;;;;;81529:5:0;-1:-1:-1;;;;;81529:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;81515:32:0;:10;-1:-1:-1;;;;;81515:32:0;;81447:100;:154;;;;81579:8;;;;;;;;;-1:-1:-1;;;;;81579:8:0;-1:-1:-1;;;;;81565:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;81551:50:0;:10;-1:-1:-1;;;;;81551:50:0;;81447:154;81425:212;;;;-1:-1:-1;;;81425:212:0;;;;;;;:::i;:::-;73722:16:::1;:14;:16::i;:::-;73714:52;;;;-1:-1:-1::0;;;73714:52:0::1;;;;;;;:::i;:::-;73839:49;::::0;-1:-1:-1;;;73839:49:0;;73814:22:::1;::::0;67421:42:::1;::::0;73839:34:::1;::::0;:49:::1;::::0;73882:4:::1;::::0;73839:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73814:74:::0;-1:-1:-1;73902:18:0;;73899:95:::1;;73937:45;::::0;-1:-1:-1;;;73937:45:0;;67421:42:::1;::::0;73937:14:::1;::::0;:45:::1;::::0;73960:4:::1;::::0;73967:14;;73937:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;73899:95;74059:37;::::0;-1:-1:-1;;;74059:37:0;;74037:19:::1;::::0;67805:42:::1;::::0;74059:22:::1;::::0;:37:::1;::::0;74090:4:::1;::::0;74059:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74037:59;;74107:29;74124:11;74107:16;:29::i;:::-;74221:4;::::0;:29:::1;::::0;-1:-1:-1;;;74221:29:0;;74203:15:::1;::::0;-1:-1:-1;;;;;74221:4:0::1;::::0;:14:::1;::::0;:29:::1;::::0;74244:4:::1;::::0;74221:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74203:47:::0;-1:-1:-1;74264:11:0;;74261:60:::1;;74292:17;74301:7;74292:8;:17::i;:::-;74385:16;::::0;;74399:1:::1;74385:16:::0;;;;;::::1;::::0;;;74359:23:::1;::::0;74385:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;74432:6:0::1;::::0;74412:9;;;;-1:-1:-1;;;;;;74432:6:0::1;::::0;74412:9;;-1:-1:-1;74432:6:0::1;::::0;74412:9:::1;;;;;;;;;:27;-1:-1:-1::0;;;;;74412:27:0::1;;;-1:-1:-1::0;;;;;74412:27:0::1;;;::::0;::::1;74450:22;74475:23;:21;:23::i;:::-;-1:-1:-1::0;;;;;74475:41:0::1;;74517:6;74533:4;74475:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74450:89:::0;-1:-1:-1;74553:18:0;;74550:125:::1;;74588:23;:21;:23::i;:::-;-1:-1:-1::0;;;;;74588:36:0::1;;74625:6;74633:14;74657:4;74588:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;74550:125;74735:49;::::0;-1:-1:-1;;;74735:49:0;;74787:1:::1;::::0;67421:42:::1;::::0;74735:34:::1;::::0;:49:::1;::::0;74778:4:::1;::::0;74735:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;74732:103;;;67421:42;-1:-1:-1::0;;;;;74805:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;74732:103;81648:1;;;;;73668:1174::o:0;67371:93::-;67421:42;67371:93;:::o;67757:91::-;67805:42;67757:91;:::o;69474:::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;69541:6:::1;:16:::0;;-1:-1:-1;;;;;;69541:16:0::1;-1:-1:-1::0;;;;;69541:16:0;;;::::1;::::0;;;::::1;::::0;;69474:91::o;69772:233::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;69855:14:::1;:12;:14::i;:::-;69887:4;::::0;69855:61:::1;::::0;-1:-1:-1;;;69855:61:0;;-1:-1:-1;;;;;69855:23:0;;::::1;::::0;::::1;::::0;:61:::1;::::0;69887:4;::::1;::::0;69894:6;;69910:4:::1;::::0;69855:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;69947:5:0::1;::::0;:18:::1;::::0;;-1:-1:-1;;;69947:18:0;;;;69929:68:::1;::::0;-1:-1:-1;;;;;69947:5:0::1;::::0;:16:::1;::::0;:18:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:18;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69967:4;::::0;:29:::1;::::0;-1:-1:-1;;;69967:29:0;;-1:-1:-1;;;;;69967:4:0;;::::1;::::0;:14:::1;::::0;:29:::1;::::0;69990:4:::1;::::0;69967:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69929:4;::::0;-1:-1:-1;;;;;69929:4:0::1;::::0;:68;:17:::1;:68::i;:::-;69772:233:::0;:::o;70786:88::-;70833:7;70860:6;:4;:6::i;:::-;70853:13;;70786:88;:::o;73334:120::-;73411:6;;:31;;-1:-1:-1;;;73411:31:0;;73387:4;;;;-1:-1:-1;;;;;73411:6:0;;;;:16;;:31;;73436:4;;73411:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;73404:42;;73334:120;:::o;67473:21::-;;;-1:-1:-1;;;;;67473:21:0;;:::o;70369:172::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;67421:42:::1;-1:-1:-1::0;;;;;70457:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70369:172::o:0;68816:456::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;69092:15:::1;69091:16;:75;;;-1:-1:-1::0;69119:6:0::1;::::0;:32:::1;::::0;;-1:-1:-1;;;69119:32:0;;;;69164:1:::1;::::0;-1:-1:-1;;;;;69119:6:0::1;::::0;:30:::1;::::0;:32:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:6;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69111:55:0::1;;;69091:75;69083:138;;;;-1:-1:-1::0;;;69083:138:0::1;;;;;;;:::i;:::-;69232:14;:32:::0;;;::::1;;-1:-1:-1::0;;;69232:32:0::1;-1:-1:-1::0;;;;69232:32:0;;::::1;::::0;;;::::1;::::0;;68816:456::o;70163:198::-;61022:8;;70224:4;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;70241:16:::1;70260:6;:4;:6::i;:::-;70241:25;;70277:16;70296:19;70306:8;70296:9;:19::i;:::-;70333:20:::0;;;::::1;;::::0;-1:-1:-1;;70163:198:0;:::o;58795:33::-;;;;;;;;;;;;;;;-1:-1:-1;;58795:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67343:21::-;;;-1:-1:-1;;;;;67343:21:0;;:::o;58731:32::-;;;-1:-1:-1;;;;;58731:32:0;;:::o;67657:91::-;67705:42;67657:91;:::o;70549:88::-;70596:7;70623:6;:4;:6::i;70645:133::-;70739:6;;:31;;-1:-1:-1;;;70739:31:0;;70701:15;;-1:-1:-1;;;;;70739:6:0;;:16;;:31;;70764:4;;70739:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70013:142::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;70090:4:::1;::::0;:29:::1;::::0;-1:-1:-1;;;70090:29:0;;70072:15:::1;::::0;-1:-1:-1;;;;;70090:4:0::1;::::0;:14:::1;::::0;:29:::1;::::0;70113:4:::1;::::0;70090:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70072:47;;70130:17;70139:7;70130:8;:17::i;71076:930::-:0;71335:14;;71146:7;;-1:-1:-1;;;71335:14:0;;;;:80;;;;;71371:23;:21;:23::i;:::-;-1:-1:-1;;;;;71371:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71353:15;:62;71335:80;71332:648;;;71432:27;71502:23;:21;:23::i;:::-;71547:6;;71502:53;;-1:-1:-1;;;71502:53:0;;-1:-1:-1;;;;;71502:36:0;;;;;;:53;;71547:6;;;71502:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;71474:81:0;-1:-1:-1;;71573:23:0;;71570:399;;71617:23;71643:32;71655:19;71643:11;:32::i;:::-;71617:58;-1:-1:-1;71727:22:0;71752:66;71803:14;71752:46;71793:4;71752:36;71617:58;68034:8;71752:19;:36::i;:::-;:40;;:46::i;:::-;:50;;:66::i;:::-;71727:91;-1:-1:-1;71867:37:0;71897:6;71867:25;71727:91;71886:5;71867:18;:25::i;:37::-;71860:44;;;;;;;71570:399;71332:648;;-1:-1:-1;71997:1:0;71076:930;;;:::o;74850:113::-;74915:4;74939:16;:14;:16::i;59426:125::-;59514:29;59526:9;59537:5;59514:11;:29::i;67857:124::-;67937:42;67857:124;:::o;69280:186::-;61022:8;;-1:-1:-1;;;;;61022:8:0;61000:10;:31;;:67;;;61049:5;;;;;;;;-1:-1:-1;;;;;61049:5:0;-1:-1:-1;;;;;61049:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61035:32:0;:10;-1:-1:-1;;;;;61035:32:0;;61000:67;:121;;;;61099:8;;;;;;;;;-1:-1:-1;;;;;61099:8:0;-1:-1:-1;;;;;61085:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61071:50:0;:10;-1:-1:-1;;;;;61071:50:0;;61000:121;60978:182;;;;-1:-1:-1;;;60978:182:0;;;;;;;:::i;:::-;69368:20:::1;::::0;::::1;69360:55;;;;-1:-1:-1::0;;;69360:55:0::1;;;;;;;:::i;:::-;69426:14;:32:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;69426:32:0::1;-1:-1:-1::0;;;;69426:32:0;;::::1;::::0;;;::::1;::::0;;69280:186::o;58835:19::-;;;;:::o;58703:21::-;;;-1:-1:-1;;;;;58703:21:0;;:::o;68422:309::-;68587:17;68629:24;68636:9;68647:5;68629:6;:24::i;:::-;68664:59;;-1:-1:-1;;;68664:59:0;;68617:36;;-1:-1:-1;;;;;;68664:33:0;;;;;:59;;68698:7;;68707:15;;68664:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68422:309;;;;;;:::o;51777:622::-;52147:10;;;52146:62;;-1:-1:-1;52163:39:0;;-1:-1:-1;;;52163:39:0;;-1:-1:-1;;;;;52163:15:0;;;;;:39;;52187:4;;52194:7;;52163:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;52146:62;52138:152;;;;-1:-1:-1;;;52138:152:0;;;;;;;:::i;:::-;52301:90;52321:5;52351:22;;;52375:7;52384:5;52328:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52328:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;52328:62:0;-1:-1:-1;;;;;;52328:62:0;;;;;;;;;;52301:19;:90::i;:::-;51777:622;;;:::o;18166:196::-;18269:12;18301:53;18324:6;18332:4;18338:1;18341:12;18301:22;:53::i;:::-;18294:60;18166:196;-1:-1:-1;;;;18166:196:0:o;81139:248::-;81256:16;;;81270:1;81256:16;;;81198;81256;;;;;81198;;;81256;81270:1;81256:16;;;;;;;;-1:-1:-1;;81306:4:0;;81283:12;;;;-1:-1:-1;;;;;;81306:4:0;;81283:12;;-1:-1:-1;81306:4:0;;81283:12;;;;-1:-1:-1;;;;;81283:28:0;;;:12;;;;;;;;;:28;81345:6;;81322:12;;81345:6;;;81322:9;;81345:6;;81322:12;;;;;;-1:-1:-1;;;;;81322:30:0;;;:12;;;;;;;;;;;:30;81370:9;-1:-1:-1;81139:248:0;:::o;51118:177::-;51201:86;51221:5;51251:23;;;51276:2;51280:5;51228:58;;;;;;;;;:::i;75706:601::-;75745:7;75765:21;75789:83;75868:3;75797:14;:12;:14::i;:::-;75835:4;;75797:44;;-1:-1:-1;;;75797:44:0;;-1:-1:-1;;;;;75797:29:0;;;;;;:44;;75835:4;;;75797:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;;-1:-1:-1;;;;;75789:74:0;;:78;:83::i;:::-;76088:4;;76044:50;;-1:-1:-1;;;76044:50:0;;75765:107;;-1:-1:-1;75927:26:0;;;;;;67292:42;;76044:35;;:50;;-1:-1:-1;;;;;76088:4:0;;76044:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75926:168;;;;;;;;;;;;;76105:22;76130:79;76146:62;76190:17;76146:39;76169:15;76146:18;:22;;:39;;;;:::i;76130:79::-;76105:104;-1:-1:-1;76266:33:0;:13;76105:104;76266:17;:33::i;:::-;76259:40;;;;;;;75706:601;:::o;75564:134::-;75603:7;75630:60;75664:25;:23;:25::i;:::-;75630:4;;:29;;-1:-1:-1;;;75630:29:0;;-1:-1:-1;;;;;75630:4:0;;;;:14;;:29;;75653:4;;75630:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25560:471::-;25618:7;25863:6;25859:47;;-1:-1:-1;25893:1:0;25886:8;;25859:47;25930:5;;;25934:1;25930;:5;:1;25954:5;;;;;:10;25946:56;;;;-1:-1:-1;;;25946:56:0;;;;;;;:::i;:::-;26022:1;25560:471;-1:-1:-1;;;25560:471:0:o;78496:178::-;78543:24;67292:42;-1:-1:-1;;;;;78607:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78607:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24206:181::-;24264:7;24296:5;;;24320:6;;;;24312:46;;;;-1:-1:-1;;;24312:46:0;;;;;;;:::i;26507:132::-;26565:7;26592:39;26596:1;26599;26592:39;;;;;;;;;;;;;;;;;:3;:39::i;76368:1218::-;76469:6;;:31;;-1:-1:-1;;;76469:31:0;;76421:7;;;;-1:-1:-1;;;;;76469:6:0;;;;:16;;:31;;76494:4;;76469:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76534:4;;:29;;-1:-1:-1;;;76534:29:0;;76441:59;;-1:-1:-1;76511:20:0;;-1:-1:-1;;;;;76534:4:0;;;;:14;;:29;;76557:4;;76534:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76511:52;-1:-1:-1;76574:13:0;76590:35;:17;76511:52;76590:21;:35::i;:::-;76574:51;;76651:5;76642:6;:14;76638:107;;;76728:5;76719:14;;76638:107;76777:6;76761:12;:22;76757:127;;76826:8;;76800:4;;:44;;-1:-1:-1;;;;;76800:4:0;;;;76826:8;76837:6;76800:17;:44::i;:::-;76866:6;76859:13;;;;;;;76757:127;76978:4;;77001:6;;76978:31;;-1:-1:-1;;;76978:31:0;;76958:17;;-1:-1:-1;;;;;76978:4:0;;;;:14;;:31;;77001:6;;;;76978:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76958:51;;77038:1;77026:9;:13;77022:411;;;77056:18;77077:24;:6;77088:12;77077:10;:24::i;:::-;77056:45;;77136:9;77122:10;:23;77118:304;;77201:14;:12;:14::i;:::-;77233:4;;77201:65;;-1:-1:-1;;;77201:65:0;;-1:-1:-1;;;;;77201:23:0;;;;;;:65;;77233:4;;;77240:10;;77260:4;;77201:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77118:304;;;77342:14;:12;:14::i;:::-;77374:4;;77342:64;;-1:-1:-1;;;77342:64:0;;-1:-1:-1;;;;;77342:23:0;;;;;;:64;;77374:4;;;77381:9;;77400:4;;77342:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77118:304;77022:411;;77458:4;;:29;;-1:-1:-1;;;77458:29:0;;-1:-1:-1;;;;;77458:4:0;;;;:14;;:29;;77481:4;;77458:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77524:8;;77498:4;;77443:44;;-1:-1:-1;77498:50:0;;-1:-1:-1;;;;;77498:4:0;;;;77524:8;77443:44;77498:17;:50::i;:::-;-1:-1:-1;77566:12:0;;76368:1218;-1:-1:-1;;;;76368:1218:0:o;74971:585::-;75067:6;;-1:-1:-1;;;;;75067:6:0;75059:29;75051:73;;;;-1:-1:-1;;;75051:73:0;;;;;;;:::i;:::-;75146:15;75145:16;:76;;;;75219:1;-1:-1:-1;;;;;75165:56:0;75173:7;-1:-1:-1;;;;;75173:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75165:56:0;;;75145:76;75137:139;;;;-1:-1:-1;;;75137:139:0;;;;;;;:::i;:::-;75287:14;:32;;-1:-1:-1;;;;75287:32:0;-1:-1:-1;;;75287:32:0;;;;;;;75330:6;:16;;-1:-1:-1;;;;;;75330:16:0;-1:-1:-1;;;;;75330:16:0;;;;;;;;75365:14;:12;:14::i;:::-;75403:4;;75365:44;;-1:-1:-1;;;75365:44:0;;-1:-1:-1;;;;;75365:29:0;;;;;;:44;;75403:4;;;75365:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;-1:-1:-1;;;;;75365:78:0;;75357:103;;;;-1:-1:-1;;;75357:103:0;;;;;;;:::i;:::-;75471:77;75513:14;:12;:14::i;:::-;75486:4;;-1:-1:-1;;;;;75486:4:0;;-1:-1:-1;;75471:33:0;:77::i;78682:651::-;78752:14;;78731:4;;-1:-1:-1;;;78752:14:0;;;;78748:59;;-1:-1:-1;78790:5:0;78783:12;;78748:59;78852:52;;-1:-1:-1;;;78852:52:0;;78819:30;;67421:42;;78852:37;;:52;;78898:4;;78852:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78819:85;;78915:24;67421:42;-1:-1:-1;;;;;78942:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78915:66;;78992:22;67421:42;-1:-1:-1;;;;;79017:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78992:62;-1:-1:-1;79087:44:0;:22;79114:16;79087:26;:44::i;:::-;79068:15;:63;79065:261;;79224:14;79155:65;79175:44;:22;79202:16;79175:26;:44::i;:::-;79155:15;;:19;:65::i;:::-;:83;;:114;;;-1:-1:-1;79242:27:0;;79155:114;79148:121;;;;;;;79065:261;79309:5;79302:12;;;;;;;79986:883;80053:12;80049:51;;80082:7;;80049:51;80157:4;;80112:21;;-1:-1:-1;;;;;80157:4:0;67705:42;80149:30;80146:331;;;80203:16;;;80217:1;80203:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80203:16:0;80196:23;;67805:42;80234:4;80239:1;80234:7;;;;;;;;-1:-1:-1;;;;;80234:23:0;;;:7;;;;;;;;;:23;80290:4;;80272:7;;80290:4;;;80272;;80290;;80272:7;;;;;;;;;;;:23;-1:-1:-1;;;;;80272:23:0;;;-1:-1:-1;;;;;80272:23:0;;;;;80146:331;;;80335:16;;;80349:1;80335:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80335:16:0;80328:23;;67805:42;80366:4;80371:1;80366:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;80366:23:0;;;-1:-1:-1;;;;;80366:23:0;;;;;67705:42;80404:4;80409:1;80404:7;;;;;;;;-1:-1:-1;;;;;80404:23:0;;;:7;;;;;;;;;:23;80460:4;;;80442:7;;80460:4;;;80442;;80460;80442:7;;;;;;;;;;;:23;-1:-1:-1;;;;;80442:23:0;;;-1:-1:-1;;;;;80442:23:0;;;;;80146:331;80492:54;;-1:-1:-1;;;80492:54:0;;80549:7;;67805:42;;80492:22;;:54;;80523:4;;67937:42;;80492:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;80489:215;;;80573:44;67805:42;67937;80615:1;80573:24;:44::i;:::-;80632:60;67805:42;67937;-1:-1:-1;;80632:24:0;:60::i;:::-;80716:145;;-1:-1:-1;;;80716:145:0;;67937:42;;80716:31;;:145;;80762:7;;80784:1;;80800:4;;80827;;80847:3;;80716:145;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;80716:145:0;;;;;;;;;;;;:::i;77594:894::-;77648:15;77666:14;:12;:14::i;:::-;77976:4;;:42;;-1:-1:-1;;;77976:42:0;;77648:32;;-1:-1:-1;78021:6:0;;-1:-1:-1;;;;;77976:4:0;;;;:14;;:42;;77999:4;;77648:32;;77976:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;77973:211;;;78058:4;;78043:49;;-1:-1:-1;;;;;78058:4:0;78085:2;78090:1;78043:33;:49::i;:::-;78122:4;;78107:65;;-1:-1:-1;;;;;78122:4:0;78149:2;-1:-1:-1;;78107:33:0;:65::i;:::-;78247:14;;78196:15;;-1:-1:-1;;;78247:14:0;;;;78275:20;;78272:138;;78323:15;78312:26;;78272:138;;;67580:3;78371:27;;78272:138;78441:4;;78422:58;;-1:-1:-1;;;78422:58:0;;-1:-1:-1;;;;;78422:10:0;;;;;;:58;;78441:4;;;;78448:6;;78464:4;;78471:8;;78422:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77594:894;;;;:::o;80877:254::-;80974:14;;80933:25;;-1:-1:-1;;;80974:14:0;;;;80971:153;;;81012:6;;;;;;;;;-1:-1:-1;;;;;81012:6:0;-1:-1:-1;;;;;81012:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81005:39;;;;80971:153;-1:-1:-1;81110:1:0;81077:35;;79341:637;79402:7;79425:12;79422:52;;-1:-1:-1;79461:1:0;79454:8;;79422:52;79531:4;;79486:21;;-1:-1:-1;;;;;79531:4:0;67705:42;79523:30;79520:331;;;79577:16;;;79591:1;79577:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79577:16:0;79570:23;;67805:42;79608:4;79613:1;79608:7;;;;;;;;-1:-1:-1;;;;;79608:23:0;;;:7;;;;;;;;;:23;79664:4;;79646:7;;79664:4;;;79646;;79664;;79646:7;;;;;;;;;;;:23;-1:-1:-1;;;;;79646:23:0;;;-1:-1:-1;;;;;79646:23:0;;;;;79520:331;;;79709:16;;;79723:1;79709:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79709:16:0;79702:23;;67805:42;79740:4;79745:1;79740:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;79740:23:0;;;-1:-1:-1;;;;;79740:23:0;;;;;67705:42;79778:4;79783:1;79778:7;;;;;;;;-1:-1:-1;;;;;79778:23:0;;;:7;;;;;;;;;:23;79834:4;;;79816:7;;79834:4;;;79816;;79834;79816:7;;;;;;;;;;;:23;-1:-1:-1;;;;;79816:23:0;;;-1:-1:-1;;;;;79816:23:0;;;;;79520:331;79890:35;;-1:-1:-1;;;79890:35:0;;79863:24;;67937:42;;79890:20;;:35;;79911:7;;79920:4;;79890:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;79890:35:0;;;;;;;;;;;;:::i;:::-;79863:62;;79943:7;79968:1;79951:7;:14;:18;79943:27;;;;;;;;;;;;;;79936:34;;;;79341:637;;;:::o;59022:396::-;59119:8;;-1:-1:-1;;;;;59119:8:0;59111:31;59103:70;;;;-1:-1:-1;;;59103:70:0;;;;;;;:::i;:::-;59186:8;:20;;-1:-1:-1;;;;;;59186:20:0;-1:-1:-1;;;;;59186:20:0;;;;;;;;;;;59234:31;;;-1:-1:-1;;;59234:31:0;;;;59248:8;;;;;59234:29;;:31;;;;;;;;;;;;;;;59248:8;59234:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59217:5;:49;;-1:-1:-1;;;;;;59217:49:0;-1:-1:-1;;;;;59217:49:0;;;;;;;;59291:13;;;-1:-1:-1;;;59291:13:0;;;;:5;;;;;:11;;:13;;;;;;;;;;;;;;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59277:4;:28;;-1:-1:-1;;;;;;59277:28:0;-1:-1:-1;;;;;59277:28:0;;;;;;;;;;59316:18;;;;:10;;:18;;;;;:::i;:::-;-1:-1:-1;59352:5:0;59345:4;:12;59370:4;;:40;;-1:-1:-1;;;;;59370:4:0;59387:9;-1:-1:-1;;59370:16:0;:40::i;59559:800::-;59911:4;59905:11;-1:-1:-1;;;59930:86:0;;59810:4;59794:22;;60053:4;60037:21;;60030:43;;;-1:-1:-1;;;60110:4:0;60094:21;;60087:97;59633:17;;60233:4;59905:11;59633:17;60211:27;60261:57;;-1:-1:-1;;;60261:57:0;;60198:40;;-1:-1:-1;;;;;;60261:39:0;;;-1:-1:-1;60261:39:0;;:57;;60301:9;;60312:5;;60261:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60334:17:0;;-1:-1:-1;;;;;60334:17:0;;;-1:-1:-1;60334:17:0;;-1:-1:-1;60334:17:0;;;59559:800;;;;;:::o;53423:761::-;53847:23;53873:69;53901:4;53873:69;;;;;;;;;;;;;;;;;53881:5;-1:-1:-1;;;;;53873:27:0;;;:69;;;;;:::i;:::-;53957:17;;53847:95;;-1:-1:-1;53957:21:0;53953:224;;54099:10;54088:30;;;;;;;;;;;;:::i;:::-;54080:85;;;;-1:-1:-1;;;54080:85:0;;;;;;;:::i;19543:979::-;19673:12;19706:18;19717:6;19706:10;:18::i;:::-;19698:60;;;;-1:-1:-1;;;19698:60:0;;;;;;;:::i;:::-;19832:12;19846:23;19873:6;-1:-1:-1;;;;;19873:11:0;19893:8;19904:4;19873:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19831:78;;;;19924:7;19920:595;;;19955:10;-1:-1:-1;19948:17:0;;-1:-1:-1;19948:17:0;19920:595;20069:17;;:21;20065:439;;20332:10;20326:17;20393:15;20380:10;20376:2;20372:19;20365:44;20280:148;20475:12;20468:20;;-1:-1:-1;;;20468:20:0;;;;;;;;:::i;27135:278::-;27221:7;27256:12;27249:5;27241:28;;;;-1:-1:-1;;;27241:28:0;;;;;;;;:::i;:::-;;27280:9;27296:1;27292;:5;;;;;;;27135:278;-1:-1:-1;;;;;27135:278:0:o;24670:136::-;24728:7;24755:43;24759:1;24762;24755:43;;;;;;;;;;;;;;;;;:3;:43::i;15051:619::-;15111:4;15579:20;;15422:66;15619:23;;;;;;:42;;-1:-1:-1;;15646:15:0;;;15611:51;-1:-1:-1;;15051:619:0:o;25109:192::-;25195:7;25231:12;25223:6;;;;25215:29;;;;-1:-1:-1;;;25215:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;25267:5:0;;;25109:192::o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;142:134;220:13;;238:33;220:13;238:33;:::i;1889:442::-;;1991:3;1984:4;1976:6;1972:17;1968:27;1958:2;;-1:-1;;1999:12;1958:2;2046:6;2033:20;37706:18;37698:6;37695:30;37692:2;;;-1:-1;;37728:12;37692:2;2068:65;37801:9;37782:17;;-1:-1;;37778:33;37869:4;37859:15;2068:65;:::i;:::-;2059:74;;2153:6;2146:5;2139:21;2257:3;37869:4;2248:6;2181;2239:16;;2236:25;2233:2;;;2274:1;;2264:12;2233:2;42285:6;37869:4;2181:6;2177:17;37869:4;2215:5;2211:16;42262:30;42341:1;42323:16;;;37869:4;42323:16;42316:27;2215:5;1951:380;-1:-1;;1951:380::o;2386:359::-;;2525:4;2513:9;2508:3;2504:19;2500:30;2497:2;;;-1:-1;;2533:12;2497:2;2561:20;2525:4;2561:20;:::i;:::-;5566:13;;2638:86;;-1:-1;2552:29;2491:254;-1:-1;2491:254::o;5075:134::-;5153:13;;-1:-1;;;;;39709:46;;43584:35;;43574:2;;43633:1;;43623:12;5629:132;5706:13;;40137:12;40126:24;;43953:34;;43943:2;;44001:1;;43991:12;5768:130;5844:13;;40233:4;40222:16;;44074:33;;44064:2;;44121:1;;44111:12;5905:241;;6009:2;5997:9;5988:7;5984:23;5980:32;5977:2;;;-1:-1;;6015:12;5977:2;85:6;72:20;97:33;124:5;97:33;:::i;6153:263::-;;6268:2;6256:9;6247:7;6243:23;6239:32;6236:2;;;-1:-1;;6274:12;6236:2;226:6;220:13;238:33;265:5;238:33;:::i;6423:472::-;;;6554:2;6542:9;6533:7;6529:23;6525:32;6522:2;;;-1:-1;;6560:12;6522:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6612:63;-1:-1;6740:2;6725:18;;6712:32;6764:18;6753:30;;6750:2;;;-1:-1;;6786:12;6750:2;6816:63;6871:7;6862:6;6851:9;6847:22;6816:63;:::i;:::-;6806:73;;;6516:379;;;;;:::o;6902:749::-;;;;;7080:3;7068:9;7059:7;7055:23;7051:33;7048:2;;;-1:-1;;7087:12;7048:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7139:63;-1:-1;7267:2;7252:18;;7239:32;7291:18;7280:30;;7277:2;;;-1:-1;;7313:12;7277:2;7343:63;7398:7;7389:6;7378:9;7374:22;7343:63;:::i;:::-;7333:73;;;7443:2;7502:9;7498:22;1380:20;1405:49;1448:5;1405:49;:::i;:::-;7451:79;-1:-1;7567:2;7603:22;;1095:20;1120:30;1095:20;1120:30;:::i;:::-;7042:609;;;;-1:-1;7042:609;;-1:-1;;7042:609::o;7658:392::-;;7798:2;;7786:9;7777:7;7773:23;7769:32;7766:2;;;-1:-1;;7804:12;7766:2;7855:17;7849:24;7893:18;7885:6;7882:30;7879:2;;;-1:-1;;7915:12;7879:2;8002: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;;;5566:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;7935:99;7760:290;-1:-1;;;;;;;7760:290::o;8057:235::-;;8158:2;8146:9;8137:7;8133:23;8129:32;8126:2;;;-1:-1;;8164:12;8126:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;8299:257::-;;8411:2;8399:9;8390:7;8386:23;8382:32;8379:2;;;-1:-1;;8417:12;8379:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;8563:392::-;;;8697:2;8685:9;8676:7;8672:23;8668:32;8665:2;;;-1:-1;;8703:12;8665:2;1393:6;1380:20;1405:49;1448:5;1405:49;:::i;:::-;8755:79;-1:-1;8871:2;8907:22;;1095:20;1120:30;1095:20;1120:30;:::i;:::-;8879:60;;;;8659:296;;;;;:::o;9642:318::-;;9784:3;;9772:9;9763:7;9759:23;9755:33;9752:2;;;-1:-1;;9791:12;9752:2;2952:22;9784:3;2952:22;:::i;:::-;2943:31;;3065:99;3160:3;3136:22;3065:99;:::i;:::-;3047:16;3040:125;3269:60;3325:3;3236:2;3305:9;3301:22;3269:60;:::i;:::-;3236:2;3255:5;3251:16;3244:86;3439:60;3495:3;3406:2;3475:9;3471:22;3439:60;:::i;:::-;3406:2;3425:5;3421:16;3414:86;3610:60;3666:3;3577:2;3646:9;3642:22;3610:60;:::i;:::-;3577:2;3596:5;3592:16;3585:86;3787:60;3843:3;3753;3823:9;3819:22;3787:60;:::i;:::-;3753:3;3773:5;3769:16;3762:86;3962:60;4018:3;3928;3998:9;3994:22;3962:60;:::i;:::-;3928:3;3948:5;3944:16;3937:86;4133:59;4188:3;4099;4168:9;4164:22;4133:59;:::i;:::-;4099:3;4119:5;4115:16;4108:85;4297:60;4353:3;4263;4333:9;4329:22;4297:60;:::i;:::-;4263:3;4283:5;4279:16;4272:86;4437:3;4473:60;4529:3;4437;4509:9;4505:22;4473:60;:::i;:::-;4453:18;;;4446:88;4615:3;4651:60;4707:3;4683:22;;;4651:60;:::i;:::-;4631:18;;;4624:88;4796:3;4832:60;4888:3;4864:22;;;4832:60;:::i;:::-;4812:18;;;4805:88;4952:3;4988:58;5042:3;5018:22;;;4988:58;:::i;:::-;4968:18;;;4961:86;4972:5;9746:214;-1:-1;;;9746:214::o;9967:239::-;;10070:2;10058:9;10049:7;10045:23;10041:32;10038:2;;;-1:-1;;10076:12;10038:2;5295:6;5282:20;39839:6;43734:5;39828:18;43710:5;43707:34;43697:2;;-1:-1;;43745:12;10213:241;;10317:2;10305:9;10296:7;10292:23;10288:32;10285:2;;;-1:-1;;10323:12;10285:2;-1:-1;5418:20;;10279:175;-1:-1;10279:175::o;10461:263::-;;10576:2;10564:9;10555:7;10551:23;10547:32;10544:2;;;-1:-1;;10582:12;10544:2;-1:-1;5566:13;;10538:186;-1:-1;10538:186::o;10731:535::-;;;;10880:2;10868:9;10859:7;10855:23;10851:32;10848:2;;;-1:-1;;10886:12;10848:2;5572:6;5566:13;10938:74;;11049:2;11103:9;11099:22;5566:13;11057:74;;11168:2;11222:9;11218:22;5566:13;11176:74;;10842:424;;;;;:::o;11273:1464::-;;;;;;;;;;;11526:3;11514:9;11505:7;11501:23;11497:33;11494:2;;;-1:-1;;11533:12;11494:2;5572:6;5566:13;11585:74;;11696:2;11750:9;11746:22;5566:13;11704:74;;11815:2;11869:9;11865:22;5566:13;11823:74;;11934:2;11988:9;11984:22;5566:13;11942:74;;12053:3;12108:9;12104:22;5566:13;12062:74;;12173:3;12225:9;12221:22;1237:13;1255:30;1279:5;1255:30;:::i;:::-;12290:3;12338:22;;1237:13;12182:71;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;12407:3;12455:22;;1237:13;12299:71;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;12524:3;12572:22;;1237:13;12416:71;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;12641:3;12689:22;;1237:13;12533:71;;-1:-1;1255:30;1237:13;1255:30;:::i;:::-;12650:71;;;;11488:1249;;;;;;;;;;;;;:::o;12744:1492::-;;;;;;;;;;;13011:3;12999:9;12990:7;12986:23;12982:33;12979:2;;;-1:-1;;13018:12;12979:2;5572:6;5566:13;13070:74;;13181:2;13235:9;13231:22;5566:13;13189:74;;13300:2;13354:9;13350:22;5566:13;13308:74;;13419:2;13473:9;13469:22;5566:13;13427:74;;13538:3;13593:9;13589:22;5566:13;13547:74;;13658:3;13713:9;13709:22;5566:13;13667:74;;13778:3;13833:9;13829:22;5566:13;13787:74;;13898:3;13953:9;13949:22;5566:13;13907:74;;14018:3;14073:9;14069:22;5566:13;14027:74;;14157:63;14212:7;14138:3;14192:9;14188:22;14157:63;:::i;:::-;14147:73;;12973:1263;;;;;;;;;;;;;:::o;14686:690::-;;14879:5;38152:12;38696:6;38691:3;38684:19;38733:4;;38728:3;38724:14;14891:93;;38733:4;15055:5;38006:14;-1:-1;15094:260;15119:6;15116:1;15113:13;15094:260;;;15180:13;;-1:-1;;;;;39920:54;14486:37;;14397:14;;;;38539;;;;37706:18;15134:9;15094:260;;;-1:-1;15360:10;;14810:566;-1:-1;;;;;14810:566::o;17053:347::-;;17198:5;38152:12;38696:6;38691:3;38684:19;17292:52;17337:6;38733:4;38728:3;38724:14;38733:4;17318:5;17314:16;17292:52;:::i;:::-;37801:9;42702:14;-1:-1;;42698:28;17356:39;;;;38733:4;17356:39;;17145:255;-1:-1;;17145:255::o;22495:271::-;;15655:5;38152:12;15766:52;15811:6;15806:3;15799:4;15792:5;15788:16;15766:52;:::i;:::-;15830:16;;;;;22629:137;-1:-1;;22629:137::o;22773:222::-;-1:-1;;;;;39920:54;;;;14486:37;;22900:2;22885:18;;22871:124::o;23002:333::-;-1:-1;;;;;39920:54;;;14486:37;;39920:54;;23321:2;23306:18;;14486:37;23157:2;23142:18;;23128:207::o;23342:421::-;-1:-1;;;;;39920:54;;14486:37;;23517:2;23635;23620:18;;23613:48;;;23342:421;;23675:78;;23502:18;;23739:6;23675:78;:::i;23770:333::-;-1:-1;;;;;39920:54;;;;14486:37;;24089:2;24074:18;;22446:37;23925:2;23910:18;;23896:207::o;24110:444::-;-1:-1;;;;;39920:54;;;14486:37;;24457:2;24442:18;;22446:37;;;;39920:54;;;24540:2;24525:18;;14486:37;24293:2;24278:18;;24264:290::o;24561:552::-;-1:-1;;;;;39920:54;;;14486:37;;24935:2;24920:18;;22446:37;;;;39920:54;;25018:2;25003:18;;14486:37;39839:6;39828:18;;;25099:2;25084:18;;22327:36;24770:3;24755:19;;24741:372::o;25120:780::-;-1:-1;;;;;39920:54;;;;14486:37;;25552:2;25537:18;;22446:37;;;;25635:2;25620:18;;22446:37;;;;25718:2;25703:18;;22446:37;25801:3;25786:19;;22446:37;39931:42;25870:19;;22446:37;25387:3;25372:19;;25358:542::o;25907:481::-;;26112:2;26133:17;26126:47;26187:108;26112:2;26101:9;26097:18;26281:6;26187:108;:::i;:::-;26179:116;;37706:18;;39931:42;;;14516:5;39920:54;26374:2;26363:9;26359:18;14486:37;26083:305;;;;;:::o;26395:592::-;;26628:2;26649:17;26642:47;26703:108;26628:2;26617:9;26613:18;26797:6;26703:108;:::i;:::-;26890:2;26875:18;;22446:37;;;;-1:-1;;;;;;39920:54;;;;26973:2;26958:18;;;14486:37;26695:116;26599:388;-1:-1;26599:388::o;26994:210::-;39241:13;;39234:21;15449:34;;27115:2;27100:18;;27086:118::o;27472:353::-;-1:-1;;;;;39920:54;;;;15945:66;;39241:13;39234:21;27811:2;27796:18;;15449:34;27637:2;27622:18;;27608:217::o;29193:310::-;;29340:2;29361:17;29354:47;29415:78;29340:2;29329:9;29325:18;29479:6;29415:78;:::i;29510:416::-;29710:2;29724:47;;;17632:2;29695:18;;;38684:19;17668:34;38724:14;;;17648:55;-1:-1;;;17723:12;;;17716:42;17777:12;;;29681:245::o;29933:416::-;30133:2;30147:47;;;18028:2;30118:18;;;38684:19;18064:29;38724:14;;;18044:50;18113:12;;;30104:245::o;30356:416::-;30556:2;30570:47;;;18364:2;30541:18;;;38684:19;-1:-1;;;38724:14;;;18380:35;18434:12;;;30527:245::o;30779:416::-;30979:2;30993:47;;;18685:1;30964:18;;;38684:19;-1:-1;;;38724:14;;;18700:31;18750:12;;;30950:245::o;31202:416::-;31402:2;31416:47;;;19001:2;31387:18;;;38684:19;19037:34;38724:14;;;19017:55;-1:-1;;;19092:12;;;19085:25;19129:12;;;31373:245::o;31625:416::-;31825:2;31839:47;;;19380:2;31810:18;;;38684:19;19416:33;38724:14;;;19396:54;19469:12;;;31796:245::o;32048:416::-;32248:2;32262:47;;;19720:2;32233:18;;;38684:19;19756:31;38724:14;;;19736:52;19807:12;;;32219:245::o;32471:416::-;32671:2;32685:47;;;20058:2;32656:18;;;38684:19;-1:-1;;;38724:14;;;20074:45;20138:12;;;32642:245::o;32894:416::-;33094:2;33108:47;;;20389:2;33079:18;;;38684:19;20425:25;38724:14;;;20405:46;20470:12;;;33065:245::o;33317:416::-;33517:2;33531:47;;;20721:2;33502:18;;;38684:19;-1:-1;;;38724:14;;;20737:34;20790:12;;;33488:245::o;33740:416::-;33940:2;33954:47;;;21041:2;33925:18;;;38684:19;21077:34;38724:14;;;21057:55;-1:-1;;;21132:12;;;21125:34;21178:12;;;33911:245::o;34163:416::-;34363:2;34377:47;;;21429:2;34348:18;;;38684:19;-1:-1;;;38724:14;;;21445:33;21497:12;;;34334:245::o;34586:416::-;34786:2;34800:47;;;21748:2;34771:18;;;38684:19;21784:34;38724:14;;;21764:55;-1:-1;;;21839:12;;;21832:46;21897:12;;;34757:245::o;35009:416::-;35209:2;35223:47;;;22148:2;35194:18;;;38684:19;22184:28;38724:14;;;22164:49;22232:12;;;35180:245::o;35432:222::-;22446:37;;;35559:2;35544:18;;35530:124::o;35661:481::-;;22476:5;22453:3;22446:37;35866:2;35984;35973:9;35969:18;35962:48;36024:108;35866:2;35855:9;35851:18;36118:6;36024:108;:::i;36149:832::-;;22476:5;22453:3;22446:37;42167:24;36619:2;36608:9;36604:18;16983:58;36446:3;36656:2;36645:9;36641:18;36634:48;36696:108;36446:3;36435:9;36431:19;36790:6;36696:108;:::i;:::-;-1:-1;;;;;39920:54;;;;36883:2;36868:18;;14486:37;-1:-1;36966:3;36951:19;22446:37;36688:116;36417:564;-1:-1;;;36417:564::o;36988:256::-;37050:2;37044:9;37076:17;;;37151:18;37136:34;;37172:22;;;37133:62;37130:2;;;37208:1;;37198:12;37130:2;37050;37217:22;37028:216;;-1:-1;37028:216::o;37251:304::-;;37410:18;37402:6;37399:30;37396:2;;;-1:-1;;37432:12;37396:2;-1:-1;37477:4;37465:17;;;37530:15;;37333:222::o;42358:268::-;42423:1;42430:101;42444:6;42441:1;42438:13;42430:101;;;42511:11;;;42505:18;42492:11;;;42485:39;42466:2;42459:10;42430:101;;;42546:6;42543:1;42540:13;42537:2;;;-1:-1;;42423:1;42593:16;;42586:27;42407:219::o;42739:117::-;-1:-1;;;;;39920:54;;42798:35;;42788:2;;42847:1;;42837:12;42863:111;42944:5;39241:13;39234:21;42922:5;42919:32;42909:2;;42965:1;;42955:12
Swarm Source
ipfs://74acbee843ed9b411379eac6ebcd29b40b2c8d880ac94b3e4c44089b6eb82536
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.