More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 25,840 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 22325176 | 1 hr ago | IN | 0 ETH | 0.00144109 | ||||
Add Liquidity ET... | 22323646 | 6 hrs ago | IN | 0.00000325 ETH | 0.0000735 | ||||
Add Liquidity ET... | 22322793 | 9 hrs ago | IN | 0.00000222 ETH | 0.00006177 | ||||
Add Liquidity ET... | 22322785 | 9 hrs ago | IN | 0.0000039 ETH | 0.00006323 | ||||
Add Liquidity ET... | 22322781 | 9 hrs ago | IN | 0.0000039 ETH | 0.00006876 | ||||
Remove Liquidity... | 22319227 | 21 hrs ago | IN | 0 ETH | 0.0001459 | ||||
Swap Tokens For ... | 22318764 | 22 hrs ago | IN | 0 ETH | 0.0000404 | ||||
Swap Tokens For ... | 22318764 | 22 hrs ago | IN | 0 ETH | 0.00004042 | ||||
Add Liquidity ET... | 22317843 | 25 hrs ago | IN | 0.0036046 ETH | 0.00030879 | ||||
Add Liquidity ET... | 22317836 | 25 hrs ago | IN | 0.0000018 ETH | 0.00036348 | ||||
Add Liquidity | 22315933 | 32 hrs ago | IN | 0 ETH | 0.00035656 | ||||
Add Liquidity ET... | 22315784 | 32 hrs ago | IN | 0.00014647 ETH | 0.00006011 | ||||
Add Liquidity ET... | 22315779 | 32 hrs ago | IN | 0.00058467 ETH | 0.00006242 | ||||
Remove Liquidity... | 22315223 | 34 hrs ago | IN | 0 ETH | 0.00007296 | ||||
Add Liquidity ET... | 22314930 | 35 hrs ago | IN | 0.011622 ETH | 0.00024741 | ||||
Swap Tokens For ... | 22314912 | 35 hrs ago | IN | 0 ETH | 0.00014823 | ||||
Add Liquidity ET... | 22311320 | 47 hrs ago | IN | 0.0018386 ETH | 0.00026942 | ||||
Add Liquidity ET... | 22309769 | 2 days ago | IN | 0.00000005 ETH | 0.00006579 | ||||
Add Liquidity ET... | 22306327 | 2 days ago | IN | 0.00000004 ETH | 0.00006063 | ||||
Add Liquidity ET... | 22305789 | 2 days ago | IN | 0.00038671 ETH | 0.00005897 | ||||
Add Liquidity ET... | 22305033 | 2 days ago | IN | 0.00001273 ETH | 0.00006963 | ||||
Remove Liquidity... | 22304016 | 3 days ago | IN | 0 ETH | 0.00024501 | ||||
Remove Liquidity... | 22303333 | 3 days ago | IN | 0 ETH | 0.00007283 | ||||
Remove Liquidity | 22303326 | 3 days ago | IN | 0 ETH | 0.00006824 | ||||
Remove Liquidity... | 22303312 | 3 days ago | IN | 0 ETH | 0.00007835 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22325176 | 1 hr ago | 0.00356603 ETH | ||||
Transfer | 22325176 | 1 hr ago | 0.00356603 ETH | ||||
Transfer | 22324924 | 2 hrs ago | 0.00123005 ETH | ||||
Transfer | 22324924 | 2 hrs ago | 0.00123005 ETH | ||||
Deposit | 22323646 | 6 hrs ago | 0.00000325 ETH | ||||
Deposit | 22322793 | 9 hrs ago | 0.00000222 ETH | ||||
Deposit | 22322785 | 9 hrs ago | 0.0000039 ETH | ||||
Deposit | 22322781 | 9 hrs ago | 0.0000039 ETH | ||||
Transfer | 22319227 | 21 hrs ago | 0.00135957 ETH | ||||
Transfer | 22319227 | 21 hrs ago | 0.00135957 ETH | ||||
Transfer | 22317843 | 25 hrs ago | 0.00001316 ETH | ||||
Deposit | 22317843 | 25 hrs ago | 0.00359143 ETH | ||||
Transfer | 22317836 | 25 hrs ago | 0 ETH | ||||
Deposit | 22317836 | 25 hrs ago | 0.00000179 ETH | ||||
Deposit | 22317050 | 28 hrs ago | 0.0009963 ETH | ||||
Swap Exact ETH F... | 22317050 | 28 hrs ago | 0.0009963 ETH | ||||
Deposit | 22316795 | 29 hrs ago | 0.00309851 ETH | ||||
Swap Exact ETH F... | 22316795 | 29 hrs ago | 0.00309851 ETH | ||||
Transfer | 22315784 | 32 hrs ago | 0.00000002 ETH | ||||
Deposit | 22315784 | 32 hrs ago | 0.00014644 ETH | ||||
Deposit | 22315779 | 32 hrs ago | 0.00058467 ETH | ||||
Transfer | 22315223 | 34 hrs ago | 0.00336613 ETH | ||||
Transfer | 22315223 | 34 hrs ago | 0.00336613 ETH | ||||
Transfer | 22314930 | 35 hrs ago | 0.00000039 ETH | ||||
Deposit | 22314930 | 35 hrs ago | 0.0116216 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SwapsRouter
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; import "./IWETH.sol"; import "./IERC20.sol"; import "./ISwapsFactory.sol"; import "./ISwapsPair.sol"; import "./SwapsHelper.sol"; contract SwapsRouter is SwapsHelper { address public immutable FACTORY; address public immutable WETH; address public immutable PAIR; modifier ensure( uint256 _deadline ) { require( _deadline >= block.timestamp, "SwapsRouter: DEADLINE_EXPIRED" ); _; } constructor( address _factory, address _WETH ) { FACTORY = _factory; WETH = _WETH; PAIR = ISwapsFactory(_factory).cloneTarget(); } receive() external payable { require( msg.sender == WETH, "SwapsRouter: INVALID_SENDER" ); } function _addLiquidity( address _tokenA, address _tokenB, uint256 _amountADesired, uint256 _amountBDesired, uint256 _amountAMin, uint256 _amountBMin ) internal returns (uint256, uint256) { if (ISwapsFactory(FACTORY).getPair(_tokenA, _tokenB) == ZERO_ADDRESS) { ISwapsFactory(FACTORY).createPair( _tokenA, _tokenB ); } ( uint256 reserveA, uint256 reserveB ) = getReserves( FACTORY, _tokenA, _tokenB ); if (reserveA == 0 && reserveB == 0) { return ( _amountADesired, _amountBDesired ); } uint256 amountBOptimal = quote( _amountADesired, reserveA, reserveB ); if (amountBOptimal <= _amountBDesired) { require( amountBOptimal >= _amountBMin, "SwapsRouter: INSUFFICIENT_B_AMOUNT" ); return ( _amountADesired, amountBOptimal ); } uint256 amountAOptimal = quote( _amountBDesired, reserveB, reserveA ); require( amountAOptimal <= _amountADesired, "SwapsRouter: INVALID_DESIRED_AMOUNT" ); require( amountAOptimal >= _amountAMin, "SwapsRouter: INSUFFICIENT_A_AMOUNT" ); return ( amountAOptimal, _amountBDesired ); } function addLiquidity( address _tokenA, address _tokenB, uint256 _amountADesired, uint256 _amountBDesired, uint256 _amountAMin, uint256 _amountBMin, address _to, uint256 _deadline ) external ensure(_deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB) = _addLiquidity( _tokenA, _tokenB, _amountADesired, _amountBDesired, _amountAMin, _amountBMin ); address pair = _pairFor( FACTORY, _tokenA, _tokenB, PAIR ); _safeTransferFrom( _tokenA, msg.sender, pair, amountA ); _safeTransferFrom( _tokenB, msg.sender, pair, amountB ); liquidity = ISwapsPair(pair).mint(_to); } function addLiquidityETH( address _token, uint256 _amountTokenDesired, uint256 _amountTokenMin, uint256 _amountETHMin, address _to, uint256 _deadline ) external payable ensure(_deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity( _token, WETH, _amountTokenDesired, msg.value, _amountTokenMin, _amountETHMin ); address pair = _pairFor( FACTORY, _token, WETH, PAIR ); _safeTransferFrom( _token, msg.sender, pair, amountToken ); IWETH(WETH).deposit{ value: amountETH }(); require( IWETH(WETH).transfer( pair, amountETH ), "SwapsRouter: TRANSFER_FAIL" ); liquidity = ISwapsPair(pair).mint(_to); if (msg.value > amountETH) { unchecked { _safeTransferETH( msg.sender, msg.value - amountETH ); } } } function removeLiquidity( address _tokenA, address _tokenB, uint256 _liquidity, uint256 _amountAMin, uint256 _amountBMin, address _to, uint256 _deadline ) public ensure(_deadline) returns ( uint256 amountA, uint256 amountB ) { address pair = _pairFor( FACTORY, _tokenA, _tokenB, PAIR ); _safeTransferFrom( pair, msg.sender, pair, _liquidity ); ( uint256 amount0, uint256 amount1 ) = ISwapsPair(pair).burn(_to); (address token0,) = sortTokens( _tokenA, _tokenB ); (amountA, amountB) = _tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require( amountA >= _amountAMin, "SwapsRouter: INSUFFICIENT_A_AMOUNT" ); require( amountB >= _amountBMin, "SwapsRouter: INSUFFICIENT_B_AMOUNT" ); } function removeLiquidityETH( address _token, uint256 _liquidity, uint256 _amountTokenMin, uint256 _amountETHMin, address _to, uint256 _deadline ) public ensure(_deadline) returns ( uint256 amountToken, uint256 amountETH ) { (amountToken, amountETH) = removeLiquidity( _token, WETH, _liquidity, _amountTokenMin, _amountETHMin, address(this), _deadline ); _safeTransfer( _token, _to, amountToken ); IWETH(WETH).withdraw( amountETH ); _safeTransferETH( _to, amountETH ); } function removeLiquidityWithPermit( address _tokenA, address _tokenB, uint256 _liquidity, uint256 _amountAMin, uint256 _amountBMin, address _to, uint256 _deadline, bool _approveMax, uint8 _v, bytes32 _r, bytes32 _s ) external returns (uint256, uint256) { address pair = _pairFor( FACTORY, _tokenA, _tokenB, PAIR ); uint256 value = _approveMax ? UINT256_MAX : _liquidity; ISwapsPair(pair).permit( msg.sender, address(this), value, _deadline, _v, _r, _s ); return removeLiquidity( _tokenA, _tokenB, _liquidity, _amountAMin, _amountBMin, _to, _deadline ); } function removeLiquidityETHWithPermit( address _token, uint256 _liquidity, uint256 _amountTokenMin, uint256 _amountETHMin, address _to, uint256 _deadline, bool _approveMax, uint8 _v, bytes32 _r, bytes32 _s ) external returns (uint256, uint256) { address pair = _pairFor( FACTORY, _token, WETH, PAIR ); uint256 value = _approveMax ? UINT256_MAX : _liquidity; ISwapsPair(pair).permit( msg.sender, address(this), value, _deadline, _v, _r, _s ); return removeLiquidityETH( _token, _liquidity, _amountTokenMin, _amountETHMin, _to, _deadline ); } function removeLiquidityETHSupportingFeeOnTransferTokens( address _token, uint256 _liquidity, uint256 _amountTokenMin, uint256 _amountETHMin, address _to, uint256 _deadline ) public ensure(_deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity( _token, WETH, _liquidity, _amountTokenMin, _amountETHMin, address(this), _deadline ); _safeTransfer( _token, _to, IERC20(_token).balanceOf(address(this)) ); IWETH(WETH).withdraw( amountETH ); _safeTransferETH( _to, amountETH ); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address _token, uint256 _liquidity, uint256 _amountTokenMin, uint256 _amountETHMin, address _to, uint256 _deadline, bool _approveMax, uint8 _v, bytes32 _r, bytes32 _s ) external returns (uint256 amountETH) { address pair = _pairFor( FACTORY, _token, WETH, PAIR ); uint256 value = _approveMax ? UINT256_MAX : _liquidity; ISwapsPair(pair).permit( msg.sender, address(this), value, _deadline, _v, _r, _s ); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( _token, _liquidity, _amountTokenMin, _amountETHMin, _to, _deadline ); } function _swap( uint256[] memory _amounts, address[] memory _path, address _to ) internal { for (uint256 i; i < _path.length - 1; i++) { (address input, address output) = ( _path[i], _path[i + 1] ); (address token0,) = sortTokens( input, output ); uint256 amountOut = _amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < _path.length - 2 ? _pairFor(FACTORY, output, _path[i + 2], PAIR) : _to; ISwapsPair( _pairFor( FACTORY, input, output, PAIR ) ).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 _amountIn, uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) returns (uint256[] memory amounts) { amounts = _getAmountsOut( FACTORY, _amountIn, _path ); require( amounts[amounts.length - 1] >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ); _swap( amounts, _path, _to ); } function swapTokensForExactTokens( uint256 _amountOut, uint256 _amountInMax, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) returns (uint256[] memory amounts) { amounts = _getAmountsIn( FACTORY, _amountOut, _path ); require( amounts[0] <= _amountInMax, "SwapsRouter: EXCESSIVE_INPUT_AMOUNT" ); _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ); _swap( amounts, _path, _to ); } function swapExactETHForTokens( uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external payable ensure(_deadline) returns (uint256[] memory amounts) { require( _path[0] == WETH, "SwapsRouter: INVALID_PATH" ); amounts = _getAmountsOut( FACTORY, msg.value, _path ); require( amounts[amounts.length - 1] >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{ value: amounts[0] }(); require( IWETH(WETH).transfer( _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ), "SwapsRouter: TRANSFER_FAIL" ); _swap( amounts, _path, _to ); } function swapTokensForExactETH( uint256 _amountOut, uint256 _amountInMax, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) returns (uint256[] memory amounts) { require( _path[_path.length - 1] == WETH, "SwapsRouter: INVALID_PATH" ); amounts = _getAmountsIn( FACTORY, _amountOut, _path ); require( amounts[0] <= _amountInMax, "SwapsRouter: EXCESSIVE_INPUT_AMOUNT" ); _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ); _swap( amounts, _path, address(this) ); IWETH(WETH).withdraw( amounts[amounts.length - 1] ); _safeTransferETH( _to, amounts[amounts.length - 1] ); } function swapExactTokensForETH( uint256 _amountIn, uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) returns (uint256[] memory amounts) { require( _path[_path.length - 1] == WETH, "SwapsRouter: INVALID_PATH" ); amounts = _getAmountsOut( FACTORY, _amountIn, _path ); require( amounts[amounts.length - 1] >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ); _swap( amounts, _path, address(this) ); IWETH(WETH).withdraw( amounts[amounts.length - 1] ); _safeTransferETH( _to, amounts[amounts.length - 1] ); } function swapETHForExactTokens( uint256 _amountOut, address[] calldata _path, address _to, uint256 _deadline ) external payable ensure(_deadline) returns (uint256[] memory amounts) { require( _path[0] == WETH, "SwapsRouter: INVALID_PATH" ); amounts = _getAmountsIn( FACTORY, _amountOut, _path ); require( amounts[0] <= msg.value, "SwapsRouter: EXCESSIVE_INPUT_AMOUNT" ); IWETH(WETH).deposit{ value: amounts[0] }(); require( IWETH(WETH).transfer( _pairFor( FACTORY, _path[0], _path[1], PAIR ), amounts[0] ), "SwapsRouter: TRANSFER_FAIL" ); _swap( amounts, _path, _to ); if (msg.value > amounts[0]) { unchecked { _safeTransferETH( msg.sender, msg.value - amounts[0] ); } } } function _swapSupportingFeeOnTransferTokens( address[] memory _path, address _to ) internal { for (uint256 i; i < _path.length - 1; i++) { (address input, address output) = ( _path[i], _path[i + 1] ); (address token0,) = sortTokens( input, output ); ISwapsPair pair = ISwapsPair( _pairFor( FACTORY, input, output, PAIR ) ); uint256 amountInput; uint256 amountOutput; { ( uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; amountOutput = getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < _path.length - 2 ? _pairFor(FACTORY, output, _path[i + 2], PAIR) : _to; pair.swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 _amountIn, uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) { _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), _amountIn ); uint256 balanceBefore = IERC20(_path[_path.length - 1]).balanceOf(_to); _swapSupportingFeeOnTransferTokens( _path, _to ); require( IERC20(_path[_path.length - 1]).balanceOf(_to) - balanceBefore >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external payable ensure(_deadline) { require( _path[0] == WETH, "SwapsRouter: INVALID_PATH" ); uint256 amountIn = msg.value; IWETH(WETH).deposit{ value: amountIn }(); require( IWETH(WETH).transfer( _pairFor( FACTORY, _path[0], _path[1], PAIR ), amountIn ), "SwapsRouter: TRANSFER_FAIL" ); uint256 balanceBefore = IERC20(_path[_path.length - 1]).balanceOf(_to); _swapSupportingFeeOnTransferTokens( _path, _to ); require( IERC20(_path[_path.length - 1]).balanceOf(_to) - balanceBefore >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 _amountIn, uint256 _amountOutMin, address[] calldata _path, address _to, uint256 _deadline ) external ensure(_deadline) { require( _path[_path.length - 1] == WETH, "SwapsRouter: INVALID_PATH" ); _safeTransferFrom( _path[0], msg.sender, _pairFor( FACTORY, _path[0], _path[1], PAIR ), _amountIn ); _swapSupportingFeeOnTransferTokens( _path, address(this) ); uint256 amountOut = IERC20(WETH).balanceOf( address(this) ); require( amountOut >= _amountOutMin, "SwapsRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw( amountOut ); _safeTransferETH( _to, amountOut ); } function pairFor( address _factory, address _tokenA, address _tokenB ) external view returns (address predicted) { predicted = _pairFor( _factory, _tokenA, _tokenB, PAIR ); } function getAmountsOut( uint256 _amountIn, address[] memory _path ) external view returns (uint256[] memory amounts) { return _getAmountsOut( FACTORY, _amountIn, _path ); } function getAmountsIn( uint256 _amountOut, address[] memory _path ) external view returns (uint256[] memory amounts) { return _getAmountsIn( FACTORY, _amountOut, _path ); } function getReserves( address _factory, address _tokenA, address _tokenB ) internal view returns ( uint256 reserveA, uint256 reserveB ) { (address token0,) = sortTokens( _tokenA, _tokenB ); ( uint256 reserve0, uint256 reserve1, ) = ISwapsPair( _pairFor( _factory, _tokenA, _tokenB, PAIR ) ).getReserves(); (reserveA, reserveB) = _tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } function _getAmountsOut( address _factory, uint256 _amountIn, address[] memory _path ) internal view returns (uint256[] memory amounts) { require( _path.length >= 2, "SwapsRouter: INVALID_PATH" ); amounts = new uint256[]( _path.length ); amounts[0] = _amountIn; for (uint256 i; i < _path.length - 1; i++) { ( uint256 reserveIn, uint256 reserveOut ) = getReserves( _factory, _path[i], _path[i + 1] ); amounts[i + 1] = getAmountOut( amounts[i], reserveIn, reserveOut ); } } function _getAmountsIn( address _factory, uint256 _amountOut, address[] memory _path ) internal view returns (uint256[] memory amounts) { require( _path.length >= 2, "SwapsRouter: INVALID_PATH" ); amounts = new uint256[]( _path.length ); amounts[amounts.length - 1] = _amountOut; for (uint256 i = _path.length - 1; i > 0; i--) { ( uint256 reserveIn, uint256 reserveOut ) = getReserves( _factory, _path[i - 1], _path[i] ); amounts[i - 1] = getAmountIn( amounts[i], reserveIn, reserveOut ); } } } contract RouterCodeCheck { function routerCodeHash() external pure returns (bytes32) { return keccak256( type(SwapsRouter).creationCode ); } }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; interface IERC20 { function balanceOf( address _owner ) external view returns (uint256); }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; interface ISwapsCallee { function swapsCall( address _sender, uint256 _amount0, uint256 _amount1, bytes calldata _data ) external; }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; interface ISwapsERC20 { function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf( address _owner ) external view returns (uint256); function allowance( address _owner, address _spender ) external view returns (uint256); function approve( address _spender, uint256 _value ) external returns (bool); function transfer( address _to, uint256 _value ) external returns (bool); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces( address _owner ) external view returns (uint256); function permit( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external; }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; interface ISwapsFactory { function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair( address _tokenA, address _tokenB ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair( address _tokenA, address _tokenB ) external returns (address pair); function setFeeTo( address ) external; function setFeeToSetter( address ) external; function cloneTarget() external view returns (address target); }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; import "./ISwapsERC20.sol"; interface ISwapsPair is ISwapsERC20 { function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint( address _to ) external returns (uint256 liquidity); function burn( address _to ) external returns ( uint256 amount0, uint256 amount1 ); function swap( uint256 _amount0Out, uint256 _amount1Out, address _to, bytes calldata _data ) external; function skim() external; function initialize( address, address ) external; }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; interface IWETH { function deposit() external payable; function transfer( address _to, uint256 _value ) external returns (bool); function withdraw( uint256 ) external; }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; contract SwapsERC20 { string public constant name = "Verse Exchange"; string public constant symbol = "VERSE-X"; uint8 public constant decimals = 18; address constant ZERO_ADDRESS = address(0); uint256 constant UINT256_MAX = type(uint256).max; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public nonces; bytes32 public immutable DOMAIN_SEPARATOR; bytes32 public constant PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer( address indexed from, address indexed to, uint256 value ); constructor() { DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); } function _mint( address _to, uint256 _value ) internal { totalSupply = totalSupply + _value; unchecked { balanceOf[_to] = balanceOf[_to] + _value; } emit Transfer( ZERO_ADDRESS, _to, _value ); } function _burn( address _from, uint256 _value ) internal { unchecked { totalSupply = totalSupply - _value; } balanceOf[_from] = balanceOf[_from] - _value; emit Transfer( _from, ZERO_ADDRESS, _value ); } function _approve( address _owner, address _spender, uint256 _value ) private { allowance[_owner][_spender] = _value; emit Approval( _owner, _spender, _value ); } function _transfer( address _from, address _to, uint256 _value ) private { balanceOf[_from] = balanceOf[_from] - _value; unchecked { balanceOf[_to] = balanceOf[_to] + _value; } emit Transfer( _from, _to, _value ); } function approve( address _spender, uint256 _value ) external returns (bool) { _approve( msg.sender, _spender, _value ); return true; } function transfer( address _to, uint256 _value ) external returns (bool) { _transfer( msg.sender, _to, _value ); return true; } function transferFrom( address _from, address _to, uint256 _value ) external returns (bool) { if (allowance[_from][msg.sender] != UINT256_MAX) { allowance[_from][msg.sender] -= _value; } _transfer( _from, _to, _value ); return true; } function permit( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { require( _deadline >= block.timestamp, "SwapsERC20: PERMIT_CALL_EXPIRED" ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, _owner, _spender, _value, nonces[_owner]++, _deadline ) ) ) ); if (uint256(_s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("SwapsERC20: INVALID_SIGNATURE"); } address recoveredAddress = ecrecover( digest, _v, _r, _s ); require( recoveredAddress != ZERO_ADDRESS && recoveredAddress == _owner, "SwapsERC20: INVALID_SIGNATURE" ); _approve( _owner, _spender, _value ); } }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; import "./ISwapsPair.sol"; import "./SwapsPair.sol"; contract SwapsFactory { address public feeTo; address public feeToSetter; address public immutable cloneTarget; address constant ZERO_ADDRESS = address(0); address[] public allPairs; mapping(address => mapping(address => address)) public getPair; event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); constructor( address _feeToSetter ) { if (_feeToSetter == ZERO_ADDRESS) { revert("SwapsFactory: INVALID_INPUT"); } feeToSetter = _feeToSetter; feeTo = _feeToSetter; bytes32 salt; address pair; bytes memory bytecode = type(SwapsPair).creationCode; assembly { pair := create2( 0, add(bytecode, 32), mload(bytecode), salt ) } cloneTarget = pair; } function allPairsLength() external view returns (uint256) { return allPairs.length; } function createPair( address _tokenA, address _tokenB ) external returns (address pair) { require( _tokenA != _tokenB, "SwapsFactory: IDENTICAL" ); (address token0, address token1) = _tokenA < _tokenB ? (_tokenA, _tokenB) : (_tokenB, _tokenA); require( token0 != ZERO_ADDRESS, "SwapsFactory: ZERO_ADDRESS" ); require( getPair[token0][token1] == ZERO_ADDRESS, "SwapsFactory: PAIR_ALREADY_EXISTS" ); bytes32 salt = keccak256( abi.encodePacked( token0, token1 ) ); bytes20 targetBytes = bytes20( cloneTarget ); assembly { let clone := mload(0x40) mstore( clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore( add(clone, 0x14), targetBytes ) mstore( add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) pair := create2(0, clone, 0x37, salt) } ISwapsPair(pair).initialize( token0, token1 ); getPair[token0][token1] = pair; getPair[token1][token0] = pair; allPairs.push(pair); emit PairCreated( token0, token1, pair, allPairs.length ); } function setFeeTo( address _feeTo ) external { require( msg.sender == feeToSetter, "SwapsFactory: FORBIDDEN" ); require( _feeTo != ZERO_ADDRESS, 'SwapsFactory: ZERO_ADDRESS' ); feeTo = _feeTo; } function setFeeToSetter( address _feeToSetter ) external { require( msg.sender == feeToSetter, "SwapsFactory: FORBIDDEN" ); require( _feeToSetter != ZERO_ADDRESS, 'SwapsFactory: ZERO_ADDRESS' ); feeToSetter = _feeToSetter; } } contract FactoryCodeCheck { function factoryCodeHash() external pure returns (bytes32) { return keccak256( type(SwapsFactory).creationCode ); } function pairCodeHash() external pure returns (bytes32) { return keccak256( type(SwapsPair).creationCode ); } }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; contract SwapsHelper { uint256 constant UINT256_MAX = type(uint256).max; address constant ZERO_ADDRESS = address(0); function sortTokens( address _tokenA, address _tokenB ) internal pure returns ( address token0, address token1 ) { require( _tokenA != _tokenB, "SwapsHelper: IDENTICAL_ADDRESSES" ); (token0, token1) = _tokenA < _tokenB ? (_tokenA, _tokenB) : (_tokenB, _tokenA); require( token0 != ZERO_ADDRESS, "SwapsHelper: ZERO_ADDRESS" ); } function quote( uint256 _amountA, uint256 _reserveA, uint256 _reserveB ) public pure returns (uint256 amountB) { require( _amountA > 0, "SwapsHelper: INSUFFICIENT_AMOUNT" ); require( _reserveA > 0 && _reserveB > 0, "SwapsHelper: INSUFFICIENT_LIQUIDITY" ); amountB = _amountA * _reserveB / _reserveA; } function getAmountOut( uint256 _amountIn, uint256 _reserveIn, uint256 _reserveOut ) public pure returns (uint256 amountOut) { require( _amountIn > 0, "SwapsHelper: INSUFFICIENT_INPUT_AMOUNT" ); require( _reserveIn > 0 && _reserveOut > 0, "SwapsHelper: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = _amountIn * 997; uint256 numerator = amountInWithFee * _reserveOut; uint256 denominator = _reserveIn * 1000 + amountInWithFee; amountOut = numerator / denominator; } function getAmountIn( uint256 _amountOut, uint256 _reserveIn, uint256 _reserveOut ) public pure returns (uint256 amountIn) { require( _amountOut > 0, "SwapsHelper: INSUFFICIENT_OUTPUT_AMOUNT" ); require( _reserveIn > 0 && _reserveOut > 0, "SwapsHelper: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = _reserveIn * _amountOut * 1000; uint256 denominator = (_reserveOut - _amountOut) * 997; amountIn = numerator / denominator + 1; } bytes4 constant TRANSFER = bytes4( keccak256( bytes( "transfer(address,uint256)" ) ) ); bytes4 constant TRANSFER_FROM = bytes4( keccak256( bytes( "transferFrom(address,address,uint256)" ) ) ); function _safeTransfer( address _token, address _to, uint256 _value ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( TRANSFER, _to, _value ) ); require( success && ( data.length == 0 || abi.decode( data, (bool) ) ), "SwapsHelper: TRANSFER_FAILED" ); } function _safeTransferFrom( address _token, address _from, address _to, uint256 _value ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( TRANSFER_FROM, _from, _to, _value ) ); require( success && ( data.length == 0 || abi.decode( data, (bool) ) ), "SwapsHelper: TRANSFER_FROM_FAILED" ); } function _safeTransferETH( address to, uint256 value ) internal { (bool success,) = to.call{ value: value }(new bytes(0)); require( success, "SwapsHelper: ETH_TRANSFER_FAILED" ); } function _pairFor( address _factory, address _tokenA, address _tokenB, address _implementation ) internal pure returns (address predicted) { (address token0, address token1) = _tokenA < _tokenB ? (_tokenA, _tokenB) : (_tokenB, _tokenA); bytes32 salt = keccak256( abi.encodePacked( token0, token1 ) ); assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, _implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, _factory)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } }
// SPDX-License-Identifier: BCOM pragma solidity =0.8.14; import "./IERC20.sol"; import "./ISwapsFactory.sol"; import "./ISwapsCallee.sol"; import "./SwapsERC20.sol"; contract SwapsPair is SwapsERC20 { uint224 constant Q112 = 2 ** 112; uint112 constant UINT112_MAX = type(uint112).max; uint256 public constant MINIMUM_LIQUIDITY = 10 ** 3; bytes4 private constant SELECTOR = bytes4( keccak256(bytes('transfer(address,uint256)')) ); address public factory; address public token0; address public token1; uint112 private reserve0; uint112 private reserve1; uint32 private blockTimestampLast; uint256 public price0CumulativeLast; uint256 public price1CumulativeLast; uint256 public kLast; uint256 private unlocked; modifier lock() { require( unlocked == 1, "SwapsPair: LOCKED" ); unlocked = 0; _; unlocked = 1; } event Mint( address indexed sender, uint256 amount0, uint256 amount1 ); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync( uint112 reserve0, uint112 reserve1 ); function initialize( address _token0, address _token1 ) external { require( factory == ZERO_ADDRESS, "SwapsPair: ALREADY_INITIALIZED" ); token0 = _token0; token1 = _token1; factory = msg.sender; unlocked = 1; } function getReserves() public view returns ( uint112, uint112, uint32 ) { return ( reserve0, reserve1, blockTimestampLast ); } function _update( uint256 _balance0, uint256 _balance1, uint112 _reserve0, uint112 _reserve1 ) private { require( _balance0 <= UINT112_MAX && _balance1 <= UINT112_MAX, "SwapsPair: OVERFLOW" ); uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32); unchecked { uint32 timeElapsed = blockTimestamp - blockTimestampLast; if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { price0CumulativeLast += uint256(uqdiv(encode(_reserve1), _reserve0)) * timeElapsed; price1CumulativeLast += uint256(uqdiv(encode(_reserve0), _reserve1)) * timeElapsed; } } reserve0 = uint112(_balance0); reserve1 = uint112(_balance1); blockTimestampLast = blockTimestamp; emit Sync( reserve0, reserve1 ); } function _mintFee( uint112 _reserve0, uint112 _reserve1, uint256 _kLast ) private { if (_kLast == 0) return; uint256 rootK = sqrt(uint256(_reserve0) * _reserve1); uint256 rootKLast = sqrt(_kLast); if (rootK > rootKLast) { uint256 liquidity = totalSupply * (rootK - rootKLast) / (rootK * 5 + rootKLast); if (liquidity == 0) return; _mint( ISwapsFactory(factory).feeTo(), liquidity ); } } function mint( address _to ) external lock returns (uint256 liquidity) { ( uint112 _reserve0, uint112 _reserve1, ) = getReserves(); uint256 balance0 = IERC20(token0).balanceOf(address(this)); uint256 balance1 = IERC20(token1).balanceOf(address(this)); uint256 amount0 = balance0 - _reserve0; uint256 amount1 = balance1 - _reserve1; _mintFee( _reserve0, _reserve1, kLast ); uint256 _totalSupply = totalSupply; if (_totalSupply == 0) { liquidity = sqrt( amount0 * amount1 ) - MINIMUM_LIQUIDITY; _mint( ZERO_ADDRESS, MINIMUM_LIQUIDITY ); } else { liquidity = min( amount0 * _totalSupply / _reserve0, amount1 * _totalSupply / _reserve1 ); } require( liquidity > 0, "INSUFFICIENT_LIQUIDITY_MINTED" ); _mint( _to, liquidity ); _update( balance0, balance1, _reserve0, _reserve1 ); kLast = uint256(reserve0) * reserve1; emit Mint( msg.sender, amount0, amount1 ); } function burn( address _to ) external lock returns ( uint256 amount0, uint256 amount1 ) { ( uint112 _reserve0, uint112 _reserve1, ) = getReserves(); address _token0 = token0; address _token1 = token1; uint256 balance0 = IERC20(_token0).balanceOf(address(this)); uint256 balance1 = IERC20(_token1).balanceOf(address(this)); uint256 liquidity = balanceOf[address(this)]; _mintFee( _reserve0, _reserve1, kLast ); uint256 _totalSupply = totalSupply; amount0 = liquidity * balance0 / _totalSupply; amount1 = liquidity * balance1 / _totalSupply; require( amount0 > 0 && amount1 > 0, "INSUFFICIENT_LIQUIDITY_BURNED" ); _burn( address(this), liquidity ); _safeTransfer( _token0, _to, amount0 ); _safeTransfer( _token1, _to, amount1 ); balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); _update( balance0, balance1, _reserve0, _reserve1 ); kLast = uint256(reserve0) * reserve1; emit Burn( msg.sender, amount0, amount1, _to ); } function swap( uint256 _amount0Out, uint256 _amount1Out, address _to, bytes calldata _data ) external lock { require( _amount0Out > 0 || _amount1Out > 0, "INSUFFICIENT_OUTPUT_AMOUNT" ); ( uint112 _reserve0, uint112 _reserve1, ) = getReserves(); require( _amount0Out < _reserve0 && _amount1Out < _reserve1, "INSUFFICIENT_LIQUIDITY" ); uint256 balance0; uint256 balance1; { address _token0 = token0; address _token1 = token1; if (_amount0Out > 0) _safeTransfer(_token0, _to, _amount0Out); if (_amount1Out > 0) _safeTransfer(_token1, _to, _amount1Out); if (_data.length > 0) ISwapsCallee(_to).swapsCall( msg.sender, _amount0Out, _amount1Out, _data ); balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); } uint256 _amount0In = balance0 > _reserve0 - _amount0Out ? balance0 - (_reserve0 - _amount0Out) : 0; uint256 _amount1In = balance1 > _reserve1 - _amount1Out ? balance1 - (_reserve1 - _amount1Out) : 0; require( _amount0In > 0 || _amount1In > 0, "INSUFFICIENT_INPUT_AMOUNT" ); { uint256 balance0Adjusted = balance0 * 1000 - (_amount0In * 3); uint256 balance1Adjusted = balance1 * 1000 - (_amount1In * 3); require( balance0Adjusted * balance1Adjusted >= uint256(_reserve0) * _reserve1 * (1000 ** 2) ); } _update( balance0, balance1, _reserve0, _reserve1 ); emit Swap( msg.sender, _amount0In, _amount1In, _amount0Out, _amount1Out, _to ); } function skim() external lock { address _token0 = token0; address _token1 = token1; address _feesTo = ISwapsFactory(factory).feeTo(); _safeTransfer( _token0, _feesTo, IERC20(_token0).balanceOf(address(this)) - reserve0 ); _safeTransfer( _token1, _feesTo, IERC20(_token1).balanceOf(address(this)) - reserve1 ); } function sync() external lock { _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1 ); } function encode( uint112 _y ) pure internal returns (uint224 z) { unchecked { z = uint224(_y) * Q112; } } function uqdiv( uint224 _x, uint112 _y ) pure internal returns (uint224 z) { unchecked { z = _x / uint224(_y); } } function min( uint256 _x, uint256 _y ) internal pure returns (uint256 z) { z = _x < _y ? _x : _y; } function sqrt( uint256 _y ) internal pure returns (uint256 z) { unchecked { if (_y > 3) { z = _y; uint256 x = _y / 2 + 1; while (x < z) { z = x; x = (_y / x + x) / 2; } } else if (_y != 0) { z = 1; } } } function _safeTransfer( address _token, address _to, uint256 _value ) internal { (bool success, bytes memory data) = _token.call( abi.encodeWithSelector( SELECTOR, _to, _value ) ); require( success && ( data.length == 0 || abi.decode( data, (bool) ) ), "SwapsPair: TRANSFER_FAILED" ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"},{"internalType":"uint256","name":"_amountADesired","type":"uint256"},{"internalType":"uint256","name":"_amountBDesired","type":"uint256"},{"internalType":"uint256","name":"_amountAMin","type":"uint256"},{"internalType":"uint256","name":"_amountBMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"_reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"_reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"predicted","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountA","type":"uint256"},{"internalType":"uint256","name":"_reserveA","type":"uint256"},{"internalType":"uint256","name":"_reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountAMin","type":"uint256"},{"internalType":"uint256","name":"_amountBMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bool","name":"_approveMax","type":"bool"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bool","name":"_approveMax","type":"bool"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amountAMin","type":"uint256"},{"internalType":"uint256","name":"_amountBMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bool","name":"_approveMax","type":"bool"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_amountInMax","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_amountInMax","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b50604051620045f9380380620045f98339810160408190526200003491620000de565b6001600160a01b03808316608081905290821660a05260408051630a54e0db60e21b81529051632953836c916004808201926020929091908290030181865afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac919062000116565b6001600160a01b031660c052506200013b9050565b80516001600160a01b0381168114620000d957600080fd5b919050565b60008060408385031215620000f257600080fd5b620000fd83620000c1565b91506200010d60208401620000c1565b90509250929050565b6000602082840312156200012957600080fd5b6200013482620000c1565b9392505050565b60805160a05160c0516142ce6200032b600039600081816104540152818161097701528181610b3c01528181610eac015281816111dc01528181611e6b015281816120130152818161213d0152818161229c01528181612ea001528181612eee015281816131aa015261378601526000818161019501528181610488015281816105e801528181610637015281816107b8015281816109fc01528181610d5001528181610e8b0152818161123301528181611316015281816113c1015281816114540152818161157201528181611600015281816119b001528181611a6801528181611af901528181611b7601528181611bea01528181611ff2015281816122250152818161227b015281816122d001528181612365015281816124a7015281816125b901526126470152600081816102f5015281816108340152818161090601528181610ae201528181610b1901528181610c2d01528181610dcc01528181610e6901528181610fc1015281816114cf015281816116320152818161186001528181611c1c01528181611e4801528181611fa001528181611fd00152818161211a01528181612259015281816125220152818161267901528181612e5a01528181612ecb015281816131870152818161335101528181613524015281816135c6015261363d01526142ce6000f3fe6080604052600436106101855760003560e01c806385f8c259116100d1578063b6f9de951161008a578063ded9382a11610064578063ded9382a1461053d578063e8e337001461055d578063f305d71914610598578063fb3bdb41146105ab57600080fd5b8063b6f9de95146104ea578063baa2abde146104fd578063d06ca61f1461051d57600080fd5b806385f8c259146104025780638803dbee14610422578063ace3a8a714610442578063ad5c464814610476578063ad615dec146104aa578063af2979eb146104ca57600080fd5b806338ed17391161013e5780635c11d795116101185780635c11d7951461038f5780636d91c0e2146103af578063791ac947146103cf5780637ff36ab5146103ef57600080fd5b806338ed17391461032f5780634a25d94a1461034f5780635b0d59841461036f57600080fd5b806302751cec1461020e578063054d50d41461024857806318cbafe5146102765780631f00ca74146102a35780632195995c146102c35780632dd31000146102e357600080fd5b3661020957336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102075760405162461bcd60e51b815260206004820152601b60248201527f5377617073526f757465723a20494e56414c49445f53454e444552000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561021a57600080fd5b5061022e61022936600461387c565b6105be565b604080519283526020830191909152015b60405180910390f35b34801561025457600080fd5b506102686102633660046138da565b6106b1565b60405190815260200161023f565b34801561028257600080fd5b5061029661029136600461394b565b61078b565b60405161023f91906139be565b3480156102af57600080fd5b506102966102be366004613a18565b610adb565b3480156102cf57600080fd5b5061022e6102de366004613b08565b610b0f565b3480156102ef57600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161023f565b34801561033b57600080fd5b5061029661034a36600461394b565b610c05565b34801561035b57600080fd5b5061029661036a36600461394b565b610d23565b34801561037b57600080fd5b5061026861038a366004613bb2565b610e61565b34801561039b57600080fd5b506102076103aa36600461394b565b610f6f565b3480156103bb57600080fd5b506103176103ca366004613c48565b6111d2565b3480156103db57600080fd5b506102076103ea36600461394b565b611208565b6102966103fd366004613c93565b61142f565b34801561040e57600080fd5b5061026861041d3660046138da565b611758565b34801561042e57600080fd5b5061029661043d36600461394b565b611838565b34801561044e57600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b34801561048257600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b657600080fd5b506102686104c53660046138da565b6118f5565b3480156104d657600080fd5b506102686104e536600461387c565b611987565b6102076104f8366004613c93565b611ad6565b34801561050957600080fd5b5061022e610518366004613cfa565b611e1d565b34801561052957600080fd5b50610296610538366004613a18565b611f99565b34801561054957600080fd5b5061022e610558366004613bb2565b611fc6565b34801561056957600080fd5b5061057d610578366004613d6c565b6120da565b6040805193845260208401929092529082015260600161023f565b61057d6105a636600461387c565b6121f9565b6102966105b9366004613c93565b612482565b60008082428110156105e25760405162461bcd60e51b81526004016101fe90613de8565b610611897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611e1d565b90935091506106218986856127dd565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583612928565b50965096945050505050565b60008084116107115760405162461bcd60e51b815260206004820152602660248201527f537761707348656c7065723a20494e53554646494349454e545f494e5055545f604482015265105353d5539560d21b60648201526084016101fe565b6000831180156107215750600082115b61073d5760405162461bcd60e51b81526004016101fe90613e1f565b600061074b856103e5613e78565b905060006107598483613e78565b905060008261076a876103e8613e78565b6107749190613e97565b90506107808183613eaf565b979650505050505050565b606081428110156107ae5760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866107e5600182613ed1565b8181106107f4576107f4613ee8565b90506020020160208101906108099190613efe565b6001600160a01b03161461082f5760405162461bcd60e51b81526004016101fe90613f1b565b61088d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b915086826001845161089f9190613ed1565b815181106108af576108af613ee8565b602002602001015110156108d55760405162461bcd60e51b81526004016101fe90613f52565b6109bb868660008181106108eb576108eb613ee8565b90506020020160208101906109009190613efe565b3361099b7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061093857610938613ee8565b905060200201602081019061094d9190613efe565b8b8b600181811061096057610960613ee8565b90506020020160208101906109759190613efe565b7f0000000000000000000000000000000000000000000000000000000000000000612b45565b856000815181106109ae576109ae613ee8565b6020026020010151612c1d565b6109fa82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612d77915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a389190613ed1565b81518110610a4857610a48613ee8565b60200260200101516040518263ffffffff1660e01b8152600401610a6e91815260200190565b600060405180830381600087803b158015610a8857600080fd5b505af1158015610a9c573d6000803e3d6000fd5b50505050610ad0848360018551610ab39190613ed1565b81518110610ac357610ac3613ee8565b6020026020010151612928565b509695505050505050565b6060610b087f00000000000000000000000000000000000000000000000000000000000000008484612fc1565b9392505050565b6000806000610b607f00000000000000000000000000000000000000000000000000000000000000008f8f7f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050600087610b6f578c610b73565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610bae903390309086908f908e908e908e90600401613f99565b600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b50505050610bef8f8f8f8f8f8f8f611e1d565b9350935050509b509b9950505050505050505050565b60608142811015610c285760405162461bcd60e51b81526004016101fe90613de8565b610c867f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b9150868260018451610c989190613ed1565b81518110610ca857610ca8613ee8565b60200260200101511015610cce5760405162461bcd60e51b81526004016101fe90613f52565b610ce4868660008181106108eb576108eb613ee8565b610ad082878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b60608142811015610d465760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610d7d600182613ed1565b818110610d8c57610d8c613ee8565b9050602002016020810190610da19190613efe565b6001600160a01b031614610dc75760405162461bcd60e51b81526004016101fe90613f1b565b610e257f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b91508682600081518110610e3b57610e3b613ee8565b602002602001015111156108d55760405162461bcd60e51b81526004016101fe90613fda565b600080610ed07f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050600086610edf578b610ee3565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f1e903390309086908e908d908d908d90600401613f99565b600060405180830381600087803b158015610f3857600080fd5b505af1158015610f4c573d6000803e3d6000fd5b50505050610f5e8d8d8d8d8d8d611987565b9d9c50505050505050505050505050565b8042811015610f905760405162461bcd60e51b81526004016101fe90613de8565b61102185856000818110610fa657610fa6613ee8565b9050602002016020810190610fbb9190613efe565b3361101b7f000000000000000000000000000000000000000000000000000000000000000089896000818110610ff357610ff3613ee8565b90506020020160208101906110089190613efe565b8a8a600181811061096057610960613ee8565b8a612c1d565b60008585611030600182613ed1565b81811061103f5761103f613ee8565b90506020020160208101906110549190613efe565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c0919061401d565b9050611100868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613112915050565b8681878761110f600182613ed1565b81811061111e5761111e613ee8565b90506020020160208101906111339190613efe565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a0919061401d565b6111aa9190613ed1565b10156111c85760405162461bcd60e51b81526004016101fe90613f52565b5050505050505050565b60006112008484847f0000000000000000000000000000000000000000000000000000000000000000612b45565b949350505050565b80428110156112295760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611260600182613ed1565b81811061126f5761126f613ee8565b90506020020160208101906112849190613efe565b6001600160a01b0316146112aa5760405162461bcd60e51b81526004016101fe90613f1b565b6112c085856000818110610fa657610fa6613ee8565b6112fe858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613112915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611365573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611389919061401d565b9050868110156113ab5760405162461bcd60e51b81526004016101fe90613f52565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506111c88482612928565b606081428110156114525760405162461bcd60e51b81526004016101fe90613de8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061148f5761148f613ee8565b90506020020160208101906114a49190613efe565b6001600160a01b0316146114ca5760405162461bcd60e51b81526004016101fe90613f1b565b6115287f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b915086826001845161153a9190613ed1565b8151811061154a5761154a613ee8565b602002602001015110156115705760405162461bcd60e51b81526004016101fe90613f52565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106115b2576115b2613ee8565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156115e557600080fd5b505af11580156115f9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116647f000000000000000000000000000000000000000000000000000000000000000089896000818110610ff357610ff3613ee8565b8460008151811061167757611677613ee8565b60200260200101516040518363ffffffff1660e01b81526004016116b09291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190614036565b61170f5760405162461bcd60e51b81526004016101fe90614053565b61174e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b5095945050505050565b60008084116117b95760405162461bcd60e51b815260206004820152602760248201527f537761707348656c7065723a20494e53554646494349454e545f4f555450555460448201526617d05353d5539560ca1b60648201526084016101fe565b6000831180156117c95750600082115b6117e55760405162461bcd60e51b81526004016101fe90613e1f565b60006117f18585613e78565b6117fd906103e8613e78565b9050600061180b8685613ed1565b611817906103e5613e78565b90506118238183613eaf565b61182e906001613e97565b9695505050505050565b6060814281101561185b5760405162461bcd60e51b81526004016101fe90613de8565b6118b97f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b915086826000815181106118cf576118cf613ee8565b60200260200101511115610cce5760405162461bcd60e51b81526004016101fe90613fda565b60008084116119465760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a20494e53554646494349454e545f414d4f554e5460448201526064016101fe565b6000831180156119565750600082115b6119725760405162461bcd60e51b81526004016101fe90613e1f565b8261197d8386613e78565b6112009190613eaf565b600081428110156119aa5760405162461bcd60e51b81526004016101fe90613de8565b6119d9887f00000000000000000000000000000000000000000000000000000000000000008989893089611e1d565b6040516370a0823160e01b8152306004820152909350611a529150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d919061401d565b6127dd565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b50505050610ad08483612928565b8042811015611af75760405162461bcd60e51b81526004016101fe90613de8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611b3457611b34613ee8565b9050602002016020810190611b499190613efe565b6001600160a01b031614611b6f5760405162461bcd60e51b81526004016101fe90613f1b565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bcf57600080fd5b505af1158015611be3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611c4e7f000000000000000000000000000000000000000000000000000000000000000089896000818110610ff357610ff3613ee8565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbf9190614036565b611cdb5760405162461bcd60e51b81526004016101fe90614053565b60008686611cea600182613ed1565b818110611cf957611cf9613ee8565b9050602002016020810190611d0e9190613efe565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7a919061401d565b9050611dba878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613112915050565b87818888611dc9600182613ed1565b818110611dd857611dd8613ee8565b9050602002016020810190611ded9190613efe565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161115f565b6000808242811015611e415760405162461bcd60e51b81526004016101fe90613de8565b6000611e8f7f00000000000000000000000000000000000000000000000000000000000000008c8c7f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050611e9d8133838c612c1d565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d919061408a565b915091506000611f1d8e8e61340d565b509050806001600160a01b03168e6001600160a01b031614611f40578183611f43565b82825b90975095508a871015611f685760405162461bcd60e51b81526004016101fe906140ae565b89861015611f885760405162461bcd60e51b81526004016101fe906140f0565b505050505097509795505050505050565b6060610b087f000000000000000000000000000000000000000000000000000000000000000084846129ea565b60008060006120377f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050600087612046578c61204a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612085903390309086908f908e908e908e90600401613f99565b600060405180830381600087803b15801561209f57600080fd5b505af11580156120b3573d6000803e3d6000fd5b505050506120c58e8e8e8e8e8e6105be565b9350935050509a509a98505050505050505050565b600080600083428110156121005760405162461bcd60e51b81526004016101fe90613de8565b61210e8c8c8c8c8c8c6134f6565b909450925060006121617f00000000000000000000000000000000000000000000000000000000000000008e8e7f0000000000000000000000000000000000000000000000000000000000000000612b45565b905061216f8d338388612c1d565b61217b8c338387612c1d565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061401d565b92505050985098509895505050505050565b6000806000834281101561221f5760405162461bcd60e51b81526004016101fe90613de8565b61224d8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6134f6565b909450925060006122c07f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b45565b90506122ce8b338388612c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d69190614036565b6123f25760405162461bcd60e51b81526004016101fe90614053565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e919061401d565b9250833411156124745761247433853403612928565b505096509650969350505050565b606081428110156124a55760405162461bcd60e51b81526004016101fe90613de8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106124e2576124e2613ee8565b90506020020160208101906124f79190613efe565b6001600160a01b03161461251d5760405162461bcd60e51b81526004016101fe90613f1b565b61257b7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b9150348260008151811061259157612591613ee8565b602002602001015111156125b75760405162461bcd60e51b81526004016101fe90613fda565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106125f9576125f9613ee8565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262c57600080fd5b505af1158015612640573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6126ab7f000000000000000000000000000000000000000000000000000000000000000089896000818110610ff357610ff3613ee8565b846000815181106126be576126be613ee8565b60200260200101516040518363ffffffff1660e01b81526004016126f79291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190614036565b6127565760405162461bcd60e51b81526004016101fe90614053565b61279582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b816000815181106127a8576127a8613ee8565b602002602001015134111561174e5761174e33836000815181106127ce576127ce613ee8565b60200260200101513403612928565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b17905291516000928392871691612869919061415e565b6000604051808303816000865af19150503d80600081146128a6576040519150601f19603f3d011682016040523d82523d6000602084013e6128ab565b606091505b50915091508180156128d55750805115806128d55750808060200190518101906128d59190614036565b6129215760405162461bcd60e51b815260206004820152601c60248201527f537761707348656c7065723a205452414e534645525f4641494c45440000000060448201526064016101fe565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051612952919061415e565b60006040518083038185875af1925050503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b50509050806129e55760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a204554485f5452414e534645525f4641494c454460448201526064016101fe565b505050565b6060600282511015612a0e5760405162461bcd60e51b81526004016101fe90613f1b565b815167ffffffffffffffff811115612a2857612a28613a02565b604051908082528060200260200182016040528015612a51578160200160208202803683370190505b5090508281600081518110612a6857612a68613ee8565b60200260200101818152505060005b60018351612a859190613ed1565b811015612b3d57600080612ad887868581518110612aa557612aa5613ee8565b602002602001015187866001612abb9190613e97565b81518110612acb57612acb613ee8565b6020026020010151613769565b91509150612b00848481518110612af157612af1613ee8565b602002602001015183836106b1565b84612b0c856001613e97565b81518110612b1c57612b1c613ee8565b60200260200101818152505050508080612b359061417a565b915050612a77565b509392505050565b6000806000846001600160a01b0316866001600160a01b031610612b6a578486612b6d565b85855b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915060009060480160408051601f19818403018152908290528051602090910120733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8252606096871b60148301526f5af43d82803e903d91602b57fd5bf3ff60801b60288301529890951b603886015250505050604c81019390935250506037808220606c830152605591012090565b600080856001600160a01b03166040518060600160405280602581526020016142746025913980516020909101206040516001600160a01b038089166024830152871660448201526064810186905260840160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612cad919061415e565b6000604051808303816000865af19150503d8060008114612cea576040519150601f19603f3d011682016040523d82523d6000602084013e612cef565b606091505b5091509150818015612d19575080511580612d19575080806020019051810190612d199190614036565b612d6f5760405162461bcd60e51b815260206004820152602160248201527f537761707348656c7065723a205452414e534645525f46524f4d5f4641494c456044820152601160fa1b60648201526084016101fe565b505050505050565b60005b60018351612d889190613ed1565b811015612fbb57600080848381518110612da457612da4613ee8565b602002602001015185846001612dba9190613e97565b81518110612dca57612dca613ee8565b6020026020010151915091506000612de2838361340d565b509050600087612df3866001613e97565b81518110612e0357612e03613ee8565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612e3157826000612e35565b6000835b91509150600060028a51612e499190613ed1565b8810612e555788612ec4565b612ec47f0000000000000000000000000000000000000000000000000000000000000000878c612e868c6002613e97565b81518110612e9657612e96613ee8565b60200260200101517f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050612f127f000000000000000000000000000000000000000000000000000000000000000088887f0000000000000000000000000000000000000000000000000000000000000000612b45565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612f4f576020820181803683370190505b506040518563ffffffff1660e01b8152600401612f6f9493929190614193565b600060405180830381600087803b158015612f8957600080fd5b505af1158015612f9d573d6000803e3d6000fd5b50505050505050505050508080612fb39061417a565b915050612d7a565b50505050565b6060600282511015612fe55760405162461bcd60e51b81526004016101fe90613f1b565b815167ffffffffffffffff811115612fff57612fff613a02565b604051908082528060200260200182016040528015613028578160200160208202803683370190505b50905082816001835161303b9190613ed1565b8151811061304b5761304b613ee8565b6020026020010181815250506000600183516130679190613ed1565b90505b8015612b3d576000806130ad8786613083600187613ed1565b8151811061309357613093613ee8565b6020026020010151878681518110612acb57612acb613ee8565b915091506130d58484815181106130c6576130c6613ee8565b60200260200101518383611758565b846130e1600186613ed1565b815181106130f1576130f1613ee8565b6020026020010181815250505050808061310a906141e3565b91505061306a565b60005b600183516131239190613ed1565b8110156129e55760008084838151811061313f5761313f613ee8565b6020026020010151858460016131559190613e97565b8151811061316557613165613ee8565b602002602001015191509150600061317d838361340d565b50905060006131ce7f000000000000000000000000000000000000000000000000000000000000000085857f0000000000000000000000000000000000000000000000000000000000000000612b45565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132389190614211565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614613272578284613275565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa1580156132c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e7919061401d565b6132f19190613ed1565b95506132fe8683836106b1565b945050505050600080856001600160a01b0316886001600160a01b0316146133285782600061332c565b6000835b91509150600060028c516133409190613ed1565b8a1061334c578a61337d565b61337d7f0000000000000000000000000000000000000000000000000000000000000000898e612e868e6002613e97565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133bf9086908690869060248101614193565b600060405180830381600087803b1580156133d957600080fd5b505af11580156133ed573d6000803e3d6000fd5b5050505050505050505050505080806134059061417a565b915050613115565b600080826001600160a01b0316846001600160a01b0316036134715760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a204944454e544943414c5f41444452455353455360448201526064016101fe565b826001600160a01b0316846001600160a01b031610613491578284613494565b83835b90925090506001600160a01b0382166134ef5760405162461bcd60e51b815260206004820152601960248201527f537761707348656c7065723a205a45524f5f414444524553530000000000000060448201526064016101fe565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa15801561356d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135919190614256565b6001600160a01b031603613635576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af115801561360f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136339190614256565b505b6000806136637f00000000000000000000000000000000000000000000000000000000000000008b8b613769565b91509150816000148015613675575080155b1561368757878793509350505061375e565b60006136948984846118f5565b90508781116136ca57858110156136bd5760405162461bcd60e51b81526004016101fe906140f0565b889450925061375e915050565b60006136d78984866118f5565b9050898111156137355760405162461bcd60e51b815260206004820152602360248201527f5377617073526f757465723a20494e56414c49445f444553495245445f414d4f60448201526215539560ea1b60648201526084016101fe565b878110156137555760405162461bcd60e51b81526004016101fe906140ae565b94508793505050505b965096945050505050565b6000806000613778858561340d565b5090506000806137aa8888887f0000000000000000000000000000000000000000000000000000000000000000612b45565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156137e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380b9190614211565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613842578082613845565b81815b90999098509650505050505050565b6001600160a01b038116811461386957600080fd5b50565b803561387781613854565b919050565b60008060008060008060c0878903121561389557600080fd5b86356138a081613854565b955060208701359450604087013593506060870135925060808701356138c581613854565b8092505060a087013590509295509295509295565b6000806000606084860312156138ef57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261391857600080fd5b50813567ffffffffffffffff81111561393057600080fd5b6020830191508360208260051b85010111156134ef57600080fd5b60008060008060008060a0878903121561396457600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561398957600080fd5b61399589828a01613906565b90955093505060608701356139a981613854565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156139f6578351835292840192918401916001016139da565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613a2b57600080fd5b8235915060208084013567ffffffffffffffff80821115613a4b57600080fd5b818601915086601f830112613a5f57600080fd5b813581811115613a7157613a71613a02565b8060051b604051601f19603f83011681018181108582111715613a9657613a96613a02565b604052918252848201925083810185019189831115613ab457600080fd5b938501935b82851015613ad957613aca8561386c565b84529385019392850192613ab9565b8096505050505050509250929050565b801515811461386957600080fd5b803560ff8116811461387757600080fd5b60008060008060008060008060008060006101608c8e031215613b2a57600080fd5b8b35613b3581613854565b9a5060208c0135613b4581613854565b995060408c0135985060608c0135975060808c0135965060a08c0135613b6a81613854565b955060c08c0135945060e08c0135613b8181613ae9565b9350613b906101008d01613af7565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613bd257600080fd5b8a35613bdd81613854565b995060208b0135985060408b0135975060608b0135965060808b0135613c0281613854565b955060a08b0135945060c08b0135613c1981613ae9565b9350613c2760e08c01613af7565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600060608486031215613c5d57600080fd5b8335613c6881613854565b92506020840135613c7881613854565b91506040840135613c8881613854565b809150509250925092565b600080600080600060808688031215613cab57600080fd5b85359450602086013567ffffffffffffffff811115613cc957600080fd5b613cd588828901613906565b9095509350506040860135613ce981613854565b949793965091946060013592915050565b600080600080600080600060e0888a031215613d1557600080fd5b8735613d2081613854565b96506020880135613d3081613854565b955060408801359450606088013593506080880135925060a0880135613d5581613854565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613d8957600080fd5b8835613d9481613854565b97506020890135613da481613854565b965060408901359550606089013594506080890135935060a0890135925060c0890135613dd081613854565b8092505060e089013590509295985092959890939650565b6020808252601d908201527f5377617073526f757465723a20444541444c494e455f45585049524544000000604082015260600190565b60208082526023908201527f537761707348656c7065723a20494e53554646494349454e545f4c495155494460408201526249545960e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613e9257613e92613e62565b500290565b60008219821115613eaa57613eaa613e62565b500190565b600082613ecc57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613ee357613ee3613e62565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f1057600080fd5b8135610b0881613854565b60208082526019908201527f5377617073526f757465723a20494e56414c49445f5041544800000000000000604082015260600190565b60208082526027908201527f5377617073526f757465723a20494e53554646494349454e545f4f555450555460408201526617d05353d5539560ca1b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526023908201527f5377617073526f757465723a204558434553534956455f494e5055545f414d4f60408201526215539560ea1b606082015260800190565b60006020828403121561402f57600080fd5b5051919050565b60006020828403121561404857600080fd5b8151610b0881613ae9565b6020808252601a908201527f5377617073526f757465723a205452414e534645525f4641494c000000000000604082015260600190565b6000806040838503121561409d57600080fd5b505080516020909101519092909150565b60208082526022908201527f5377617073526f757465723a20494e53554646494349454e545f415f414d4f55604082015261139560f21b606082015260800190565b60208082526022908201527f5377617073526f757465723a20494e53554646494349454e545f425f414d4f55604082015261139560f21b606082015260800190565b60005b8381101561414d578181015183820152602001614135565b83811115612fbb5750506000910152565b60008251614170818460208701614132565b9190910192915050565b60006001820161418c5761418c613e62565b5060010190565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526141cc8160a0850160208701614132565b601f01601f19169190910160a00195945050505050565b6000816141f2576141f2613e62565b506000190190565b80516001600160701b038116811461387757600080fd5b60008060006060848603121561422657600080fd5b61422f846141fa565b925061423d602085016141fa565b9150604084015163ffffffff81168114613c8857600080fd5b60006020828403121561426857600080fd5b8151610b088161385456fe7472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629a26469706673582212207dea02283b88a465792995de6238b8f85659e5f689fb350f51f3ac2a20d9229d64736f6c634300080e0033000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101855760003560e01c806385f8c259116100d1578063b6f9de951161008a578063ded9382a11610064578063ded9382a1461053d578063e8e337001461055d578063f305d71914610598578063fb3bdb41146105ab57600080fd5b8063b6f9de95146104ea578063baa2abde146104fd578063d06ca61f1461051d57600080fd5b806385f8c259146104025780638803dbee14610422578063ace3a8a714610442578063ad5c464814610476578063ad615dec146104aa578063af2979eb146104ca57600080fd5b806338ed17391161013e5780635c11d795116101185780635c11d7951461038f5780636d91c0e2146103af578063791ac947146103cf5780637ff36ab5146103ef57600080fd5b806338ed17391461032f5780634a25d94a1461034f5780635b0d59841461036f57600080fd5b806302751cec1461020e578063054d50d41461024857806318cbafe5146102765780631f00ca74146102a35780632195995c146102c35780632dd31000146102e357600080fd5b3661020957336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146102075760405162461bcd60e51b815260206004820152601b60248201527f5377617073526f757465723a20494e56414c49445f53454e444552000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561021a57600080fd5b5061022e61022936600461387c565b6105be565b604080519283526020830191909152015b60405180910390f35b34801561025457600080fd5b506102686102633660046138da565b6106b1565b60405190815260200161023f565b34801561028257600080fd5b5061029661029136600461394b565b61078b565b60405161023f91906139be565b3480156102af57600080fd5b506102966102be366004613a18565b610adb565b3480156102cf57600080fd5b5061022e6102de366004613b08565b610b0f565b3480156102ef57600080fd5b506103177f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e281565b6040516001600160a01b03909116815260200161023f565b34801561033b57600080fd5b5061029661034a36600461394b565b610c05565b34801561035b57600080fd5b5061029661036a36600461394b565b610d23565b34801561037b57600080fd5b5061026861038a366004613bb2565b610e61565b34801561039b57600080fd5b506102076103aa36600461394b565b610f6f565b3480156103bb57600080fd5b506103176103ca366004613c48565b6111d2565b3480156103db57600080fd5b506102076103ea36600461394b565b611208565b6102966103fd366004613c93565b61142f565b34801561040e57600080fd5b5061026861041d3660046138da565b611758565b34801561042e57600080fd5b5061029661043d36600461394b565b611838565b34801561044e57600080fd5b506103177f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d19381565b34801561048257600080fd5b506103177f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156104b657600080fd5b506102686104c53660046138da565b6118f5565b3480156104d657600080fd5b506102686104e536600461387c565b611987565b6102076104f8366004613c93565b611ad6565b34801561050957600080fd5b5061022e610518366004613cfa565b611e1d565b34801561052957600080fd5b50610296610538366004613a18565b611f99565b34801561054957600080fd5b5061022e610558366004613bb2565b611fc6565b34801561056957600080fd5b5061057d610578366004613d6c565b6120da565b6040805193845260208401929092529082015260600161023f565b61057d6105a636600461387c565b6121f9565b6102966105b9366004613c93565b612482565b60008082428110156105e25760405162461bcd60e51b81526004016101fe90613de8565b610611897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a611e1d565b90935091506106218986856127dd565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583612928565b50965096945050505050565b60008084116107115760405162461bcd60e51b815260206004820152602660248201527f537761707348656c7065723a20494e53554646494349454e545f494e5055545f604482015265105353d5539560d21b60648201526084016101fe565b6000831180156107215750600082115b61073d5760405162461bcd60e51b81526004016101fe90613e1f565b600061074b856103e5613e78565b905060006107598483613e78565b905060008261076a876103e8613e78565b6107749190613e97565b90506107808183613eaf565b979650505050505050565b606081428110156107ae5760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866107e5600182613ed1565b8181106107f4576107f4613ee8565b90506020020160208101906108099190613efe565b6001600160a01b03161461082f5760405162461bcd60e51b81526004016101fe90613f1b565b61088d7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b915086826001845161089f9190613ed1565b815181106108af576108af613ee8565b602002602001015110156108d55760405162461bcd60e51b81526004016101fe90613f52565b6109bb868660008181106108eb576108eb613ee8565b90506020020160208101906109009190613efe565b3361099b7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28a8a600081811061093857610938613ee8565b905060200201602081019061094d9190613efe565b8b8b600181811061096057610960613ee8565b90506020020160208101906109759190613efe565b7f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b856000815181106109ae576109ae613ee8565b6020026020010151612c1d565b6109fa82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612d77915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551610a389190613ed1565b81518110610a4857610a48613ee8565b60200260200101516040518263ffffffff1660e01b8152600401610a6e91815260200190565b600060405180830381600087803b158015610a8857600080fd5b505af1158015610a9c573d6000803e3d6000fd5b50505050610ad0848360018551610ab39190613ed1565b81518110610ac357610ac3613ee8565b6020026020010151612928565b509695505050505050565b6060610b087f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28484612fc1565b9392505050565b6000806000610b607f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28f8f7f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050600087610b6f578c610b73565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610bae903390309086908f908e908e908e90600401613f99565b600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b50505050610bef8f8f8f8f8f8f8f611e1d565b9350935050509b509b9950505050505050505050565b60608142811015610c285760405162461bcd60e51b81526004016101fe90613de8565b610c867f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b9150868260018451610c989190613ed1565b81518110610ca857610ca8613ee8565b60200260200101511015610cce5760405162461bcd60e51b81526004016101fe90613f52565b610ce4868660008181106108eb576108eb613ee8565b610ad082878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b60608142811015610d465760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610d7d600182613ed1565b818110610d8c57610d8c613ee8565b9050602002016020810190610da19190613efe565b6001600160a01b031614610dc75760405162461bcd60e51b81526004016101fe90613f1b565b610e257f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b91508682600081518110610e3b57610e3b613ee8565b602002602001015111156108d55760405162461bcd60e51b81526004016101fe90613fda565b600080610ed07f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050600086610edf578b610ee3565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610f1e903390309086908e908d908d908d90600401613f99565b600060405180830381600087803b158015610f3857600080fd5b505af1158015610f4c573d6000803e3d6000fd5b50505050610f5e8d8d8d8d8d8d611987565b9d9c50505050505050505050505050565b8042811015610f905760405162461bcd60e51b81526004016101fe90613de8565b61102185856000818110610fa657610fa6613ee8565b9050602002016020810190610fbb9190613efe565b3361101b7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289896000818110610ff357610ff3613ee8565b90506020020160208101906110089190613efe565b8a8a600181811061096057610960613ee8565b8a612c1d565b60008585611030600182613ed1565b81811061103f5761103f613ee8565b90506020020160208101906110549190613efe565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c0919061401d565b9050611100868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613112915050565b8681878761110f600182613ed1565b81811061111e5761111e613ee8565b90506020020160208101906111339190613efe565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a0919061401d565b6111aa9190613ed1565b10156111c85760405162461bcd60e51b81526004016101fe90613f52565b5050505050505050565b60006112008484847f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b949350505050565b80428110156112295760405162461bcd60e51b81526004016101fe90613de8565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168585611260600182613ed1565b81811061126f5761126f613ee8565b90506020020160208101906112849190613efe565b6001600160a01b0316146112aa5760405162461bcd60e51b81526004016101fe90613f1b565b6112c085856000818110610fa657610fa6613ee8565b6112fe858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613112915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a0823190602401602060405180830381865afa158015611365573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611389919061401d565b9050868110156113ab5760405162461bcd60e51b81526004016101fe90613f52565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b505050506111c88482612928565b606081428110156114525760405162461bcd60e51b81526004016101fe90613de8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061148f5761148f613ee8565b90506020020160208101906114a49190613efe565b6001600160a01b0316146114ca5760405162461bcd60e51b81526004016101fe90613f1b565b6115287f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506129ea92505050565b915086826001845161153a9190613ed1565b8151811061154a5761154a613ee8565b602002602001015110156115705760405162461bcd60e51b81526004016101fe90613f52565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106115b2576115b2613ee8565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156115e557600080fd5b505af11580156115f9573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6116647f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289896000818110610ff357610ff3613ee8565b8460008151811061167757611677613ee8565b60200260200101516040518363ffffffff1660e01b81526004016116b09291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190614036565b61170f5760405162461bcd60e51b81526004016101fe90614053565b61174e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b5095945050505050565b60008084116117b95760405162461bcd60e51b815260206004820152602760248201527f537761707348656c7065723a20494e53554646494349454e545f4f555450555460448201526617d05353d5539560ca1b60648201526084016101fe565b6000831180156117c95750600082115b6117e55760405162461bcd60e51b81526004016101fe90613e1f565b60006117f18585613e78565b6117fd906103e8613e78565b9050600061180b8685613ed1565b611817906103e5613e78565b90506118238183613eaf565b61182e906001613e97565b9695505050505050565b6060814281101561185b5760405162461bcd60e51b81526004016101fe90613de8565b6118b97f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b915086826000815181106118cf576118cf613ee8565b60200260200101511115610cce5760405162461bcd60e51b81526004016101fe90613fda565b60008084116119465760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a20494e53554646494349454e545f414d4f554e5460448201526064016101fe565b6000831180156119565750600082115b6119725760405162461bcd60e51b81526004016101fe90613e1f565b8261197d8386613e78565b6112009190613eaf565b600081428110156119aa5760405162461bcd60e51b81526004016101fe90613de8565b6119d9887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28989893089611e1d565b6040516370a0823160e01b8152306004820152909350611a529150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d919061401d565b6127dd565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b50505050610ad08483612928565b8042811015611af75760405162461bcd60e51b81526004016101fe90613de8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611b3457611b34613ee8565b9050602002016020810190611b499190613efe565b6001600160a01b031614611b6f5760405162461bcd60e51b81526004016101fe90613f1b565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bcf57600080fd5b505af1158015611be3573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb611c4e7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289896000818110610ff357610ff3613ee8565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbf9190614036565b611cdb5760405162461bcd60e51b81526004016101fe90614053565b60008686611cea600182613ed1565b818110611cf957611cf9613ee8565b9050602002016020810190611d0e9190613efe565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7a919061401d565b9050611dba878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613112915050565b87818888611dc9600182613ed1565b818110611dd857611dd8613ee8565b9050602002016020810190611ded9190613efe565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a082319060240161115f565b6000808242811015611e415760405162461bcd60e51b81526004016101fe90613de8565b6000611e8f7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28c8c7f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050611e9d8133838c612c1d565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d919061408a565b915091506000611f1d8e8e61340d565b509050806001600160a01b03168e6001600160a01b031614611f40578183611f43565b82825b90975095508a871015611f685760405162461bcd60e51b81526004016101fe906140ae565b89861015611f885760405162461bcd60e51b81526004016101fe906140f0565b505050505097509795505050505050565b6060610b087f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e284846129ea565b60008060006120377f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050600087612046578c61204a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612085903390309086908f908e908e908e90600401613f99565b600060405180830381600087803b15801561209f57600080fd5b505af11580156120b3573d6000803e3d6000fd5b505050506120c58e8e8e8e8e8e6105be565b9350935050509a509a98505050505050505050565b600080600083428110156121005760405162461bcd60e51b81526004016101fe90613de8565b61210e8c8c8c8c8c8c6134f6565b909450925060006121617f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28e8e7f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b905061216f8d338388612c1d565b61217b8c338387612c1d565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061401d565b92505050985098509895505050505050565b6000806000834281101561221f5760405162461bcd60e51b81526004016101fe90613de8565b61224d8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c6134f6565b909450925060006122c07f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b90506122ce8b338388612c1d565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d69190614036565b6123f25760405162461bcd60e51b81526004016101fe90614053565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e919061401d565b9250833411156124745761247433853403612928565b505096509650969350505050565b606081428110156124a55760405162461bcd60e51b81526004016101fe90613de8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316868660008181106124e2576124e2613ee8565b90506020020160208101906124f79190613efe565b6001600160a01b03161461251d5760405162461bcd60e51b81526004016101fe90613f1b565b61257b7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e288888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612fc192505050565b9150348260008151811061259157612591613ee8565b602002602001015111156125b75760405162461bcd60e51b81526004016101fe90613fda565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106125f9576125f9613ee8565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262c57600080fd5b505af1158015612640573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6126ab7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e289896000818110610ff357610ff3613ee8565b846000815181106126be576126be613ee8565b60200260200101516040518363ffffffff1660e01b81526004016126f79291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190614036565b6127565760405162461bcd60e51b81526004016101fe90614053565b61279582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612d77915050565b816000815181106127a8576127a8613ee8565b602002602001015134111561174e5761174e33836000815181106127ce576127ce613ee8565b60200260200101513403612928565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b17905291516000928392871691612869919061415e565b6000604051808303816000865af19150503d80600081146128a6576040519150601f19603f3d011682016040523d82523d6000602084013e6128ab565b606091505b50915091508180156128d55750805115806128d55750808060200190518101906128d59190614036565b6129215760405162461bcd60e51b815260206004820152601c60248201527f537761707348656c7065723a205452414e534645525f4641494c45440000000060448201526064016101fe565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051612952919061415e565b60006040518083038185875af1925050503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b50509050806129e55760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a204554485f5452414e534645525f4641494c454460448201526064016101fe565b505050565b6060600282511015612a0e5760405162461bcd60e51b81526004016101fe90613f1b565b815167ffffffffffffffff811115612a2857612a28613a02565b604051908082528060200260200182016040528015612a51578160200160208202803683370190505b5090508281600081518110612a6857612a68613ee8565b60200260200101818152505060005b60018351612a859190613ed1565b811015612b3d57600080612ad887868581518110612aa557612aa5613ee8565b602002602001015187866001612abb9190613e97565b81518110612acb57612acb613ee8565b6020026020010151613769565b91509150612b00848481518110612af157612af1613ee8565b602002602001015183836106b1565b84612b0c856001613e97565b81518110612b1c57612b1c613ee8565b60200260200101818152505050508080612b359061417a565b915050612a77565b509392505050565b6000806000846001600160a01b0316866001600160a01b031610612b6a578486612b6d565b85855b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152919350915060009060480160408051601f19818403018152908290528051602090910120733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8252606096871b60148301526f5af43d82803e903d91602b57fd5bf3ff60801b60288301529890951b603886015250505050604c81019390935250506037808220606c830152605591012090565b600080856001600160a01b03166040518060600160405280602581526020016142746025913980516020909101206040516001600160a01b038089166024830152871660448201526064810186905260840160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612cad919061415e565b6000604051808303816000865af19150503d8060008114612cea576040519150601f19603f3d011682016040523d82523d6000602084013e612cef565b606091505b5091509150818015612d19575080511580612d19575080806020019051810190612d199190614036565b612d6f5760405162461bcd60e51b815260206004820152602160248201527f537761707348656c7065723a205452414e534645525f46524f4d5f4641494c456044820152601160fa1b60648201526084016101fe565b505050505050565b60005b60018351612d889190613ed1565b811015612fbb57600080848381518110612da457612da4613ee8565b602002602001015185846001612dba9190613e97565b81518110612dca57612dca613ee8565b6020026020010151915091506000612de2838361340d565b509050600087612df3866001613e97565b81518110612e0357612e03613ee8565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612e3157826000612e35565b6000835b91509150600060028a51612e499190613ed1565b8810612e555788612ec4565b612ec47f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2878c612e868c6002613e97565b81518110612e9657612e96613ee8565b60200260200101517f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050612f127f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e288887f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612f4f576020820181803683370190505b506040518563ffffffff1660e01b8152600401612f6f9493929190614193565b600060405180830381600087803b158015612f8957600080fd5b505af1158015612f9d573d6000803e3d6000fd5b50505050505050505050508080612fb39061417a565b915050612d7a565b50505050565b6060600282511015612fe55760405162461bcd60e51b81526004016101fe90613f1b565b815167ffffffffffffffff811115612fff57612fff613a02565b604051908082528060200260200182016040528015613028578160200160208202803683370190505b50905082816001835161303b9190613ed1565b8151811061304b5761304b613ee8565b6020026020010181815250506000600183516130679190613ed1565b90505b8015612b3d576000806130ad8786613083600187613ed1565b8151811061309357613093613ee8565b6020026020010151878681518110612acb57612acb613ee8565b915091506130d58484815181106130c6576130c6613ee8565b60200260200101518383611758565b846130e1600186613ed1565b815181106130f1576130f1613ee8565b6020026020010181815250505050808061310a906141e3565b91505061306a565b60005b600183516131239190613ed1565b8110156129e55760008084838151811061313f5761313f613ee8565b6020026020010151858460016131559190613e97565b8151811061316557613165613ee8565b602002602001015191509150600061317d838361340d565b50905060006131ce7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e285857f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132389190614211565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b031614613272578284613275565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa1580156132c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e7919061401d565b6132f19190613ed1565b95506132fe8683836106b1565b945050505050600080856001600160a01b0316886001600160a01b0316146133285782600061332c565b6000835b91509150600060028c516133409190613ed1565b8a1061334c578a61337d565b61337d7f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2898e612e868e6002613e97565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133bf9086908690869060248101614193565b600060405180830381600087803b1580156133d957600080fd5b505af11580156133ed573d6000803e3d6000fd5b5050505050505050505050505080806134059061417a565b915050613115565b600080826001600160a01b0316846001600160a01b0316036134715760405162461bcd60e51b815260206004820181905260248201527f537761707348656c7065723a204944454e544943414c5f41444452455353455360448201526064016101fe565b826001600160a01b0316846001600160a01b031610613491578284613494565b83835b90925090506001600160a01b0382166134ef5760405162461bcd60e51b815260206004820152601960248201527f537761707348656c7065723a205a45524f5f414444524553530000000000000060448201526064016101fe565b9250929050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e29091169063e6a4390590604401602060405180830381865afa15801561356d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135919190614256565b6001600160a01b031603613635576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2169063c9c65396906044016020604051808303816000875af115801561360f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136339190614256565b505b6000806136637f000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e28b8b613769565b91509150816000148015613675575080155b1561368757878793509350505061375e565b60006136948984846118f5565b90508781116136ca57858110156136bd5760405162461bcd60e51b81526004016101fe906140f0565b889450925061375e915050565b60006136d78984866118f5565b9050898111156137355760405162461bcd60e51b815260206004820152602360248201527f5377617073526f757465723a20494e56414c49445f444553495245445f414d4f60448201526215539560ea1b60648201526084016101fe565b878110156137555760405162461bcd60e51b81526004016101fe906140ae565b94508793505050505b965096945050505050565b6000806000613778858561340d565b5090506000806137aa8888887f0000000000000000000000007290367aa694703220516a35e68e3d339ee7d193612b45565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156137e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380b9190614211565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613842578082613845565b81815b90999098509650505050505050565b6001600160a01b038116811461386957600080fd5b50565b803561387781613854565b919050565b60008060008060008060c0878903121561389557600080fd5b86356138a081613854565b955060208701359450604087013593506060870135925060808701356138c581613854565b8092505060a087013590509295509295509295565b6000806000606084860312156138ef57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261391857600080fd5b50813567ffffffffffffffff81111561393057600080fd5b6020830191508360208260051b85010111156134ef57600080fd5b60008060008060008060a0878903121561396457600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561398957600080fd5b61399589828a01613906565b90955093505060608701356139a981613854565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156139f6578351835292840192918401916001016139da565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613a2b57600080fd5b8235915060208084013567ffffffffffffffff80821115613a4b57600080fd5b818601915086601f830112613a5f57600080fd5b813581811115613a7157613a71613a02565b8060051b604051601f19603f83011681018181108582111715613a9657613a96613a02565b604052918252848201925083810185019189831115613ab457600080fd5b938501935b82851015613ad957613aca8561386c565b84529385019392850192613ab9565b8096505050505050509250929050565b801515811461386957600080fd5b803560ff8116811461387757600080fd5b60008060008060008060008060008060006101608c8e031215613b2a57600080fd5b8b35613b3581613854565b9a5060208c0135613b4581613854565b995060408c0135985060608c0135975060808c0135965060a08c0135613b6a81613854565b955060c08c0135945060e08c0135613b8181613ae9565b9350613b906101008d01613af7565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215613bd257600080fd5b8a35613bdd81613854565b995060208b0135985060408b0135975060608b0135965060808b0135613c0281613854565b955060a08b0135945060c08b0135613c1981613ae9565b9350613c2760e08c01613af7565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600080600060608486031215613c5d57600080fd5b8335613c6881613854565b92506020840135613c7881613854565b91506040840135613c8881613854565b809150509250925092565b600080600080600060808688031215613cab57600080fd5b85359450602086013567ffffffffffffffff811115613cc957600080fd5b613cd588828901613906565b9095509350506040860135613ce981613854565b949793965091946060013592915050565b600080600080600080600060e0888a031215613d1557600080fd5b8735613d2081613854565b96506020880135613d3081613854565b955060408801359450606088013593506080880135925060a0880135613d5581613854565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613d8957600080fd5b8835613d9481613854565b97506020890135613da481613854565b965060408901359550606089013594506080890135935060a0890135925060c0890135613dd081613854565b8092505060e089013590509295985092959890939650565b6020808252601d908201527f5377617073526f757465723a20444541444c494e455f45585049524544000000604082015260600190565b60208082526023908201527f537761707348656c7065723a20494e53554646494349454e545f4c495155494460408201526249545960e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613e9257613e92613e62565b500290565b60008219821115613eaa57613eaa613e62565b500190565b600082613ecc57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015613ee357613ee3613e62565b500390565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f1057600080fd5b8135610b0881613854565b60208082526019908201527f5377617073526f757465723a20494e56414c49445f5041544800000000000000604082015260600190565b60208082526027908201527f5377617073526f757465723a20494e53554646494349454e545f4f555450555460408201526617d05353d5539560ca1b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526023908201527f5377617073526f757465723a204558434553534956455f494e5055545f414d4f60408201526215539560ea1b606082015260800190565b60006020828403121561402f57600080fd5b5051919050565b60006020828403121561404857600080fd5b8151610b0881613ae9565b6020808252601a908201527f5377617073526f757465723a205452414e534645525f4641494c000000000000604082015260600190565b6000806040838503121561409d57600080fd5b505080516020909101519092909150565b60208082526022908201527f5377617073526f757465723a20494e53554646494349454e545f415f414d4f55604082015261139560f21b606082015260800190565b60208082526022908201527f5377617073526f757465723a20494e53554646494349454e545f425f414d4f55604082015261139560f21b606082015260800190565b60005b8381101561414d578181015183820152602001614135565b83811115612fbb5750506000910152565b60008251614170818460208701614132565b9190910192915050565b60006001820161418c5761418c613e62565b5060010190565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526141cc8160a0850160208701614132565b601f01601f19169190910160a00195945050505050565b6000816141f2576141f2613e62565b506000190190565b80516001600160701b038116811461387757600080fd5b60008060006060848603121561422657600080fd5b61422f846141fa565b925061423d602085016141fa565b9150604084015163ffffffff81168114613c8857600080fd5b60006020828403121561426857600080fd5b8151610b088161385456fe7472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629a26469706673582212207dea02283b88a465792995de6238b8f85659e5f689fb350f51f3ac2a20d9229d64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0xee3E9E46E34a27dC755a63e2849C9913Ee1A06E2
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ee3e9e46e34a27dc755a63e2849c9913ee1a06e2
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
191:25819:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;792:10;-1:-1:-1;;;;;806:4:10;792:18;;771:92;;;;-1:-1:-1;;;771:92:10;;216:2:11;771:92:10;;;198:21:11;255:2;235:18;;;228:30;294:29;274:18;;;267:57;341:18;;771:92:10;;;;;;;;;191:25819;;;;;6110:808;;;;;;;;;;-1:-1:-1;6110:808:10;;;;;:::i;:::-;;:::i;:::-;;;;1487:25:11;;;1543:2;1528:18;;1521:34;;;;1460:18;6110:808:10;;;;;;;;1203:645:8;;;;;;;;;;-1:-1:-1;1203:645:8;;;;;:::i;:::-;;:::i;:::-;;;2033:25:11;;;2021:2;2006:18;1203:645:8;1887:177:11;15636:1149:10;;;;;;;;;;-1:-1:-1;15636:1149:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23361:276::-;;;;;;;;;;-1:-1:-1;23361:276:10;;;;;:::i;:::-;;:::i;6924:969::-;;;;;;;;;;-1:-1:-1;6924:969:10;;;;;:::i;:::-;;:::i;234:32::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6792:32:11;;;6774:51;;6762:2;6747:18;234:32:10;6628:203:11;11734:851:10;;;;;;;;;;-1:-1:-1;11734:851:10;;;;;:::i;:::-;;:::i;14503:1127::-;;;;;;;;;;-1:-1:-1;14503:1127:10;;;;;:::i;:::-;;:::i;9645:999::-;;;;;;;;;;-1:-1:-1;9645:999:10;;;;;:::i;:::-;;:::i;19727:852::-;;;;;;;;;;-1:-1:-1;19727:852:10;;;;;:::i;:::-;;:::i;22775:298::-;;;;;;;;;;-1:-1:-1;22775:298:10;;;;;:::i;:::-;;:::i;21699:1070::-;;;;;;;;;;-1:-1:-1;21699:1070:10;;;;;:::i;:::-;;:::i;13426:1071::-;;;;;;:::i;:::-;;:::i;1854:608:8:-;;;;;;;;;;-1:-1:-1;1854:608:8;;;;;:::i;:::-;;:::i;12591:829:10:-;;;;;;;;;;-1:-1:-1;12591:829:10;;;;;:::i;:::-;;:::i;307:29::-;;;;;;;;;;;;;;;272;;;;;;;;;;;;;;;722:475:8;;;;;;;;;;-1:-1:-1;722:475:8;;;;;:::i;:::-;;:::i;8840:799:10:-;;;;;;;;;;-1:-1:-1;8840:799:10;;;;;:::i;:::-;;:::i;20585:1108::-;;;;;;:::i;:::-;;:::i;4961:1143::-;;;;;;;;;;-1:-1:-1;4961:1143:10;;;;;:::i;:::-;;:::i;23079:276::-;;;;;;;;;;-1:-1:-1;23079:276:10;;;;;:::i;:::-;;:::i;7899:935::-;;;;;;;;;;-1:-1:-1;7899:935:10;;;;;:::i;:::-;;:::i;2554:1042::-;;;;;;;;;;-1:-1:-1;2554:1042:10;;;;;:::i;:::-;;:::i;:::-;;;;10988:25:11;;;11044:2;11029:18;;11022:34;;;;11072:18;;;11065:34;10976:2;10961:18;2554:1042:10;10786:319:11;3602:1353:10;;;;;;:::i;:::-;;:::i;16791:1258::-;;;;;;:::i;:::-;;:::i;6110:808::-;6379:19;6412:17;6338:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;6481:193:::1;6510:6;6530:4;6548:10;6572:15;6601:13;6636:4;6655:9;6481:15;:193::i;:::-;6454:220:::0;;-1:-1:-1;6454:220:10;-1:-1:-1;6685:85:10::1;6712:6:::0;6732:3;6454:220;6685:13:::1;:85::i;:::-;6781:53;::::0;-1:-1:-1;;;6781:53:10;;::::1;::::0;::::1;2033:25:11::0;;;6787:4:10::1;-1:-1:-1::0;;;;;6781:20:10::1;::::0;::::1;::::0;2006:18:11;;6781:53:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6845:66;6875:3;6892:9;6845:16;:66::i;:::-;6110:808:::0;;;;;;;;;;:::o;1203:645:8:-;1360:17;1426:1;1414:9;:13;1393:98;;;;-1:-1:-1;;;1393:98:8;;11670:2:11;1393:98:8;;;11652:21:11;11709:2;11689:18;;;11682:30;11748:34;11728:18;;;11721:62;-1:-1:-1;;;11799:18:11;;;11792:36;11845:19;;1393:98:8;11468:402:11;1393:98:8;1536:1;1523:10;:14;:33;;;;;1555:1;1541:11;:15;1523:33;1502:115;;;;-1:-1:-1;;;1502:115:8;;;;;;;:::i;:::-;1628:23;1654:15;:9;1666:3;1654:15;:::i;:::-;1628:41;-1:-1:-1;1679:17:8;1699:29;1717:11;1628:41;1699:29;:::i;:::-;1679:49;-1:-1:-1;1738:19:8;1780:15;1760:17;:10;1773:4;1760:17;:::i;:::-;:35;;;;:::i;:::-;1738:57;-1:-1:-1;1818:23:8;1738:57;1818:9;:23;:::i;:::-;1806:35;1203:645;-1:-1:-1;;;;;;;1203:645:8:o;15636:1149:10:-;15873:24;15845:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;15961:4:10::1;15934:31;:5:::0;;15940:16:::1;15955:1;15934:5:::0;15940:16:::1;:::i;:::-;15934:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15934:31:10::1;;15913:103;;;;-1:-1:-1::0;;;15913:103:10::1;;;;;;;:::i;:::-;16037:87;16065:7;16086:9;16109:5;;16037:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16037:14:10::1;::::0;-1:-1:-1;;;16037:87:10:i:1;:::-;16027:97;;16187:13;16156:7;16181:1;16164:7;:14;:18;;;;:::i;:::-;16156:27;;;;;;;;:::i;:::-;;;;;;;:44;;16135:130;;;;-1:-1:-1::0;;;16135:130:10::1;;;;;;;:::i;:::-;16276:232;16307:5;;16313:1;16307:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16329:10;16353:121;16379:7;16404:5;;16410:1;16404:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16430:5;;16436:1;16430:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16456:4;16353:8;:121::i;:::-;16488:7;16496:1;16488:10;;;;;;;;:::i;:::-;;;;;;;16276:17;:232::i;:::-;16519:82;16538:7;16559:5;;16519:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16586:4:10::1;::::0;-1:-1:-1;16519:5:10::1;::::0;-1:-1:-1;;16519:82:10:i:1;:::-;16618:4;-1:-1:-1::0;;;;;16612:20:10::1;;16646:7;16671:1;16654:7;:14;:18;;;;:::i;:::-;16646:27;;;;;;;;:::i;:::-;;;;;;;16612:71;;;;;;;;;;;;;2033:25:11::0;;2021:2;2006:18;;1887:177;16612:71:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16694:84;16724:3;16741:7;16766:1;16749:7;:14;:18;;;;:::i;:::-;16741:27;;;;;;;;:::i;:::-;;;;;;;16694:16;:84::i;:::-;15636:1149:::0;;;;;;;;;:::o;23361:276::-;23496:24;23543:87;23570:7;23591:10;23615:5;23543:13;:87::i;:::-;23536:94;23361:276;-1:-1:-1;;;23361:276:10:o;6924:969::-;7267:7;7276;7299:12;7314:99;7336:7;7357;7378;7399:4;7314:8;:99::i;:::-;7299:114;;7424:13;7440:11;:62;;7492:10;7440:62;;;-1:-1:-1;;7440:62:10;7513:174;;-1:-1:-1;;;7513:174:10;;7424:78;;-1:-1:-1;;;;;;7513:23:10;;;;;:174;;7550:10;;7582:4;;7424:78;;7620:9;;7643:2;;7659;;7675;;7513:174;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7705:181;7734:7;7755;7776:10;7800:11;7825;7850:3;7867:9;7705:15;:181::i;:::-;7698:188;;;;;;6924:969;;;;;;;;;;;;;;:::o;11734:851::-;11974:24;11946:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;12024:87:::1;12052:7;12073:9;12096:5;;12024:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12024:14:10::1;::::0;-1:-1:-1;;;12024:87:10:i:1;:::-;12014:97;;12174:13;12143:7;12168:1;12151:7;:14;:18;;;;:::i;:::-;12143:27;;;;;;;;:::i;:::-;;;;;;;:44;;12122:130;;;;-1:-1:-1::0;;;12122:130:10::1;;;;;;;:::i;:::-;12263:232;12294:5;;12300:1;12294:8;;;;;;;:::i;12263:232::-;12506:72;12525:7;12546:5;;12506:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12565:3:10;;-1:-1:-1;12506:5:10::1;::::0;-1:-1:-1;;12506:72:10:i:1;14503:1127::-:0;14740:24;14712:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;14828:4:10::1;14801:31;:5:::0;;14807:16:::1;14822:1;14801:5:::0;14807:16:::1;:::i;:::-;14801:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14801:31:10::1;;14780:103;;;;-1:-1:-1::0;;;14780:103:10::1;;;;;;;:::i;:::-;14904:87;14931:7;14952:10;14976:5;;14904:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;14904:13:10::1;::::0;-1:-1:-1;;;14904:87:10:i:1;:::-;14894:97;;15037:12;15023:7;15031:1;15023:10;;;;;;;;:::i;:::-;;;;;;;:26;;15002:108;;;;-1:-1:-1::0;;;15002:108:10::1;;;;;;;:::i;9645:999::-:0;10000:17;10033:12;10048:95;10070:7;10091:6;10111:4;10129;10048:8;:95::i;:::-;10033:110;;10154:13;10170:11;:62;;10222:10;10170:62;;;-1:-1:-1;;10170:62:10;10243:174;;-1:-1:-1;;;10243:174:10;;10154:78;;-1:-1:-1;;;;;;10243:23:10;;;;;:174;;10280:10;;10312:4;;10154:78;;10350:9;;10373:2;;10389;;10405;;10243:174;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10440:197;10501:6;10521:10;10545:15;10574:13;10601:3;10618:9;10440:47;:197::i;:::-;10428:209;9645:999;-1:-1:-1;;;;;;;;;;;;;9645:999:10:o;19727:852::-;19968:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;19993:231:::1;20024:5;;20030:1;20024:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;20046:10;20070:121;20096:7;20121:5;;20127:1;20121:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;20147:5;;20153:1;20147:8;;;;;;;:::i;20070:121::-;20205:9;19993:17;:231::i;:::-;20235:21;20266:5:::0;;20272:16:::1;20287:1;20266:5:::0;20272:16:::1;:::i;:::-;20266:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;20259:46;::::0;-1:-1:-1;;;20259:46:10;;-1:-1:-1;;;;;6792:32:11;;;20259:46:10::1;::::0;::::1;6774:51:11::0;20259:41:10;;;::::1;::::0;::::1;::::0;6747:18:11;;20259:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20235:70;;20316:80;20364:5;;20316:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;20383:3:10;;-1:-1:-1;20316:34:10::1;::::0;-1:-1:-1;;20316:80:10:i:1;:::-;20494:13:::0;20477;20435:5;;20441:16:::1;20456:1;20435:5:::0;20441:16:::1;:::i;:::-;20435:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;20428:46;::::0;-1:-1:-1;;;20428:46:10;;-1:-1:-1;;;;;6792:32:11;;;20428:46:10::1;::::0;::::1;6774:51:11::0;20428:41:10;;;::::1;::::0;::::1;::::0;6747:18:11;;20428:46:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;:79;;20407:165;;;;-1:-1:-1::0;;;20407:165:10::1;;;;;;;:::i;:::-;19983:596;19727:852:::0;;;;;;;:::o;22775:298::-;22921:17;22966:100;22988:8;23010:7;23031;23052:4;22966:8;:100::i;:::-;22954:112;22775:298;-1:-1:-1;;;;22775:298:10:o;21699:1070::-;21937:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;22010:4:10::1;21983:31;:5:::0;;21989:16:::1;22004:1;21983:5:::0;21989:16:::1;:::i;:::-;21983:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21983:31:10::1;;21962:103;;;;-1:-1:-1::0;;;21962:103:10::1;;;;;;;:::i;:::-;22076:231;22107:5;;22113:1;22107:8;;;;;;;:::i;22076:231::-;22318:90;22366:5;;22318:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22393:4:10::1;::::0;-1:-1:-1;22318:34:10::1;::::0;-1:-1:-1;;22318:90:10:i:1;:::-;22439:59;::::0;-1:-1:-1;;;22439:59:10;;22483:4:::1;22439:59;::::0;::::1;6774:51:11::0;22419:17:10::1;::::0;22446:4:::1;-1:-1:-1::0;;;;;22439:22:10::1;::::0;::::1;::::0;6747:18:11;;22439:59:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22419:79;;22543:13;22530:9;:26;;22509:112;;;;-1:-1:-1::0;;;22509:112:10::1;;;;;;;:::i;:::-;22632:53;::::0;-1:-1:-1;;;22632:53:10;;::::1;::::0;::::1;2033:25:11::0;;;22638:4:10::1;-1:-1:-1::0;;;;;22632:20:10::1;::::0;::::1;::::0;2006:18:11;;22632:53:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22696:66;22726:3;22743:9;22696:16;:66::i;13426:1071::-:0;13652:24;13624:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;13725:4:::1;-1:-1:-1::0;;;;;13713:16:10::1;:5;;13719:1;13713:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13713:16:10::1;;13692:88;;;;-1:-1:-1::0;;;13692:88:10::1;;;;;;;:::i;:::-;13801:87;13829:7;13850:9;13873:5;;13801:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13801:14:10::1;::::0;-1:-1:-1;;;13801:87:10:i:1;:::-;13791:97;;13951:13;13920:7;13945:1;13928:7;:14;:18;;;;:::i;:::-;13920:27;;;;;;;;:::i;:::-;;;;;;;:44;;13899:130;;;;-1:-1:-1::0;;;13899:130:10::1;;;;;;;:::i;:::-;14046:4;-1:-1:-1::0;;;;;14040:19:10::1;;14080:7;14088:1;14080:10;;;;;;;;:::i;:::-;;;;;;;14040:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;14140:4;-1:-1:-1::0;;;;;14134:20:10::1;;14172:141;14202:7;14231:5;;14237:1;14231:8;;;;;;;:::i;14172:141::-;14331:7;14339:1;14331:10;;;;;;;;:::i;:::-;;;;;;;14134:221;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15675:32:11;;;;15657:51;;15739:2;15724:18;;15717:34;15645:2;15630:18;;15483:274;14134:221:10::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14113:294;;;;-1:-1:-1::0;;;14113:294:10::1;;;;;;;:::i;:::-;14418:72;14437:7;14458:5;;14418:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;14477:3:10;;-1:-1:-1;14418:5:10::1;::::0;-1:-1:-1;;14418:72:10:i:1;:::-;13426:1071:::0;;;;;;;;:::o;1854:608:8:-;2011:16;2077:1;2064:10;:14;2043:100;;;;-1:-1:-1;;;2043:100:8;;16569:2:11;2043:100:8;;;16551:21:11;16608:2;16588:18;;;16581:30;16647:34;16627:18;;;16620:62;-1:-1:-1;;;16698:18:11;;;16691:37;16745:19;;2043:100:8;16367:403:11;2043:100:8;2188:1;2175:10;:14;:45;;;;;2219:1;2205:11;:15;2175:45;2154:127;;;;-1:-1:-1;;;2154:127:8;;;;;;;:::i;:::-;2292:17;2312:23;2325:10;2312;:23;:::i;:::-;:30;;2338:4;2312:30;:::i;:::-;2292:50;-1:-1:-1;2352:19:8;2375:24;2389:10;2375:11;:24;:::i;:::-;2374:32;;2403:3;2374:32;:::i;:::-;2352:54;-1:-1:-1;2428:23:8;2352:54;2428:9;:23;:::i;:::-;:27;;2454:1;2428:27;:::i;:::-;2417:38;1854:608;-1:-1:-1;;;;;;1854:608:8:o;12591:829:10:-;12831:24;12803:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;12881:87:::1;12908:7;12929:10;12953:5;;12881:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12881:13:10::1;::::0;-1:-1:-1;;;12881:87:10:i:1;:::-;12871:97;;13014:12;13000:7;13008:1;13000:10;;;;;;;;:::i;:::-;;;;;;;:26;;12979:108;;;;-1:-1:-1::0;;;12979:108:10::1;;;;;;;:::i;722:475:8:-:0;868:15;931:1;920:8;:12;899:91;;;;-1:-1:-1;;;899:91:8;;16977:2:11;899:91:8;;;16959:21:11;;;16996:18;;;16989:30;17055:34;17035:18;;;17028:62;17107:18;;899:91:8;16775:356:11;899:91:8;1034:1;1022:9;:13;:30;;;;;1051:1;1039:9;:13;1022:30;1001:112;;;;-1:-1:-1;;;1001:112:8;;;;;;;:::i;:::-;1181:9;1134:32;1157:9;1134:8;:32;:::i;:::-;:56;;;;:::i;8840:799:10:-;9125:17;9097:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;9174:193:::1;9203:6;9223:4;9241:10;9265:15;9294:13;9329:4;9348:9;9174:15;:193::i;:::-;9442:39;::::0;-1:-1:-1;;;9442:39:10;;9475:4:::1;9442:39;::::0;::::1;6774:51:11::0;9158:209:10;;-1:-1:-1;9378:113:10::1;::::0;-1:-1:-1;9405:6:10;;9425:3;;-1:-1:-1;;;;;9442:24:10;::::1;::::0;::::1;::::0;6747:18:11;;9442:39:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9378:13;:113::i;:::-;9502:53;::::0;-1:-1:-1;;;9502:53:10;;::::1;::::0;::::1;2033:25:11::0;;;9508:4:10::1;-1:-1:-1::0;;;;;9502:20:10::1;::::0;::::1;::::0;2006:18:11;;9502:53:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9566:66;9596:3;9613:9;9566:16;:66::i;20585:1108::-:0;20812:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;20870:4:::1;-1:-1:-1::0;;;;;20858:16:10::1;:5;;20864:1;20858:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20858:16:10::1;;20837:88;;;;-1:-1:-1::0;;;20837:88:10::1;;;;;;;:::i;:::-;20936:16;20955:9;20936:28;;20981:4;-1:-1:-1::0;;;;;20975:19:10::1;;21015:8;20975:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21073:4;-1:-1:-1::0;;;;;21067:20:10::1;;21105:141;21135:7;21164:5;;21170:1;21164:8;;;;;;;:::i;21105:141::-;21067:219;::::0;-1:-1:-1;;;;;;21067:219:10::1;::::0;;;;;;-1:-1:-1;;;;;15675:32:11;;;21067:219:10::1;::::0;::::1;15657:51:11::0;15724:18;;;15717:34;;;15630:18;;21067:219:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21046:292;;;;-1:-1:-1::0;;;21046:292:10::1;;;;;;;:::i;:::-;21349:21;21380:5:::0;;21386:16:::1;21401:1;21380:5:::0;21386:16:::1;:::i;:::-;21380:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21373:46;::::0;-1:-1:-1;;;21373:46:10;;-1:-1:-1;;;;;6792:32:11;;;21373:46:10::1;::::0;::::1;6774:51:11::0;21373:41:10;;;::::1;::::0;::::1;::::0;6747:18:11;;21373:46:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21349:70;;21430:80;21478:5;;21430:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;21497:3:10;;-1:-1:-1;21430:34:10::1;::::0;-1:-1:-1;;21430:80:10:i:1;:::-;21608:13:::0;21591;21549:5;;21555:16:::1;21570:1;21549:5:::0;21555:16:::1;:::i;:::-;21549:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21542:46;::::0;-1:-1:-1;;;21542:46:10;;-1:-1:-1;;;;;6792:32:11;;;21542:46:10::1;::::0;::::1;6774:51:11::0;21542:41:10;;;::::1;::::0;::::1;::::0;6747:18:11;;21542:46:10::1;6628:203:11::0;4961:1143:10;5247:15;5276;5206:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;5316:12:::1;5331:99;5353:7;5374;5395;5416:4;5331:8;:99::i;:::-;5316:114;;5441:111;5472:4;5490:10;5514:4;5532:10;5441:17;:111::i;:::-;5635:26;::::0;-1:-1:-1;;;5635:26:10;;-1:-1:-1;;;;;6792:32:11;;;5635:26:10::1;::::0;::::1;6774:51:11::0;5577:15:10::1;::::0;;;5635:21;::::1;::::0;::::1;::::0;6747:18:11;;5635:26:10::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5563:98;;;;5673:14;5692:62;5716:7;5737;5692:10;:62::i;:::-;5672:82;;;5797:6;-1:-1:-1::0;;;;;5786:17:10::1;:7;-1:-1:-1::0;;;;;5786:17:10::1;;:83;;5852:7;5861;5786:83;;;5819:7;5828;5786:83;5765:104:::0;;-1:-1:-1;5765:104:10;-1:-1:-1;5901:22:10;;::::1;;5880:103;;;;-1:-1:-1::0;;;5880:103:10::1;;;;;;;:::i;:::-;6026:11;6015:7;:22;;5994:103;;;;-1:-1:-1::0;;;5994:103:10::1;;;;;;;:::i;:::-;5306:798;;;;4961:1143:::0;;;;;;;;;;;:::o;23079:276::-;23214:24;23261:87;23289:7;23310:9;23333:5;23261:14;:87::i;7899:935::-;8225:7;8234;8257:12;8272:95;8294:7;8315:6;8335:4;8353;8272:8;:95::i;:::-;8257:110;;8378:13;8394:11;:62;;8446:10;8394:62;;;-1:-1:-1;;8394:62:10;8467:174;;-1:-1:-1;;;8467:174:10;;8378:78;;-1:-1:-1;;;;;;8467:23:10;;;;;:174;;8504:10;;8536:4;;8378:78;;8574:9;;8597:2;;8613;;8629;;8467:174;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8659:168;8691:6;8711:10;8735:15;8764:13;8791:3;8808:9;8659:18;:168::i;:::-;8652:175;;;;;;7899:935;;;;;;;;;;;;;:::o;2554:1042::-;2877:15;2906;2935:17;2836:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;2998:173:::1;3025:7;3046;3067:15;3096;3125:11;3150;2998:13;:173::i;:::-;2977:194:::0;;-1:-1:-1;2977:194:10;-1:-1:-1;3182:12:10::1;3197:99;3219:7;3240::::0;3261;3282:4:::1;3197:8;:99::i;:::-;3182:114;;3307:111;3338:7;3359:10;3383:4;3401:7;3307:17;:111::i;:::-;3429;3460:7;3481:10;3505:4;3523:7;3429:17;:111::i;:::-;3563:26;::::0;-1:-1:-1;;;3563:26:10;;-1:-1:-1;;;;;6792:32:11;;;3563:26:10::1;::::0;::::1;6774:51:11::0;3563:21:10;::::1;::::0;::::1;::::0;6747:18:11;;3563:26:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3551:38;;2967:629;2554:1042:::0;;;;;;;;;;;;;:::o;3602:1353::-;3895:19;3928:17;3959;3854:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;4028:173:::1;4055:6;4075:4;4093:19;4126:9;4149:15;4178:13;4028;:173::i;:::-;4001:200:::0;;-1:-1:-1;4001:200:10;-1:-1:-1;4212:12:10::1;4227:95;4249:7;4270:6:::0;4290:4:::1;4308;4227:8;:95::i;:::-;4212:110;;4333:114;4364:6;4384:10;4408:4;4426:11;4333:17;:114::i;:::-;4464:4;-1:-1:-1::0;;;;;4458:19:10::1;;4498:9;4458:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;4551:83:10::1;::::0;-1:-1:-1;;;4551:83:10;;-1:-1:-1;;;;;15675:32:11;;;4551:83:10::1;::::0;::::1;15657:51:11::0;15724:18;;;15717:34;;;4557:4:10::1;4551:20;::::0;-1:-1:-1;4551:20:10::1;::::0;-1:-1:-1;15630:18:11;;;-1:-1:-1;4551:83:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4530:156;;;;-1:-1:-1::0;;;4530:156:10::1;;;;;;;:::i;:::-;4709:26;::::0;-1:-1:-1;;;4709:26:10;;-1:-1:-1;;;;;6792:32:11;;;4709:26:10::1;::::0;::::1;6774:51:11::0;4709:21:10;::::1;::::0;::::1;::::0;6747:18:11;;4709:26:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4697:38;;4762:9;4750;:21;4746:203;;;4815:109;4853:10;4897:9;4885;:21;4815:16;:109::i;:::-;3991:964;3602:1353:::0;;;;;;;;;;;:::o;16791:1258::-;17014:24;16986:9;436:15;423:9;:28;;402:104;;;;-1:-1:-1;;;402:104:10;;;;;;;:::i;:::-;17087:4:::1;-1:-1:-1::0;;;;;17075:16:10::1;:5;;17081:1;17075:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17075:16:10::1;;17054:88;;;;-1:-1:-1::0;;;17054:88:10::1;;;;;;;:::i;:::-;17163:87;17190:7;17211:10;17235:5;;17163:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17163:13:10::1;::::0;-1:-1:-1;;;17163:87:10:i:1;:::-;17153:97;;17296:9;17282:7;17290:1;17282:10;;;;;;;;:::i;:::-;;;;;;;:23;;17261:105;;;;-1:-1:-1::0;;;17261:105:10::1;;;;;;;:::i;:::-;17383:4;-1:-1:-1::0;;;;;17377:19:10::1;;17417:7;17425:1;17417:10;;;;;;;;:::i;:::-;;;;;;;17377:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;17477:4;-1:-1:-1::0;;;;;17471:20:10::1;;17509:141;17539:7;17568:5;;17574:1;17568:8;;;;;;;:::i;17509:141::-;17668:7;17676:1;17668:10;;;;;;;;:::i;:::-;;;;;;;17471:221;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;15675:32:11;;;;15657:51;;15739:2;15724:18;;15717:34;15645:2;15630:18;;15483:274;17471:221:10::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17450:294;;;;-1:-1:-1::0;;;17450:294:10::1;;;;;;;:::i;:::-;17755:72;17774:7;17795:5;;17755:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17814:3:10;;-1:-1:-1;17755:5:10::1;::::0;-1:-1:-1;;17755:72:10:i:1;:::-;17854:7;17862:1;17854:10;;;;;;;;:::i;:::-;;;;;;;17842:9;:22;17838:205;;;17908:110;17946:10;17990:7;17998:1;17990:10;;;;;;;;:::i;:::-;;;;;;;17978:9;:22;17908:16;:110::i;2792:525:8:-:0;2535:64;;;;;;;;;;;;;;;;;2982:107;;-1:-1:-1;;;;;15675:32:11;;;2982:107:8;;;15657:51:11;15724:18;;;;15717:34;;;2982:107:8;;;;;;;;;;15630:18:11;;;;2982:107:8;;;;;;;-1:-1:-1;;;;;2982:107:8;-1:-1:-1;;;2982:107:8;;;2957:142;;-1:-1:-1;;;;2957:11:8;;;:142;;2982:107;2957:142;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2921:178;;;;3131:7;:125;;;;-1:-1:-1;3160:11:8;;:16;;:82;;;3212:4;3180:62;;;;;;;;;;;;:::i;:::-;3110:200;;;;-1:-1:-1;;;3110:200:8;;18936:2:11;3110:200:8;;;18918:21:11;18975:2;18955:18;;;18948:30;19014;18994:18;;;18987:58;19062:18;;3110:200:8;18734:352:11;3110:200:8;2911:406;;2792:525;;;:::o;3914:285::-;4082:12;;;4021;4082;;;;;;;;;-1:-1:-1;;;;;4038:7:8;;;4066:5;;4038:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4020:75;;;4127:7;4106:86;;;;-1:-1:-1;;;4106:86:8;;19293:2:11;4106:86:8;;;19275:21:11;;;19312:18;;;19305:30;19371:34;19351:18;;;19344:62;19423:18;;4106:86:8;19091:356:11;4106:86:8;4010:189;3914:285;;:::o;24347:817:10:-;24509:24;24586:1;24570:5;:12;:17;;24549:89;;;;-1:-1:-1;;;24549:89:10;;;;;;;:::i;:::-;24686:5;:12;24659:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24659:49:10;;24649:59;;24732:9;24719:7;24727:1;24719:10;;;;;;;;:::i;:::-;;;;;;:22;;;;;24757:9;24752:406;24787:1;24772:5;:12;:16;;;;:::i;:::-;24768:1;:20;24752:406;;;24828:17;24863:18;24899:107;24928:8;24954:5;24960:1;24954:8;;;;;;;;:::i;:::-;;;;;;;24980:5;24986:1;24990;24986:5;;;;:::i;:::-;24980:12;;;;;;;;:::i;:::-;;;;;;;24899:11;:107::i;:::-;24810:196;;;;25038:109;25068:7;25076:1;25068:10;;;;;;;;:::i;:::-;;;;;;;25096:9;25123:10;25038:12;:109::i;:::-;25021:7;25029:5;:1;25033;25029:5;:::i;:::-;25021:14;;;;;;;;:::i;:::-;;;;;;:126;;;;;24795:363;;24790:3;;;;;:::i;:::-;;;;24752:406;;;;24347:817;;;;;:::o;4205:1009:8:-;4385:17;4419:14;4435;4463:7;-1:-1:-1;;;;;4453:17:8;:7;-1:-1:-1;;;;;4453:17:8;;:83;;4519:7;4528;4453:83;;;4486:7;4495;4453:83;4585:78;;-1:-1:-1;;19819:2:11;19815:15;;;19811:24;;4585:78:8;;;19799:37:11;19870:15;;;19866:24;19852:12;;;19845:46;4418:118:8;;-1:-1:-1;4418:118:8;-1:-1:-1;4547:12:8;;19907::11;;4585:78:8;;;-1:-1:-1;;4585:78:8;;;;;;;;;;4562:111;;4585:78;4562:111;;;;-1:-1:-1;;;4742:79:8;;4861:4;4857:26;;;4850:4;4841:14;;4834:50;-1:-1:-1;;;4913:4:8;4904:14;;4897:90;5023:19;;;;5016:4;5007:14;;5000:43;-1:-1:-1;;;;5072:4:8;5063:14;;5056:28;;;;-1:-1:-1;;5135:4:8;5120:20;;;5113:4;5104:14;;5097:44;5193:4;5177:14;;5167:31;;4205:1009::o;3323:585::-;3480:12;3494:17;3515:6;-1:-1:-1;;;;;3515:11:8;2693:76;;;;;;;;;;;;;;;;;2670:109;;;;;;;3540:135;;-1:-1:-1;;;;;20188:15:11;;;3540:135:8;;;20170:34:11;20240:15;;20220:18;;;20213:43;20272:18;;;20265:34;;;20105:18;;3540:135:8;;;-1:-1:-1;;3540:135:8;;;;;;;;;;;;;;-1:-1:-1;;;;;3540:135:8;-1:-1:-1;;;;;;3540:135:8;;;;;;;;;;3515:170;;;;3540:135;3515:170;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3479:206;;;;3717:7;:125;;;;-1:-1:-1;3746:11:8;;:16;;:82;;;3798:4;3766:62;;;;;;;;;;;;:::i;:::-;3696:205;;;;-1:-1:-1;;;3696:205:8;;20512:2:11;3696:205:8;;;20494:21:11;20551:2;20531:18;;;20524:30;20590:34;20570:18;;;20563:62;-1:-1:-1;;;20641:18:11;;;20634:31;20682:19;;3696:205:8;20310:397:11;3696:205:8;3469:439;;3323:585;;;;:::o;10650:1078:10:-;10795:9;10790:932;10825:1;10810:5;:12;:16;;;;:::i;:::-;10806:1;:20;10790:932;;;10849:13;10864:14;10900:5;10906:1;10900:8;;;;;;;;:::i;:::-;;;;;;;10926:5;10932:1;10936;10932:5;;;;:::i;:::-;10926:12;;;;;;;;:::i;:::-;;;;;;;10848:104;;;;10968:14;10987:71;11015:5;11038:6;10987:10;:71::i;:::-;-1:-1:-1;10967:91:10;-1:-1:-1;11073:17:10;11093:8;11102:5;:1;11106;11102:5;:::i;:::-;11093:15;;;;;;;;:::i;:::-;;;;;;;11073:35;;11124:18;11144;11175:6;-1:-1:-1;;;;;11166:15:10;:5;-1:-1:-1;;;;;11166:15:10;;:93;;11240:9;11256:1;11166:93;;;11206:1;11210:9;11166:93;11123:136;;;;11274:10;11306:1;11291:5;:12;:16;;;;:::i;:::-;11287:1;:20;:106;;11390:3;11287:106;;;11326:45;11335:7;11344:6;11352:5;11358;:1;11362;11358:5;:::i;:::-;11352:12;;;;;;;;:::i;:::-;;;;;;;11366:4;11326:8;:45::i;:::-;11274:119;;11436:136;11466:7;11495:5;11522:6;11550:4;11436:8;:136::i;:::-;-1:-1:-1;;;;;11408:183:10;;11609:10;11637;11665:2;11695:1;11685:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11685:12:10;;11408:303;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10833:889;;;;;;;10828:3;;;;;:::i;:::-;;;;10790:932;;;;10650:1078;;;:::o;25170:838::-;25332:24;25409:1;25393:5;:12;:17;;25372:89;;;;-1:-1:-1;;;25372:89:10;;;;;;;:::i;:::-;25509:5;:12;25482:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25482:49:10;;25472:59;;25572:10;25542:7;25567:1;25550:7;:14;:18;;;;:::i;:::-;25542:27;;;;;;;;:::i;:::-;;;;;;:40;;;;;25598:9;25625:1;25610:5;:12;:16;;;;:::i;:::-;25598:28;;25593:409;25628:5;;25593:409;;25673:17;;25744:107;25773:8;25799:5;25805;25809:1;25805;:5;:::i;:::-;25799:12;;;;;;;;:::i;:::-;;;;;;;25829:5;25835:1;25829:8;;;;;;;;:::i;25744:107::-;25655:196;;;;25883:108;25912:7;25920:1;25912:10;;;;;;;;:::i;:::-;;;;;;;25940:9;25967:10;25883:11;:108::i;:::-;25866:7;25874:5;25878:1;25874;:5;:::i;:::-;25866:14;;;;;;;;:::i;:::-;;;;;;:125;;;;;25640:362;;25635:3;;;;;:::i;:::-;;;;25593:409;;18055:1666;18194:9;18189:1526;18224:1;18209:5;:12;:16;;;;:::i;:::-;18205:1;:20;18189:1526;;;18248:13;18263:14;18299:5;18305:1;18299:8;;;;;;;;:::i;:::-;;;;;;;18325:5;18331:1;18335;18331:5;;;;:::i;:::-;18325:12;;;;;;;;:::i;:::-;;;;;;;18247:104;;;;18367:14;18386:71;18414:5;18437:6;18386:10;:71::i;:::-;18366:91;;;18472:15;18518:136;18548:7;18577:5;18604:6;18632:4;18518:8;:136::i;:::-;18472:196;;18683:19;18716:20;18784:16;18818;18853:4;-1:-1:-1;;;;;18853:16:10;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18766:105;-1:-1:-1;;;;;18766:105:10;;;-1:-1:-1;;;;;18766:105:10;;;18887:20;18909:21;18943:6;-1:-1:-1;;;;;18934:15:10;:5;-1:-1:-1;;;;;18934:15:10;;:93;;19008:8;19018;18934:93;;;18969:8;18979;18934:93;19056:38;;-1:-1:-1;;;19056:38:10;;-1:-1:-1;;;;;6792:32:11;;;19056:38:10;;;6774:51:11;18886:141:10;;-1:-1:-1;18886:141:10;;-1:-1:-1;18886:141:10;;19056:23;;;;;6747:18:11;;19056:38:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;19042:67;;19138:116;19168:11;19197:12;19227:13;19138:12;:116::i;:::-;19123:131;;18751:519;;;;19285:18;19305;19336:6;-1:-1:-1;;;;;19327:15:10;:5;-1:-1:-1;;;;;19327:15:10;;:99;;19404:12;19423:1;19327:99;;;19367:1;19371:12;19327:99;19284:142;;;;19441:10;19473:1;19458:5;:12;:16;;;;:::i;:::-;19454:1;:20;:106;;19557:3;19454:106;;;19493:45;19502:7;19511:6;19519:5;19525;:1;19529;19525:5;:::i;19493:45::-;19678:12;;;19688:1;19678:12;;;;;;;;;-1:-1:-1;;;19575:129:10;;;19441:119;;-1:-1:-1;;;;;;19575:9:10;;;;;:129;;19602:10;;19630;;19441:119;;19575:129;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18232:1483;;;;;;;;;18227:3;;;;;:::i;:::-;;;;18189:1526;;191:525:8;327:14;355;426:7;-1:-1:-1;;;;;415:18:8;:7;-1:-1:-1;;;;;415:18:8;;394:97;;;;-1:-1:-1;;;394:97:8;;22332:2:11;394:97:8;;;22314:21:11;;;22351:18;;;22344:30;22410:34;22390:18;;;22383:62;22462:18;;394:97:8;22130:356:11;394:97:8;531:7;-1:-1:-1;;;;;521:17:8;:7;-1:-1:-1;;;;;521:17:8;;:83;;587:7;596;521:83;;;554:7;563;521:83;502:102;;-1:-1:-1;502:102:8;-1:-1:-1;;;;;;636:22:8;;615:94;;;;-1:-1:-1;;;615:94:8;;22693:2:11;615:94:8;;;22675:21:11;22732:2;22712:18;;;22705:30;22771:27;22751:18;;;22744:55;22816:18;;615:94:8;22491:349:11;615:94:8;191:525;;;;;:::o;876:1672:10:-;1149:48;;-1:-1:-1;;;1149:48:10;;-1:-1:-1;;;;;23075:15:11;;;1149:48:10;;;23057:34:11;23127:15;;;23107:18;;;23100:43;-1:-1:-1;;;;;;1163:7:10;1149:30;;;;;;22992:18:11;;1149:48:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1149:64:10;;1145:192;;1229:97;;-1:-1:-1;;;1229:97:10;;-1:-1:-1;;;;;23075:15:11;;;1229:97:10;;;23057:34:11;23127:15;;;23107:18;;;23100:43;1243:7:10;1229:33;;;;22992:18:11;;1229:97:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1145:192;1361:16;1391;1421:84;1446:7;1467;1488;1421:11;:84::i;:::-;1347:158;;;;1520:8;1532:1;1520:13;:30;;;;-1:-1:-1;1537:13:10;;1520:30;1516:148;;;1591:15;1624;1566:87;;;;;;;;1516:148;1674:22;1699:88;1718:15;1747:8;1769;1699:5;:88::i;:::-;1674:113;;1820:15;1802:14;:33;1798:288;;1895:11;1877:14;:29;;1852:122;;;;-1:-1:-1;;;1852:122:10;;;;;;;:::i;:::-;2014:15;;-1:-1:-1;2047:14:10;-1:-1:-1;1989:86:10;;-1:-1:-1;;1989:86:10;1798:288;2096:22;2121:88;2140:15;2169:8;2191;2121:5;:88::i;:::-;2096:113;;2259:15;2241:14;:33;;2220:115;;;;-1:-1:-1;;;2220:115:10;;23612:2:11;2220:115:10;;;23594:21:11;23651:2;23631:18;;;23624:30;23690:34;23670:18;;;23663:62;-1:-1:-1;;;23741:18:11;;;23734:33;23784:19;;2220:115:10;23410:399:11;2220:115:10;2385:11;2367:14;:29;;2346:110;;;;-1:-1:-1;;;2346:110:10;;;;;;;:::i;:::-;2488:14;-1:-1:-1;2516:15:10;;-1:-1:-1;;;;876:1672:10;;;;;;;;;;:::o;23643:698::-;23806:16;23836;23878:14;23897:62;23921:7;23942;23897:10;:62::i;:::-;23877:82;;;23984:16;24014;24069:120;24095:8;24121:7;24146;24171:4;24069:8;:120::i;:::-;-1:-1:-1;;;;;24045:166:10;;:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23970:243;-1:-1:-1;;;;;23970:243:10;;;-1:-1:-1;;;;;23970:243:10;;;24258:6;-1:-1:-1;;;;;24247:17:10;:7;-1:-1:-1;;;;;24247:17:10;;:87;;24315:8;24325;24247:87;;;24280:8;24290;24247:87;24224:110;;;;-1:-1:-1;23643:698:10;-1:-1:-1;;;;;;;23643:698:10:o;370:131:11:-;-1:-1:-1;;;;;445:31:11;;435:42;;425:70;;491:1;488;481:12;425:70;370:131;:::o;506:134::-;574:20;;603:31;574:20;603:31;:::i;:::-;506:134;;;:::o;645:663::-;749:6;757;765;773;781;789;842:3;830:9;821:7;817:23;813:33;810:53;;;859:1;856;849:12;810:53;898:9;885:23;917:31;942:5;917:31;:::i;:::-;967:5;-1:-1:-1;1019:2:11;1004:18;;991:32;;-1:-1:-1;1070:2:11;1055:18;;1042:32;;-1:-1:-1;1121:2:11;1106:18;;1093:32;;-1:-1:-1;1177:3:11;1162:19;;1149:33;1191;1149;1191;:::i;:::-;1243:7;1233:17;;;1297:3;1286:9;1282:19;1269:33;1259:43;;645:663;;;;;;;;:::o;1566:316::-;1643:6;1651;1659;1712:2;1700:9;1691:7;1687:23;1683:32;1680:52;;;1728:1;1725;1718:12;1680:52;-1:-1:-1;;1751:23:11;;;1821:2;1806:18;;1793:32;;-1:-1:-1;1872:2:11;1857:18;;;1844:32;;1566:316;-1:-1:-1;1566:316:11:o;2069:367::-;2132:8;2142:6;2196:3;2189:4;2181:6;2177:17;2173:27;2163:55;;2214:1;2211;2204:12;2163:55;-1:-1:-1;2237:20:11;;2280:18;2269:30;;2266:50;;;2312:1;2309;2302:12;2266:50;2349:4;2341:6;2337:17;2325:29;;2409:3;2402:4;2392:6;2389:1;2385:14;2377:6;2373:27;2369:38;2366:47;2363:67;;;2426:1;2423;2416:12;2441:778;2563:6;2571;2579;2587;2595;2603;2656:3;2644:9;2635:7;2631:23;2627:33;2624:53;;;2673:1;2670;2663:12;2624:53;2709:9;2696:23;2686:33;;2766:2;2755:9;2751:18;2738:32;2728:42;;2821:2;2810:9;2806:18;2793:32;2848:18;2840:6;2837:30;2834:50;;;2880:1;2877;2870:12;2834:50;2919:70;2981:7;2972:6;2961:9;2957:22;2919:70;:::i;:::-;3008:8;;-1:-1:-1;2893:96:11;-1:-1:-1;;3093:2:11;3078:18;;3065:32;3106:31;3065:32;3106:31;:::i;:::-;3156:5;3146:15;;;3208:3;3197:9;3193:19;3180:33;3170:43;;2441:778;;;;;;;;:::o;3224:632::-;3395:2;3447:21;;;3517:13;;3420:18;;;3539:22;;;3366:4;;3395:2;3618:15;;;;3592:2;3577:18;;;3366:4;3661:169;3675:6;3672:1;3669:13;3661:169;;;3736:13;;3724:26;;3805:15;;;;3770:12;;;;3697:1;3690:9;3661:169;;;-1:-1:-1;3847:3:11;;3224:632;-1:-1:-1;;;;;;3224:632:11:o;3861:127::-;3922:10;3917:3;3913:20;3910:1;3903:31;3953:4;3950:1;3943:15;3977:4;3974:1;3967:15;3993:1189;4086:6;4094;4147:2;4135:9;4126:7;4122:23;4118:32;4115:52;;;4163:1;4160;4153:12;4115:52;4199:9;4186:23;4176:33;;4228:2;4281;4270:9;4266:18;4253:32;4304:18;4345:2;4337:6;4334:14;4331:34;;;4361:1;4358;4351:12;4331:34;4399:6;4388:9;4384:22;4374:32;;4444:7;4437:4;4433:2;4429:13;4425:27;4415:55;;4466:1;4463;4456:12;4415:55;4502:2;4489:16;4524:2;4520;4517:10;4514:36;;;4530:18;;:::i;:::-;4576:2;4573:1;4569:10;4608:2;4602:9;4671:2;4667:7;4662:2;4658;4654:11;4650:25;4642:6;4638:38;4726:6;4714:10;4711:22;4706:2;4694:10;4691:18;4688:46;4685:72;;;4737:18;;:::i;:::-;4773:2;4766:22;4823:18;;;4857:15;;;;-1:-1:-1;4899:11:11;;;4895:20;;;4927:19;;;4924:39;;;4959:1;4956;4949:12;4924:39;4983:11;;;;5003:148;5019:6;5014:3;5011:15;5003:148;;;5085:23;5104:3;5085:23;:::i;:::-;5073:36;;5036:12;;;;5129;;;;5003:148;;;5170:6;5160:16;;;;;;;;3993:1189;;;;;:::o;5187:118::-;5273:5;5266:13;5259:21;5252:5;5249:32;5239:60;;5295:1;5292;5285:12;5310:156;5376:20;;5436:4;5425:16;;5415:27;;5405:55;;5456:1;5453;5446:12;5471:1152;5615:6;5623;5631;5639;5647;5655;5663;5671;5679;5687;5695:7;5749:3;5737:9;5728:7;5724:23;5720:33;5717:53;;;5766:1;5763;5756:12;5717:53;5805:9;5792:23;5824:31;5849:5;5824:31;:::i;:::-;5874:5;-1:-1:-1;5931:2:11;5916:18;;5903:32;5944:33;5903:32;5944:33;:::i;:::-;5996:7;-1:-1:-1;6050:2:11;6035:18;;6022:32;;-1:-1:-1;6101:2:11;6086:18;;6073:32;;-1:-1:-1;6152:3:11;6137:19;;6124:33;;-1:-1:-1;6209:3:11;6194:19;;6181:33;6223;6181;6223;:::i;:::-;6275:7;-1:-1:-1;6329:3:11;6314:19;;6301:33;;-1:-1:-1;6386:3:11;6371:19;;6358:33;6400:30;6358:33;6400:30;:::i;:::-;6449:7;-1:-1:-1;6475:37:11;6507:3;6492:19;;6475:37;:::i;:::-;6465:47;;6559:3;6548:9;6544:19;6531:33;6521:43;;6612:3;6601:9;6597:19;6584:33;6573:44;;5471:1152;;;;;;;;;;;;;;:::o;6836:1008::-;6971:6;6979;6987;6995;7003;7011;7019;7027;7035;7043;7096:3;7084:9;7075:7;7071:23;7067:33;7064:53;;;7113:1;7110;7103:12;7064:53;7152:9;7139:23;7171:31;7196:5;7171:31;:::i;:::-;7221:5;-1:-1:-1;7273:2:11;7258:18;;7245:32;;-1:-1:-1;7324:2:11;7309:18;;7296:32;;-1:-1:-1;7375:2:11;7360:18;;7347:32;;-1:-1:-1;7431:3:11;7416:19;;7403:33;7445;7403;7445;:::i;:::-;7497:7;-1:-1:-1;7551:3:11;7536:19;;7523:33;;-1:-1:-1;7608:3:11;7593:19;;7580:33;7622:30;7580:33;7622:30;:::i;:::-;7671:7;-1:-1:-1;7697:37:11;7729:3;7714:19;;7697:37;:::i;:::-;7687:47;;7781:3;7770:9;7766:19;7753:33;7743:43;;7833:3;7822:9;7818:19;7805:33;7795:43;;6836:1008;;;;;;;;;;;;;:::o;7849:529::-;7926:6;7934;7942;7995:2;7983:9;7974:7;7970:23;7966:32;7963:52;;;8011:1;8008;8001:12;7963:52;8050:9;8037:23;8069:31;8094:5;8069:31;:::i;:::-;8119:5;-1:-1:-1;8176:2:11;8161:18;;8148:32;8189:33;8148:32;8189:33;:::i;:::-;8241:7;-1:-1:-1;8300:2:11;8285:18;;8272:32;8313:33;8272:32;8313:33;:::i;:::-;8365:7;8355:17;;;7849:529;;;;;:::o;8383:709::-;8496:6;8504;8512;8520;8528;8581:3;8569:9;8560:7;8556:23;8552:33;8549:53;;;8598:1;8595;8588:12;8549:53;8634:9;8621:23;8611:33;;8695:2;8684:9;8680:18;8667:32;8722:18;8714:6;8711:30;8708:50;;;8754:1;8751;8744:12;8708:50;8793:70;8855:7;8846:6;8835:9;8831:22;8793:70;:::i;:::-;8882:8;;-1:-1:-1;8767:96:11;-1:-1:-1;;8967:2:11;8952:18;;8939:32;8980:31;8939:32;8980:31;:::i;:::-;8383:709;;;;-1:-1:-1;8383:709:11;;9082:2;9067:18;9054:32;;8383:709;-1:-1:-1;;8383:709:11:o;9097:805::-;9210:6;9218;9226;9234;9242;9250;9258;9311:3;9299:9;9290:7;9286:23;9282:33;9279:53;;;9328:1;9325;9318:12;9279:53;9367:9;9354:23;9386:31;9411:5;9386:31;:::i;:::-;9436:5;-1:-1:-1;9493:2:11;9478:18;;9465:32;9506:33;9465:32;9506:33;:::i;:::-;9558:7;-1:-1:-1;9612:2:11;9597:18;;9584:32;;-1:-1:-1;9663:2:11;9648:18;;9635:32;;-1:-1:-1;9714:3:11;9699:19;;9686:33;;-1:-1:-1;9771:3:11;9756:19;;9743:33;9785;9743;9785;:::i;:::-;9837:7;9827:17;;;9891:3;9880:9;9876:19;9863:33;9853:43;;9097:805;;;;;;;;;;:::o;9907:874::-;10029:6;10037;10045;10053;10061;10069;10077;10085;10138:3;10126:9;10117:7;10113:23;10109:33;10106:53;;;10155:1;10152;10145:12;10106:53;10194:9;10181:23;10213:31;10238:5;10213:31;:::i;:::-;10263:5;-1:-1:-1;10320:2:11;10305:18;;10292:32;10333:33;10292:32;10333:33;:::i;:::-;10385:7;-1:-1:-1;10439:2:11;10424:18;;10411:32;;-1:-1:-1;10490:2:11;10475:18;;10462:32;;-1:-1:-1;10541:3:11;10526:19;;10513:33;;-1:-1:-1;10593:3:11;10578:19;;10565:33;;-1:-1:-1;10650:3:11;10635:19;;10622:33;10664;10622;10664;:::i;:::-;10716:7;10706:17;;;10770:3;10759:9;10755:19;10742:33;10732:43;;9907:874;;;;;;;;;;;:::o;11110:353::-;11312:2;11294:21;;;11351:2;11331:18;;;11324:30;11390:31;11385:2;11370:18;;11363:59;11454:2;11439:18;;11110:353::o;11875:399::-;12077:2;12059:21;;;12116:2;12096:18;;;12089:30;12155:34;12150:2;12135:18;;12128:62;-1:-1:-1;;;12221:2:11;12206:18;;12199:33;12264:3;12249:19;;11875:399::o;12279:127::-;12340:10;12335:3;12331:20;12328:1;12321:31;12371:4;12368:1;12361:15;12395:4;12392:1;12385:15;12411:168;12451:7;12517:1;12513;12509:6;12505:14;12502:1;12499:21;12494:1;12487:9;12480:17;12476:45;12473:71;;;12524:18;;:::i;:::-;-1:-1:-1;12564:9:11;;12411:168::o;12584:128::-;12624:3;12655:1;12651:6;12648:1;12645:13;12642:39;;;12661:18;;:::i;:::-;-1:-1:-1;12697:9:11;;12584:128::o;12717:217::-;12757:1;12783;12773:132;;12827:10;12822:3;12818:20;12815:1;12808:31;12862:4;12859:1;12852:15;12890:4;12887:1;12880:15;12773:132;-1:-1:-1;12919:9:11;;12717:217::o;12939:125::-;12979:4;13007:1;13004;13001:8;12998:34;;;13012:18;;:::i;:::-;-1:-1:-1;13049:9:11;;12939:125::o;13069:127::-;13130:10;13125:3;13121:20;13118:1;13111:31;13161:4;13158:1;13151:15;13185:4;13182:1;13175:15;13201:247;13260:6;13313:2;13301:9;13292:7;13288:23;13284:32;13281:52;;;13329:1;13326;13319:12;13281:52;13368:9;13355:23;13387:31;13412:5;13387:31;:::i;13453:349::-;13655:2;13637:21;;;13694:2;13674:18;;;13667:30;13733:27;13728:2;13713:18;;13706:55;13793:2;13778:18;;13453:349::o;13807:403::-;14009:2;13991:21;;;14048:2;14028:18;;;14021:30;14087:34;14082:2;14067:18;;14060:62;-1:-1:-1;;;14153:2:11;14138:18;;14131:37;14200:3;14185:19;;13807:403::o;14215:670::-;-1:-1:-1;;;;;14582:15:11;;;14564:34;;14634:15;;;;14629:2;14614:18;;14607:43;14681:2;14666:18;;14659:34;;;;14724:2;14709:18;;14702:34;;;;14785:4;14773:17;14767:3;14752:19;;14745:46;14544:3;14807:19;;14800:35;14866:3;14851:19;;14844:35;;;;14513:3;14498:19;;14215:670::o;14890:399::-;15092:2;15074:21;;;15131:2;15111:18;;;15104:30;15170:34;15165:2;15150:18;;15143:62;-1:-1:-1;;;15236:2:11;15221:18;;15214:33;15279:3;15264:19;;14890:399::o;15294:184::-;15364:6;15417:2;15405:9;15396:7;15392:23;15388:32;15385:52;;;15433:1;15430;15423:12;15385:52;-1:-1:-1;15456:16:11;;15294:184;-1:-1:-1;15294:184:11:o;15762:245::-;15829:6;15882:2;15870:9;15861:7;15857:23;15853:32;15850:52;;;15898:1;15895;15888:12;15850:52;15930:9;15924:16;15949:28;15971:5;15949:28;:::i;16012:350::-;16214:2;16196:21;;;16253:2;16233:18;;;16226:30;16292:28;16287:2;16272:18;;16265:56;16353:2;16338:18;;16012:350::o;17136:245::-;17215:6;17223;17276:2;17264:9;17255:7;17251:23;17247:32;17244:52;;;17292:1;17289;17282:12;17244:52;-1:-1:-1;;17315:16:11;;17371:2;17356:18;;;17350:25;17315:16;;17350:25;;-1:-1:-1;17136:245:11:o;17386:398::-;17588:2;17570:21;;;17627:2;17607:18;;;17600:30;17666:34;17661:2;17646:18;;17639:62;-1:-1:-1;;;17732:2:11;17717:18;;17710:32;17774:3;17759:19;;17386:398::o;17789:::-;17991:2;17973:21;;;18030:2;18010:18;;;18003:30;18069:34;18064:2;18049:18;;18042:62;-1:-1:-1;;;18135:2:11;18120:18;;18113:32;18177:3;18162:19;;17789:398::o;18192:258::-;18264:1;18274:113;18288:6;18285:1;18282:13;18274:113;;;18364:11;;;18358:18;18345:11;;;18338:39;18310:2;18303:10;18274:113;;;18405:6;18402:1;18399:13;18396:48;;;-1:-1:-1;;18440:1:11;18422:16;;18415:27;18192:258::o;18455:274::-;18584:3;18622:6;18616:13;18638:53;18684:6;18679:3;18672:4;18664:6;18660:17;18638:53;:::i;:::-;18707:16;;;;;18455:274;-1:-1:-1;;18455:274:11:o;19452:135::-;19491:3;19512:17;;;19509:43;;19532:18;;:::i;:::-;-1:-1:-1;19579:1:11;19568:13;;19452:135::o;20712:624::-;20943:6;20932:9;20925:25;20986:6;20981:2;20970:9;20966:18;20959:34;21058:1;21054;21049:3;21045:11;21041:19;21033:6;21029:32;21024:2;21013:9;21009:18;21002:60;21098:3;21093:2;21082:9;21078:18;21071:31;20906:4;21131:6;21125:13;21175:6;21169:3;21158:9;21154:19;21147:35;21191:67;21251:6;21245:3;21234:9;21230:19;21225:2;21217:6;21213:15;21191:67;:::i;:::-;21319:2;21298:15;-1:-1:-1;;21294:29:11;21279:45;;;;21326:3;21275:55;;20712:624;-1:-1:-1;;;;;20712:624:11:o;21341:136::-;21380:3;21408:5;21398:39;;21417:18;;:::i;:::-;-1:-1:-1;;;21453:18:11;;21341:136::o;21482:188::-;21561:13;;-1:-1:-1;;;;;21603:42:11;;21593:53;;21583:81;;21660:1;21657;21650:12;21675:450;21762:6;21770;21778;21831:2;21819:9;21810:7;21806:23;21802:32;21799:52;;;21847:1;21844;21837:12;21799:52;21870:40;21900:9;21870:40;:::i;:::-;21860:50;;21929:49;21974:2;21963:9;21959:18;21929:49;:::i;:::-;21919:59;;22021:2;22010:9;22006:18;22000:25;22065:10;22058:5;22054:22;22047:5;22044:33;22034:61;;22091:1;22088;22081:12;23154:251;23224:6;23277:2;23265:9;23256:7;23252:23;23248:32;23245:52;;;23293:1;23290;23283:12;23245:52;23325:9;23319:16;23344:31;23369:5;23344:31;:::i
Swarm Source
ipfs://7dea02283b88a465792995de6238b8f85659e5f689fb350f51f3ac2a20d9229d
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.