More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 175,625 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 17163694 | 21 mins ago | IN | 0 CRO | 0.549743 | ||||
Swap Tokens For ... | 17163601 | 30 mins ago | IN | 0 CRO | 0.5359161 | ||||
Swap Tokens For ... | 17163600 | 30 mins ago | IN | 0 CRO | 0.5491774 | ||||
Swap Exact ETH F... | 17163354 | 53 mins ago | IN | 2.78793386 CRO | 0.7753356 | ||||
Swap Exact Token... | 17163220 | 1 hr ago | IN | 0 CRO | 1.45625 | ||||
Swap Exact Token... | 17163034 | 1 hr ago | IN | 0 CRO | 1.406 | ||||
Swap Exact Token... | 17162985 | 1 hr ago | IN | 0 CRO | 0.865873 | ||||
Swap Tokens For ... | 17162965 | 1 hr ago | IN | 0 CRO | 0.5627119 | ||||
Swap Tokens For ... | 17162964 | 1 hr ago | IN | 0 CRO | 0.5491774 | ||||
Swap Exact Token... | 17162915 | 1 hr ago | IN | 0 CRO | 0.8111613 | ||||
Swap Exact Token... | 17162863 | 1 hr ago | IN | 0 CRO | 0.7273414 | ||||
Add Liquidity ET... | 17162779 | 1 hr ago | IN | 358.92729292 CRO | 1.0923336 | ||||
Swap Exact Token... | 17162762 | 1 hr ago | IN | 0 CRO | 0.7312448 | ||||
Swap Exact ETH F... | 17162750 | 1 hr ago | IN | 720 CRO | 0.6706908 | ||||
Swap Exact Token... | 17162488 | 2 hrs ago | IN | 0 CRO | 0.5496218 | ||||
Swap Exact Token... | 17162481 | 2 hrs ago | IN | 0 CRO | 0.8513593 | ||||
Swap Exact Token... | 17162478 | 2 hrs ago | IN | 0 CRO | 0.7100906 | ||||
Swap Tokens For ... | 17162329 | 2 hrs ago | IN | 0 CRO | 0.64309932 | ||||
Swap Tokens For ... | 17162328 | 2 hrs ago | IN | 0 CRO | 0.6633628 | ||||
Swap ETH For Exa... | 17162276 | 2 hrs ago | IN | 156.16142926 CRO | 0.6922035 | ||||
Swap Exact Token... | 17162264 | 2 hrs ago | IN | 0 CRO | 0.7503391 | ||||
Swap Exact Token... | 17162221 | 2 hrs ago | IN | 0 CRO | 0.5496218 | ||||
Swap Exact Token... | 17162067 | 2 hrs ago | IN | 0 CRO | 0.55437385 | ||||
Swap Exact Token... | 17162053 | 2 hrs ago | IN | 0 CRO | 0.7311824 | ||||
Swap Exact Token... | 17162032 | 2 hrs ago | IN | 0 CRO | 0.7102118 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17163603 | 30 mins ago | 1,380 CRO | ||||
17163603 | 30 mins ago | 1,380 CRO | ||||
17163354 | 53 mins ago | 2.78793386 CRO | ||||
17163220 | 1 hr ago | 70.5442972 CRO | ||||
17163220 | 1 hr ago | 70.5442972 CRO | ||||
17163217 | 1 hr ago | 10 CRO | ||||
17163217 | 1 hr ago | 10 CRO | ||||
17163205 | 1 hr ago | 1.16296841 CRO | ||||
17163205 | 1 hr ago | 1.16296841 CRO | ||||
17163034 | 1 hr ago | 61.98237327 CRO | ||||
17163034 | 1 hr ago | 61.98237327 CRO | ||||
17162863 | 1 hr ago | 7.66773814 CRO | ||||
17162863 | 1 hr ago | 7.66773814 CRO | ||||
17162779 | 1 hr ago | 358.92729292 CRO | ||||
17162762 | 1 hr ago | 358.09304442 CRO | ||||
17162762 | 1 hr ago | 358.09304442 CRO | ||||
17162750 | 1 hr ago | 720 CRO | ||||
17162478 | 2 hrs ago | 351.94628288 CRO | ||||
17162478 | 2 hrs ago | 351.94628288 CRO | ||||
17162276 | 2 hrs ago | 0.6989965 CRO | ||||
17162276 | 2 hrs ago | 155.46243276 CRO | ||||
17162264 | 2 hrs ago | 199.55178539 CRO | ||||
17162264 | 2 hrs ago | 199.55178539 CRO | ||||
17162179 | 2 hrs ago | 50 CRO | ||||
17162179 | 2 hrs ago | 50 CRO |
Loading...
Loading
Contract Name:
RyoshiRouter
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; import {IRyoshiFactory} from "./interfaces/IRyoshiFactory.sol"; import {IRyoshiRouter} from "./interfaces/IRyoshiRouter.sol"; import {IRyoshiPair} from "./interfaces/IRyoshiPair.sol"; import {IERC20} from "./interfaces/IERC20.sol"; import {IWETH} from "./interfaces/IWETH.sol"; import {TransferHelper} from "./libraries/TransferHelper.sol"; import {RyoshiLibrary} from "./libraries/RyoshiLibrary.sol"; contract RyoshiRouter is IRyoshiRouter { //solhint-disable-next-line immutable-vars-naming address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "RyoshiRouter: EXPIRED"); _; } constructor(address _factory, address _WETH) { factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IRyoshiFactory(factory).getPair(tokenA, tokenB) == address(0)) { IRyoshiFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = RyoshiLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = RyoshiLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "RyoshiRouter: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = RyoshiLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "RyoshiRouter: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IRyoshiPair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = RyoshiLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IRyoshiPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB); IRyoshiPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IRyoshiPair(pair).burn(to); (address token0, ) = RyoshiLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require( amountA >= amountAMin, "RyoshiRouter: INSUFFICIENT_A_AMOUNT" ); require( amountB >= amountBMin, "RyoshiRouter: INSUFFICIENT_B_AMOUNT" ); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.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 virtual override returns (uint256 amountA, uint256 amountB) { address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; IRyoshiPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountA, amountB) = 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 virtual override returns (uint256 amountToken, uint256 amountETH) { address pair = RyoshiLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IRyoshiPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountETH) = removeLiquidityETH( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer( token, to, IERC20(token).balanceOf(address(this)) ); IWETH(WETH).withdraw(amountETH); TransferHelper.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 virtual override returns (uint256 amountETH) { address pair = RyoshiLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IRyoshiPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = RyoshiLibrary.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? RyoshiLibrary.pairFor(factory, output, path[i + 2]) : _to; IRyoshiPair(RyoshiLibrary.pairFor(factory, input, output)) .swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = RyoshiLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "RyoshiRouter: INVALID_PATH"); amounts = RyoshiLibrary.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH"); amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH"); amounts = RyoshiLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "RyoshiRouter: INVALID_PATH"); amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= msg.value, "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( RyoshiLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = RyoshiLibrary.sortTokens(input, output); IRyoshiPair pair = IRyoshiPair( RyoshiLibrary.pairFor(factory, input, output) ); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; amountOutput = RyoshiLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? RyoshiLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "RyoshiRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( RyoshiLibrary.pairFor(factory, path[0], path[1]), amountIn ) ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, RyoshiLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return RyoshiLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return RyoshiLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return RyoshiLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint256 amountIn, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return RyoshiLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint256 amountOut, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return RyoshiLibrary.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view 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); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; interface IRyoshiERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (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: GPL-3.0-or-later pragma solidity =0.8.4; interface IRyoshiFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); event FeeSetterChanged(address indexed oldSetter, address indexed newSetter); event FeeToChanged(address indexed oldFeeTo, address indexed newFeeTo); event SwapFeeChanged(address indexed pair, uint32 oldSwapFee, uint32 newSwapFee); event DefaultFeeChanged(uint32 oldSwapFee, uint32 newSwapFee); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function swapFee() external view returns (uint32); 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 setSwapFee(address pair, uint32 swapFee) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; import {IRyoshiERC20} from "./IRyoshiERC20.sol"; interface IRyoshiPair is IRyoshiERC20 { 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 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(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; import {IRyoshiRouter01} from "./IRyoshiRouter01.sol"; interface IRyoshiRouter is IRyoshiRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 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); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; //solhint-disable func-name-mixedcase interface IRyoshiRouter01 { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 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 amountA, uint256 amountB); 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 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut( uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function getAmountsIn( uint256 amountOut, address[] calldata path ) external view returns (uint256[] memory amounts); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; //solhint-disable reason-string import {IRyoshiPair} from "../interfaces/IRyoshiPair.sol"; library RyoshiLibrary { // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens( address tokenA, address tokenB ) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "RyoshiLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "RyoshiLibrary: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint160( uint256( keccak256( abi.encodePacked( bytes1(0xff), factory, keccak256(abi.encodePacked(token0, token1)), hex"347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016" // init code hash ) ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IRyoshiPair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "RyoshiLibrary: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "RyoshiLibrary: INSUFFICIENT_LIQUIDITY" ); amountB = (amountA * reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "RyoshiLibrary: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "RyoshiLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn * 997; uint256 numerator = amountInWithFee * reserveOut; uint256 denominator = reserveIn * 1000 + amountInWithFee; amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "RyoshiLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "RyoshiLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn * amountOut * 1000; uint256 denominator = (reserveOut - amountOut) * 997; amountIn = numerator / denominator + 1; } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "RyoshiLibrary: 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); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "RyoshiLibrary: 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); } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity =0.8.4; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x095ea7b3, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeApprove: approve failed" ); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0xa9059cbb, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x23b872dd, from, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferETH: ETH transfer failed" ); } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"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":"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"},{"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":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","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
60c06040523480156200001157600080fd5b506040516200517a3803806200517a833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c614f3b6200023f6000396000818161019f015281816103bb0152818161059c01528181610604015281816106f0015281816109ed01528181610e4501528181611021015281816114f1015281816116390152818161176201528181611825015281816119e501528181611a8101528181611dc501528181611ebe01528181611f7f0152818161203a015281816120ae015281816126be0152818161296a015281816129c0015281816129f401528181612aa201528181612c5001528181612e030152612e9f01526000818161047a015281816107aa015281816108ee01528181610aef01528181610b2601528181610c8001528181610eff01528181610fff015281816111a7015281816118de01528181611ab301528181611c67015281816120e0015281816123cc0152818161266c0152818161269c015281816128280152818161299e01528181612d0901528181612ed10152818161398d015281816139eb01528181613d2601528181613f140152818161439a0152818161446501526144eb0152614f3b6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104dc578063f305d71914610517578063fb3bdb411461052a57600080fd5b8063c45a015514610468578063d06ca61f1461049c578063ded9382a146104bc57600080fd5b8063af2979eb116100b0578063af2979eb14610415578063b6f9de9514610435578063baa2abde1461044857600080fd5b80638803dbee14610389578063ad5c4648146103a9578063ad615dec146103f557600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103365780637ff36ab51461035657806385f8c2591461036957600080fd5b80634a25d94a146102d65780635b0d5984146102f65780635c11d7951461031657600080fd5b80631f00ca74116101695780631f00ca74146102765780632195995c1461029657806338ed1739146102b657600080fd5b806302751cec146101e1578063054d50d41461021b57806318cbafe51461024957600080fd5b366101dc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149b8565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614d16565b61067e565b604051908152602001610212565b34801561025557600080fd5b50610269610264366004614ca5565b610693565b6040516102129190614d5d565b34801561028257600080fd5b50610269610291366004614b91565b610ae8565b3480156102a257600080fd5b506102016102b1366004614894565b610b1c565b3480156102c257600080fd5b506102696102d1366004614ca5565b610c28565b3480156102e257600080fd5b506102696102f1366004614ca5565b610de8565b34801561030257600080fd5b5061023b610311366004614a15565b610ff7565b34801561032257600080fd5b506101da610331366004614ca5565b611117565b34801561034257600080fd5b506101da610351366004614ca5565b611496565b610269610364366004614b2c565b6117d0565b34801561037557600080fd5b5061023b610384366004614d16565b611c02565b34801561039557600080fd5b506102696103a4366004614ca5565b611c0f565b3480156103b557600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610212565b34801561040157600080fd5b5061023b610410366004614d16565b611d5f565b34801561042157600080fd5b5061023b6104303660046149b8565b611d6c565b6101da610443366004614b2c565b611f2c565b34801561045457600080fd5b50610201610463366004614823565b612371565b34801561047457600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a857600080fd5b506102696104b7366004614b91565b612665565b3480156104c857600080fd5b506102016104d7366004614a15565b612692565b3480156104e857600080fd5b506104fc6104f736600461493d565b6127b8565b60408051938452602084019290925290820152606001610212565b6104fc6105253660046149b8565b61290e565b610269610538366004614b2c565b612bfb565b60008082428110156105965760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6105c5897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612371565b90935091506105d589868561307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b5050505061067285836131ed565b50965096945050505050565b600061068b8484846132d5565b949350505050565b606081428110156106e65760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661071d600182614e67565b81811061073a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074f91906147eb565b6001600160a01b0316146107a55760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6108037f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516108159190614e67565b8151811061083357634e487b7160e01b600052603260045260246000fd5b602002602001015110156108af5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6109ac868660008181106108d357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108e891906147eb565b3361097e7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061092e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061094391906147eb565b8b8b600181811061096457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061097991906147eb565b6135fb565b8560008151811061099f57634e487b7160e01b600052603260045260246000fd5b6020026020010151613708565b6109eb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613880915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a299190614e67565b81518110610a4757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a6d91815260200190565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b50505050610add848360018551610ab29190614e67565b81518110610ad057634e487b7160e01b600052603260045260246000fd5b60200260200101516131ed565b509695505050505050565b6060610b157f00000000000000000000000000000000000000000000000000000000000000008484613ac0565b9392505050565b6000806000610b4c7f00000000000000000000000000000000000000000000000000000000000000008f8f6135fb565b9050600087610b5b578c610b5f565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b50505050610c0e8f8f8f8f8f8f8f612371565b809450819550505050509b509b9950505050505050505050565b60608142811015610c7b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b610cd97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b9150868260018451610ceb9190614e67565b81518110610d0957634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d855760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b610da9868660008181106108d357634e487b7160e01b600052603260045260246000fd5b610add82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b60608142811015610e3b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610e72600182614e67565b818110610e8f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ea491906147eb565b6001600160a01b031614610efa5760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b610f587f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110610f7c57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108af5760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000806110457f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006135fb565b9050600086611054578b611058565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506111068d8d8d8d8d8d611d6c565b9d9c50505050505050505050505050565b80428110156111685760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6112238585600081811061118c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111a191906147eb565b3361121d7f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111fc91906147eb565b8a8a600181811061096457634e487b7160e01b600052603260045260246000fd5b8a613708565b60008585611232600182614e67565b81811061124f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061126491906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614b14565b9050611338868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c95915050565b86818787611347600182614e67565b81811061136457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137991906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140e9190614b14565b6114189190614e67565b101561148c5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b5050505050505050565b80428110156114e75760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561151e600182614e67565b81811061153b57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061155091906147eb565b6001600160a01b0316146115a65760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6115ca8585600081811061118c57634e487b7160e01b600052603260045260246000fd5b611608858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c95915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190614b14565b9050868110156117335760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b5050505061148c84826131ed565b606081428110156118235760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061186e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061188391906147eb565b6001600160a01b0316146118d95760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6119377f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516119499190614e67565b8151811061196757634e487b7160e01b600052603260045260246000fd5b602002602001015110156119e35760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611a3357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611af37f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110611b1457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611b4d9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611b6757600080fd5b505af1158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190614aaa565b611bb957634e487b7160e01b600052600160045260246000fd5b611bf882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b5095945050505050565b600061068b848484613fe9565b60608142811015611c625760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611cc07f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110611ce457634e487b7160e01b600052603260045260246000fd5b60200260200101511115610d855760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b600061068b848484614135565b60008142811015611dbf5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611dee887f00000000000000000000000000000000000000000000000000000000000000008989893089612371565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350611e8f9150899086906001600160a01b038316906370a082319060240160206040518083038186803b158015611e5257600080fd5b505afa158015611e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8a9190614b14565b61307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b50505050610add84836131ed565b8042811015611f7d5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611fc857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fdd91906147eb565b6001600160a01b0316146120335760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561209357600080fd5b505af11580156120a7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121207f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190614aaa565b6121d257634e487b7160e01b600052600160045260246000fd5b600086866121e1600182614e67565b8181106121fe57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061221391906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561226f57600080fd5b505afa158015612283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a79190614b14565b90506122e7878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c95915050565b878188886122f6600182614e67565b81811061231357634e487b7160e01b600052603260045260246000fd5b905060200201602081019061232891906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024016113be565b60008082428110156123c55760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b60006123f27f00000000000000000000000000000000000000000000000000000000000000008c8c6135fb565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190614aaa565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190614c82565b91509150600061253d8e8e614243565b509050806001600160a01b03168e6001600160a01b031614612560578183612563565b82825b90975095508a8710156125de5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b898610156126545760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b505050505097509795505050505050565b6060610b157f0000000000000000000000000000000000000000000000000000000000000000848461341c565b60008060006126e27f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006135fb565b90506000876126f1578c6126f5565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506127a38e8e8e8e8e8e61053d565b909f909e509c50505050505050505050505050565b6000806000834281101561280e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b61281c8c8c8c8c8c8c614353565b9094509250600061284e7f00000000000000000000000000000000000000000000000000000000000000008e8e6135fb565b905061285c8d338388613708565b6128688c338387613708565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fc9190614b14565b92505050985098509895505050505050565b600080600083428110156129645760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6129928a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614353565b909450925060006129e47f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006135fb565b90506129f28b338388613708565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4d57600080fd5b505af1158015612a61573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b158015612aea57600080fd5b505af1158015612afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b229190614aaa565b612b3c57634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612b9857600080fd5b505af1158015612bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd09190614b14565b925083341115612bed57612bed33612be88634614e67565b6131ed565b505096509650969350505050565b60608142811015612c4e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612cae91906147eb565b6001600160a01b031614612d045760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b612d627f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91503482600081518110612d8657634e487b7160e01b600052603260045260246000fd5b60200260200101511115612e015760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e5157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e8457600080fd5b505af1158015612e98573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f117f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110612f3257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f6b9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190614aaa565b612fd757634e487b7160e01b600052600160045260246000fd5b61301682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b8160008151811061303757634e487b7160e01b600052603260045260246000fd5b6020026020010151341115611bf857611bf8338360008151811061306b57634e487b7160e01b600052603260045260246000fd5b602002602001015134612be89190614e67565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916131089190614d41565b6000604051808303816000865af19150503d8060008114613145576040519150601f19603f3d011682016040523d82523d6000602084013e61314a565b606091505b50915091508180156131745750805115806131745750808060200190518101906131749190614aaa565b6131e65760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c656400000000000000000000000000000000000000606482015260840161058d565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516132179190614d41565b60006040518083038185875af1925050503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50509050806132d05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c6564000000000000000000000000606482015260840161058d565b505050565b600080841161334c5760405162461bcd60e51b815260206004820152602860248201527f52796f7368694c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b60008311801561335c5750600082115b6133ce5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006133dc856103e5614e48565b905060006133ea8483614e48565b90506000826133fb876103e8614e48565b6134059190614e10565b90506134118183614e28565b979650505050505050565b60606002825110156134705760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff81111561349857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134c1578160200160208202803683370190505b50905082816000815181106134e657634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516135039190614e67565b8110156135f3576000806135728786858151811061353157634e487b7160e01b600052603260045260246000fd5b6020026020010151878660016135479190614e10565b8151811061356557634e487b7160e01b600052603260045260246000fd5b6020026020010151614682565b915091506135a884848151811061359957634e487b7160e01b600052603260045260246000fd5b602002602001015183836132d5565b846135b4856001614e10565b815181106135d257634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806135eb90614ec1565b9150506134f5565b509392505050565b600080600061360a8585614243565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527f347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161379a9190614d41565b6000604051808303816000865af19150503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091508180156138065750805115806138065750808060200190518101906138069190614aaa565b6138785760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c6564000000000000000000000000000000606482015260840161058d565b505050505050565b60005b600183516138919190614e67565b811015613aba576000808483815181106138bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138d19190614e10565b815181106138ef57634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006139078383614243565b509050600087613918866001614e10565b8151811061393657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461396457826000613968565b6000835b91509150600060028a5161397c9190614e67565b881061398857886139e4565b6139e47f0000000000000000000000000000000000000000000000000000000000000000878c6139b98c6002614e10565b815181106139d757634e487b7160e01b600052603260045260246000fd5b60200260200101516135fb565b9050613a117f000000000000000000000000000000000000000000000000000000000000000088886135fb565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a4e576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a6e9493929190614da1565b600060405180830381600087803b158015613a8857600080fd5b505af1158015613a9c573d6000803e3d6000fd5b50505050505050505050508080613ab290614ec1565b915050613883565b50505050565b6060600282511015613b145760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff811115613b3c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b65578160200160208202803683370190505b509050828160018351613b789190614e67565b81518110613b9657634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351613bb29190614e67565b90505b80156135f357600080613c148786613bce600187614e67565b81518110613bec57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061356557634e487b7160e01b600052603260045260246000fd5b91509150613c4a848481518110613c3b57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613fe9565b84613c56600186614e67565b81518110613c7457634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c8d90614eaa565b915050613bb5565b60005b60018351613ca69190614e67565b8110156132d057600080848381518110613cd057634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613ce69190614e10565b81518110613d0457634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613d1c8383614243565b5090506000613d4c7f000000000000000000000000000000000000000000000000000000000000000085856135fb565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d8d57600080fd5b505afa158015613da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc59190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613e0d578284613e10565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e7257600080fd5b505afa158015613e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eaa9190614b14565b613eb49190614e67565b9550613ec18683836132d5565b945050505050600080856001600160a01b0316886001600160a01b031614613eeb57826000613eef565b6000835b91509150600060028c51613f039190614e67565b8a10613f0f578a613f40565b613f407f0000000000000000000000000000000000000000000000000000000000000000898e6139b98e6002614e10565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f9b9086908690869060248101614da1565b600060405180830381600087803b158015613fb557600080fd5b505af1158015613fc9573d6000803e3d6000fd5b505050505050505050505050508080613fe190614ec1565b915050613c98565b60008084116140605760405162461bcd60e51b815260206004820152602960248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e540000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156140705750600082115b6140e25760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006140ee8585614e48565b6140fa906103e8614e48565b905060006141088685614e67565b614114906103e5614e48565b90506141208183614e28565b61412b906001614e10565b9695505050505050565b60008084116141ac5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e54000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156141bc5750600082115b61422e5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b826142398386614e48565b61068b9190614e28565b600080826001600160a01b0316846001600160a01b031614156142ce5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a204944454e544943414c5f4144445245535360448201527f4553000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b826001600160a01b0316846001600160a01b0316106142ee5782846142f1565b83835b90925090506001600160a01b03821661434c5760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a205a45524f5f414444524553530000000000604482015260640161058d565b9250929050565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b1580156143de57600080fd5b505afa1580156143f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144169190614807565b6001600160a01b031614156144e3576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c6539690604401602060405180830381600087803b1580156144a957600080fd5b505af11580156144bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e19190614807565b505b6000806145117f00000000000000000000000000000000000000000000000000000000000000008b8b614682565b91509150816000148015614523575080155b1561453357879350869250614675565b6000614540898484614135565b90508781116145ca57858110156145bf5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b889450925082614673565b60006145d7898486614135565b9050898111156145f757634e487b7160e01b600052600160045260246000fd5b8781101561466d5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b94508793505b505b5050965096945050505050565b60008060006146918585614243565b5090506000806146a28888886135fb565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156146da57600080fd5b505afa1580156146ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147129190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461475757808261475a565b81815b90999098509650505050505050565b803561477481614f08565b919050565b60008083601f84011261478a578081fd5b50813567ffffffffffffffff8111156147a1578182fd5b6020830191508360208260051b850101111561434c57600080fd5b80516dffffffffffffffffffffffffffff8116811461477457600080fd5b803560ff8116811461477457600080fd5b6000602082840312156147fc578081fd5b8135610b1581614f08565b600060208284031215614818578081fd5b8151610b1581614f08565b600080600080600080600060e0888a03121561483d578283fd5b873561484881614f08565b9650602088013561485881614f08565b955060408801359450606088013593506080880135925060a088013561487d81614f08565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e0312156148b5578384fd5b8b356148c081614f08565b9a5060208c01356148d081614f08565b995060408c0135985060608c0135975060808c0135965060a08c01356148f581614f08565b955060c08c0135945060e08c013561490c81614f20565b935061491b6101008d016147da565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215614959578384fd5b883561496481614f08565b9750602089013561497481614f08565b965060408901359550606089013594506080890135935060a0890135925060c08901356149a081614f08565b8092505060e089013590509295985092959890939650565b60008060008060008060c087890312156149d0578182fd5b86356149db81614f08565b95506020870135945060408701359350606087013592506080870135614a0081614f08565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215614a34578384fd5b8a35614a3f81614f08565b995060208b0135985060408b0135975060608b0135965060808b0135614a6481614f08565b955060a08b0135945060c08b0135614a7b81614f20565b9350614a8960e08c016147da565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614abb578081fd5b8151610b1581614f20565b600080600060608486031215614ada578081fd5b614ae3846147bc565b9250614af1602085016147bc565b9150604084015163ffffffff81168114614b09578182fd5b809150509250925092565b600060208284031215614b25578081fd5b5051919050565b600080600080600060808688031215614b43578283fd5b85359450602086013567ffffffffffffffff811115614b60578384fd5b614b6c88828901614779565b9095509350506040860135614b8081614f08565b949793965091946060013592915050565b60008060408385031215614ba3578182fd5b8235915060208084013567ffffffffffffffff80821115614bc2578384fd5b818601915086601f830112614bd5578384fd5b813581811115614be757614be7614ef2565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614c2a57614c2a614ef2565b604052828152858101935084860182860187018b1015614c48578788fd5b8795505b83861015614c7157614c5d81614769565b855260019590950194938601938601614c4c565b508096505050505050509250929050565b60008060408385031215614c94578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614cbd578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614ce1578485fd5b614ced89828a01614779565b9095509350506060870135614d0181614f08565b80925050608087013590509295509295509295565b600080600060608486031215614d2a578081fd5b505081359360208301359350604090920135919050565b60008251614d53818460208701614e7e565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d9557835183529284019291840191600101614d79565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614ddb8160a0850160208701614e7e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614e2357614e23614edc565b500190565b600082614e4357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e6257614e62614edc565b500290565b600082821015614e7957614e79614edc565b500390565b60005b83811015614e99578181015183820152602001614e81565b83811115613aba5750506000910152565b600081614eb957614eb9614edc565b506000190190565b6000600019821415614ed557614ed5614edc565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614f1d57600080fd5b50565b8015158114614f1d57600080fdfea164736f6c6343000804000a0000000000000000000000005f1d751f447236f486f4268b883782897a9023790000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104dc578063f305d71914610517578063fb3bdb411461052a57600080fd5b8063c45a015514610468578063d06ca61f1461049c578063ded9382a146104bc57600080fd5b8063af2979eb116100b0578063af2979eb14610415578063b6f9de9514610435578063baa2abde1461044857600080fd5b80638803dbee14610389578063ad5c4648146103a9578063ad615dec146103f557600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103365780637ff36ab51461035657806385f8c2591461036957600080fd5b80634a25d94a146102d65780635b0d5984146102f65780635c11d7951461031657600080fd5b80631f00ca74116101695780631f00ca74146102765780632195995c1461029657806338ed1739146102b657600080fd5b806302751cec146101e1578063054d50d41461021b57806318cbafe51461024957600080fd5b366101dc57336001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149b8565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614d16565b61067e565b604051908152602001610212565b34801561025557600080fd5b50610269610264366004614ca5565b610693565b6040516102129190614d5d565b34801561028257600080fd5b50610269610291366004614b91565b610ae8565b3480156102a257600080fd5b506102016102b1366004614894565b610b1c565b3480156102c257600080fd5b506102696102d1366004614ca5565b610c28565b3480156102e257600080fd5b506102696102f1366004614ca5565b610de8565b34801561030257600080fd5b5061023b610311366004614a15565b610ff7565b34801561032257600080fd5b506101da610331366004614ca5565b611117565b34801561034257600080fd5b506101da610351366004614ca5565b611496565b610269610364366004614b2c565b6117d0565b34801561037557600080fd5b5061023b610384366004614d16565b611c02565b34801561039557600080fd5b506102696103a4366004614ca5565b611c0f565b3480156103b557600080fd5b506103dd7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2381565b6040516001600160a01b039091168152602001610212565b34801561040157600080fd5b5061023b610410366004614d16565b611d5f565b34801561042157600080fd5b5061023b6104303660046149b8565b611d6c565b6101da610443366004614b2c565b611f2c565b34801561045457600080fd5b50610201610463366004614823565b612371565b34801561047457600080fd5b506103dd7f0000000000000000000000005f1d751f447236f486f4268b883782897a90237981565b3480156104a857600080fd5b506102696104b7366004614b91565b612665565b3480156104c857600080fd5b506102016104d7366004614a15565b612692565b3480156104e857600080fd5b506104fc6104f736600461493d565b6127b8565b60408051938452602084019290925290820152606001610212565b6104fc6105253660046149b8565b61290e565b610269610538366004614b2c565b612bfb565b60008082428110156105965760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6105c5897f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238a8a8a308a612371565b90935091506105d589868561307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b5050505061067285836131ed565b50965096945050505050565b600061068b8484846132d5565b949350505050565b606081428110156106e65760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316868661071d600182614e67565b81811061073a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074f91906147eb565b6001600160a01b0316146107a55760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6108037f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516108159190614e67565b8151811061083357634e487b7160e01b600052603260045260246000fd5b602002602001015110156108af5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6109ac868660008181106108d357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108e891906147eb565b3361097e7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798a8a600081811061092e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061094391906147eb565b8b8b600181811061096457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061097991906147eb565b6135fb565b8560008151811061099f57634e487b7160e01b600052603260045260246000fd5b6020026020010151613708565b6109eb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613880915050565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b0316632e1a7d4d8360018551610a299190614e67565b81518110610a4757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a6d91815260200190565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b50505050610add848360018551610ab29190614e67565b81518110610ad057634e487b7160e01b600052603260045260246000fd5b60200260200101516131ed565b509695505050505050565b6060610b157f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798484613ac0565b9392505050565b6000806000610b4c7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798f8f6135fb565b9050600087610b5b578c610b5f565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b50505050610c0e8f8f8f8f8f8f8f612371565b809450819550505050509b509b9950505050505050505050565b60608142811015610c7b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b610cd97f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b9150868260018451610ceb9190614e67565b81518110610d0957634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d855760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b610da9868660008181106108d357634e487b7160e01b600052603260045260246000fd5b610add82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b60608142811015610e3b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23168686610e72600182614e67565b818110610e8f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ea491906147eb565b6001600160a01b031614610efa5760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b610f587f0000000000000000000000005f1d751f447236f486f4268b883782897a90237989888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110610f7c57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108af5760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000806110457f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798d7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b9050600086611054578b611058565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506111068d8d8d8d8d8d611d6c565b9d9c50505050505050505050505050565b80428110156111685760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6112238585600081811061118c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111a191906147eb565b3361121d7f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111fc91906147eb565b8a8a600181811061096457634e487b7160e01b600052603260045260246000fd5b8a613708565b60008585611232600182614e67565b81811061124f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061126491906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614b14565b9050611338868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c95915050565b86818787611347600182614e67565b81811061136457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137991906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140e9190614b14565b6114189190614e67565b101561148c5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b5050505050505050565b80428110156114e75760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316858561151e600182614e67565b81811061153b57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061155091906147eb565b6001600160a01b0316146115a65760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6115ca8585600081811061118c57634e487b7160e01b600052603260045260246000fd5b611608858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c95915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b0316906370a082319060240160206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190614b14565b9050868110156117335760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b5050505061148c84826131ed565b606081428110156118235760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b03168686600081811061186e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061188391906147eb565b6001600160a01b0316146118d95760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6119377f0000000000000000000000005f1d751f447236f486f4268b883782897a9023793488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516119499190614e67565b8151811061196757634e487b7160e01b600052603260045260246000fd5b602002602001015110156119e35760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db083600081518110611a3357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb611af37f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110611b1457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611b4d9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611b6757600080fd5b505af1158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190614aaa565b611bb957634e487b7160e01b600052600160045260246000fd5b611bf882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b5095945050505050565b600061068b848484613fe9565b60608142811015611c625760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611cc07f0000000000000000000000005f1d751f447236f486f4268b883782897a90237989888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110611ce457634e487b7160e01b600052603260045260246000fd5b60200260200101511115610d855760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b600061068b848484614135565b60008142811015611dbf5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611dee887f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238989893089612371565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350611e8f9150899086906001600160a01b038316906370a082319060240160206040518083038186803b158015611e5257600080fd5b505afa158015611e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8a9190614b14565b61307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b50505050610add84836131ed565b8042811015611f7d5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031685856000818110611fc857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fdd91906147eb565b6001600160a01b0316146120335760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b60003490507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561209357600080fd5b505af11580156120a7573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb6121207f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190614aaa565b6121d257634e487b7160e01b600052600160045260246000fd5b600086866121e1600182614e67565b8181106121fe57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061221391906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561226f57600080fd5b505afa158015612283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a79190614b14565b90506122e7878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c95915050565b878188886122f6600182614e67565b81811061231357634e487b7160e01b600052603260045260246000fd5b905060200201602081019061232891906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024016113be565b60008082428110156123c55760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b60006123f27f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798c8c6135fb565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190614aaa565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190614c82565b91509150600061253d8e8e614243565b509050806001600160a01b03168e6001600160a01b031614612560578183612563565b82825b90975095508a8710156125de5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b898610156126545760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b505050505097509795505050505050565b6060610b157f0000000000000000000000005f1d751f447236f486f4268b883782897a902379848461341c565b60008060006126e27f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798e7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b90506000876126f1578c6126f5565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506127a38e8e8e8e8e8e61053d565b909f909e509c50505050505050505050505050565b6000806000834281101561280e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b61281c8c8c8c8c8c8c614353565b9094509250600061284e7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798e8e6135fb565b905061285c8d338388613708565b6128688c338387613708565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fc9190614b14565b92505050985098509895505050505050565b600080600083428110156129645760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6129928a7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238b348c8c614353565b909450925060006129e47f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798c7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b90506129f28b338388613708565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4d57600080fd5b505af1158015612a61573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316935063a9059cbb92506044019050602060405180830381600087803b158015612aea57600080fd5b505af1158015612afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b229190614aaa565b612b3c57634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612b9857600080fd5b505af1158015612bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd09190614b14565b925083341115612bed57612bed33612be88634614e67565b6131ed565b505096509650969350505050565b60608142811015612c4e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031686866000818110612c9957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612cae91906147eb565b6001600160a01b031614612d045760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b612d627f0000000000000000000000005f1d751f447236f486f4268b883782897a90237988888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91503482600081518110612d8657634e487b7160e01b600052603260045260246000fd5b60200260200101511115612e015760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db083600081518110612e5157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e8457600080fd5b505af1158015612e98573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb612f117f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110612f3257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f6b9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190614aaa565b612fd757634e487b7160e01b600052600160045260246000fd5b61301682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b8160008151811061303757634e487b7160e01b600052603260045260246000fd5b6020026020010151341115611bf857611bf8338360008151811061306b57634e487b7160e01b600052603260045260246000fd5b602002602001015134612be89190614e67565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916131089190614d41565b6000604051808303816000865af19150503d8060008114613145576040519150601f19603f3d011682016040523d82523d6000602084013e61314a565b606091505b50915091508180156131745750805115806131745750808060200190518101906131749190614aaa565b6131e65760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c656400000000000000000000000000000000000000606482015260840161058d565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516132179190614d41565b60006040518083038185875af1925050503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50509050806132d05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c6564000000000000000000000000606482015260840161058d565b505050565b600080841161334c5760405162461bcd60e51b815260206004820152602860248201527f52796f7368694c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b60008311801561335c5750600082115b6133ce5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006133dc856103e5614e48565b905060006133ea8483614e48565b90506000826133fb876103e8614e48565b6134059190614e10565b90506134118183614e28565b979650505050505050565b60606002825110156134705760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff81111561349857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134c1578160200160208202803683370190505b50905082816000815181106134e657634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516135039190614e67565b8110156135f3576000806135728786858151811061353157634e487b7160e01b600052603260045260246000fd5b6020026020010151878660016135479190614e10565b8151811061356557634e487b7160e01b600052603260045260246000fd5b6020026020010151614682565b915091506135a884848151811061359957634e487b7160e01b600052603260045260246000fd5b602002602001015183836132d5565b846135b4856001614e10565b815181106135d257634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806135eb90614ec1565b9150506134f5565b509392505050565b600080600061360a8585614243565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527f347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161379a9190614d41565b6000604051808303816000865af19150503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091508180156138065750805115806138065750808060200190518101906138069190614aaa565b6138785760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c6564000000000000000000000000000000606482015260840161058d565b505050505050565b60005b600183516138919190614e67565b811015613aba576000808483815181106138bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138d19190614e10565b815181106138ef57634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006139078383614243565b509050600087613918866001614e10565b8151811061393657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461396457826000613968565b6000835b91509150600060028a5161397c9190614e67565b881061398857886139e4565b6139e47f0000000000000000000000005f1d751f447236f486f4268b883782897a902379878c6139b98c6002614e10565b815181106139d757634e487b7160e01b600052603260045260246000fd5b60200260200101516135fb565b9050613a117f0000000000000000000000005f1d751f447236f486f4268b883782897a90237988886135fb565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a4e576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a6e9493929190614da1565b600060405180830381600087803b158015613a8857600080fd5b505af1158015613a9c573d6000803e3d6000fd5b50505050505050505050508080613ab290614ec1565b915050613883565b50505050565b6060600282511015613b145760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff811115613b3c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b65578160200160208202803683370190505b509050828160018351613b789190614e67565b81518110613b9657634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351613bb29190614e67565b90505b80156135f357600080613c148786613bce600187614e67565b81518110613bec57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061356557634e487b7160e01b600052603260045260246000fd5b91509150613c4a848481518110613c3b57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613fe9565b84613c56600186614e67565b81518110613c7457634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c8d90614eaa565b915050613bb5565b60005b60018351613ca69190614e67565b8110156132d057600080848381518110613cd057634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613ce69190614e10565b81518110613d0457634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613d1c8383614243565b5090506000613d4c7f0000000000000000000000005f1d751f447236f486f4268b883782897a90237985856135fb565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d8d57600080fd5b505afa158015613da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc59190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613e0d578284613e10565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e7257600080fd5b505afa158015613e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eaa9190614b14565b613eb49190614e67565b9550613ec18683836132d5565b945050505050600080856001600160a01b0316886001600160a01b031614613eeb57826000613eef565b6000835b91509150600060028c51613f039190614e67565b8a10613f0f578a613f40565b613f407f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898e6139b98e6002614e10565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f9b9086908690869060248101614da1565b600060405180830381600087803b158015613fb557600080fd5b505af1158015613fc9573d6000803e3d6000fd5b505050505050505050505050508080613fe190614ec1565b915050613c98565b60008084116140605760405162461bcd60e51b815260206004820152602960248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e540000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156140705750600082115b6140e25760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006140ee8585614e48565b6140fa906103e8614e48565b905060006141088685614e67565b614114906103e5614e48565b90506141208183614e28565b61412b906001614e10565b9695505050505050565b60008084116141ac5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e54000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156141bc5750600082115b61422e5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b826142398386614e48565b61068b9190614e28565b600080826001600160a01b0316846001600160a01b031614156142ce5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a204944454e544943414c5f4144445245535360448201527f4553000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b826001600160a01b0316846001600160a01b0316106142ee5782846142f1565b83835b90925090506001600160a01b03821661434c5760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a205a45524f5f414444524553530000000000604482015260640161058d565b9250929050565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f0000000000000000000000005f1d751f447236f486f4268b883782897a9023799091169063e6a439059060440160206040518083038186803b1580156143de57600080fd5b505afa1580156143f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144169190614807565b6001600160a01b031614156144e3576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f0000000000000000000000005f1d751f447236f486f4268b883782897a902379169063c9c6539690604401602060405180830381600087803b1580156144a957600080fd5b505af11580156144bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e19190614807565b505b6000806145117f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798b8b614682565b91509150816000148015614523575080155b1561453357879350869250614675565b6000614540898484614135565b90508781116145ca57858110156145bf5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b889450925082614673565b60006145d7898486614135565b9050898111156145f757634e487b7160e01b600052600160045260246000fd5b8781101561466d5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b94508793505b505b5050965096945050505050565b60008060006146918585614243565b5090506000806146a28888886135fb565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156146da57600080fd5b505afa1580156146ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147129190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461475757808261475a565b81815b90999098509650505050505050565b803561477481614f08565b919050565b60008083601f84011261478a578081fd5b50813567ffffffffffffffff8111156147a1578182fd5b6020830191508360208260051b850101111561434c57600080fd5b80516dffffffffffffffffffffffffffff8116811461477457600080fd5b803560ff8116811461477457600080fd5b6000602082840312156147fc578081fd5b8135610b1581614f08565b600060208284031215614818578081fd5b8151610b1581614f08565b600080600080600080600060e0888a03121561483d578283fd5b873561484881614f08565b9650602088013561485881614f08565b955060408801359450606088013593506080880135925060a088013561487d81614f08565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e0312156148b5578384fd5b8b356148c081614f08565b9a5060208c01356148d081614f08565b995060408c0135985060608c0135975060808c0135965060a08c01356148f581614f08565b955060c08c0135945060e08c013561490c81614f20565b935061491b6101008d016147da565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215614959578384fd5b883561496481614f08565b9750602089013561497481614f08565b965060408901359550606089013594506080890135935060a0890135925060c08901356149a081614f08565b8092505060e089013590509295985092959890939650565b60008060008060008060c087890312156149d0578182fd5b86356149db81614f08565b95506020870135945060408701359350606087013592506080870135614a0081614f08565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215614a34578384fd5b8a35614a3f81614f08565b995060208b0135985060408b0135975060608b0135965060808b0135614a6481614f08565b955060a08b0135945060c08b0135614a7b81614f20565b9350614a8960e08c016147da565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614abb578081fd5b8151610b1581614f20565b600080600060608486031215614ada578081fd5b614ae3846147bc565b9250614af1602085016147bc565b9150604084015163ffffffff81168114614b09578182fd5b809150509250925092565b600060208284031215614b25578081fd5b5051919050565b600080600080600060808688031215614b43578283fd5b85359450602086013567ffffffffffffffff811115614b60578384fd5b614b6c88828901614779565b9095509350506040860135614b8081614f08565b949793965091946060013592915050565b60008060408385031215614ba3578182fd5b8235915060208084013567ffffffffffffffff80821115614bc2578384fd5b818601915086601f830112614bd5578384fd5b813581811115614be757614be7614ef2565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614c2a57614c2a614ef2565b604052828152858101935084860182860187018b1015614c48578788fd5b8795505b83861015614c7157614c5d81614769565b855260019590950194938601938601614c4c565b508096505050505050509250929050565b60008060408385031215614c94578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614cbd578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614ce1578485fd5b614ced89828a01614779565b9095509350506060870135614d0181614f08565b80925050608087013590509295509295509295565b600080600060608486031215614d2a578081fd5b505081359360208301359350604090920135919050565b60008251614d53818460208701614e7e565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d9557835183529284019291840191600101614d79565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614ddb8160a0850160208701614e7e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614e2357614e23614edc565b500190565b600082614e4357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e6257614e62614edc565b500290565b600082821015614e7957614e79614edc565b500390565b60005b83811015614e99578181015183820152602001614e81565b83811115613aba5750506000910152565b600081614eb957614eb9614edc565b506000190190565b6000600019821415614ed557614ed5614edc565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614f1d57600080fd5b50565b8015158114614f1d57600080fdfea164736f6c6343000804000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005f1d751f447236f486f4268b883782897a9023790000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
-----Decoded View---------------
Arg [0] : _factory (address): 0x5f1D751F447236f486F4268b883782897A902379
Arg [1] : _WETH (address): 0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f1d751f447236f486f4268b883782897a902379
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.