Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 24,153 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Remove Liquidity | 150955422 | 267 days ago | IN | 0 ETH | 0.00001702 | ||||
| Add Liquidity | 144217295 | 287 days ago | IN | 0 ETH | 0.00001913 | ||||
| Add Liquidity | 141876806 | 294 days ago | IN | 0 ETH | 0.00001914 | ||||
| Remove Liquidity | 141658346 | 294 days ago | IN | 0 ETH | 0.00001859 | ||||
| Add Liquidity | 140276976 | 298 days ago | IN | 0 ETH | 0.00001914 | ||||
| Add Liquidity | 129060058 | 334 days ago | IN | 0 ETH | 0.00002215 | ||||
| Add Liquidity | 127368398 | 339 days ago | IN | 0 ETH | 0.00001865 | ||||
| Add Liquidity | 125636595 | 345 days ago | IN | 0 ETH | 0.00001694 | ||||
| Add Liquidity | 125311741 | 346 days ago | IN | 0 ETH | 0.00002009 | ||||
| Add Liquidity | 123833878 | 351 days ago | IN | 0 ETH | 0.00001865 | ||||
| Add Liquidity | 123751004 | 351 days ago | IN | 0 ETH | 0.00001913 | ||||
| Add Liquidity | 123688007 | 351 days ago | IN | 0 ETH | 0.00001743 | ||||
| Add Liquidity | 123551397 | 352 days ago | IN | 0 ETH | 0.00001743 | ||||
| Add Liquidity | 123238419 | 353 days ago | IN | 0 ETH | 0.00001743 | ||||
| Add Liquidity | 122739181 | 354 days ago | IN | 0 ETH | 0.00001742 | ||||
| Add Liquidity | 122486184 | 355 days ago | IN | 0 ETH | 0.00001914 | ||||
| Add Liquidity | 122088252 | 357 days ago | IN | 0 ETH | 0.00002009 | ||||
| Add Liquidity | 121628275 | 358 days ago | IN | 0 ETH | 0.00001865 | ||||
| Remove Liquidity | 121533650 | 359 days ago | IN | 0 ETH | 0.00001735 | ||||
| Add Liquidity | 121357955 | 359 days ago | IN | 0 ETH | 0.00001751 | ||||
| Add Liquidity | 118633860 | 368 days ago | IN | 0 ETH | 0.00001789 | ||||
| Add Liquidity | 118624861 | 368 days ago | IN | 0 ETH | 0.00001956 | ||||
| Remove Liquidity | 118606807 | 368 days ago | IN | 0 ETH | 0.00001821 | ||||
| Add Liquidity | 118474189 | 369 days ago | IN | 0 ETH | 0.00001968 | ||||
| Remove Liquidity | 118472987 | 369 days ago | IN | 0 ETH | 0.00001923 |
Loading...
Loading
Contract Name:
UniswapV2Router02
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity =0.6.6;
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./libraries/UniswapV2Library.sol";
import "./libraries/SafeMath.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IWETH.sol";
contract UniswapV2Router02 is IUniswapV2Router02 {
using SafeMath for uint;
address public immutable override factory;
address public immutable override WETH;
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, "UniswapV2Router: EXPIRED");
_;
}
constructor(address _factory, address _WETH) public {
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,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
) internal virtual returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
IUniswapV2Factory(factory).createPair(tokenA, tokenB);
}
(uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, "UniswapV2Router: INSUFFICIENT_B_AMOUNT");
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, "UniswapV2Router: INSUFFICIENT_A_AMOUNT");
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
)
external
virtual
override
ensure(deadline)
returns (uint amountA, uint amountB, uint liquidity)
{
(amountA, amountB) = _addLiquidity(
tokenA,
tokenB,
amountADesired,
amountBDesired,
amountAMin,
amountBMin
);
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IUniswapV2Pair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
virtual
override
ensure(deadline)
returns (uint amountToken, uint amountETH, uint liquidity)
{
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = UniswapV2Library.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value: amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IUniswapV2Pair(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,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
(address token0, ) = UniswapV2Library.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, "UniswapV2Router: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "UniswapV2Router: INSUFFICIENT_B_AMOUNT");
}
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountToken, uint 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,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountA, uint amountB) {
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
uint value = approveMax ? uint(-1) : liquidity;
IUniswapV2Pair(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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountToken, uint amountETH) {
address pair = UniswapV2Library.pairFor(factory, token, WETH);
uint value = approveMax ? uint(-1) : liquidity;
IUniswapV2Pair(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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint 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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint amountETH) {
address pair = UniswapV2Library.pairFor(factory, token, WETH);
uint value = approveMax ? uint(-1) : liquidity;
IUniswapV2Pair(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(uint[] memory amounts, address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = UniswapV2Library.sortTokens(input, output);
uint amountOut = amounts[i + 1];
(uint amount0Out, uint amount1Out) = input == token0
? (uint(0), amountOut)
: (amountOut, uint(0));
address to = i < path.length - 2
? UniswapV2Library.pairFor(factory, output, path[i + 2])
: _to;
IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[0] == WETH, "UniswapV2Router: INVALID_PATH");
amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).deposit{value: amounts[0]}();
assert(
IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0])
);
_swap(amounts, path, to);
}
function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH");
amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= amountInMax, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.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(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH");
amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.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(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) returns (uint[] memory amounts) {
require(path[0] == WETH, "UniswapV2Router: INVALID_PATH");
amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{value: amounts[0]}();
assert(
IWETH(WETH).transfer(UniswapV2Library.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 (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = UniswapV2Library.sortTokens(input, output);
IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
uint amountInput;
uint amountOutput;
{
// scope to avoid stack too deep errors
(uint reserve0, uint reserve1, ) = pair.getReserves();
(uint reserveInput, uint reserveOutput) = input == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
amountOutput = UniswapV2Library.getAmountOut(
amountInput,
reserveInput,
reserveOutput
);
}
(uint amount0Out, uint amount1Out) = input == token0
? (uint(0), amountOutput)
: (amountOutput, uint(0));
address to = i < path.length - 2
? UniswapV2Library.pairFor(factory, output, path[i + 2])
: _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.pairFor(factory, path[0], path[1]),
amountIn
);
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
"UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "UniswapV2Router: INVALID_PATH");
uint amountIn = msg.value;
IWETH(WETH).deposit{value: amountIn}();
assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
"UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
UniswapV2Library.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(
uint amountA,
uint reserveA,
uint reserveB
) public pure virtual override returns (uint amountB) {
return UniswapV2Library.quote(amountA, reserveA, reserveB);
}
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountOut) {
return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
}
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut
) public pure virtual override returns (uint amountIn) {
return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
}
function getAmountsOut(
uint amountIn,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return UniswapV2Library.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(
uint amountOut,
address[] memory path
) public view virtual override returns (uint[] memory amounts) {
return UniswapV2Library.getAmountsIn(factory, amountOut, path);
}
function getReserves(
address tokenA,
address tokenB
) public view virtual returns (uint reserveA, uint reserveB) {
return UniswapV2Library.getReserves(factory, tokenA, tokenB);
}
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// 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');
}
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactTokensForETH(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapETHForExactTokens(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) external pure returns (uint amountOut);
function getAmountIn(
uint amountOut,
uint reserveIn,
uint reserveOut
) external pure returns (uint amountIn);
function getAmountsOut(
uint amountIn,
address[] calldata path
) external view returns (uint[] memory amounts);
function getAmountsIn(
uint amountOut,
address[] calldata path
) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import "./IUniswapV2Router01.sol";
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}pragma solidity =0.6.6;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}pragma solidity >=0.5.0;
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "./SafeMath.sol";
library UniswapV2Library {
using SafeMath for uint;
// 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, "UniswapV2Library: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), "UniswapV2Library: 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(
uint(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"51f28e45063f9911c142cab9f4aa37c1a4d7d886f43965ea26e53b3340b41119" // init code hash
)
)
)
);
}
// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint reserveA, uint reserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1, ) = IUniswapV2Pair(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(
uint amountA,
uint reserveA,
uint reserveB
) internal pure returns (uint amountB) {
require(amountA > 0, "UniswapV2Library: INSUFFICIENT_AMOUNT");
require(reserveA > 0 && reserveB > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY");
amountB = amountA.mul(reserveB) / reserveA;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) internal pure returns (uint amountOut) {
require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY");
uint amountInWithFee = amountIn.mul(997);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(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(
uint amountOut,
uint reserveIn,
uint reserveOut
) internal pure returns (uint amountIn) {
require(amountOut > 0, "UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT");
require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY");
uint numerator = reserveIn.mul(amountOut).mul(1000);
uint denominator = reserveOut.sub(amountOut).mul(997);
amountIn = (numerator / denominator).add(1);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint amountIn,
address[] memory path
) internal view returns (uint[] memory amounts) {
require(path.length >= 2, "UniswapV2Library: INVALID_PATH");
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
(uint reserveIn, uint 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,
uint amountOut,
address[] memory path
) internal view returns (uint[] memory amounts) {
require(path.length >= 2, "UniswapV2Library: INVALID_PATH");
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract ABI
API[{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","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
60c060405234801561001057600080fd5b506040516200482b3803806200482b8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6146a16200018a6000398061017a5280610d3a5280610d755280610e6c528061108a5280611414528061157a52806119415280611a3b5280611af15280611bbf5280611d055280611d8d5280611fd2528061204d52806120fc52806121c8528061225d52806122d152806128095280612a7c5280612ad25280612b065280612b7a5280612d1a5280612e5d5280612ee5525080610efa5280610fd15280611150528061118952806112c452806114a2528061155852806116c85280611c525280611dbf5280611f225280612303528061255c5280612754528061277d52806127ab52806127e752806129545280612ab05280612dad5280612f1752806137a852806137eb5280613ace5280613c4d528061413d52806141eb528061426b52506146a16000f3fe60806040526004361061016a5760003560e01c80638803dbee116100d1578063c45a01551161008a578063ded9382a11610064578063ded9382a14610b30578063e8e3370014610ba3578063f305d71914610c23578063fb3bdb4114610c69576101a3565b8063c45a015514610a2b578063d06ca61f14610a40578063d52bb6f414610af5576101a3565b80638803dbee146107fa578063ad5c464814610890578063ad615dec146108c1578063af2979eb146108f7578063b6f9de951461094a578063baa2abde146109ce576101a3565b80634a25d94a116101235780634a25d94a1461050b5780635b0d5984146105a15780635c11d79514610614578063791ac947146106aa5780637ff36ab51461074057806385f8c259146107c4576101a3565b806302751cec146101a8578063054d50d41461021457806318cbafe51461025c5780631f00ca74146103425780632195995c146103f757806338ed173914610475576101a3565b366101a357336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a157fe5b005b600080fd5b3480156101b457600080fd5b506101fb600480360360c08110156101cb57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ced565b6040805192835260208301919091528051918290030190f35b34801561022057600080fd5b5061024a6004803603606081101561023757600080fd5b5080359060208101359060400135610e07565b60408051918252519081900360200190f35b34801561026857600080fd5b506102f2600480360360a081101561027f57600080fd5b813591602081013591810190606081016040820135600160201b8111156102a557600080fd5b8201836020820111156102b757600080fd5b803590602001918460208302840111600160201b831117156102d857600080fd5b91935091506001600160a01b038135169060200135610e1c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032e578181015183820152602001610316565b505050509050019250505060405180910390f35b34801561034e57600080fd5b506102f26004803603604081101561036557600080fd5b81359190810190604081016020820135600160201b81111561038657600080fd5b82018360208201111561039857600080fd5b803590602001918460208302840111600160201b831117156103b957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611149945050505050565b34801561040357600080fd5b506101fb600480360361016081101561041b57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561117f565b34801561048157600080fd5b506102f2600480360360a081101561049857600080fd5b813591602081013591810190606081016040820135600160201b8111156104be57600080fd5b8201836020820111156104d057600080fd5b803590602001918460208302840111600160201b831117156104f157600080fd5b91935091506001600160a01b038135169060200135611279565b34801561051757600080fd5b506102f2600480360360a081101561052e57600080fd5b813591602081013591810190606081016040820135600160201b81111561055457600080fd5b82018360208201111561056657600080fd5b803590602001918460208302840111600160201b8311171561058757600080fd5b91935091506001600160a01b0381351690602001356113c4565b3480156105ad57600080fd5b5061024a60048036036101408110156105c557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611550565b34801561062057600080fd5b506101a1600480360360a081101561063757600080fd5b813591602081013591810190606081016040820135600160201b81111561065d57600080fd5b82018360208201111561066f57600080fd5b803590602001918460208302840111600160201b8311171561069057600080fd5b91935091506001600160a01b03813516906020013561165e565b3480156106b657600080fd5b506101a1600480360360a08110156106cd57600080fd5b813591602081013591810190606081016040820135600160201b8111156106f357600080fd5b82018360208201111561070557600080fd5b803590602001918460208302840111600160201b8311171561072657600080fd5b91935091506001600160a01b0381351690602001356118f3565b6102f26004803603608081101561075657600080fd5b81359190810190604081016020820135600160201b81111561077757600080fd5b82018360208201111561078957600080fd5b803590602001918460208302840111600160201b831117156107aa57600080fd5b91935091506001600160a01b038135169060200135611b77565b3480156107d057600080fd5b5061024a600480360360608110156107e757600080fd5b5080359060208101359060400135611eca565b34801561080657600080fd5b506102f2600480360360a081101561081d57600080fd5b813591602081013591810190606081016040820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460208302840111600160201b8311171561087657600080fd5b91935091506001600160a01b038135169060200135611ed7565b34801561089c57600080fd5b506108a5611fd0565b604080516001600160a01b039092168252519081900360200190f35b3480156108cd57600080fd5b5061024a600480360360608110156108e457600080fd5b5080359060208101359060400135611ff4565b34801561090357600080fd5b5061024a600480360360c081101561091a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612001565b6101a16004803603608081101561096057600080fd5b81359190810190604081016020820135600160201b81111561098157600080fd5b82018360208201111561099357600080fd5b803590602001918460208302840111600160201b831117156109b457600080fd5b91935091506001600160a01b038135169060200135612182565b3480156109da57600080fd5b506101fb600480360360e08110156109f157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c0013561250e565b348015610a3757600080fd5b506108a5612752565b348015610a4c57600080fd5b506102f260048036036040811015610a6357600080fd5b81359190810190604081016020820135600160201b811115610a8457600080fd5b820183602082011115610a9657600080fd5b803590602001918460208302840111600160201b83111715610ab757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612776945050505050565b348015610b0157600080fd5b506101fb60048036036040811015610b1857600080fd5b506001600160a01b03813581169160200135166127a3565b348015610b3c57600080fd5b506101fb6004803603610140811015610b5457600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356127dd565b348015610baf57600080fd5b50610c056004803603610100811015610bc757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128f1565b60408051938452602084019290925282820152519081900360600190f35b610c05600480360360c0811015610c3957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a2d565b6102f260048036036080811015610c7f57600080fd5b81359190810190604081016020820135600160201b811115610ca057600080fd5b820183602082011115610cb257600080fd5b803590602001918460208302840111600160201b83111715610cd357600080fd5b91935091506001600160a01b038135169060200135612cd2565b6000808242811015610d34576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b610d63897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61250e565b9093509150610d73898685613054565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b50505050610dfb85836131a8565b50965096945050505050565b6000610e148484846132a0565b949350505050565b60608142811015610e62576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e9c57fe5b905060200201356001600160a01b03166001600160a01b031614610ef5576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b610f537f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b91508682600184510381518110610f6657fe5b60200260200101511015610fab5760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b61104986866000818110610fbb57fe5b905060200201356001600160a01b03163361102f7f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ffd57fe5b905060200201356001600160a01b03168b8b600181811061101a57fe5b905060200201356001600160a01b03166134dc565b8560008151811061103c57fe5b602002602001015161359c565b611088828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506136f9915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110c757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b5050505061113e848360018551038151811061113157fe5b60200260200101516131a8565b509695505050505050565b60606111767f0000000000000000000000000000000000000000000000000000000000000000848461393f565b90505b92915050565b60008060006111af7f00000000000000000000000000000000000000000000000000000000000000008f8f6134dc565b90506000876111be578c6111c2565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b5050505061125f8f8f8f8f8f8f8f61250e565b809450819550505050509b509b9950505050505050505050565b606081428110156112bf576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b61131d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b9150868260018451038151811061133057fe5b602002602001015110156113755760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b61138586866000818110610fbb57fe5b61113e828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b6060814281101561140a576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061144457fe5b905060200201356001600160a01b03166001600160a01b03161461149d576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b6114fb7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b9150868260008151811061150b57fe5b60200260200101511115610fab5760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b60008061159e7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006134dc565b90506000866115ad578b6115b1565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561162757600080fd5b505af115801561163b573d6000803e3d6000fd5b5050505061164d8d8d8d8d8d8d612001565b9d9c50505050505050505050505050565b80428110156116a2576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b611717858560008181106116b257fe5b905060200201356001600160a01b0316336117117f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f457fe5b905060200201356001600160a01b03168a8a600181811061101a57fe5b8a61359c565b60008585600019810181811061172957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d60208110156117b857600080fd5b505160408051602088810282810182019093528882529293506117fa929091899189918291850190849080828437600092019190915250889250613a77915050565b866118ac828888600019810181811061180f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b505afa158015611888573d6000803e3d6000fd5b505050506040513d602081101561189e57600080fd5b50519063ffffffff613d8216565b10156118e95760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b5050505050505050565b8042811015611937576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061197157fe5b905060200201356001600160a01b03166001600160a01b0316146119ca576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b6119da858560008181106116b257fe5b611a18858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613a77915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a8257600080fd5b505afa158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b5051905086811015611aef5760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b505050506118e984826131a8565b60608142811015611bbd576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611bf457fe5b905060200201356001600160a01b03166001600160a01b031614611c4d576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b611cab7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b91508682600184510381518110611cbe57fe5b60200260200101511015611d035760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d3f57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611deb7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f457fe5b84600081518110611df857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b505050506040513d6020811015611e7957600080fd5b5051611e8157fe5b611ec0828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b5095945050505050565b6000610e14848484613dd2565b60608142811015611f1d576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b611f7b7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b91508682600081518110611f8b57fe5b602002602001015111156113755760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e14848484613ec2565b60008142811015612047576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b612076887f0000000000000000000000000000000000000000000000000000000000000000898989308961250e565b604080516370a0823160e01b815230600482015290519194506120fa92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120c957600080fd5b505afa1580156120dd573d6000803e3d6000fd5b505050506040513d60208110156120f357600080fd5b5051613054565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b5050505061113e84836131a8565b80428110156121c6576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121fd57fe5b905060200201356001600160a01b03166001600160a01b031614612256576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122b657600080fd5b505af11580156122ca573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61232f7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f457fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561237f57600080fd5b505af1158015612393573d6000803e3d6000fd5b505050506040513d60208110156123a957600080fd5b50516123b157fe5b6000868660001981018181106123c357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561242857600080fd5b505afa15801561243c573d6000803e3d6000fd5b505050506040513d602081101561245257600080fd5b505160408051602089810282810182019093528982529293506124949290918a918a918291850190849080828437600092019190915250899250613a77915050565b876118ac82898960001981018181106124a957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b6000808242811015612555576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b60006125827f00000000000000000000000000000000000000000000000000000000000000008c8c6134dc565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d602081101561260757600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561265457600080fd5b505af1158015612668573d6000803e3d6000fd5b505050506040513d604081101561267e57600080fd5b508051602090910151909250905060006126988e8e613f6e565b509050806001600160a01b03168e6001600160a01b0316146126bb5781836126be565b82825b90975095508a8710156127025760405162461bcd60e51b81526004018080602001828103825260268152602001806145a36026913960400191505060405180910390fd5b898610156127415760405162461bcd60e51b81526004018080602001828103825260268152602001806144e96026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111767f00000000000000000000000000000000000000000000000000000000000000008484613390565b6000806127d17f00000000000000000000000000000000000000000000000000000000000000008585614045565b915091505b9250929050565b600080600061282d7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006134dc565b905060008761283c578c612840565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156128b657600080fd5b505af11580156128ca573d6000803e3d6000fd5b505050506128dc8e8e8e8e8e8e610ced565b909f909e509c50505050505050505050505050565b6000806000834281101561293a576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6129488c8c8c8c8c8c61410c565b9094509250600061297a7f00000000000000000000000000000000000000000000000000000000000000008e8e6134dc565b90506129888d33838861359c565b6129948c33838761359c565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b505050506040513d6020811015612a1657600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a76576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b612aa48a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61410c565b90945092506000612af67f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006134dc565b9050612b048b33838861359c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612bf857600080fd5b505af1158015612c0c573d6000803e3d6000fd5b505050506040513d6020811015612c2257600080fd5b5051612c2a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c8257600080fd5b505af1158015612c96573d6000803e3d6000fd5b505050506040513d6020811015612cac57600080fd5b5051925034841015612cc457612cc4338534036131a8565b505096509650969350505050565b60608142811015612d18576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d4f57fe5b905060200201356001600160a01b03166001600160a01b031614612da8576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b612e067f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b91503482600081518110612e1657fe5b60200260200101511115612e5b5760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e9757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f437f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f457fe5b84600081518110612f5057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612fa757600080fd5b505af1158015612fbb573d6000803e3d6000fd5b505050506040513d6020811015612fd157600080fd5b5051612fd957fe5b613018828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b8160008151811061302557fe5b6020026020010151341115611ec057611ec0338360008151811061304557fe5b602002602001015134036131a8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130d15780518252601f1990920191602091820191016130b2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613133576040519150601f19603f3d011682016040523d82523d6000602084013e613138565b606091505b5091509150818015613166575080511580613166575080806020019051602081101561316357600080fd5b50515b6131a15760405162461bcd60e51b815260040180806020018281038252602d8152602001806145f4602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131f45780518252601f1990920191602091820191016131d5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613256576040519150601f19603f3d011682016040523d82523d6000602084013e61325b565b606091505b505090508061329b5760405162461bcd60e51b81526004018080602001828103825260348152602001806144906034913960400191505060405180910390fd5b505050565b60008084116132e05760405162461bcd60e51b815260040180806020018281038252602b815260200180614621602b913960400191505060405180910390fd5b6000831180156132f05750600082115b61332b5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b600061333f856103e563ffffffff61438016565b90506000613353828563ffffffff61438016565b905060006133798361336d886103e863ffffffff61438016565b9063ffffffff6143e316565b905080828161338457fe5b04979650505050505050565b60606002825110156133e9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561340157600080fd5b5060405190808252806020026020018201604052801561342b578160200160208202803683370190505b509050828160008151811061343c57fe5b60200260200101818152505060005b60018351038110156134d45760008061348e8786858151811061346a57fe5b602002602001015187866001018151811061348157fe5b6020026020010151614045565b915091506134b08484815181106134a157fe5b602002602001015183836132a0565b8484600101815181106134bf57fe5b6020908102919091010152505060010161344b565b509392505050565b60008060006134eb8585613f6e565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f51f28e45063f9911c142cab9f4aa37c1a4d7d886f43965ea26e53b3340b41119609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106136215780518252601f199092019160209182019101613602565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613683576040519150601f19603f3d011682016040523d82523d6000602084013e613688565b606091505b50915091508180156136b65750805115806136b657508080602001905160208110156136b357600080fd5b50515b6136f15760405162461bcd60e51b815260040180806020018281038252603181526020018061445f6031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139395760008084838151811061371757fe5b602002602001015185846001018151811061372e57fe5b60200260200101519150915060006137468383613f6e565b509050600087856001018151811061375a57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137885782600061378c565b6000835b91509150600060028a510388106137a357886137e4565b6137e47f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106137d757fe5b60200260200101516134dc565b90506138117f000000000000000000000000000000000000000000000000000000000000000088886134dc565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561384e576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138bf5781810151838201526020016138a7565b50505050905090810190601f1680156138ec5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561390e57600080fd5b505af1158015613922573d6000803e3d6000fd5b5050600190990198506136fc975050505050505050565b50505050565b6060600282511015613998576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139b057600080fd5b506040519080825280602002602001820160405280156139da578160200160208202803683370190505b50905082816001835103815181106139ee57fe5b60209081029190910101528151600019015b80156134d457600080613a3087866001860381518110613a1c57fe5b602002602001015187868151811061348157fe5b91509150613a52848481518110613a4357fe5b60200260200101518383613dd2565b846001850381518110613a6157fe5b6020908102919091010152505060001901613a00565b60005b600183510381101561329b57600080848381518110613a9557fe5b6020026020010151858460010181518110613aac57fe5b6020026020010151915091506000613ac48383613f6e565b5090506000613af47f000000000000000000000000000000000000000000000000000000000000000085856134dc565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b3557600080fd5b505afa158015613b49573d6000803e3d6000fd5b505050506040513d6060811015613b5f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b95578284613b98565b83835b91509150613bf6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b9550613c038683836132a0565b945050505050600080856001600160a01b0316886001600160a01b031614613c2d57826000613c31565b6000835b91509150600060028c51038a10613c48578a613c7c565b613c7c7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106137d757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613d06578181015183820152602001613cee565b50505050905090810190601f168015613d335780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613d5557600080fd5b505af1158015613d69573d6000803e3d6000fd5b50506001909b019a50613a7a9950505050505050505050565b80820382811115611179576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613e125760405162461bcd60e51b815260040180806020018281038252602c815260200180614433602c913960400191505060405180910390fd5b600083118015613e225750600082115b613e5d5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b6000613e816103e8613e75868863ffffffff61438016565b9063ffffffff61438016565b90506000613e9b6103e5613e75868963ffffffff613d8216565b9050613eb86001828481613eab57fe5b049063ffffffff6143e316565b9695505050505050565b6000808411613f025760405162461bcd60e51b81526004018080602001828103825260258152602001806145376025913960400191505060405180910390fd5b600083118015613f125750600082115b613f4d5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b82613f5e858463ffffffff61438016565b81613f6557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613fc25760405162461bcd60e51b81526004018080602001828103825260258152602001806144c46025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613fe2578284613fe5565b83835b90925090506001600160a01b0382166127d6576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b60008060006140548585613f6e565b5090506000806140658888886134dc565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561409d57600080fd5b505afa1580156140b1573d6000803e3d6000fd5b505050506040513d60608110156140c757600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146140fa5780826140fd565b81815b90999098509650505050505050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561418657600080fd5b505afa15801561419a573d6000803e3d6000fd5b505050506040513d60208110156141b057600080fd5b50516001600160a01b0316141561426357604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561423657600080fd5b505af115801561424a573d6000803e3d6000fd5b505050506040513d602081101561426057600080fd5b50505b6000806142917f00000000000000000000000000000000000000000000000000000000000000008b8b614045565b915091508160001480156142a3575080155b156142b357879350869250614373565b60006142c0898484613ec2565b905087811161431357858110156143085760405162461bcd60e51b81526004018080602001828103825260268152602001806144e96026913960400191505060405180910390fd5b889450925082614371565b6000614320898486613ec2565b90508981111561432c57fe5b8781101561436b5760405162461bcd60e51b81526004018080602001828103825260268152602001806145a36026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061439b5750508082028282828161439857fe5b04145b611179576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611179576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212206dcc6cef97439ac1d062eb9fb345f1e5866b647a8d131ab392c37577612ead6e64736f6c63430006060033000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a
Deployed Bytecode
0x60806040526004361061016a5760003560e01c80638803dbee116100d1578063c45a01551161008a578063ded9382a11610064578063ded9382a14610b30578063e8e3370014610ba3578063f305d71914610c23578063fb3bdb4114610c69576101a3565b8063c45a015514610a2b578063d06ca61f14610a40578063d52bb6f414610af5576101a3565b80638803dbee146107fa578063ad5c464814610890578063ad615dec146108c1578063af2979eb146108f7578063b6f9de951461094a578063baa2abde146109ce576101a3565b80634a25d94a116101235780634a25d94a1461050b5780635b0d5984146105a15780635c11d79514610614578063791ac947146106aa5780637ff36ab51461074057806385f8c259146107c4576101a3565b806302751cec146101a8578063054d50d41461021457806318cbafe51461025c5780631f00ca74146103425780632195995c146103f757806338ed173914610475576101a3565b366101a357336001600160a01b037f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a16146101a157fe5b005b600080fd5b3480156101b457600080fd5b506101fb600480360360c08110156101cb57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ced565b6040805192835260208301919091528051918290030190f35b34801561022057600080fd5b5061024a6004803603606081101561023757600080fd5b5080359060208101359060400135610e07565b60408051918252519081900360200190f35b34801561026857600080fd5b506102f2600480360360a081101561027f57600080fd5b813591602081013591810190606081016040820135600160201b8111156102a557600080fd5b8201836020820111156102b757600080fd5b803590602001918460208302840111600160201b831117156102d857600080fd5b91935091506001600160a01b038135169060200135610e1c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032e578181015183820152602001610316565b505050509050019250505060405180910390f35b34801561034e57600080fd5b506102f26004803603604081101561036557600080fd5b81359190810190604081016020820135600160201b81111561038657600080fd5b82018360208201111561039857600080fd5b803590602001918460208302840111600160201b831117156103b957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611149945050505050565b34801561040357600080fd5b506101fb600480360361016081101561041b57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561117f565b34801561048157600080fd5b506102f2600480360360a081101561049857600080fd5b813591602081013591810190606081016040820135600160201b8111156104be57600080fd5b8201836020820111156104d057600080fd5b803590602001918460208302840111600160201b831117156104f157600080fd5b91935091506001600160a01b038135169060200135611279565b34801561051757600080fd5b506102f2600480360360a081101561052e57600080fd5b813591602081013591810190606081016040820135600160201b81111561055457600080fd5b82018360208201111561056657600080fd5b803590602001918460208302840111600160201b8311171561058757600080fd5b91935091506001600160a01b0381351690602001356113c4565b3480156105ad57600080fd5b5061024a60048036036101408110156105c557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611550565b34801561062057600080fd5b506101a1600480360360a081101561063757600080fd5b813591602081013591810190606081016040820135600160201b81111561065d57600080fd5b82018360208201111561066f57600080fd5b803590602001918460208302840111600160201b8311171561069057600080fd5b91935091506001600160a01b03813516906020013561165e565b3480156106b657600080fd5b506101a1600480360360a08110156106cd57600080fd5b813591602081013591810190606081016040820135600160201b8111156106f357600080fd5b82018360208201111561070557600080fd5b803590602001918460208302840111600160201b8311171561072657600080fd5b91935091506001600160a01b0381351690602001356118f3565b6102f26004803603608081101561075657600080fd5b81359190810190604081016020820135600160201b81111561077757600080fd5b82018360208201111561078957600080fd5b803590602001918460208302840111600160201b831117156107aa57600080fd5b91935091506001600160a01b038135169060200135611b77565b3480156107d057600080fd5b5061024a600480360360608110156107e757600080fd5b5080359060208101359060400135611eca565b34801561080657600080fd5b506102f2600480360360a081101561081d57600080fd5b813591602081013591810190606081016040820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460208302840111600160201b8311171561087657600080fd5b91935091506001600160a01b038135169060200135611ed7565b34801561089c57600080fd5b506108a5611fd0565b604080516001600160a01b039092168252519081900360200190f35b3480156108cd57600080fd5b5061024a600480360360608110156108e457600080fd5b5080359060208101359060400135611ff4565b34801561090357600080fd5b5061024a600480360360c081101561091a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612001565b6101a16004803603608081101561096057600080fd5b81359190810190604081016020820135600160201b81111561098157600080fd5b82018360208201111561099357600080fd5b803590602001918460208302840111600160201b831117156109b457600080fd5b91935091506001600160a01b038135169060200135612182565b3480156109da57600080fd5b506101fb600480360360e08110156109f157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c0013561250e565b348015610a3757600080fd5b506108a5612752565b348015610a4c57600080fd5b506102f260048036036040811015610a6357600080fd5b81359190810190604081016020820135600160201b811115610a8457600080fd5b820183602082011115610a9657600080fd5b803590602001918460208302840111600160201b83111715610ab757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612776945050505050565b348015610b0157600080fd5b506101fb60048036036040811015610b1857600080fd5b506001600160a01b03813581169160200135166127a3565b348015610b3c57600080fd5b506101fb6004803603610140811015610b5457600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356127dd565b348015610baf57600080fd5b50610c056004803603610100811015610bc757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128f1565b60408051938452602084019290925282820152519081900360600190f35b610c05600480360360c0811015610c3957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a2d565b6102f260048036036080811015610c7f57600080fd5b81359190810190604081016020820135600160201b811115610ca057600080fd5b820183602082011115610cb257600080fd5b803590602001918460208302840111600160201b83111715610cd357600080fd5b91935091506001600160a01b038135169060200135612cd2565b6000808242811015610d34576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b610d63897f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a8a8a8a308a61250e565b9093509150610d73898685613054565b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b50505050610dfb85836131a8565b50965096945050505050565b6000610e148484846132a0565b949350505050565b60608142811015610e62576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a1686866000198101818110610e9c57fe5b905060200201356001600160a01b03166001600160a01b031614610ef5576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b610f537f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b91508682600184510381518110610f6657fe5b60200260200101511015610fab5760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b61104986866000818110610fbb57fe5b905060200201356001600160a01b03163361102f7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48a8a6000818110610ffd57fe5b905060200201356001600160a01b03168b8b600181811061101a57fe5b905060200201356001600160a01b03166134dc565b8560008151811061103c57fe5b602002602001015161359c565b611088828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506136f9915050565b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b0316632e1a7d4d836001855103815181106110c757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b5050505061113e848360018551038151811061113157fe5b60200260200101516131a8565b509695505050505050565b60606111767f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4848461393f565b90505b92915050565b60008060006111af7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48f8f6134dc565b90506000876111be578c6111c2565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561123857600080fd5b505af115801561124c573d6000803e3d6000fd5b5050505061125f8f8f8f8f8f8f8f61250e565b809450819550505050509b509b9950505050505050505050565b606081428110156112bf576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b61131d7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b9150868260018451038151811061133057fe5b602002602001015110156113755760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b61138586866000818110610fbb57fe5b61113e828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b6060814281101561140a576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a168686600019810181811061144457fe5b905060200201356001600160a01b03166001600160a01b03161461149d576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b6114fb7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b9150868260008151811061150b57fe5b60200260200101511115610fab5760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b60008061159e7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48d7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6134dc565b90506000866115ad578b6115b1565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561162757600080fd5b505af115801561163b573d6000803e3d6000fd5b5050505061164d8d8d8d8d8d8d612001565b9d9c50505050505050505050505050565b80428110156116a2576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b611717858560008181106116b257fe5b905060200201356001600160a01b0316336117117f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4898960008181106116f457fe5b905060200201356001600160a01b03168a8a600181811061101a57fe5b8a61359c565b60008585600019810181811061172957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d60208110156117b857600080fd5b505160408051602088810282810182019093528882529293506117fa929091899189918291850190849080828437600092019190915250889250613a77915050565b866118ac828888600019810181811061180f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b505afa158015611888573d6000803e3d6000fd5b505050506040513d602081101561189e57600080fd5b50519063ffffffff613d8216565b10156118e95760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b5050505050505050565b8042811015611937576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a168585600019810181811061197157fe5b905060200201356001600160a01b03166001600160a01b0316146119ca576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b6119da858560008181106116b257fe5b611a18858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613a77915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a16916370a0823191602480820192602092909190829003018186803b158015611a8257600080fd5b505afa158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b5051905086811015611aef5760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5557600080fd5b505af1158015611b69573d6000803e3d6000fd5b505050506118e984826131a8565b60608142811015611bbd576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031686866000818110611bf457fe5b905060200201356001600160a01b03166001600160a01b031614611c4d576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b611cab7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c43488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061339092505050565b91508682600184510381518110611cbe57fe5b60200260200101511015611d035760405162461bcd60e51b815260040180806020018281038252602b8152602001806145c9602b913960400191505060405180910390fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663d0e30db083600081518110611d3f57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b50505050507f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663a9059cbb611deb7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4898960008181106116f457fe5b84600081518110611df857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b505050506040513d6020811015611e7957600080fd5b5051611e8157fe5b611ec0828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b5095945050505050565b6000610e14848484613dd2565b60608142811015611f1d576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b611f7b7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b91508682600081518110611f8b57fe5b602002602001015111156113755760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a81565b6000610e14848484613ec2565b60008142811015612047576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b612076887f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a898989308961250e565b604080516370a0823160e01b815230600482015290519194506120fa92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120c957600080fd5b505afa1580156120dd573d6000803e3d6000fd5b505050506040513d60208110156120f357600080fd5b5051613054565b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b5050505061113e84836131a8565b80428110156121c6576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b0316858560008181106121fd57fe5b905060200201356001600160a01b03166001600160a01b031614612256576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b60003490507f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122b657600080fd5b505af11580156122ca573d6000803e3d6000fd5b50505050507f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663a9059cbb61232f7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4898960008181106116f457fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561237f57600080fd5b505af1158015612393573d6000803e3d6000fd5b505050506040513d60208110156123a957600080fd5b50516123b157fe5b6000868660001981018181106123c357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561242857600080fd5b505afa15801561243c573d6000803e3d6000fd5b505050506040513d602081101561245257600080fd5b505160408051602089810282810182019093528982529293506124949290918a918a918291850190849080828437600092019190915250899250613a77915050565b876118ac82898960001981018181106124a957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b6000808242811015612555576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b60006125827f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48c8c6134dc565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d602081101561260757600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561265457600080fd5b505af1158015612668573d6000803e3d6000fd5b505050506040513d604081101561267e57600080fd5b508051602090910151909250905060006126988e8e613f6e565b509050806001600160a01b03168e6001600160a01b0316146126bb5781836126be565b82825b90975095508a8710156127025760405162461bcd60e51b81526004018080602001828103825260268152602001806145a36026913960400191505060405180910390fd5b898610156127415760405162461bcd60e51b81526004018080602001828103825260268152602001806144e96026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c481565b60606111767f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48484613390565b6000806127d17f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48585614045565b915091505b9250929050565b600080600061282d7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48e7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6134dc565b905060008761283c578c612840565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156128b657600080fd5b505af11580156128ca573d6000803e3d6000fd5b505050506128dc8e8e8e8e8e8e610ced565b909f909e509c50505050505050505050505050565b6000806000834281101561293a576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b6129488c8c8c8c8c8c61410c565b9094509250600061297a7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48e8e6134dc565b90506129888d33838861359c565b6129948c33838761359c565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b505050506040513d6020811015612a1657600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a76576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b612aa48a7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a8b348c8c61410c565b90945092506000612af67f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48c7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6134dc565b9050612b048b33838861359c565b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b50505050507f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612bf857600080fd5b505af1158015612c0c573d6000803e3d6000fd5b505050506040513d6020811015612c2257600080fd5b5051612c2a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c8257600080fd5b505af1158015612c96573d6000803e3d6000fd5b505050506040513d6020811015612cac57600080fd5b5051925034841015612cc457612cc4338534036131a8565b505096509650969350505050565b60608142811015612d18576040805162461bcd60e51b8152602060048201526018602482015260008051602061464c833981519152604482015290519081900360640190fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031686866000818110612d4f57fe5b905060200201356001600160a01b03166001600160a01b031614612da8576040805162461bcd60e51b815260206004820152601d6024820152600080516020614583833981519152604482015290519081900360640190fd5b612e067f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061393f92505050565b91503482600081518110612e1657fe5b60200260200101511115612e5b5760405162461bcd60e51b815260040180806020018281038252602781526020018061455c6027913960400191505060405180910390fd5b7f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663d0e30db083600081518110612e9757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b50505050507f000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a6001600160a01b031663a9059cbb612f437f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4898960008181106116f457fe5b84600081518110612f5057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612fa757600080fd5b505af1158015612fbb573d6000803e3d6000fd5b505050506040513d6020811015612fd157600080fd5b5051612fd957fe5b613018828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506136f9915050565b8160008151811061302557fe5b6020026020010151341115611ec057611ec0338360008151811061304557fe5b602002602001015134036131a8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130d15780518252601f1990920191602091820191016130b2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613133576040519150601f19603f3d011682016040523d82523d6000602084013e613138565b606091505b5091509150818015613166575080511580613166575080806020019051602081101561316357600080fd5b50515b6131a15760405162461bcd60e51b815260040180806020018281038252602d8152602001806145f4602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131f45780518252601f1990920191602091820191016131d5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613256576040519150601f19603f3d011682016040523d82523d6000602084013e61325b565b606091505b505090508061329b5760405162461bcd60e51b81526004018080602001828103825260348152602001806144906034913960400191505060405180910390fd5b505050565b60008084116132e05760405162461bcd60e51b815260040180806020018281038252602b815260200180614621602b913960400191505060405180910390fd5b6000831180156132f05750600082115b61332b5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b600061333f856103e563ffffffff61438016565b90506000613353828563ffffffff61438016565b905060006133798361336d886103e863ffffffff61438016565b9063ffffffff6143e316565b905080828161338457fe5b04979650505050505050565b60606002825110156133e9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561340157600080fd5b5060405190808252806020026020018201604052801561342b578160200160208202803683370190505b509050828160008151811061343c57fe5b60200260200101818152505060005b60018351038110156134d45760008061348e8786858151811061346a57fe5b602002602001015187866001018151811061348157fe5b6020026020010151614045565b915091506134b08484815181106134a157fe5b602002602001015183836132a0565b8484600101815181106134bf57fe5b6020908102919091010152505060010161344b565b509392505050565b60008060006134eb8585613f6e565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f51f28e45063f9911c142cab9f4aa37c1a4d7d886f43965ea26e53b3340b41119609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106136215780518252601f199092019160209182019101613602565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613683576040519150601f19603f3d011682016040523d82523d6000602084013e613688565b606091505b50915091508180156136b65750805115806136b657508080602001905160208110156136b357600080fd5b50515b6136f15760405162461bcd60e51b815260040180806020018281038252603181526020018061445f6031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139395760008084838151811061371757fe5b602002602001015185846001018151811061372e57fe5b60200260200101519150915060006137468383613f6e565b509050600087856001018151811061375a57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137885782600061378c565b6000835b91509150600060028a510388106137a357886137e4565b6137e47f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4878c8b600201815181106137d757fe5b60200260200101516134dc565b90506138117f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c488886134dc565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561384e576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138bf5781810151838201526020016138a7565b50505050905090810190601f1680156138ec5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561390e57600080fd5b505af1158015613922573d6000803e3d6000fd5b5050600190990198506136fc975050505050505050565b50505050565b6060600282511015613998576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139b057600080fd5b506040519080825280602002602001820160405280156139da578160200160208202803683370190505b50905082816001835103815181106139ee57fe5b60209081029190910101528151600019015b80156134d457600080613a3087866001860381518110613a1c57fe5b602002602001015187868151811061348157fe5b91509150613a52848481518110613a4357fe5b60200260200101518383613dd2565b846001850381518110613a6157fe5b6020908102919091010152505060001901613a00565b60005b600183510381101561329b57600080848381518110613a9557fe5b6020026020010151858460010181518110613aac57fe5b6020026020010151915091506000613ac48383613f6e565b5090506000613af47f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c485856134dc565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b3557600080fd5b505afa158015613b49573d6000803e3d6000fd5b505050506040513d6060811015613b5f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b95578284613b98565b83835b91509150613bf6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187457600080fd5b9550613c038683836132a0565b945050505050600080856001600160a01b0316886001600160a01b031614613c2d57826000613c31565b6000835b91509150600060028c51038a10613c48578a613c7c565b613c7c7f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4898e8d600201815181106137d757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613d06578181015183820152602001613cee565b50505050905090810190601f168015613d335780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613d5557600080fd5b505af1158015613d69573d6000803e3d6000fd5b50506001909b019a50613a7a9950505050505050505050565b80820382811115611179576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613e125760405162461bcd60e51b815260040180806020018281038252602c815260200180614433602c913960400191505060405180910390fd5b600083118015613e225750600082115b613e5d5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b6000613e816103e8613e75868863ffffffff61438016565b9063ffffffff61438016565b90506000613e9b6103e5613e75868963ffffffff613d8216565b9050613eb86001828481613eab57fe5b049063ffffffff6143e316565b9695505050505050565b6000808411613f025760405162461bcd60e51b81526004018080602001828103825260258152602001806145376025913960400191505060405180910390fd5b600083118015613f125750600082115b613f4d5760405162461bcd60e51b815260040180806020018281038252602881526020018061450f6028913960400191505060405180910390fd5b82613f5e858463ffffffff61438016565b81613f6557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613fc25760405162461bcd60e51b81526004018080602001828103825260258152602001806144c46025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613fe2578284613fe5565b83835b90925090506001600160a01b0382166127d6576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b60008060006140548585613f6e565b5090506000806140658888886134dc565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561409d57600080fd5b505afa1580156140b1573d6000803e3d6000fd5b505050506040513d60608110156140c757600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146140fa5780826140fd565b81815b90999098509650505050505050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c49092169163e6a4390591604480820192602092909190829003018186803b15801561418657600080fd5b505afa15801561419a573d6000803e3d6000fd5b505050506040513d60208110156141b057600080fd5b50516001600160a01b0316141561426357604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c49092169163c9c65396916044808201926020929091908290030181600087803b15801561423657600080fd5b505af115801561424a573d6000803e3d6000fd5b505050506040513d602081101561426057600080fd5b50505b6000806142917f000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c48b8b614045565b915091508160001480156142a3575080155b156142b357879350869250614373565b60006142c0898484613ec2565b905087811161431357858110156143085760405162461bcd60e51b81526004018080602001828103825260268152602001806144e96026913960400191505060405180910390fd5b889450925082614371565b6000614320898486613ec2565b90508981111561432c57fe5b8781101561436b5760405162461bcd60e51b81526004018080602001828103825260268152602001806145a36026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061439b5750508082028282828161439857fe5b04145b611179576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611179576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212206dcc6cef97439ac1d062eb9fb345f1e5866b647a8d131ab392c37577612ead6e64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a
-----Decoded View---------------
Arg [0] : _factory (address): 0x918730B13dbF5fFfBc6aad247f22B980487Bd5C4
Arg [1] : _WETH (address): 0xbB10590A60Ae4eADaB08Afa6A7B3A13E75d6d31a
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000918730b13dbf5fffbc6aad247f22b980487bd5c4
Arg [1] : 000000000000000000000000bb10590a60ae4eadab08afa6a7b3a13e75d6d31a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.