Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 53 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Flash Exercise | 13149638 | 1254 days ago | IN | 0 ETH | 0.02819447 | ||||
Flash Exercise | 13146208 | 1255 days ago | IN | 0 ETH | 0.03037909 | ||||
Flash Exercise | 13059865 | 1268 days ago | IN | 0 ETH | 0.00592263 | ||||
Flash Exercise | 13012455 | 1275 days ago | IN | 0 ETH | 0.01838243 | ||||
Flash Exercise | 13012301 | 1275 days ago | IN | 0 ETH | 0.01370742 | ||||
Flash Exercise | 12923129 | 1289 days ago | IN | 0 ETH | 0.00837225 | ||||
Flash Exercise | 12835172 | 1303 days ago | IN | 0 ETH | 0.01139699 | ||||
Flash Exercise | 12744704 | 1317 days ago | IN | 0 ETH | 0.00257487 | ||||
Flash Exercise | 12509987 | 1354 days ago | IN | 0 ETH | 0.0110249 | ||||
Flash Exercise | 12444134 | 1364 days ago | IN | 0 ETH | 0.00790981 | ||||
Flash Exercise | 12444017 | 1364 days ago | IN | 0 ETH | 0.00791046 | ||||
Flash Exercise | 12444000 | 1364 days ago | IN | 0 ETH | 0.00849502 | ||||
Flash Exercise | 12443996 | 1364 days ago | IN | 0 ETH | 0.00776269 | ||||
Flash Exercise | 12443956 | 1364 days ago | IN | 0 ETH | 0.0073233 | ||||
Flash Exercise | 12443934 | 1364 days ago | IN | 0 ETH | 0.00776269 | ||||
Flash Exercise | 12161723 | 1407 days ago | IN | 0 ETH | 0.03836448 | ||||
Flash Exercise | 12161615 | 1407 days ago | IN | 0 ETH | 0.08035276 | ||||
Flash Exercise | 12161609 | 1407 days ago | IN | 0 ETH | 0.07349913 | ||||
Set Uniswap Midd... | 12149042 | 1409 days ago | IN | 0 ETH | 0.03137749 | ||||
Flash Exercise | 11839867 | 1457 days ago | IN | 0 ETH | 0.02802619 | ||||
Flash Exercise | 11839407 | 1457 days ago | IN | 0 ETH | 0.03111082 | ||||
Flash Exercise | 11792744 | 1464 days ago | IN | 0 ETH | 0.04849134 | ||||
Flash Exercise | 11792378 | 1464 days ago | IN | 0 ETH | 0.04946129 | ||||
Flash Exercise | 11748719 | 1471 days ago | IN | 0 ETH | 0.02573665 | ||||
Flash Exercise | 11649112 | 1486 days ago | IN | 0 ETH | 0.01029516 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13149638 | 1254 days ago | 0.21284517 ETH | ||||
13149638 | 1254 days ago | 2.20622888 ETH | ||||
13149638 | 1254 days ago | 2.41907406 ETH | ||||
13146208 | 1255 days ago | 0.19913029 ETH | ||||
13146208 | 1255 days ago | 0.8005697 ETH | ||||
13146208 | 1255 days ago | 0.9997 ETH | ||||
13059865 | 1268 days ago | 0.4928221 ETH | ||||
13059865 | 1268 days ago | 1.24815544 ETH | ||||
13059865 | 1268 days ago | 1.74097755 ETH | ||||
13012455 | 1275 days ago | 0.20927197 ETH | ||||
13012455 | 1275 days ago | 0.54530158 ETH | ||||
13012455 | 1275 days ago | 0.75457356 ETH | ||||
13012301 | 1275 days ago | 0.89982323 ETH | ||||
13012301 | 1275 days ago | 2.33430623 ETH | ||||
13012301 | 1275 days ago | 3.23412947 ETH | ||||
12923129 | 1289 days ago | 1.22725714 ETH | ||||
12923129 | 1289 days ago | 5.77054288 ETH | ||||
12923129 | 1289 days ago | 6.99780003 ETH | ||||
12835172 | 1303 days ago | 10.2032 ETH | ||||
12835172 | 1303 days ago | 10.2032 ETH | ||||
12744704 | 1317 days ago | 6.3141 ETH | ||||
12744704 | 1317 days ago | 6.3141 ETH | ||||
12201298 | 1401 days ago | 0.08154939 ETH | ||||
12201298 | 1401 days ago | 1.0231016 ETH | ||||
12201298 | 1401 days ago | 1.10465099 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ACOFlashExercise
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.6.6; import "./Ownable.sol"; import './ACOAssetHelper.sol'; import "./IWETH.sol"; import "./IUniswapV2Pair.sol"; import "./IUniswapV2Callee.sol"; import "./IUniswapV2Factory.sol"; import "./IUniswapV2Router02.sol"; import "./IACOToken.sol"; /** * @title ACOFlashExercise * @dev Contract to exercise ACO tokens using Uniswap Flash Swap. */ contract ACOFlashExercise is Ownable, IUniswapV2Callee { /** * @dev The Uniswap factory address. */ address immutable public uniswapFactory; /** * @dev The Uniswap Router address. */ address immutable public uniswapRouter; /** * @dev The WETH address used on Uniswap. */ address immutable public weth; /** * @dev Addresses of Uniswap middle route for a swap. (baseAsset => quoteAsset => middleRoute) */ mapping(address => mapping(address => address[])) internal middleRoute; constructor(address _uniswapRouter) public { super.init(); uniswapRouter = _uniswapRouter; uniswapFactory = IUniswapV2Router02(_uniswapRouter).factory(); weth = IUniswapV2Router02(_uniswapRouter).WETH(); } /** * @dev To accept ether from the WETH. */ receive() external payable {} /** * @dev Function to withdraw a stuck asset on the contract. * Only can be called by the admin. * @param asset Address of the asset. * @param destination Address of the destination. */ function withdrawStuckAsset(address asset, address destination) onlyOwner public { uint256 amount = ACOAssetHelper._getAssetBalanceOf(asset, address(this)); if (amount > 0) { ACOAssetHelper._transferAsset(asset, destination, amount); } } /** * @dev Function to set the addresses of Uniswap middle route for a swap. * Only can be called by the admin. * @param baseAsset Address of the base asset. * @param quoteAsset Address of the quote asset. * @param uniswapMiddleRoute Addresses of Uniswap middle route for a swap. */ function setUniswapMiddleRoute(address baseAsset, address quoteAsset, address[] memory uniswapMiddleRoute) onlyOwner public { _validateUniswapMiddleRoute(baseAsset, quoteAsset, uniswapMiddleRoute); (bool reversed, address[] storage route) = _getMiddleRoute(baseAsset, quoteAsset); if (route.length > 0) { if (reversed) { delete middleRoute[quoteAsset][baseAsset]; } else { delete middleRoute[baseAsset][quoteAsset]; } } address _uniswapRouter = uniswapRouter; address _weth = weth; ACOAssetHelper._callApproveERC20(_getUniswapToken(baseAsset, _weth), _uniswapRouter, ACOAssetHelper.MAX_UINT); ACOAssetHelper._callApproveERC20(_getUniswapToken(quoteAsset, _weth), _uniswapRouter, ACOAssetHelper.MAX_UINT); middleRoute[baseAsset][quoteAsset] = uniswapMiddleRoute; } /** * @dev Function to get the Uniswap middle route set for a pair. * @param baseAsset Address of the base asset. * @param quoteAsset Address of the quote asset. * @return If the assets are reversed and the middle route addresses. */ function getMiddleRoute(address baseAsset, address quoteAsset) public view returns(bool, address[] memory) { return _getMiddleRoute(baseAsset, quoteAsset); } /** * @dev Function to get if it is possible execute a flash exercise. * @param acoToken Address of the ACO token. * @return TRUE if it is possible use the flash exercise, otherwise FALSE. */ function hasFlashExercise(address acoToken) public view returns(bool) { (address pair,) = _getUniswapData(acoToken); return pair != address(0); } /** * @dev Function to get the required amount of collateral to be paid to Uniswap and the expected amount to exercise the ACO token. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param accounts The array of addresses to be exercised. Whether the array is empty the exercise will be executed using the standard method. * @return The required amount of collateral to be paid to Uniswap and the expected amount to exercise the ACO token. */ function getExerciseData(address acoToken, uint256 tokenAmount, address[] memory accounts) public view returns(uint256, uint256) { if (tokenAmount > 0) { (address pair, address[] memory path) = _getUniswapData(acoToken); if (pair != address(0)) { (address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts); exerciseAddress = _getUniswapToken(exerciseAddress, weth); (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pair).getReserves(); uint256 reserveIn = 0; uint256 reserveOut = 0; if (exerciseAddress == IUniswapV2Pair(pair).token0() && expectedAmount < reserve0) { reserveIn = reserve1; reserveOut = reserve0; } else if (exerciseAddress == IUniswapV2Pair(pair).token1() && expectedAmount < reserve1) { reserveIn = reserve0; reserveOut = reserve1; } if (reserveIn > 0 && reserveOut > 0) { uint256 requiredAmount = IUniswapV2Router02(uniswapRouter).getAmountIn(expectedAmount, reserveIn, reserveOut); uint256 requiredCollateral; if (path.length > 0) { requiredCollateral = IUniswapV2Router02(uniswapRouter).getAmountsIn(requiredAmount, path)[0]; } else { requiredCollateral = requiredAmount; } return (requiredCollateral, expectedAmount); } } } return (0, 0); } /** * @dev Function to get the estimated collateral to be received through a flash exercise. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @return The estimated collateral to be received through a flash exercise using the standard exercise function. */ function getEstimatedReturn(address acoToken, uint256 tokenAmount) public view returns(uint256) { (uint256 requiredAmount,) = getExerciseData(acoToken, tokenAmount, new address[](0)); if (requiredAmount > 0) { (uint256 collateralAmount,) = IACOToken(acoToken).getCollateralOnExercise(tokenAmount); if (requiredAmount < collateralAmount) { return collateralAmount - requiredAmount; } } return 0; } /** * @dev Function to flash exercise ACO tokens. * The flash exercise uses the flash swap functionality on Uniswap. * No asset is required to exercise the ACO token because the own collateral redeemed is used to fulfill the terms of the contract. * The account will receive the remaining difference. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise. * @param salt Random number to calculate the start index of the array of accounts to be exercised. */ function flashExercise(address acoToken, uint256 tokenAmount, uint256 minimumCollateral, uint256 salt) public { _flashExercise(acoToken, tokenAmount, minimumCollateral, salt, new address[](0)); } /** * @dev Function to flash exercise ACO tokens. * The flash exercise uses the flash swap functionality on Uniswap. * No asset is required to exercise the ACO token because the own collateral redeemed is used to fulfill the terms of the contract. * The account will receive the remaining difference. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise. * @param accounts The array of addresses to get the deposited collateral. */ function flashExerciseAccounts( address acoToken, uint256 tokenAmount, uint256 minimumCollateral, address[] memory accounts ) public { require(accounts.length > 0, "ACOFlashExercise::flashExerciseAccounts: Accounts are required"); _flashExercise(acoToken, tokenAmount, minimumCollateral, 0, accounts); } /** * @dev External function to be called by the Uniswap pair on flash swap transaction. * @param sender Address of the sender of the Uniswap swap. It must be the ACOFlashExercise contract. * @param amount0Out Amount of token0 on Uniswap pair to be received on the flash swap. * @param amount1Out Amount of token1 on Uniswap pair to be received on the flash swap. * @param data The ABI encoded with ACO token flash exercise data. */ function uniswapV2Call( address sender, uint256 amount0Out, uint256 amount1Out, bytes calldata data ) external override { require(sender == address(this), "ACOFlashExercise::uniswapV2Call: Invalid sender"); uint256 requiredAmount = _getFlasSwapPaymentRequired(amount0Out, amount1Out); (address account, address collateral, uint256 collateralAmount, uint256 remainingAmount, address[] memory path) = _exercise(requiredAmount, data); _sendAmounts( account, collateral, collateralAmount, remainingAmount, requiredAmount, path ); } /** * @dev Internal function to send the remaining collateral amount to the account and pay the Uniswap. * @param account Address of the account. * @param collateral Address of the collateral. * @param collateralAmount The collateral amount received on the exercise. * @param remainingAmount The remaining collateral amount to be paid to the account. * @param uniswapRequiredAmount The required amount to pay the Uniswap. * @param path The second swap required path due to the middle route. */ function _sendAmounts( address account, address collateral, uint256 collateralAmount, uint256 remainingAmount, uint256 uniswapRequiredAmount, address[] memory path ) internal { if (path.length > 0) { uint256 toPayAmount = collateralAmount - remainingAmount; if (ACOAssetHelper._isEther(collateral)) { IWETH(weth).deposit{value: toPayAmount}(); } IUniswapV2Router02(uniswapRouter).swapTokensForExactTokens(uniswapRequiredAmount, toPayAmount, path, msg.sender, block.timestamp); } else { address uniswapAsset; if (ACOAssetHelper._isEther(collateral)) { uniswapAsset = weth; IWETH(uniswapAsset).deposit{value: uniswapRequiredAmount}(); } else { uniswapAsset = collateral; } ACOAssetHelper._callTransferERC20(uniswapAsset, msg.sender, uniswapRequiredAmount); } ACOAssetHelper._transferAsset(collateral, account, remainingAmount); } /** * @dev Internal function to validate the minimum collateral amount requested. * @param requiredAmount The required collateral amount to pay Uniswap. * @param collateralAmount The collateral amount received on the exercise. * @param minimumCollateral The minimum collateral amount requested. * @return The remaining amount to be paid to the account. */ function _validateMinimumCollateral(uint256 requiredAmount, uint256 collateralAmount, uint256 minimumCollateral) internal pure returns(uint256) { require(requiredAmount <= collateralAmount, "ACOFlashExercise::_validateMinimumCollateral: Insufficient collateral amount"); uint256 remainingAmount = collateralAmount - requiredAmount; require(remainingAmount >= minimumCollateral, "ACOFlashExercise::_validateMinimumCollateral: Minimum amount not satisfied"); return remainingAmount; } /** * @dev Internal function to exercise ACO token and get the data for the payments. * @param requiredAmount The required amount to pay Uniswap. * @param data The ABI encoded with ACO token flash exercise data. * @return Account address, collateral address, collateral amount received on exercise, remaining collateral amount to be paid to account and the second swap required path due to the middle route. */ function _exercise(uint256 requiredAmount, bytes memory data) internal returns( address, address, uint256, uint256, address[] memory ) { (address account, address acoToken, uint256 tokenAmount, uint256 salt, uint256 collateralAmount, uint256 remainingAmount, address[] memory accounts, address[] memory path) = _getExerciseBaseData(requiredAmount, data); _exerciseAco(account, acoToken, tokenAmount, salt, accounts); address collateral = IACOToken(acoToken).collateral(); return (account, collateral, collateralAmount, remainingAmount, path); } /** * @dev Internal function to get the base exercise data and validate the amounts. * @param requiredAmount The required amount to pay Uniswap. * @param data The ABI encoded with ACO token flash exercise data. */ function _getExerciseBaseData(uint256 requiredAmount, bytes memory data) internal view returns( address account, address acoToken, uint256 tokenAmount, uint256 salt, uint256 collateralAmount, uint256 remainingAmount, address[] memory accounts, address[] memory path ) { uint256 minimumCollateral; (account, acoToken, tokenAmount, minimumCollateral, salt, accounts, path) = abi.decode(data, (address, address, uint256, uint256, uint256, address[], address[])); (collateralAmount,) = IACOToken(acoToken).getCollateralOnExercise(tokenAmount); uint256 requiredCollateral; if (path.length > 0) { requiredCollateral = IUniswapV2Router02(uniswapRouter).getAmountsIn(requiredAmount, path)[0]; } else { requiredCollateral = requiredAmount; } remainingAmount = _validateMinimumCollateral(requiredCollateral, collateralAmount, minimumCollateral); } /** * @dev Internal function to exercise an ACO token. * @param account Address of the owner of the ACO. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param salt Random number to calculate the start index of the array of accounts to be exercised when using standard method. * @param accounts The array of addresses to get the deposited collateral. Whether the array is empty the exercise will be executed using the standard method. */ function _exerciseAco( address account, address acoToken, uint256 tokenAmount, uint256 salt, address[] memory accounts ) internal { (address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts); uint256 ethValue = 0; if (ACOAssetHelper._isEther(exerciseAddress)) { ethValue = expectedAmount; IWETH(weth).withdraw(expectedAmount); } else { ACOAssetHelper._callApproveERC20(exerciseAddress, acoToken, expectedAmount); } if (accounts.length == 0) { IACOToken(acoToken).exerciseFrom{value: ethValue}(account, tokenAmount, salt); } else { IACOToken(acoToken).exerciseAccountsFrom{value: ethValue}(account, tokenAmount, accounts); } } /** * @dev Internal function to get the required amount to pay the Uniswap on flash swap. * @param amount0Out Amount of token0 on Uniswap pair to be received on the flash swap. * @param amount1Out Amount of token1 on Uniswap pair to be received on the flash swap. * @return The required amount to be paid. */ function _getFlasSwapPaymentRequired(uint256 amount0Out, uint256 amount1Out) internal view returns(uint256) { address token0 = IUniswapV2Pair(msg.sender).token0(); address token1 = IUniswapV2Pair(msg.sender).token1(); require(msg.sender == IUniswapV2Factory(uniswapFactory).getPair(token0, token1), "ACOFlashExercise::uniswapV2Call: Invalid transaction sender"); require(amount0Out == 0 || amount1Out == 0, "ACOFlashExercise::uniswapV2Call: Invalid out amounts"); (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(msg.sender).getReserves(); uint256 reserveIn; uint256 reserveOut; if (amount0Out == 0) { reserveIn = reserve0; reserveOut = reserve1; } else { reserveIn = reserve1; reserveOut = reserve0; } return IUniswapV2Router02(uniswapRouter).getAmountIn((amount0Out + amount1Out), reserveIn, reserveOut); } /** * @dev Internal function to get the ACO tokens exercise data. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param accounts The array of addresses to be exercised. Whether the array is empty the exercise will be executed using the standard method. * @return The asset and the respective amount that should be sent to get the collateral. */ function _getAcoExerciseData(address acoToken, uint256 tokenAmount, address[] memory accounts) internal view returns(address, uint256) { (address exerciseAddress, uint256 expectedAmount) = IACOToken(acoToken).getBaseExerciseData(tokenAmount); if (accounts.length == 0) { expectedAmount = expectedAmount + IACOToken(acoToken).maxExercisedAccounts(); } else { expectedAmount = expectedAmount + accounts.length; } return (exerciseAddress, expectedAmount); } /** * @dev Internal function to flash exercise ACO tokens. * @param acoToken Address of the ACO token. * @param tokenAmount Amount of tokens to be exercised. * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise. * @param salt Random number to calculate the start index of the array of accounts to be exercised when using standard method. * @param accounts The array of addresses to get the deposited collateral. Whether the array is empty the exercise will be executed using the standard method. */ function _flashExercise( address acoToken, uint256 tokenAmount, uint256 minimumCollateral, uint256 salt, address[] memory accounts ) internal { (address pair, address[] memory path) = _getUniswapData(acoToken); require(pair != address(0), "ACOFlashExercise::_flashExercise: Invalid Uniswap pair"); (address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts); uint256 amount0Out = 0; uint256 amount1Out = 0; if (_getUniswapToken(exerciseAddress, weth) == IUniswapV2Pair(pair).token0()) { amount0Out = expectedAmount; } else { amount1Out = expectedAmount; } bytes memory data = abi.encode(msg.sender, acoToken, tokenAmount, minimumCollateral, salt, accounts, path); IUniswapV2Pair(pair).swap(amount0Out, amount1Out, address(this), data); } /** * @dev Internal function to get Uniswap token address. * The Ethereum address on ACO must be swapped to WETH to be used on Uniswap. * @param token Address of the token on ACO. * @return Uniswap token address. */ function _getUniswapToken(address token, address _weth) internal pure returns(address) { if (ACOAssetHelper._isEther(token)) { return _weth; } else { return token; } } /** * @dev Internal function to get the Uniswap base data for the flash exercise. * @param acoToken Address of the ACO token. * @return Uniswap pair for execute the flash swap, the second swap required path due to the middle route. */ function _getUniswapData(address acoToken) internal view returns(address, address[] memory) { IACOToken _aco = IACOToken(acoToken); address underlying = _aco.underlying(); address strikeAsset = _aco.strikeAsset(); address _weth = weth; (bool reversed, address[] storage route) = _getMiddleRoute(underlying, strikeAsset); if (route.length > 0) { bool isCall = _aco.isCall(); address swapAsset; address[] memory path = new address[](route.length + 1); path[0] = _getUniswapToken((isCall ? underlying : strikeAsset), _weth); if ((isCall && reversed) || (!isCall && !reversed)) { swapAsset = _getUniswapToken(route[0], _weth); uint256 index = 1; for (uint256 i = route.length; i > 1; --i) { path[index] = _getUniswapToken(route[i - 1], _weth); ++index; } } else { uint256 lastIndex = route.length - 1; swapAsset = _getUniswapToken(route[lastIndex], _weth); uint256 index = 1; for (uint256 i = 0; i < lastIndex; ++i) { path[index] = _getUniswapToken(route[i], _weth); ++index; } } path[route.length] = swapAsset; address pair = IUniswapV2Factory(uniswapFactory).getPair(_getUniswapToken((isCall ? strikeAsset : underlying), _weth), swapAsset); return (pair, path); } else { address pair = IUniswapV2Factory(uniswapFactory).getPair(_getUniswapToken(underlying, _weth), _getUniswapToken(strikeAsset, _weth)); return (pair, new address[](0)); } } /** * @dev Internal function to get the Uniswap middle route. * @param baseAsset Address of the base asset. * @param quoteAsset Address of the quote asset. * @return If the assets are reversed and the middle route addresses. */ function _getMiddleRoute(address baseAsset, address quoteAsset) internal view returns(bool, address[] storage) { address[] storage route = middleRoute[baseAsset][quoteAsset]; if (route.length > 0) { return (false, route); } else { address[] storage route2 = middleRoute[quoteAsset][baseAsset]; return ((route2.length > 0), route2); } } /** * @dev Internal function to validate the addresses on the Uniswap middle route. * @param asset0 Address of a pair asset. * @param asset1 Address of another pair asset. * @param uniswapMiddleRoute Addresses of Uniswap middle route for a swap. */ function _validateUniswapMiddleRoute(address asset0, address asset1, address[] memory uniswapMiddleRoute) internal pure { for (uint256 i = 0; i < uniswapMiddleRoute.length; ++i) { address asset = uniswapMiddleRoute[i]; require(asset0 != asset && asset1 != asset, "ACOFlashExercise::_validateUniswapMiddleRoute: Invalid middle route"); for (uint256 j = i+1; j < uniswapMiddleRoute.length; ++j) { require(asset != uniswapMiddleRoute[j], "ACOFlashExercise::_validateUniswapMiddleRoute: Invalid middle route"); } } } }
pragma solidity ^0.6.6; library ACOAssetHelper { uint256 internal constant MAX_UINT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /** * @dev Internal function to get if the address is for Ethereum (0x0). * @param _address Address to be checked. * @return Whether the address is for Ethereum. */ function _isEther(address _address) internal pure returns(bool) { return _address == address(0); } /** * @dev Internal function to approve ERC20 tokens. * @param token Address of the token. * @param spender Authorized address. * @param amount Amount to authorize. */ function _callApproveERC20(address token, address spender, uint256 amount) internal { (bool success, bytes memory returndata) = token.call(abi.encodeWithSelector(0x095ea7b3, spender, amount)); require(success && (returndata.length == 0 || abi.decode(returndata, (bool))), "ACOAssetHelper::_callApproveERC20"); } /** * @dev Internal function to transfer ERC20 tokens. * @param token Address of the token. * @param recipient Address of the transfer destination. * @param amount Amount to transfer. */ function _callTransferERC20(address token, address recipient, uint256 amount) internal { (bool success, bytes memory returndata) = token.call(abi.encodeWithSelector(0xa9059cbb, recipient, amount)); require(success && (returndata.length == 0 || abi.decode(returndata, (bool))), "ACOAssetHelper::_callTransferERC20"); } /** * @dev Internal function to call transferFrom on ERC20 tokens. * @param token Address of the token. * @param sender Address of the sender. * @param recipient Address of the transfer destination. * @param amount Amount to transfer. */ function _callTransferFromERC20(address token, address sender, address recipient, uint256 amount) internal { (bool success, bytes memory returndata) = token.call(abi.encodeWithSelector(0x23b872dd, sender, recipient, amount)); require(success && (returndata.length == 0 || abi.decode(returndata, (bool))), "ACOAssetHelper::_callTransferFromERC20"); } /** * @dev Internal function to the asset symbol. * @param asset Address of the asset. * @return The asset symbol. */ function _getAssetSymbol(address asset) internal view returns(string memory) { if (_isEther(asset)) { return "ETH"; } else { (bool success, bytes memory returndata) = asset.staticcall(abi.encodeWithSelector(0x95d89b41)); require(success, "ACOAssetHelper::_getAssetSymbol"); return abi.decode(returndata, (string)); } } /** * @dev Internal function to the asset decimals. * @param asset Address of the asset. * @return The asset decimals. */ function _getAssetDecimals(address asset) internal view returns(uint8) { if (_isEther(asset)) { return uint8(18); } else { (bool success, bytes memory returndata) = asset.staticcall(abi.encodeWithSelector(0x313ce567)); require(success, "ACOAssetHelper::_getAssetDecimals"); return abi.decode(returndata, (uint8)); } } /** * @dev Internal function to the asset name. * @param asset Address of the asset. * @return The asset name. */ function _getAssetName(address asset) internal view returns(string memory) { if (_isEther(asset)) { return "Ethereum"; } else { (bool success, bytes memory returndata) = asset.staticcall(abi.encodeWithSelector(0x06fdde03)); require(success, "ACOAssetHelper::_getAssetName"); return abi.decode(returndata, (string)); } } /** * @dev Internal function to the asset balance of an account. * @param asset Address of the asset. * @param account Address of the account. * @return The account balance. */ function _getAssetBalanceOf(address asset, address account) internal view returns(uint256) { if (_isEther(asset)) { return account.balance; } else { (bool success, bytes memory returndata) = asset.staticcall(abi.encodeWithSelector(0x70a08231, account)); require(success, "ACOAssetHelper::_getAssetBalanceOf"); return abi.decode(returndata, (uint256)); } } /** * @dev Internal function to the asset allowance between two addresses. * @param asset Address of the asset. * @param owner Address of the owner of the tokens. * @param spender Address of the spender authorized. * @return The owner allowance for the spender. */ function _getAssetAllowance(address asset, address owner, address spender) internal view returns(uint256) { if (_isEther(asset)) { return 0; } else { (bool success, bytes memory returndata) = asset.staticcall(abi.encodeWithSelector(0xdd62ed3e, owner, spender)); require(success, "ACOAssetHelper::_getAssetAllowance"); return abi.decode(returndata, (uint256)); } } /** * @dev Internal function to transfer an asset. * @param asset Address of the asset to be transferred. * @param to Address of the destination. * @param amount The amount to be transferred. */ function _transferAsset(address asset, address to, uint256 amount) internal { if (_isEther(asset)) { (bool success,) = to.call{value:amount}(new bytes(0)); require(success, 'ACOAssetHelper::_transferAsset'); } else { _callTransferERC20(asset, to, amount); } } /** * @dev Internal function to receive an asset. * @param asset Address of the asset to be received. * @param amount The amount to be received. */ function _receiveAsset(address asset, uint256 amount) internal { if (_isEther(asset)) { require(msg.value == amount, "ACOAssetHelper:: Invalid ETH amount"); } else { require(msg.value == 0, "ACOAssetHelper:: Ether is not expected"); _callTransferFromERC20(asset, msg.sender, address(this), amount); } } /** * @dev Internal function to check asset allowance and set to Infinity if necessary. * @param asset Address of the asset. * @param owner Address of the owner of the tokens. * @param spender Address of the spender authorized. * @param amount Amount to check allowance. */ function _setAssetInfinityApprove(address asset, address owner, address spender, uint256 amount) internal { if (_getAssetAllowance(asset, owner, spender) < amount) { _callApproveERC20(asset, spender, MAX_UINT); } } }
pragma solidity ^0.6.6; import "./IERC20.sol"; interface IACOToken is IERC20 { function init(address _underlying, address _strikeAsset, bool _isCall, uint256 _strikePrice, uint256 _expiryTime, uint256 _acoFee, address payable _feeDestination, uint256 _maxExercisedAccounts) external; function name() external view returns(string memory); function symbol() external view returns(string memory); function decimals() external view returns(uint8); function underlying() external view returns (address); function strikeAsset() external view returns (address); function feeDestination() external view returns (address); function isCall() external view returns (bool); function strikePrice() external view returns (uint256); function expiryTime() external view returns (uint256); function totalCollateral() external view returns (uint256); function acoFee() external view returns (uint256); function maxExercisedAccounts() external view returns (uint256); function underlyingSymbol() external view returns (string memory); function strikeAssetSymbol() external view returns (string memory); function underlyingDecimals() external view returns (uint8); function strikeAssetDecimals() external view returns (uint8); function currentCollateral(address account) external view returns(uint256); function unassignableCollateral(address account) external view returns(uint256); function assignableCollateral(address account) external view returns(uint256); function currentCollateralizedTokens(address account) external view returns(uint256); function unassignableTokens(address account) external view returns(uint256); function assignableTokens(address account) external view returns(uint256); function getCollateralAmount(uint256 tokenAmount) external view returns(uint256); function getTokenAmount(uint256 collateralAmount) external view returns(uint256); function getBaseExerciseData(uint256 tokenAmount) external view returns(address, uint256); function numberOfAccountsWithCollateral() external view returns(uint256); function getCollateralOnExercise(uint256 tokenAmount) external view returns(uint256, uint256); function collateral() external view returns(address); function mintPayable() external payable returns(uint256); function mintToPayable(address account) external payable returns(uint256); function mint(uint256 collateralAmount) external returns(uint256); function mintTo(address account, uint256 collateralAmount) external returns(uint256); function burn(uint256 tokenAmount) external returns(uint256); function burnFrom(address account, uint256 tokenAmount) external returns(uint256); function redeem() external returns(uint256); function redeemFrom(address account) external returns(uint256); function exercise(uint256 tokenAmount, uint256 salt) external payable returns(uint256); function exerciseFrom(address account, uint256 tokenAmount, uint256 salt) external payable returns(uint256); function exerciseAccounts(uint256 tokenAmount, address[] calldata accounts) external payable returns(uint256); function exerciseAccountsFrom(address account, uint256 tokenAmount, address[] calldata accounts) external payable returns(uint256); }
pragma solidity ^0.6.6; // Contract on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts /** * @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); }
pragma solidity ^0.6.6; interface IUniswapV2Callee { function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external; }
pragma solidity ^0.6.6; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity ^0.6.6; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
pragma solidity 0.6.6; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
pragma solidity ^0.6.6; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: MIT // Adapted from OpenZeppelin pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function init() internal { require(_owner == address(0), "Ownable: Contract initialized"); address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_uniswapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"flashExercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"flashExerciseAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEstimatedReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"getExerciseData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"baseAsset","type":"address"},{"internalType":"address","name":"quoteAsset","type":"address"}],"name":"getMiddleRoute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"}],"name":"hasFlashExercise","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"baseAsset","type":"address"},{"internalType":"address","name":"quoteAsset","type":"address"},{"internalType":"address[]","name":"uniswapMiddleRoute","type":"address[]"}],"name":"setUniswapMiddleRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"destination","type":"address"}],"name":"withdrawStuckAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200356f3803806200356f833981810160405260208110156200003757600080fd5b50516200004f6200016a602090811b62002f5b17901c565b806001600160a01b031660a0816001600160a01b031660601b81525050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620000a657600080fd5b505afa158015620000bb573d6000803e3d6000fd5b505050506040513d6020811015620000d257600080fd5b505160601b6001600160601b031916608052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b1580156200012557600080fd5b505afa1580156200013a573d6000803e3d6000fd5b505050506040513d60208110156200015157600080fd5b505160601b6001600160601b03191660c052506200022e565b6000546001600160a01b031615620001c9576040805162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a20436f6e747261637420696e697469616c697a6564000000604482015290519081900360640190fd5b6000620001de6001600160e01b036200022a16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b3390565b60805160601c60a05160601c60c05160601c6132bb620002b4600039806107b252806108f75280610b5152806111fa5280611b3e5280611d6752806121735280612ac35250806107915280610a9a5280610d315280610e0b52806119e55280611bb352806128f2525080610add528061181d5280612436528061250252506132bb6000f3fe6080604052600436106100e15760003560e01c8063735de9f71161007f5780638da5cb5b116100595780638da5cb5b14610484578063a66d363e14610499578063f10dd52114610575578063f2fde38b1461060f576100e8565b8063735de9f714610413578063796b3e4a146104285780638bdb2afa1461046f576100e8565b80633fc8cef3116100bb5780633fc8cef3146103175780634884780a146103485780634b721f37146103835780635caec24f146103c8576100e8565b80630152ef95146100ed578063061ad030146101b957806310d1e85c14610280576100e8565b366100e857005b600080fd5b3480156100f957600080fd5b506101b76004803603608081101561011057600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561014657600080fd5b82018360208201111561015857600080fd5b803590602001918460208302840111600160201b8311171561017957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610642945050505050565b005b3480156101c557600080fd5b506101b7600480360360608110156101dc57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561020f57600080fd5b82018360208201111561022157600080fd5b803590602001918460208302840111600160201b8311171561024257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610696945050505050565b34801561028c57600080fd5b506101b7600480360360808110156102a357600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610833565b34801561032357600080fd5b5061032c6108f5565b604080516001600160a01b039092168252519081900360200190f35b34801561035457600080fd5b506101b76004803603604081101561036b57600080fd5b506001600160a01b0381358116916020013516610919565b34801561038f57600080fd5b506101b7600480360360808110156103a657600080fd5b506001600160a01b0381351690602081013590604081013590606001356109a7565b3480156103d457600080fd5b50610401600480360360408110156103eb57600080fd5b506001600160a01b0381351690602001356109df565b60408051918252519081900360200190f35b34801561041f57600080fd5b5061032c610a98565b34801561043457600080fd5b5061045b6004803603602081101561044b57600080fd5b50356001600160a01b0316610abc565b604080519115158252519081900360200190f35b34801561047b57600080fd5b5061032c610adb565b34801561049057600080fd5b5061032c610aff565b3480156104a557600080fd5b5061055c600480360360608110156104bc57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156104eb57600080fd5b8201836020820111156104fd57600080fd5b803590602001918460208302840111600160201b8311171561051e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b0f945050505050565b6040805192835260208301919091528051918290030190f35b34801561058157600080fd5b506105b06004803603604081101561059857600080fd5b506001600160a01b0381358116916020013516610f97565b604051808315151515815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156105fa5781810151838201526020016105e2565b50505050905001935050505060405180910390f35b34801561061b57600080fd5b506101b76004803603602081101561063257600080fd5b50356001600160a01b0316611009565b60008151116106825760405162461bcd60e51b815260040180806020018281038252603e815260200180613163603e913960400191505060405180910390fd5b610690848484600085611113565b50505050565b61069e611424565b6000546001600160a01b03908116911614610700576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61070b838383611428565b600080610718858561153f565b805491935091501561078f57811561075f576001600160a01b038085166000908152600160209081526040808320938916835292905290812061075a91612e97565b61078f565b6001600160a01b038086166000908152600160209081526040808320938816835292905290812061078f91612e97565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006107e76107de88836115ad565b836000196115cb565b6107f46107de87836115ad565b6001600160a01b038088166000908152600160209081526040808320938a168352928152919020865161082992880190612eb8565b5050505050505050565b6001600160a01b038516301461087a5760405162461bcd60e51b815260040180806020018281038252602f815260200180613223602f913960400191505060405180910390fd5b6000610886858561171f565b905060008060008060606108d08689898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a6492505050565b945094509450945094506108e8858585858a86611b24565b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610921611424565b6000546001600160a01b03908116911614610983576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061098f8330611e04565b905080156109a2576109a2838383611f65565b505050565b6106908484848460006040519080825280602002602001820160405280156109d9578160200160208202803683370190505b50611113565b6040805160008082526020820190925281906109fe9085908590610b0f565b5090508015610a8c576000846001600160a01b0316636f012b8d856040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d6040811015610a7657600080fd5b5051905080821015610a8a57039050610a92565b505b60009150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610ac88361208d565b506001600160a01b031615159392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03165b90565b6000808315610f885760006060610b258761208d565b90925090506001600160a01b03821615610f8557600080610b478989896125ef565b91509150610b75827f00000000000000000000000000000000000000000000000000000000000000006115ad565b9150600080856001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d6060811015610bdd57600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b03938416965092909116935060009283926001600160a01b038b1692630dfe1681926004808301939192829003018186803b158015610c3b57600080fd5b505afa158015610c4f573d6000803e3d6000fd5b505050506040513d6020811015610c6557600080fd5b50516001600160a01b038781169116148015610c8057508385105b15610c8f575081905082610d18565b876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc857600080fd5b505afa158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b50516001600160a01b038781169116148015610d0d57508285105b15610d185750829050815b600082118015610d285750600081115b15610f7e5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385f8c2598785856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6020811015610dcd57600080fd5b5051885190915060009015610f6857604080516307c0329d60e21b815260048101848152602482019283528b5160448301528b516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693631f00ca749387938f93909291606401906020808601910280838360005b83811015610e62578181015183820152602001610e4a565b50505050905001935050505060006040518083038186803b158015610e8657600080fd5b505afa158015610e9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ec357600080fd5b8101908080516040519392919084600160201b821115610ee257600080fd5b908301906020820185811115610ef757600080fd5b82518660208202830111600160201b82111715610f1357600080fd5b82525081516020918201928201910280838360005b83811015610f40578181015183820152602001610f28565b50505050905001604052505050600081518110610f5957fe5b60200260200101519050610f6b565b50805b9a50949850610f8f975050505050505050565b5050505050505b50505b5060009050805b935093915050565b60006060610fa5848461153f565b805460408051602080840282018101909252828152918391830182828015610ff657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fd8575b50505050509050915091505b9250929050565b611011611424565b6000546001600160a01b03908116911614611073576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166110b85760405162461bcd60e51b81526004018080602001828103825260268152602001806130106026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060606111208761208d565b90925090506001600160a01b03821661116a5760405162461bcd60e51b81526004018080602001828103825260368152602001806131a16036913960400191505060405180910390fd5b6000806111788989876125ef565b9150915060008090506000809050856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b50516001600160a01b031661121e857f00000000000000000000000000000000000000000000000000000000000000006115ad565b6001600160a01b0316141561123557829150611238565b50815b6060338c8c8c8c8c8b60405160200180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b031681526020018681526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ca5781810151838201526020016112b2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156113095781810151838201526020016112f1565b5050505090500199505050505050505050506040516020818303038152906040529050866001600160a01b031663022c0d9f848430856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113af578181015183820152602001611397565b50505050905090810190601f1680156113dc5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156113fe57600080fd5b505af1158015611412573d6000803e3d6000fd5b50505050505050505050505050505050565b3390565b60005b815181101561069057600082828151811061144257fe5b60200260200101519050806001600160a01b0316856001600160a01b0316141580156114805750806001600160a01b0316846001600160a01b031614155b6114bb5760405162461bcd60e51b81526004018080602001828103825260438152602001806131206043913960600191505060405180910390fd5b600182015b8351811015611535578381815181106114d557fe5b60200260200101516001600160a01b0316826001600160a01b0316141561152d5760405162461bcd60e51b81526004018080602001828103825260438152602001806131206043913960600191505060405180910390fd5b6001016114c0565b505060010161142b565b6001600160a01b038083166000908152600160209081526040808320938516835292905290812080548291901561157b57600092509050611002565b5050506001600160a01b0380821660009081526001602090815260408083209386168352929052208054151590611002565b60006115b8836126f1565b156115c4575080610a92565b5081610a92565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106116485780518252601f199092019160209182019101611629565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146116aa576040519150601f19603f3d011682016040523d82523d6000602084013e6116af565b606091505b50915091508180156116dd5750805115806116dd57508080602001905160208110156116da57600080fd5b50515b6117185760405162461bcd60e51b81526004018080602001828103825260218152602001806130366021913960400191505060405180910390fd5b5050505050565b600080336001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b50516040805163d21220a760e01b81529051919250600091339163d21220a7916004808301926020929190829003018186803b1580156117c457600080fd5b505afa1580156117d8573d6000803e3d6000fd5b505050506040513d60208110156117ee57600080fd5b50516040805163e6a4390560e01b81526001600160a01b038581166004830152808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e6a4390591604480820192602092909190829003018186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b50516001600160a01b031633146118d85760405162461bcd60e51b815260040180806020018281038252603b815260200180613057603b913960400191505060405180910390fd5b8415806118e3575083155b61191e5760405162461bcd60e51b81526004018080602001828103825260348152602001806132526034913960400191505060405180910390fd5b600080336001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d606081101561198457600080fd5b5080516020909101516001600160701b039182169350169050600080886119af5750829050816119b5565b50819050825b604080516385f8c25960e01b81528a8a016004820152602481018490526044810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916385f8c259916064808301926020929190829003018186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b50519998505050505050505050565b6000806000806060600080600080600080606080611a828f8f6126fe565b97509750975097509750975097509750611a9f8888888886612a9b565b6000876001600160a01b031663d8dfeb456040518163ffffffff1660e01b815260040160206040518083038186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d6020811015611b0457600080fd5b5051989d50979b5092995090975090955050505050509295509295909350565b805115611d5557828403611b37866126f1565b15611bb1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b9757600080fd5b505af1158015611bab573d6000803e3d6000fd5b50505050505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638803dbee84838533426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c5e578181015183820152602001611c46565b505050509050019650505050505050600060405180830381600087803b158015611c8757600080fd5b505af1158015611c9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611cc457600080fd5b8101908080516040519392919084600160201b821115611ce357600080fd5b908301906020820185811115611cf857600080fd5b82518660208202830111600160201b82111715611d1457600080fd5b82525081516020918201928201910280838360005b83811015611d41578181015183820152602001611d29565b505050509050016040525050505050611df1565b6000611d60866126f1565b15611de1577f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b5050505050611de4565b50845b611def813385612cbf565b505b611dfc858785611f65565b505050505050565b6000611e0f836126f1565b15611e2557506001600160a01b03811631610a92565b604080516001600160a01b0384811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b178152925182516000946060949389169392918291908083835b60208310611e9e5780518252601f199092019160209182019101611e7f565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611efe576040519150601f19603f3d011682016040523d82523d6000602084013e611f03565b606091505b509150915081611f445760405162461bcd60e51b81526004018080602001828103825260228152602001806130dc6022913960400191505060405180910390fd5b808060200190516020811015611f5957600080fd5b50519250610a92915050565b611f6e836126f1565b1561208257604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310611fbf5780518252601f199092019160209182019101611fa0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612021576040519150601f19603f3d011682016040523d82523d6000602084013e612026565b606091505b505090508061207c576040805162461bcd60e51b815260206004820152601e60248201527f41434f417373657448656c7065723a3a5f7472616e7366657241737365740000604482015290519081900360640190fd5b506109a2565b6109a2838383612cbf565b6000606060008390506000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d157600080fd5b505afa1580156120e5573d6000803e3d6000fd5b505050506040513d60208110156120fb57600080fd5b5051604080516302fad37960e31b815290519192506000916001600160a01b038516916317d69bc8916004808301926020929190829003018186803b15801561214357600080fd5b505afa158015612157573d6000803e3d6000fd5b505050506040513d602081101561216d57600080fd5b505190507f000000000000000000000000000000000000000000000000000000000000000060008061219f858561153f565b80549193509150156124fe576000866001600160a01b0316636d6364786040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e657600080fd5b505afa1580156121fa573d6000803e3d6000fd5b505050506040513d602081101561221057600080fd5b5051825490915060009060609060010167ffffffffffffffff8111801561223657600080fd5b50604051908082528060200260200182016040528015612260578160200160208202803683370190505b509050612279836122715787612273565b885b876115ad565b8160008151811061228657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508280156122b05750845b806122c25750821580156122c2575084155b1561236b576122f2846000815481106122d757fe5b6000918252602090912001546001600160a01b0316876115ad565b84549092506001905b60018111156123645761233186600183038154811061231657fe5b6000918252602090912001546001600160a01b0316896115ad565b83838151811061233d57fe5b6001600160a01b0390921660209283029190910190910152600190910190600019016122fb565b505061240b565b835460001981019061239e9086908390811061238357fe5b6000918252602090912001546001600160a01b0316886115ad565b9250600160005b82811015612407576123d78782815481106123bc57fe5b6000918252602090912001546001600160a01b03168a6115ad565b8483815181106123e357fe5b6001600160a01b0390921660209283029190910190910152600191820191016123a5565b5050505b8354815183918391811061241b57fe5b6001600160a01b0392831660209182029290920101526000907f00000000000000000000000000000000000000000000000000000000000000001663e6a4390561247186612469578b61246b565b8a5b8a6115ad565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d60208110156124e857600080fd5b50519b509099506125ea98505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390561253988876115ad565b61254388886115ad565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156125a257600080fd5b505afa1580156125b6573d6000803e3d6000fd5b505050506040513d60208110156125cc57600080fd5b50516040805160008152602081019091529099509750505050505050505b915091565b600080600080866001600160a01b0316635d97d3e2876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561263857600080fd5b505afa15801561264c573d6000803e3d6000fd5b505050506040513d604081101561266257600080fd5b508051602090910151865191935091506126e157866001600160a01b031663313a9b4e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d60208110156126d957600080fd5b5051016126e5565b8451015b90969095509350505050565b6001600160a01b03161590565b60008060008060008060608060008980602001905160e081101561272157600080fd5b815160208301516040808501516060860151608087015160a088018051945196989597939692959194929382019284600160201b82111561276157600080fd5b90830190602082018581111561277657600080fd5b82518660208202830111600160201b8211171561279257600080fd5b82525081516020918201928201910280838360005b838110156127bf5781810151838201526020016127a7565b5050505090500160405260200180516040519392919084600160201b8211156127e757600080fd5b9083019060208201858111156127fc57600080fd5b82518660208202830111600160201b8211171561281857600080fd5b82525081516020918201928201910280838360005b8381101561284557818101518382015260200161282d565b50505050905001604052505050869650859550809850819950829c50839750849d50859e50869f5050505050505050876001600160a01b0316636f012b8d886040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d60408110156128e157600080fd5b5051825190955060009015612a7c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631f00ca748d856040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561297657818101518382015260200161295e565b50505050905001935050505060006040518083038186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129d757600080fd5b8101908080516040519392919084600160201b8211156129f657600080fd5b908301906020820185811115612a0b57600080fd5b82518660208202830111600160201b82111715612a2757600080fd5b82525081516020918201928201910280838360005b83811015612a54578181015183820152602001612a3c565b50505050905001604052505050600081518110612a6d57fe5b60200260200101519050612a7f565b508a5b612a8a818784612e0c565b945050509295985092959890939650565b600080612aa98686856125ef565b90925090506000612ab9836126f1565b15612b44578190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b50505050612b4f565b612b4f8388846115cb565b8351612be257604080516308ee261360e31b81526001600160a01b038a8116600483015260248201899052604482018890529151918916916347713098918491606480830192602092919082900301818588803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b50505050506040513d6020811015612bda57600080fd5b506108299050565b866001600160a01b0316637c974fc4828a89886040518563ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015612c62578181015183820152602001612c4a565b505050509050019450505050506020604051808303818588803b158015612c8857600080fd5b505af1158015612c9c573d6000803e3d6000fd5b50505050506040513d6020811015612cb357600080fd5b50505050505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612d3c5780518252601f199092019160209182019101612d1d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d9e576040519150601f19603f3d011682016040523d82523d6000602084013e612da3565b606091505b5091509150818015612dd1575080511580612dd15750808060200190516020811015612dce57600080fd5b50515b6117185760405162461bcd60e51b81526004018080602001828103825260228152602001806130fe6022913960400191505060405180910390fd5b600082841115612e4d5760405162461bcd60e51b815260040180806020018281038252604c8152602001806131d7604c913960600191505060405180910390fd5b83830382811015612e8f5760405162461bcd60e51b815260040180806020018281038252604a815260200180613092604a913960600191505060405180910390fd5b949350505050565b5080546000825590600052602060002090810190612eb59190612f1d565b50565b828054828255906000526020600020908101928215612f0d579160200282015b82811115612f0d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ed8565b50612f19929150612f37565b5090565b610b0c91905b80821115612f195760008155600101612f23565b610b0c91905b80821115612f195780546001600160a01b0319168155600101612f3d565b6000546001600160a01b031615612fb9576040805162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a20436f6e747261637420696e697469616c697a6564000000604482015290519081900360640190fd5b6000612fc3611424565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737341434f417373657448656c7065723a3a5f63616c6c417070726f7665455243323041434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964207472616e73616374696f6e2073656e64657241434f466c61736845786572636973653a3a5f76616c69646174654d696e696d756d436f6c6c61746572616c3a204d696e696d756d20616d6f756e74206e6f742073617469736669656441434f417373657448656c7065723a3a5f676574417373657442616c616e63654f6641434f417373657448656c7065723a3a5f63616c6c5472616e73666572455243323041434f466c61736845786572636973653a3a5f76616c6964617465556e69737761704d6964646c65526f7574653a20496e76616c6964206d6964646c6520726f75746541434f466c61736845786572636973653a3a666c61736845786572636973654163636f756e74733a204163636f756e74732061726520726571756972656441434f466c61736845786572636973653a3a5f666c61736845786572636973653a20496e76616c696420556e6973776170207061697241434f466c61736845786572636973653a3a5f76616c69646174654d696e696d756d436f6c6c61746572616c3a20496e73756666696369656e7420636f6c6c61746572616c20616d6f756e7441434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c69642073656e64657241434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964206f757420616d6f756e7473a264697066735822122043ae5746096d0ffb045469c6e994973288303bec446cb48d42bcac5fc6bdc40864736f6c634300060600330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x6080604052600436106100e15760003560e01c8063735de9f71161007f5780638da5cb5b116100595780638da5cb5b14610484578063a66d363e14610499578063f10dd52114610575578063f2fde38b1461060f576100e8565b8063735de9f714610413578063796b3e4a146104285780638bdb2afa1461046f576100e8565b80633fc8cef3116100bb5780633fc8cef3146103175780634884780a146103485780634b721f37146103835780635caec24f146103c8576100e8565b80630152ef95146100ed578063061ad030146101b957806310d1e85c14610280576100e8565b366100e857005b600080fd5b3480156100f957600080fd5b506101b76004803603608081101561011057600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561014657600080fd5b82018360208201111561015857600080fd5b803590602001918460208302840111600160201b8311171561017957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610642945050505050565b005b3480156101c557600080fd5b506101b7600480360360608110156101dc57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561020f57600080fd5b82018360208201111561022157600080fd5b803590602001918460208302840111600160201b8311171561024257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610696945050505050565b34801561028c57600080fd5b506101b7600480360360808110156102a357600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610833565b34801561032357600080fd5b5061032c6108f5565b604080516001600160a01b039092168252519081900360200190f35b34801561035457600080fd5b506101b76004803603604081101561036b57600080fd5b506001600160a01b0381358116916020013516610919565b34801561038f57600080fd5b506101b7600480360360808110156103a657600080fd5b506001600160a01b0381351690602081013590604081013590606001356109a7565b3480156103d457600080fd5b50610401600480360360408110156103eb57600080fd5b506001600160a01b0381351690602001356109df565b60408051918252519081900360200190f35b34801561041f57600080fd5b5061032c610a98565b34801561043457600080fd5b5061045b6004803603602081101561044b57600080fd5b50356001600160a01b0316610abc565b604080519115158252519081900360200190f35b34801561047b57600080fd5b5061032c610adb565b34801561049057600080fd5b5061032c610aff565b3480156104a557600080fd5b5061055c600480360360608110156104bc57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156104eb57600080fd5b8201836020820111156104fd57600080fd5b803590602001918460208302840111600160201b8311171561051e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b0f945050505050565b6040805192835260208301919091528051918290030190f35b34801561058157600080fd5b506105b06004803603604081101561059857600080fd5b506001600160a01b0381358116916020013516610f97565b604051808315151515815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156105fa5781810151838201526020016105e2565b50505050905001935050505060405180910390f35b34801561061b57600080fd5b506101b76004803603602081101561063257600080fd5b50356001600160a01b0316611009565b60008151116106825760405162461bcd60e51b815260040180806020018281038252603e815260200180613163603e913960400191505060405180910390fd5b610690848484600085611113565b50505050565b61069e611424565b6000546001600160a01b03908116911614610700576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61070b838383611428565b600080610718858561153f565b805491935091501561078f57811561075f576001600160a01b038085166000908152600160209081526040808320938916835292905290812061075a91612e97565b61078f565b6001600160a01b038086166000908152600160209081526040808320938816835292905290812061078f91612e97565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26107e76107de88836115ad565b836000196115cb565b6107f46107de87836115ad565b6001600160a01b038088166000908152600160209081526040808320938a168352928152919020865161082992880190612eb8565b5050505050505050565b6001600160a01b038516301461087a5760405162461bcd60e51b815260040180806020018281038252602f815260200180613223602f913960400191505060405180910390fd5b6000610886858561171f565b905060008060008060606108d08689898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a6492505050565b945094509450945094506108e8858585858a86611b24565b5050505050505050505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b610921611424565b6000546001600160a01b03908116911614610983576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600061098f8330611e04565b905080156109a2576109a2838383611f65565b505050565b6106908484848460006040519080825280602002602001820160405280156109d9578160200160208202803683370190505b50611113565b6040805160008082526020820190925281906109fe9085908590610b0f565b5090508015610a8c576000846001600160a01b0316636f012b8d856040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d6040811015610a7657600080fd5b5051905080821015610a8a57039050610a92565b505b60009150505b92915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600080610ac88361208d565b506001600160a01b031615159392505050565b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000546001600160a01b03165b90565b6000808315610f885760006060610b258761208d565b90925090506001600160a01b03821615610f8557600080610b478989896125ef565b91509150610b75827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26115ad565b9150600080856001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d6060811015610bdd57600080fd5b50805160209182015160408051630dfe168160e01b815290516001600160701b03938416965092909116935060009283926001600160a01b038b1692630dfe1681926004808301939192829003018186803b158015610c3b57600080fd5b505afa158015610c4f573d6000803e3d6000fd5b505050506040513d6020811015610c6557600080fd5b50516001600160a01b038781169116148015610c8057508385105b15610c8f575081905082610d18565b876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc857600080fd5b505afa158015610cdc573d6000803e3d6000fd5b505050506040513d6020811015610cf257600080fd5b50516001600160a01b038781169116148015610d0d57508285105b15610d185750829050815b600082118015610d285750600081115b15610f7e5760007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166385f8c2598785856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6020811015610dcd57600080fd5b5051885190915060009015610f6857604080516307c0329d60e21b815260048101848152602482019283528b5160448301528b516001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1693631f00ca749387938f93909291606401906020808601910280838360005b83811015610e62578181015183820152602001610e4a565b50505050905001935050505060006040518083038186803b158015610e8657600080fd5b505afa158015610e9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ec357600080fd5b8101908080516040519392919084600160201b821115610ee257600080fd5b908301906020820185811115610ef757600080fd5b82518660208202830111600160201b82111715610f1357600080fd5b82525081516020918201928201910280838360005b83811015610f40578181015183820152602001610f28565b50505050905001604052505050600081518110610f5957fe5b60200260200101519050610f6b565b50805b9a50949850610f8f975050505050505050565b5050505050505b50505b5060009050805b935093915050565b60006060610fa5848461153f565b805460408051602080840282018101909252828152918391830182828015610ff657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fd8575b50505050509050915091505b9250929050565b611011611424565b6000546001600160a01b03908116911614611073576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166110b85760405162461bcd60e51b81526004018080602001828103825260268152602001806130106026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060606111208761208d565b90925090506001600160a01b03821661116a5760405162461bcd60e51b81526004018080602001828103825260368152602001806131a16036913960400191505060405180910390fd5b6000806111788989876125ef565b9150915060008090506000809050856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b50516001600160a01b031661121e857f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26115ad565b6001600160a01b0316141561123557829150611238565b50815b6060338c8c8c8c8c8b60405160200180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b031681526020018681526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ca5781810151838201526020016112b2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156113095781810151838201526020016112f1565b5050505090500199505050505050505050506040516020818303038152906040529050866001600160a01b031663022c0d9f848430856040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113af578181015183820152602001611397565b50505050905090810190601f1680156113dc5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156113fe57600080fd5b505af1158015611412573d6000803e3d6000fd5b50505050505050505050505050505050565b3390565b60005b815181101561069057600082828151811061144257fe5b60200260200101519050806001600160a01b0316856001600160a01b0316141580156114805750806001600160a01b0316846001600160a01b031614155b6114bb5760405162461bcd60e51b81526004018080602001828103825260438152602001806131206043913960600191505060405180910390fd5b600182015b8351811015611535578381815181106114d557fe5b60200260200101516001600160a01b0316826001600160a01b0316141561152d5760405162461bcd60e51b81526004018080602001828103825260438152602001806131206043913960600191505060405180910390fd5b6001016114c0565b505060010161142b565b6001600160a01b038083166000908152600160209081526040808320938516835292905290812080548291901561157b57600092509050611002565b5050506001600160a01b0380821660009081526001602090815260408083209386168352929052208054151590611002565b60006115b8836126f1565b156115c4575080610a92565b5081610a92565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106116485780518252601f199092019160209182019101611629565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146116aa576040519150601f19603f3d011682016040523d82523d6000602084013e6116af565b606091505b50915091508180156116dd5750805115806116dd57508080602001905160208110156116da57600080fd5b50515b6117185760405162461bcd60e51b81526004018080602001828103825260218152602001806130366021913960400191505060405180910390fd5b5050505050565b600080336001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b50516040805163d21220a760e01b81529051919250600091339163d21220a7916004808301926020929190829003018186803b1580156117c457600080fd5b505afa1580156117d8573d6000803e3d6000fd5b505050506040513d60208110156117ee57600080fd5b50516040805163e6a4390560e01b81526001600160a01b038581166004830152808416602483015291519293507f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9091169163e6a4390591604480820192602092909190829003018186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b50516001600160a01b031633146118d85760405162461bcd60e51b815260040180806020018281038252603b815260200180613057603b913960400191505060405180910390fd5b8415806118e3575083155b61191e5760405162461bcd60e51b81526004018080602001828103825260348152602001806132526034913960400191505060405180910390fd5b600080336001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d606081101561198457600080fd5b5080516020909101516001600160701b039182169350169050600080886119af5750829050816119b5565b50819050825b604080516385f8c25960e01b81528a8a016004820152602481018490526044810183905290516001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16916385f8c259916064808301926020929190829003018186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b50519998505050505050505050565b6000806000806060600080600080600080606080611a828f8f6126fe565b97509750975097509750975097509750611a9f8888888886612a9b565b6000876001600160a01b031663d8dfeb456040518163ffffffff1660e01b815260040160206040518083038186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d6020811015611b0457600080fd5b5051989d50979b5092995090975090955050505050509295509295909350565b805115611d5557828403611b37866126f1565b15611bb1577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b9757600080fd5b505af1158015611bab573d6000803e3d6000fd5b50505050505b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316638803dbee84838533426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c5e578181015183820152602001611c46565b505050509050019650505050505050600060405180830381600087803b158015611c8757600080fd5b505af1158015611c9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611cc457600080fd5b8101908080516040519392919084600160201b821115611ce357600080fd5b908301906020820185811115611cf857600080fd5b82518660208202830111600160201b82111715611d1457600080fd5b82525081516020918201928201910280838360005b83811015611d41578181015183820152602001611d29565b505050509050016040525050505050611df1565b6000611d60866126f1565b15611de1577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29050806001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611dc357600080fd5b505af1158015611dd7573d6000803e3d6000fd5b5050505050611de4565b50845b611def813385612cbf565b505b611dfc858785611f65565b505050505050565b6000611e0f836126f1565b15611e2557506001600160a01b03811631610a92565b604080516001600160a01b0384811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b178152925182516000946060949389169392918291908083835b60208310611e9e5780518252601f199092019160209182019101611e7f565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611efe576040519150601f19603f3d011682016040523d82523d6000602084013e611f03565b606091505b509150915081611f445760405162461bcd60e51b81526004018080602001828103825260228152602001806130dc6022913960400191505060405180910390fd5b808060200190516020811015611f5957600080fd5b50519250610a92915050565b611f6e836126f1565b1561208257604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310611fbf5780518252601f199092019160209182019101611fa0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612021576040519150601f19603f3d011682016040523d82523d6000602084013e612026565b606091505b505090508061207c576040805162461bcd60e51b815260206004820152601e60248201527f41434f417373657448656c7065723a3a5f7472616e7366657241737365740000604482015290519081900360640190fd5b506109a2565b6109a2838383612cbf565b6000606060008390506000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d157600080fd5b505afa1580156120e5573d6000803e3d6000fd5b505050506040513d60208110156120fb57600080fd5b5051604080516302fad37960e31b815290519192506000916001600160a01b038516916317d69bc8916004808301926020929190829003018186803b15801561214357600080fd5b505afa158015612157573d6000803e3d6000fd5b505050506040513d602081101561216d57600080fd5b505190507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260008061219f858561153f565b80549193509150156124fe576000866001600160a01b0316636d6364786040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e657600080fd5b505afa1580156121fa573d6000803e3d6000fd5b505050506040513d602081101561221057600080fd5b5051825490915060009060609060010167ffffffffffffffff8111801561223657600080fd5b50604051908082528060200260200182016040528015612260578160200160208202803683370190505b509050612279836122715787612273565b885b876115ad565b8160008151811061228657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508280156122b05750845b806122c25750821580156122c2575084155b1561236b576122f2846000815481106122d757fe5b6000918252602090912001546001600160a01b0316876115ad565b84549092506001905b60018111156123645761233186600183038154811061231657fe5b6000918252602090912001546001600160a01b0316896115ad565b83838151811061233d57fe5b6001600160a01b0390921660209283029190910190910152600190910190600019016122fb565b505061240b565b835460001981019061239e9086908390811061238357fe5b6000918252602090912001546001600160a01b0316886115ad565b9250600160005b82811015612407576123d78782815481106123bc57fe5b6000918252602090912001546001600160a01b03168a6115ad565b8483815181106123e357fe5b6001600160a01b0390921660209283029190910190910152600191820191016123a5565b5050505b8354815183918391811061241b57fe5b6001600160a01b0392831660209182029290920101526000907f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1663e6a4390561247186612469578b61246b565b8a5b8a6115ad565b604080516001600160e01b031960e085901b1681526001600160a01b0392831660048201529187166024830152516044808301926020929190829003018186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d60208110156124e857600080fd5b50519b509099506125ea98505050505050505050565b60007f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f6001600160a01b031663e6a4390561253988876115ad565b61254388886115ad565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156125a257600080fd5b505afa1580156125b6573d6000803e3d6000fd5b505050506040513d60208110156125cc57600080fd5b50516040805160008152602081019091529099509750505050505050505b915091565b600080600080866001600160a01b0316635d97d3e2876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561263857600080fd5b505afa15801561264c573d6000803e3d6000fd5b505050506040513d604081101561266257600080fd5b508051602090910151865191935091506126e157866001600160a01b031663313a9b4e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d60208110156126d957600080fd5b5051016126e5565b8451015b90969095509350505050565b6001600160a01b03161590565b60008060008060008060608060008980602001905160e081101561272157600080fd5b815160208301516040808501516060860151608087015160a088018051945196989597939692959194929382019284600160201b82111561276157600080fd5b90830190602082018581111561277657600080fd5b82518660208202830111600160201b8211171561279257600080fd5b82525081516020918201928201910280838360005b838110156127bf5781810151838201526020016127a7565b5050505090500160405260200180516040519392919084600160201b8211156127e757600080fd5b9083019060208201858111156127fc57600080fd5b82518660208202830111600160201b8211171561281857600080fd5b82525081516020918201928201910280838360005b8381101561284557818101518382015260200161282d565b50505050905001604052505050869650859550809850819950829c50839750849d50859e50869f5050505050505050876001600160a01b0316636f012b8d886040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d60408110156128e157600080fd5b5051825190955060009015612a7c577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316631f00ca748d856040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561297657818101518382015260200161295e565b50505050905001935050505060006040518083038186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129d757600080fd5b8101908080516040519392919084600160201b8211156129f657600080fd5b908301906020820185811115612a0b57600080fd5b82518660208202830111600160201b82111715612a2757600080fd5b82525081516020918201928201910280838360005b83811015612a54578181015183820152602001612a3c565b50505050905001604052505050600081518110612a6d57fe5b60200260200101519050612a7f565b508a5b612a8a818784612e0c565b945050509295985092959890939650565b600080612aa98686856125ef565b90925090506000612ab9836126f1565b15612b44578190507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b50505050612b4f565b612b4f8388846115cb565b8351612be257604080516308ee261360e31b81526001600160a01b038a8116600483015260248201899052604482018890529151918916916347713098918491606480830192602092919082900301818588803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b50505050506040513d6020811015612bda57600080fd5b506108299050565b866001600160a01b0316637c974fc4828a89886040518563ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015612c62578181015183820152602001612c4a565b505050509050019450505050506020604051808303818588803b158015612c8857600080fd5b505af1158015612c9c573d6000803e3d6000fd5b50505050506040513d6020811015612cb357600080fd5b50505050505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612d3c5780518252601f199092019160209182019101612d1d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d9e576040519150601f19603f3d011682016040523d82523d6000602084013e612da3565b606091505b5091509150818015612dd1575080511580612dd15750808060200190516020811015612dce57600080fd5b50515b6117185760405162461bcd60e51b81526004018080602001828103825260228152602001806130fe6022913960400191505060405180910390fd5b600082841115612e4d5760405162461bcd60e51b815260040180806020018281038252604c8152602001806131d7604c913960600191505060405180910390fd5b83830382811015612e8f5760405162461bcd60e51b815260040180806020018281038252604a815260200180613092604a913960600191505060405180910390fd5b949350505050565b5080546000825590600052602060002090810190612eb59190612f1d565b50565b828054828255906000526020600020908101928215612f0d579160200282015b82811115612f0d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612ed8565b50612f19929150612f37565b5090565b610b0c91905b80821115612f195760008155600101612f23565b610b0c91905b80821115612f195780546001600160a01b0319168155600101612f3d565b6000546001600160a01b031615612fb9576040805162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a20436f6e747261637420696e697469616c697a6564000000604482015290519081900360640190fd5b6000612fc3611424565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737341434f417373657448656c7065723a3a5f63616c6c417070726f7665455243323041434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964207472616e73616374696f6e2073656e64657241434f466c61736845786572636973653a3a5f76616c69646174654d696e696d756d436f6c6c61746572616c3a204d696e696d756d20616d6f756e74206e6f742073617469736669656441434f417373657448656c7065723a3a5f676574417373657442616c616e63654f6641434f417373657448656c7065723a3a5f63616c6c5472616e73666572455243323041434f466c61736845786572636973653a3a5f76616c6964617465556e69737761704d6964646c65526f7574653a20496e76616c6964206d6964646c6520726f75746541434f466c61736845786572636973653a3a666c61736845786572636973654163636f756e74733a204163636f756e74732061726520726571756972656441434f466c61736845786572636973653a3a5f666c61736845786572636973653a20496e76616c696420556e6973776170207061697241434f466c61736845786572636973653a3a5f76616c69646174654d696e696d756d436f6c6c61746572616c3a20496e73756666696369656e7420636f6c6c61746572616c20616d6f756e7441434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c69642073656e64657241434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964206f757420616d6f756e7473a264697066735822122043ae5746096d0ffb045469c6e994973288303bec446cb48d42bcac5fc6bdc40864736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode Sourcemap
378:23021:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;8224:370:1;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8224:370:1;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;8224:370:1;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;8224:370:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;8224:370:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8224:370:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;8224:370:1;;-1:-1:-1;8224:370:1;;-1:-1:-1;;;;;8224:370:1:i;:::-;;2149:868;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2149:868:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;2149:868:1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;2149:868:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;2149:868:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;2149:868:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2149:868:1;;-1:-1:-1;2149:868:1;;-1:-1:-1;;;;;2149:868:1:i;9081:658::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9081:658:1;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;9081:658:1;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;9081:658:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;9081:658:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;9081:658:1;;-1:-1:-1;9081:658:1;-1:-1:-1;9081:658:1;:::i;727:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;727:29:1;;;:::i;:::-;;;;-1:-1:-1;;;;;727:29:1;;;;;;;;;;;;;;1543:282;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1543:282:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;1543:282:1;;;;;;;;;;:::i;7359:209::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7359:209:1;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;7359:209:1;;;;;;;;;;;;;;;;;;:::i;6186:493::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6186:493:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;6186:493:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;615:38;;5:9:-1;2:2;;;27:1;24;17:12;2:2;615:38:1;;;:::i;3690:162::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3690:162:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3690:162:1;-1:-1:-1;;;;;3690:162:1;;:::i;:::-;;;;;;;;;;;;;;;;;;504:39;;5:9:-1;2:2;;;27:1;24;17:12;2:2;504:39:1;;;:::i;2071:79:9:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2071:79:9;;;:::i;4400:1431:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4400:1431:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;4400:1431:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;4400:1431:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;4400:1431:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4400:1431:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4400:1431:1;;-1:-1:-1;4400:1431:1;;-1:-1:-1;;;;;4400:1431:1:i;:::-;;;;;;;;;;;;;;;;;;;;;;;3289:171;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3289:171:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;3289:171:1;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3289:171:1;;;;;;;;;;;;;;;;;;2517:244:9;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2517:244:9;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2517:244:9;-1:-1:-1;;;;;2517:244:9;;:::i;8224:370:1:-;8438:1;8420:8;:15;:19;8412:94;;;;-1:-1:-1;;;8412:94:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8517:69;8532:8;8542:11;8555:17;8574:1;8577:8;8517:14;:69::i;:::-;8224:370;;;;:::o;2149:868::-;2293:12:9;:10;:12::i;:::-;2283:6;;-1:-1:-1;;;;;2283:6:9;;;:22;;;2275:67;;;;;-1:-1:-1;;;2275:67:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2284:70:1::1;2312:9;2323:10;2335:18;2284:27;:70::i;:::-;2366:13;2381:23:::0;2408:38:::1;2424:9;2435:10;2408:15;:38::i;:::-;2461:12:::0;;2365:81;;-1:-1:-1;2365:81:1;-1:-1:-1;2461:16:1;2457:196:::1;;2498:8;2494:148;;;-1:-1:-1::0;;;;;2522:23:1;;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;:34;;::::1;::::0;;;;;;;;2515:41:::1;::::0;::::1;:::i;:::-;2494:148;;;-1:-1:-1::0;;;;;2592:22:1;;::::1;;::::0;;;:11:::1;:22;::::0;;;;;;;:34;;::::1;::::0;;;;;;;;2585:41:::1;::::0;::::1;:::i;:::-;2682:13;2716:4;2725:109;2758:34;2775:9:::0;2716:4;2758:16:::1;:34::i;:::-;2794:14;-1:-1:-1::0;;2725:32:1::1;:109::i;:::-;2839:110;2872:35;2889:10;2901:5;2872:16;:35::i;2839:110::-;-1:-1:-1::0;;;;;2954:22:1;;::::1;;::::0;;;:11:::1;:22;::::0;;;;;;;:34;;::::1;::::0;;;;;;;;:55;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;2353:1:9;;;;2149:868:1::0;;;:::o;9081:658::-;-1:-1:-1;;;;;9264:23:1;;9282:4;9264:23;9256:83;;;;-1:-1:-1;;;9256:83:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9360:22;9385:51;9413:10;9425;9385:27;:51::i;:::-;9360:76;;9448:15;9465:18;9485:24;9511:23;9536:21;9561:31;9571:14;9587:4;;9561:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;9561:9:1;;-1:-1:-1;;;9561:31:1:i;:::-;9447:145;;;;;;;;;;9607:124;9625:7;9639:10;9656:16;9679:15;9701:14;9722:4;9607:12;:124::i;:::-;9081:658;;;;;;;;;;;:::o;727:29::-;;;:::o;1543:282::-;2293:12:9;:10;:12::i;:::-;2283:6;;-1:-1:-1;;;;;2283:6:9;;;:22;;;2275:67;;;;;-1:-1:-1;;;2275:67:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:14:1::1;1652:55;1686:5;1701:4;1652:33;:55::i;:::-;1635:72:::0;-1:-1:-1;1722:10:1;;1718:100:::1;;1749:57;1779:5;1786:11;1799:6;1749:29;:57::i;:::-;2353:1:9;1543:282:1::0;;:::o;7359:209::-;7480:80;7495:8;7505:11;7518:17;7537:4;7557:1;7543:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;7543:16:1;;7480:14;:80::i;6186:493::-;6360:16;;;6273:7;6360:16;;;;;;;;;6273:7;;6321:56;;6337:8;;6347:11;;6321:15;:56::i;:::-;-1:-1:-1;6293:84:1;-1:-1:-1;6392:18:1;;6388:265;;6428:24;6467:8;-1:-1:-1;;;;;6457:43:1;;6501:11;6457:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6457:56:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6457:56:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;6457:56:1;;-1:-1:-1;6532:33:1;;;6528:114;;;6593:33;;-1:-1:-1;6586:40:1;;6528:114;6388:265;;6670:1;6663:8;;;6186:493;;;;;:::o;615:38::-;;;:::o;3690:162::-;3754:4;3766:12;3783:25;3799:8;3783:15;:25::i;:::-;-1:-1:-1;;;;;;3826:18:1;;;;3690:162;-1:-1:-1;;;3690:162:1:o;504:39::-;;;:::o;2071:79:9:-;2109:7;2136:6;-1:-1:-1;;;;;2136:6:9;2071:79;;:::o;4400:1431:1:-;4511:7;;4544:15;;4540:1260;;4577:12;4591:21;4616:25;4632:8;4616:15;:25::i;:::-;4576:65;;-1:-1:-1;4576:65:1;-1:-1:-1;;;;;;4660:18:1;;;4656:1133;;4700:23;4725:22;4751:52;4771:8;4781:11;4794:8;4751:19;:52::i;:::-;4699:104;;;;4828:39;4845:15;4862:4;4828:16;:39::i;:::-;4810:57;;4877:16;4895;4931:4;-1:-1:-1;;;;;4916:32:1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4916:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4916:34:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4916:34:1;;;;;;;;5039:29;;-1:-1:-1;;;5039:29:1;;;;-1:-1:-1;;;;;4876:74:1;;;;-1:-1:-1;4876:74:1;;;;;-1:-1:-1;4957:17:1;;;;-1:-1:-1;;;;;5039:27:1;;;;;:29;;;;;4916:34;;5039:29;;;;;:27;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;5039:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5039:29:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5039:29:1;-1:-1:-1;;;;;5020:48:1;;;;;;:77;;;;;5089:8;5072:14;:25;5020:77;5016:302;;;-1:-1:-1;5119:8:1;;-1:-1:-1;5148:8:1;5016:302;;;5208:4;-1:-1:-1;;;;;5193:27:1;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5193:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5193:29:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5193:29:1;-1:-1:-1;;;;;5174:48:1;;;;;;:77;;;;;5243:8;5226:14;:25;5174:77;5170:148;;;-1:-1:-1;5273:8:1;;-1:-1:-1;5302:8:1;5170:148;5346:1;5334:9;:13;:31;;;;;5364:1;5351:10;:14;5334:31;5330:444;;;5375:22;5419:13;-1:-1:-1;;;;;5400:45:1;;5446:14;5462:9;5473:10;5400:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5400:84:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5400:84:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5400:84:1;5530:11;;5400:84;;-1:-1:-1;5492:26:1;;5530:15;5526:190;;5577:68;;;-1:-1:-1;;;5577:68:1;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5596:13:1;5577:46;;;;5624:14;;5640:4;;5577:68;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5577:68:1;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5577:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5577:68:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;5577:68:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;5577:68:1;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;5577:68:1;;421:4:-1;412:14;;;;5577:68:1;;;;;412:14:-1;5577:68:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5577:68:1;;;;;;;;;;;5646:1;5577:71;;;;;;;;;;;;;;5556:92;;5526:190;;;-1:-1:-1;5693:14:1;5526:190;5731:18;-1:-1:-1;5751:14:1;;-1:-1:-1;5723:43:1;;-1:-1:-1;;;;;;;;5723:43:1;5330:444;4656:1133;;;;;;;4540:1260;;;-1:-1:-1;5818:1:1;;-1:-1:-1;5818:1:1;4400:1431;;;;;;;:::o;3289:171::-;3372:4;3378:16;3414:38;3430:9;3441:10;3414:15;:38::i;:::-;3407:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3407:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;3289:171;;;;;;:::o;2517:244:9:-;2293:12;:10;:12::i;:::-;2283:6;;-1:-1:-1;;;;;2283:6:9;;;:22;;;2275:67;;;;;-1:-1:-1;;;2275:67:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2606:22:9;::::1;2598:73;;;;-1:-1:-1::0;;;2598:73:9::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2708:6;::::0;;2687:38:::1;::::0;-1:-1:-1;;;;;2687:38:9;;::::1;::::0;2708:6;::::1;::::0;2687:38:::1;::::0;::::1;2736:6;:17:::0;;-1:-1:-1;;;;;;2736:17:9::1;-1:-1:-1::0;;;;;2736:17:9;;;::::1;::::0;;;::::1;::::0;;2517:244::o;18613:980:1:-;18820:12;18834:21;18859:25;18875:8;18859:15;:25::i;:::-;18819:65;;-1:-1:-1;18819:65:1;-1:-1:-1;;;;;;18903:18:1;;18895:85;;;;-1:-1:-1;;;18895:85:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19002:23;19027:22;19053:52;19073:8;19083:11;19096:8;19053:19;:52::i;:::-;19001:104;;;;19118:18;19139:1;19118:22;;19151:18;19172:1;19151:22;;19246:4;-1:-1:-1;;;;;19231:27:1;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19231:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19231:29:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19231:29:1;-1:-1:-1;;;;;19188:72:1;:39;19205:15;19222:4;19188:16;:39::i;:::-;-1:-1:-1;;;;;19188:72:1;;19184:194;;;19290:14;19277:27;;19184:194;;;-1:-1:-1;19350:14:1;19184:194;19398:17;19429:10;19441:8;19451:11;19464:17;19483:4;19489:8;19499:4;19418:86;;;;;;-1:-1:-1;;;;;19418:86:1;-1:-1:-1;;;;;19418:86:1;;;;;;-1:-1:-1;;;;;19418:86:1;-1:-1:-1;;;;;19418:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;19418:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;19418:86:1;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;19418:86:1;;;19398:106;;19530:4;-1:-1:-1;;;;;19515:25:1;;19541:10;19553;19573:4;19580;19515:70;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19515:70:1;-1:-1:-1;;;;;19515:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;19515:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19515:70:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19515:70:1;;;;18613:980;;;;;;;;;;;;:::o;635:106:9:-;723:10;635:106;:::o;22792:604:1:-;22928:9;22923:466;22947:18;:25;22943:1;:29;22923:466;;;22994:13;23010:18;23029:1;23010:21;;;;;;;;;;;;;;22994:37;;23064:5;-1:-1:-1;;;;;23054:15:1;:6;-1:-1:-1;;;;;23054:15:1;;;:34;;;;;23083:5;-1:-1:-1;;;;;23073:15:1;:6;-1:-1:-1;;;;;23073:15:1;;;23054:34;23046:114;;;;-1:-1:-1;;;23046:114:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23194:1;23192:3;;23175:203;23201:18;:25;23197:1;:29;23175:203;;;23269:18;23288:1;23269:21;;;;;;;;;;;;;;-1:-1:-1;;;;;23260:30:1;:5;-1:-1:-1;;;;;23260:30:1;;;23252:110;;;;-1:-1:-1;;;23252:110:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23228:3;;23175:203;;;-1:-1:-1;;22974:3:1;;22923:466;;22108:391;-1:-1:-1;;;;;22256:22:1;;;22194:4;22256:22;;;:11;:22;;;;;;;;:34;;;;;;;;;;;22305:12;;22194:4;;22256:34;22305:16;22301:191;;22346:5;;-1:-1:-1;22353:5:1;-1:-1:-1;22338:21:1;;22301:191;-1:-1:-1;;;;;;;;22410:23:1;;;22383:24;22410:23;;;:11;:23;;;;;;;;:34;;;;;;;;;22459:13;;:17;;;22450:36;;19853:225;19931:7;19955:30;19979:5;19955:23;:30::i;:::-;19951:120;;;-1:-1:-1;20009:5:1;20002:12;;19951:120;-1:-1:-1;20054:5:1;20047:12;;691:334:0;839:51;;;-1:-1:-1;;;;;839:51:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;839:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;828:63:0;;;;787:12;;801:23;;828:10;;;;839:51;828:63;;;25:18:-1;828:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;828:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;786:105:0;;;;910:7;:69;;;;-1:-1:-1;922:17:0;;:22;;:56;;;959:10;948:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;948:30:0;922:56;902:115;;;;-1:-1:-1;;;902:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;691:334;;;;;:::o;16165:921:1:-;16264:7;16284:14;16316:10;-1:-1:-1;;;;;16301:33:1;;:35;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16301:35:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16301:35:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16301:35:1;16364;;;-1:-1:-1;;;16364:35:1;;;;16301;;-1:-1:-1;16347:14:1;;16379:10;;16364:33;;:35;;;;;16301;;16364;;;;;;;16379:10;16364:35;;;2:2:-1;;;;27:1;24;17:12;2:2;16364:35:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16364:35:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16364:35:1;16432:57;;;-1:-1:-1;;;16432:57:1;;-1:-1:-1;;;;;16432:57:1;;;;;;;;;;;;;;;;16364:35;;-1:-1:-1;16450:14:1;16432:41;;;;;;:57;;;;;16364:35;;16432:57;;;;;;;;:41;:57;;;2:2:-1;;;;27:1;24;17:12;2:2;16432:57:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16432:57:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16432:57:1;-1:-1:-1;;;;;16418:71:1;:10;:71;16410:143;;;;-1:-1:-1;;;16410:143:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16573:15;;;:34;;-1:-1:-1;16592:15:1;;16573:34;16565:99;;;;-1:-1:-1;;;16565:99:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16687:16;16705;16741:10;-1:-1:-1;;;;;16726:38:1;;:40;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16726:40:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16726:40:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16726:40:1;;;;;;;-1:-1:-1;;;;;16686:80:1;;;;-1:-1:-1;16686:80:1;;-1:-1:-1;16771:17:1;;16828:15;16824:145;;-1:-1:-1;16863:8:1;;-1:-1:-1;16890:8:1;16824:145;;;-1:-1:-1;16928:8:1;;-1:-1:-1;16955:8:1;16824:145;16986:95;;;-1:-1:-1;;;16986:95:1;;17033:23;;;16986:95;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17005:13:1;16986:45;;;;:95;;;;;;;;;;;;;;:45;:95;;;2:2:-1;;;;27:1;24;17:12;2:2;16986:95:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16986:95:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16986:95:1;;16165:921;-1:-1:-1;;;;;;;;;16165:921:1:o;12551:637::-;12634:7;12647;12660;12672;12684:16;12717:15;12739:16;12762:19;12788:12;12807:24;12838:23;12867:25;12899:21;12924:42;12945:14;12961:4;12924:20;:42::i;:::-;12716:250;;;;;;;;;;;;;;;;12987:60;13000:7;13009:8;13019:11;13032:4;13038:8;12987:12;:60::i;:::-;13056:18;13087:8;-1:-1:-1;;;;;13077:30:1;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13077:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13077:32:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13077:32:1;13122:7;;-1:-1:-1;13077:32:1;;-1:-1:-1;13143:16:1;;-1:-1:-1;13161:15:1;;-1:-1:-1;13178:4:1;;-1:-1:-1;;;;;;12551:637:1;;;;;;;;:::o;10286:923::-;10495:11;;:15;10491:642;;10540:34;;;10584:35;10608:10;10584:23;:35::i;:::-;10580:96;;;10634:4;-1:-1:-1;;;;;10628:19:1;;10655:11;10628:41;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10628:41:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10628:41:1;;;;;10580:96;10700:13;-1:-1:-1;;;;;10681:58:1;;10740:21;10763:11;10776:4;10782:10;10794:15;10681:129;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10681:129:1;-1:-1:-1;;;;;10681:129:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10681:129:1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10681:129:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10681:129:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;10681:129:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;10681:129:1;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;10681:129:1;;421:4:-1;412:14;;;;10681:129:1;;;;;412:14:-1;10681:129:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10681:129:1;;;;;;;;;;;;10491:642;;;;10828:20;10858:35;10882:10;10858:23;:35::i;:::-;10854:185;;;10917:4;10902:19;;10934:12;-1:-1:-1;;;;;10928:27:1;;10963:21;10928:59;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10928:59:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10928:59:1;;;;;10854:185;;;-1:-1:-1;11022:10:1;10854:185;11044:82;11078:12;11092:10;11104:21;11044:33;:82::i;:::-;10491:642;;11137:67;11167:10;11179:7;11188:15;11137:29;:67::i;:::-;10286:923;;;;;;:::o;4166:439:0:-;4248:7;4272:15;4281:5;4272:8;:15::i;:::-;4268:330;;;-1:-1:-1;;;;;;4311:15:0;;;4304:22;;4268:330;4418:43;;;-1:-1:-1;;;;;4418:43:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;4418:43:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;4401:61:0;;;;4360:12;;4374:23;;4401:16;;;;4418:43;4401:61;;;25:18:-1;4401:61:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4401:61:0;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;4359:103:0;;;;4485:7;4477:54;;;;-1:-1:-1;;;4477:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4564:10;4553:33;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4553:33:0;;-1:-1:-1;4546:40:0;;-1:-1:-1;;4546:40:0;5609:330;5700:15;5709:5;5700:8;:15::i;:::-;5696:236;;;5772:12;;;5733;5772;;;;;;;;;-1:-1:-1;;;;;5750:7:0;;;5764:6;;5750:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5750:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;5732:53:0;;;5808:7;5800:50;;;;;-1:-1:-1;;;5800:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5696:236;;;;5883:37;5902:5;5909:2;5913:6;5883:18;:37::i;20345:1497:1:-;20410:7;20419:16;20442:14;20469:8;20442:36;;20483:18;20504:4;-1:-1:-1;;;;;20504:15:1;;:17;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20504:17:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20504:17:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20504:17:1;20554:18;;;-1:-1:-1;;;20554:18:1;;;;20504:17;;-1:-1:-1;20532:19:1;;-1:-1:-1;;;;;20554:16:1;;;;;:18;;;;;20504:17;;20554:18;;;;;;;:16;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;20554:18:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20554:18:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20554:18:1;;-1:-1:-1;20593:4:1;20577:13;;20651:40;20667:10;20554:18;20651:15;:40::i;:::-;20700:12;;20608:83;;-1:-1:-1;20608:83:1;-1:-1:-1;20700:16:1;20696:1139;;20724:11;20738:4;-1:-1:-1;;;;;20738:11:1;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20738:13:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20738:13:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20738:13:1;20818:12;;20738:13;;-1:-1:-1;20757:17:1;;20780:21;;20833:1;20818:16;20804:31;;;2:2:-1;;;;27:1;24;17:12;2:2;20804:31:1;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;20804:31:1;;20780:55;;20851:60;20869:6;:33;;20891:11;20869:33;;;20878:10;20869:33;20905:5;20851:16;:60::i;:::-;20841:4;20846:1;20841:7;;;;;;;;;;;;;:70;-1:-1:-1;;;;;20841:70:1;;;-1:-1:-1;;;;;20841:70:1;;;;;20922:6;:18;;;;;20932:8;20922:18;20921:46;;;;20947:6;20946:7;:20;;;;;20958:8;20957:9;20946:20;20917:530;;;20988:33;21005:5;21011:1;21005:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21005:8:1;21015:5;20988:16;:33::i;:::-;21069:12;;20976:45;;-1:-1:-1;21044:1:1;;21052:125;21087:1;21083;:5;21052:125;;;21117:37;21134:5;21144:1;21140;:5;21134:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21134:12:1;21148:5;21117:16;:37::i;:::-;21103:4;21108:5;21103:11;;;;;;;;-1:-1:-1;;;;;21103:51:1;;;:11;;;;;;;;;;;:51;21162:7;;;;;-1:-1:-1;;21090:3:1;21052:125;;;;20917:530;;;;21216:12;;-1:-1:-1;;21216:16:1;;;21251:41;;21216:5;;:16;;21268;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21268:16:1;21286:5;21251:16;:41::i;:::-;21239:53;-1:-1:-1;21315:1:1;21299:13;21323:118;21347:9;21343:1;:13;21323:118;;;21385:33;21402:5;21408:1;21402:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21402:8:1;21412:5;21385:16;:33::i;:::-;21371:4;21376:5;21371:11;;;;;;;;-1:-1:-1;;;;;21371:47:1;;;:11;;;;;;;;;;;:47;21426:7;;;;;21358:3;21323:118;;;;20917:530;;;21457:12;;21452:18;;21473:9;;21452:4;;:18;;;;;;-1:-1:-1;;;;;21452:30:1;;;:18;;;;;;;;;:30;21488:12;;21521:14;21503:41;;21545:60;21563:6;:33;;21586:10;21563:33;;;21572:11;21563:33;21599:5;21545:16;:60::i;:::-;21503:114;;;-1:-1:-1;;;;;;21503:114:1;;;;;;;-1:-1:-1;;;;;21503:114:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2:2:-1;;;;27:1;24;17:12;2:2;21503:114:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21503:114:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21503:114:1;;-1:-1:-1;21637:4:1;;-1:-1:-1;21623:19:1;;-1:-1:-1;;;;;;;;;21623:19:1;20696:1139;21661:12;21694:14;-1:-1:-1;;;;;21676:41:1;;21718:35;21735:10;21747:5;21718:16;:35::i;:::-;21755:36;21772:11;21785:5;21755:16;:36::i;:::-;21676:116;;;;;;;;;;;;;-1:-1:-1;;;;;21676:116:1;-1:-1:-1;;;;;21676:116:1;;;;;;-1:-1:-1;;;;;21676:116:1;-1:-1:-1;;;;;21676:116:1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21676:116:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21676:116:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21676:116:1;21812:16;;;21826:1;21812:16;;;;;;;;21676:116;;-1:-1:-1;21812:16:1;-1:-1:-1;;;;;;;;20345:1497:1;;;;:::o;17526:479::-;17643:7;17652;17667:23;17692:22;17728:8;-1:-1:-1;;;;;17718:39:1;;17758:11;17718:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17718:52:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17718:52:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17718:52:1;;;;;;;17779:15;;17718:52;;-1:-1:-1;17718:52:1;-1:-1:-1;17775:181:1;;17851:8;-1:-1:-1;;;;;17841:40:1;;:42;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17841:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17841:42:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17841:42:1;17824:59;17775:181;;;17935:15;;17918:32;17775:181;17968:15;;;;-1:-1:-1;17526:479:1;-1:-1:-1;;;;17526:479:1:o;364:112:0:-;-1:-1:-1;;;;;446:22:0;;;364:112::o;13434:990:1:-;13536:15;13559:16;13583:19;13610:12;13630:24;13662:23;13693:25;13726:21;13760:25;13910:4;13899:85;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;13899:85:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;13899:85:1;;421:4:-1;412:14;;;;13899:85:1;;;;;412:14:-1;13899:85:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13899:85:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;13899:85:1;;421:4:-1;412:14;;;;13899:85:1;;;;;412:14:-1;13899:85:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13899:85:1;;;;;;;;;;;13793:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14029:8;-1:-1:-1;;;;;14019:43:1;;14063:11;14019:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14019:56:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14019:56:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14019:56:1;14125:11;;14019:56;;-1:-1:-1;14090:26:1;;14125:15;14121:187;;14188:13;-1:-1:-1;;;;;14169:46:1;;14216:14;14232:4;14169:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14169:68:1;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14169:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14169:68:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;14169:68:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;14169:68:1;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;14169:68:1;;421:4:-1;412:14;;;;14169:68:1;;;;;412:14:-1;14169:68:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14169:68:1;;;;;;;;;;;14238:1;14169:71;;;;;;;;;;;;;;14148:92;;14121:187;;;-1:-1:-1;14288:14:1;14121:187;14336:83;14363:18;14383:16;14401:17;14336:26;:83::i;:::-;14318:101;;13434:990;;;;;;;;;;;;;:::o;14965:856::-;15142:23;15167:22;15193:52;15213:8;15223:11;15236:8;15193:19;:52::i;:::-;15141:104;;-1:-1:-1;15141:104:1;-1:-1:-1;15254:16:1;15289:40;15141:104;15289:23;:40::i;:::-;15285:257;;;15357:14;15346:25;;15392:4;-1:-1:-1;;;;;15386:20:1;;15407:14;15386:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15386:36:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15386:36:1;;;;15285:257;;;15455:75;15488:15;15505:8;15515:14;15455:32;:75::i;:::-;15566:15;;15562:252;;15603:77;;;-1:-1:-1;;;15603:77:1;;-1:-1:-1;;;;;15603:77:1;;;;;;;;;;;;;;;;;;;;;:32;;;;;;15643:8;;15603:77;;;;;;;;;;;;;;15643:8;15603:32;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;15603:77:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15603:77:1;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15562:252:1;;-1:-1:-1;15562:252:1;;15723:8;-1:-1:-1;;;;;15713:40:1;;15761:8;15771:7;15780:11;15793:8;15713:89;;;;;;;;;;;;;-1:-1:-1;;;;;15713:89:1;-1:-1:-1;;;;;15713:89:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15713:89:1;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15713:89:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15713:89:1;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;14965:856:1;;;;;;;;:::o;1259:340:0:-;1410:53;;;-1:-1:-1;;;;;1410:53:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1410:53:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1399:65:0;;;;1358:12;;1372:23;;1399:10;;;;1410:53;1399:65;;;25:18:-1;1399:65:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1399:65:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1357:107:0;;;;1483:7;:69;;;;-1:-1:-1;1495:17:0;;:22;;:56;;;1532:10;1521:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1521:30:0;1495:56;1475:116;;;;-1:-1:-1;;;1475:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11606:496:1;11741:7;11781:16;11763:14;:34;;11755:123;;;;-1:-1:-1;;;11755:123:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11909:33;;;11955:36;;;;11947:123;;;;-1:-1:-1;;;11947:123:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12082:15;11606:496;-1:-1:-1;;;;11606:496:1:o;378:23021::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;378:23021:1;-1:-1:-1;;;;;378:23021:1;;;;;;;;;;;-1:-1:-1;378:23021:1;;;;;;;-1:-1:-1;378:23021:1;;;-1:-1:-1;378:23021:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;378:23021:1;;;;;;;1753:237:9;1815:1;1797:6;-1:-1:-1;;;;;1797:6:9;:20;1789:62;;;;;-1:-1:-1;;;1789:62:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1862:17;1882:12;:10;:12::i;:::-;1905:6;:18;;-1:-1:-1;;;;;;1905:18:9;-1:-1:-1;;;;;1905:18:9;;;;;;;1939:43;;1905:18;;-1:-1:-1;1905:18:9;1939:43;;1905:6;;1939:43;1753:237;:::o
Swarm Source
ipfs://43ae5746096d0ffb045469c6e994973288303bec446cb48d42bcac5fc6bdc408
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.