Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Reader
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "../libraries/token/IERC20.sol"; import "../libraries/math/SafeMath.sol"; import "../core/interfaces/IVault.sol"; import "../core/interfaces/IVaultPriceFeed.sol"; import "../tokens/interfaces/IYieldTracker.sol"; import "../tokens/interfaces/IYieldToken.sol"; import "../access/Governable.sol"; contract Reader is Governable { using SafeMath for uint256; uint256 public constant BASIS_POINTS_DIVISOR = 10000; uint256 public constant POSITION_PROPS_LENGTH = 9; uint256 public constant PRICE_PRECISION = 10**30; uint256 public constant USDQ_DECIMALS = 18; bool public hasMaxGlobalShortSizes; function setConfig(bool _hasMaxGlobalShortSizes) public onlyGov { hasMaxGlobalShortSizes = _hasMaxGlobalShortSizes; } function getMaxAmountIn( IVault _vault, address _tokenIn, address _tokenOut ) public view returns (uint256) { uint256 priceIn = _vault.getMinPrice(_tokenIn); uint256 priceOut = _vault.getMaxPrice(_tokenOut); uint256 tokenInDecimals = _vault.tokenDecimals(_tokenIn); uint256 tokenOutDecimals = _vault.tokenDecimals(_tokenOut); uint256 amountIn; { uint256 poolAmount = _vault.poolAmounts(_tokenOut); uint256 reservedAmount = _vault.reservedAmounts(_tokenOut); uint256 bufferAmount = _vault.bufferAmounts(_tokenOut); uint256 subAmount = reservedAmount > bufferAmount ? reservedAmount : bufferAmount; if (subAmount >= poolAmount) { return 0; } uint256 availableAmount = poolAmount.sub(subAmount); amountIn = availableAmount.mul(priceOut).div(priceIn).mul(10**tokenInDecimals).div(10**tokenOutDecimals); } uint256 maxUsdqAmount = _vault.maxUsdqAmounts(_tokenIn); if (maxUsdqAmount != 0) { if (maxUsdqAmount < _vault.usdqAmounts(_tokenIn)) { return 0; } uint256 maxAmountIn = maxUsdqAmount.sub(_vault.usdqAmounts(_tokenIn)); maxAmountIn = maxAmountIn.mul(10**tokenInDecimals).div(10**USDQ_DECIMALS); maxAmountIn = maxAmountIn.mul(PRICE_PRECISION).div(priceIn); if (amountIn > maxAmountIn) { return maxAmountIn; } } return amountIn; } function getAmountOut( IVault _vault, address _tokenIn, address _tokenOut, uint256 _amountIn ) public view returns (uint256, uint256) { uint256 priceIn = _vault.getMinPrice(_tokenIn); uint256 tokenInDecimals = _vault.tokenDecimals(_tokenIn); uint256 tokenOutDecimals = _vault.tokenDecimals(_tokenOut); uint256 feeBasisPoints; { uint256 usdqAmount = _amountIn.mul(priceIn).div(PRICE_PRECISION); usdqAmount = usdqAmount.mul(10**USDQ_DECIMALS).div(10**tokenInDecimals); bool isStableSwap = _vault.stableTokens(_tokenIn) && _vault.stableTokens(_tokenOut); uint256 baseBps = isStableSwap ? _vault.stableSwapFeeBasisPoints() : _vault.swapFeeBasisPoints(); uint256 taxBps = isStableSwap ? _vault.stableTaxBasisPoints() : _vault.taxBasisPoints(); uint256 feesBasisPoints0 = _vault.getFeeBasisPoints(_tokenIn, usdqAmount, baseBps, taxBps, true); uint256 feesBasisPoints1 = _vault.getFeeBasisPoints(_tokenOut, usdqAmount, baseBps, taxBps, false); // use the higher of the two fee basis points feeBasisPoints = feesBasisPoints0 > feesBasisPoints1 ? feesBasisPoints0 : feesBasisPoints1; } uint256 priceOut = _vault.getMaxPrice(_tokenOut); uint256 amountOut = _amountIn.mul(priceIn).div(priceOut); amountOut = amountOut.mul(10**tokenOutDecimals).div(10**tokenInDecimals); uint256 amountOutAfterFees = amountOut.mul(BASIS_POINTS_DIVISOR.sub(feeBasisPoints)).div(BASIS_POINTS_DIVISOR); uint256 feeAmount = amountOut.sub(amountOutAfterFees); return (amountOutAfterFees, feeAmount); } function getFeeBasisPoints( IVault _vault, address _tokenIn, address _tokenOut, uint256 _amountIn ) public view returns ( uint256, uint256, uint256 ) { uint256 priceIn = _vault.getMinPrice(_tokenIn); uint256 tokenInDecimals = _vault.tokenDecimals(_tokenIn); uint256 usdqAmount = _amountIn.mul(priceIn).div(PRICE_PRECISION); usdqAmount = usdqAmount.mul(10**USDQ_DECIMALS).div(10**tokenInDecimals); bool isStableSwap = _vault.stableTokens(_tokenIn) && _vault.stableTokens(_tokenOut); uint256 baseBps = isStableSwap ? _vault.stableSwapFeeBasisPoints() : _vault.swapFeeBasisPoints(); uint256 taxBps = isStableSwap ? _vault.stableTaxBasisPoints() : _vault.taxBasisPoints(); uint256 feesBasisPoints0 = _vault.getFeeBasisPoints(_tokenIn, usdqAmount, baseBps, taxBps, true); uint256 feesBasisPoints1 = _vault.getFeeBasisPoints(_tokenOut, usdqAmount, baseBps, taxBps, false); // use the higher of the two fee basis points uint256 feeBasisPoints = feesBasisPoints0 > feesBasisPoints1 ? feesBasisPoints0 : feesBasisPoints1; return (feeBasisPoints, feesBasisPoints0, feesBasisPoints1); } function getFees(address _vault, address[] memory _tokens) public view returns (uint256[] memory) { uint256[] memory amounts = new uint256[](_tokens.length); for (uint256 i = 0; i < _tokens.length; i++) { amounts[i] = IVault(_vault).feeReserves(_tokens[i]); } return amounts; } function getTotalStaked(address[] memory _yieldTokens) public view returns (uint256[] memory) { uint256[] memory amounts = new uint256[](_yieldTokens.length); for (uint256 i = 0; i < _yieldTokens.length; i++) { IYieldToken yieldToken = IYieldToken(_yieldTokens[i]); amounts[i] = yieldToken.totalStaked(); } return amounts; } function getStakingInfo(address _account, address[] memory _yieldTrackers) public view returns (uint256[] memory) { uint256 propsLength = 2; uint256[] memory amounts = new uint256[](_yieldTrackers.length * propsLength); for (uint256 i = 0; i < _yieldTrackers.length; i++) { IYieldTracker yieldTracker = IYieldTracker(_yieldTrackers[i]); amounts[i * propsLength] = yieldTracker.claimable(_account); amounts[i * propsLength + 1] = yieldTracker.getTokensPerInterval(); } return amounts; } function getFundingRates( address _vault, address _weth, address[] memory _tokens ) public view returns (uint256[] memory) { uint256 propsLength = 2; uint256[] memory fundingRates = new uint256[](_tokens.length * propsLength); IVault vault = IVault(_vault); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { token = _weth; } uint256 fundingRateFactor = vault.stableTokens(token) ? vault.stableFundingRateFactor() : vault.fundingRateFactor(); uint256 reservedAmount = vault.reservedAmounts(token); uint256 poolAmount = vault.poolAmounts(token); if (poolAmount > 0) { fundingRates[i * propsLength] = fundingRateFactor.mul(reservedAmount).div(poolAmount); } if (vault.cumulativeFundingRates(token) > 0) { uint256 nextRate = vault.getNextFundingRate(token); uint256 baseRate = vault.cumulativeFundingRates(token); fundingRates[i * propsLength + 1] = baseRate.add(nextRate); } } return fundingRates; } function getTokenSupply(IERC20 _token, address[] memory _excludedAccounts) public view returns (uint256) { uint256 supply = _token.totalSupply(); for (uint256 i = 0; i < _excludedAccounts.length; i++) { address account = _excludedAccounts[i]; uint256 balance = _token.balanceOf(account); supply = supply.sub(balance); } return supply; } function getTotalBalance(IERC20 _token, address[] memory _accounts) public view returns (uint256) { uint256 totalBalance = 0; for (uint256 i = 0; i < _accounts.length; i++) { address account = _accounts[i]; uint256 balance = _token.balanceOf(account); totalBalance = totalBalance.add(balance); } return totalBalance; } function getTokenBalances(address _account, address[] memory _tokens) public view returns (uint256[] memory) { uint256[] memory balances = new uint256[](_tokens.length); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { balances[i] = _account.balance; continue; } balances[i] = IERC20(token).balanceOf(_account); } return balances; } function getTokenBalancesWithSupplies(address _account, address[] memory _tokens) public view returns (uint256[] memory) { uint256 propsLength = 2; uint256[] memory balances = new uint256[](_tokens.length * propsLength); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { balances[i * propsLength] = _account.balance; balances[i * propsLength + 1] = 0; continue; } balances[i * propsLength] = IERC20(token).balanceOf(_account); balances[i * propsLength + 1] = IERC20(token).totalSupply(); } return balances; } function getPrices(IVaultPriceFeed _priceFeed, address[] memory _tokens) public view returns (uint256[] memory) { uint256 propsLength = 6; uint256[] memory amounts = new uint256[](_tokens.length * propsLength); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; amounts[i * propsLength] = _priceFeed.getPrice(token, true, true, false); amounts[i * propsLength + 1] = _priceFeed.getPrice(token, false, true, false); amounts[i * propsLength + 2] = _priceFeed.getPrimaryPrice(token, true); amounts[i * propsLength + 3] = _priceFeed.getPrimaryPrice(token, false); amounts[i * propsLength + 4] = _priceFeed.isAdjustmentAdditive(token) ? 1 : 0; amounts[i * propsLength + 5] = _priceFeed.adjustmentBasisPoints(token); } return amounts; } function getVaultTokenInfo( address _vault, address _weth, uint256 _usdqAmount, address[] memory _tokens ) public view returns (uint256[] memory) { uint256 propsLength = 10; IVault vault = IVault(_vault); IVaultPriceFeed priceFeed = IVaultPriceFeed(vault.priceFeed()); uint256[] memory amounts = new uint256[](_tokens.length * propsLength); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { token = _weth; } amounts[i * propsLength] = vault.poolAmounts(token); amounts[i * propsLength + 1] = vault.reservedAmounts(token); amounts[i * propsLength + 2] = vault.usdqAmounts(token); amounts[i * propsLength + 3] = vault.getRedemptionAmount(token, _usdqAmount); amounts[i * propsLength + 4] = vault.tokenWeights(token); amounts[i * propsLength + 5] = vault.getMinPrice(token); amounts[i * propsLength + 6] = vault.getMaxPrice(token); amounts[i * propsLength + 7] = vault.guaranteedUsd(token); amounts[i * propsLength + 8] = priceFeed.getPrimaryPrice(token, false); amounts[i * propsLength + 9] = priceFeed.getPrimaryPrice(token, true); } return amounts; } function getFullVaultTokenInfo( address _vault, address _weth, uint256 _usdqAmount, address[] memory _tokens ) public view returns (uint256[] memory) { uint256 propsLength = 12; IVault vault = IVault(_vault); IVaultPriceFeed priceFeed = IVaultPriceFeed(vault.priceFeed()); uint256[] memory amounts = new uint256[](_tokens.length * propsLength); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { token = _weth; } amounts[i * propsLength] = vault.poolAmounts(token); amounts[i * propsLength + 1] = vault.reservedAmounts(token); amounts[i * propsLength + 2] = vault.usdqAmounts(token); amounts[i * propsLength + 3] = vault.getRedemptionAmount(token, _usdqAmount); amounts[i * propsLength + 4] = vault.tokenWeights(token); amounts[i * propsLength + 5] = vault.bufferAmounts(token); amounts[i * propsLength + 6] = vault.maxUsdqAmounts(token); amounts[i * propsLength + 7] = vault.getMinPrice(token); amounts[i * propsLength + 8] = vault.getMaxPrice(token); amounts[i * propsLength + 9] = vault.guaranteedUsd(token); amounts[i * propsLength + 10] = priceFeed.getPrimaryPrice(token, false); amounts[i * propsLength + 11] = priceFeed.getPrimaryPrice(token, true); } return amounts; } function getVaultTokenInfoV2( address _vault, address _weth, uint256 _usdqAmount, address[] memory _tokens ) public view returns (uint256[] memory) { uint256 propsLength = 14; IVault vault = IVault(_vault); IVaultPriceFeed priceFeed = IVaultPriceFeed(vault.priceFeed()); uint256[] memory amounts = new uint256[](_tokens.length * propsLength); for (uint256 i = 0; i < _tokens.length; i++) { address token = _tokens[i]; if (token == address(0)) { token = _weth; } uint256 maxGlobalShortSize = hasMaxGlobalShortSizes ? vault.maxGlobalShortSizes(token) : 0; amounts[i * propsLength] = vault.poolAmounts(token); amounts[i * propsLength + 1] = vault.reservedAmounts(token); amounts[i * propsLength + 2] = vault.usdqAmounts(token); amounts[i * propsLength + 3] = vault.getRedemptionAmount(token, _usdqAmount); amounts[i * propsLength + 4] = vault.tokenWeights(token); amounts[i * propsLength + 5] = vault.bufferAmounts(token); amounts[i * propsLength + 6] = vault.maxUsdqAmounts(token); amounts[i * propsLength + 7] = vault.globalShortSizes(token); amounts[i * propsLength + 8] = maxGlobalShortSize; amounts[i * propsLength + 9] = vault.getMinPrice(token); amounts[i * propsLength + 10] = vault.getMaxPrice(token); amounts[i * propsLength + 11] = vault.guaranteedUsd(token); amounts[i * propsLength + 12] = priceFeed.getPrimaryPrice(token, false); amounts[i * propsLength + 13] = priceFeed.getPrimaryPrice(token, true); } return amounts; } function getPositions( address _vault, address _account, address[] memory _collateralTokens, address[] memory _indexTokens, bool[] memory _isLong ) public view returns (uint256[] memory) { uint256[] memory amounts = new uint256[](_collateralTokens.length * POSITION_PROPS_LENGTH); for (uint256 i = 0; i < _collateralTokens.length; i++) { { ( uint256 size, uint256 collateral, uint256 averagePrice, uint256 entryFundingRate, , /* reserveAmount */ uint256 realisedPnl, bool hasRealisedProfit, uint256 lastIncreasedTime ) = IVault(_vault).getPosition(_account, _collateralTokens[i], _indexTokens[i], _isLong[i]); amounts[i * POSITION_PROPS_LENGTH] = size; amounts[i * POSITION_PROPS_LENGTH + 1] = collateral; amounts[i * POSITION_PROPS_LENGTH + 2] = averagePrice; amounts[i * POSITION_PROPS_LENGTH + 3] = entryFundingRate; amounts[i * POSITION_PROPS_LENGTH + 4] = hasRealisedProfit ? 1 : 0; amounts[i * POSITION_PROPS_LENGTH + 5] = realisedPnl; amounts[i * POSITION_PROPS_LENGTH + 6] = lastIncreasedTime; } uint256 size = amounts[i * POSITION_PROPS_LENGTH]; uint256 averagePrice = amounts[i * POSITION_PROPS_LENGTH + 2]; uint256 lastIncreasedTime = amounts[i * POSITION_PROPS_LENGTH + 6]; if (averagePrice > 0) { (bool hasProfit, uint256 delta) = IVault(_vault).getDelta(_indexTokens[i], size, averagePrice, _isLong[i], lastIncreasedTime); amounts[i * POSITION_PROPS_LENGTH + 7] = hasProfit ? 1 : 0; amounts[i * POSITION_PROPS_LENGTH + 8] = delta; } } return amounts; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; contract Governable { address public gov; constructor() public { gov = msg.sender; } modifier onlyGov() { require(msg.sender == gov, "Governable: forbidden"); _; } function setGov(address _gov) external onlyGov { gov = _gov; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IVaultUtils.sol"; interface IVault { function isInitialized() external view returns (bool); function isSwapEnabled() external view returns (bool); function isLeverageEnabled() external view returns (bool); function setVaultUtils(IVaultUtils _vaultUtils) external; function setError(uint256 _errorCode, string calldata _error) external; function router() external view returns (address); function usdq() external view returns (address); function gov() external view returns (address); function vaultUtils() external view returns (IVaultUtils); function whitelistedTokenCount() external view returns (uint256); function maxLeverage() external view returns (uint256); function minProfitTime() external view returns (uint256); function hasDynamicFees() external view returns (bool); function fundingInterval() external view returns (uint256); function totalTokenWeights() external view returns (uint256); function getTargetUsdqAmount(address _token) external view returns (uint256); function inManagerMode() external view returns (bool); function inPrivateLiquidationMode() external view returns (bool); function maxGasPrice() external view returns (uint256); function approvedRouters(address _account, address _router) external view returns (bool); function isLiquidator(address _account) external view returns (bool); function isManager(address _account) external view returns (bool); function minProfitBasisPoints(address _token) external view returns (uint256); function tokenBalances(address _token) external view returns (uint256); function lastFundingTimes(address _token) external view returns (uint256); function setMaxLeverage(uint256 _maxLeverage) external; function setInManagerMode(bool _inManagerMode) external; function setManager(address _manager, bool _isManager) external; function setIsSwapEnabled(bool _isSwapEnabled) external; function setIsLeverageEnabled(bool _isLeverageEnabled) external; function setMaxGasPrice(uint256 _maxGasPrice) external; function setUsdqAmount(address _token, uint256 _amount) external; function setBufferAmount(address _token, uint256 _amount) external; function setMaxGlobalShortSize(address _token, uint256 _amount) external; function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external; function setLiquidator(address _liquidator, bool _isActive) external; function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external; function setFees( uint256 _taxBasisPoints, uint256 _stableTaxBasisPoints, uint256 _mintBurnFeeBasisPoints, uint256 _swapFeeBasisPoints, uint256 _stableSwapFeeBasisPoints, uint256 _marginFeeBasisPoints, uint256 _liquidationFeeUsd, uint256 _minProfitTime, bool _hasDynamicFees ) external; function setTokenConfig( address _token, uint256 _tokenDecimals, uint256 _redemptionBps, uint256 _minProfitBps, uint256 _maxUsdqAmount, bool _isStable, bool _isShortable ) external; function setPriceFeed(address _priceFeed) external; function withdrawFees(address _token, address _receiver) external returns (uint256); function directPoolDeposit(address _token) external; function buyUSDQ(address _token, address _receiver) external returns (uint256); function sellUSDQ(address _token, address _receiver) external returns (uint256); function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256); function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external; function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256); function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256); function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external; function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256); function priceFeed() external view returns (address); function fundingRateFactor() external view returns (uint256); function stableFundingRateFactor() external view returns (uint256); function cumulativeFundingRates(address _token) external view returns (uint256); function getNextFundingRate(address _token) external view returns (uint256); function getFeeBasisPoints(address _token, uint256 _usdqDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); function liquidationFeeUsd() external view returns (uint256); function taxBasisPoints() external view returns (uint256); function stableTaxBasisPoints() external view returns (uint256); function mintBurnFeeBasisPoints() external view returns (uint256); function swapFeeBasisPoints() external view returns (uint256); function stableSwapFeeBasisPoints() external view returns (uint256); function marginFeeBasisPoints() external view returns (uint256); function allWhitelistedTokensLength() external view returns (uint256); function allWhitelistedTokens(uint256) external view returns (address); function whitelistedTokens(address _token) external view returns (bool); function stableTokens(address _token) external view returns (bool); function shortableTokens(address _token) external view returns (bool); function feeReserves(address _token) external view returns (uint256); function globalShortSizes(address _token) external view returns (uint256); function globalShortAveragePrices(address _token) external view returns (uint256); function maxGlobalShortSizes(address _token) external view returns (uint256); function tokenDecimals(address _token) external view returns (uint256); function tokenWeights(address _token) external view returns (uint256); function guaranteedUsd(address _token) external view returns (uint256); function poolAmounts(address _token) external view returns (uint256); function bufferAmounts(address _token) external view returns (uint256); function reservedAmounts(address _token) external view returns (uint256); function usdqAmounts(address _token) external view returns (uint256); function maxUsdqAmounts(address _token) external view returns (uint256); function getRedemptionAmount(address _token, uint256 _usdqAmount) external view returns (uint256); function getMaxPrice(address _token) external view returns (uint256); function getMinPrice(address _token) external view returns (uint256); function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256); function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IVaultPriceFeed { function adjustmentBasisPoints(address _token) external view returns (uint256); function isAdjustmentAdditive(address _token) external view returns (bool); function setAdjustment( address _token, bool _isAdditive, uint256 _adjustmentBps ) external; function setIsSecondaryPriceEnabled(bool _isEnabled) external; function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external; function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external; function setFavorPrimaryPrice(bool _favorPrimaryPrice) external; function setPriceSampleSpace(uint256 _priceSampleSpace) external; function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external; function getPrice( address _token, bool _maximise, bool _includeAmmPrice, bool _useSwapPricing ) external view returns (uint256); function getPrimaryPrice(address _token, bool _maximise) external view returns (uint256); function setTokenConfig( address _token, address _priceFeed, uint256 _priceDecimals, bool _isStrictStable ) external; function getLatestPrimaryPrice(address _token) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IVaultUtils { function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool); function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view; function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view; function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256); function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256); function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256); function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256); function getBuyUsdqFeeBasisPoints(address _token, uint256 _usdqAmount) external view returns (uint256); function getSellUsdqFeeBasisPoints(address _token, uint256 _usdqAmount) external view returns (uint256); function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdqAmount) external view returns (uint256); function getFeeBasisPoints(address _token, uint256 _usdqDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); function getMaxAmountIn( address _tokenIn, address _tokenOut ) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IYieldToken { function totalStaked() external view returns (uint256); function stakedBalance(address _account) external view returns (uint256); function removeAdmin(address _account) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IYieldTracker { function claim(address _account, address _receiver) external returns (uint256); function updateRewards(address _account) external; function getTokensPerInterval() external view returns (uint256); function claimable(address _account) external view returns (uint256); }
{ "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POSITION_PROPS_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDQ_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getFeeBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getFees","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_usdqAmount","type":"uint256"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getFullVaultTokenInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getFundingRates","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"}],"name":"getMaxAmountIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_collateralTokens","type":"address[]"},{"internalType":"address[]","name":"_indexTokens","type":"address[]"},{"internalType":"bool[]","name":"_isLong","type":"bool[]"}],"name":"getPositions","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVaultPriceFeed","name":"_priceFeed","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getPrices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_yieldTrackers","type":"address[]"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getTokenBalances","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getTokenBalancesWithSupplies","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address[]","name":"_excludedAccounts","type":"address[]"}],"name":"getTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_yieldTokens","type":"address[]"}],"name":"getTotalStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_usdqAmount","type":"uint256"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getVaultTokenInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_usdqAmount","type":"uint256"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getVaultTokenInfoV2","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasMaxGlobalShortSizes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasMaxGlobalShortSizes","type":"bool"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b0319163317905561513e806100326000396000f3fe608060405234801561001057600080fd5b50600436106101285760003560e01c8063126082cf1461012d57806312d43a5114610147578063205425681461016b5780632413c8c11461027c5780632ac0184c1461031d5780632e3e3342146103ce5780633613d5271461047f578063440f018c146105305780634bc798f81461058a5780637b906e931461059257806386d4d0f5146106535780638e83ca3214610704578063937a0be8146107c557806395082d251461087657806395a7535a1461087e5780639b0183c314610938578063ad7e549714610959578063c6f1d67614610961578063cfad57a21461097d578063d7176ca9146109a3578063d802178e146109f8578063dc383cab14610aa9578063f3535e6c14610c67578063fbdb05ca14610c9f575b600080fd5b610135610d50565b60408051918252519081900360200190f35b61014f610d56565b604080516001600160a01b039092168252519081900360200190f35b61022c6004803603608081101561018157600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156101bb57600080fd5b8201836020820111156101cd57600080fd5b803590602001918460208302840111600160201b831117156101ee57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d65945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610268578181015183820152602001610250565b505050509050019250505060405180910390f35b61022c6004803603602081101561029257600080fd5b810190602081018135600160201b8111156102ac57600080fd5b8201836020820111156102be57600080fd5b803590602001918460208302840111600160201b831117156102df57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611473945050505050565b6101356004803603604081101561033357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035d57600080fd5b82018360208201111561036f57600080fd5b803590602001918460208302840111600160201b8311171561039057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061156c945050505050565b61022c600480360360408110156103e457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561040e57600080fd5b82018360208201111561042057600080fd5b803590602001918460208302840111600160201b8311171561044157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611697945050505050565b61022c6004803603604081101561049557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061189c945050505050565b61056c6004803603608081101561054657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611cd6565b60408051938452602084019290925282820152519081900360600190f35b61013561223b565b61022c600480360360808110156105a857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156105e257600080fd5b8201836020820111156105f457600080fd5b803590602001918460208302840111600160201b8311171561061557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612240945050505050565b61022c6004803603604081101561066957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561069357600080fd5b8201836020820111156106a557600080fd5b803590602001918460208302840111600160201b831117156106c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a71945050505050565b61022c6004803603608081101561071a57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075457600080fd5b82018360208201111561076657600080fd5b803590602001918460208302840111600160201b8311171561078757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612b71945050505050565b61022c600480360360408110156107db57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561080557600080fd5b82018360208201111561081757600080fd5b803590602001918460208302840111600160201b8311171561083857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506134ee945050505050565b610135613683565b61022c6004803603606081101561089457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156108c757600080fd5b8201836020820111156108d957600080fd5b803590602001918460208302840111600160201b831117156108fa57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613693945050505050565b6109576004803603602081101561094e57600080fd5b50351515613b61565b005b610135613bd6565b610969613bdb565b604080519115158252519081900360200190f35b6109576004803603602081101561099357600080fd5b50356001600160a01b0316613beb565b6109df600480360360808110156109b957600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135613c64565b6040805192835260208301919091528051918290030190f35b61022c60048036036040811015610a0e57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a3857600080fd5b820183602082011115610a4a57600080fd5b803590602001918460208302840111600160201b83111715610a6b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061431a945050505050565b61022c600480360360a0811015610abf57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610af257600080fd5b820183602082011115610b0457600080fd5b803590602001918460208302840111600160201b83111715610b2557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b7457600080fd5b820183602082011115610b8657600080fd5b803590602001918460208302840111600160201b83111715610ba757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610bf657600080fd5b820183602082011115610c0857600080fd5b803590602001918460208302840111600160201b83111715610c2957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550614466945050505050565b61013560048036036060811015610c7d57600080fd5b506001600160a01b038135811691602081013582169160409091013516614862565b61013560048036036040811015610cb557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610cdf57600080fd5b820183602082011115610cf157600080fd5b803590602001918460208302840111600160201b83111715610d1257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550614e29945050505050565b61271081565b6000546001600160a01b031681565b60606000600a905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dad57600080fd5b505afa158015610dc1573d6000803e3d6000fd5b505050506040513d6020811015610dd757600080fd5b5051855190915060609084026001600160401b0381118015610df857600080fd5b50604051908082528060200260200182016040528015610e22578160200160208202803683370190505b50905060005b8651811015611466576000878281518110610e3f57fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415610e675750885b846001600160a01b03166352f55eed826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610eb457600080fd5b505afa158015610ec8573d6000803e3d6000fd5b505050506040513d6020811015610ede57600080fd5b505183518490848902908110610ef057fe5b602002602001018181525050846001600160a01b031663c3c7b9e9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4957600080fd5b505afa158015610f5d573d6000803e3d6000fd5b505050506040513d6020811015610f7357600080fd5b5051835184906001858a0201908110610f8857fe5b602002602001018181525050846001600160a01b03166372912e94826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d602081101561100b57600080fd5b5051835184906002858a020190811061102057fe5b602002602001018181525050846001600160a01b0316632c668ec1828b6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b5051835184906003858a02019081106110c057fe5b602002602001018181525050846001600160a01b031663ab2f3ad4826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d602081101561114357600080fd5b5051835184906004858a020190811061115857fe5b602002602001018181525050846001600160a01b03166381a612d6826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b5051835184906005858a02019081106111f057fe5b602002602001018181525050846001600160a01b031663e124e6d2826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124957600080fd5b505afa15801561125d573d6000803e3d6000fd5b505050506040513d602081101561127357600080fd5b5051835184906006858a020190811061128857fe5b602002602001018181525050846001600160a01b031663f07456ce826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112e157600080fd5b505afa1580156112f5573d6000803e3d6000fd5b505050506040513d602081101561130b57600080fd5b5051835184906007858a020190811061132057fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918716926356c8c2c192604480840193829003018186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b5051835184906008858a02019081106113b957fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918716926356c8c2c192604480840193829003018186803b15801561141357600080fd5b505afa158015611427573d6000803e3d6000fd5b505050506040513d602081101561143d57600080fd5b5051835184906009858a020190811061145257fe5b602090810291909101015250600101610e28565b5098975050505050505050565b60608082516001600160401b038111801561148d57600080fd5b506040519080825280602002602001820160405280156114b7578160200160208202803683370190505b50905060005b83518110156115655760008482815181106114d457fe5b60200260200101519050806001600160a01b031663817b1cd26040518163ffffffff1660e01b815260040160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d602081101561154157600080fd5b5051835184908490811061155157fe5b6020908102919091010152506001016114bd565b5092915050565b600080836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d60208110156115d257600080fd5b5051905060005b835181101561168d5760008482815181106115f057fe5b602002602001015190506000866001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d602081101561167357600080fd5b505190506116818482614ee2565b935050506001016115d9565b5090505b92915050565b60606000600290506060818451026001600160401b03811180156116ba57600080fd5b506040519080825280602002602001820160405280156116e4578160200160208202803683370190505b50905060005b845181101561189357600085828151811061170157fe5b6020026020010151905060006001600160a01b0316816001600160a01b0316141561177057866001600160a01b031631838584028151811061173f57fe5b6020026020010181815250506000838584026001018151811061175e57fe5b6020026020010181815250505061188b565b806001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d60208110156117e757600080fd5b5051835184908487029081106117f957fe5b602002602001018181525050806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d602081101561186857600080fd5b50518351849060018588020190811061187d57fe5b602002602001018181525050505b6001016116ea565b50949350505050565b60606000600690506060818451026001600160401b03811180156118bf57600080fd5b506040519080825280602002602001820160405280156118e9578160200160208202803683370190505b50905060005b845181101561189357600085828151811061190657fe5b602090810291909101810151604080516317e1d38560e11b81526001600160a01b0380841660048301526001602483018190526044830152600060648301529151929450908a1692632fc3a70a92608480840193829003018186803b15801561196e57600080fd5b505afa158015611982573d6000803e3d6000fd5b505050506040513d602081101561199857600080fd5b5051835184908487029081106119aa57fe5b602090810291909101810191909152604080516317e1d38560e11b81526001600160a01b0384811660048301526000602483018190526001604484015260648301529151918a1692632fc3a70a92608480840193829003018186803b158015611a1257600080fd5b505afa158015611a26573d6000803e3d6000fd5b505050506040513d6020811015611a3c57600080fd5b505183518490600185880201908110611a5157fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918a16926356c8c2c192604480840193829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b505183518490600285880201908110611aea57fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918a16926356c8c2c192604480840193829003018186803b158015611b4457600080fd5b505afa158015611b58573d6000803e3d6000fd5b505050506040513d6020811015611b6e57600080fd5b505183518490600385880201908110611b8357fe5b602002602001018181525050866001600160a01b0316636ce8a44b826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b5051611c13576000611c16565b60015b60ff168385840260040181518110611c2a57fe5b602002602001018181525050866001600160a01b03166348cac277826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d6020811015611cad57600080fd5b505183518490600585880201908110611cc257fe5b6020908102919091010152506001016118ef565b600080600080876001600160a01b03166381a612d6886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d6020811015611d5357600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038a811660048301529151929350600092918b1691638ee573ac91602480820192602092909190829003018186803b158015611da557600080fd5b505afa158015611db9573d6000803e3d6000fd5b505050506040513d6020811015611dcf57600080fd5b505190506000611df568327cb2734119d3b7a9601e1b611def8986614f24565b90614f7d565b9050611e11600a83900a611def83670de0b6b3a7640000614f24565b905060008a6001600160a01b03166342b60b038b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d6020811015611e8c57600080fd5b50518015611f0f57508a6001600160a01b03166342b60b038a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ee257600080fd5b505afa158015611ef6573d6000803e3d6000fd5b505050506040513d6020811015611f0c57600080fd5b50515b9050600081611f82578b6001600160a01b031663a22f23926040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d6020811015611f7b57600080fd5b5051611fe8565b8b6001600160a01b031663df73a2676040518163ffffffff1660e01b815260040160206040518083038186803b158015611fbb57600080fd5b505afa158015611fcf573d6000803e3d6000fd5b505050506040513d6020811015611fe557600080fd5b50515b905060008261205b578c6001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561202a57600080fd5b505afa15801561203e573d6000803e3d6000fd5b505050506040513d602081101561205457600080fd5b50516120c1565b8c6001600160a01b03166310eb56c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561209457600080fd5b505afa1580156120a8573d6000803e3d6000fd5b505050506040513d60208110156120be57600080fd5b50515b905060008d6001600160a01b031663c7e074c38e87868660016040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d602081101561215f57600080fd5b8101908080519060200190929190505050905060008e6001600160a01b031663c7e074c38e88878760006040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b1580156121e457600080fd5b505afa1580156121f8573d6000803e3d6000fd5b505050506040513d602081101561220e57600080fd5b5051905060008183116122215781612223565b825b9b509199509750505050505050509450945094915050565b601281565b60606000600c905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228857600080fd5b505afa15801561229c573d6000803e3d6000fd5b505050506040513d60208110156122b257600080fd5b5051855190915060609084026001600160401b03811180156122d357600080fd5b506040519080825280602002602001820160405280156122fd578160200160208202803683370190505b50905060005b865181101561146657600087828151811061231a57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156123425750885b846001600160a01b03166352f55eed826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051835184908489029081106123cb57fe5b602002602001018181525050846001600160a01b031663c3c7b9e9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561242457600080fd5b505afa158015612438573d6000803e3d6000fd5b505050506040513d602081101561244e57600080fd5b5051835184906001858a020190811061246357fe5b602002602001018181525050846001600160a01b03166372912e94826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124bc57600080fd5b505afa1580156124d0573d6000803e3d6000fd5b505050506040513d60208110156124e657600080fd5b5051835184906002858a02019081106124fb57fe5b602002602001018181525050846001600160a01b0316632c668ec1828b6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b5051835184906003858a020190811061259b57fe5b602002602001018181525050846001600160a01b031663ab2f3ad4826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156125f457600080fd5b505afa158015612608573d6000803e3d6000fd5b505050506040513d602081101561261e57600080fd5b5051835184906004858a020190811061263357fe5b602002602001018181525050846001600160a01b0316634a993ee9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561268c57600080fd5b505afa1580156126a0573d6000803e3d6000fd5b505050506040513d60208110156126b657600080fd5b5051835184906005858a02019081106126cb57fe5b602002602001018181525050846001600160a01b031663123645aa826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561272457600080fd5b505afa158015612738573d6000803e3d6000fd5b505050506040513d602081101561274e57600080fd5b5051835184906006858a020190811061276357fe5b602002602001018181525050846001600160a01b03166381a612d6826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051835184906007858a02019081106127fb57fe5b602002602001018181525050846001600160a01b031663e124e6d2826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561285457600080fd5b505afa158015612868573d6000803e3d6000fd5b505050506040513d602081101561287e57600080fd5b5051835184906008858a020190811061289357fe5b602002602001018181525050846001600160a01b031663f07456ce826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156128ec57600080fd5b505afa158015612900573d6000803e3d6000fd5b505050506040513d602081101561291657600080fd5b5051835184906009858a020190811061292b57fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918716926356c8c2c192604480840193829003018186803b15801561298557600080fd5b505afa158015612999573d6000803e3d6000fd5b505050506040513d60208110156129af57600080fd5b505183518490600a858a02019081106129c457fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918716926356c8c2c192604480840193829003018186803b158015612a1e57600080fd5b505afa158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505183518490600b858a0201908110612a5d57fe5b602090810291909101015250600101612303565b60608082516001600160401b0381118015612a8b57600080fd5b50604051908082528060200260200182016040528015612ab5578160200160208202803683370190505b50905060005b835181101561168d57846001600160a01b0316631ce9cb8f858381518110612adf57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b50518251839083908110612b5e57fe5b6020908102919091010152600101612abb565b60606000600e905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bb957600080fd5b505afa158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5051855190915060609084026001600160401b0381118015612c0457600080fd5b50604051908082528060200260200182016040528015612c2e578160200160208202803683370190505b50905060005b8651811015611466576000878281518110612c4b57fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415612c735750885b60008054600160a01b900460ff16612c8c576000612d06565b856001600160a01b0316639698d25a836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d6020811015612d0357600080fd5b50515b9050856001600160a01b03166352f55eed836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d5557600080fd5b505afa158015612d69573d6000803e3d6000fd5b505050506040513d6020811015612d7f57600080fd5b505184518590858a02908110612d9157fe5b602002602001018181525050856001600160a01b031663c3c7b9e9836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dea57600080fd5b505afa158015612dfe573d6000803e3d6000fd5b505050506040513d6020811015612e1457600080fd5b5051845185906001868b0201908110612e2957fe5b602002602001018181525050856001600160a01b03166372912e94836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612e8257600080fd5b505afa158015612e96573d6000803e3d6000fd5b505050506040513d6020811015612eac57600080fd5b5051845185906002868b0201908110612ec157fe5b602002602001018181525050856001600160a01b0316632c668ec1838c6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b158015612f2257600080fd5b505afa158015612f36573d6000803e3d6000fd5b505050506040513d6020811015612f4c57600080fd5b5051845185906003868b0201908110612f6157fe5b602002602001018181525050856001600160a01b031663ab2f3ad4836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612fba57600080fd5b505afa158015612fce573d6000803e3d6000fd5b505050506040513d6020811015612fe457600080fd5b5051845185906004868b0201908110612ff957fe5b602002602001018181525050856001600160a01b0316634a993ee9836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561305257600080fd5b505afa158015613066573d6000803e3d6000fd5b505050506040513d602081101561307c57600080fd5b5051845185906005868b020190811061309157fe5b602002602001018181525050856001600160a01b031663123645aa836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156130ea57600080fd5b505afa1580156130fe573d6000803e3d6000fd5b505050506040513d602081101561311457600080fd5b5051845185906006868b020190811061312957fe5b602002602001018181525050856001600160a01b0316638a78daa8836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318257600080fd5b505afa158015613196573d6000803e3d6000fd5b505050506040513d60208110156131ac57600080fd5b5051845185906007868b02019081106131c157fe5b6020026020010181815250508084888502600801815181106131df57fe5b602002602001018181525050856001600160a01b03166381a612d6836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561323857600080fd5b505afa15801561324c573d6000803e3d6000fd5b505050506040513d602081101561326257600080fd5b5051845185906009868b020190811061327757fe5b602002602001018181525050856001600160a01b031663e124e6d2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d60208110156132fa57600080fd5b505184518590600a868b020190811061330f57fe5b602002602001018181525050856001600160a01b031663f07456ce836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561336857600080fd5b505afa15801561337c573d6000803e3d6000fd5b505050506040513d602081101561339257600080fd5b505184518590600b868b02019081106133a757fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038581166004830152600060248301529151918816926356c8c2c192604480840193829003018186803b15801561340157600080fd5b505afa158015613415573d6000803e3d6000fd5b505050506040513d602081101561342b57600080fd5b505184518590600c868b020190811061344057fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038581166004830152600160248301529151918816926356c8c2c192604480840193829003018186803b15801561349a57600080fd5b505afa1580156134ae573d6000803e3d6000fd5b505050506040513d60208110156134c457600080fd5b505184518590600d868b02019081106134d957fe5b60209081029190910101525050600101612c34565b60606000600290506060818451026001600160401b038111801561351157600080fd5b5060405190808252806020026020018201604052801561353b578160200160208202803683370190505b50905060005b845181101561189357600085828151811061355857fe5b60200260200101519050806001600160a01b031663402914f5886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156135af57600080fd5b505afa1580156135c3573d6000803e3d6000fd5b505050506040513d60208110156135d957600080fd5b5051835184908487029081106135eb57fe5b602002602001018181525050806001600160a01b0316632459f51d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d602081101561365a57600080fd5b50518351849060018588020190811061366f57fe5b602090810291909101015250600101613541565b68327cb2734119d3b7a9601e1b81565b60606000600290506060818451026001600160401b03811180156136b657600080fd5b506040519080825280602002602001820160405280156136e0578160200160208202803683370190505b5090508560005b8551811015613b535760008682815181106136fe57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156137265750865b6000836001600160a01b03166342b60b03836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561377557600080fd5b505afa158015613789573d6000803e3d6000fd5b505050506040513d602081101561379f57600080fd5b505161380f57836001600160a01b031663c4f718bf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137de57600080fd5b505afa1580156137f2573d6000803e3d6000fd5b505050506040513d602081101561380857600080fd5b5051613875565b836001600160a01b031663134ca63b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d602081101561387257600080fd5b50515b90506000846001600160a01b031663c3c7b9e9846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516352f55eed60e01b81526001600160a01b0386811660048301529151929350600092918816916352f55eed91602480820192602092909190829003018186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d602081101561396c57600080fd5b50519050801561399f5761398481611def8585614f24565b878987028151811061399257fe5b6020026020010181815250505b6000866001600160a01b031663c65bc7b1866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156139ee57600080fd5b505afa158015613a02573d6000803e3d6000fd5b505050506040513d6020811015613a1857600080fd5b50511115613b43576000866001600160a01b031663a93acac2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613a6f57600080fd5b505afa158015613a83573d6000803e3d6000fd5b505050506040513d6020811015613a9957600080fd5b50516040805163c65bc7b160e01b81526001600160a01b0388811660048301529151929350600092918a169163c65bc7b191602480820192602092909190829003018186803b158015613aeb57600080fd5b505afa158015613aff573d6000803e3d6000fd5b505050506040513d6020811015613b1557600080fd5b50519050613b238183614fbc565b898b890260010181518110613b3457fe5b60200260200101818152505050505b5050600190920191506136e79050565b5090925050505b9392505050565b6000546001600160a01b03163314613bb8576040805162461bcd60e51b815260206004820152601560248201527423b7bb32b93730b136329d103337b93134b23232b760591b604482015290519081900360640190fd5b60008054911515600160a01b0260ff60a01b19909216919091179055565b600981565b600054600160a01b900460ff1681565b6000546001600160a01b03163314613c42576040805162461bcd60e51b815260206004820152601560248201527423b7bb32b93730b136329d103337b93134b23232b760591b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000866001600160a01b03166381a612d6876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cb657600080fd5b505afa158015613cca573d6000803e3d6000fd5b505050506040513d6020811015613ce057600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0389811660048301529151929350600092918a1691638ee573ac91602480820192602092909190829003018186803b158015613d3257600080fd5b505afa158015613d46573d6000803e3d6000fd5b505050506040513d6020811015613d5c57600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0389811660048301529151929350600092918b1691638ee573ac91602480820192602092909190829003018186803b158015613dae57600080fd5b505afa158015613dc2573d6000803e3d6000fd5b505050506040513d6020811015613dd857600080fd5b50519050600080613df968327cb2734119d3b7a9601e1b611def8a88614f24565b9050613e15600a85900a611def83670de0b6b3a7640000614f24565b905060008b6001600160a01b03166342b60b038c6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d6020811015613e9057600080fd5b50518015613f1357508b6001600160a01b03166342b60b038b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613ee657600080fd5b505afa158015613efa573d6000803e3d6000fd5b505050506040513d6020811015613f1057600080fd5b50515b9050600081613f86578c6001600160a01b031663a22f23926040518163ffffffff1660e01b815260040160206040518083038186803b158015613f5557600080fd5b505afa158015613f69573d6000803e3d6000fd5b505050506040513d6020811015613f7f57600080fd5b5051613fec565b8c6001600160a01b031663df73a2676040518163ffffffff1660e01b815260040160206040518083038186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6020811015613fe957600080fd5b50515b905060008261405f578d6001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516140c5565b8d6001600160a01b03166310eb56c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561409857600080fd5b505afa1580156140ac573d6000803e3d6000fd5b505050506040513d60208110156140c257600080fd5b50515b905060008e6001600160a01b031663c7e074c38f87868660016040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b15801561413957600080fd5b505afa15801561414d573d6000803e3d6000fd5b505050506040513d602081101561416357600080fd5b8101908080519060200190929190505050905060008f6001600160a01b031663c7e074c38f88878760006040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b1580156141e857600080fd5b505afa1580156141fc573d6000803e3d6000fd5b505050506040513d602081101561421257600080fd5b505190508082116142235780614225565b815b965050505050505060008a6001600160a01b031663e124e6d28a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561427c57600080fd5b505afa158015614290573d6000803e3d6000fd5b505050506040513d60208110156142a657600080fd5b5051905060006142ba82611def8b89614f24565b90506142d985600a0a611def86600a0a84614f2490919063ffffffff16565b905060006142f7612710611def6142f08288614ee2565b8590614f24565b905060006143058383614ee2565b919e919d50909b505050505050505050505050565b60608082516001600160401b038111801561433457600080fd5b5060405190808252806020026020018201604052801561435e578160200160208202803683370190505b50905060005b835181101561168d57600084828151811061437b57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156143c957856001600160a01b0316318383815181106143b757fe5b6020026020010181815250505061445e565b806001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561441657600080fd5b505afa15801561442a573d6000803e3d6000fd5b505050506040513d602081101561444057600080fd5b5051835184908490811061445057fe5b602002602001018181525050505b600101614364565b60608060098551026001600160401b038111801561448357600080fd5b506040519080825280602002602001820160405280156144ad578160200160208202803683370190505b50905060005b85518110156148575760008060008060008060008e6001600160a01b0316634a3f088d8f8f8b815181106144e357fe5b60200260200101518f8c815181106144f757fe5b60200260200101518f8d8151811061450b57fe5b60200260200101516040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b0316815260200182151581526020019450505050506101006040518083038186803b15801561457a57600080fd5b505afa15801561458e573d6000803e3d6000fd5b505050506040513d6101008110156145a557600080fd5b50805160208201516040830151606084015160a085015160c086015160e0909601518f51959d50939b509199509750955091935090915087908a9060098b029081106145ed57fe5b602002602001018181525050858960098a026001018151811061460c57fe5b602002602001018181525050848960098a026002018151811061462b57fe5b602002602001018181525050838960098a026003018151811061464a57fe5b60200260200101818152505081614662576000614665565b60015b60ff168960098a026004018151811061467a57fe5b602002602001018181525050828960098a026005018151811061469957fe5b602002602001018181525050808960098a02600601815181106146b857fe5b6020026020010181815250505050505050505060008260098302815181106146dc57fe5b6020026020010151905060008360098402600201815181106146fa57fe5b60200260200101519050600084600985026006018151811061471857fe5b60200260200101519050600082111561484c576000808c6001600160a01b0316635c07eaab8b888151811061474957fe5b602002602001015187878d8b8151811061475f57fe5b6020026020010151886040518663ffffffff1660e01b815260040180866001600160a01b03168152602001858152602001848152602001831515815260200182815260200195505050505050604080518083038186803b1580156147c257600080fd5b505afa1580156147d6573d6000803e3d6000fd5b505050506040513d60408110156147ec57600080fd5b508051602090910151909250905081614806576000614809565b60015b60ff1687600988026007018151811061481e57fe5b6020026020010181815250508087600988026008018151811061483d57fe5b60200260200101818152505050505b5050506001016144b3565b509695505050505050565b600080846001600160a01b03166381a612d6856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156148b257600080fd5b505afa1580156148c6573d6000803e3d6000fd5b505050506040513d60208110156148dc57600080fd5b505160408051637092736960e11b81526001600160a01b03868116600483015291519293506000929188169163e124e6d291602480820192602092909190829003018186803b15801561492e57600080fd5b505afa158015614942573d6000803e3d6000fd5b505050506040513d602081101561495857600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038881166004830152915192935060009291891691638ee573ac91602480820192602092909190829003018186803b1580156149aa57600080fd5b505afa1580156149be573d6000803e3d6000fd5b505050506040513d60208110156149d457600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0388811660048301529151929350600092918a1691638ee573ac91602480820192602092909190829003018186803b158015614a2657600080fd5b505afa158015614a3a573d6000803e3d6000fd5b505050506040513d6020811015614a5057600080fd5b5051604080516352f55eed60e01b81526001600160a01b038981166004830152915192935060009283928c16916352f55eed916024808301926020929190829003018186803b158015614aa257600080fd5b505afa158015614ab6573d6000803e3d6000fd5b505050506040513d6020811015614acc57600080fd5b50516040805163c3c7b9e960e01b81526001600160a01b038b811660048301529151929350600092918d169163c3c7b9e991602480820192602092909190829003018186803b158015614b1e57600080fd5b505afa158015614b32573d6000803e3d6000fd5b505050506040513d6020811015614b4857600080fd5b505160408051634a993ee960e01b81526001600160a01b038c811660048301529151929350600092918e1691634a993ee991602480820192602092909190829003018186803b158015614b9a57600080fd5b505afa158015614bae573d6000803e3d6000fd5b505050506040513d6020811015614bc457600080fd5b505190506000818311614bd75781614bd9565b825b9050838110614bf45760009950505050505050505050613b5a565b6000614c008583614ee2565b9050614c2d87600a0a611def8a600a0a614c278e611def8f88614f2490919063ffffffff16565b90614f24565b955050505050506000896001600160a01b031663123645aa8a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614c8357600080fd5b505afa158015614c97573d6000803e3d6000fd5b505050506040513d6020811015614cad57600080fd5b50519050801561146657896001600160a01b03166372912e948a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614d0457600080fd5b505afa158015614d18573d6000803e3d6000fd5b505050506040513d6020811015614d2e57600080fd5b5051811015614d465760009650505050505050613b5a565b6000614dcb8b6001600160a01b03166372912e948c6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614d9857600080fd5b505afa158015614dac573d6000803e3d6000fd5b505050506040513d6020811015614dc257600080fd5b50518390614ee2565b9050614de7670de0b6b3a7640000611def83600a89900a614f24565b9050614e0387611def8368327cb2734119d3b7a9601e1b614f24565b905080831115614e1b579650613b5a95505050505050565b505098975050505050505050565b600080805b835181101561168d576000848281518110614e4557fe5b602002602001015190506000866001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614e9e57600080fd5b505afa158015614eb2573d6000803e3d6000fd5b505050506040513d6020811015614ec857600080fd5b50519050614ed68482614fbc565b93505050600101614e2e565b6000613b5a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615014565b600082614f3357506000611691565b82820282848281614f4057fe5b0414613b5a5760405162461bcd60e51b81526004018080602001828103825260218152602001806151116021913960400191505060405180910390fd5b6000613b5a83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506150ab565b600082820183811015613b5a576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081848411156150a35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615068578181015183820152602001615050565b50505050905090810190601f1680156150955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836150fa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315615068578181015183820152602001615050565b50600083858161510657fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a164736f6c634300060c000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101285760003560e01c8063126082cf1461012d57806312d43a5114610147578063205425681461016b5780632413c8c11461027c5780632ac0184c1461031d5780632e3e3342146103ce5780633613d5271461047f578063440f018c146105305780634bc798f81461058a5780637b906e931461059257806386d4d0f5146106535780638e83ca3214610704578063937a0be8146107c557806395082d251461087657806395a7535a1461087e5780639b0183c314610938578063ad7e549714610959578063c6f1d67614610961578063cfad57a21461097d578063d7176ca9146109a3578063d802178e146109f8578063dc383cab14610aa9578063f3535e6c14610c67578063fbdb05ca14610c9f575b600080fd5b610135610d50565b60408051918252519081900360200190f35b61014f610d56565b604080516001600160a01b039092168252519081900360200190f35b61022c6004803603608081101561018157600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156101bb57600080fd5b8201836020820111156101cd57600080fd5b803590602001918460208302840111600160201b831117156101ee57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610d65945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610268578181015183820152602001610250565b505050509050019250505060405180910390f35b61022c6004803603602081101561029257600080fd5b810190602081018135600160201b8111156102ac57600080fd5b8201836020820111156102be57600080fd5b803590602001918460208302840111600160201b831117156102df57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611473945050505050565b6101356004803603604081101561033357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035d57600080fd5b82018360208201111561036f57600080fd5b803590602001918460208302840111600160201b8311171561039057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061156c945050505050565b61022c600480360360408110156103e457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561040e57600080fd5b82018360208201111561042057600080fd5b803590602001918460208302840111600160201b8311171561044157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611697945050505050565b61022c6004803603604081101561049557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061189c945050505050565b61056c6004803603608081101561054657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611cd6565b60408051938452602084019290925282820152519081900360600190f35b61013561223b565b61022c600480360360808110156105a857600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156105e257600080fd5b8201836020820111156105f457600080fd5b803590602001918460208302840111600160201b8311171561061557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612240945050505050565b61022c6004803603604081101561066957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561069357600080fd5b8201836020820111156106a557600080fd5b803590602001918460208302840111600160201b831117156106c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a71945050505050565b61022c6004803603608081101561071a57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075457600080fd5b82018360208201111561076657600080fd5b803590602001918460208302840111600160201b8311171561078757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612b71945050505050565b61022c600480360360408110156107db57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561080557600080fd5b82018360208201111561081757600080fd5b803590602001918460208302840111600160201b8311171561083857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506134ee945050505050565b610135613683565b61022c6004803603606081101561089457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156108c757600080fd5b8201836020820111156108d957600080fd5b803590602001918460208302840111600160201b831117156108fa57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613693945050505050565b6109576004803603602081101561094e57600080fd5b50351515613b61565b005b610135613bd6565b610969613bdb565b604080519115158252519081900360200190f35b6109576004803603602081101561099357600080fd5b50356001600160a01b0316613beb565b6109df600480360360808110156109b957600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135613c64565b6040805192835260208301919091528051918290030190f35b61022c60048036036040811015610a0e57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a3857600080fd5b820183602082011115610a4a57600080fd5b803590602001918460208302840111600160201b83111715610a6b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061431a945050505050565b61022c600480360360a0811015610abf57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610af257600080fd5b820183602082011115610b0457600080fd5b803590602001918460208302840111600160201b83111715610b2557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b7457600080fd5b820183602082011115610b8657600080fd5b803590602001918460208302840111600160201b83111715610ba757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610bf657600080fd5b820183602082011115610c0857600080fd5b803590602001918460208302840111600160201b83111715610c2957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550614466945050505050565b61013560048036036060811015610c7d57600080fd5b506001600160a01b038135811691602081013582169160409091013516614862565b61013560048036036040811015610cb557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610cdf57600080fd5b820183602082011115610cf157600080fd5b803590602001918460208302840111600160201b83111715610d1257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550614e29945050505050565b61271081565b6000546001600160a01b031681565b60606000600a905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dad57600080fd5b505afa158015610dc1573d6000803e3d6000fd5b505050506040513d6020811015610dd757600080fd5b5051855190915060609084026001600160401b0381118015610df857600080fd5b50604051908082528060200260200182016040528015610e22578160200160208202803683370190505b50905060005b8651811015611466576000878281518110610e3f57fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415610e675750885b846001600160a01b03166352f55eed826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610eb457600080fd5b505afa158015610ec8573d6000803e3d6000fd5b505050506040513d6020811015610ede57600080fd5b505183518490848902908110610ef057fe5b602002602001018181525050846001600160a01b031663c3c7b9e9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4957600080fd5b505afa158015610f5d573d6000803e3d6000fd5b505050506040513d6020811015610f7357600080fd5b5051835184906001858a0201908110610f8857fe5b602002602001018181525050846001600160a01b03166372912e94826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d602081101561100b57600080fd5b5051835184906002858a020190811061102057fe5b602002602001018181525050846001600160a01b0316632c668ec1828b6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561108157600080fd5b505afa158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b5051835184906003858a02019081106110c057fe5b602002602001018181525050846001600160a01b031663ab2f3ad4826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d602081101561114357600080fd5b5051835184906004858a020190811061115857fe5b602002602001018181525050846001600160a01b03166381a612d6826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b5051835184906005858a02019081106111f057fe5b602002602001018181525050846001600160a01b031663e124e6d2826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561124957600080fd5b505afa15801561125d573d6000803e3d6000fd5b505050506040513d602081101561127357600080fd5b5051835184906006858a020190811061128857fe5b602002602001018181525050846001600160a01b031663f07456ce826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112e157600080fd5b505afa1580156112f5573d6000803e3d6000fd5b505050506040513d602081101561130b57600080fd5b5051835184906007858a020190811061132057fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918716926356c8c2c192604480840193829003018186803b15801561137a57600080fd5b505afa15801561138e573d6000803e3d6000fd5b505050506040513d60208110156113a457600080fd5b5051835184906008858a02019081106113b957fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918716926356c8c2c192604480840193829003018186803b15801561141357600080fd5b505afa158015611427573d6000803e3d6000fd5b505050506040513d602081101561143d57600080fd5b5051835184906009858a020190811061145257fe5b602090810291909101015250600101610e28565b5098975050505050505050565b60608082516001600160401b038111801561148d57600080fd5b506040519080825280602002602001820160405280156114b7578160200160208202803683370190505b50905060005b83518110156115655760008482815181106114d457fe5b60200260200101519050806001600160a01b031663817b1cd26040518163ffffffff1660e01b815260040160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d602081101561154157600080fd5b5051835184908490811061155157fe5b6020908102919091010152506001016114bd565b5092915050565b600080836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d60208110156115d257600080fd5b5051905060005b835181101561168d5760008482815181106115f057fe5b602002602001015190506000866001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d602081101561167357600080fd5b505190506116818482614ee2565b935050506001016115d9565b5090505b92915050565b60606000600290506060818451026001600160401b03811180156116ba57600080fd5b506040519080825280602002602001820160405280156116e4578160200160208202803683370190505b50905060005b845181101561189357600085828151811061170157fe5b6020026020010151905060006001600160a01b0316816001600160a01b0316141561177057866001600160a01b031631838584028151811061173f57fe5b6020026020010181815250506000838584026001018151811061175e57fe5b6020026020010181815250505061188b565b806001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d60208110156117e757600080fd5b5051835184908487029081106117f957fe5b602002602001018181525050806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d602081101561186857600080fd5b50518351849060018588020190811061187d57fe5b602002602001018181525050505b6001016116ea565b50949350505050565b60606000600690506060818451026001600160401b03811180156118bf57600080fd5b506040519080825280602002602001820160405280156118e9578160200160208202803683370190505b50905060005b845181101561189357600085828151811061190657fe5b602090810291909101810151604080516317e1d38560e11b81526001600160a01b0380841660048301526001602483018190526044830152600060648301529151929450908a1692632fc3a70a92608480840193829003018186803b15801561196e57600080fd5b505afa158015611982573d6000803e3d6000fd5b505050506040513d602081101561199857600080fd5b5051835184908487029081106119aa57fe5b602090810291909101810191909152604080516317e1d38560e11b81526001600160a01b0384811660048301526000602483018190526001604484015260648301529151918a1692632fc3a70a92608480840193829003018186803b158015611a1257600080fd5b505afa158015611a26573d6000803e3d6000fd5b505050506040513d6020811015611a3c57600080fd5b505183518490600185880201908110611a5157fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918a16926356c8c2c192604480840193829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b505183518490600285880201908110611aea57fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918a16926356c8c2c192604480840193829003018186803b158015611b4457600080fd5b505afa158015611b58573d6000803e3d6000fd5b505050506040513d6020811015611b6e57600080fd5b505183518490600385880201908110611b8357fe5b602002602001018181525050866001600160a01b0316636ce8a44b826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b5051611c13576000611c16565b60015b60ff168385840260040181518110611c2a57fe5b602002602001018181525050866001600160a01b03166348cac277826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d6020811015611cad57600080fd5b505183518490600585880201908110611cc257fe5b6020908102919091010152506001016118ef565b600080600080876001600160a01b03166381a612d6886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d6020811015611d5357600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038a811660048301529151929350600092918b1691638ee573ac91602480820192602092909190829003018186803b158015611da557600080fd5b505afa158015611db9573d6000803e3d6000fd5b505050506040513d6020811015611dcf57600080fd5b505190506000611df568327cb2734119d3b7a9601e1b611def8986614f24565b90614f7d565b9050611e11600a83900a611def83670de0b6b3a7640000614f24565b905060008a6001600160a01b03166342b60b038b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d6020811015611e8c57600080fd5b50518015611f0f57508a6001600160a01b03166342b60b038a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ee257600080fd5b505afa158015611ef6573d6000803e3d6000fd5b505050506040513d6020811015611f0c57600080fd5b50515b9050600081611f82578b6001600160a01b031663a22f23926040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d6020811015611f7b57600080fd5b5051611fe8565b8b6001600160a01b031663df73a2676040518163ffffffff1660e01b815260040160206040518083038186803b158015611fbb57600080fd5b505afa158015611fcf573d6000803e3d6000fd5b505050506040513d6020811015611fe557600080fd5b50515b905060008261205b578c6001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561202a57600080fd5b505afa15801561203e573d6000803e3d6000fd5b505050506040513d602081101561205457600080fd5b50516120c1565b8c6001600160a01b03166310eb56c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561209457600080fd5b505afa1580156120a8573d6000803e3d6000fd5b505050506040513d60208110156120be57600080fd5b50515b905060008d6001600160a01b031663c7e074c38e87868660016040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d602081101561215f57600080fd5b8101908080519060200190929190505050905060008e6001600160a01b031663c7e074c38e88878760006040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b1580156121e457600080fd5b505afa1580156121f8573d6000803e3d6000fd5b505050506040513d602081101561220e57600080fd5b5051905060008183116122215781612223565b825b9b509199509750505050505050509450945094915050565b601281565b60606000600c905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228857600080fd5b505afa15801561229c573d6000803e3d6000fd5b505050506040513d60208110156122b257600080fd5b5051855190915060609084026001600160401b03811180156122d357600080fd5b506040519080825280602002602001820160405280156122fd578160200160208202803683370190505b50905060005b865181101561146657600087828151811061231a57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156123425750885b846001600160a01b03166352f55eed826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051835184908489029081106123cb57fe5b602002602001018181525050846001600160a01b031663c3c7b9e9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561242457600080fd5b505afa158015612438573d6000803e3d6000fd5b505050506040513d602081101561244e57600080fd5b5051835184906001858a020190811061246357fe5b602002602001018181525050846001600160a01b03166372912e94826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124bc57600080fd5b505afa1580156124d0573d6000803e3d6000fd5b505050506040513d60208110156124e657600080fd5b5051835184906002858a02019081106124fb57fe5b602002602001018181525050846001600160a01b0316632c668ec1828b6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b5051835184906003858a020190811061259b57fe5b602002602001018181525050846001600160a01b031663ab2f3ad4826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156125f457600080fd5b505afa158015612608573d6000803e3d6000fd5b505050506040513d602081101561261e57600080fd5b5051835184906004858a020190811061263357fe5b602002602001018181525050846001600160a01b0316634a993ee9826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561268c57600080fd5b505afa1580156126a0573d6000803e3d6000fd5b505050506040513d60208110156126b657600080fd5b5051835184906005858a02019081106126cb57fe5b602002602001018181525050846001600160a01b031663123645aa826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561272457600080fd5b505afa158015612738573d6000803e3d6000fd5b505050506040513d602081101561274e57600080fd5b5051835184906006858a020190811061276357fe5b602002602001018181525050846001600160a01b03166381a612d6826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051835184906007858a02019081106127fb57fe5b602002602001018181525050846001600160a01b031663e124e6d2826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561285457600080fd5b505afa158015612868573d6000803e3d6000fd5b505050506040513d602081101561287e57600080fd5b5051835184906008858a020190811061289357fe5b602002602001018181525050846001600160a01b031663f07456ce826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156128ec57600080fd5b505afa158015612900573d6000803e3d6000fd5b505050506040513d602081101561291657600080fd5b5051835184906009858a020190811061292b57fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600060248301529151918716926356c8c2c192604480840193829003018186803b15801561298557600080fd5b505afa158015612999573d6000803e3d6000fd5b505050506040513d60208110156129af57600080fd5b505183518490600a858a02019081106129c457fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038481166004830152600160248301529151918716926356c8c2c192604480840193829003018186803b158015612a1e57600080fd5b505afa158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505183518490600b858a0201908110612a5d57fe5b602090810291909101015250600101612303565b60608082516001600160401b0381118015612a8b57600080fd5b50604051908082528060200260200182016040528015612ab5578160200160208202803683370190505b50905060005b835181101561168d57846001600160a01b0316631ce9cb8f858381518110612adf57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b50518251839083908110612b5e57fe5b6020908102919091010152600101612abb565b60606000600e905060008690506000816001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bb957600080fd5b505afa158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5051855190915060609084026001600160401b0381118015612c0457600080fd5b50604051908082528060200260200182016040528015612c2e578160200160208202803683370190505b50905060005b8651811015611466576000878281518110612c4b57fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415612c735750885b60008054600160a01b900460ff16612c8c576000612d06565b856001600160a01b0316639698d25a836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d6020811015612d0357600080fd5b50515b9050856001600160a01b03166352f55eed836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d5557600080fd5b505afa158015612d69573d6000803e3d6000fd5b505050506040513d6020811015612d7f57600080fd5b505184518590858a02908110612d9157fe5b602002602001018181525050856001600160a01b031663c3c7b9e9836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dea57600080fd5b505afa158015612dfe573d6000803e3d6000fd5b505050506040513d6020811015612e1457600080fd5b5051845185906001868b0201908110612e2957fe5b602002602001018181525050856001600160a01b03166372912e94836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612e8257600080fd5b505afa158015612e96573d6000803e3d6000fd5b505050506040513d6020811015612eac57600080fd5b5051845185906002868b0201908110612ec157fe5b602002602001018181525050856001600160a01b0316632c668ec1838c6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b158015612f2257600080fd5b505afa158015612f36573d6000803e3d6000fd5b505050506040513d6020811015612f4c57600080fd5b5051845185906003868b0201908110612f6157fe5b602002602001018181525050856001600160a01b031663ab2f3ad4836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612fba57600080fd5b505afa158015612fce573d6000803e3d6000fd5b505050506040513d6020811015612fe457600080fd5b5051845185906004868b0201908110612ff957fe5b602002602001018181525050856001600160a01b0316634a993ee9836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561305257600080fd5b505afa158015613066573d6000803e3d6000fd5b505050506040513d602081101561307c57600080fd5b5051845185906005868b020190811061309157fe5b602002602001018181525050856001600160a01b031663123645aa836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156130ea57600080fd5b505afa1580156130fe573d6000803e3d6000fd5b505050506040513d602081101561311457600080fd5b5051845185906006868b020190811061312957fe5b602002602001018181525050856001600160a01b0316638a78daa8836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318257600080fd5b505afa158015613196573d6000803e3d6000fd5b505050506040513d60208110156131ac57600080fd5b5051845185906007868b02019081106131c157fe5b6020026020010181815250508084888502600801815181106131df57fe5b602002602001018181525050856001600160a01b03166381a612d6836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561323857600080fd5b505afa15801561324c573d6000803e3d6000fd5b505050506040513d602081101561326257600080fd5b5051845185906009868b020190811061327757fe5b602002602001018181525050856001600160a01b031663e124e6d2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d60208110156132fa57600080fd5b505184518590600a868b020190811061330f57fe5b602002602001018181525050856001600160a01b031663f07456ce836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561336857600080fd5b505afa15801561337c573d6000803e3d6000fd5b505050506040513d602081101561339257600080fd5b505184518590600b868b02019081106133a757fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038581166004830152600060248301529151918816926356c8c2c192604480840193829003018186803b15801561340157600080fd5b505afa158015613415573d6000803e3d6000fd5b505050506040513d602081101561342b57600080fd5b505184518590600c868b020190811061344057fe5b602090810291909101810191909152604080516356c8c2c160e01b81526001600160a01b038581166004830152600160248301529151918816926356c8c2c192604480840193829003018186803b15801561349a57600080fd5b505afa1580156134ae573d6000803e3d6000fd5b505050506040513d60208110156134c457600080fd5b505184518590600d868b02019081106134d957fe5b60209081029190910101525050600101612c34565b60606000600290506060818451026001600160401b038111801561351157600080fd5b5060405190808252806020026020018201604052801561353b578160200160208202803683370190505b50905060005b845181101561189357600085828151811061355857fe5b60200260200101519050806001600160a01b031663402914f5886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156135af57600080fd5b505afa1580156135c3573d6000803e3d6000fd5b505050506040513d60208110156135d957600080fd5b5051835184908487029081106135eb57fe5b602002602001018181525050806001600160a01b0316632459f51d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d602081101561365a57600080fd5b50518351849060018588020190811061366f57fe5b602090810291909101015250600101613541565b68327cb2734119d3b7a9601e1b81565b60606000600290506060818451026001600160401b03811180156136b657600080fd5b506040519080825280602002602001820160405280156136e0578160200160208202803683370190505b5090508560005b8551811015613b535760008682815181106136fe57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156137265750865b6000836001600160a01b03166342b60b03836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561377557600080fd5b505afa158015613789573d6000803e3d6000fd5b505050506040513d602081101561379f57600080fd5b505161380f57836001600160a01b031663c4f718bf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137de57600080fd5b505afa1580156137f2573d6000803e3d6000fd5b505050506040513d602081101561380857600080fd5b5051613875565b836001600160a01b031663134ca63b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561384857600080fd5b505afa15801561385c573d6000803e3d6000fd5b505050506040513d602081101561387257600080fd5b50515b90506000846001600160a01b031663c3c7b9e9846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516352f55eed60e01b81526001600160a01b0386811660048301529151929350600092918816916352f55eed91602480820192602092909190829003018186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d602081101561396c57600080fd5b50519050801561399f5761398481611def8585614f24565b878987028151811061399257fe5b6020026020010181815250505b6000866001600160a01b031663c65bc7b1866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156139ee57600080fd5b505afa158015613a02573d6000803e3d6000fd5b505050506040513d6020811015613a1857600080fd5b50511115613b43576000866001600160a01b031663a93acac2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613a6f57600080fd5b505afa158015613a83573d6000803e3d6000fd5b505050506040513d6020811015613a9957600080fd5b50516040805163c65bc7b160e01b81526001600160a01b0388811660048301529151929350600092918a169163c65bc7b191602480820192602092909190829003018186803b158015613aeb57600080fd5b505afa158015613aff573d6000803e3d6000fd5b505050506040513d6020811015613b1557600080fd5b50519050613b238183614fbc565b898b890260010181518110613b3457fe5b60200260200101818152505050505b5050600190920191506136e79050565b5090925050505b9392505050565b6000546001600160a01b03163314613bb8576040805162461bcd60e51b815260206004820152601560248201527423b7bb32b93730b136329d103337b93134b23232b760591b604482015290519081900360640190fd5b60008054911515600160a01b0260ff60a01b19909216919091179055565b600981565b600054600160a01b900460ff1681565b6000546001600160a01b03163314613c42576040805162461bcd60e51b815260206004820152601560248201527423b7bb32b93730b136329d103337b93134b23232b760591b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000866001600160a01b03166381a612d6876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cb657600080fd5b505afa158015613cca573d6000803e3d6000fd5b505050506040513d6020811015613ce057600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0389811660048301529151929350600092918a1691638ee573ac91602480820192602092909190829003018186803b158015613d3257600080fd5b505afa158015613d46573d6000803e3d6000fd5b505050506040513d6020811015613d5c57600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0389811660048301529151929350600092918b1691638ee573ac91602480820192602092909190829003018186803b158015613dae57600080fd5b505afa158015613dc2573d6000803e3d6000fd5b505050506040513d6020811015613dd857600080fd5b50519050600080613df968327cb2734119d3b7a9601e1b611def8a88614f24565b9050613e15600a85900a611def83670de0b6b3a7640000614f24565b905060008b6001600160a01b03166342b60b038c6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d6020811015613e9057600080fd5b50518015613f1357508b6001600160a01b03166342b60b038b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613ee657600080fd5b505afa158015613efa573d6000803e3d6000fd5b505050506040513d6020811015613f1057600080fd5b50515b9050600081613f86578c6001600160a01b031663a22f23926040518163ffffffff1660e01b815260040160206040518083038186803b158015613f5557600080fd5b505afa158015613f69573d6000803e3d6000fd5b505050506040513d6020811015613f7f57600080fd5b5051613fec565b8c6001600160a01b031663df73a2676040518163ffffffff1660e01b815260040160206040518083038186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6020811015613fe957600080fd5b50515b905060008261405f578d6001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516140c5565b8d6001600160a01b03166310eb56c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561409857600080fd5b505afa1580156140ac573d6000803e3d6000fd5b505050506040513d60208110156140c257600080fd5b50515b905060008e6001600160a01b031663c7e074c38f87868660016040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b15801561413957600080fd5b505afa15801561414d573d6000803e3d6000fd5b505050506040513d602081101561416357600080fd5b8101908080519060200190929190505050905060008f6001600160a01b031663c7e074c38f88878760006040518663ffffffff1660e01b815260040180866001600160a01b0316815260200185815260200184815260200183815260200182151581526020019550505050505060206040518083038186803b1580156141e857600080fd5b505afa1580156141fc573d6000803e3d6000fd5b505050506040513d602081101561421257600080fd5b505190508082116142235780614225565b815b965050505050505060008a6001600160a01b031663e124e6d28a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561427c57600080fd5b505afa158015614290573d6000803e3d6000fd5b505050506040513d60208110156142a657600080fd5b5051905060006142ba82611def8b89614f24565b90506142d985600a0a611def86600a0a84614f2490919063ffffffff16565b905060006142f7612710611def6142f08288614ee2565b8590614f24565b905060006143058383614ee2565b919e919d50909b505050505050505050505050565b60608082516001600160401b038111801561433457600080fd5b5060405190808252806020026020018201604052801561435e578160200160208202803683370190505b50905060005b835181101561168d57600084828151811061437b57fe5b6020026020010151905060006001600160a01b0316816001600160a01b031614156143c957856001600160a01b0316318383815181106143b757fe5b6020026020010181815250505061445e565b806001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561441657600080fd5b505afa15801561442a573d6000803e3d6000fd5b505050506040513d602081101561444057600080fd5b5051835184908490811061445057fe5b602002602001018181525050505b600101614364565b60608060098551026001600160401b038111801561448357600080fd5b506040519080825280602002602001820160405280156144ad578160200160208202803683370190505b50905060005b85518110156148575760008060008060008060008e6001600160a01b0316634a3f088d8f8f8b815181106144e357fe5b60200260200101518f8c815181106144f757fe5b60200260200101518f8d8151811061450b57fe5b60200260200101516040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b0316815260200182151581526020019450505050506101006040518083038186803b15801561457a57600080fd5b505afa15801561458e573d6000803e3d6000fd5b505050506040513d6101008110156145a557600080fd5b50805160208201516040830151606084015160a085015160c086015160e0909601518f51959d50939b509199509750955091935090915087908a9060098b029081106145ed57fe5b602002602001018181525050858960098a026001018151811061460c57fe5b602002602001018181525050848960098a026002018151811061462b57fe5b602002602001018181525050838960098a026003018151811061464a57fe5b60200260200101818152505081614662576000614665565b60015b60ff168960098a026004018151811061467a57fe5b602002602001018181525050828960098a026005018151811061469957fe5b602002602001018181525050808960098a02600601815181106146b857fe5b6020026020010181815250505050505050505060008260098302815181106146dc57fe5b6020026020010151905060008360098402600201815181106146fa57fe5b60200260200101519050600084600985026006018151811061471857fe5b60200260200101519050600082111561484c576000808c6001600160a01b0316635c07eaab8b888151811061474957fe5b602002602001015187878d8b8151811061475f57fe5b6020026020010151886040518663ffffffff1660e01b815260040180866001600160a01b03168152602001858152602001848152602001831515815260200182815260200195505050505050604080518083038186803b1580156147c257600080fd5b505afa1580156147d6573d6000803e3d6000fd5b505050506040513d60408110156147ec57600080fd5b508051602090910151909250905081614806576000614809565b60015b60ff1687600988026007018151811061481e57fe5b6020026020010181815250508087600988026008018151811061483d57fe5b60200260200101818152505050505b5050506001016144b3565b509695505050505050565b600080846001600160a01b03166381a612d6856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156148b257600080fd5b505afa1580156148c6573d6000803e3d6000fd5b505050506040513d60208110156148dc57600080fd5b505160408051637092736960e11b81526001600160a01b03868116600483015291519293506000929188169163e124e6d291602480820192602092909190829003018186803b15801561492e57600080fd5b505afa158015614942573d6000803e3d6000fd5b505050506040513d602081101561495857600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038881166004830152915192935060009291891691638ee573ac91602480820192602092909190829003018186803b1580156149aa57600080fd5b505afa1580156149be573d6000803e3d6000fd5b505050506040513d60208110156149d457600080fd5b5051604080516323b95ceb60e21b81526001600160a01b0388811660048301529151929350600092918a1691638ee573ac91602480820192602092909190829003018186803b158015614a2657600080fd5b505afa158015614a3a573d6000803e3d6000fd5b505050506040513d6020811015614a5057600080fd5b5051604080516352f55eed60e01b81526001600160a01b038981166004830152915192935060009283928c16916352f55eed916024808301926020929190829003018186803b158015614aa257600080fd5b505afa158015614ab6573d6000803e3d6000fd5b505050506040513d6020811015614acc57600080fd5b50516040805163c3c7b9e960e01b81526001600160a01b038b811660048301529151929350600092918d169163c3c7b9e991602480820192602092909190829003018186803b158015614b1e57600080fd5b505afa158015614b32573d6000803e3d6000fd5b505050506040513d6020811015614b4857600080fd5b505160408051634a993ee960e01b81526001600160a01b038c811660048301529151929350600092918e1691634a993ee991602480820192602092909190829003018186803b158015614b9a57600080fd5b505afa158015614bae573d6000803e3d6000fd5b505050506040513d6020811015614bc457600080fd5b505190506000818311614bd75781614bd9565b825b9050838110614bf45760009950505050505050505050613b5a565b6000614c008583614ee2565b9050614c2d87600a0a611def8a600a0a614c278e611def8f88614f2490919063ffffffff16565b90614f24565b955050505050506000896001600160a01b031663123645aa8a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614c8357600080fd5b505afa158015614c97573d6000803e3d6000fd5b505050506040513d6020811015614cad57600080fd5b50519050801561146657896001600160a01b03166372912e948a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614d0457600080fd5b505afa158015614d18573d6000803e3d6000fd5b505050506040513d6020811015614d2e57600080fd5b5051811015614d465760009650505050505050613b5a565b6000614dcb8b6001600160a01b03166372912e948c6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614d9857600080fd5b505afa158015614dac573d6000803e3d6000fd5b505050506040513d6020811015614dc257600080fd5b50518390614ee2565b9050614de7670de0b6b3a7640000611def83600a89900a614f24565b9050614e0387611def8368327cb2734119d3b7a9601e1b614f24565b905080831115614e1b579650613b5a95505050505050565b505098975050505050505050565b600080805b835181101561168d576000848281518110614e4557fe5b602002602001015190506000866001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015614e9e57600080fd5b505afa158015614eb2573d6000803e3d6000fd5b505050506040513d6020811015614ec857600080fd5b50519050614ed68482614fbc565b93505050600101614e2e565b6000613b5a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615014565b600082614f3357506000611691565b82820282848281614f4057fe5b0414613b5a5760405162461bcd60e51b81526004018080602001828103825260218152602001806151116021913960400191505060405180910390fd5b6000613b5a83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506150ab565b600082820183811015613b5a576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600081848411156150a35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615068578181015183820152602001615050565b50505050905090810190601f1680156150955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836150fa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315615068578181015183820152602001615050565b50600083858161510657fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a164736f6c634300060c000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.