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 | 199 days ago | IN | 0 ETH | 0.00229057 | ||||
Unstake Sushi Fr... | 20819535 | 199 days ago | IN | 0 ETH | 0.00276833 | ||||
Batch | 19980675 | 316 days ago | IN | 0 ETH | 0.00124888 | ||||
Withdraw Token B... | 19945584 | 321 days ago | IN | 0 ETH | 0.00013983 | ||||
Batch | 19480390 | 386 days ago | IN | 0 ETH | 0.00611991 | ||||
Unstake Sushi Fr... | 19228176 | 421 days ago | IN | 0 ETH | 0.00368589 | ||||
Unstake Sushi Fr... | 19103383 | 439 days ago | IN | 0 ETH | 0.00130416 | ||||
Batch | 19040230 | 448 days ago | IN | 0 ETH | 0.00404693 | ||||
Stake Sushi To B... | 18277803 | 555 days ago | IN | 0 ETH | 0.00128472 | ||||
Batch | 18241755 | 560 days ago | IN | 0 ETH | 0.00222112 | ||||
Unstake Sushi Fr... | 18070342 | 584 days ago | IN | 0 ETH | 0.00177649 | ||||
Batch | 17609734 | 648 days ago | IN | 0 ETH | 0.00212283 | ||||
Unstake Sushi Fr... | 17580012 | 652 days ago | IN | 0 ETH | 0.00301098 | ||||
Stake Sushi To B... | 17578788 | 653 days ago | IN | 0 ETH | 0.0037749 | ||||
Unstake Sushi Fr... | 17571621 | 654 days ago | IN | 0 ETH | 0.0029957 | ||||
Batch | 17556905 | 656 days ago | IN | 0 ETH | 0.00198304 | ||||
Stake Sushi To B... | 17267104 | 696 days ago | IN | 0 ETH | 0.00747099 | ||||
Unstake Sushi Fr... | 17244000 | 700 days ago | IN | 0 ETH | 0.00595948 | ||||
Unstake Sushi Fr... | 17045816 | 728 days ago | IN | 0 ETH | 0.00334472 | ||||
Batch | 17037735 | 729 days ago | IN | 0 ETH | 0.00676841 | ||||
Batch | 16895092 | 749 days ago | IN | 0 ETH | 0.00201791 | ||||
Unstake Sushi Fr... | 16891722 | 749 days ago | IN | 0 ETH | 0.00461156 | ||||
Unstake Sushi Fr... | 16752282 | 769 days ago | IN | 0 ETH | 0.00792796 | ||||
Batch | 16738657 | 771 days ago | IN | 0 ETH | 0.00289817 | ||||
Unstake Sushi Fr... | 16662759 | 782 days ago | IN | 0 ETH | 0.00256187 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|---|
Transfer | 20819555 | 199 days ago | 0 ETH | |||||
Balance Of | 20819555 | 199 days ago | 0 ETH | |||||
Leave | 20819555 | 199 days ago | 0 ETH | |||||
Withdraw | 20819555 | 199 days ago | 0 ETH | |||||
Transfer | 20819535 | 199 days ago | 0 ETH | |||||
Balance Of | 20819535 | 199 days ago | 0 ETH | |||||
Leave | 20819535 | 199 days ago | 0 ETH | |||||
Withdraw | 20819535 | 199 days ago | 0 ETH | |||||
Deposit | 19980675 | 316 days ago | 0 ETH | |||||
Balance Of | 19980675 | 316 days ago | 0 ETH | |||||
Enter | 19980675 | 316 days ago | 0 ETH | |||||
Transfer From | 19980675 | 316 days ago | 0 ETH | |||||
Stake Sushi To B... | 19980675 | 316 days ago | 0 ETH | |||||
Set Master Contr... | 19980675 | 316 days ago | 0 ETH | |||||
Set Bento Approv... | 19980675 | 316 days ago | 0 ETH | |||||
Transfer | 19945584 | 321 days ago | 0 ETH | |||||
Balance Of | 19945584 | 321 days ago | 0 ETH | |||||
Transfer | 19480390 | 386 days ago | 0 ETH | |||||
Balance Of | 19480390 | 386 days ago | 0 ETH | |||||
Leave | 19480390 | 386 days ago | 0 ETH | |||||
Withdraw | 19480390 | 386 days ago | 0 ETH | |||||
Unstake Sushi Fr... | 19480390 | 386 days ago | 0 ETH | |||||
Set Master Contr... | 19480390 | 386 days ago | 0 ETH | |||||
Set Bento Approv... | 19480390 | 386 days ago | 0 ETH | |||||
Transfer | 19228176 | 421 days ago | 0 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
Contract ABI
API[{"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 | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.