Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 811 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake Sushi Fr... | 20819555 | 103 days ago | IN | 0 ETH | 0.00229057 | ||||
Unstake Sushi Fr... | 20819535 | 103 days ago | IN | 0 ETH | 0.00276833 | ||||
Batch | 19980675 | 220 days ago | IN | 0 ETH | 0.00124888 | ||||
Withdraw Token B... | 19945584 | 225 days ago | IN | 0 ETH | 0.00013983 | ||||
Batch | 19480390 | 290 days ago | IN | 0 ETH | 0.00611991 | ||||
Unstake Sushi Fr... | 19228176 | 326 days ago | IN | 0 ETH | 0.00368589 | ||||
Unstake Sushi Fr... | 19103383 | 343 days ago | IN | 0 ETH | 0.00130416 | ||||
Batch | 19040230 | 352 days ago | IN | 0 ETH | 0.00404693 | ||||
Stake Sushi To B... | 18277803 | 459 days ago | IN | 0 ETH | 0.00128472 | ||||
Batch | 18241755 | 464 days ago | IN | 0 ETH | 0.00222112 | ||||
Unstake Sushi Fr... | 18070342 | 488 days ago | IN | 0 ETH | 0.00177649 | ||||
Batch | 17609734 | 553 days ago | IN | 0 ETH | 0.00212283 | ||||
Unstake Sushi Fr... | 17580012 | 557 days ago | IN | 0 ETH | 0.00301098 | ||||
Stake Sushi To B... | 17578788 | 557 days ago | IN | 0 ETH | 0.0037749 | ||||
Unstake Sushi Fr... | 17571621 | 558 days ago | IN | 0 ETH | 0.0029957 | ||||
Batch | 17556905 | 560 days ago | IN | 0 ETH | 0.00198304 | ||||
Stake Sushi To B... | 17267104 | 601 days ago | IN | 0 ETH | 0.00747099 | ||||
Unstake Sushi Fr... | 17244000 | 604 days ago | IN | 0 ETH | 0.00595948 | ||||
Unstake Sushi Fr... | 17045816 | 632 days ago | IN | 0 ETH | 0.00334472 | ||||
Batch | 17037735 | 633 days ago | IN | 0 ETH | 0.00676841 | ||||
Batch | 16895092 | 653 days ago | IN | 0 ETH | 0.00201791 | ||||
Unstake Sushi Fr... | 16891722 | 654 days ago | IN | 0 ETH | 0.00461156 | ||||
Unstake Sushi Fr... | 16752282 | 673 days ago | IN | 0 ETH | 0.00792796 | ||||
Batch | 16738657 | 675 days ago | IN | 0 ETH | 0.00289817 | ||||
Unstake Sushi Fr... | 16662759 | 686 days ago | IN | 0 ETH | 0.00256187 |
Latest 14 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13265900 | 1203 days ago | 0.015 ETH | ||||
13060980 | 1234 days ago | 0.5 ETH | ||||
13059305 | 1234 days ago | 0.1 ETH | ||||
13058554 | 1235 days ago | 0.02 ETH | ||||
12890478 | 1261 days ago | 0.00913 ETH | ||||
12851055 | 1267 days ago | 0.02 ETH | ||||
12850906 | 1267 days ago | 2.6 ETH | ||||
12849378 | 1267 days ago | 0.60233344 ETH | ||||
12849369 | 1267 days ago | 0.01337 ETH | ||||
12847775 | 1267 days ago | 0.001 ETH | ||||
12847359 | 1268 days ago | 0.01337 ETH | ||||
12847303 | 1268 days ago | 0.01337 ETH | ||||
12847292 | 1268 days ago | 0.01337 ETH | ||||
12814367 | 1273 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
InariV1
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-12 */ // SPDX-License-Identifier: GPL-2.0 /* ▄▄█ ▄ ██ █▄▄▄▄ ▄█ ██ █ █ █ █ ▄▀ ██ ██ ██ █ █▄▄█ █▀▀▌ ██ ▐█ █ █ █ █ █ █ █ ▐█ ▐ █ █ █ █ █ ▐ █ ██ █ ▀ ▀ */ /// 🦊🌾 Special thanks to Keno / Boring / Gonpachi / Karbon for review and continued inspiration. pragma solidity 0.7.6; pragma experimental ABIEncoderV2; /// @notice Minimal erc20 interface (with EIP 2612) to aid other interfaces. interface IERC20 { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } /// @notice Interface for Dai Stablecoin (DAI) `permit()` primitive. interface IDaiPermit { function permit( address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) external; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] /// License-Identifier: MIT /// @dev Adapted for Inari. library BoringERC20 { bytes4 private constant SIG_BALANCE_OF = 0x70a08231; // balanceOf(address) bytes4 private constant SIG_APPROVE = 0x095ea7b3; // approve(address,uint256) bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) /// @notice Provides a gas-optimized balance check on this contract to avoid a redundant extcodesize check in addition to the returndatasize check. /// @param token The address of the ERC-20 token. /// @return amount The token amount. function safeBalanceOfSelf(IERC20 token) internal view returns (uint256 amount) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_BALANCE_OF, address(this))); require(success && data.length >= 32, "BoringERC20: BalanceOf failed"); amount = abi.decode(data, (uint256)); } /// @notice Provides a safe ERC20.approve version for different ERC-20 implementations. /// @param token The address of the ERC-20 token. /// @param to The address of the user to grant spending right. /// @param amount The token amount to grant spending right over. function safeApprove( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_APPROVE, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Approve failed"); } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } } // File @boringcrypto/boring-solidity/contracts/[email protected] /// License-Identifier: MIT /// @dev Adapted for Inari. contract BaseBoringBatchable { /// @dev Helper function to extract a useful revert message from a failed call. /// If the returned data is malformed or not correctly abi encoded then this call can fail itself. function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } /// @notice Allows batched call to self (this contract). /// @param calls An array of inputs for each call. /// @param revertOnFail If True then reverts after a failed call and stops doing further calls. function batch(bytes[] calldata calls, bool revertOnFail) external payable { for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(calls[i]); if (!success && revertOnFail) { revert(_getRevertMsg(result)); } } } } /// @notice Extends `BoringBatchable` with DAI `permit()`. contract BoringBatchableWithDai is BaseBoringBatchable { /// @notice Call wrapper that performs `ERC20.permit` using EIP 2612 primitive. /// Lookup `IDaiPermit.permit`. function permitDai( IDaiPermit token, address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) public { token.permit(holder, spender, nonce, expiry, allowed, v, r, s); } /// @notice Call wrapper that performs `ERC20.permit` on `token`. /// Lookup `IERC20.permit`. function permitToken( IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public { token.permit(from, to, amount, deadline, v, r, s); } } /// @notice Babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method). library Babylonian { // computes square roots using the babylonian method // credit for this implementation goes to // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687 function sqrt(uint256 x) internal pure returns (uint256) { if (x == 0) return 0; // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2); // however that code costs significantly more gas uint256 xx = x; uint256 r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x8) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; // Seven iterations should be enough uint256 r1 = x / r; return (r < r1 ? r : r1); } } /// @notice Interface for SushiSwap. interface ISushiSwap { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external pure returns (address); function token1() external pure returns (address); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } /// @notice Interface for wrapped ether v9. interface IWETH { function deposit() external payable; } /// @notice Library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math). library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } } // Copyright (C) 2020-2021 zapper // License-Identifier: GPL-2.0 /// @notice SushiSwap liquidity zaps based on awesomeness from zapper.fi (0xcff6eF0B9916682B37D80c19cFF8949bc1886bC2/0x5abfbE56553a5d794330EACCF556Ca1d2a55647C). contract SushiZap { using SafeMath for uint256; using BoringERC20 for IERC20; address public governor; // SushiZap governance address for approving `_swapTarget` inputs address constant sushiSwapFactory = 0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac; // SushiSwap factory contract address constant wETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // ETH wrapper contract v9 ISushiSwap constant sushiSwapRouter = ISushiSwap(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // SushiSwap router contract uint256 constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; // ~ placeholder for swap deadline bytes32 constant pairCodeHash = 0xe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303; // SushiSwap pair code hash /// @dev swapTarget => approval status. mapping(address => bool) public approvedTargets; event ZapIn(address sender, address pool, uint256 tokensRec); constructor() { governor = msg.sender; approvedTargets[wETH] = true; } /// @dev This function whitelists `_swapTarget`s - cf. `Sushiswap_ZapIn_V4` (C) 2021 zapper. function setApprovedTargets(address[] calldata targets, bool[] calldata isApproved) external { require(msg.sender == governor, '!governor'); require(targets.length == isApproved.length, 'Invalid Input length'); for (uint256 i = 0; i < targets.length; i++) { approvedTargets[targets[i]] = isApproved[i]; } } /// @dev This function transfers `governor` role. function transferGovernance(address account) external { require(msg.sender == governor, '!governor'); governor = account; } /** @notice This function is used to invest in given SushiSwap pair through ETH/ERC20 Tokens. @param to Address to receive LP tokens. @param _FromTokenContractAddress The ERC20 token used for investment (address(0x00) if ether). @param _pairAddress The SushiSwap pair address. @param _amount The amount of fromToken to invest. @param _minPoolTokens Reverts if less tokens received than this. @param _swapTarget Excecution target for the first swap. @param swapData Dex quote data. @return Amount of LP bought. */ function zapIn( address to, address _FromTokenContractAddress, address _pairAddress, uint256 _amount, uint256 _minPoolTokens, address _swapTarget, bytes calldata swapData ) external payable returns (uint256) { uint256 toInvest = _pullTokens( _FromTokenContractAddress, _amount ); uint256 LPBought = _performZapIn( _FromTokenContractAddress, _pairAddress, toInvest, _swapTarget, swapData ); require(LPBought >= _minPoolTokens, 'ERR: High Slippage'); emit ZapIn(to, _pairAddress, LPBought); IERC20(_pairAddress).safeTransfer(to, LPBought); return LPBought; } function _getPairTokens(address _pairAddress) private pure returns (address token0, address token1) { ISushiSwap sushiPair = ISushiSwap(_pairAddress); token0 = sushiPair.token0(); token1 = sushiPair.token1(); } function _pullTokens(address token, uint256 amount) internal returns (uint256 value) { if (token == address(0)) { require(msg.value > 0, 'No eth sent'); return msg.value; } require(amount > 0, 'Invalid token amount'); require(msg.value == 0, 'Eth sent with token'); // transfer token IERC20(token).safeTransferFrom(msg.sender, address(this), amount); return amount; } function _performZapIn( address _FromTokenContractAddress, address _pairAddress, uint256 _amount, address _swapTarget, bytes memory swapData ) internal returns (uint256) { uint256 intermediateAmt; address intermediateToken; ( address _ToSushipoolToken0, address _ToSushipoolToken1 ) = _getPairTokens(_pairAddress); if ( _FromTokenContractAddress != _ToSushipoolToken0 && _FromTokenContractAddress != _ToSushipoolToken1 ) { // swap to intermediate (intermediateAmt, intermediateToken) = _fillQuote( _FromTokenContractAddress, _pairAddress, _amount, _swapTarget, swapData ); } else { intermediateToken = _FromTokenContractAddress; intermediateAmt = _amount; } // divide intermediate into appropriate amount to add liquidity (uint256 token0Bought, uint256 token1Bought) = _swapIntermediate( intermediateToken, _ToSushipoolToken0, _ToSushipoolToken1, intermediateAmt ); return _sushiDeposit( _ToSushipoolToken0, _ToSushipoolToken1, token0Bought, token1Bought ); } function _sushiDeposit( address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 token0Bought, uint256 token1Bought ) private returns (uint256) { IERC20(_ToUnipoolToken0).safeApprove(address(sushiSwapRouter), 0); IERC20(_ToUnipoolToken1).safeApprove(address(sushiSwapRouter), 0); IERC20(_ToUnipoolToken0).safeApprove( address(sushiSwapRouter), token0Bought ); IERC20(_ToUnipoolToken1).safeApprove( address(sushiSwapRouter), token1Bought ); (uint256 amountA, uint256 amountB, uint256 LP) = sushiSwapRouter .addLiquidity( _ToUnipoolToken0, _ToUnipoolToken1, token0Bought, token1Bought, 1, 1, address(this), deadline ); // returning residue in token0, if any if (token0Bought.sub(amountA) > 0) { IERC20(_ToUnipoolToken0).safeTransfer( msg.sender, token0Bought.sub(amountA) ); } // returning residue in token1, if any if (token1Bought.sub(amountB) > 0) { IERC20(_ToUnipoolToken1).safeTransfer( msg.sender, token1Bought.sub(amountB) ); } return LP; } function _fillQuote( address _fromTokenAddress, address _pairAddress, uint256 _amount, address _swapTarget, bytes memory swapCallData ) private returns (uint256 amountBought, address intermediateToken) { uint256 valueToSend; if (_fromTokenAddress == address(0)) { valueToSend = _amount; } else { IERC20 fromToken = IERC20(_fromTokenAddress); fromToken.safeApprove(address(_swapTarget), 0); fromToken.safeApprove(address(_swapTarget), _amount); } (address _token0, address _token1) = _getPairTokens(_pairAddress); IERC20 token0 = IERC20(_token0); IERC20 token1 = IERC20(_token1); uint256 initialBalance0 = token0.safeBalanceOfSelf(); uint256 initialBalance1 = token1.safeBalanceOfSelf(); require(approvedTargets[_swapTarget], 'Target not Authorized'); (bool success, ) = _swapTarget.call{value: valueToSend}(swapCallData); require(success, 'Error Swapping Tokens 1'); uint256 finalBalance0 = token0.safeBalanceOfSelf().sub( initialBalance0 ); uint256 finalBalance1 = token1.safeBalanceOfSelf().sub( initialBalance1 ); if (finalBalance0 > finalBalance1) { amountBought = finalBalance0; intermediateToken = _token0; } else { amountBought = finalBalance1; intermediateToken = _token1; } require(amountBought > 0, 'Swapped to Invalid Intermediate'); } function _swapIntermediate( address _toContractAddress, address _ToSushipoolToken0, address _ToSushipoolToken1, uint256 _amount ) private returns (uint256 token0Bought, uint256 token1Bought) { (address token0, address token1) = _ToSushipoolToken0 < _ToSushipoolToken1 ? (_ToSushipoolToken0, _ToSushipoolToken1) : (_ToSushipoolToken1, _ToSushipoolToken0); ISushiSwap pair = ISushiSwap( uint256( keccak256(abi.encodePacked(hex"ff", sushiSwapFactory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash)) ) ); (uint256 res0, uint256 res1, ) = pair.getReserves(); if (_toContractAddress == _ToSushipoolToken0) { uint256 amountToSwap = calculateSwapInAmount(res0, _amount); // if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = _amount / 2; token1Bought = _token2Token( _toContractAddress, _ToSushipoolToken1, amountToSwap ); token0Bought = _amount.sub(amountToSwap); } else { uint256 amountToSwap = calculateSwapInAmount(res1, _amount); // if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = _amount / 2; token0Bought = _token2Token( _toContractAddress, _ToSushipoolToken0, amountToSwap ); token1Bought = _amount.sub(amountToSwap); } } function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) private pure returns (uint256) { return Babylonian .sqrt( reserveIn.mul(userIn.mul(3988000) + reserveIn.mul(3988009)) ) .sub(reserveIn.mul(1997)) / 1994; } /** @notice This function is used to swap ERC20 <> ERC20. @param _FromTokenContractAddress The token address to swap from. @param _ToTokenContractAddress The token address to swap to. @param tokens2Trade The amount of tokens to swap. @return tokenBought The quantity of tokens bought. */ function _token2Token( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade ) private returns (uint256 tokenBought) { if (_FromTokenContractAddress == _ToTokenContractAddress) { return tokens2Trade; } IERC20(_FromTokenContractAddress).safeApprove( address(sushiSwapRouter), 0 ); IERC20(_FromTokenContractAddress).safeApprove( address(sushiSwapRouter), tokens2Trade ); (address token0, address token1) = _FromTokenContractAddress < _ToTokenContractAddress ? (_FromTokenContractAddress, _ToTokenContractAddress) : (_ToTokenContractAddress, _FromTokenContractAddress); address pair = address( uint256( keccak256(abi.encodePacked(hex"ff", sushiSwapFactory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash)) ) ); require(pair != address(0), 'No Swap Available'); address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = _ToTokenContractAddress; tokenBought = sushiSwapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; require(tokenBought > 0, 'Error Swapping Tokens 2'); } function zapOut( address pair, address to, uint256 amount ) external returns (uint256 amount0, uint256 amount1) { IERC20(pair).safeTransferFrom(msg.sender, pair, amount); // pull `amount` to `pair` (amount0, amount1) = ISushiSwap(pair).burn(to); // trigger burn to redeem liquidity for `to` } function zapOutBalance( address pair, address to ) external returns (uint256 amount0, uint256 amount1) { IERC20(pair).safeTransfer(pair, IERC20(pair).safeBalanceOfSelf()); // transfer local balance to `pair` (amount0, amount1) = ISushiSwap(pair).burn(to); // trigger burn to redeem liquidity for `to` } } /// @notice Interface for depositing into and withdrawing from Aave lending pool. interface IAaveBridge { function UNDERLYING_ASSET_ADDRESS() external view returns (address); function deposit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; function withdraw( address token, uint256 amount, address destination ) external; } /// @notice Interface for depositing into and withdrawing from BentoBox vault. interface IBentoBridge { function registerProtocol() external; function setMasterContractApproval( address user, address masterContract, bool approved, uint8 v, bytes32 r, bytes32 s ) external; function deposit( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external payable returns (uint256 amountOut, uint256 shareOut); function withdraw( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external returns (uint256 amountOut, uint256 shareOut); } /// @notice Interface for depositing into and withdrawing from Compound finance protocol. interface ICompoundBridge { function underlying() external view returns (address); function mint(uint mintAmount) external returns (uint); function redeem(uint redeemTokens) external returns (uint); } /// @notice Interface for depositing and withdrawing assets from KASHI. interface IKashiBridge { function asset() external returns (IERC20); function addAsset( address to, bool skim, uint256 share ) external returns (uint256 fraction); function removeAsset(address to, uint256 fraction) external returns (uint256 share); } /// @notice Interface for depositing into and withdrawing from SushiBar. interface ISushiBarBridge { function enter(uint256 amount) external; function leave(uint256 share) external; } /// @notice Interface for SUSHI MasterChef v2. interface IMasterChefV2 { function lpToken(uint256 pid) external view returns (IERC20); function deposit(uint256 pid, uint256 amount, address to) external; } /// @notice Contract that batches SUSHI staking and DeFi strategies - V1 'iroirona'. contract InariV1 is BoringBatchableWithDai, SushiZap { using SafeMath for uint256; using BoringERC20 for IERC20; IERC20 constant sushiToken = IERC20(0x6B3595068778DD592e39A122f4f5a5cF09C90fE2); // SUSHI token contract address constant sushiBar = 0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272; // xSUSHI staking contract for SUSHI ISushiSwap constant sushiSwapSushiETHPair = ISushiSwap(0x795065dCc9f64b5614C407a6EFDC400DA6221FB0); // SUSHI/ETH pair on SushiSwap IMasterChefV2 constant masterChefv2 = IMasterChefV2(0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d); // SUSHI MasterChef v2 contract IAaveBridge constant aave = IAaveBridge(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9); // AAVE lending pool contract for xSUSHI staking into aXSUSHI IERC20 constant aaveSushiToken = IERC20(0xF256CC7847E919FAc9B808cC216cAc87CCF2f47a); // aXSUSHI staking contract for xSUSHI IBentoBridge constant bento = IBentoBridge(0xF5BCE5077908a1b7370B9ae04AdC565EBd643966); // BENTO vault contract address constant crSushiToken = 0x338286C0BC081891A4Bda39C7667ae150bf5D206; // crSUSHI staking contract for SUSHI address constant crXSushiToken = 0x228619CCa194Fbe3Ebeb2f835eC1eA5080DaFbb2; // crXSUSHI staking contract for xSUSHI /// @notice Initialize this Inari contract. constructor() { bento.registerProtocol(); // register this contract with BENTO } /// @notice Helper function to approve this contract to spend tokens and enable strategies. function bridgeToken(IERC20[] calldata token, address[] calldata to) external { for (uint256 i = 0; i < token.length; i++) { token[i].safeApprove(to[i], type(uint256).max); // max approve `to` spender to pull `token` from this contract } } /********** TKN HELPERS **********/ function withdrawToken(IERC20 token, address to, uint256 amount) external { token.safeTransfer(to, amount); } function withdrawTokenBalance(IERC20 token, address to) external { token.safeTransfer(to, token.safeBalanceOfSelf()); } /*********** CHEF HELPERS ***********/ function depositToMasterChefv2(uint256 pid, uint256 amount, address to) external { masterChefv2.deposit(pid, amount, to); } function balanceToMasterChefv2(uint256 pid, address to) external { IERC20 lpToken = masterChefv2.lpToken(pid); masterChefv2.deposit(pid, lpToken.safeBalanceOfSelf(), to); } /// @notice Liquidity zap into CHEF. function zapToMasterChef( address to, address _FromTokenContractAddress, uint256 _amount, uint256 _minPoolTokens, uint256 pid, address _swapTarget, bytes calldata swapData ) external payable returns (uint256 LPBought) { uint256 toInvest = _pullTokens( _FromTokenContractAddress, _amount ); IERC20 _pairAddress = masterChefv2.lpToken(pid); LPBought = _performZapIn( _FromTokenContractAddress, address(_pairAddress), toInvest, _swapTarget, swapData ); require(LPBought >= _minPoolTokens, "ERR: High Slippage"); emit ZapIn(to, address(_pairAddress), LPBought); masterChefv2.deposit(pid, LPBought, to); } /************ KASHI HELPERS ************/ function assetToKashi(IKashiBridge kashiPair, address to, uint256 amount) external returns (uint256 fraction) { IERC20 asset = kashiPair.asset(); asset.safeTransferFrom(msg.sender, address(bento), amount); IBentoBridge(bento).deposit(asset, address(bento), address(kashiPair), amount, 0); fraction = kashiPair.addAsset(to, true, amount); } function assetToKashiChef(uint256 pid, uint256 amount, address to) external returns (uint256 fraction) { address kashiPair = address(masterChefv2.lpToken(pid)); IERC20 asset = IKashiBridge(kashiPair).asset(); asset.safeTransferFrom(msg.sender, address(bento), amount); IBentoBridge(bento).deposit(asset, address(bento), address(kashiPair), amount, 0); fraction = IKashiBridge(kashiPair).addAsset(address(this), true, amount); masterChefv2.deposit(pid, fraction, to); } function assetBalanceToKashi(IKashiBridge kashiPair, address to) external returns (uint256 fraction) { IERC20 asset = kashiPair.asset(); uint256 balance = asset.safeBalanceOfSelf(); IBentoBridge(bento).deposit(asset, address(bento), address(kashiPair), balance, 0); fraction = kashiPair.addAsset(to, true, balance); } function assetBalanceToKashiChef(uint256 pid, address to) external returns (uint256 fraction) { address kashiPair = address(masterChefv2.lpToken(pid)); IERC20 asset = IKashiBridge(kashiPair).asset(); uint256 balance = asset.safeBalanceOfSelf(); IBentoBridge(bento).deposit(asset, address(bento), address(kashiPair), balance, 0); fraction = IKashiBridge(kashiPair).addAsset(address(this), true, balance); masterChefv2.deposit(pid, fraction, to); } function assetBalanceFromKashi(address kashiPair, address to) external returns (uint256 share) { share = IKashiBridge(kashiPair).removeAsset(to, IERC20(kashiPair).safeBalanceOfSelf()); } /// @notice Liquidity zap into KASHI. function zapToKashi( address to, address _FromTokenContractAddress, IKashiBridge kashiPair, uint256 _amount, uint256 _minPoolTokens, address _swapTarget, bytes calldata swapData ) external payable returns (uint256 fraction) { uint256 toInvest = _pullTokens( _FromTokenContractAddress, _amount ); IERC20 _pairAddress = kashiPair.asset(); uint256 LPBought = _performZapIn( _FromTokenContractAddress, address(_pairAddress), toInvest, _swapTarget, swapData ); require(LPBought >= _minPoolTokens, "ERR: High Slippage"); emit ZapIn(to, address(_pairAddress), LPBought); _pairAddress.safeTransfer(address(bento), LPBought); IBentoBridge(bento).deposit(_pairAddress, address(bento), address(kashiPair), LPBought, 0); fraction = kashiPair.addAsset(to, true, LPBought); } /* ██ ██ ▄ ▄███▄ █ █ █ █ █ █▀ ▀ █▄▄█ █▄▄█ █ █ ██▄▄ █ █ █ █ █ █ █▄ ▄▀ █ █ █ █ ▀███▀ █ █ █▐ ▀ ▀ ▐ */ /*********** AAVE HELPERS ***********/ function balanceToAave(address underlying, address to) external { aave.deposit(underlying, IERC20(underlying).safeBalanceOfSelf(), to, 0); } function balanceFromAave(address aToken, address to) external { address underlying = IAaveBridge(aToken).UNDERLYING_ASSET_ADDRESS(); // sanity check for `underlying` token aave.withdraw(underlying, IERC20(aToken).safeBalanceOfSelf(), to); } /************************** AAVE -> UNDERLYING -> BENTO **************************/ /// @notice Migrate AAVE `aToken` underlying `amount` into BENTO for benefit of `to` by batching calls to `aave` and `bento`. function aaveToBento(address aToken, address to, uint256 amount) external returns (uint256 amountOut, uint256 shareOut) { IERC20(aToken).safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` `aToken` `amount` into this contract address underlying = IAaveBridge(aToken).UNDERLYING_ASSET_ADDRESS(); // sanity check for `underlying` token aave.withdraw(underlying, amount, address(bento)); // burn deposited `aToken` from `aave` into `underlying` (amountOut, shareOut) = bento.deposit(IERC20(underlying), address(bento), to, amount, 0); // stake `underlying` into BENTO for `to` } /************************** BENTO -> UNDERLYING -> AAVE **************************/ /// @notice Migrate `underlying` `amount` from BENTO into AAVE for benefit of `to` by batching calls to `bento` and `aave`. function bentoToAave(IERC20 underlying, address to, uint256 amount) external { bento.withdraw(underlying, msg.sender, address(this), amount, 0); // withdraw `amount` of `underlying` from BENTO into this contract aave.deposit(address(underlying), amount, to, 0); // stake `underlying` into `aave` for `to` } /************************* AAVE -> UNDERLYING -> COMP *************************/ /// @notice Migrate AAVE `aToken` underlying `amount` into COMP/CREAM `cToken` for benefit of `to` by batching calls to `aave` and `cToken`. function aaveToCompound(address aToken, address cToken, address to, uint256 amount) external { IERC20(aToken).safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` `aToken` `amount` into this contract address underlying = IAaveBridge(aToken).UNDERLYING_ASSET_ADDRESS(); // sanity check for `underlying` token aave.withdraw(underlying, amount, address(this)); // burn deposited `aToken` from `aave` into `underlying` ICompoundBridge(cToken).mint(amount); // stake `underlying` into `cToken` IERC20(cToken).safeTransfer(to, IERC20(cToken).safeBalanceOfSelf()); // transfer resulting `cToken` to `to` } /************************* COMP -> UNDERLYING -> AAVE *************************/ /// @notice Migrate COMP/CREAM `cToken` underlying `amount` into AAVE for benefit of `to` by batching calls to `cToken` and `aave`. function compoundToAave(address cToken, address to, uint256 amount) external { IERC20(cToken).safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` `cToken` `amount` into this contract ICompoundBridge(cToken).redeem(amount); // burn deposited `cToken` into `underlying` address underlying = ICompoundBridge(cToken).underlying(); // sanity check for `underlying` token aave.deposit(underlying, IERC20(underlying).safeBalanceOfSelf(), to, 0); // stake resulting `underlying` into `aave` for `to` } /********************** SUSHI -> XSUSHI -> AAVE **********************/ /// @notice Stake SUSHI `amount` into aXSUSHI for benefit of `to` by batching calls to `sushiBar` and `aave`. function stakeSushiToAave(address to, uint256 amount) external { // SAAVE sushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` SUSHI `amount` into this contract ISushiBarBridge(sushiBar).enter(amount); // stake deposited SUSHI into `sushiBar` xSUSHI aave.deposit(sushiBar, IERC20(sushiBar).safeBalanceOfSelf(), to, 0); // stake resulting xSUSHI into `aave` aXSUSHI for `to` } /********************** AAVE -> XSUSHI -> SUSHI **********************/ /// @notice Unstake aXSUSHI `amount` into SUSHI for benefit of `to` by batching calls to `aave` and `sushiBar`. function unstakeSushiFromAave(address to, uint256 amount) external { aaveSushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` aXSUSHI `amount` into this contract aave.withdraw(sushiBar, amount, address(this)); // burn deposited aXSUSHI from `aave` into xSUSHI ISushiBarBridge(sushiBar).leave(amount); // burn resulting xSUSHI from `sushiBar` into SUSHI sushiToken.safeTransfer(to, sushiToken.safeBalanceOfSelf()); // transfer resulting SUSHI to `to` } /* ███ ▄███▄ ▄ ▄▄▄▄▀ ████▄ █ █ █▀ ▀ █ ▀▀▀ █ █ █ █ ▀ ▄ ██▄▄ ██ █ █ █ █ █ ▄▀ █▄ ▄▀ █ █ █ █ ▀████ ███ ▀███▀ █ █ █ ▀ █ ██ */ /************ BENTO HELPERS ************/ function balanceToBento(IERC20 token, address to) external returns (uint256 amountOut, uint256 shareOut) { (amountOut, shareOut) = bento.deposit(token, address(this), to, token.safeBalanceOfSelf(), 0); } /// @dev Included to be able to approve `bento` in the same transaction (using `batch()`). function setBentoApproval( address user, address masterContract, bool approved, uint8 v, bytes32 r, bytes32 s ) external { bento.setMasterContractApproval(user, masterContract, approved, v, r, s); } /// @notice Liquidity zap into BENTO. function zapToBento( address to, address _FromTokenContractAddress, address _pairAddress, uint256 _amount, uint256 _minPoolTokens, address _swapTarget, bytes calldata swapData ) external payable returns (uint256 LPBought) { uint256 toInvest = _pullTokens( _FromTokenContractAddress, _amount ); LPBought = _performZapIn( _FromTokenContractAddress, _pairAddress, toInvest, _swapTarget, swapData ); require(LPBought >= _minPoolTokens, "ERR: High Slippage"); emit ZapIn(to, _pairAddress, LPBought); bento.deposit(IERC20(_pairAddress), address(this), to, LPBought, 0); } /// @notice Liquidity unzap from BENTO. function zapFromBento( address pair, address to, uint256 amount ) external returns (uint256 amount0, uint256 amount1) { bento.withdraw(IERC20(pair), msg.sender, pair, amount, 0); // withdraw `amount` to `pair` from BENTO (amount0, amount1) = ISushiSwap(pair).burn(to); // trigger burn to redeem liquidity for `to` } /*********************** SUSHI -> XSUSHI -> BENTO ***********************/ /// @notice Stake SUSHI `amount` into BENTO xSUSHI for benefit of `to` by batching calls to `sushiBar` and `bento`. function stakeSushiToBento(address to, uint256 amount) external returns (uint256 amountOut, uint256 shareOut) { sushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` SUSHI `amount` into this contract ISushiBarBridge(sushiBar).enter(amount); // stake deposited SUSHI into `sushiBar` xSUSHI (amountOut, shareOut) = bento.deposit(IERC20(sushiBar), address(this), to, IERC20(sushiBar).safeBalanceOfSelf(), 0); // stake resulting xSUSHI into BENTO for `to` } /*********************** BENTO -> XSUSHI -> SUSHI ***********************/ /// @notice Unstake xSUSHI `amount` from BENTO into SUSHI for benefit of `to` by batching calls to `bento` and `sushiBar`. function unstakeSushiFromBento(address to, uint256 amount) external { bento.withdraw(IERC20(sushiBar), msg.sender, address(this), amount, 0); // withdraw `amount` of xSUSHI from BENTO into this contract ISushiBarBridge(sushiBar).leave(amount); // burn withdrawn xSUSHI from `sushiBar` into SUSHI sushiToken.safeTransfer(to, sushiToken.safeBalanceOfSelf()); // transfer resulting SUSHI to `to` } /* ▄█▄ █▄▄▄▄ ▄███▄ ██ █▀▄▀█ █▀ ▀▄ █ ▄▀ █▀ ▀ █ █ █ █ █ █ ▀ █▀▀▌ ██▄▄ █▄▄█ █ ▄ █ █▄ ▄▀ █ █ █▄ ▄▀ █ █ █ █ ▀███▀ █ ▀███▀ █ █ ▀ █ ▀ ▀ */ // - COMPOUND - // /*********** COMP HELPERS ***********/ function balanceToCompound(ICompoundBridge cToken) external { IERC20 underlying = IERC20(ICompoundBridge(cToken).underlying()); // sanity check for `underlying` token cToken.mint(underlying.safeBalanceOfSelf()); } function balanceFromCompound(address cToken) external { ICompoundBridge(cToken).redeem(IERC20(cToken).safeBalanceOfSelf()); } /************************** COMP -> UNDERLYING -> BENTO **************************/ /// @notice Migrate COMP/CREAM `cToken` `cTokenAmount` into underlying and BENTO for benefit of `to` by batching calls to `cToken` and `bento`. function compoundToBento(address cToken, address to, uint256 cTokenAmount) external returns (uint256 amountOut, uint256 shareOut) { IERC20(cToken).safeTransferFrom(msg.sender, address(this), cTokenAmount); // deposit `msg.sender` `cToken` `cTokenAmount` into this contract ICompoundBridge(cToken).redeem(cTokenAmount); // burn deposited `cToken` into `underlying` IERC20 underlying = IERC20(ICompoundBridge(cToken).underlying()); // sanity check for `underlying` token (amountOut, shareOut) = bento.deposit(underlying, address(this), to, underlying.safeBalanceOfSelf(), 0); // stake resulting `underlying` into BENTO for `to` } /************************** BENTO -> UNDERLYING -> COMP **************************/ /// @notice Migrate `cToken` `underlyingAmount` from BENTO into COMP/CREAM for benefit of `to` by batching calls to `bento` and `cToken`. function bentoToCompound(address cToken, address to, uint256 underlyingAmount) external { IERC20 underlying = IERC20(ICompoundBridge(cToken).underlying()); // sanity check for `underlying` token bento.withdraw(underlying, msg.sender, address(this), underlyingAmount, 0); // withdraw `underlyingAmount` of `underlying` from BENTO into this contract ICompoundBridge(cToken).mint(underlyingAmount); // stake `underlying` into `cToken` IERC20(cToken).safeTransfer(to, IERC20(cToken).safeBalanceOfSelf()); // transfer resulting `cToken` to `to` } /********************** SUSHI -> CREAM -> BENTO **********************/ /// @notice Stake SUSHI `amount` into crSUSHI and BENTO for benefit of `to` by batching calls to `crSushiToken` and `bento`. function sushiToCreamToBento(address to, uint256 amount) external returns (uint256 amountOut, uint256 shareOut) { sushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` SUSHI `amount` into this contract ICompoundBridge(crSushiToken).mint(amount); // stake deposited SUSHI into crSUSHI (amountOut, shareOut) = bento.deposit(IERC20(crSushiToken), address(this), to, IERC20(crSushiToken).safeBalanceOfSelf(), 0); // stake resulting crSUSHI into BENTO for `to` } /********************** BENTO -> CREAM -> SUSHI **********************/ /// @notice Unstake crSUSHI `cTokenAmount` into SUSHI from BENTO for benefit of `to` by batching calls to `bento` and `crSushiToken`. function sushiFromCreamFromBento(address to, uint256 cTokenAmount) external { bento.withdraw(IERC20(crSushiToken), msg.sender, address(this), cTokenAmount, 0); // withdraw `cTokenAmount` of `crSushiToken` from BENTO into this contract ICompoundBridge(crSushiToken).redeem(cTokenAmount); // burn deposited `crSushiToken` into SUSHI sushiToken.safeTransfer(to, sushiToken.safeBalanceOfSelf()); // transfer resulting SUSHI to `to` } /*********************** SUSHI -> XSUSHI -> CREAM ***********************/ /// @notice Stake SUSHI `amount` into crXSUSHI for benefit of `to` by batching calls to `sushiBar` and `crXSushiToken`. function stakeSushiToCream(address to, uint256 amount) external { // SCREAM sushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` SUSHI `amount` into this contract ISushiBarBridge(sushiBar).enter(amount); // stake deposited SUSHI `amount` into `sushiBar` xSUSHI ICompoundBridge(crXSushiToken).mint(IERC20(sushiBar).safeBalanceOfSelf()); // stake resulting xSUSHI into crXSUSHI IERC20(crXSushiToken).safeTransfer(to, IERC20(crXSushiToken).safeBalanceOfSelf()); // transfer resulting crXSUSHI to `to` } /*********************** CREAM -> XSUSHI -> SUSHI ***********************/ /// @notice Unstake crXSUSHI `cTokenAmount` into SUSHI for benefit of `to` by batching calls to `crXSushiToken` and `sushiBar`. function unstakeSushiFromCream(address to, uint256 cTokenAmount) external { IERC20(crXSushiToken).safeTransferFrom(msg.sender, address(this), cTokenAmount); // deposit `msg.sender` `crXSushiToken` `cTokenAmount` into this contract ICompoundBridge(crXSushiToken).redeem(cTokenAmount); // burn deposited `crXSushiToken` `cTokenAmount` into xSUSHI ISushiBarBridge(sushiBar).leave(IERC20(sushiBar).safeBalanceOfSelf()); // burn resulting xSUSHI `amount` from `sushiBar` into SUSHI sushiToken.safeTransfer(to, sushiToken.safeBalanceOfSelf()); // transfer resulting SUSHI to `to` } /******************************** SUSHI -> XSUSHI -> CREAM -> BENTO ********************************/ /// @notice Stake SUSHI `amount` into crXSUSHI and BENTO for benefit of `to` by batching calls to `sushiBar`, `crXSushiToken` and `bento`. function stakeSushiToCreamToBento(address to, uint256 amount) external returns (uint256 amountOut, uint256 shareOut) { sushiToken.safeTransferFrom(msg.sender, address(this), amount); // deposit `msg.sender` SUSHI `amount` into this contract ISushiBarBridge(sushiBar).enter(amount); // stake deposited SUSHI `amount` into `sushiBar` xSUSHI ICompoundBridge(crXSushiToken).mint(IERC20(sushiBar).safeBalanceOfSelf()); // stake resulting xSUSHI into crXSUSHI (amountOut, shareOut) = bento.deposit(IERC20(crXSushiToken), address(this), to, IERC20(crXSushiToken).safeBalanceOfSelf(), 0); // stake resulting crXSUSHI into BENTO for `to` } /******************************** BENTO -> CREAM -> XSUSHI -> SUSHI ********************************/ /// @notice Unstake crXSUSHI `cTokenAmount` into SUSHI from BENTO for benefit of `to` by batching calls to `bento`, `crXSushiToken` and `sushiBar`. function unstakeSushiFromCreamFromBento(address to, uint256 cTokenAmount) external { bento.withdraw(IERC20(crXSushiToken), msg.sender, address(this), cTokenAmount, 0); // withdraw `cTokenAmount` of `crXSushiToken` from BENTO into this contract ICompoundBridge(crXSushiToken).redeem(cTokenAmount); // burn deposited `crXSushiToken` `cTokenAmount` into xSUSHI ISushiBarBridge(sushiBar).leave(IERC20(sushiBar).safeBalanceOfSelf()); // burn resulting xSUSHI from `sushiBar` into SUSHI sushiToken.safeTransfer(to, sushiToken.safeBalanceOfSelf()); // transfer resulting SUSHI to `to` } /* ▄▄▄▄▄ ▄ ▄ ██ █ ▄▄ █ ▀▄ █ █ █ █ █ █ ▄ ▀▀▀▀▄ █ ▄ █ █▄▄█ █▀▀▀ ▀▄▄▄▄▀ █ █ █ █ █ █ █ █ █ █ █ ▀ ▀ █ ▀ ▀ */ /// @notice Fallback for received ETH - SushiSwap ETH to stake SUSHI into xSUSHI and BENTO for benefit of `to`. receive() external payable { // INARIZUSHI (uint256 reserve0, uint256 reserve1, ) = sushiSwapSushiETHPair.getReserves(); uint256 amountInWithFee = msg.value.mul(997); uint256 out = amountInWithFee.mul(reserve0) / reserve1.mul(1000).add(amountInWithFee); IWETH(wETH).deposit{value: msg.value}(); IERC20(wETH).safeTransfer(address(sushiSwapSushiETHPair), msg.value); sushiSwapSushiETHPair.swap(out, 0, address(this), ""); ISushiBarBridge(sushiBar).enter(sushiToken.safeBalanceOfSelf()); // stake resulting SUSHI into `sushiBar` xSUSHI bento.deposit(IERC20(sushiBar), address(this), msg.sender, IERC20(sushiBar).safeBalanceOfSelf(), 0); // stake resulting xSUSHI into BENTO for `to` } /// @notice SushiSwap ETH to stake SUSHI into xSUSHI and BENTO for benefit of `to`. function inariZushi(address to) external payable returns (uint256 amountOut, uint256 shareOut) { (uint256 reserve0, uint256 reserve1, ) = sushiSwapSushiETHPair.getReserves(); uint256 amountInWithFee = msg.value.mul(997); uint256 out = amountInWithFee.mul(reserve0) / reserve1.mul(1000).add(amountInWithFee); IWETH(wETH).deposit{value: msg.value}(); IERC20(wETH).safeTransfer(address(sushiSwapSushiETHPair), msg.value); sushiSwapSushiETHPair.swap(out, 0, address(this), ""); ISushiBarBridge(sushiBar).enter(sushiToken.safeBalanceOfSelf()); // stake resulting SUSHI into `sushiBar` xSUSHI (amountOut, shareOut) = bento.deposit(IERC20(sushiBar), address(this), to, IERC20(sushiBar).safeBalanceOfSelf(), 0); // stake resulting xSUSHI into BENTO for `to` } /// @notice Simple SushiSwap `fromToken` `amountIn` to `toToken` for benefit of `to`. function swap(address fromToken, address toToken, address to, uint256 amountIn) external returns (uint256 amountOut) { (address token0, address token1) = fromToken < toToken ? (fromToken, toToken) : (toToken, fromToken); ISushiSwap pair = ISushiSwap( uint256( keccak256(abi.encodePacked(hex"ff", sushiSwapFactory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash)) ) ); (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); uint256 amountInWithFee = amountIn.mul(997); IERC20(fromToken).safeTransferFrom(msg.sender, address(pair), amountIn); if (toToken > fromToken) { amountOut = amountInWithFee.mul(reserve1) / reserve0.mul(1000).add(amountInWithFee); pair.swap(0, amountOut, to, ""); } else { amountOut = amountInWithFee.mul(reserve0) / reserve1.mul(1000).add(amountInWithFee); pair.swap(amountOut, 0, to, ""); } } /// @notice Simple SushiSwap local `fromToken` balance in this contract to `toToken` for benefit of `to`. function swapBalance(address fromToken, address toToken, address to) external returns (uint256 amountOut) { (address token0, address token1) = fromToken < toToken ? (fromToken, toToken) : (toToken, fromToken); ISushiSwap pair = ISushiSwap( uint256( keccak256(abi.encodePacked(hex"ff", sushiSwapFactory, keccak256(abi.encodePacked(token0, token1)), pairCodeHash)) ) ); uint256 amountIn = IERC20(fromToken).safeBalanceOfSelf(); (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); uint256 amountInWithFee = amountIn.mul(997); IERC20(fromToken).safeTransfer(address(pair), amountIn); if (toToken > fromToken) { amountOut = amountInWithFee.mul(reserve1) / reserve0.mul(1000).add(amountInWithFee); pair.swap(0, amountOut, to, ""); } else { amountOut = amountInWithFee.mul(reserve0) / reserve1.mul(1000).add(amountInWithFee); pair.swap(amountOut, 0, to, ""); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensRec","type":"uint256"}],"name":"ZapIn","type":"event"},{"inputs":[{"internalType":"address","name":"aToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"aaveToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aToken","type":"address"},{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"aaveToCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"kashiPair","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"assetBalanceFromKashi","outputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKashiBridge","name":"kashiPair","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"assetBalanceToKashi","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"assetBalanceToKashiChef","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKashiBridge","name":"kashiPair","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"assetToKashi","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"assetToKashiChef","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aToken","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"balanceFromAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"balanceFromCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"balanceToAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"balanceToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ICompoundBridge","name":"cToken","type":"address"}],"name":"balanceToCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"balanceToMasterChefv2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"underlying","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bentoToAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"underlyingAmount","type":"uint256"}],"name":"bentoToCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"token","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"bridgeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"compoundToAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"cTokenAmount","type":"uint256"}],"name":"compoundToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"depositToMasterChefv2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"inariZushi","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IDaiPermit","name":"token","type":"address"},{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bool[]","name":"isApproved","type":"bool[]"}],"name":"setApprovedTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"masterContract","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setBentoApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeSushiToAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeSushiToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeSushiToCream","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeSushiToCreamToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"cTokenAmount","type":"uint256"}],"name":"sushiFromCreamFromBento","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sushiToCreamToBento","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"shareOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"swapBalance","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeSushiFromAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeSushiFromBento","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"cTokenAmount","type":"uint256"}],"name":"unstakeSushiFromCream","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"cTokenAmount","type":"uint256"}],"name":"unstakeSushiFromCreamFromBento","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"zapFromBento","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"},{"internalType":"address","name":"_swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"zapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"zapOut","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"zapOutBalance","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"},{"internalType":"address","name":"_swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"zapToBento","outputs":[{"internalType":"uint256","name":"LPBought","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"contract IKashiBridge","name":"kashiPair","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"},{"internalType":"address","name":"_swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"zapToKashi","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"_swapTarget","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"zapToMasterChef","outputs":[{"internalType":"uint256","name":"LPBought","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600080546001600160a01b0319163317815573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28152600160208190527f49e349d4f386739afdf8e55db7675b584d46c3b2a603eef62554e21dc437b5db805460ff191690911790556040805163577268d960e11b8152905173f5bce5077908a1b7370b9ae04adc565ebd6439669263aee4d1b2926004808201939182900301818387803b158015620000b757600080fd5b505af1158015620000cc573d6000803e3d6000fd5b50505050615ff880620000e06000396000f3fe6080604052600436106102625760003560e01c8063839a9c4211610145578063b5955512116100bc578063b5955512146109f7578063b6d16b9414610a17578063bb29578a14610a37578063bdcbf5c314610a57578063c52f3bee14610a77578063caf11a3914610a97578063d2423b5114610ab7578063d38bfff414610aca578063d5eaa84014610aea578063dbbc3b0a14610b0a578063e30dbe7a14610b2a578063efaad98a14610b3d578063f23f8fdd14610b5d57610571565b8063839a9c421461089157806389bd8bf1146108a45780639735a634146108c45780639779d1a6146108e45780639821dad514610911578063a51973a214610924578063a582777314610944578063a9678a1814610957578063a9a5171314610977578063ab35a94b14610997578063b2bd5c96146109b7578063b393d953146109d757610571565b80635294b8b7116101d95780635294b8b71461071e5780635a93b873146107315780635bb555dd1461075157806362fe2949146107715780636621318e14610791578063699bdfa2146107b157806371af7c07146107d1578063741f815b146107f157806378107161146108115780637bfa252c146108315780637c516e941461085157806381f919c51461087157610571565b806301e33667146105765780630c340a241461059857806313bfdfe5146105c357806317340206146105f05780631a9d663f146106105780631cb7fe891461063e578063310c65551461065e578063339dae191461067e5780633b2effdb1461069e5780633cf7123d146106be5780633f4e090a146106de5780634ec3a4d7146106fe57610571565b366105715760008073795065dcc9f64b5614c407a6efdc400da6221fb06001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156102b757600080fd5b505afa1580156102cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ef9190615645565b506001600160701b039182169350169050600061030e346103e5610b7d565b9050600061032882610322856103e8610b7d565b90610bc3565b6103328386610b7d565b8161033957fe5b04905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b506103db935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2925073795065dcc9f64b5614c407a6efdc400da6221fb09150349050610be6565b60405163022c0d9f60e01b815273795065dcc9f64b5614c407a6efdc400da6221fb09063022c0d9f9061041790849060009030906004016159cf565b600060405180830381600087803b15801561043157600080fd5b505af1158015610445573d6000803e3d6000fd5b50600080516020615f23833981519152925063a59f3e0c91506104779050600080516020615fa3833981519152610cdb565b6040518263ffffffff1660e01b81526004016104939190615d83565b600060405180830381600087803b1580156104ad57600080fd5b505af11580156104c1573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f23833981519152905030336104f683610cdb565b60006040518663ffffffff1660e01b815260040161051895949392919061599b565b6040805180830381600087803b15801561053157600080fd5b505af1158015610545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056991906156c4565b505050505050005b600080fd5b34801561058257600080fd5b50610596610591366004615248565b610dcd565b005b3480156105a457600080fd5b506105ad610de6565b6040516105ba91906157c2565b60405180910390f35b3480156105cf57600080fd5b506105e36105de3660046156e7565b610df5565b6040516105ba9190615d83565b3480156105fc57600080fd5b5061059661060b366004615248565b611098565b34801561061c57600080fd5b5061063061062b366004615248565b61119a565b6040516105ba929190615dfc565b34801561064a57600080fd5b506106306106593660046152e3565b6112b4565b34801561066a57600080fd5b506105966106793660046152e3565b61147d565b34801561068a57600080fd5b506105966106993660046152e3565b6115c4565b3480156106aa57600080fd5b506105966106b93660046152e3565b61170a565b3480156106ca57600080fd5b506105966106d93660046152e3565b6117d6565b3480156106ea57600080fd5b506106306106f93660046152e3565b6118a2565b34801561070a57600080fd5b506105e3610719366004615248565b611953565b6105e361072c366004615124565b611b05565b34801561073d57600080fd5b5061059661074c366004615497565b611c3b565b34801561075d57600080fd5b5061059661076c3660046156a0565b611cb2565b34801561077d57600080fd5b5061063061078c366004615248565b611d7e565b34801561079d57600080fd5b506105966107ac366004615248565b611f33565b3480156107bd57600080fd5b506105966107cc3660046151c2565b6120e2565b3480156107dd57600080fd5b506105966107ec3660046152e3565b612157565b3480156107fd57600080fd5b5061059661080c3660046152e3565b6122a2565b34801561081d57600080fd5b5061059661082c366004615052565b6123ac565b34801561083d57600080fd5b5061059661084c36600461501a565b61246d565b34801561085d57600080fd5b5061059661086c36600461553c565b6124f3565b34801561087d57600080fd5b5061063061088c36600461552a565b612567565b6105e361089f36600461522d565b612593565b3480156108b057600080fd5b506105966108bf3660046150d4565b6127e9565b3480156108d057600080fd5b506105966108df36600461530e565b612976565b3480156108f057600080fd5b506109046108ff36600461501a565b612a40565b6040516105ba9190615990565b61063061091f36600461501a565b612a55565b34801561093057600080fd5b5061063061093f366004615248565b612d62565b6105e3610952366004615124565b612da6565b34801561096357600080fd5b506105e36109723660046150d4565b612e67565b34801561098357600080fd5b506105e361099236600461508a565b6130f4565b3480156109a357600080fd5b506105966109b236600461501a565b613396565b3480156109c357600080fd5b506106306109d2366004615052565b61349a565b3480156109e357600080fd5b506105966109f2366004615248565b6134df565b348015610a0357600080fd5b50610630610a123660046152e3565b61366f565b348015610a2357600080fd5b50610630610a32366004615248565b61374a565b348015610a4357600080fd5b50610596610a5236600461552a565b61388c565b348015610a6357600080fd5b506105e3610a7236600461552a565b6138b3565b348015610a8357600080fd5b506105e3610a92366004615052565b6139fe565b348015610aa357600080fd5b50610596610ab2366004615052565b613a8f565b610596610ac5366004615376565b613ade565b348015610ad657600080fd5b50610596610ae536600461501a565b613b9a565b348015610af657600080fd5b506105e3610b053660046156a0565b613be6565b348015610b1657600080fd5b50610596610b253660046152e3565b613e7d565b6105e3610b38366004615288565b613f49565b348015610b4957600080fd5b50610596610b583660046156e7565b6140eb565b348015610b6957600080fd5b50610596610b7836600461530e565b614120565b6000811580610b9857505080820282828281610b9557fe5b04145b610bbd5760405162461bcd60e51b8152600401610bb490615ac5565b60405180910390fd5b92915050565b80820182811015610bbd5760405162461bcd60e51b8152600401610bb490615af3565b600080846001600160a01b031663a9059cbb60e01b8585604051602401610c0e929190615927565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610c4c9190615773565b6000604051808303816000865af19150503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b5091509150818015610cb8575080511580610cb8575080806020019051810190610cb8919061547b565b610cd45760405162461bcd60e51b8152600401610bb490615a8e565b5050505050565b6000806000836001600160a01b03166370a0823160e01b30604051602401610d0391906157c2565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610d419190615773565b600060405180830381855afa9150503d8060008114610d7c576040519150601f19603f3d011682016040523d82523d6000602084013e610d81565b606091505b5091509150818015610d9557506020815110155b610db15760405162461bcd60e51b8152600401610bb490615cc0565b80806020019051810190610dc59190615688565b949350505050565b610de16001600160a01b0384168383610be6565b505050565b6000546001600160a01b031681565b6040516378ed5d1f60e01b81526000908190600080516020615f83833981519152906378ed5d1f90610e2b908890600401615d83565b60206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b9190615036565b90506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef29190615036565b9050610f176001600160a01b03821633600080516020615f638339815191528861418b565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90610f50908490849087908b9060009060040161599b565b6040805180830381600087803b158015610f6957600080fd5b505af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906156c4565b5050604051626d47a560e61b81526001600160a01b03831690631b51e94090610fd39030906001908a906004016157d6565b602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110259190615688565b604051638dbdbe6d60e01b8152909350600080516020615f8383398151915290638dbdbe6d9061105d90899087908990600401615e0a565b600060405180830381600087803b15801561107757600080fd5b505af115801561108b573d6000803e3d6000fd5b5050505050509392505050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d30906110d290869033903090879060009060040161599b565b6040805180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906156c4565b505060405163e8eda9df60e01b8152737d2768de32b0b80b7a3454c06bdac94a69ddc7a99063e8eda9df9061116390869085908790600090600401615963565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b50505050505050565b60405163097da6d360e41b81526000908190600080516020615f63833981519152906397da6d30906111d8908890339082908990889060040161599b565b6040805180830381600087803b1580156111f157600080fd5b505af1158015611205573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122991906156c4565b505060405163226bf2d160e21b81526001600160a01b038616906389afcb44906112579087906004016157c2565b6040805180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906156c4565b90969095509350505050565b6000806112d1600080516020615fa383398151915233308661418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c90611302908690600401615d83565b600060405180830381600087803b15801561131c57600080fd5b505af1158015611330573d6000803e3d6000fd5b50600080516020615f03833981519152925063a0712d6891506113629050600080516020615f23833981519152610cdb565b6040518263ffffffff1660e01b815260040161137e9190615d83565b602060405180830381600087803b15801561139857600080fd5b505af11580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d09190615688565b50600080516020615f638339815191526302b9446c600080516020615f0383398151915230876113ff83610cdb565b60006040518663ffffffff1660e01b815260040161142195949392919061599b565b6040805180830381600087803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147291906156c4565b909590945092505050565b611497600080516020615f0383398151915233308461418b565b60405163db006a7560e01b8152600080516020615f038339815191529063db006a75906114c8908490600401615d83565b602060405180830381600087803b1580156114e257600080fd5b505af11580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a9190615688565b50600080516020615f238339815191526367dfd4c961153882610cdb565b6040518263ffffffff1660e01b81526004016115549190615d83565b600060405180830381600087803b15801561156e57600080fd5b505af1158015611582573d6000803e3d6000fd5b505050506115c0826115aa600080516020615fa38339815191526001600160a01b0316610cdb565b600080516020615fa38339815191529190610be6565b5050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d30906116129073338286c0bc081891a4bda39c7667ae150bf5d2069033903090879060009060040161599b565b6040805180830381600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906156c4565b505060405163db006a7560e01b815273338286c0bc081891a4bda39c7667ae150bf5d2069063db006a759061169c908490600401615d83565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190615688565b506115c0826115aa600080516020615fa3833981519152610cdb565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d309061175290600080516020615f238339815191529033903090879060009060040161599b565b6040805180830381600087803b15801561176b57600080fd5b505af115801561177f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a391906156c4565b50506040516367dfd4c960e01b8152600080516020615f23833981519152906367dfd4c990611554908490600401615d83565b6117f673f256cc7847e919fac9b808cc216cac87ccf2f47a33308461418b565b604051631a4ca37b60e21b8152737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec9061183f90600080516020615f238339815191529085903090600401615940565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b50506040516367dfd4c960e01b8152600080516020615f2383398151915292506367dfd4c99150611554908490600401615d83565b6000806118bf600080516020615fa383398151915233308661418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906118f0908690600401615d83565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f23833981519152905030876113ff83610cdb565b600080846001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c99190615036565b90506119ee6001600160a01b03821633600080516020615f638339815191528661418b565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90611a2790849084908a90899060009060040161599b565b6040805180830381600087803b158015611a4057600080fd5b505af1158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7891906156c4565b5050604051626d47a560e61b81526001600160a01b03861690631b51e94090611aaa90879060019088906004016157d6565b602060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc9190615688565b95945050505050565b600080611b12898861427b565b9050611b578989838888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b915085821015611b795760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528a8984604051611b9a93929190615830565b60405180910390a160405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90611bdb908b9030908f90889060009060040161599b565b6040805180830381600087803b158015611bf457600080fd5b505af1158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c91906156c4565b50505098975050505050505050565b6040516323f2ebc360e21b81526001600160a01b038a1690638fcbaf0c90611c75908b908b908b908b908b908b908b908b90600401615854565b600060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b50505050505050505050505050565b6040516378ed5d1f60e01b8152600090600080516020615f83833981519152906378ed5d1f90611ce6908690600401615d83565b60206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190615036565b9050600080516020615f83833981519152638dbdbe6d84611d5f6001600160a01b038516610cdb565b856040518463ffffffff1660e01b815260040161116393929190615e0a565b600080611d966001600160a01b03861633308661418b565b60405163db006a7560e01b81526001600160a01b0386169063db006a7590611dc2908690600401615d83565b602060405180830381600087803b158015611ddc57600080fd5b505af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190615688565b506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5057600080fd5b505afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190615036565b9050600080516020615f638339815191526302b9446c823088611eb36001600160a01b038416610cdb565b60006040518663ffffffff1660e01b8152600401611ed595949392919061599b565b6040805180830381600087803b158015611eee57600080fd5b505af1158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906156c4565b9097909650945050505050565b6000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190615036565b60405163097da6d360e41b8152909150600080516020615f63833981519152906397da6d3090611fe390849033903090889060009060040161599b565b6040805180830381600087803b158015611ffc57600080fd5b505af1158015612010573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203491906156c4565b505060405163140e25ad60e31b81526001600160a01b0385169063a0712d6890612062908590600401615d83565b602060405180830381600087803b15801561207c57600080fd5b505af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190615688565b506120dc836120cb866001600160a01b0316610cdb565b6001600160a01b0387169190610be6565b50505050565b60405163c0a47c9360e01b8152600080516020615f638339815191529063c0a47c939061211d908990899089908990899089906004016157f7565b600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b50505050505050505050565b612171600080516020615fa383398151915233308461418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906121a2908490600401615d83565b600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b50600080516020615f03833981519152925063a0712d6891506122029050600080516020615f23833981519152610cdb565b6040518263ffffffff1660e01b815260040161221e9190615d83565b602060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122709190615688565b506115c08261228c600080516020615f03833981519152610cdb565b600080516020615f038339815191529190610be6565b6122bc600080516020615fa383398151915233308461418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906122ed908490600401615d83565b600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b50737d2768de32b0b80b7a3454c06bdac94a69ddc7a9925063e8eda9df9150600080516020615f23833981519152905061235481610cdb565b8560006040518563ffffffff1660e01b81526004016123769493929190615963565b600060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050505050565b6000826001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123e757600080fd5b505afa1580156123fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241f9190615036565b9050737d2768de32b0b80b7a3454c06bdac94a69ddc7a96369328dec8261244e6001600160a01b038716610cdb565b856040518463ffffffff1660e01b815260040161116393929190615940565b6001600160a01b03811663db006a7561248582610cdb565b6040518263ffffffff1660e01b81526004016124a19190615d83565b602060405180830381600087803b1580156124bb57600080fd5b505af11580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c09190615688565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061252b908a908a908a908a908a908a908a906004016158e6565b600060405180830381600087803b15801561254557600080fd5b505af1158015612559573d6000803e3d6000fd5b505050505050505050505050565b600080600080516020615f638339815191526302b9446c8530866113ff6001600160a01b038416610cdb565b6000806125a0898861427b565b90506000886001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126179190615036565b9050600061265e8b83858a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b9050878110156126805760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528c83836040516126a193929190615830565b60405180910390a16126cb6001600160a01b038316600080516020615f6383398151915283610be6565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c9061270490859084908f90879060009060040161599b565b6040805180830381600087803b15801561271d57600080fd5b505af1158015612731573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275591906156c4565b5050604051626d47a560e61b81526001600160a01b038b1690631b51e94090612787908f9060019086906004016157d6565b602060405180830381600087803b1580156127a157600080fd5b505af11580156127b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d99190615688565b9c9b505050505050505050505050565b6127fe6001600160a01b03851633308461418b565b6000846001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b15801561283957600080fd5b505afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128719190615036565b604051631a4ca37b60e21b8152909150737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec906128af90849086903090600401615940565b600060405180830381600087803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b505060405163140e25ad60e31b81526001600160a01b038716925063a0712d68915061290d908590600401615d83565b602060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295f9190615688565b50610cd4836120cb866001600160a01b0316610cdb565b6000546001600160a01b031633146129a05760405162461bcd60e51b8152600401610bb490615bcf565b8281146129bf5760405162461bcd60e51b8152600401610bb490615ba1565b60005b83811015610cd4578282828181106129d657fe5b90506020020160208101906129eb919061545f565b600160008787858181106129fb57fe5b9050602002016020810190612a10919061501a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016129c2565b60016020526000908152604090205460ff1681565b60008060008073795065dcc9f64b5614c407a6efdc400da6221fb06001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae09190615645565b506001600160701b0391821693501690506000612aff346103e5610b7d565b90506000612b1382610322856103e8610b7d565b612b1d8386610b7d565b81612b2457fe5b04905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b7657600080fd5b505af1158015612b8a573d6000803e3d6000fd5b50612bc6935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2925073795065dcc9f64b5614c407a6efdc400da6221fb09150349050610be6565b60405163022c0d9f60e01b815273795065dcc9f64b5614c407a6efdc400da6221fb09063022c0d9f90612c0290849060009030906004016159cf565b600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b50600080516020615f23833981519152925063a59f3e0c9150612c629050600080516020615fa3833981519152610cdb565b6040518263ffffffff1660e01b8152600401612c7e9190615d83565b600060405180830381600087803b158015612c9857600080fd5b505af1158015612cac573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f238339815191529050308a612ce183610cdb565b60006040518663ffffffff1660e01b8152600401612d0395949392919061599b565b6040805180830381600087803b158015612d1c57600080fd5b505af1158015612d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5491906156c4565b909890975095505050505050565b600080612d7a6001600160a01b03861633878661418b565b60405163226bf2d160e21b81526001600160a01b038616906389afcb44906112579087906004016157c2565b600080612db3898861427b565b90506000612dfa8a8a848989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b905086811015612e1c5760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528b8a83604051612e3d93929190615830565b60405180910390a1612e596001600160a01b038a168c83610be6565b9a9950505050505050505050565b6000806000856001600160a01b0316876001600160a01b031610612e8c578587612e8f565b86865b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8383604051602001612ebd929190615741565b60408051601f19818403018152908290528051602091820120612ef393929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612f4a57600080fd5b505afa158015612f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f829190615645565b506001600160701b0391821693501690506000612fa1886103e5610b7d565b9050612fb86001600160a01b038c1633868b61418b565b8a6001600160a01b03168a6001600160a01b0316111561305e57612fe281610322856103e8610b7d565b612fec8284610b7d565b81612ff357fe5b049650836001600160a01b031663022c0d9f6000898c6040518463ffffffff1660e01b8152600401613027939291906159cf565b600060405180830381600087803b15801561304157600080fd5b505af1158015613055573d6000803e3d6000fd5b505050506130e6565b61306e81610322846103e8610b7d565b6130788285610b7d565b8161307f57fe5b049650836001600160a01b031663022c0d9f8860008c6040518463ffffffff1660e01b81526004016130b3939291906159cf565b600060405180830381600087803b1580156130cd57600080fd5b505af11580156130e1573d6000803e3d6000fd5b505050505b505050505050949350505050565b6000806000846001600160a01b0316866001600160a01b03161061311957848661311c565b85855b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac838360405160200161314a929190615741565b60408051601f1981840301815290829052805160209182012061318093929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c905060006131af886001600160a01b0316610cdb565b9050600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131ed57600080fd5b505afa158015613201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132259190615645565b506001600160701b0391821693501690506000613244846103e5610b7d565b905061325a6001600160a01b038c168686610be6565b8a6001600160a01b03168a6001600160a01b031611156133005761328481610322856103e8610b7d565b61328e8284610b7d565b8161329557fe5b049750846001600160a01b031663022c0d9f60008a8c6040518463ffffffff1660e01b81526004016132c9939291906159cf565b600060405180830381600087803b1580156132e357600080fd5b505af11580156132f7573d6000803e3d6000fd5b50505050613388565b61331081610322846103e8610b7d565b61331a8285610b7d565b8161332157fe5b049750846001600160a01b031663022c0d9f8960008c6040518463ffffffff1660e01b8152600401613355939291906159cf565b600060405180830381600087803b15801561336f57600080fd5b505af1158015613383573d6000803e3d6000fd5b505050505b505050505050509392505050565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134099190615036565b9050816001600160a01b031663a0712d6861342c836001600160a01b0316610cdb565b6040518263ffffffff1660e01b81526004016134489190615d83565b602060405180830381600087803b15801561346257600080fd5b505af1158015613476573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de19190615688565b6000806134b3846120cb866001600160a01b0316610cdb565b60405163226bf2d160e21b81526001600160a01b038516906389afcb44906114219086906004016157c2565b6134f46001600160a01b03841633308461418b565b60405163db006a7560e01b81526001600160a01b0384169063db006a7590613520908490600401615d83565b602060405180830381600087803b15801561353a57600080fd5b505af115801561354e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135729190615688565b506000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e69190615036565b9050737d2768de32b0b80b7a3454c06bdac94a69ddc7a963e8eda9df826136156001600160a01b038216610cdb565b8660006040518563ffffffff1660e01b81526004016136379493929190615963565b600060405180830381600087803b15801561365157600080fd5b505af1158015613665573d6000803e3d6000fd5b5050505050505050565b60008061368c600080516020615fa383398151915233308661418b565b60405163140e25ad60e31b815273338286c0bc081891a4bda39c7667ae150bf5d2069063a0712d68906136c3908690600401615d83565b602060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137159190615688565b50600080516020615f638339815191526302b9446c73338286c0bc081891a4bda39c7667ae150bf5d20630876113ff83610cdb565b6000806137626001600160a01b03861633308661418b565b6000856001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b15801561379d57600080fd5b505afa1580156137b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d59190615036565b604051631a4ca37b60e21b8152909150737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec906138219084908890600080516020615f6383398151915290600401615940565b600060405180830381600087803b15801561383b57600080fd5b505af115801561384f573d6000803e3d6000fd5b505060405162ae511b60e21b8152600080516020615f6383398151915292506302b9446c9150611ed590849084908a908a9060009060040161599b565b6115c0816138a2846001600160a01b0316610cdb565b6001600160a01b0385169190610be6565b600080836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156138f157600080fd5b505af1158015613905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139299190615036565b9050600061393f826001600160a01b0316610cdb565b60405162ae511b60e21b8152909150600080516020615f63833981519152906302b9446c9061397b90859084908a90879060009060040161599b565b6040805180830381600087803b15801561399457600080fd5b505af11580156139a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cc91906156c4565b5050604051626d47a560e61b81526001600160a01b03861690631b51e94090611aaa90879060019086906004016157d6565b60006001600160a01b038316632317ef6783613a1983610cdb565b6040518363ffffffff1660e01b8152600401613a36929190615927565b602060405180830381600087803b158015613a5057600080fd5b505af1158015613a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a889190615688565b9392505050565b737d2768de32b0b80b7a3454c06bdac94a69ddc7a963e8eda9df83613abc6001600160a01b038216610cdb565b8460006040518563ffffffff1660e01b81526004016123769493929190615963565b60005b828110156120dc5760008030868685818110613af957fe5b9050602002810190613b0b9190615e29565b604051613b19929190615763565b600060405180830381855af49150503d8060008114613b54576040519150601f19603f3d011682016040523d82523d6000602084013e613b59565b606091505b509150915081158015613b695750835b15613b9057613b7781614396565b60405162461bcd60e51b8152600401610bb491906159fd565b5050600101613ae1565b6000546001600160a01b03163314613bc45760405162461bcd60e51b8152600401610bb490615bcf565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516378ed5d1f60e01b81526000908190600080516020615f83833981519152906378ed5d1f90613c1c908790600401615d83565b60206040518083038186803b158015613c3457600080fd5b505afa158015613c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c6c9190615036565b90506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613cab57600080fd5b505af1158015613cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce39190615036565b90506000613cf9826001600160a01b0316610cdb565b60405162ae511b60e21b8152909150600080516020615f63833981519152906302b9446c90613d3590859084908890879060009060040161599b565b6040805180830381600087803b158015613d4e57600080fd5b505af1158015613d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8691906156c4565b5050604051626d47a560e61b81526001600160a01b03841690631b51e94090613db890309060019086906004016157d6565b602060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0a9190615688565b604051638dbdbe6d60e01b8152909450600080516020615f8383398151915290638dbdbe6d90613e4290899088908a90600401615e0a565b600060405180830381600087803b158015613e5c57600080fd5b505af1158015613e70573d6000803e3d6000fd5b5050505050505092915050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d3090613ec590600080516020615f038339815191529033903090879060009060040161599b565b6040805180830381600087803b158015613ede57600080fd5b505af1158015613ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1691906156c4565b505060405163db006a7560e01b8152600080516020615f038339815191529063db006a75906114c8908490600401615d83565b600080613f56898961427b565b6040516378ed5d1f60e01b8152909150600090600080516020615f83833981519152906378ed5d1f90613f8d908a90600401615d83565b60206040518083038186803b158015613fa557600080fd5b505afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615036565b90506140228a82848989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b9250878310156140445760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528b828560405161406593929190615830565b60405180910390a1600080516020615f838339815191526001600160a01b0316638dbdbe6d88858e6040518463ffffffff1660e01b81526004016140ab93929190615e0a565b600060405180830381600087803b1580156140c557600080fd5b505af11580156140d9573d6000803e3d6000fd5b50505050505098975050505050505050565b604051638dbdbe6d60e01b8152600080516020615f8383398151915290638dbdbe6d9061116390869086908690600401615e0a565b60005b83811015610cd45761418383838381811061413a57fe5b905060200201602081019061414f919061501a565b60001987878581811061415e57fe5b9050602002016020810190614173919061501a565b6001600160a01b031691906143fe565b600101614123565b600080856001600160a01b03166323b872dd60e01b8686866040516024016141b593929190615830565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516141f39190615773565b6000604051808303816000865af19150503d8060008114614230576040519150601f19603f3d011682016040523d82523d6000602084013e614235565b606091505b509150915081801561425f57508051158061425f57508080602001905181019061425f919061547b565b6123a45760405162461bcd60e51b8152600401610bb490615d22565b60006001600160a01b0383166142b257600034116142ab5760405162461bcd60e51b8152600401610bb490615b7c565b5034610bbd565b600082116142d25760405162461bcd60e51b8152600401610bb490615b21565b34156142f05760405162461bcd60e51b8152600401610bb490615b4f565b6143056001600160a01b03841633308561418b565b50919050565b600080600080600061431c896144ec565b91509150816001600160a01b03168a6001600160a01b0316141580156143545750806001600160a01b03168a6001600160a01b031614155b15614370576143668a8a8a8a8a6145e0565b9094509250614377565b8992508793505b600080614386858585896147a3565b915091506127d984848484614970565b60606044825110156143dc575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526143f9565b600482019150818060200190518101906143f691906155bc565b90505b919050565b600080846001600160a01b031663095ea7b360e01b8585604051602401614426929190615927565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516144649190615773565b6000604051808303816000865af19150503d80600081146144a1576040519150601f19603f3d011682016040523d82523d6000602084013e6144a6565b606091505b50915091508180156144d05750805115806144d05750808060200190518101906144d0919061547b565b610cd45760405162461bcd60e51b8152600401610bb490615c8b565b6000806000839050806001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561452d57600080fd5b505afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615036565b9250806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156145a057600080fd5b505afa1580156145b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145d89190615036565b915050915091565b600080806001600160a01b0388166145f9575084614625565b8761460f6001600160a01b0382168760006143fe565b6146236001600160a01b03821687896143fe565b505b600080614631896144ec565b90925090508181600061464c6001600160a01b038416610cdb565b90506000614662836001600160a01b0316610cdb565b6001600160a01b038c1660009081526001602052604090205490915060ff1661469d5760405162461bcd60e51b8152600401610bb490615a5f565b60008b6001600160a01b0316888c6040516146b89190615773565b60006040518083038185875af1925050503d80600081146146f5576040519150601f19603f3d011682016040523d82523d6000602084013e6146fa565b606091505b505090508061471b5760405162461bcd60e51b8152600401610bb490615c23565b600061473984614733886001600160a01b0316610cdb565b90614b29565b9050600061475384614733886001600160a01b0316610cdb565b90508082111561476857819b50889a5061476f565b809b50879a505b60008c1161478f5760405162461bcd60e51b8152600401610bb490615c54565b505050505050505050509550959350505050565b600080600080856001600160a01b0316876001600160a01b0316106147c95785876147cc565b86865b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac83836040516020016147fa929190615741565b60408051601f1981840301815290829052805160209182012061483093929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561488757600080fd5b505afa15801561489b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bf9190615645565b506001600160701b031691506001600160701b03169150896001600160a01b03168b6001600160a01b0316141561492b5760006148fc838a614b4c565b90506000811161490c5750600288045b6149178c8b83614b9c565b96506149238982614b29565b975050614962565b6000614937828a614b4c565b9050600081116149475750600288045b6149528c8c83614b9c565b975061495e8982614b29565b9650505b505050505094509492505050565b600061499a6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f836143fe565b6149c36001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60006143fe565b6149eb6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f856143fe565b614a136001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846143fe565b60405162e8e33760e81b81526000908190819073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063e8e3370090614a63908b908b908b908b9060019081903090600f60fc1b9060040161589d565b606060405180830381600087803b158015614a7d57600080fd5b505af1158015614a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab59190615714565b919450925090506000614ac88785614b29565b1115614aed57614aed33614adc8886614b29565b6001600160a01b038b169190610be6565b6000614af98684614b29565b1115614b1e57614b1e33614b0d8785614b29565b6001600160a01b038a169190610be6565b979650505050505050565b80820382811115610bbd5760405162461bcd60e51b8152600401610bb490615a30565b60006107ca614b8d614b60856107cd610b7d565b614733614b88614b7388623cda29610b7d565b614b8088623cda20610b7d565b899101610b7d565b614e2d565b81614b9457fe5b049392505050565b6000826001600160a01b0316846001600160a01b03161415614bbf575080613a88565b614be86001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60006143fe565b614c106001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846143fe565b600080846001600160a01b0316866001600160a01b031610614c33578486614c36565b85855b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8383604051602001614c64929190615741565b60408051601f19818403018152908290528051602091820120614c9a93929091600080516020615ee3833981519152910161578f565b60408051601f19818403018152919052805160209091012090506001600160a01b038116614cda5760405162461bcd60e51b8152600401610bb490615cf7565b6040805160028082526060820183526000926020830190803683370190505090508781600081518110614d0957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110614d3757fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990614d9390899060019086903090600f60fc1b90600401615d8c565b600060405180830381600087803b158015614dad57600080fd5b505af1158015614dc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614de991908101906153bf565b600182510381518110614df857fe5b6020026020010151945060008511614e225760405162461bcd60e51b8152600401610bb490615bf2565b505050509392505050565b600081614e3c575060006143f9565b816001600160801b8210614e555760809190911c9060401b5b600160401b8210614e6b5760409190911c9060201b5b6401000000008210614e825760209190911c9060101b5b620100008210614e975760109190911c9060081b5b6101008210614eab5760089190911c9060041b5b60108210614ebe5760049190911c9060021b5b60088210614eca5760011b5b6001818581614ed557fe5b048201901c90506001818581614ee757fe5b048201901c90506001818581614ef957fe5b048201901c90506001818581614f0b57fe5b048201901c90506001818581614f1d57fe5b048201901c90506001818581614f2f57fe5b048201901c90506001818581614f4157fe5b048201901c90506000818581614f5357fe5b049050808210614f635780611afc565b509392505050565b60008083601f840112614f7c578182fd5b5081356001600160401b03811115614f92578182fd5b6020830191508360208083028501011115614fac57600080fd5b9250929050565b60008083601f840112614fc4578182fd5b5081356001600160401b03811115614fda578182fd5b602083019150836020828501011115614fac57600080fd5b80516001600160701b03811681146143f957600080fd5b803560ff811681146143f957600080fd5b60006020828403121561502b578081fd5b8135613a8881615ebc565b600060208284031215615047578081fd5b8151613a8881615ebc565b60008060408385031215615064578081fd5b823561506f81615ebc565b9150602083013561507f81615ebc565b809150509250929050565b60008060006060848603121561509e578081fd5b83356150a981615ebc565b925060208401356150b981615ebc565b915060408401356150c981615ebc565b809150509250925092565b600080600080608085870312156150e9578081fd5b84356150f481615ebc565b9350602085013561510481615ebc565b9250604085013561511481615ebc565b9396929550929360600135925050565b60008060008060008060008060e0898b03121561513f578586fd5b883561514a81615ebc565b9750602089013561515a81615ebc565b9650604089013561516a81615ebc565b9550606089013594506080890135935060a089013561518881615ebc565b925060c08901356001600160401b038111156151a2578283fd5b6151ae8b828c01614fb3565b999c989b5096995094979396929594505050565b60008060008060008060c087890312156151da578384fd5b86356151e581615ebc565b955060208701356151f581615ebc565b9450604087013561520581615ed4565b935061521360608801615009565b92506080870135915060a087013590509295509295509295565b60008060008060008060008060e0898b03121561513f578182fd5b60008060006060848603121561525c578081fd5b833561526781615ebc565b9250602084013561527781615ebc565b929592945050506040919091013590565b60008060008060008060008060e0898b0312156152a3578182fd5b88356152ae81615ebc565b975060208901356152be81615ebc565b965060408901359550606089013594506080890135935060a089013561518881615ebc565b600080604083850312156152f5578182fd5b823561530081615ebc565b946020939093013593505050565b60008060008060408587031215615323578182fd5b84356001600160401b0380821115615339578384fd5b61534588838901614f6b565b9096509450602087013591508082111561535d578384fd5b5061536a87828801614f6b565b95989497509550505050565b60008060006040848603121561538a578081fd5b83356001600160401b0381111561539f578182fd5b6153ab86828701614f6b565b90945092505060208401356150c981615ed4565b600060208083850312156153d1578182fd5b82516001600160401b03808211156153e7578384fd5b818501915085601f8301126153fa578384fd5b81518181111561540657fe5b8381029150615416848301615e6d565b8181528481019084860184860187018a1015615430578788fd5b8795505b83861015615452578051835260019590950194918601918601615434565b5098975050505050505050565b600060208284031215615470578081fd5b8135613a8881615ed4565b60006020828403121561548c578081fd5b8151613a8881615ed4565b60008060008060008060008060006101208a8c0312156154b5578283fd5b89356154c081615ebc565b985060208a01356154d081615ebc565b975060408a01356154e081615ebc565b965060608a0135955060808a0135945060a08a01356154fe81615ed4565b935061550c60c08b01615009565b925060e08a013591506101008a013590509295985092959850929598565b60008060408385031215615064578182fd5b600080600080600080600080610100898b031215615558578182fd5b883561556381615ebc565b9750602089013561557381615ebc565b9650604089013561558381615ebc565b9550606089013594506080890135935061559f60a08a01615009565b925060c0890135915060e089013590509295985092959890939650565b6000602082840312156155cd578081fd5b81516001600160401b03808211156155e3578283fd5b818401915084601f8301126155f6578283fd5b81518181111561560257fe5b615615601f8201601f1916602001615e6d565b915080825285602082850101111561562b578384fd5b61563c816020840160208601615e90565b50949350505050565b600080600060608486031215615659578081fd5b61566284614ff2565b925061567060208501614ff2565b9150604084015163ffffffff811681146150c9578182fd5b600060208284031215615699578081fd5b5051919050565b600080604083850312156156b2578182fd5b82359150602083013561507f81615ebc565b600080604083850312156156d6578182fd5b505080516020909101519092909150565b6000806000606084860312156156fb578081fd5b833592506020840135915060408401356150c981615ebc565b600080600060608486031215615728578081fd5b8351925060208401519150604084015190509250925092565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6000828483379101908152919050565b60008251615785818460208701615e90565b9190910192915050565b6001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683529015156020830152604082015260600190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b901515815260200190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b92835260208301919091526001600160a01b0316604082015260806060820181905260009082015260a00190565b6000602082528251806020840152615a1c816040850160208701615e90565b601f01601f19169190910160400192915050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526015908201527415185c99d95d081b9bdd08105d5d1a1bdc9a5e9959605a1b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b602080825260149082015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604082015260600190565b60208082526013908201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604082015260600190565b6020808252600b908201526a139bc8195d1a081cd95b9d60aa1b604082015260600190565b602080825260149082015273092dcecc2d8d2c84092dce0eae840d8cadccee8d60631b604082015260600190565b60208082526009908201526810b3b7bb32b93737b960b91b604082015260600190565b60208082526017908201527622b93937b91029bbb0b83834b733902a37b5b2b739901960491b604082015260600190565b6020808252601790820152764572726f72205377617070696e6720546f6b656e73203160481b604082015260600190565b6020808252601f908201527f5377617070656420746f20496e76616c696420496e7465726d65646961746500604082015260600190565b6020808252601b908201527a109bdc9a5b99d15490cc8c0e88105c1c1c9bdd994819985a5b1959602a1b604082015260600190565b6020808252601d908201527f426f72696e6745524332303a2042616c616e63654f66206661696c6564000000604082015260600190565b6020808252601190820152704e6f205377617020417661696c61626c6560781b604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601290820152714552523a204869676820536c69707061676560701b604082015260600190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615ddb5784516001600160a01b031683529383019391830191600101615db6565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b6000808335601e19843603018112615e3f578283fd5b8301803591506001600160401b03821115615e58578283fd5b602001915036819003821315614fac57600080fd5b6040518181016001600160401b0381118282101715615e8857fe5b604052919050565b60005b83811015615eab578181015183820152602001615e93565b838111156120dc5750506000910152565b6001600160a01b0381168114615ed157600080fd5b50565b8015158114615ed157600080fdfee18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303000000000000000000000000228619cca194fbe3ebeb2f835ec1ea5080dafbb20000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff42724fd86e42fdf9189d86bda34d3e693c24264ea2b54ff7796d9e1d40f5e29f4f59000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2a264697066735822122089a5125d850fb87a89b52e2cb580c7d062e507e61b962188e0983cbea998b8cd64736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102625760003560e01c8063839a9c4211610145578063b5955512116100bc578063b5955512146109f7578063b6d16b9414610a17578063bb29578a14610a37578063bdcbf5c314610a57578063c52f3bee14610a77578063caf11a3914610a97578063d2423b5114610ab7578063d38bfff414610aca578063d5eaa84014610aea578063dbbc3b0a14610b0a578063e30dbe7a14610b2a578063efaad98a14610b3d578063f23f8fdd14610b5d57610571565b8063839a9c421461089157806389bd8bf1146108a45780639735a634146108c45780639779d1a6146108e45780639821dad514610911578063a51973a214610924578063a582777314610944578063a9678a1814610957578063a9a5171314610977578063ab35a94b14610997578063b2bd5c96146109b7578063b393d953146109d757610571565b80635294b8b7116101d95780635294b8b71461071e5780635a93b873146107315780635bb555dd1461075157806362fe2949146107715780636621318e14610791578063699bdfa2146107b157806371af7c07146107d1578063741f815b146107f157806378107161146108115780637bfa252c146108315780637c516e941461085157806381f919c51461087157610571565b806301e33667146105765780630c340a241461059857806313bfdfe5146105c357806317340206146105f05780631a9d663f146106105780631cb7fe891461063e578063310c65551461065e578063339dae191461067e5780633b2effdb1461069e5780633cf7123d146106be5780633f4e090a146106de5780634ec3a4d7146106fe57610571565b366105715760008073795065dcc9f64b5614c407a6efdc400da6221fb06001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156102b757600080fd5b505afa1580156102cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ef9190615645565b506001600160701b039182169350169050600061030e346103e5610b7d565b9050600061032882610322856103e8610b7d565b90610bc3565b6103328386610b7d565b8161033957fe5b04905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b506103db935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2925073795065dcc9f64b5614c407a6efdc400da6221fb09150349050610be6565b60405163022c0d9f60e01b815273795065dcc9f64b5614c407a6efdc400da6221fb09063022c0d9f9061041790849060009030906004016159cf565b600060405180830381600087803b15801561043157600080fd5b505af1158015610445573d6000803e3d6000fd5b50600080516020615f23833981519152925063a59f3e0c91506104779050600080516020615fa3833981519152610cdb565b6040518263ffffffff1660e01b81526004016104939190615d83565b600060405180830381600087803b1580156104ad57600080fd5b505af11580156104c1573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f23833981519152905030336104f683610cdb565b60006040518663ffffffff1660e01b815260040161051895949392919061599b565b6040805180830381600087803b15801561053157600080fd5b505af1158015610545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056991906156c4565b505050505050005b600080fd5b34801561058257600080fd5b50610596610591366004615248565b610dcd565b005b3480156105a457600080fd5b506105ad610de6565b6040516105ba91906157c2565b60405180910390f35b3480156105cf57600080fd5b506105e36105de3660046156e7565b610df5565b6040516105ba9190615d83565b3480156105fc57600080fd5b5061059661060b366004615248565b611098565b34801561061c57600080fd5b5061063061062b366004615248565b61119a565b6040516105ba929190615dfc565b34801561064a57600080fd5b506106306106593660046152e3565b6112b4565b34801561066a57600080fd5b506105966106793660046152e3565b61147d565b34801561068a57600080fd5b506105966106993660046152e3565b6115c4565b3480156106aa57600080fd5b506105966106b93660046152e3565b61170a565b3480156106ca57600080fd5b506105966106d93660046152e3565b6117d6565b3480156106ea57600080fd5b506106306106f93660046152e3565b6118a2565b34801561070a57600080fd5b506105e3610719366004615248565b611953565b6105e361072c366004615124565b611b05565b34801561073d57600080fd5b5061059661074c366004615497565b611c3b565b34801561075d57600080fd5b5061059661076c3660046156a0565b611cb2565b34801561077d57600080fd5b5061063061078c366004615248565b611d7e565b34801561079d57600080fd5b506105966107ac366004615248565b611f33565b3480156107bd57600080fd5b506105966107cc3660046151c2565b6120e2565b3480156107dd57600080fd5b506105966107ec3660046152e3565b612157565b3480156107fd57600080fd5b5061059661080c3660046152e3565b6122a2565b34801561081d57600080fd5b5061059661082c366004615052565b6123ac565b34801561083d57600080fd5b5061059661084c36600461501a565b61246d565b34801561085d57600080fd5b5061059661086c36600461553c565b6124f3565b34801561087d57600080fd5b5061063061088c36600461552a565b612567565b6105e361089f36600461522d565b612593565b3480156108b057600080fd5b506105966108bf3660046150d4565b6127e9565b3480156108d057600080fd5b506105966108df36600461530e565b612976565b3480156108f057600080fd5b506109046108ff36600461501a565b612a40565b6040516105ba9190615990565b61063061091f36600461501a565b612a55565b34801561093057600080fd5b5061063061093f366004615248565b612d62565b6105e3610952366004615124565b612da6565b34801561096357600080fd5b506105e36109723660046150d4565b612e67565b34801561098357600080fd5b506105e361099236600461508a565b6130f4565b3480156109a357600080fd5b506105966109b236600461501a565b613396565b3480156109c357600080fd5b506106306109d2366004615052565b61349a565b3480156109e357600080fd5b506105966109f2366004615248565b6134df565b348015610a0357600080fd5b50610630610a123660046152e3565b61366f565b348015610a2357600080fd5b50610630610a32366004615248565b61374a565b348015610a4357600080fd5b50610596610a5236600461552a565b61388c565b348015610a6357600080fd5b506105e3610a7236600461552a565b6138b3565b348015610a8357600080fd5b506105e3610a92366004615052565b6139fe565b348015610aa357600080fd5b50610596610ab2366004615052565b613a8f565b610596610ac5366004615376565b613ade565b348015610ad657600080fd5b50610596610ae536600461501a565b613b9a565b348015610af657600080fd5b506105e3610b053660046156a0565b613be6565b348015610b1657600080fd5b50610596610b253660046152e3565b613e7d565b6105e3610b38366004615288565b613f49565b348015610b4957600080fd5b50610596610b583660046156e7565b6140eb565b348015610b6957600080fd5b50610596610b7836600461530e565b614120565b6000811580610b9857505080820282828281610b9557fe5b04145b610bbd5760405162461bcd60e51b8152600401610bb490615ac5565b60405180910390fd5b92915050565b80820182811015610bbd5760405162461bcd60e51b8152600401610bb490615af3565b600080846001600160a01b031663a9059cbb60e01b8585604051602401610c0e929190615927565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610c4c9190615773565b6000604051808303816000865af19150503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b5091509150818015610cb8575080511580610cb8575080806020019051810190610cb8919061547b565b610cd45760405162461bcd60e51b8152600401610bb490615a8e565b5050505050565b6000806000836001600160a01b03166370a0823160e01b30604051602401610d0391906157c2565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610d419190615773565b600060405180830381855afa9150503d8060008114610d7c576040519150601f19603f3d011682016040523d82523d6000602084013e610d81565b606091505b5091509150818015610d9557506020815110155b610db15760405162461bcd60e51b8152600401610bb490615cc0565b80806020019051810190610dc59190615688565b949350505050565b610de16001600160a01b0384168383610be6565b505050565b6000546001600160a01b031681565b6040516378ed5d1f60e01b81526000908190600080516020615f83833981519152906378ed5d1f90610e2b908890600401615d83565b60206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b9190615036565b90506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef29190615036565b9050610f176001600160a01b03821633600080516020615f638339815191528861418b565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90610f50908490849087908b9060009060040161599b565b6040805180830381600087803b158015610f6957600080fd5b505af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906156c4565b5050604051626d47a560e61b81526001600160a01b03831690631b51e94090610fd39030906001908a906004016157d6565b602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110259190615688565b604051638dbdbe6d60e01b8152909350600080516020615f8383398151915290638dbdbe6d9061105d90899087908990600401615e0a565b600060405180830381600087803b15801561107757600080fd5b505af115801561108b573d6000803e3d6000fd5b5050505050509392505050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d30906110d290869033903090879060009060040161599b565b6040805180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906156c4565b505060405163e8eda9df60e01b8152737d2768de32b0b80b7a3454c06bdac94a69ddc7a99063e8eda9df9061116390869085908790600090600401615963565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b50505050505050565b60405163097da6d360e41b81526000908190600080516020615f63833981519152906397da6d30906111d8908890339082908990889060040161599b565b6040805180830381600087803b1580156111f157600080fd5b505af1158015611205573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122991906156c4565b505060405163226bf2d160e21b81526001600160a01b038616906389afcb44906112579087906004016157c2565b6040805180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906156c4565b90969095509350505050565b6000806112d1600080516020615fa383398151915233308661418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c90611302908690600401615d83565b600060405180830381600087803b15801561131c57600080fd5b505af1158015611330573d6000803e3d6000fd5b50600080516020615f03833981519152925063a0712d6891506113629050600080516020615f23833981519152610cdb565b6040518263ffffffff1660e01b815260040161137e9190615d83565b602060405180830381600087803b15801561139857600080fd5b505af11580156113ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d09190615688565b50600080516020615f638339815191526302b9446c600080516020615f0383398151915230876113ff83610cdb565b60006040518663ffffffff1660e01b815260040161142195949392919061599b565b6040805180830381600087803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147291906156c4565b909590945092505050565b611497600080516020615f0383398151915233308461418b565b60405163db006a7560e01b8152600080516020615f038339815191529063db006a75906114c8908490600401615d83565b602060405180830381600087803b1580156114e257600080fd5b505af11580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a9190615688565b50600080516020615f238339815191526367dfd4c961153882610cdb565b6040518263ffffffff1660e01b81526004016115549190615d83565b600060405180830381600087803b15801561156e57600080fd5b505af1158015611582573d6000803e3d6000fd5b505050506115c0826115aa600080516020615fa38339815191526001600160a01b0316610cdb565b600080516020615fa38339815191529190610be6565b5050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d30906116129073338286c0bc081891a4bda39c7667ae150bf5d2069033903090879060009060040161599b565b6040805180830381600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906156c4565b505060405163db006a7560e01b815273338286c0bc081891a4bda39c7667ae150bf5d2069063db006a759061169c908490600401615d83565b602060405180830381600087803b1580156116b657600080fd5b505af11580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190615688565b506115c0826115aa600080516020615fa3833981519152610cdb565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d309061175290600080516020615f238339815191529033903090879060009060040161599b565b6040805180830381600087803b15801561176b57600080fd5b505af115801561177f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a391906156c4565b50506040516367dfd4c960e01b8152600080516020615f23833981519152906367dfd4c990611554908490600401615d83565b6117f673f256cc7847e919fac9b808cc216cac87ccf2f47a33308461418b565b604051631a4ca37b60e21b8152737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec9061183f90600080516020615f238339815191529085903090600401615940565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b50506040516367dfd4c960e01b8152600080516020615f2383398151915292506367dfd4c99150611554908490600401615d83565b6000806118bf600080516020615fa383398151915233308661418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906118f0908690600401615d83565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f23833981519152905030876113ff83610cdb565b600080846001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561199157600080fd5b505af11580156119a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c99190615036565b90506119ee6001600160a01b03821633600080516020615f638339815191528661418b565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90611a2790849084908a90899060009060040161599b565b6040805180830381600087803b158015611a4057600080fd5b505af1158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7891906156c4565b5050604051626d47a560e61b81526001600160a01b03861690631b51e94090611aaa90879060019088906004016157d6565b602060405180830381600087803b158015611ac457600080fd5b505af1158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc9190615688565b95945050505050565b600080611b12898861427b565b9050611b578989838888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b915085821015611b795760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528a8984604051611b9a93929190615830565b60405180910390a160405162ae511b60e21b8152600080516020615f63833981519152906302b9446c90611bdb908b9030908f90889060009060040161599b565b6040805180830381600087803b158015611bf457600080fd5b505af1158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c91906156c4565b50505098975050505050505050565b6040516323f2ebc360e21b81526001600160a01b038a1690638fcbaf0c90611c75908b908b908b908b908b908b908b908b90600401615854565b600060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b50505050505050505050505050565b6040516378ed5d1f60e01b8152600090600080516020615f83833981519152906378ed5d1f90611ce6908690600401615d83565b60206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190615036565b9050600080516020615f83833981519152638dbdbe6d84611d5f6001600160a01b038516610cdb565b856040518463ffffffff1660e01b815260040161116393929190615e0a565b600080611d966001600160a01b03861633308661418b565b60405163db006a7560e01b81526001600160a01b0386169063db006a7590611dc2908690600401615d83565b602060405180830381600087803b158015611ddc57600080fd5b505af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190615688565b506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5057600080fd5b505afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190615036565b9050600080516020615f638339815191526302b9446c823088611eb36001600160a01b038416610cdb565b60006040518663ffffffff1660e01b8152600401611ed595949392919061599b565b6040805180830381600087803b158015611eee57600080fd5b505af1158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906156c4565b9097909650945050505050565b6000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190615036565b60405163097da6d360e41b8152909150600080516020615f63833981519152906397da6d3090611fe390849033903090889060009060040161599b565b6040805180830381600087803b158015611ffc57600080fd5b505af1158015612010573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203491906156c4565b505060405163140e25ad60e31b81526001600160a01b0385169063a0712d6890612062908590600401615d83565b602060405180830381600087803b15801561207c57600080fd5b505af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190615688565b506120dc836120cb866001600160a01b0316610cdb565b6001600160a01b0387169190610be6565b50505050565b60405163c0a47c9360e01b8152600080516020615f638339815191529063c0a47c939061211d908990899089908990899089906004016157f7565b600060405180830381600087803b15801561213757600080fd5b505af115801561214b573d6000803e3d6000fd5b50505050505050505050565b612171600080516020615fa383398151915233308461418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906121a2908490600401615d83565b600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b50600080516020615f03833981519152925063a0712d6891506122029050600080516020615f23833981519152610cdb565b6040518263ffffffff1660e01b815260040161221e9190615d83565b602060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122709190615688565b506115c08261228c600080516020615f03833981519152610cdb565b600080516020615f038339815191529190610be6565b6122bc600080516020615fa383398151915233308461418b565b604051632967cf8360e21b8152600080516020615f238339815191529063a59f3e0c906122ed908490600401615d83565b600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b50737d2768de32b0b80b7a3454c06bdac94a69ddc7a9925063e8eda9df9150600080516020615f23833981519152905061235481610cdb565b8560006040518563ffffffff1660e01b81526004016123769493929190615963565b600060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050505050565b6000826001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123e757600080fd5b505afa1580156123fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241f9190615036565b9050737d2768de32b0b80b7a3454c06bdac94a69ddc7a96369328dec8261244e6001600160a01b038716610cdb565b856040518463ffffffff1660e01b815260040161116393929190615940565b6001600160a01b03811663db006a7561248582610cdb565b6040518263ffffffff1660e01b81526004016124a19190615d83565b602060405180830381600087803b1580156124bb57600080fd5b505af11580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c09190615688565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061252b908a908a908a908a908a908a908a906004016158e6565b600060405180830381600087803b15801561254557600080fd5b505af1158015612559573d6000803e3d6000fd5b505050505050505050505050565b600080600080516020615f638339815191526302b9446c8530866113ff6001600160a01b038416610cdb565b6000806125a0898861427b565b90506000886001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126179190615036565b9050600061265e8b83858a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b9050878110156126805760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528c83836040516126a193929190615830565b60405180910390a16126cb6001600160a01b038316600080516020615f6383398151915283610be6565b60405162ae511b60e21b8152600080516020615f63833981519152906302b9446c9061270490859084908f90879060009060040161599b565b6040805180830381600087803b15801561271d57600080fd5b505af1158015612731573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275591906156c4565b5050604051626d47a560e61b81526001600160a01b038b1690631b51e94090612787908f9060019086906004016157d6565b602060405180830381600087803b1580156127a157600080fd5b505af11580156127b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d99190615688565b9c9b505050505050505050505050565b6127fe6001600160a01b03851633308461418b565b6000846001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b15801561283957600080fd5b505afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128719190615036565b604051631a4ca37b60e21b8152909150737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec906128af90849086903090600401615940565b600060405180830381600087803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b505060405163140e25ad60e31b81526001600160a01b038716925063a0712d68915061290d908590600401615d83565b602060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295f9190615688565b50610cd4836120cb866001600160a01b0316610cdb565b6000546001600160a01b031633146129a05760405162461bcd60e51b8152600401610bb490615bcf565b8281146129bf5760405162461bcd60e51b8152600401610bb490615ba1565b60005b83811015610cd4578282828181106129d657fe5b90506020020160208101906129eb919061545f565b600160008787858181106129fb57fe5b9050602002016020810190612a10919061501a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016129c2565b60016020526000908152604090205460ff1681565b60008060008073795065dcc9f64b5614c407a6efdc400da6221fb06001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae09190615645565b506001600160701b0391821693501690506000612aff346103e5610b7d565b90506000612b1382610322856103e8610b7d565b612b1d8386610b7d565b81612b2457fe5b04905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b7657600080fd5b505af1158015612b8a573d6000803e3d6000fd5b50612bc6935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2925073795065dcc9f64b5614c407a6efdc400da6221fb09150349050610be6565b60405163022c0d9f60e01b815273795065dcc9f64b5614c407a6efdc400da6221fb09063022c0d9f90612c0290849060009030906004016159cf565b600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b50600080516020615f23833981519152925063a59f3e0c9150612c629050600080516020615fa3833981519152610cdb565b6040518263ffffffff1660e01b8152600401612c7e9190615d83565b600060405180830381600087803b158015612c9857600080fd5b505af1158015612cac573d6000803e3d6000fd5b50600080516020615f6383398151915292506302b9446c9150600080516020615f238339815191529050308a612ce183610cdb565b60006040518663ffffffff1660e01b8152600401612d0395949392919061599b565b6040805180830381600087803b158015612d1c57600080fd5b505af1158015612d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5491906156c4565b909890975095505050505050565b600080612d7a6001600160a01b03861633878661418b565b60405163226bf2d160e21b81526001600160a01b038616906389afcb44906112579087906004016157c2565b600080612db3898861427b565b90506000612dfa8a8a848989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b905086811015612e1c5760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528b8a83604051612e3d93929190615830565b60405180910390a1612e596001600160a01b038a168c83610be6565b9a9950505050505050505050565b6000806000856001600160a01b0316876001600160a01b031610612e8c578587612e8f565b86865b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8383604051602001612ebd929190615741565b60408051601f19818403018152908290528051602091820120612ef393929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612f4a57600080fd5b505afa158015612f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f829190615645565b506001600160701b0391821693501690506000612fa1886103e5610b7d565b9050612fb86001600160a01b038c1633868b61418b565b8a6001600160a01b03168a6001600160a01b0316111561305e57612fe281610322856103e8610b7d565b612fec8284610b7d565b81612ff357fe5b049650836001600160a01b031663022c0d9f6000898c6040518463ffffffff1660e01b8152600401613027939291906159cf565b600060405180830381600087803b15801561304157600080fd5b505af1158015613055573d6000803e3d6000fd5b505050506130e6565b61306e81610322846103e8610b7d565b6130788285610b7d565b8161307f57fe5b049650836001600160a01b031663022c0d9f8860008c6040518463ffffffff1660e01b81526004016130b3939291906159cf565b600060405180830381600087803b1580156130cd57600080fd5b505af11580156130e1573d6000803e3d6000fd5b505050505b505050505050949350505050565b6000806000846001600160a01b0316866001600160a01b03161061311957848661311c565b85855b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac838360405160200161314a929190615741565b60408051601f1981840301815290829052805160209182012061318093929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c905060006131af886001600160a01b0316610cdb565b9050600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131ed57600080fd5b505afa158015613201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132259190615645565b506001600160701b0391821693501690506000613244846103e5610b7d565b905061325a6001600160a01b038c168686610be6565b8a6001600160a01b03168a6001600160a01b031611156133005761328481610322856103e8610b7d565b61328e8284610b7d565b8161329557fe5b049750846001600160a01b031663022c0d9f60008a8c6040518463ffffffff1660e01b81526004016132c9939291906159cf565b600060405180830381600087803b1580156132e357600080fd5b505af11580156132f7573d6000803e3d6000fd5b50505050613388565b61331081610322846103e8610b7d565b61331a8285610b7d565b8161332157fe5b049750846001600160a01b031663022c0d9f8960008c6040518463ffffffff1660e01b8152600401613355939291906159cf565b600060405180830381600087803b15801561336f57600080fd5b505af1158015613383573d6000803e3d6000fd5b505050505b505050505050509392505050565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134099190615036565b9050816001600160a01b031663a0712d6861342c836001600160a01b0316610cdb565b6040518263ffffffff1660e01b81526004016134489190615d83565b602060405180830381600087803b15801561346257600080fd5b505af1158015613476573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de19190615688565b6000806134b3846120cb866001600160a01b0316610cdb565b60405163226bf2d160e21b81526001600160a01b038516906389afcb44906114219086906004016157c2565b6134f46001600160a01b03841633308461418b565b60405163db006a7560e01b81526001600160a01b0384169063db006a7590613520908490600401615d83565b602060405180830381600087803b15801561353a57600080fd5b505af115801561354e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135729190615688565b506000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ae57600080fd5b505afa1580156135c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e69190615036565b9050737d2768de32b0b80b7a3454c06bdac94a69ddc7a963e8eda9df826136156001600160a01b038216610cdb565b8660006040518563ffffffff1660e01b81526004016136379493929190615963565b600060405180830381600087803b15801561365157600080fd5b505af1158015613665573d6000803e3d6000fd5b5050505050505050565b60008061368c600080516020615fa383398151915233308661418b565b60405163140e25ad60e31b815273338286c0bc081891a4bda39c7667ae150bf5d2069063a0712d68906136c3908690600401615d83565b602060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137159190615688565b50600080516020615f638339815191526302b9446c73338286c0bc081891a4bda39c7667ae150bf5d20630876113ff83610cdb565b6000806137626001600160a01b03861633308661418b565b6000856001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b15801561379d57600080fd5b505afa1580156137b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d59190615036565b604051631a4ca37b60e21b8152909150737d2768de32b0b80b7a3454c06bdac94a69ddc7a9906369328dec906138219084908890600080516020615f6383398151915290600401615940565b600060405180830381600087803b15801561383b57600080fd5b505af115801561384f573d6000803e3d6000fd5b505060405162ae511b60e21b8152600080516020615f6383398151915292506302b9446c9150611ed590849084908a908a9060009060040161599b565b6115c0816138a2846001600160a01b0316610cdb565b6001600160a01b0385169190610be6565b600080836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156138f157600080fd5b505af1158015613905573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139299190615036565b9050600061393f826001600160a01b0316610cdb565b60405162ae511b60e21b8152909150600080516020615f63833981519152906302b9446c9061397b90859084908a90879060009060040161599b565b6040805180830381600087803b15801561399457600080fd5b505af11580156139a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cc91906156c4565b5050604051626d47a560e61b81526001600160a01b03861690631b51e94090611aaa90879060019086906004016157d6565b60006001600160a01b038316632317ef6783613a1983610cdb565b6040518363ffffffff1660e01b8152600401613a36929190615927565b602060405180830381600087803b158015613a5057600080fd5b505af1158015613a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a889190615688565b9392505050565b737d2768de32b0b80b7a3454c06bdac94a69ddc7a963e8eda9df83613abc6001600160a01b038216610cdb565b8460006040518563ffffffff1660e01b81526004016123769493929190615963565b60005b828110156120dc5760008030868685818110613af957fe5b9050602002810190613b0b9190615e29565b604051613b19929190615763565b600060405180830381855af49150503d8060008114613b54576040519150601f19603f3d011682016040523d82523d6000602084013e613b59565b606091505b509150915081158015613b695750835b15613b9057613b7781614396565b60405162461bcd60e51b8152600401610bb491906159fd565b5050600101613ae1565b6000546001600160a01b03163314613bc45760405162461bcd60e51b8152600401610bb490615bcf565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516378ed5d1f60e01b81526000908190600080516020615f83833981519152906378ed5d1f90613c1c908790600401615d83565b60206040518083038186803b158015613c3457600080fd5b505afa158015613c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c6c9190615036565b90506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613cab57600080fd5b505af1158015613cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce39190615036565b90506000613cf9826001600160a01b0316610cdb565b60405162ae511b60e21b8152909150600080516020615f63833981519152906302b9446c90613d3590859084908890879060009060040161599b565b6040805180830381600087803b158015613d4e57600080fd5b505af1158015613d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8691906156c4565b5050604051626d47a560e61b81526001600160a01b03841690631b51e94090613db890309060019086906004016157d6565b602060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0a9190615688565b604051638dbdbe6d60e01b8152909450600080516020615f8383398151915290638dbdbe6d90613e4290899088908a90600401615e0a565b600060405180830381600087803b158015613e5c57600080fd5b505af1158015613e70573d6000803e3d6000fd5b5050505050505092915050565b60405163097da6d360e41b8152600080516020615f63833981519152906397da6d3090613ec590600080516020615f038339815191529033903090879060009060040161599b565b6040805180830381600087803b158015613ede57600080fd5b505af1158015613ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1691906156c4565b505060405163db006a7560e01b8152600080516020615f038339815191529063db006a75906114c8908490600401615d83565b600080613f56898961427b565b6040516378ed5d1f60e01b8152909150600090600080516020615f83833981519152906378ed5d1f90613f8d908a90600401615d83565b60206040518083038186803b158015613fa557600080fd5b505afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615036565b90506140228a82848989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061430b92505050565b9250878310156140445760405162461bcd60e51b8152600401610bb490615d57565b600080516020615f438339815191528b828560405161406593929190615830565b60405180910390a1600080516020615f838339815191526001600160a01b0316638dbdbe6d88858e6040518463ffffffff1660e01b81526004016140ab93929190615e0a565b600060405180830381600087803b1580156140c557600080fd5b505af11580156140d9573d6000803e3d6000fd5b50505050505098975050505050505050565b604051638dbdbe6d60e01b8152600080516020615f8383398151915290638dbdbe6d9061116390869086908690600401615e0a565b60005b83811015610cd45761418383838381811061413a57fe5b905060200201602081019061414f919061501a565b60001987878581811061415e57fe5b9050602002016020810190614173919061501a565b6001600160a01b031691906143fe565b600101614123565b600080856001600160a01b03166323b872dd60e01b8686866040516024016141b593929190615830565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516141f39190615773565b6000604051808303816000865af19150503d8060008114614230576040519150601f19603f3d011682016040523d82523d6000602084013e614235565b606091505b509150915081801561425f57508051158061425f57508080602001905181019061425f919061547b565b6123a45760405162461bcd60e51b8152600401610bb490615d22565b60006001600160a01b0383166142b257600034116142ab5760405162461bcd60e51b8152600401610bb490615b7c565b5034610bbd565b600082116142d25760405162461bcd60e51b8152600401610bb490615b21565b34156142f05760405162461bcd60e51b8152600401610bb490615b4f565b6143056001600160a01b03841633308561418b565b50919050565b600080600080600061431c896144ec565b91509150816001600160a01b03168a6001600160a01b0316141580156143545750806001600160a01b03168a6001600160a01b031614155b15614370576143668a8a8a8a8a6145e0565b9094509250614377565b8992508793505b600080614386858585896147a3565b915091506127d984848484614970565b60606044825110156143dc575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526143f9565b600482019150818060200190518101906143f691906155bc565b90505b919050565b600080846001600160a01b031663095ea7b360e01b8585604051602401614426929190615927565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516144649190615773565b6000604051808303816000865af19150503d80600081146144a1576040519150601f19603f3d011682016040523d82523d6000602084013e6144a6565b606091505b50915091508180156144d05750805115806144d05750808060200190518101906144d0919061547b565b610cd45760405162461bcd60e51b8152600401610bb490615c8b565b6000806000839050806001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561452d57600080fd5b505afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615036565b9250806001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156145a057600080fd5b505afa1580156145b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145d89190615036565b915050915091565b600080806001600160a01b0388166145f9575084614625565b8761460f6001600160a01b0382168760006143fe565b6146236001600160a01b03821687896143fe565b505b600080614631896144ec565b90925090508181600061464c6001600160a01b038416610cdb565b90506000614662836001600160a01b0316610cdb565b6001600160a01b038c1660009081526001602052604090205490915060ff1661469d5760405162461bcd60e51b8152600401610bb490615a5f565b60008b6001600160a01b0316888c6040516146b89190615773565b60006040518083038185875af1925050503d80600081146146f5576040519150601f19603f3d011682016040523d82523d6000602084013e6146fa565b606091505b505090508061471b5760405162461bcd60e51b8152600401610bb490615c23565b600061473984614733886001600160a01b0316610cdb565b90614b29565b9050600061475384614733886001600160a01b0316610cdb565b90508082111561476857819b50889a5061476f565b809b50879a505b60008c1161478f5760405162461bcd60e51b8152600401610bb490615c54565b505050505050505050509550959350505050565b600080600080856001600160a01b0316876001600160a01b0316106147c95785876147cc565b86865b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac83836040516020016147fa929190615741565b60408051601f1981840301815290829052805160209182012061483093929091600080516020615ee3833981519152910161578f565b6040516020818303038152906040528051906020012060001c9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561488757600080fd5b505afa15801561489b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bf9190615645565b506001600160701b031691506001600160701b03169150896001600160a01b03168b6001600160a01b0316141561492b5760006148fc838a614b4c565b90506000811161490c5750600288045b6149178c8b83614b9c565b96506149238982614b29565b975050614962565b6000614937828a614b4c565b9050600081116149475750600288045b6149528c8c83614b9c565b975061495e8982614b29565b9650505b505050505094509492505050565b600061499a6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f836143fe565b6149c36001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60006143fe565b6149eb6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f856143fe565b614a136001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846143fe565b60405162e8e33760e81b81526000908190819073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063e8e3370090614a63908b908b908b908b9060019081903090600f60fc1b9060040161589d565b606060405180830381600087803b158015614a7d57600080fd5b505af1158015614a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab59190615714565b919450925090506000614ac88785614b29565b1115614aed57614aed33614adc8886614b29565b6001600160a01b038b169190610be6565b6000614af98684614b29565b1115614b1e57614b1e33614b0d8785614b29565b6001600160a01b038a169190610be6565b979650505050505050565b80820382811115610bbd5760405162461bcd60e51b8152600401610bb490615a30565b60006107ca614b8d614b60856107cd610b7d565b614733614b88614b7388623cda29610b7d565b614b8088623cda20610b7d565b899101610b7d565b614e2d565b81614b9457fe5b049392505050565b6000826001600160a01b0316846001600160a01b03161415614bbf575080613a88565b614be86001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60006143fe565b614c106001600160a01b03851673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846143fe565b600080846001600160a01b0316866001600160a01b031610614c33578486614c36565b85855b91509150600073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8383604051602001614c64929190615741565b60408051601f19818403018152908290528051602091820120614c9a93929091600080516020615ee3833981519152910161578f565b60408051601f19818403018152919052805160209091012090506001600160a01b038116614cda5760405162461bcd60e51b8152600401610bb490615cf7565b6040805160028082526060820183526000926020830190803683370190505090508781600081518110614d0957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110614d3757fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990614d9390899060019086903090600f60fc1b90600401615d8c565b600060405180830381600087803b158015614dad57600080fd5b505af1158015614dc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614de991908101906153bf565b600182510381518110614df857fe5b6020026020010151945060008511614e225760405162461bcd60e51b8152600401610bb490615bf2565b505050509392505050565b600081614e3c575060006143f9565b816001600160801b8210614e555760809190911c9060401b5b600160401b8210614e6b5760409190911c9060201b5b6401000000008210614e825760209190911c9060101b5b620100008210614e975760109190911c9060081b5b6101008210614eab5760089190911c9060041b5b60108210614ebe5760049190911c9060021b5b60088210614eca5760011b5b6001818581614ed557fe5b048201901c90506001818581614ee757fe5b048201901c90506001818581614ef957fe5b048201901c90506001818581614f0b57fe5b048201901c90506001818581614f1d57fe5b048201901c90506001818581614f2f57fe5b048201901c90506001818581614f4157fe5b048201901c90506000818581614f5357fe5b049050808210614f635780611afc565b509392505050565b60008083601f840112614f7c578182fd5b5081356001600160401b03811115614f92578182fd5b6020830191508360208083028501011115614fac57600080fd5b9250929050565b60008083601f840112614fc4578182fd5b5081356001600160401b03811115614fda578182fd5b602083019150836020828501011115614fac57600080fd5b80516001600160701b03811681146143f957600080fd5b803560ff811681146143f957600080fd5b60006020828403121561502b578081fd5b8135613a8881615ebc565b600060208284031215615047578081fd5b8151613a8881615ebc565b60008060408385031215615064578081fd5b823561506f81615ebc565b9150602083013561507f81615ebc565b809150509250929050565b60008060006060848603121561509e578081fd5b83356150a981615ebc565b925060208401356150b981615ebc565b915060408401356150c981615ebc565b809150509250925092565b600080600080608085870312156150e9578081fd5b84356150f481615ebc565b9350602085013561510481615ebc565b9250604085013561511481615ebc565b9396929550929360600135925050565b60008060008060008060008060e0898b03121561513f578586fd5b883561514a81615ebc565b9750602089013561515a81615ebc565b9650604089013561516a81615ebc565b9550606089013594506080890135935060a089013561518881615ebc565b925060c08901356001600160401b038111156151a2578283fd5b6151ae8b828c01614fb3565b999c989b5096995094979396929594505050565b60008060008060008060c087890312156151da578384fd5b86356151e581615ebc565b955060208701356151f581615ebc565b9450604087013561520581615ed4565b935061521360608801615009565b92506080870135915060a087013590509295509295509295565b60008060008060008060008060e0898b03121561513f578182fd5b60008060006060848603121561525c578081fd5b833561526781615ebc565b9250602084013561527781615ebc565b929592945050506040919091013590565b60008060008060008060008060e0898b0312156152a3578182fd5b88356152ae81615ebc565b975060208901356152be81615ebc565b965060408901359550606089013594506080890135935060a089013561518881615ebc565b600080604083850312156152f5578182fd5b823561530081615ebc565b946020939093013593505050565b60008060008060408587031215615323578182fd5b84356001600160401b0380821115615339578384fd5b61534588838901614f6b565b9096509450602087013591508082111561535d578384fd5b5061536a87828801614f6b565b95989497509550505050565b60008060006040848603121561538a578081fd5b83356001600160401b0381111561539f578182fd5b6153ab86828701614f6b565b90945092505060208401356150c981615ed4565b600060208083850312156153d1578182fd5b82516001600160401b03808211156153e7578384fd5b818501915085601f8301126153fa578384fd5b81518181111561540657fe5b8381029150615416848301615e6d565b8181528481019084860184860187018a1015615430578788fd5b8795505b83861015615452578051835260019590950194918601918601615434565b5098975050505050505050565b600060208284031215615470578081fd5b8135613a8881615ed4565b60006020828403121561548c578081fd5b8151613a8881615ed4565b60008060008060008060008060006101208a8c0312156154b5578283fd5b89356154c081615ebc565b985060208a01356154d081615ebc565b975060408a01356154e081615ebc565b965060608a0135955060808a0135945060a08a01356154fe81615ed4565b935061550c60c08b01615009565b925060e08a013591506101008a013590509295985092959850929598565b60008060408385031215615064578182fd5b600080600080600080600080610100898b031215615558578182fd5b883561556381615ebc565b9750602089013561557381615ebc565b9650604089013561558381615ebc565b9550606089013594506080890135935061559f60a08a01615009565b925060c0890135915060e089013590509295985092959890939650565b6000602082840312156155cd578081fd5b81516001600160401b03808211156155e3578283fd5b818401915084601f8301126155f6578283fd5b81518181111561560257fe5b615615601f8201601f1916602001615e6d565b915080825285602082850101111561562b578384fd5b61563c816020840160208601615e90565b50949350505050565b600080600060608486031215615659578081fd5b61566284614ff2565b925061567060208501614ff2565b9150604084015163ffffffff811681146150c9578182fd5b600060208284031215615699578081fd5b5051919050565b600080604083850312156156b2578182fd5b82359150602083013561507f81615ebc565b600080604083850312156156d6578182fd5b505080516020909101519092909150565b6000806000606084860312156156fb578081fd5b833592506020840135915060408401356150c981615ebc565b600080600060608486031215615728578081fd5b8351925060208401519150604084015190509250925092565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6000828483379101908152919050565b60008251615785818460208701615e90565b9190910192915050565b6001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683529015156020830152604082015260600190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b901515815260200190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b92835260208301919091526001600160a01b0316604082015260806060820181905260009082015260a00190565b6000602082528251806020840152615a1c816040850160208701615e90565b601f01601f19169190910160400192915050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526015908201527415185c99d95d081b9bdd08105d5d1a1bdc9a5e9959605a1b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b602080825260149082015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604082015260600190565b60208082526013908201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604082015260600190565b6020808252600b908201526a139bc8195d1a081cd95b9d60aa1b604082015260600190565b602080825260149082015273092dcecc2d8d2c84092dce0eae840d8cadccee8d60631b604082015260600190565b60208082526009908201526810b3b7bb32b93737b960b91b604082015260600190565b60208082526017908201527622b93937b91029bbb0b83834b733902a37b5b2b739901960491b604082015260600190565b6020808252601790820152764572726f72205377617070696e6720546f6b656e73203160481b604082015260600190565b6020808252601f908201527f5377617070656420746f20496e76616c696420496e7465726d65646961746500604082015260600190565b6020808252601b908201527a109bdc9a5b99d15490cc8c0e88105c1c1c9bdd994819985a5b1959602a1b604082015260600190565b6020808252601d908201527f426f72696e6745524332303a2042616c616e63654f66206661696c6564000000604082015260600190565b6020808252601190820152704e6f205377617020417661696c61626c6560781b604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601290820152714552523a204869676820536c69707061676560701b604082015260600190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615ddb5784516001600160a01b031683529383019391830191600101615db6565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b6000808335601e19843603018112615e3f578283fd5b8301803591506001600160401b03821115615e58578283fd5b602001915036819003821315614fac57600080fd5b6040518181016001600160401b0381118282101715615e8857fe5b604052919050565b60005b83811015615eab578181015183820152602001615e93565b838111156120dc5750506000910152565b6001600160a01b0381168114615ed157600080fd5b50565b8015158114615ed157600080fdfee18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303000000000000000000000000228619cca194fbe3ebeb2f835ec1ea5080dafbb20000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff42724fd86e42fdf9189d86bda34d3e693c24264ea2b54ff7796d9e1d40f5e29f4f59000000000000000000000000f5bce5077908a1b7370b9ae04adc565ebd643966000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2a264697066735822122089a5125d850fb87a89b52e2cb580c7d062e507e61b962188e0983cbea998b8cd64736f6c63430007060033
Deployed Bytecode Sourcemap
25594:27991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49411:16;49429;26007:42;-1:-1:-1;;;;;49451:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;49410:76:0;;;;-1:-1:-1;49410:76:0;;-1:-1:-1;49497:23:0;49523:18;:9;49537:3;49523:13;:18::i;:::-;49497:44;-1:-1:-1;49552:11:0;49624:39;49497:44;49624:18;:8;49637:4;49624:12;:18::i;:::-;:22;;:39::i;:::-;49579:29;:15;49599:8;49579:19;:29::i;:::-;:84;;;;;;49552:111;;10542:42;-1:-1:-1;;;;;49674:19:0;;49701:9;49674:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49724:68:0;;-1:-1:-1;10542:42:0;;-1:-1:-1;26007:42:0;;-1:-1:-1;49782:9:0;;-1:-1:-1;49724:25:0;:68::i;:::-;49803:53;;-1:-1:-1;;;49803:53:0;;26007:42;;49803:26;;:53;;49830:3;;49835:1;;49846:4;;49803:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;49867:31:0;;-1:-1:-1;49899:30:0;;-1:-1:-1;;;;;;;;;;;;49899:28:0;:30::i;:::-;49867:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;26546:42:0;-1:-1:-1;49989:13:0;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;50029:4:0;50036:10;50048:36;25866:42;50048:34;:36::i;:::-;50086:1;49989:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49358:784;;;;25594:27991;;;;;27454:124;;;;;;;;;;-1:-1:-1;27454:124:0;;;;;:::i;:::-;;:::i;:::-;;10307:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29484:528;;;;;;;;;;-1:-1:-1;29484:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34110:329::-;;;;;;;;;;-1:-1:-1;34110:329:0;;;;;:::i;:::-;;:::i;39510:370::-;;;;;;;;;;-1:-1:-1;39510:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;47298:671::-;;;;;;;;;;-1:-1:-1;47298:671:0;;;;;:::i;:::-;;:::i;46408:616::-;;;;;;;;;;-1:-1:-1;46408:616:0;;;;;:::i;:::-;;:::i;44908:461::-;;;;;;;;;;-1:-1:-1;44908:461:0;;;;;:::i;:::-;;:::i;40850:426::-;;;;;;;;;;-1:-1:-1;40850:426:0;;;;;:::i;:::-;;:::i;37045:527::-;;;;;;;;;;-1:-1:-1;37045:527:0;;;;;:::i;:::-;;:::i;40100:519::-;;;;;;;;;;-1:-1:-1;40100:519:0;;;;;:::i;:::-;;:::i;29091:381::-;;;;;;;;;;-1:-1:-1;29091:381:0;;;;;:::i;:::-;;:::i;38664:793::-;;;;;;:::i;:::-;;:::i;5883:322::-;;;;;;;;;;-1:-1:-1;5883:322:0;;;;;:::i;:::-;;:::i;27936:195::-;;;;;;;;;;-1:-1:-1;27936:195:0;;;;;:::i;:::-;;:::i;42411:668::-;;;;;;;;;;-1:-1:-1;42411:668:0;;;;;:::i;:::-;;:::i;43334:582::-;;;;;;;;;;-1:-1:-1;43334:582:0;;;;;:::i;:::-;;:::i;38338:271::-;;;;;;;;;;-1:-1:-1;38338:271:0;;;;;:::i;:::-;;:::i;45597:575::-;;;;;;;;;;-1:-1:-1;45597:575:0;;;;;:::i;:::-;;:::i;36386:442::-;;;;;;;;;;-1:-1:-1;36386:442:0;;;;;:::i;:::-;;:::i;32725:264::-;;;;;;;;;;-1:-1:-1;32725:264:0;;;;;:::i;:::-;;:::i;42011:139::-;;;;;;;;;;-1:-1:-1;42011:139:0;;;;;:::i;:::-;;:::i;6321:280::-;;;;;;;;;;-1:-1:-1;6321:280:0;;;;;:::i;:::-;;:::i;38012:218::-;;;;;;;;;;-1:-1:-1;38012:218:0;;;;;:::i;:::-;;:::i;31164:1016::-;;;;;;:::i;:::-;;:::i;34694:672::-;;;;;;;;;;-1:-1:-1;34694:672:0;;;;;:::i;:::-;;:::i;11398:360::-;;;;;;;;;;-1:-1:-1;11398:360:0;;;;;:::i;:::-;;:::i;11066:47::-;;;;;;;;;;-1:-1:-1;11066:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50244:854::-;;;;;;:::i;:::-;;:::i;22439:347::-;;;;;;;;;;-1:-1:-1;22439:347:0;;;;;:::i;:::-;;:::i;12557:792::-;;;;;;:::i;:::-;;:::i;51201:1111::-;;;;;;;;;;-1:-1:-1;51201:1111:0;;;;;:::i;:::-;;:::i;52431:1151::-;;;;;;;;;;-1:-1:-1;52431:1151:0;;;;;:::i;:::-;;:::i;41767:236::-;;;;;;;;;;-1:-1:-1;41767:236:0;;;;;:::i;:::-;;:::i;22798:348::-;;;;;;;;;;-1:-1:-1;22798:348:0;;;;;:::i;:::-;;:::i;35612:559::-;;;;;;;;;;-1:-1:-1;35612:559:0;;;;;:::i;:::-;;:::i;44146:523::-;;;;;;;;;;-1:-1:-1;44146:523:0;;;;;:::i;:::-;;:::i;33232:641::-;;;;;;;;;;-1:-1:-1;33232:641:0;;;;;:::i;:::-;;:::i;27590:134::-;;;;;;;;;;-1:-1:-1;27590:134:0;;;;;:::i;:::-;;:::i;30024:359::-;;;;;;;;;;-1:-1:-1;30024:359:0;;;;;:::i;:::-;;:::i;30909:200::-;;;;;;;;;;-1:-1:-1;30909:200:0;;;;;:::i;:::-;;:::i;32562:155::-;;;;;;;;;;-1:-1:-1;32562:155:0;;;;;:::i;:::-;;:::i;5287:345::-;;;;;;:::i;:::-;;:::i;11825:146::-;;;;;;;;;;-1:-1:-1;11825:146:0;;;;;:::i;:::-;;:::i;30395:506::-;;;;;;;;;;-1:-1:-1;30395:506:0;;;;;:::i;:::-;;:::i;48252:620::-;;;;;;;;;;-1:-1:-1;48252:620:0;;;;;:::i;:::-;;:::i;28185:836::-;;;;;;:::i;:::-;;:::i;27787:137::-;;;;;;;;;;-1:-1:-1;27787:137:0;;;;;:::i;:::-;;:::i;27119:275::-;;;;;;;;;;-1:-1:-1;27119:275:0;;;;;:::i;:::-;;:::i;9828:142::-;9880:6;9907;;;:30;;-1:-1:-1;;9922:5:0;;;9936:1;9931;9922:5;9931:1;9917:15;;;;;:20;9907:30;9899:63;;;;-1:-1:-1;;;9899:63:0;;;;;;;:::i;:::-;;;;;;;;;9828:142;;;;:::o;9555:128::-;9639:5;;;9634:16;;;;9626:49;;;;-1:-1:-1;;;9626:49:0;;;;;;;:::i;3153:340::-;3272:12;3286:17;3315:5;-1:-1:-1;;;;;3307:19:0;1497:10;3350:12;;3364:2;3368:6;3327:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3327:48:0;;;;;;;;;;;;;;-1:-1:-1;;;;;3327:48:0;-1:-1:-1;;;;;;3327:48:0;;;;;;;;;;3307:69;;;;3327:48;3307:69;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:105;;;;3395:7;:57;;;;-1:-1:-1;3407:11:0;;:16;;:44;;;3438:4;3427:24;;;;;;;;;;;;:::i;:::-;3387:98;;;;-1:-1:-1;;;3387:98:0;;;;;;;:::i;:::-;3153:340;;;;;:::o;1897:343::-;1961:14;1989:12;2003:17;2032:5;-1:-1:-1;;;;;2024:25:0;1336:10;2073:14;;2097:4;2050:53;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2050:53:0;;;;;;;;;;;;;;-1:-1:-1;;;;;2050:53:0;-1:-1:-1;;;;;;2050:53:0;;;;;;;;;;2024:80;;;;2050:53;2024:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1988:116;;;;2123:7;:28;;;;;2149:2;2134:4;:11;:17;;2123:28;2115:70;;;;-1:-1:-1;;;2115:70:0;;;;;;;:::i;:::-;2216:4;2205:27;;;;;;;;;;;;:::i;:::-;2196:36;1897:343;-1:-1:-1;;;;1897:343:0:o;27454:124::-;27539:30;-1:-1:-1;;;;;27539:18:0;;27558:2;27562:6;27539:18;:30::i;:::-;27454:124;;;:::o;10307:23::-;;;-1:-1:-1;;;;;10307:23:0;;:::o;29484:528::-;29626:25;;-1:-1:-1;;;29626:25:0;;29569:16;;;;-1:-1:-1;;;;;;;;;;;26140:42:0;29626:20;;:25;;29647:3;;29626:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29598:54;;29663:12;29691:9;-1:-1:-1;;;;;29678:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29663:46;-1:-1:-1;29720:58:0;-1:-1:-1;;;;;29720:22:0;;29743:10;-1:-1:-1;;;;;;;;;;;29771:6:0;29720:22;:58::i;:::-;29789:81;;-1:-1:-1;;;29789:81:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;29789:27;;:81;;29817:5;;26546:42;;29848:9;;29860:6;;29868:1;;29789:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29893:61:0;;-1:-1:-1;;;29893:61:0;;-1:-1:-1;;;;;29893:32:0;;;;;:61;;29934:4;;29941;;29947:6;;29893:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29965:39;;-1:-1:-1;;;29965:39:0;;29882:72;;-1:-1:-1;;;;;;;;;;;;26140:42:0;29965:20;;:39;;29986:3;;29882:72;;30001:2;;29965:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29484:528;;;;;;;:::o;34110:329::-;34198:64;;-1:-1:-1;;;34198:64:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;34198:14;;:64;;34213:10;;34225;;34245:4;;34252:6;;34260:1;;34198:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;34340:48:0;;-1:-1:-1;;;34340:48:0;;26262:42;;34340:12;;:48;;34361:10;;34374:6;;34382:2;;34386:1;;34340:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34110:329;;;:::o;39510:370::-;39671:57;;-1:-1:-1;;;39671:57:0;;39626:15;;;;-1:-1:-1;;;;;;;;;;;26546:42:0;39671:14;;:57;;39693:4;;39700:10;;39693:4;;39718:6;;39626:15;;39671:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;39802:25:0;;-1:-1:-1;;;39802:25:0;;-1:-1:-1;;;;;39802:21:0;;;;;:25;;39824:2;;39802:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39781:46;;;;-1:-1:-1;39510:370:0;-1:-1:-1;;;;39510:370:0:o;47298:671::-;47378:17;;47426:62;-1:-1:-1;;;;;;;;;;;47454:10:0;47474:4;47481:6;47426:27;:62::i;:::-;47557:39;;-1:-1:-1;;;47557:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;47557:31;;:39;;47589:6;;47557:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;26772:42:0;-1:-1:-1;47664:35:0;;-1:-1:-1;47700:36:0;;-1:-1:-1;;;;;;;;;;;;47700:34:0;:36::i;:::-;47664:73;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;47812:13:0;-1:-1:-1;;;;;;;;;;;47857:4:0;47864:2;47868:41;26772:42;47868:39;:41::i;:::-;47911:1;47812:101;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47788:125;;;;-1:-1:-1;47298:671:0;-1:-1:-1;;;47298:671:0:o;46408:616::-;46493:79;-1:-1:-1;;;;;;;;;;;46532:10:0;46552:4;46559:12;46493:38;:79::i;:::-;46657:51;;-1:-1:-1;;;46657:51:0;;-1:-1:-1;;;;;;;;;;;26772:42:0;46657:37;;:51;;46695:12;;46657:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;46780:31:0;46812:36;25866:42;46812:34;:36::i;:::-;46780:69;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46921:59;46945:2;46949:30;-1:-1:-1;;;;;;;;;;;;;;;;46949:28:0;;:30::i;:::-;-1:-1:-1;;;;;;;;;;;25764:42:0;46921:59;:23;:59::i;:::-;46408:616;;:::o;44908:461::-;44995:80;;-1:-1:-1;;;44995:80:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;44995:14;;:80;;26652:42;;45032:10;;45052:4;;45059:12;;45073:1;;44995:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;45161:50:0;;-1:-1:-1;;;45161:50:0;;26652:42;;45161:36;;:50;;45198:12;;45161:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45266:59:0;45290:2;45294:30;-1:-1:-1;;;;;;;;;;;45294:28:0;:30::i;40850:426::-;40929:70;;-1:-1:-1;;;40929:70:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;40929:14;;:70;;-1:-1:-1;;;;;;;;;;;25866:42:0;40962:10;;40982:4;;40989:6;;40997:1;;40929:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;41071:39:0;;-1:-1:-1;;;41071:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;41071:31;;:39;;41103:6;;41071:39;;;:::i;37045:527::-;37123:66;26414:42;37155:10;37175:4;37182:6;37123:31;:66::i;:::-;37260:46;;-1:-1:-1;;;37260:46:0;;26262:42;;37260:13;;:46;;-1:-1:-1;;;;;;;;;;;25866:42:0;37284:6;;37300:4;;37260:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37367:39:0;;-1:-1:-1;;;37367:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;-1:-1:-1;37367:31:0;;-1:-1:-1;37367:39:0;;37399:6;;37367:39;;;:::i;40100:519::-;40173:17;;40221:62;-1:-1:-1;;;;;;;;;;;40249:10:0;40269:4;40276:6;40221:27;:62::i;:::-;40352:39;;-1:-1:-1;;;40352:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;40352:31;;:39;;40384:6;;40352:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;26546:42:0;-1:-1:-1;40474:13:0;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;40514:4:0;40521:2;40525:36;25866:42;40525:34;:36::i;29091:381::-;29183:16;29212:12;29227:9;-1:-1:-1;;;;;29227:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29212:32;-1:-1:-1;29255:58:0;-1:-1:-1;;;;;29255:22:0;;29278:10;-1:-1:-1;;;;;;;;;;;29306:6:0;29255:22;:58::i;:::-;29324:81;;-1:-1:-1;;;29324:81:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;29324:27;;:81;;29352:5;;26546:42;;29383:9;;29395:6;;29403:1;;29324:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29428:36:0;;-1:-1:-1;;;29428:36:0;;-1:-1:-1;;;;;29428:18:0;;;;;:36;;29447:2;;29451:4;;29457:6;;29428:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29417:47;29091:381;-1:-1:-1;;;;;29091:381:0:o;38664:793::-;38936:16;38965;38984:84;39010:25;39050:7;38984:11;:84::i;:::-;38965:103;;39090:163;39118:25;39158:12;39185:8;39208:11;39234:8;;39090:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39090:13:0;;-1:-1:-1;;;39090:163:0:i;:::-;39079:174;;39284:14;39272:8;:26;;39264:57;;;;-1:-1:-1;;;39264:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;39343:2:0;39347:12;39361:8;39337:33;;;;;;;;:::i;:::-;;;;;;;;39381:67;;-1:-1:-1;;;39381:67:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;39381:13;;:67;;39402:12;;39425:4;;39432:2;;39436:8;;39446:1;;39381:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38664:793;;;;;;;;;;;:::o;5883:322::-;6135:62;;-1:-1:-1;;;6135:62:0;;-1:-1:-1;;;;;6135:12:0;;;;;:62;;6148:6;;6156:7;;6165:5;;6172:6;;6180:7;;6189:1;;6192;;6195;;6135:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5883:322;;;;;;;;;:::o;27936:195::-;28029:25;;-1:-1:-1;;;28029:25:0;;28012:14;;-1:-1:-1;;;;;;;;;;;26140:42:0;28029:20;;:25;;28050:3;;28029:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28012:42;-1:-1:-1;;;;;;;;;;;;28065:20:0;28086:3;28091:27;-1:-1:-1;;;;;28091:25:0;;;:27::i;:::-;28120:2;28065:58;;;;;;;;;;;;;;;;;:::i;42411:668::-;42504:17;;42552:72;-1:-1:-1;;;;;42552:31:0;;42584:10;42604:4;42611:12;42552:31;:72::i;:::-;42702:44;;-1:-1:-1;;;42702:44:0;;-1:-1:-1;;;;;42702:30:0;;;;;:44;;42733:12;;42702:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42802:17;42845:6;-1:-1:-1;;;;;42829:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42802:64;-1:-1:-1;;;;;;;;;;;;42940:13:0;42802:64;42974:4;42981:2;42985:30;-1:-1:-1;;;;;42985:28:0;;;:30::i;:::-;43017:1;42940:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42916:103;;;;-1:-1:-1;42411:668:0;-1:-1:-1;;;;;42411:668:0:o;43334:582::-;43433:17;43476:6;-1:-1:-1;;;;;43460:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43547:74;;-1:-1:-1;;;43547:74:0;;43433:64;;-1:-1:-1;;;;;;;;;;;;26546:42:0;43547:14;;:74;;43433:64;;43574:10;;43594:4;;43601:16;;43619:1;;43547:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;43709:46:0;;-1:-1:-1;;;43709:46:0;;-1:-1:-1;;;;;43709:28:0;;;;;:46;;43738:16;;43709:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43802:67;43830:2;43834:34;43841:6;-1:-1:-1;;;;;43834:32:0;;:34::i;:::-;-1:-1:-1;;;;;43802:27:0;;;:67;:27;:67::i;:::-;43334:582;;;;:::o;38338:271::-;38529:72;;-1:-1:-1;;;38529:72:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;38529:31;;:72;;38561:4;;38567:14;;38583:8;;38593:1;;38596;;38599;;38529:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38338:271;;;;;;:::o;45597:575::-;45682:62;-1:-1:-1;;;;;;;;;;;45710:10:0;45730:4;45737:6;45682:27;:62::i;:::-;45813:39;;-1:-1:-1;;;45813:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;45813:31;;:39;;45845:6;;45813:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;26772:42:0;-1:-1:-1;45920:35:0;;-1:-1:-1;45956:36:0;;-1:-1:-1;;;;;;;;;;;;45956:34:0;:36::i;:::-;45920:73;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;46044:81:0;46079:2;46083:41;-1:-1:-1;;;;;;;;;;;46083:39:0;:41::i;:::-;-1:-1:-1;;;;;;;;;;;26772:42:0;46044:81;:34;:81::i;36386:442::-;36469:62;-1:-1:-1;;;;;;;;;;;36497:10:0;36517:4;36524:6;36469:27;:62::i;:::-;36600:39;;-1:-1:-1;;;36600:39:0;;-1:-1:-1;;;;;;;;;;;25866:42:0;36600:31;;:39;;36632:6;;36600:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26262:42:0;;-1:-1:-1;36698:12:0;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;36721:36:0;25866:42;36721:34;:36::i;:::-;36759:2;36763:1;36698:67;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36386:442;;:::o;32725:264::-;32798:18;32831:6;-1:-1:-1;;;;;32819:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32798:67;-1:-1:-1;26262:42:0;32915:13;32798:67;32941:34;-1:-1:-1;;;;;32941:32:0;;;:34::i;:::-;32977:2;32915:65;;;;;;;;;;;;;;;;;:::i;42011:139::-;-1:-1:-1;;;;;42076:30:0;;;42107:34;42076:30;42107:32;:34::i;:::-;42076:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6321:280::-;6544:49;;-1:-1:-1;;;6544:49:0;;-1:-1:-1;;;;;6544:12:0;;;;;:49;;6557:4;;6563:2;;6567:6;;6575:8;;6585:1;;6588;;6591;;6544:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6321:280;;;;;;;;:::o;38012:218::-;38080:17;;-1:-1:-1;;;;;;;;;;;38152:13:0;38166:5;38181:4;38188:2;38192:25;-1:-1:-1;;;;;38192:23:0;;;:25::i;31164:1016::-;31438:16;31467;31486:84;31512:25;31552:7;31486:11;:84::i;:::-;31467:103;;31581:19;31603:9;-1:-1:-1;;;;;31603:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31581:39;;31631:16;31650:172;31678:25;31726:12;31754:8;31777:11;31803:8;;31650:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31650:13:0;;-1:-1:-1;;;31650:172:0:i;:::-;31631:191;;31853:14;31841:8;:26;;31833:57;;;;-1:-1:-1;;;31833:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;31912:2:0;31924:12;31939:8;31906:42;;;;;;;;:::i;:::-;;;;;;;;31959:51;-1:-1:-1;;;;;31959:25:0;;-1:-1:-1;;;;;;;;;;;32001:8:0;31959:25;:51::i;:::-;32021:90;;-1:-1:-1;;;32021:90:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;32021:27;;:90;;32049:12;;26546:42;;32087:9;;32099:8;;32109:1;;32021:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;32134:38:0;;-1:-1:-1;;;32134:38:0;;-1:-1:-1;;;;;32134:18:0;;;;;:38;;32153:2;;32157:4;;32163:8;;32134:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32123:49;31164:1016;-1:-1:-1;;;;;;;;;;;;31164:1016:0:o;34694:672::-;34798:66;-1:-1:-1;;;;;34798:31:0;;34830:10;34850:4;34857:6;34798:31;:66::i;:::-;34936:18;34969:6;-1:-1:-1;;;;;34957:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35053:48;;-1:-1:-1;;;35053:48:0;;34936:67;;-1:-1:-1;26262:42:0;;35053:13;;:48;;34936:67;;35079:6;;35095:4;;35053:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35169:36:0;;-1:-1:-1;;;35169:36:0;;-1:-1:-1;;;;;35169:28:0;;;-1:-1:-1;35169:28:0;;-1:-1:-1;35169:36:0;;35198:6;;35169:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35252:67;35280:2;35284:34;35291:6;-1:-1:-1;;;;;35284:32:0;;:34::i;11398:360::-;11524:8;;-1:-1:-1;;;;;11524:8:0;11510:10;:22;11502:44;;;;-1:-1:-1;;;11502:44:0;;;;;;;:::i;:::-;11565:35;;;11557:68;;;;-1:-1:-1;;;11557:68:0;;;;;;;:::i;:::-;11641:9;11636:115;11656:18;;;11636:115;;;11726:10;;11737:1;11726:13;;;;;;;;;;;;;;;;;;;;:::i;:::-;11696:15;:27;11712:7;;11720:1;11712:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11696:27:0;;;;;;;;;;;;-1:-1:-1;11696:27:0;:43;;-1:-1:-1;;11696:43:0;;;;;;;;;;-1:-1:-1;11676:3:0;11636:115;;11066:47;;;;;;;;;;;;;;;:::o;50244:854::-;50302:17;50321:16;50351;50369;26007:42;-1:-1:-1;;;;;50391:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;50350:76:0;;;;-1:-1:-1;50350:76:0;;-1:-1:-1;50437:23:0;50463:18;:9;50477:3;50463:13;:18::i;:::-;50437:44;-1:-1:-1;50492:11:0;50564:39;50437:44;50564:18;:8;50577:4;50564:12;:18::i;:39::-;50519:29;:15;50539:8;50519:19;:29::i;:::-;:84;;;;;;50492:111;;10542:42;-1:-1:-1;;;;;50614:19:0;;50641:9;50614:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50664:68:0;;-1:-1:-1;10542:42:0;;-1:-1:-1;26007:42:0;;-1:-1:-1;50722:9:0;;-1:-1:-1;50664:25:0;:68::i;:::-;50743:53;;-1:-1:-1;;;50743:53:0;;26007:42;;50743:26;;:53;;50770:3;;50775:1;;50786:4;;50743:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;50807:31:0;;-1:-1:-1;50839:30:0;;-1:-1:-1;;;;;;;;;;;;50839:28:0;:30::i;:::-;50807:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;26546:42:0;-1:-1:-1;50953:13:0;;-1:-1:-1;;;;;;;;;;;;25866:42:0;-1:-1:-1;50993:4:0;51000:2;51004:36;25866:42;51004:34;:36::i;:::-;51042:1;50953:91;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50929:115;;;;-1:-1:-1;50244:854:0;-1:-1:-1;;;;;;50244:854:0:o;22439:347::-;22549:15;;22594:55;-1:-1:-1;;;;;22594:29:0;;22624:10;22636:4;22642:6;22594:29;:55::i;:::-;22708:25;;-1:-1:-1;;;22708:25:0;;-1:-1:-1;;;;;22708:21:0;;;;;:25;;22730:2;;22708:25;;;:::i;12557:792::-;12824:7;12844:16;12863:84;12889:25;12929:7;12863:11;:84::i;:::-;12844:103;;12958:16;12977:163;13005:25;13045:12;13072:8;13095:11;13121:8;;12977:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12977:13:0;;-1:-1:-1;;;12977:163:0:i;:::-;12958:182;;13171:14;13159:8;:26;;13151:57;;;;-1:-1:-1;;;13151:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;13230:2:0;13234:12;13248:8;13224:33;;;;;;;;:::i;:::-;;;;;;;;13268:47;-1:-1:-1;;;;;13268:33:0;;13302:2;13306:8;13268:33;:47::i;:::-;13333:8;12557:792;-1:-1:-1;;;;;;;;;;12557:792:0:o;51201:1111::-;51299:17;51330:14;51346;51376:7;-1:-1:-1;;;;;51364:19:0;:9;-1:-1:-1;;;;;51364:19:0;;:65;;51410:7;51419:9;51364:65;;;51387:9;51398:7;51364:65;51329:100;;;;51440:15;10439:42;51611:6;51619;51594:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51594:32:0;;;;;;;;;;51584:43;;51594:32;51584:43;;;;51540:102;;;51584:43;;-1:-1:-1;;;;;;;;;;;10914:66:0;51540:102;;:::i;:::-;;;;;;;;;;;;;51530:113;;;;;;51500:162;;51440:237;;51689:16;51707;51729:4;-1:-1:-1;;;;;51729:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;51688:59:0;;;;-1:-1:-1;51688:59:0;;-1:-1:-1;51758:23:0;51784:17;:8;51797:3;51784:12;:17::i;:::-;51758:43;-1:-1:-1;51812:71:0;-1:-1:-1;;;;;51812:34:0;;51847:10;51867:4;51874:8;51812:34;:71::i;:::-;51908:9;-1:-1:-1;;;;;51898:19:0;:7;-1:-1:-1;;;;;51898:19:0;;51894:411;;;52012:39;52035:15;52012:18;:8;52025:4;52012:12;:18::i;:39::-;51963:29;:15;51983:8;51963:19;:29::i;:::-;:88;;;;;;51934:117;;52066:4;-1:-1:-1;;;;;52066:9:0;;52076:1;52079:9;52090:2;52066:31;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51894:411;;;52208:39;52231:15;52208:18;:8;52221:4;52208:12;:18::i;:39::-;52159:29;:15;52179:8;52159:19;:29::i;:::-;:88;;;;;;52130:117;;52262:4;-1:-1:-1;;;;;52262:9:0;;52272;52283:1;52286:2;52262:31;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51894:411;51201:1111;;;;;;;;;;;;:::o;52431:1151::-;52518:17;52549:14;52565;52595:7;-1:-1:-1;;;;;52583:19:0;:9;-1:-1:-1;;;;;52583:19:0;;:65;;52629:7;52638:9;52583:65;;;52606:9;52617:7;52583:65;52548:100;;;;52659:15;10439:42;52830:6;52838;52813:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52813:32:0;;;;;;;;;;52803:43;;52813:32;52803:43;;;;52759:102;;;52803:43;;-1:-1:-1;;;;;;;;;;;10914:66:0;52759:102;;:::i;:::-;;;;;;;;;;;;;52749:113;;;;;;52719:162;;52659:237;;52907:16;52926:37;52933:9;-1:-1:-1;;;;;52926:35:0;;:37::i;:::-;52907:56;;52975:16;52993;53015:4;-1:-1:-1;;;;;53015:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52974:59:0;;;;-1:-1:-1;52974:59:0;;-1:-1:-1;53044:23:0;53070:17;:8;53083:3;53070:12;:17::i;:::-;53044:43;-1:-1:-1;53098:55:0;-1:-1:-1;;;;;53098:30:0;;53137:4;53144:8;53098:30;:55::i;:::-;53178:9;-1:-1:-1;;;;;53168:19:0;:7;-1:-1:-1;;;;;53168:19:0;;53164:411;;;53282:39;53305:15;53282:18;:8;53295:4;53282:12;:18::i;:39::-;53233:29;:15;53253:8;53233:19;:29::i;:::-;:88;;;;;;53204:117;;53336:4;-1:-1:-1;;;;;53336:9:0;;53346:1;53349:9;53360:2;53336:31;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53164:411;;;53478:39;53501:15;53478:18;:8;53491:4;53478:12;:18::i;:39::-;53429:29;:15;53449:8;53429:19;:29::i;:::-;:88;;;;;;53400:117;;53532:4;-1:-1:-1;;;;;53532:9:0;;53542;53553:1;53556:2;53532:31;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53164:411;52431:1151;;;;;;;;;;;;:::o;41767:236::-;41838:17;41881:6;-1:-1:-1;;;;;41865:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41838:64;;41952:6;-1:-1:-1;;;;;41952:11:0;;41964:30;:10;-1:-1:-1;;;;;41964:28:0;;:30::i;:::-;41952:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22798:348::-;22890:15;22907;22935:65;22961:4;22967:32;22974:4;-1:-1:-1;;;;;22967:30:0;;:32::i;22935:65::-;23068:25;;-1:-1:-1;;;23068:25:0;;-1:-1:-1;;;;;23068:21:0;;;;;:25;;23090:2;;23068:25;;;:::i;35612:559::-;35700:66;-1:-1:-1;;;;;35700:31:0;;35732:10;35752:4;35759:6;35700:31;:66::i;:::-;35838:38;;-1:-1:-1;;;35838:38:0;;-1:-1:-1;;;;;35838:30:0;;;;;:38;;35869:6;;35838:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35932:18;35969:6;-1:-1:-1;;;;;35953:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35932:57;-1:-1:-1;26262:42:0;36039:12;35932:57;36064:38;-1:-1:-1;;;;;36064:36:0;;;:38::i;:::-;36104:2;36108:1;36039:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35612:559;;;;:::o;44146:523::-;44221:17;;44269:62;-1:-1:-1;;;;;;;;;;;44297:10:0;44317:4;44324:6;44269:27;:62::i;:::-;44400:42;;-1:-1:-1;;;44400:42:0;;26652;;44400:34;;:42;;44435:6;;44400:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;44515:13:0;26652:42;44559:4;44566:2;44570:40;26652:42;44570:38;:40::i;33232:641::-;33315:17;;33363:66;-1:-1:-1;;;;;33363:31:0;;33395:10;33415:4;33422:6;33363:31;:66::i;:::-;33501:18;33534:6;-1:-1:-1;;;;;33522:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33618:49;;-1:-1:-1;;;33618:49:0;;33501:67;;-1:-1:-1;26262:42:0;;33618:13;;:49;;33501:67;;33644:6;;-1:-1:-1;;;;;;;;;;;26546:42:0;33618:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33759:64:0;;-1:-1:-1;;;33759:64:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;-1:-1:-1;33759:13:0;;-1:-1:-1;33759:64:0;;33780:10;;26546:42;;33809:2;;33813:6;;33821:1;;33759:64;;;:::i;27590:134::-;27666:49;27685:2;27689:25;:5;-1:-1:-1;;;;;27689:23:0;;:25::i;:::-;-1:-1:-1;;;;;27666:18:0;;;:49;:18;:49::i;30024:359::-;30107:16;30136:12;30151:9;-1:-1:-1;;;;;30151:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30136:32;;30179:15;30197:25;:5;-1:-1:-1;;;;;30197:23:0;;:25::i;:::-;30233:82;;-1:-1:-1;;;30233:82:0;;30179:43;;-1:-1:-1;;;;;;;;;;;;26546:42:0;30233:27;;:82;;30261:5;;26546:42;;30292:9;;30179:43;;30313:1;;30233:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30338:37:0;;-1:-1:-1;;;30338:37:0;;-1:-1:-1;;;;;30338:18:0;;;;;:37;;30357:2;;30361:4;;30367:7;;30338:37;;;:::i;30909:200::-;30989:13;-1:-1:-1;;;;;31023:35:0;;;31059:2;31063:37;31023:35;31063;:37::i;:::-;31023:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31015:86;30909:200;-1:-1:-1;;;30909:200:0:o;32562:155::-;26262:42;32637:12;32650:10;32662:38;-1:-1:-1;;;;;32662:36:0;;;:38::i;:::-;32702:2;32706:1;32637:71;;;;;;;;;;;;;;;;;;:::i;5287:345::-;5378:9;5373:252;5393:16;;;5373:252;;;5432:12;;5477:4;5496:5;;5502:1;5496:8;;;;;;;;;;;;;;;;;;:::i;:::-;5469:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5431:74;;;;5525:7;5524:8;:24;;;;;5536:12;5524:24;5520:94;;;5576:21;5590:6;5576:13;:21::i;:::-;5569:29;;-1:-1:-1;;;5569:29:0;;;;;;;;:::i;5520:94::-;-1:-1:-1;;5411:3:0;;5373:252;;11825:146;11912:8;;-1:-1:-1;;;;;11912:8:0;11898:10;:22;11890:44;;;;-1:-1:-1;;;11890:44:0;;;;;;;:::i;:::-;11945:8;:18;;-1:-1:-1;;;;;;11945:18:0;-1:-1:-1;;;;;11945:18:0;;;;;;;;;;11825:146::o;30395:506::-;30528:25;;-1:-1:-1;;;30528:25:0;;30471:16;;;;-1:-1:-1;;;;;;;;;;;26140:42:0;30528:20;;:25;;30549:3;;30528:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30500:54;;30565:12;30593:9;-1:-1:-1;;;;;30580:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30565:46;;30622:15;30640:25;:5;-1:-1:-1;;;;;30640:23:0;;:25::i;:::-;30676:82;;-1:-1:-1;;;30676:82:0;;30622:43;;-1:-1:-1;;;;;;;;;;;;26546:42:0;30676:27;;:82;;30704:5;;26546:42;;30735:9;;30622:43;;30756:1;;30676:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;30781:62:0;;-1:-1:-1;;;30781:62:0;;-1:-1:-1;;;;;30781:32:0;;;;;:62;;30822:4;;30829;;30835:7;;30781:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30854:39;;-1:-1:-1;;;30854:39:0;;30770:73;;-1:-1:-1;;;;;;;;;;;;26140:42:0;30854:20;;:39;;30875:3;;30770:73;;30890:2;;30854:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30395:506;;;;;;;:::o;48252:620::-;48346:81;;-1:-1:-1;;;48346:81:0;;-1:-1:-1;;;;;;;;;;;26546:42:0;48346:14;;:81;;-1:-1:-1;;;;;;;;;;;26772:42:0;48384:10;;48404:4;;48411:12;;48425:1;;48346:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;48514:51:0;;-1:-1:-1;;;48514:51:0;;-1:-1:-1;;;;;;;;;;;26772:42:0;48514:37;;:51;;48552:12;;48514:51;;;:::i;28185:836::-;28453:16;28482;28501:84;28527:25;28567:7;28501:11;:84::i;:::-;28618:25;;-1:-1:-1;;;28618:25:0;;28482:103;;-1:-1:-1;28596:19:0;;-1:-1:-1;;;;;;;;;;;26140:42:0;28618:20;;:25;;28639:3;;28618:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28596:47;;28665:172;28693:25;28741:12;28769:8;28792:11;28818:8;;28665:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28665:13:0;;-1:-1:-1;;;28665:172:0:i;:::-;28654:183;;28868:14;28856:8;:26;;28848:57;;;;-1:-1:-1;;;28848:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;28927:2:0;28939:12;28954:8;28921:42;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;28974:20:0;;28995:3;29000:8;29010:2;28974:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28185:836;;;;;;;;;;;;:::o;27787:137::-;27879:37;;-1:-1:-1;;;27879:37:0;;-1:-1:-1;;;;;;;;;;;26140:42:0;27879:20;;:37;;27900:3;;27905:6;;27913:2;;27879:37;;;:::i;27119:275::-;27213:9;27208:179;27228:16;;;27208:179;;;27266:46;27287:2;;27290:1;27287:5;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;27266:5:0;;27272:1;27266:8;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27266:20:0;;:46;:20;:46::i;:::-;27246:3;;27208:179;;3816:382;3962:12;3976:17;4005:5;-1:-1:-1;;;;;3997:19:0;1587:10;4040:17;;4059:4;4065:2;4069:6;4017:59;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4017:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4017:59:0;-1:-1:-1;;;;;;4017:59:0;;;;;;;;;;3997:80;;;;4017:59;3997:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3961:116;;;;4096:7;:57;;;;-1:-1:-1;4108:11:0;;:16;;:44;;;4139:4;4128:24;;;;;;;;;;;;:::i;:::-;4088:102;;;;-1:-1:-1;;;4088:102:0;;;;;;;:::i;13612:461::-;13682:13;-1:-1:-1;;;;;13712:19:0;;13708:120;;13768:1;13756:9;:13;13748:37;;;;-1:-1:-1;;;13748:37:0;;;;;;;:::i;:::-;-1:-1:-1;13807:9:0;13800:16;;13708:120;13855:1;13846:6;:10;13838:43;;;;-1:-1:-1;;;13838:43:0;;;;;;;:::i;:::-;13900:9;:14;13892:46;;;;-1:-1:-1;;;13892:46:0;;;;;;;:::i;:::-;13976:65;-1:-1:-1;;;;;13976:30:0;;14007:10;14027:4;14034:6;13976:30;:65::i;:::-;-1:-1:-1;14059:6:0;13612:461;-1:-1:-1;13612:461:0:o;14081:1470::-;14292:7;14312:23;14346:25;14397:26;14438;14478:28;14493:12;14478:14;:28::i;:::-;14382:124;;;;14564:18;-1:-1:-1;;;;;14535:47:0;:25;-1:-1:-1;;;;;14535:47:0;;;:111;;;;;14628:18;-1:-1:-1;;;;;14599:47:0;:25;-1:-1:-1;;;;;14599:47:0;;;14535:111;14517:545;;;14749:183;14778:25;14822:12;14853:7;14879:11;14909:8;14749:10;:183::i;:::-;14710:222;;-1:-1:-1;14710:222:0;-1:-1:-1;14517:545:0;;;14985:25;14965:45;;15043:7;15025:25;;14517:545;15146:20;15168;15192:156;15224:17;15256:18;15289;15322:15;15192:17;:156::i;:::-;15145:203;;;;15379:164;15411:18;15448;15485:12;15516;15379:13;:164::i;4564:496::-;4636:13;4799:2;4778:11;:18;:23;4774:67;;;-1:-1:-1;4803:38:0;;;;;;;;;;;;;;;;;;;4774:67;4945:4;4932:11;4928:22;4913:37;;4989:11;4978:33;;;;;;;;;;;;:::i;:::-;4971:40;;4564:496;;;;:::o;2538:339::-;2658:12;2672:17;2701:5;-1:-1:-1;;;;;2693:19:0;1413:10;2736:11;;2749:2;2753:6;2713:47;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2713:47:0;;;;;;;;;;;;;;-1:-1:-1;;;;;2713:47:0;-1:-1:-1;;;;;;2713:47:0;;;;;;;;;;2693:68;;;;2713:47;2693:68;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2657:104;;;;2780:7;:57;;;;-1:-1:-1;2792:11:0;;:16;;:44;;;2823:4;2812:24;;;;;;;;;;;;:::i;:::-;2772:97;;;;-1:-1:-1;;;2772:97:0;;;;;;;:::i;13357:247::-;13425:14;13441;13473:20;13507:12;13473:47;;13540:9;-1:-1:-1;;;;;13540:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13531:27;;13578:9;-1:-1:-1;;;;;13578:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13569:27;;13357:247;;;;:::o;17041:1611::-;17244:20;;;-1:-1:-1;;;;;17338:31:0;;17334:290;;-1:-1:-1;17400:7:0;17334:290;;;17466:17;17499:46;-1:-1:-1;;;;;17499:21:0;;17529:11;17440:16;17499:21;:46::i;:::-;17560:52;-1:-1:-1;;;;;17560:21:0;;17590:11;17604:7;17560:21;:52::i;:::-;17334:290;;17635:15;17652;17671:28;17686:12;17671:14;:28::i;:::-;17634:65;;-1:-1:-1;17634:65:0;-1:-1:-1;17634:65:0;;17710:13;17820:26;-1:-1:-1;;;;;17820:24:0;;;:26::i;:::-;17794:52;;17857:23;17883:26;:6;-1:-1:-1;;;;;17883:24:0;;:26::i;:::-;-1:-1:-1;;;;;17928:28:0;;;;;;:15;:28;;;;;;17857:52;;-1:-1:-1;17928:28:0;;17920:62;;;;-1:-1:-1;;;17920:62:0;;;;;;;:::i;:::-;17994:12;18012:11;-1:-1:-1;;;;;18012:16:0;18036:11;18049:12;18012:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17993:69;;;18081:7;18073:43;;;;-1:-1:-1;;;18073:43:0;;;;;;;:::i;:::-;18127:21;18151:71;18196:15;18151:26;:6;-1:-1:-1;;;;;18151:24:0;;:26::i;:::-;:30;;:71::i;:::-;18127:95;;18233:21;18257:71;18302:15;18257:26;:6;-1:-1:-1;;;;;18257:24:0;;:26::i;:71::-;18233:95;;18359:13;18343;:29;18339:235;;;18404:13;18389:28;;18452:7;18432:27;;18339:235;;;18507:13;18492:28;;18555:7;18535:27;;18339:235;18607:1;18592:12;:16;18584:60;;;;-1:-1:-1;;;18584:60:0;;;;;;;:::i;:::-;17041:1611;;;;;;;;;;;;;;;;;;:::o;18660:1627::-;18848:20;18870;18904:14;18920;18959:18;-1:-1:-1;;;;;18938:39:0;:18;-1:-1:-1;;;;;18938:39:0;;:125;;19024:18;19044;18938:125;;;18981:18;19001;18938:125;18903:160;;;;19074:15;10439:42;19245:6;19253;19228:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19228:32:0;;;;;;;;;;19218:43;;19228:32;19218:43;;;;19174:102;;;19218:43;;-1:-1:-1;;;;;;;;;;;10914:66:0;19174:102;;:::i;:::-;;;;;;;;;;;;;19164:113;;;;;;19134:162;;19074:237;;19323:12;19337;19355:4;-1:-1:-1;;;;;19355:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19322:51;-1:-1:-1;;;;;19322:51:0;;;-1:-1:-1;;;;;19322:51:0;;;19410:18;-1:-1:-1;;;;;19388:40:0;:18;-1:-1:-1;;;;;19388:40:0;;19384:896;;;19445:20;19468:36;19490:4;19496:7;19468:21;:36::i;:::-;19445:59;;19594:1;19578:12;:17;19574:49;;-1:-1:-1;19622:1:0;19612:11;;19574:49;19653:132;19684:18;19721;19758:12;19653;:132::i;:::-;19638:147;-1:-1:-1;19815:25:0;:7;19827:12;19815:11;:25::i;:::-;19800:40;;19384:896;;;;19873:20;19896:36;19918:4;19924:7;19896:21;:36::i;:::-;19873:59;;20022:1;20006:12;:17;20002:49;;-1:-1:-1;20050:1:0;20040:11;;20002:49;20081:132;20112:18;20149;20186:12;20081;:132::i;:::-;20066:147;-1:-1:-1;20243:25:0;:7;20255:12;20243:11;:25::i;:::-;20228:40;;19384:896;;18660:1627;;;;;;;;;;;;:::o;15559:1474::-;15738:7;15758:65;-1:-1:-1;;;;;15758:36:0;;10667:42;15738:7;15758:36;:65::i;:::-;15834;-1:-1:-1;;;;;15834:36:0;;10667:42;15897:1;15834:36;:65::i;:::-;15910:113;-1:-1:-1;;;;;15910:36:0;;10667:42;16000:12;15910:36;:113::i;:::-;16034;-1:-1:-1;;;;;16034:36:0;;10667:42;16124:12;16034:36;:113::i;:::-;16207:252;;-1:-1:-1;;;16207:252:0;;16159:15;;;;;;10667:42;;16207;;:252;;16264:16;;16295;;16326:12;;16353;;16380:1;;;;16420:4;;-1:-1:-1;;;10774:66:0;16207:252;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16158:301;;-1:-1:-1;16158:301:0;-1:-1:-1;16158:301:0;-1:-1:-1;16558:1:0;16530:25;:12;16158:301;16530:16;:25::i;:::-;:29;16526:207;;;16580:137;16640:10;16673:25;:12;16690:7;16673:16;:25::i;:::-;-1:-1:-1;;;;;16580:37:0;;;:137;:37;:137::i;:::-;16831:1;16803:25;:12;16820:7;16803:16;:25::i;:::-;:29;16799:207;;;16853:137;16913:10;16946:25;:12;16963:7;16946:16;:25::i;:::-;-1:-1:-1;;;;;16853:37:0;;;:137;:37;:137::i;:::-;17023:2;15559:1474;-1:-1:-1;;;;;;;15559:1474:0:o;9691:129::-;9775:5;;;9770:16;;;;9762:50;;;;-1:-1:-1;;;9762:50:0;;;;;;;:::i;20295:317::-;20383:7;20600:4;20428:169;20577:19;:9;20591:4;20577:13;:19::i;:::-;20428:126;20480:59;20516:22;:9;20530:7;20516:13;:22::i;:::-;20494:19;:6;20505:7;20494:10;:19::i;:::-;20480:9;;20494:44;20480:13;:59::i;:::-;20428:33;:126::i;:169::-;:176;;;;;;;20295:317;-1:-1:-1;;;20295:317:0:o;20949:1478::-;21112:19;21177:23;-1:-1:-1;;;;;21148:52:0;:25;-1:-1:-1;;;;;21148:52:0;;21144:104;;;-1:-1:-1;21224:12:0;21217:19;;21144:104;21258:111;-1:-1:-1;;;;;21258:45:0;;10667:42;21357:1;21258:45;:111::i;:::-;21380:122;-1:-1:-1;;;;;21380:45:0;;10667:42;21479:12;21380:45;:122::i;:::-;21514:14;21530;21576:23;-1:-1:-1;;;;;21548:51:0;:25;-1:-1:-1;;;;;21548:51:0;;:161;;21658:23;21683:25;21548:161;;;21603:25;21630:23;21548:161;21513:196;;;;21720:12;10439:42;21885:6;21893;21868:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21868:32:0;;;;;;;;;;21858:43;;21868:32;21858:43;;;;21814:102;;;21858:43;;-1:-1:-1;;;;;;;;;;;10914:66:0;21814:102;;:::i;:::-;;;;-1:-1:-1;;21814:102:0;;;;;;;;;21804:113;;21814:102;21804:113;;;;;-1:-1:-1;;;;;;21970:18:0;;21962:48;;;;-1:-1:-1;;;21962:48:0;;;;;;;:::i;:::-;22045:16;;;22059:1;22045:16;;;;;;;;22021:21;;22045:16;;;;;;;;;;-1:-1:-1;22045:16:0;22021:40;;22082:25;22072:4;22077:1;22072:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;22072:35:0;;;-1:-1:-1;;;;;22072:35:0;;;;;22128:23;22118:4;22123:1;22118:7;;;;;;;;-1:-1:-1;;;;;22118:33:0;;;:7;;;;;;;;;;;:33;22176:164;;-1:-1:-1;;;22176:164:0;;10667:42;;22176:40;;:164;;22231:12;;22258:1;;22274:4;;22301;;-1:-1:-1;;;10774:66:0;22176:164;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22176:164:0;;;;;;;;;;;;:::i;:::-;22355:1;22341:4;:11;:15;22176:181;;;;;;;;;;;;;;22162:195;;22390:1;22376:11;:15;22368:51;;;;-1:-1:-1;;;22368:51:0;;;;;;;:::i;:::-;20949:1478;;;;;;;;;:::o;6957:1239::-;7005:7;7029:6;7025:20;;-1:-1:-1;7044:1:0;7037:8;;7025:20;7223:1;7247;-1:-1:-1;;;7263:41:0;;7259:107;;7328:3;7321:10;;;;;7352:2;7346:8;7259:107;-1:-1:-1;;;7380:2:0;:25;7376:90;;7429:2;7422:9;;;;;7452:2;7446:8;7376:90;7486:11;7480:2;:17;7476:82;;7521:2;7514:9;;;;;7544:2;7538:8;7476:82;7578:7;7572:2;:13;7568:77;;7609:2;7602:9;;;;;7632:1;7626:7;7568:77;7665:5;7659:2;:11;7655:74;;7694:1;7687:8;;;;;7716:1;7710:7;7655:74;7749:4;7743:2;:10;7739:73;;7777:1;7770:8;;;;;7799:1;7793:7;7739:73;7832:3;7826:2;:9;7822:49;;7858:1;7852:7;7822:49;7900:1;7894;7890;:5;;;;;;7886:1;:9;7885:16;;7881:20;;7931:1;7925;7921;:5;;;;;;7917:1;:9;7916:16;;7912:20;;7962:1;7956;7952;:5;;;;;;7948:1;:9;7947:16;;7943:20;;7993:1;7987;7983;:5;;;;;;7979:1;:9;7978:16;;7974:20;;8024:1;8018;8014;:5;;;;;;8010:1;:9;8009:16;;8005:20;;8055:1;8049;8045;:5;;;;;;8041:1;:9;8040:16;;8036:20;;8086:1;8080;8076;:5;;;;;;8072:1;:9;8071:16;;8067:20;;8135:10;8152:1;8148;:5;;;;;;8135:18;;8176:2;8172:1;:6;:15;;8185:2;8172:15;;;-1:-1:-1;8181:1:0;8164:24;-1:-1:-1;;;6957:1239:0:o;14:404:1:-;;;147:3;140:4;132:6;128:17;124:27;114:2;;172:8;162;155:26;114:2;-1:-1:-1;202:20:1;;-1:-1:-1;;;;;234:30:1;;231:2;;;284:8;274;267:26;231:2;328:4;320:6;316:17;304:29;;391:3;384:4;376;368:6;364:17;356:6;352:30;348:41;345:50;342:2;;;408:1;405;398:12;342:2;104:314;;;;;:::o;423:377::-;;;540:3;533:4;525:6;521:17;517:27;507:2;;565:8;555;548:26;507:2;-1:-1:-1;595:20:1;;-1:-1:-1;;;;;627:30:1;;624:2;;;677:8;667;660:26;624:2;721:4;713:6;709:17;697:29;;773:3;766:4;757:6;749;745:19;741:30;738:39;735:2;;;790:1;787;780:12;805:179;886:13;;-1:-1:-1;;;;;928:31:1;;918:42;;908:2;;974:1;971;964:12;989:158;1057:20;;1117:4;1106:16;;1096:27;;1086:2;;1137:1;1134;1127:12;1152:259;;1264:2;1252:9;1243:7;1239:23;1235:32;1232:2;;;1285:6;1277;1270:22;1232:2;1329:9;1316:23;1348:33;1375:5;1348:33;:::i;1416:263::-;;1539:2;1527:9;1518:7;1514:23;1510:32;1507:2;;;1560:6;1552;1545:22;1507:2;1597:9;1591:16;1616:33;1643:5;1616:33;:::i;1684:402::-;;;1813:2;1801:9;1792:7;1788:23;1784:32;1781:2;;;1834:6;1826;1819:22;1781:2;1878:9;1865:23;1897:33;1924:5;1897:33;:::i;:::-;1949:5;-1:-1:-1;2006:2:1;1991:18;;1978:32;2019:35;1978:32;2019:35;:::i;:::-;2073:7;2063:17;;;1771:315;;;;;:::o;2091:545::-;;;;2237:2;2225:9;2216:7;2212:23;2208:32;2205:2;;;2258:6;2250;2243:22;2205:2;2302:9;2289:23;2321:33;2348:5;2321:33;:::i;:::-;2373:5;-1:-1:-1;2430:2:1;2415:18;;2402:32;2443:35;2402:32;2443:35;:::i;:::-;2497:7;-1:-1:-1;2556:2:1;2541:18;;2528:32;2569:35;2528:32;2569:35;:::i;:::-;2623:7;2613:17;;;2195:441;;;;;:::o;2641:614::-;;;;;2804:3;2792:9;2783:7;2779:23;2775:33;2772:2;;;2826:6;2818;2811:22;2772:2;2870:9;2857:23;2889:33;2916:5;2889:33;:::i;:::-;2941:5;-1:-1:-1;2998:2:1;2983:18;;2970:32;3011:35;2970:32;3011:35;:::i;:::-;3065:7;-1:-1:-1;3124:2:1;3109:18;;3096:32;3137:35;3096:32;3137:35;:::i;:::-;2762:493;;;;-1:-1:-1;3191:7:1;;3245:2;3230:18;3217:32;;-1:-1:-1;;2762:493:1:o;3260:1137::-;;;;;;;;;3493:3;3481:9;3472:7;3468:23;3464:33;3461:2;;;3515:6;3507;3500:22;3461:2;3559:9;3546:23;3578:33;3605:5;3578:33;:::i;:::-;3630:5;-1:-1:-1;3687:2:1;3672:18;;3659:32;3700:35;3659:32;3700:35;:::i;:::-;3754:7;-1:-1:-1;3813:2:1;3798:18;;3785:32;3826:35;3785:32;3826:35;:::i;:::-;3880:7;-1:-1:-1;3934:2:1;3919:18;;3906:32;;-1:-1:-1;3985:3:1;3970:19;;3957:33;;-1:-1:-1;4042:3:1;4027:19;;4014:33;4056:35;4014:33;4056:35;:::i;:::-;4110:7;-1:-1:-1;4168:3:1;4153:19;;4140:33;-1:-1:-1;;;;;4185:30:1;;4182:2;;;4233:6;4225;4218:22;4182:2;4277:60;4329:7;4320:6;4309:9;4305:22;4277:60;:::i;:::-;3451:946;;;;-1:-1:-1;3451:946:1;;-1:-1:-1;3451:946:1;;;;;;4356:8;-1:-1:-1;;;3451:946:1:o;4402:750::-;;;;;;;4594:3;4582:9;4573:7;4569:23;4565:33;4562:2;;;4616:6;4608;4601:22;4562:2;4660:9;4647:23;4679:33;4706:5;4679:33;:::i;:::-;4731:5;-1:-1:-1;4788:2:1;4773:18;;4760:32;4801:35;4760:32;4801:35;:::i;:::-;4855:7;-1:-1:-1;4914:2:1;4899:18;;4886:32;4927;4886;4927;:::i;:::-;4978:7;-1:-1:-1;5004:38:1;5038:2;5023:18;;5004:38;:::i;:::-;4994:48;;5089:3;5078:9;5074:19;5061:33;5051:43;;5141:3;5130:9;5126:19;5113:33;5103:43;;4552:600;;;;;;;;:::o;5157:1158::-;;;;;;;;;5411:3;5399:9;5390:7;5386:23;5382:33;5379:2;;;5433:6;5425;5418:22;6320:470;;;;6466:2;6454:9;6445:7;6441:23;6437:32;6434:2;;;6487:6;6479;6472:22;6434:2;6531:9;6518:23;6550:33;6577:5;6550:33;:::i;:::-;6602:5;-1:-1:-1;6659:2:1;6644:18;;6631:32;6672:35;6631:32;6672:35;:::i;:::-;6424:366;;6726:7;;-1:-1:-1;;;6780:2:1;6765:18;;;;6752:32;;6424:366::o;6795:1062::-;;;;;;;;;7028:3;7016:9;7007:7;7003:23;6999:33;6996:2;;;7050:6;7042;7035:22;6996:2;7094:9;7081:23;7113:33;7140:5;7113:33;:::i;:::-;7165:5;-1:-1:-1;7222:2:1;7207:18;;7194:32;7235:35;7194:32;7235:35;:::i;:::-;7289:7;-1:-1:-1;7343:2:1;7328:18;;7315:32;;-1:-1:-1;7394:2:1;7379:18;;7366:32;;-1:-1:-1;7445:3:1;7430:19;;7417:33;;-1:-1:-1;7502:3:1;7487:19;;7474:33;7516:35;7474:33;7516:35;:::i;7862:327::-;;;7991:2;7979:9;7970:7;7966:23;7962:32;7959:2;;;8012:6;8004;7997:22;7959:2;8056:9;8043:23;8075:33;8102:5;8075:33;:::i;:::-;8127:5;8179:2;8164:18;;;;8151:32;;-1:-1:-1;;;7949:240:1:o;8194:812::-;;;;;8390:2;8378:9;8369:7;8365:23;8361:32;8358:2;;;8411:6;8403;8396:22;8358:2;8456:9;8443:23;-1:-1:-1;;;;;8526:2:1;8518:6;8515:14;8512:2;;;8547:6;8539;8532:22;8512:2;8591:76;8659:7;8650:6;8639:9;8635:22;8591:76;:::i;:::-;8686:8;;-1:-1:-1;8565:102:1;-1:-1:-1;8774:2:1;8759:18;;8746:32;;-1:-1:-1;8790:16:1;;;8787:2;;;8824:6;8816;8809:22;8787:2;;8868:78;8938:7;8927:8;8916:9;8912:24;8868:78;:::i;:::-;8348:658;;;;-1:-1:-1;8965:8:1;-1:-1:-1;;;;8348:658:1:o;9011:605::-;;;;9183:2;9171:9;9162:7;9158:23;9154:32;9151:2;;;9204:6;9196;9189:22;9151:2;9249:9;9236:23;-1:-1:-1;;;;;9274:6:1;9271:30;9268:2;;;9319:6;9311;9304:22;9268:2;9363:76;9431:7;9422:6;9411:9;9407:22;9363:76;:::i;:::-;9458:8;;-1:-1:-1;9337:102:1;-1:-1:-1;;9543:2:1;9528:18;;9515:32;9556:30;9515:32;9556:30;:::i;10454:983::-;;10580:2;10623;10611:9;10602:7;10598:23;10594:32;10591:2;;;10644:6;10636;10629:22;10591:2;10682:9;10676:16;-1:-1:-1;;;;;10752:2:1;10744:6;10741:14;10738:2;;;10773:6;10765;10758:22;10738:2;10816:6;10805:9;10801:22;10791:32;;10861:7;10854:4;10850:2;10846:13;10842:27;10832:2;;10888:6;10880;10873:22;10832:2;10922;10916:9;10944:2;10940;10937:10;10934:2;;;10950:9;10934:2;10988;10984;10980:11;10970:21;;11011:27;11034:2;11030;11026:11;11011:27;:::i;:::-;11072:15;;;11103:12;;;;11135:11;;;11165;;;11161:20;;11158:33;-1:-1:-1;11155:2:1;;;11209:6;11201;11194:22;11155:2;11236:6;11227:15;;11251:156;11265:2;11262:1;11259:9;11251:156;;;11322:10;;11310:23;;11283:1;11276:9;;;;;11353:12;;;;11385;;11251:156;;;-1:-1:-1;11426:5:1;10560:877;-1:-1:-1;;;;;;;;10560:877:1:o;11442:253::-;;11551:2;11539:9;11530:7;11526:23;11522:32;11519:2;;;11572:6;11564;11557:22;11519:2;11616:9;11603:23;11635:30;11659:5;11635:30;:::i;11700:257::-;;11820:2;11808:9;11799:7;11795:23;11791:32;11788:2;;;11841:6;11833;11826:22;11788:2;11878:9;11872:16;11897:30;11921:5;11897:30;:::i;12250:1049::-;;;;;;;;;;12510:3;12498:9;12489:7;12485:23;12481:33;12478:2;;;12532:6;12524;12517:22;12478:2;12576:9;12563:23;12595:33;12622:5;12595:33;:::i;:::-;12647:5;-1:-1:-1;12704:2:1;12689:18;;12676:32;12717:35;12676:32;12717:35;:::i;:::-;12771:7;-1:-1:-1;12830:2:1;12815:18;;12802:32;12843:35;12802:32;12843:35;:::i;:::-;12897:7;-1:-1:-1;12951:2:1;12936:18;;12923:32;;-1:-1:-1;13002:3:1;12987:19;;12974:33;;-1:-1:-1;13059:3:1;13044:19;;13031:33;13073:32;13031:33;13073:32;:::i;:::-;13124:7;-1:-1:-1;13150:39:1;13184:3;13169:19;;13150:39;:::i;:::-;13140:49;;13236:3;13225:9;13221:19;13208:33;13198:43;;13288:3;13277:9;13273:19;13260:33;13250:43;;12468:831;;;;;;;;;;;:::o;13862:415::-;;;14004:2;13992:9;13983:7;13979:23;13975:32;13972:2;;;14025:6;14017;14010:22;14282:907;;;;;;;;;14524:3;14512:9;14503:7;14499:23;14495:33;14492:2;;;14546:6;14538;14531:22;14492:2;14590:9;14577:23;14609:33;14636:5;14609:33;:::i;:::-;14661:5;-1:-1:-1;14718:2:1;14703:18;;14690:32;14731:35;14690:32;14731:35;:::i;:::-;14785:7;-1:-1:-1;14844:2:1;14829:18;;14816:32;14857:35;14816:32;14857:35;:::i;:::-;14911:7;-1:-1:-1;14965:2:1;14950:18;;14937:32;;-1:-1:-1;15016:3:1;15001:19;;14988:33;;-1:-1:-1;15040:39:1;15074:3;15059:19;;15040:39;:::i;:::-;15030:49;;15126:3;15115:9;15111:19;15098:33;15088:43;;15178:3;15167:9;15163:19;15150:33;15140:43;;14482:707;;;;;;;;;;;:::o;16606:736::-;;16739:2;16727:9;16718:7;16714:23;16710:32;16707:2;;;16760:6;16752;16745:22;16707:2;16798:9;16792:16;-1:-1:-1;;;;;16868:2:1;16860:6;16857:14;16854:2;;;16889:6;16881;16874:22;16854:2;16932:6;16921:9;16917:22;16907:32;;16977:7;16970:4;16966:2;16962:13;16958:27;16948:2;;17004:6;16996;16989:22;16948:2;17038;17032:9;17060:2;17056;17053:10;17050:2;;;17066:9;17050:2;17099:52;17141:2;17122:13;;-1:-1:-1;;17118:27:1;17147:2;17114:36;17099:52;:::i;:::-;17086:65;;17174:2;17167:5;17160:17;17214:7;17209:2;17204;17200;17196:11;17192:20;17189:33;17186:2;;;17240:6;17232;17225:22;17186:2;17258:54;17309:2;17304;17297:5;17293:14;17288:2;17284;17280:11;17258:54;:::i;:::-;-1:-1:-1;17331:5:1;16697:645;-1:-1:-1;;;;16697:645:1:o;17347:474::-;;;;17503:2;17491:9;17482:7;17478:23;17474:32;17471:2;;;17524:6;17516;17509:22;17471:2;17552:42;17584:9;17552:42;:::i;:::-;17542:52;;17613:51;17660:2;17649:9;17645:18;17613:51;:::i;:::-;17603:61;;17707:2;17696:9;17692:18;17686:25;17751:10;17744:5;17740:22;17733:5;17730:33;17720:2;;17782:6;17774;17767:22;17826:194;;17949:2;17937:9;17928:7;17924:23;17920:32;17917:2;;;17970:6;17962;17955:22;17917:2;-1:-1:-1;17998:16:1;;17907:113;-1:-1:-1;17907:113:1:o;18025:327::-;;;18154:2;18142:9;18133:7;18129:23;18125:32;18122:2;;;18175:6;18167;18160:22;18122:2;18216:9;18203:23;18193:33;;18276:2;18265:9;18261:18;18248:32;18289:33;18316:5;18289:33;:::i;18357:255::-;;;18497:2;18485:9;18476:7;18472:23;18468:32;18465:2;;;18518:6;18510;18503:22;18465:2;-1:-1:-1;;18546:16:1;;18602:2;18587:18;;;18581:25;18546:16;;18581:25;;-1:-1:-1;18455:157:1:o;18617:395::-;;;;18763:2;18751:9;18742:7;18738:23;18734:32;18731:2;;;18784:6;18776;18769:22;18731:2;18825:9;18812:23;18802:33;;18882:2;18871:9;18867:18;18854:32;18844:42;;18936:2;18925:9;18921:18;18908:32;18949:33;18976:5;18949:33;:::i;19017:316::-;;;;19174:2;19162:9;19153:7;19149:23;19145:32;19142:2;;;19195:6;19187;19180:22;19142:2;19229:9;19223:16;19213:26;;19279:2;19268:9;19264:18;19258:25;19248:35;;19323:2;19312:9;19308:18;19302:25;19292:35;;19132:201;;;;;:::o;19338:325::-;-1:-1:-1;;;;;;19517:2:1;19553:15;;;19549:24;;19537:37;;19608:15;;;;19604:24;19599:2;19590:12;;19583:46;19654:2;19645:12;;19485:178::o;19668:273::-;;19851:6;19843;19838:3;19825:33;19877:16;;19902:15;;;19877:16;19815:126;-1:-1:-1;19815:126:1:o;19946:274::-;;20113:6;20107:13;20129:53;20175:6;20170:3;20163:4;20155:6;20151:17;20129:53;:::i;:::-;20198:16;;;;;20083:137;-1:-1:-1;;20083:137:1:o;20225:495::-;-1:-1:-1;;;;;;20511:26:1;;20599:2;20570:15;;;;-1:-1:-1;;;;;;20566:45:1;20607:1;20553:11;;20546:66;20637:2;20628:12;;20621:28;;;;20674:2;20665:12;;20658:28;20711:2;20702:12;;20501:219::o;20725:203::-;-1:-1:-1;;;;;20889:32:1;;;;20871:51;;20859:2;20844:18;;20826:102::o;20933:363::-;-1:-1:-1;;;;;21155:32:1;;;;21137:51;;21231:14;;21224:22;21219:2;21204:18;;21197:50;21278:2;21263:18;;21256:34;21125:2;21110:18;;21092:204::o;21301:608::-;-1:-1:-1;;;;;21634:15:1;;;21616:34;;21686:15;;;;21681:2;21666:18;;21659:43;21745:14;;21738:22;21733:2;21718:18;;21711:50;21809:4;21797:17;21792:2;21777:18;;21770:45;21846:3;21831:19;;21824:35;21596:3;21875:19;;21868:35;;;;21565:3;21550:19;;21532:377::o;21914:375::-;-1:-1:-1;;;;;22172:15:1;;;22154:34;;22224:15;;;;22219:2;22204:18;;22197:43;22271:2;22256:18;;22249:34;;;;22104:2;22089:18;;22071:218::o;22294:752::-;-1:-1:-1;;;;;22683:15:1;;;22665:34;;22735:15;;;;22730:2;22715:18;;22708:43;22782:2;22767:18;;22760:34;;;;22825:2;22810:18;;22803:34;;;;22881:14;22874:22;22868:3;22853:19;;22846:51;22946:4;22934:17;22645:3;22913:19;;22906:46;22983:3;22968:19;;22961:35;23027:3;23012:19;;23005:35;;;;22614:3;22599:19;;22581:465::o;23051:760::-;-1:-1:-1;;;;;23466:15:1;;;23448:34;;23518:15;;;23513:2;23498:18;;23491:43;23565:2;23550:18;;23543:34;;;;23608:2;23593:18;;23586:34;;;;23651:3;23636:19;;23629:35;;;;23428:3;23680:19;;23673:35;23745:15;;;23739:3;23724:19;;23717:44;23792:3;23777:19;;23770:35;;;;23397:3;23382:19;;23364:447::o;23816:670::-;-1:-1:-1;;;;;24183:15:1;;;24165:34;;24235:15;;;;24230:2;24215:18;;24208:43;24282:2;24267:18;;24260:34;;;;24325:2;24310:18;;24303:34;;;;24386:4;24374:17;24368:3;24353:19;;24346:46;24145:3;24408:19;;24401:35;24467:3;24452:19;;24445:35;;;;24114:3;24099:19;;24081:405::o;24851:274::-;-1:-1:-1;;;;;25043:32:1;;;;25025:51;;25107:2;25092:18;;25085:34;25013:2;24998:18;;24980:145::o;25130:375::-;-1:-1:-1;;;;;25388:15:1;;;25370:34;;25435:2;25420:18;;25413:34;;;;25483:15;;;25478:2;25463:18;;25456:43;25320:2;25305:18;;25287:218::o;25898:467::-;-1:-1:-1;;;;;26192:15:1;;;26174:34;;26239:2;26224:18;;26217:34;;;;26287:15;;26282:2;26267:18;;26260:43;26351:6;26339:19;;;26334:2;26319:18;;26312:47;26123:3;26108:19;;26090:275::o;26370:187::-;26535:14;;26528:22;26510:41;;26498:2;26483:18;;26465:92::o;26562:565::-;-1:-1:-1;;;;;26914:15:1;;;26896:34;;26966:15;;;26961:2;26946:18;;26939:43;27018:15;;;;27013:2;26998:18;;26991:43;27065:2;27050:18;;27043:34;;;;27108:3;27093:19;;27086:35;;;;26845:3;26830:19;;26812:315::o;28248:536::-;28523:25;;;28579:2;28564:18;;28557:34;;;;-1:-1:-1;;;;;28627:32:1;28622:2;28607:18;;28600:60;28696:3;28691:2;28676:18;;28669:31;;;28248:536;28716:19;;;28709:33;28647:3;28759:19;;28513:271::o;28789:383::-;;28938:2;28927:9;28920:21;28970:6;28964:13;29013:6;29008:2;28997:9;28993:18;28986:34;29029:66;29088:6;29083:2;29072:9;29068:18;29063:2;29055:6;29051:15;29029:66;:::i;:::-;29156:2;29135:15;-1:-1:-1;;29131:29:1;29116:45;;;;29163:2;29112:54;;28910:262;-1:-1:-1;;28910:262:1:o;29177:345::-;29379:2;29361:21;;;29418:2;29398:18;;;29391:30;-1:-1:-1;;;29452:2:1;29437:18;;29430:51;29513:2;29498:18;;29351:171::o;29527:345::-;29729:2;29711:21;;;29768:2;29748:18;;;29741:30;-1:-1:-1;;;29802:2:1;29787:18;;29780:51;29863:2;29848:18;;29701:171::o;29877:352::-;30079:2;30061:21;;;30118:2;30098:18;;;30091:30;30157;30152:2;30137:18;;30130:58;30220:2;30205:18;;30051:178::o;30234:344::-;30436:2;30418:21;;;30475:2;30455:18;;;30448:30;-1:-1:-1;;;30509:2:1;30494:18;;30487:50;30569:2;30554:18;;30408:170::o;30583:344::-;30785:2;30767:21;;;30824:2;30804:18;;;30797:30;-1:-1:-1;;;30858:2:1;30843:18;;30836:50;30918:2;30903:18;;30757:170::o;30932:344::-;31134:2;31116:21;;;31173:2;31153:18;;;31146:30;-1:-1:-1;;;31207:2:1;31192:18;;31185:50;31267:2;31252:18;;31106:170::o;31281:343::-;31483:2;31465:21;;;31522:2;31502:18;;;31495:30;-1:-1:-1;;;31556:2:1;31541:18;;31534:49;31615:2;31600:18;;31455:169::o;31629:335::-;31831:2;31813:21;;;31870:2;31850:18;;;31843:30;-1:-1:-1;;;31904:2:1;31889:18;;31882:41;31955:2;31940:18;;31803:161::o;31969:344::-;32171:2;32153:21;;;32210:2;32190:18;;;32183:30;-1:-1:-1;;;32244:2:1;32229:18;;32222:50;32304:2;32289:18;;32143:170::o;32318:332::-;32520:2;32502:21;;;32559:1;32539:18;;;32532:29;-1:-1:-1;;;32592:2:1;32577:18;;32570:39;32641:2;32626:18;;32492:158::o;32655:347::-;32857:2;32839:21;;;32896:2;32876:18;;;32869:30;-1:-1:-1;;;32930:2:1;32915:18;;32908:53;32993:2;32978:18;;32829:173::o;33007:347::-;33209:2;33191:21;;;33248:2;33228:18;;;33221:30;-1:-1:-1;;;33282:2:1;33267:18;;33260:53;33345:2;33330:18;;33181:173::o;33359:355::-;33561:2;33543:21;;;33600:2;33580:18;;;33573:30;33639:33;33634:2;33619:18;;33612:61;33705:2;33690:18;;33533:181::o;33719:351::-;33921:2;33903:21;;;33960:2;33940:18;;;33933:30;-1:-1:-1;;;33994:2:1;33979:18;;33972:57;34061:2;34046:18;;33893:177::o;34075:353::-;34277:2;34259:21;;;34316:2;34296:18;;;34289:30;34355:31;34350:2;34335:18;;34328:59;34419:2;34404:18;;34249:179::o;34433:341::-;34635:2;34617:21;;;34674:2;34654:18;;;34647:30;-1:-1:-1;;;34708:2:1;34693:18;;34686:47;34765:2;34750:18;;34607:167::o;34779:356::-;34981:2;34963:21;;;35000:18;;;34993:30;35059:34;35054:2;35039:18;;35032:62;35126:2;35111:18;;34953:182::o;35140:342::-;35342:2;35324:21;;;35381:2;35361:18;;;35354:30;-1:-1:-1;;;35415:2:1;35400:18;;35393:48;35473:2;35458:18;;35314:168::o;35487:177::-;35633:25;;;35621:2;35606:18;;35588:76::o;36759:983::-;;37069:3;37058:9;37054:19;37100:6;37089:9;37082:25;37126:2;37164:6;37159:2;37148:9;37144:18;37137:34;37207:3;37202:2;37191:9;37187:18;37180:31;37231:6;37266;37260:13;37297:6;37289;37282:22;37335:3;37324:9;37320:19;37313:26;;37374:2;37366:6;37362:15;37348:29;;37395:4;37408:195;37422:6;37419:1;37416:13;37408:195;;;37487:13;;-1:-1:-1;;;;;37483:39:1;37471:52;;37578:15;;;;37543:12;;;;37519:1;37437:9;37408:195;;;-1:-1:-1;;;;;;;37659:32:1;;;;37654:2;37639:18;;37632:60;-1:-1:-1;;;37723:3:1;37708:19;37701:35;37620:3;37030:712;-1:-1:-1;;;37030:712:1:o;37747:248::-;37921:25;;;37977:2;37962:18;;37955:34;37909:2;37894:18;;37876:119::o;38000:345::-;38202:25;;;38258:2;38243:18;;38236:34;;;;-1:-1:-1;;;;;38306:32:1;38301:2;38286:18;;38279:60;38190:2;38175:18;;38157:188::o;38350:533::-;;;38493:11;38480:25;38587:2;38583:7;38572:8;38556:14;38552:29;38548:43;38528:18;38524:68;38514:2;;38609:4;38603;38596:18;38514:2;38639:33;;38691:20;;;-1:-1:-1;;;;;;38723:30:1;;38720:2;;;38769:4;38763;38756:18;38720:2;38805:4;38793:17;;-1:-1:-1;38836:14:1;38832:27;;;38822:38;;38819:2;;;38873:1;38870;38863:12;38888:242;38958:2;38952:9;38988:17;;;-1:-1:-1;;;;;39020:34:1;;39056:22;;;39017:62;39014:2;;;39082:9;39014:2;39109;39102:22;38932:198;;-1:-1:-1;38932:198:1:o;39135:258::-;39207:1;39217:113;39231:6;39228:1;39225:13;39217:113;;;39307:11;;;39301:18;39288:11;;;39281:39;39253:2;39246:10;39217:113;;;39348:6;39345:1;39342:13;39339:2;;;-1:-1:-1;;39383:1:1;39365:16;;39358:27;39188:205::o;39398:133::-;-1:-1:-1;;;;;39475:31:1;;39465:42;;39455:2;;39521:1;39518;39511:12;39455:2;39445:86;:::o;39536:120::-;39624:5;39617:13;39610:21;39603:5;39600:32;39590:2;;39646:1;39643;39636:12
Swarm Source
ipfs://89a5125d850fb87a89b52e2cb580c7d062e507e61b962188e0983cbea998b8cd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.