AnyswapV6Router
Deploy on AlchemyContract Information
The following smart contract is the AnyswapV6Router, which is used for swapping tokens and assets between different blockchains. It uses the SafeERC20 and SafeMathSushiswap libraries for safe token transfers and mathematical operations. The contract allows for swapping tokens for other tokens or native assets, and also supports depositing and withdrawing of native assets. The contract also includes functionality for changing the MPC (Multi Party Computation) address and enabling/disabling swap trades.
More Info
/**
*Submitted for verification at BscScan.com on 2022-01-28
*/
/**
*Submitted for verification at snowtrace.io on 2022-01-28
*/
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.8.2;
interface ISushiswapV2Pair {
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMathSushiswap {
function add(uint x, uint y) internal pure returns (uint z) {
unchecked {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
}
function sub(uint x, uint y) internal pure returns (uint z) {
unchecked {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
}
function mul(uint x, uint y) internal pure returns (uint z) {
unchecked {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
}
}
library SushiswapV2Library {
using SafeMathSushiswap 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, 'SushiswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'SushiswapV2Library: ZERO_ADDRESS');
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint160(uint256(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // 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,) = ISushiswapV2Pair(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, 'SushiswapV2Library: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'SushiswapV2Library: 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, 'SushiswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'SushiswapV2Library: 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, 'SushiswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'SushiswapV2Library: 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, 'SushiswapV2Library: 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, 'SushiswapV2Library: 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);
}
}
}
// helper methods for interacting with ERC20 tokens and sending NATIVE that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint 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: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
}
function safeTransferNative(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: NATIVE_TRANSFER_FAILED');
}
}
interface IwNATIVE {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
interface AnyswapV1ERC20 {
function mint(address to, uint256 amount) external returns (bool);
function burn(address from, uint256 amount) external returns (bool);
function setMinter(address _auth) external;
function applyMinter() external;
function revokeMinter(address _auth) external;
function changeVault(address newVault) external returns (bool);
function depositVault(uint amount, address to) external returns (uint);
function withdrawVault(address from, uint amount, address to) external returns (uint);
function underlying() external view returns (address);
function deposit(uint amount, address to) external returns (uint);
function withdraw(uint amount, address to) external returns (uint);
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
}
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
contract AnyswapV6Router {
using SafeERC20 for IERC20;
using SafeMathSushiswap for uint;
address public immutable factory;
address public immutable wNATIVE;
bool public enableSwapTrade;
modifier swapTradeEnabled() {
require(enableSwapTrade, 'AnyswapV6Router: SwapTrade disabled');
_;
}
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'AnyswapV3Router: EXPIRED');
_;
}
constructor(address _factory, address _wNATIVE, address _mpc) {
_newMPC = _mpc;
_newMPCEffectiveTime = block.timestamp;
factory = _factory;
wNATIVE = _wNATIVE;
}
receive() external payable {
assert(msg.sender == wNATIVE); // only accept Native via fallback from the wNative contract
}
address private _oldMPC;
address private _newMPC;
uint256 private _newMPCEffectiveTime;
event LogChangeMPC(address indexed oldMPC, address indexed newMPC, uint indexed effectiveTime, uint chainID);
event LogChangeRouter(address indexed oldRouter, address indexed newRouter, uint chainID);
event LogAnySwapIn(bytes32 indexed txhash, address indexed token, address indexed to, uint amount, uint fromChainID, uint toChainID);
event LogAnySwapOut(address indexed token, address indexed from, address indexed to, uint amount, uint fromChainID, uint toChainID);
event LogAnySwapOut(address indexed token, address indexed from, string to, uint amount, uint fromChainID, uint toChainID);
event LogAnySwapTradeTokensForTokens(address[] path, address indexed from, address indexed to, uint amountIn, uint amountOutMin, uint fromChainID, uint toChainID);
event LogAnySwapTradeTokensForNative(address[] path, address indexed from, address indexed to, uint amountIn, uint amountOutMin, uint fromChainID, uint toChainID);
modifier onlyMPC() {
require(msg.sender == mpc(), "AnyswapV3Router: FORBIDDEN");
_;
}
function mpc() public view returns (address) {
if (block.timestamp >= _newMPCEffectiveTime) {
return _newMPC;
}
return _oldMPC;
}
function cID() public view returns (uint id) {
assembly {id := chainid()}
}
function setEnableSwapTrade(bool enable) external onlyMPC {
enableSwapTrade = enable;
}
function changeMPC(address newMPC) public onlyMPC returns (bool) {
require(newMPC != address(0), "AnyswapV3Router: address(0x0)");
_oldMPC = mpc();
_newMPC = newMPC;
_newMPCEffectiveTime = block.timestamp + 2*24*3600;
emit LogChangeMPC(_oldMPC, _newMPC, _newMPCEffectiveTime, cID());
return true;
}
function changeVault(address token, address newVault) public onlyMPC returns (bool) {
require(newVault != address(0), "AnyswapV3Router: address(0x0)");
return AnyswapV1ERC20(token).changeVault(newVault);
}
function setMinter(address token, address _auth) external onlyMPC {
return AnyswapV1ERC20(token).setMinter(_auth);
}
function applyMinter(address token) external onlyMPC {
return AnyswapV1ERC20(token).applyMinter();
}
function revokeMinter(address token, address _auth) external onlyMPC {
return AnyswapV1ERC20(token).revokeMinter(_auth);
}
function _anySwapOut(address from, address token, address to, uint amount, uint toChainID) internal {
AnyswapV1ERC20(token).burn(from, amount);
emit LogAnySwapOut(token, from, to, amount, cID(), toChainID);
}
// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`
function anySwapOut(address token, address to, uint amount, uint toChainID) external {
_anySwapOut(msg.sender, token, to, amount, toChainID);
}
// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to` by minting with `underlying`
function anySwapOutUnderlying(address token, address to, uint amount, uint toChainID) external {
IERC20(AnyswapV1ERC20(token).underlying()).safeTransferFrom(msg.sender, token, amount);
emit LogAnySwapOut(token, msg.sender, to, amount, cID(), toChainID);
}
function anySwapOutNative(address token, address to, uint toChainID) external payable {
require(AnyswapV1ERC20(token).underlying() == wNATIVE, "AnyswapV3Router: underlying is not wNATIVE");
IwNATIVE(wNATIVE).deposit{value: msg.value}();
assert(IwNATIVE(wNATIVE).transfer(token, msg.value));
emit LogAnySwapOut(token, msg.sender, to, msg.value, cID(), toChainID);
}
function anySwapOut(address[] calldata tokens, address[] calldata to, uint[] calldata amounts, uint[] calldata toChainIDs) external {
for (uint i = 0; i < tokens.length; i++) {
_anySwapOut(msg.sender, tokens[i], to[i], amounts[i], toChainIDs[i]);
}
}
function anySwapOut(address token, string memory to, uint amount, uint toChainID) external {
AnyswapV1ERC20(token).burn(msg.sender, amount);
emit LogAnySwapOut(token, msg.sender, to, amount, cID(), toChainID);
}
function anySwapOutUnderlying(address token, string memory to, uint amount, uint toChainID) external {
IERC20(AnyswapV1ERC20(token).underlying()).safeTransferFrom(msg.sender, token, amount);
emit LogAnySwapOut(token, msg.sender, to, amount, cID(), toChainID);
}
function anySwapOutNative(address token, string memory to, uint toChainID) external payable {
require(AnyswapV1ERC20(token).underlying() == wNATIVE, "AnyswapV3Router: underlying is not wNATIVE");
IwNATIVE(wNATIVE).deposit{value: msg.value}();
assert(IwNATIVE(wNATIVE).transfer(token, msg.value));
emit LogAnySwapOut(token, msg.sender, to, msg.value, cID(), toChainID);
}
// swaps `amount` `token` in `fromChainID` to `to` on this chainID
function _anySwapIn(bytes32 txs, address token, address to, uint amount, uint fromChainID) internal {
AnyswapV1ERC20(token).mint(to, amount);
emit LogAnySwapIn(txs, token, to, amount, fromChainID, cID());
}
// swaps `amount` `token` in `fromChainID` to `to` on this chainID
// triggered by `anySwapOut`
function anySwapIn(bytes32 txs, address token, address to, uint amount, uint fromChainID) external onlyMPC {
_anySwapIn(txs, token, to, amount, fromChainID);
}
// swaps `amount` `token` in `fromChainID` to `to` on this chainID with `to` receiving `underlying`
function anySwapInUnderlying(bytes32 txs, address token, address to, uint amount, uint fromChainID) external onlyMPC {
_anySwapIn(txs, token, to, amount, fromChainID);
AnyswapV1ERC20(token).withdrawVault(to, amount, to);
}
// swaps `amount` `token` in `fromChainID` to `to` on this chainID with `to` receiving `underlying` if possible
function anySwapInAuto(bytes32 txs, address token, address to, uint amount, uint fromChainID) external onlyMPC {
_anySwapIn(txs, token, to, amount, fromChainID);
AnyswapV1ERC20 _anyToken = AnyswapV1ERC20(token);
address _underlying = _anyToken.underlying();
if (_underlying != address(0) && IERC20(_underlying).balanceOf(token) >= amount) {
if (_underlying == wNATIVE) {
_anyToken.withdrawVault(to, amount, address(this));
IwNATIVE(wNATIVE).withdraw(amount);
TransferHelper.safeTransferNative(to, amount);
} else {
_anyToken.withdrawVault(to, amount, to);
}
}
}
function depositNative(address token, address to) external payable returns (uint) {
require(AnyswapV1ERC20(token).underlying() == wNATIVE, "AnyswapV3Router: underlying is not wNATIVE");
IwNATIVE(wNATIVE).deposit{value: msg.value}();
assert(IwNATIVE(wNATIVE).transfer(token, msg.value));
AnyswapV1ERC20(token).depositVault(msg.value, to);
return msg.value;
}
function withdrawNative(address token, uint amount, address to) external returns (uint) {
require(AnyswapV1ERC20(token).underlying() == wNATIVE, "AnyswapV3Router: underlying is not wNATIVE");
AnyswapV1ERC20(token).withdrawVault(msg.sender, amount, address(this));
IwNATIVE(wNATIVE).withdraw(amount);
TransferHelper.safeTransferNative(to, amount);
return amount;
}
// extracts mpc fee from bridge fees
function anySwapFeeTo(address token, uint amount) external onlyMPC {
address _mpc = mpc();
AnyswapV1ERC20(token).mint(_mpc, amount);
AnyswapV1ERC20(token).withdrawVault(_mpc, amount, _mpc);
}
function anySwapIn(bytes32[] calldata txs, address[] calldata tokens, address[] calldata to, uint256[] calldata amounts, uint[] calldata fromChainIDs) external onlyMPC {
for (uint i = 0; i < tokens.length; i++) {
_anySwapIn(txs[i], tokens[i], to[i], amounts[i], fromChainIDs[i]);
}
}
// **** 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,) = SushiswapV2Library.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 ? SushiswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
ISushiswapV2Pair(SushiswapV2Library.pairFor(factory, input, output)).swap(
amount0Out, amount1Out, to, new bytes(0)
);
}
}
// sets up a cross-chain trade from this chain to `toChainID` for `path` trades to `to`
function anySwapOutExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint toChainID
) external virtual swapTradeEnabled ensure(deadline) {
AnyswapV1ERC20(path[0]).burn(msg.sender, amountIn);
emit LogAnySwapTradeTokensForTokens(path, msg.sender, to, amountIn, amountOutMin, cID(), toChainID);
}
// sets up a cross-chain trade from this chain to `toChainID` for `path` trades to `to`
function anySwapOutExactTokensForTokensUnderlying(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint toChainID
) external virtual swapTradeEnabled ensure(deadline) {
IERC20(AnyswapV1ERC20(path[0]).underlying()).safeTransferFrom(msg.sender, path[0], amountIn);
AnyswapV1ERC20(path[0]).depositVault(amountIn, msg.sender);
AnyswapV1ERC20(path[0]).burn(msg.sender, amountIn);
emit LogAnySwapTradeTokensForTokens(path, msg.sender, to, amountIn, amountOutMin, cID(), toChainID);
}
// Swaps `amounts[path.length-1]` `path[path.length-1]` to `to` on this chain
// Triggered by `anySwapOutExactTokensForTokens`
function anySwapInExactTokensForTokens(
bytes32 txs,
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint fromChainID
) external onlyMPC virtual swapTradeEnabled ensure(deadline) returns (uint[] memory amounts) {
amounts = SushiswapV2Library.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'SushiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
_anySwapIn(txs, path[0], SushiswapV2Library.pairFor(factory, path[0], path[1]), amounts[0], fromChainID);
_swap(amounts, path, to);
}
// sets up a cross-chain trade from this chain to `toChainID` for `path` trades to `to`
function anySwapOutExactTokensForNative(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint toChainID
) external virtual swapTradeEnabled ensure(deadline) {
AnyswapV1ERC20(path[0]).burn(msg.sender, amountIn);
emit LogAnySwapTradeTokensForNative(path, msg.sender, to, amountIn, amountOutMin, cID(), toChainID);
}
// sets up a cross-chain trade from this chain to `toChainID` for `path` trades to `to`
function anySwapOutExactTokensForNativeUnderlying(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint toChainID
) external virtual swapTradeEnabled ensure(deadline) {
IERC20(AnyswapV1ERC20(path[0]).underlying()).safeTransferFrom(msg.sender, path[0], amountIn);
AnyswapV1ERC20(path[0]).depositVault(amountIn, msg.sender);
AnyswapV1ERC20(path[0]).burn(msg.sender, amountIn);
emit LogAnySwapTradeTokensForNative(path, msg.sender, to, amountIn, amountOutMin, cID(), toChainID);
}
// Swaps `amounts[path.length-1]` `path[path.length-1]` to `to` on this chain
// Triggered by `anySwapOutExactTokensForNative`
function anySwapInExactTokensForNative(
bytes32 txs,
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline,
uint fromChainID
) external onlyMPC virtual swapTradeEnabled ensure(deadline) returns (uint[] memory amounts) {
require(path[path.length - 1] == wNATIVE, 'AnyswapV3Router: INVALID_PATH');
amounts = SushiswapV2Library.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'AnyswapV3Router: INSUFFICIENT_OUTPUT_AMOUNT');
_anySwapIn(txs, path[0], SushiswapV2Library.pairFor(factory, path[0], path[1]), amounts[0], fromChainID);
_swap(amounts, path, address(this));
IwNATIVE(wNATIVE).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferNative(to, amounts[amounts.length - 1]);
}
// **** LIBRARY FUNCTIONS ****
function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual returns (uint amountB) {
return SushiswapV2Library.quote(amountA, reserveA, reserveB);
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
public
pure
virtual
returns (uint amountOut)
{
return SushiswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
public
pure
virtual
returns (uint amountIn)
{
return SushiswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
}
function getAmountsOut(uint amountIn, address[] memory path)
public
view
virtual
returns (uint[] memory amounts)
{
return SushiswapV2Library.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint amountOut, address[] memory path)
public
view
virtual
returns (uint[] memory amounts)
{
return SushiswapV2Library.getAmountsIn(factory, amountOut, path);
}
}
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wNATIVE","type":"address"},{"internalType":"address","name":"_mpc","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"to","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapTradeTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapTradeTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":true,"internalType":"uint256","name":"effectiveTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"LogChangeMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newRouter","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"LogChangeRouter","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"anySwapFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"txs","type":"bytes32[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"fromChainIDs","type":"uint256[]"}],"name":"anySwapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInAuto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"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"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInExactTokensForNative","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"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"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"toChainIDs","type":"uint256[]"}],"name":"anySwapOut","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForNative","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForNativeUnderlying","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForTokens","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForTokensUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"applyMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cID","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMPC","type":"address"}],"name":"changeMPC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"newVault","type":"address"}],"name":"changeVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"depositNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableSwapTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableSwapTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_auth","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wNATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wNATIVE","type":"address"},{"internalType":"address","name":"_mpc","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"to","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapTradeTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromChainID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"LogAnySwapTradeTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":true,"internalType":"uint256","name":"effectiveTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"LogChangeMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newRouter","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainID","type":"uint256"}],"name":"LogChangeRouter","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"anySwapFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"txs","type":"bytes32[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"fromChainIDs","type":"uint256[]"}],"name":"anySwapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInAuto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"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"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInExactTokensForNative","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"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"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txs","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"name":"anySwapInUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"toChainIDs","type":"uint256[]"}],"name":"anySwapOut","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForNative","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForNativeUnderlying","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForTokens","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"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutExactTokensForTokensUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"to","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainID","type":"uint256"}],"name":"anySwapOutUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"applyMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cID","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMPC","type":"address"}],"name":"changeMPC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"newVault","type":"address"}],"name":"changeVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"depositNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableSwapTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableSwapTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_auth","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wNATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawNative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
60c06040523480156200001157600080fd5b506040516200445738038062004457833981016040819052620000349162000081565b600180546001600160a01b0319166001600160a01b03928316179055426002559182166080521660a052620000cb565b80516001600160a01b03811681146200007c57600080fd5b919050565b6000806000606084860312156200009757600080fd5b620000a28462000064565b9250620000b26020850162000064565b9150620000c26040850162000064565b90509250925092565b60805160a0516142c562000192600039600081816102230152818161055901528181610845015281816109050152818161125a0152818161144301528181611519015281816115cb0152818161165f01528181611afd01528181611baf01528181611c4301528181611d8b01528181611ec3015281816121690152818161221b01526122af01526000818161060b01528181610c5901528181610e2001528181610f38015281816113060152818161243d01528181612fe4015261303401526142c56000f3fe6080604052600436106102135760003560e01c8063825bb13c11610118578063ad615dec116100a0578063d8b9f6101161006f578063d8b9f6101461066d578063d9e35bb21461068d578063dcfb77b1146106ad578063edbdf5e2146106cd578063f75c2664146106ed57600080fd5b8063ad615dec146105d9578063c45a0155146105f9578063c604b0b81461062d578063d06ca61f1461064d57600080fd5b806387cc6e2f116100e757806387cc6e2f146105275780638fd903f51461054757806399a2f2d7146105935780639f122d6c146105a6578063a5e56571146105c657600080fd5b8063825bb13c146104a7578063832e9492146104c757806385f8c259146104e757806387bafe5f1461050757600080fd5b8063353cb3a81161019b578063540dd52c1161016a578063540dd52c146104215780635b7b018c1461043457806365782f56146104545780636a45397214610474578063701bb8911461049457600080fd5b8063353cb3a8146103975780633f88de89146103c1578063456862aa146103e157806352a397d51461040157600080fd5b80630bb57203116101e25780630bb57203146102ea5780631f00ca741461030a578063241dc2df1461033757806325121b76146103575780632fc1e7281461037757600080fd5b80630175b1c414610257578063049b4e7e14610277578063054d50d414610297578063085c6d5e146102ca57600080fd5b3661025257336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610250576102506136d7565b005b600080fd5b34801561026357600080fd5b50610250610272366004613702565b610702565b34801561028357600080fd5b5061025061029236600461380b565b6109f4565b3480156102a357600080fd5b506102b76102b236600461386b565b610abc565b6040519081526020015b60405180910390f35b3480156102d657600080fd5b506102506102e53660046138a5565b610ad1565b3480156102f657600080fd5b5061025061030536600461390e565b610b1c565b34801561031657600080fd5b5061032a61032536600461398b565b610c52565b6040516102c19190613a49565b34801561034357600080fd5b50610250610352366004613a8d565b610c88565b34801561036357600080fd5b50610250610372366004613ad3565b610c9b565b34801561038357600080fd5b5061032a610392366004613bc4565b610d9e565b3480156103a357600080fd5b506000546103b19060ff1681565b60405190151581526020016102c1565b3480156103cd57600080fd5b506102506103dc366004613702565b611019565b3480156103ed57600080fd5b506103b16103fc366004613c49565b6110d7565b34801561040d57600080fd5b5061032a61041c366004613bc4565b6111d3565b61025061042f366004613c82565b611517565b34801561044057600080fd5b506103b161044f366004613cdb565b611729565b34801561046057600080fd5b5061025061046f36600461390e565b611860565b34801561048057600080fd5b5061025061048f36600461390e565b611975565b6102b76104a2366004613c49565b611af9565b3480156104b357600080fd5b506102506104c2366004613702565b611d3b565b3480156104d357600080fd5b506102b76104e2366004613cf8565b611d87565b3480156104f357600080fd5b506102b761050236600461386b565b611f39565b34801561051357600080fd5b50610250610522366004613c49565b611f46565b34801561053357600080fd5b50610250610542366004613d3a565b611fd6565b34801561055357600080fd5b5061057b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c1565b34801561059f57600080fd5b50466102b7565b3480156105b257600080fd5b506102506105c1366004613c49565b612101565b6102506105d4366004613d66565b612167565b3480156105e557600080fd5b506102b76105f436600461386b565b612383565b34801561060557600080fd5b5061057b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561063957600080fd5b5061025061064836600461380b565b612390565b34801561065957600080fd5b5061032a61066836600461398b565b612436565b34801561067957600080fd5b5061025061068836600461390e565b612463565b34801561069957600080fd5b506102506106a8366004613cdb565b61256c565b3480156106b957600080fd5b506102506106c8366004613da7565b6125f6565b3480156106d957600080fd5b506102506106e8366004613a8d565b6126a7565b3480156106f957600080fd5b5061057b612743565b61070a612743565b6001600160a01b0316336001600160a01b0316146107435760405162461bcd60e51b815260040161073a90613e6b565b60405180910390fd5b6107508585858585612773565b60008490506000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190613ea2565b90506001600160a01b0381161580159061083e57506040516370a0823160e01b81526001600160a01b0387811660048301528591908316906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613ebf565b10155b156109eb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561097857604051620e75bb60e21b81526001600160a01b038316906239d6ec906108ab90889088903090600401613ed8565b6020604051808303816000875af11580156108ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ee9190613ebf565b50604051632e1a7d4d60e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b50505050610973858561284c565b6109eb565b604051620e75bb60e21b81526001600160a01b038316906239d6ec906109a690889088908290600401613ed8565b6020604051808303816000875af11580156109c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e99190613ebf565b505b50505050505050565b610a6d338584876001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190613ea2565b6001600160a01b031692919061291d565b336001600160a01b0385167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b798585465b86604051610aae9493929190613f53565b60405180910390a350505050565b6000610ac9848484612977565b949350505050565b610ad9612743565b6001600160a01b0316336001600160a01b031614610b095760405162461bcd60e51b815260040161073a90613e6b565b6000805460ff1916911515919091179055565b60005460ff16610b3e5760405162461bcd60e51b815260040161073a90613f82565b8142811015610b5f5760405162461bcd60e51b815260040161073a90613fc5565b85856000818110610b7257610b72613ffc565b9050602002016020810190610b879190613cdb565b604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b039190911690639dc29fac906044016020604051808303816000875af1158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa9190614012565b506001600160a01b038416337ffea6abdf4fd32f20966dff7619354cd82cd43dc78a3bee479f04c74dbfc585b388888c8c465b89604051610c409695949392919061402f565b60405180910390a35050505050505050565b6060610c7f7f00000000000000000000000000000000000000000000000000000000000000008484612a45565b90505b92915050565b610c953385858585612bdb565b50505050565b610ca3612743565b6001600160a01b0316336001600160a01b031614610cd35760405162461bcd60e51b815260040161073a90613e6b565b60005b87811015610d9157610d7f8b8b83818110610cf357610cf3613ffc565b905060200201358a8a84818110610d0c57610d0c613ffc565b9050602002016020810190610d219190613cdb565b898985818110610d3357610d33613ffc565b9050602002016020810190610d489190613cdb565b888886818110610d5a57610d5a613ffc565b90506020020135878787818110610d7357610d73613ffc565b90506020020135612773565b80610d89816140af565b915050610cd6565b5050505050505050505050565b6060610da8612743565b6001600160a01b0316336001600160a01b031614610dd85760405162461bcd60e51b815260040161073a90613e6b565b60005460ff16610dfa5760405162461bcd60e51b815260040161073a90613f82565b8242811015610e1b5760405162461bcd60e51b815260040161073a90613fc5565b610e797f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cb292505050565b9150878260018451610e8b91906140ca565b81518110610e9b57610e9b613ffc565b60200260200101511015610f075760405162461bcd60e51b815260206004820152602d60248201527f5375736869737761705632526f757465723a20494e53554646494349454e545f60448201526c13d55514155517d05353d55395609a1b606482015260840161073a565b610fcd8a88886000818110610f1e57610f1e613ffc565b9050602002016020810190610f339190613cdb565b610fac7f00000000000000000000000000000000000000000000000000000000000000008b8b6000818110610f6a57610f6a613ffc565b9050602002016020810190610f7f9190613cdb565b8c8c6001818110610f9257610f92613ffc565b9050602002016020810190610fa79190613cdb565b612e28565b85600081518110610fbf57610fbf613ffc565b602002602001015187612773565b61100c828888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250612f01915050565b5098975050505050505050565b611021612743565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260040161073a90613e6b565b61105e8585858585612773565b604051620e75bb60e21b81526001600160a01b038516906239d6ec9061108c90869086908290600401613ed8565b6020604051808303816000875af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf9190613ebf565b505050505050565b60006110e1612743565b6001600160a01b0316336001600160a01b0316146111115760405162461bcd60e51b815260040161073a90613e6b565b6001600160a01b0382166111675760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20616464726573732830783029000000604482015260640161073a565b6040516360e232a960e01b81526001600160a01b0383811660048301528416906360e232a9906024016020604051808303816000875af11580156111af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614012565b60606111dd612743565b6001600160a01b0316336001600160a01b03161461120d5760405162461bcd60e51b815260040161073a90613e6b565b60005460ff1661122f5760405162461bcd60e51b815260040161073a90613f82565b82428110156112505760405162461bcd60e51b815260040161073a90613fc5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001687876112876001826140ca565b81811061129657611296613ffc565b90506020020160208101906112ab9190613cdb565b6001600160a01b0316146113015760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20494e56414c49445f50415448000000604482015260640161073a565b61135f7f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cb292505050565b915087826001845161137191906140ca565b8151811061138157611381613ffc565b602002602001015110156113eb5760405162461bcd60e51b815260206004820152602b60248201527f416e79737761705633526f757465723a20494e53554646494349454e545f4f5560448201526a1514155517d05353d5539560aa1b606482015260840161073a565b6114028a88886000818110610f1e57610f1e613ffc565b61144182888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612f01915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855161147f91906140ca565b8151811061148f5761148f613ffc565b60200260200101516040518263ffffffff1660e01b81526004016114b591815260200190565b600060405180830381600087803b1580156114cf57600080fd5b505af11580156114e3573d6000803e3d6000fd5b5050505061100c8583600185516114fa91906140ca565b8151811061150a5761150a613ffc565b602002602001015161284c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a39190613ea2565b6001600160a01b0316146115c95760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162457600080fd5b505af1158015611638573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190614012565b6116dc576116dc6136d7565b336001600160a01b0384167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b798434468660405161171c9493929190613f53565b60405180910390a3505050565b6000611733612743565b6001600160a01b0316336001600160a01b0316146117635760405162461bcd60e51b815260040161073a90613e6b565b6001600160a01b0382166117b95760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20616464726573732830783029000000604482015260640161073a565b6117c1612743565b60008054610100600160a81b0319166101006001600160a01b0393841602179055600180546001600160a01b031916918416919091179055611806426202a30061412b565b60028190556001546000546001600160a01b0391821691610100909104167fcda32bc39904597666dfa9f9c845714756e1ffffad55b52e0d344673a21981214660405190815260200160405180910390a45060015b919050565b60005460ff166118825760405162461bcd60e51b815260040161073a90613f82565b81428110156118a35760405162461bcd60e51b815260040161073a90613fc5565b858560008181106118b6576118b6613ffc565b90506020020160208101906118cb9190613cdb565b604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b039190911690639dc29fac906044016020604051808303816000875af115801561191a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193e9190614012565b506001600160a01b038416337f278277e0209c347189add7bd92411973b5f6b8644f7ac62ea1be984ce993f8f488888c8c46610c2d565b60005460ff166119975760405162461bcd60e51b815260040161073a90613f82565b81428110156119b85760405162461bcd60e51b815260040161073a90613fc5565b611a4a33878760008181106119cf576119cf613ffc565b90506020020160208101906119e49190613cdb565b8a898960008181106119f8576119f8613ffc565b9050602002016020810190611a0d9190613cdb565b6001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b85856000818110611a5d57611a5d613ffc565b9050602002016020810190611a729190613cdb565b604051630bebbf4d60e41b8152600481018a90523360248201526001600160a01b03919091169063bebbf4d0906044016020604051808303816000875af1158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190613ebf565b50858560008181106118b6576118b6613ffc565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190613ea2565b6001600160a01b031614611bad5760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c0857600080fd5b505af1158015611c1c573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190614012565b611cc057611cc06136d7565b604051630bebbf4d60e41b81523460048201526001600160a01b03838116602483015284169063bebbf4d0906044016020604051808303816000875af1158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d329190613ebf565b50349392505050565b611d43612743565b6001600160a01b0316336001600160a01b031614611d735760405162461bcd60e51b815260040161073a90613e6b565b611d808585858585612773565b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190613ea2565b6001600160a01b031614611e3b5760405162461bcd60e51b815260040161073a906140e1565b604051620e75bb60e21b81526001600160a01b038516906239d6ec90611e6990339087903090600401613ed8565b6020604051808303816000875af1158015611e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eac9190613ebf565b50604051632e1a7d4d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b50505050611f31828461284c565b509092915050565b6000610ac9848484613103565b611f4e612743565b6001600160a01b0316336001600160a01b031614611f7e5760405162461bcd60e51b815260040161073a90613e6b565b60405163cfbd488560e01b81526001600160a01b03828116600483015283169063cfbd4885906024015b600060405180830381600087803b158015611fc257600080fd5b505af11580156110cf573d6000803e3d6000fd5b611fde612743565b6001600160a01b0316336001600160a01b03161461200e5760405162461bcd60e51b815260040161073a90613e6b565b6000612018612743565b6040516340c10f1960e01b81526001600160a01b03808316600483015260248201859052919250908416906340c10f19906044016020604051808303816000875af115801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f9190614012565b50604051620e75bb60e21b81526001600160a01b038416906239d6ec906120be90849086908290600401613ed8565b6020604051808303816000875af11580156120dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190613ebf565b612109612743565b6001600160a01b0316336001600160a01b0316146121395760405162461bcd60e51b815260040161073a90613e6b565b604051637e51dad560e11b81526001600160a01b03828116600483015283169063fca3b5aa90602401611fa8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f39190613ea2565b6001600160a01b0316146122195760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156122fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123209190614012565b61232c5761232c6136d7565b6001600160a01b0380831690339085167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a3446604080519283526020830191909152810186905260600160405180910390a4505050565b6000610ac98484846131cc565b604051632770a7eb60e21b8152336004820152602481018390526001600160a01b03851690639dc29fac906044016020604051808303816000875af11580156123dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124019190614012565b50336001600160a01b0385167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b79858546610a9d565b6060610c7f7f00000000000000000000000000000000000000000000000000000000000000008484612cb2565b60005460ff166124855760405162461bcd60e51b815260040161073a90613f82565b81428110156124a65760405162461bcd60e51b815260040161073a90613fc5565b6124bd33878760008181106119cf576119cf613ffc565b858560008181106124d0576124d0613ffc565b90506020020160208101906124e59190613cdb565b604051630bebbf4d60e41b8152600481018a90523360248201526001600160a01b03919091169063bebbf4d0906044016020604051808303816000875af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190613ebf565b5085856000818110610b7257610b72613ffc565b612574612743565b6001600160a01b0316336001600160a01b0316146125a45760405162461bcd60e51b815260040161073a90613e6b565b806001600160a01b0316630d707df86040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125df57600080fd5b505af1158015611d80573d6000803e3d6000fd5b50565b60005b8781101561269c5761268a338a8a8481811061261757612617613ffc565b905060200201602081019061262c9190613cdb565b89898581811061263e5761263e613ffc565b90506020020160208101906126539190613cdb565b88888681811061266557612665613ffc565b9050602002013587878781811061267e5761267e613ffc565b90506020020135612bdb565b80612694816140af565b9150506125f9565b505050505050505050565b6126eb338584876001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b6001600160a01b0380841690339086167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a8546604080519283526020830191909152810186905260600160405180910390a450505050565b6000600254421061275e57506001546001600160a01b031690565b5060005461010090046001600160a01b031690565b6040516340c10f1960e01b81526001600160a01b038481166004830152602482018490528516906340c10f19906044016020604051808303816000875af11580156127c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e69190614012565b50826001600160a01b0316846001600160a01b0316867faac9ce45fe3adf5143598c4f18a369591a20a3384aedaf1b525d29127e1fcd5585856128264690565b604080519384526020840192909252908201526060015b60405180910390a45050505050565b604080516000808252602082019092526001600160a01b0384169083906040516128769190614143565b60006040518083038185875af1925050503d80600081146128b3576040519150601f19603f3d011682016040523d82523d6000602084013e6128b8565b606091505b50509050806129185760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657248656c7065723a204e41544956455f5452414e534645525f60448201526511905253115160d21b606482015260840161073a565b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c9590859061325c565b60008084116129cc5760405162461bcd60e51b815260206004820152602d602482015260008051602061427083398151915260448201526c17d25394155517d05353d55395609a1b606482015260840161073a565b6000831180156129dc5750600082115b6129f85760405162461bcd60e51b815260040161073a9061415f565b6000612a06856103e56133e3565b90506000612a1482856133e3565b90506000612a2e83612a28886103e86133e3565b90613447565b9050612a3a81836141ad565b979650505050505050565b6060600282511015612a995760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161073a565b815167ffffffffffffffff811115612ab357612ab3613754565b604051908082528060200260200182016040528015612adc578160200160208202803683370190505b509050828160018351612aef91906140ca565b81518110612aff57612aff613ffc565b602002602001018181525050600060018351612b1b91906140ca565b90505b8015612bd357600080612b6e8786612b376001876140ca565b81518110612b4757612b47613ffc565b6020026020010151878681518110612b6157612b61613ffc565b6020026020010151613491565b91509150612b96848481518110612b8757612b87613ffc565b60200260200101518383613103565b84612ba26001866140ca565b81518110612bb257612bb2613ffc565b60200260200101818152505050508080612bcb906141cf565b915050612b1e565b509392505050565b604051632770a7eb60e21b81526001600160a01b03868116600483015260248201849052851690639dc29fac906044016020604051808303816000875af1158015612c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4e9190614012565b50826001600160a01b0316856001600160a01b0316856001600160a01b03167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a85612c964690565b604080519283526020830191909152810186905260600161283d565b6060600282511015612d065760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161073a565b815167ffffffffffffffff811115612d2057612d20613754565b604051908082528060200260200182016040528015612d49578160200160208202803683370190505b5090508281600081518110612d6057612d60613ffc565b60200260200101818152505060005b60018351612d7d91906140ca565b811015612bd357600080612dc387868581518110612d9d57612d9d613ffc565b602002602001015187866001612db3919061412b565b81518110612b6157612b61613ffc565b91509150612deb848481518110612ddc57612ddc613ffc565b60200260200101518383612977565b84612df785600161412b565b81518110612e0757612e07613ffc565b60200260200101818152505050508080612e20906140af565b915050612d6f565b6000806000612e37858561355b565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612edf9291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b60005b60018351612f1291906140ca565b811015610c9557600080848381518110612f2e57612f2e613ffc565b602002602001015185846001612f44919061412b565b81518110612f5457612f54613ffc565b6020026020010151915091506000612f6c838361355b565b509050600087612f7d86600161412b565b81518110612f8d57612f8d613ffc565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612fbb57826000612fbf565b6000835b91509150600060028a51612fd391906140ca565b8810612fdf578861302d565b61302d7f0000000000000000000000000000000000000000000000000000000000000000878c6130108c600261412b565b8151811061302057613020613ffc565b6020026020010151612e28565b905061305a7f00000000000000000000000000000000000000000000000000000000000000008888612e28565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613097576020820181803683370190505b506040518563ffffffff1660e01b81526004016130b794939291906141e6565b600060405180830381600087803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b505050505050505050505080806130fb906140af565b915050612f04565b60008084116131595760405162461bcd60e51b815260206004820152602e602482015260008051602061427083398151915260448201526d17d3d55514155517d05353d5539560921b606482015260840161073a565b6000831180156131695750600082115b6131855760405162461bcd60e51b815260040161073a9061415f565b600061319d6103e861319786886133e3565b906133e3565b905060006131b16103e56131978689613655565b90506131c26001612a2883856141ad565b9695505050505050565b600080841161321b5760405162461bcd60e51b8152602060048201526027602482015260008051602061427083398151915260448201526617d05353d5539560ca1b606482015260840161073a565b60008311801561322b5750600082115b6132475760405162461bcd60e51b815260040161073a9061415f565b8261325285846133e3565b610ac991906141ad565b61326e826001600160a01b03166136a0565b6132ba5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161073a565b600080836001600160a01b0316836040516132d59190614143565b6000604051808303816000865af19150503d8060008114613312576040519150601f19603f3d011682016040523d82523d6000602084013e613317565b606091505b5091509150816133695760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161073a565b805115610c9557808060200190518101906133849190614012565b610c955760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161073a565b60008115806134045750508082028282828161340157613401614197565b04145b610c825760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161073a565b80820182811015610c825760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161073a565b60008060006134a0858561355b565b5090506000806134b1888888612e28565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156134ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613512919061422a565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461354957808261354c565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b031614156135d05760405162461bcd60e51b815260206004820152602760248201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446044820152664452455353455360c81b606482015260840161073a565b826001600160a01b0316846001600160a01b0316106135f05782846135f3565b83835b90925090506001600160a01b03821661364e5760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604482015260640161073a565b9250929050565b80820382811115610c825760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161073a565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590610ac95750141592915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03811681146125f357600080fd5b600080600080600060a0868803121561371a57600080fd5b85359450602086013561372c816136ed565b9350604086013561373c816136ed565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561379357613793613754565b604052919050565b600082601f8301126137ac57600080fd5b813567ffffffffffffffff8111156137c6576137c6613754565b6137d9601f8201601f191660200161376a565b8181528460208386010111156137ee57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561382157600080fd5b843561382c816136ed565b9350602085013567ffffffffffffffff81111561384857600080fd5b6138548782880161379b565b949794965050505060408301359260600135919050565b60008060006060848603121561388057600080fd5b505081359360208301359350604090920135919050565b80151581146125f357600080fd5b6000602082840312156138b757600080fd5b81356138c281613897565b9392505050565b60008083601f8401126138db57600080fd5b50813567ffffffffffffffff8111156138f357600080fd5b6020830191508360208260051b850101111561364e57600080fd5b600080600080600080600060c0888a03121561392957600080fd5b8735965060208801359550604088013567ffffffffffffffff81111561394e57600080fd5b61395a8a828b016138c9565b909650945050606088013561396e816136ed565b969995985093969295946080840135945060a09093013592915050565b6000806040838503121561399e57600080fd5b8235915060208084013567ffffffffffffffff808211156139be57600080fd5b818601915086601f8301126139d257600080fd5b8135818111156139e4576139e4613754565b8060051b91506139f584830161376a565b8181529183018401918481019089841115613a0f57600080fd5b938501935b83851015613a395784359250613a29836136ed565b8282529385019390850190613a14565b8096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613a8157835183529284019291840191600101613a65565b50909695505050505050565b60008060008060808587031215613aa357600080fd5b8435613aae816136ed565b93506020850135613abe816136ed565b93969395505050506040820135916060013590565b60008060008060008060008060008060a08b8d031215613af257600080fd5b8a3567ffffffffffffffff80821115613b0a57600080fd5b613b168e838f016138c9565b909c509a5060208d0135915080821115613b2f57600080fd5b613b3b8e838f016138c9565b909a50985060408d0135915080821115613b5457600080fd5b613b608e838f016138c9565b909850965060608d0135915080821115613b7957600080fd5b613b858e838f016138c9565b909650945060808d0135915080821115613b9e57600080fd5b50613bab8d828e016138c9565b915080935050809150509295989b9194979a5092959850565b60008060008060008060008060e0898b031215613be057600080fd5b883597506020890135965060408901359550606089013567ffffffffffffffff811115613c0c57600080fd5b613c188b828c016138c9565b9096509450506080890135613c2c816136ed565b979a969950949793969295929450505060a08201359160c0013590565b60008060408385031215613c5c57600080fd5b8235613c67816136ed565b91506020830135613c77816136ed565b809150509250929050565b600080600060608486031215613c9757600080fd5b8335613ca2816136ed565b9250602084013567ffffffffffffffff811115613cbe57600080fd5b613cca8682870161379b565b925050604084013590509250925092565b600060208284031215613ced57600080fd5b81356138c2816136ed565b600080600060608486031215613d0d57600080fd5b8335613d18816136ed565b9250602084013591506040840135613d2f816136ed565b809150509250925092565b60008060408385031215613d4d57600080fd5b8235613d58816136ed565b946020939093013593505050565b600080600060608486031215613d7b57600080fd5b8335613d86816136ed565b92506020840135613d96816136ed565b929592945050506040919091013590565b6000806000806000806000806080898b031215613dc357600080fd5b883567ffffffffffffffff80821115613ddb57600080fd5b613de78c838d016138c9565b909a50985060208b0135915080821115613e0057600080fd5b613e0c8c838d016138c9565b909850965060408b0135915080821115613e2557600080fd5b613e318c838d016138c9565b909650945060608b0135915080821115613e4a57600080fd5b50613e578b828c016138c9565b999c989b5096995094979396929594505050565b6020808252601a908201527f416e79737761705633526f757465723a20464f5242494444454e000000000000604082015260600190565b600060208284031215613eb457600080fd5b81516138c2816136ed565b600060208284031215613ed157600080fd5b5051919050565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60005b83811015613f16578181015183820152602001613efe565b83811115610c955750506000910152565b60008151808452613f3f816020860160208601613efb565b601f01601f19169290920160200192915050565b608081526000613f666080830187613f27565b6020830195909552506040810192909252606090910152919050565b60208082526023908201527f416e79737761705636526f757465723a205377617054726164652064697361626040820152621b195960ea1b606082015260800190565b60208082526018908201527f416e79737761705633526f757465723a20455850495245440000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561402457600080fd5b81516138c281613897565b60a0808252810186905260008760c08301825b89811015614072578235614055816136ed565b6001600160a01b0316825260209283019290910190600101614042565b50602084019790975250506040810193909352606083019190915260809091015292915050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156140c3576140c3614099565b5060010190565b6000828210156140dc576140dc614099565b500390565b6020808252602a908201527f416e79737761705633526f757465723a20756e6465726c79696e67206973206e6040820152696f7420774e415449564560b01b606082015260800190565b6000821982111561413e5761413e614099565b500190565b60008251614155818460208701613efb565b9190910192915050565b6020808252602a908201526000805160206142708339815191526040820152695f4c495155494449545960b01b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826141ca57634e487b7160e01b600052601260045260246000fd5b500490565b6000816141de576141de614099565b506000190190565b84815283602082015260018060a01b03831660408201526080606082015260006131c26080830184613f27565b80516001600160701b038116811461185b57600080fd5b60008060006060848603121561423f57600080fd5b61424884614213565b925061425660208501614213565b9150604084015163ffffffff81168114613d2f57600080fdfe53757368697377617056324c6962726172793a20494e53554646494349454e54a2646970667358221220c17babedbab069763375fabccc1245cac6dcebfc453595e3a48e4d855008db3364736f6c634300080a0033000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002a038e100f8b85df21e4d44121bdbfe0c288a869
60c06040523480156200001157600080fd5b506040516200445738038062004457833981016040819052620000349162000081565b600180546001600160a01b0319166001600160a01b03928316179055426002559182166080521660a052620000cb565b80516001600160a01b03811681146200007c57600080fd5b919050565b6000806000606084860312156200009757600080fd5b620000a28462000064565b9250620000b26020850162000064565b9150620000c26040850162000064565b90509250925092565b60805160a0516142c562000192600039600081816102230152818161055901528181610845015281816109050152818161125a0152818161144301528181611519015281816115cb0152818161165f01528181611afd01528181611baf01528181611c4301528181611d8b01528181611ec3015281816121690152818161221b01526122af01526000818161060b01528181610c5901528181610e2001528181610f38015281816113060152818161243d01528181612fe4015261303401526142c56000f3fe6080604052600436106102135760003560e01c8063825bb13c11610118578063ad615dec116100a0578063d8b9f6101161006f578063d8b9f6101461066d578063d9e35bb21461068d578063dcfb77b1146106ad578063edbdf5e2146106cd578063f75c2664146106ed57600080fd5b8063ad615dec146105d9578063c45a0155146105f9578063c604b0b81461062d578063d06ca61f1461064d57600080fd5b806387cc6e2f116100e757806387cc6e2f146105275780638fd903f51461054757806399a2f2d7146105935780639f122d6c146105a6578063a5e56571146105c657600080fd5b8063825bb13c146104a7578063832e9492146104c757806385f8c259146104e757806387bafe5f1461050757600080fd5b8063353cb3a81161019b578063540dd52c1161016a578063540dd52c146104215780635b7b018c1461043457806365782f56146104545780636a45397214610474578063701bb8911461049457600080fd5b8063353cb3a8146103975780633f88de89146103c1578063456862aa146103e157806352a397d51461040157600080fd5b80630bb57203116101e25780630bb57203146102ea5780631f00ca741461030a578063241dc2df1461033757806325121b76146103575780632fc1e7281461037757600080fd5b80630175b1c414610257578063049b4e7e14610277578063054d50d414610297578063085c6d5e146102ca57600080fd5b3661025257336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610250576102506136d7565b005b600080fd5b34801561026357600080fd5b50610250610272366004613702565b610702565b34801561028357600080fd5b5061025061029236600461380b565b6109f4565b3480156102a357600080fd5b506102b76102b236600461386b565b610abc565b6040519081526020015b60405180910390f35b3480156102d657600080fd5b506102506102e53660046138a5565b610ad1565b3480156102f657600080fd5b5061025061030536600461390e565b610b1c565b34801561031657600080fd5b5061032a61032536600461398b565b610c52565b6040516102c19190613a49565b34801561034357600080fd5b50610250610352366004613a8d565b610c88565b34801561036357600080fd5b50610250610372366004613ad3565b610c9b565b34801561038357600080fd5b5061032a610392366004613bc4565b610d9e565b3480156103a357600080fd5b506000546103b19060ff1681565b60405190151581526020016102c1565b3480156103cd57600080fd5b506102506103dc366004613702565b611019565b3480156103ed57600080fd5b506103b16103fc366004613c49565b6110d7565b34801561040d57600080fd5b5061032a61041c366004613bc4565b6111d3565b61025061042f366004613c82565b611517565b34801561044057600080fd5b506103b161044f366004613cdb565b611729565b34801561046057600080fd5b5061025061046f36600461390e565b611860565b34801561048057600080fd5b5061025061048f36600461390e565b611975565b6102b76104a2366004613c49565b611af9565b3480156104b357600080fd5b506102506104c2366004613702565b611d3b565b3480156104d357600080fd5b506102b76104e2366004613cf8565b611d87565b3480156104f357600080fd5b506102b761050236600461386b565b611f39565b34801561051357600080fd5b50610250610522366004613c49565b611f46565b34801561053357600080fd5b50610250610542366004613d3a565b611fd6565b34801561055357600080fd5b5061057b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c1565b34801561059f57600080fd5b50466102b7565b3480156105b257600080fd5b506102506105c1366004613c49565b612101565b6102506105d4366004613d66565b612167565b3480156105e557600080fd5b506102b76105f436600461386b565b612383565b34801561060557600080fd5b5061057b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561063957600080fd5b5061025061064836600461380b565b612390565b34801561065957600080fd5b5061032a61066836600461398b565b612436565b34801561067957600080fd5b5061025061068836600461390e565b612463565b34801561069957600080fd5b506102506106a8366004613cdb565b61256c565b3480156106b957600080fd5b506102506106c8366004613da7565b6125f6565b3480156106d957600080fd5b506102506106e8366004613a8d565b6126a7565b3480156106f957600080fd5b5061057b612743565b61070a612743565b6001600160a01b0316336001600160a01b0316146107435760405162461bcd60e51b815260040161073a90613e6b565b60405180910390fd5b6107508585858585612773565b60008490506000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190613ea2565b90506001600160a01b0381161580159061083e57506040516370a0823160e01b81526001600160a01b0387811660048301528591908316906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613ebf565b10155b156109eb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561097857604051620e75bb60e21b81526001600160a01b038316906239d6ec906108ab90889088903090600401613ed8565b6020604051808303816000875af11580156108ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ee9190613ebf565b50604051632e1a7d4d60e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b50505050610973858561284c565b6109eb565b604051620e75bb60e21b81526001600160a01b038316906239d6ec906109a690889088908290600401613ed8565b6020604051808303816000875af11580156109c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e99190613ebf565b505b50505050505050565b610a6d338584876001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190613ea2565b6001600160a01b031692919061291d565b336001600160a01b0385167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b798585465b86604051610aae9493929190613f53565b60405180910390a350505050565b6000610ac9848484612977565b949350505050565b610ad9612743565b6001600160a01b0316336001600160a01b031614610b095760405162461bcd60e51b815260040161073a90613e6b565b6000805460ff1916911515919091179055565b60005460ff16610b3e5760405162461bcd60e51b815260040161073a90613f82565b8142811015610b5f5760405162461bcd60e51b815260040161073a90613fc5565b85856000818110610b7257610b72613ffc565b9050602002016020810190610b879190613cdb565b604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b039190911690639dc29fac906044016020604051808303816000875af1158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa9190614012565b506001600160a01b038416337ffea6abdf4fd32f20966dff7619354cd82cd43dc78a3bee479f04c74dbfc585b388888c8c465b89604051610c409695949392919061402f565b60405180910390a35050505050505050565b6060610c7f7f00000000000000000000000000000000000000000000000000000000000000008484612a45565b90505b92915050565b610c953385858585612bdb565b50505050565b610ca3612743565b6001600160a01b0316336001600160a01b031614610cd35760405162461bcd60e51b815260040161073a90613e6b565b60005b87811015610d9157610d7f8b8b83818110610cf357610cf3613ffc565b905060200201358a8a84818110610d0c57610d0c613ffc565b9050602002016020810190610d219190613cdb565b898985818110610d3357610d33613ffc565b9050602002016020810190610d489190613cdb565b888886818110610d5a57610d5a613ffc565b90506020020135878787818110610d7357610d73613ffc565b90506020020135612773565b80610d89816140af565b915050610cd6565b5050505050505050505050565b6060610da8612743565b6001600160a01b0316336001600160a01b031614610dd85760405162461bcd60e51b815260040161073a90613e6b565b60005460ff16610dfa5760405162461bcd60e51b815260040161073a90613f82565b8242811015610e1b5760405162461bcd60e51b815260040161073a90613fc5565b610e797f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cb292505050565b9150878260018451610e8b91906140ca565b81518110610e9b57610e9b613ffc565b60200260200101511015610f075760405162461bcd60e51b815260206004820152602d60248201527f5375736869737761705632526f757465723a20494e53554646494349454e545f60448201526c13d55514155517d05353d55395609a1b606482015260840161073a565b610fcd8a88886000818110610f1e57610f1e613ffc565b9050602002016020810190610f339190613cdb565b610fac7f00000000000000000000000000000000000000000000000000000000000000008b8b6000818110610f6a57610f6a613ffc565b9050602002016020810190610f7f9190613cdb565b8c8c6001818110610f9257610f92613ffc565b9050602002016020810190610fa79190613cdb565b612e28565b85600081518110610fbf57610fbf613ffc565b602002602001015187612773565b61100c828888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250612f01915050565b5098975050505050505050565b611021612743565b6001600160a01b0316336001600160a01b0316146110515760405162461bcd60e51b815260040161073a90613e6b565b61105e8585858585612773565b604051620e75bb60e21b81526001600160a01b038516906239d6ec9061108c90869086908290600401613ed8565b6020604051808303816000875af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf9190613ebf565b505050505050565b60006110e1612743565b6001600160a01b0316336001600160a01b0316146111115760405162461bcd60e51b815260040161073a90613e6b565b6001600160a01b0382166111675760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20616464726573732830783029000000604482015260640161073a565b6040516360e232a960e01b81526001600160a01b0383811660048301528416906360e232a9906024016020604051808303816000875af11580156111af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f9190614012565b60606111dd612743565b6001600160a01b0316336001600160a01b03161461120d5760405162461bcd60e51b815260040161073a90613e6b565b60005460ff1661122f5760405162461bcd60e51b815260040161073a90613f82565b82428110156112505760405162461bcd60e51b815260040161073a90613fc5565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001687876112876001826140ca565b81811061129657611296613ffc565b90506020020160208101906112ab9190613cdb565b6001600160a01b0316146113015760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20494e56414c49445f50415448000000604482015260640161073a565b61135f7f00000000000000000000000000000000000000000000000000000000000000008a898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cb292505050565b915087826001845161137191906140ca565b8151811061138157611381613ffc565b602002602001015110156113eb5760405162461bcd60e51b815260206004820152602b60248201527f416e79737761705633526f757465723a20494e53554646494349454e545f4f5560448201526a1514155517d05353d5539560aa1b606482015260840161073a565b6114028a88886000818110610f1e57610f1e613ffc565b61144182888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612f01915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855161147f91906140ca565b8151811061148f5761148f613ffc565b60200260200101516040518263ffffffff1660e01b81526004016114b591815260200190565b600060405180830381600087803b1580156114cf57600080fd5b505af11580156114e3573d6000803e3d6000fd5b5050505061100c8583600185516114fa91906140ca565b8151811061150a5761150a613ffc565b602002602001015161284c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a39190613ea2565b6001600160a01b0316146115c95760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162457600080fd5b505af1158015611638573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190614012565b6116dc576116dc6136d7565b336001600160a01b0384167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b798434468660405161171c9493929190613f53565b60405180910390a3505050565b6000611733612743565b6001600160a01b0316336001600160a01b0316146117635760405162461bcd60e51b815260040161073a90613e6b565b6001600160a01b0382166117b95760405162461bcd60e51b815260206004820152601d60248201527f416e79737761705633526f757465723a20616464726573732830783029000000604482015260640161073a565b6117c1612743565b60008054610100600160a81b0319166101006001600160a01b0393841602179055600180546001600160a01b031916918416919091179055611806426202a30061412b565b60028190556001546000546001600160a01b0391821691610100909104167fcda32bc39904597666dfa9f9c845714756e1ffffad55b52e0d344673a21981214660405190815260200160405180910390a45060015b919050565b60005460ff166118825760405162461bcd60e51b815260040161073a90613f82565b81428110156118a35760405162461bcd60e51b815260040161073a90613fc5565b858560008181106118b6576118b6613ffc565b90506020020160208101906118cb9190613cdb565b604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b039190911690639dc29fac906044016020604051808303816000875af115801561191a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193e9190614012565b506001600160a01b038416337f278277e0209c347189add7bd92411973b5f6b8644f7ac62ea1be984ce993f8f488888c8c46610c2d565b60005460ff166119975760405162461bcd60e51b815260040161073a90613f82565b81428110156119b85760405162461bcd60e51b815260040161073a90613fc5565b611a4a33878760008181106119cf576119cf613ffc565b90506020020160208101906119e49190613cdb565b8a898960008181106119f8576119f8613ffc565b9050602002016020810190611a0d9190613cdb565b6001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b85856000818110611a5d57611a5d613ffc565b9050602002016020810190611a729190613cdb565b604051630bebbf4d60e41b8152600481018a90523360248201526001600160a01b03919091169063bebbf4d0906044016020604051808303816000875af1158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190613ebf565b50858560008181106118b6576118b6613ffc565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b879190613ea2565b6001600160a01b031614611bad5760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c0857600080fd5b505af1158015611c1c573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190614012565b611cc057611cc06136d7565b604051630bebbf4d60e41b81523460048201526001600160a01b03838116602483015284169063bebbf4d0906044016020604051808303816000875af1158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d329190613ebf565b50349392505050565b611d43612743565b6001600160a01b0316336001600160a01b031614611d735760405162461bcd60e51b815260040161073a90613e6b565b611d808585858585612773565b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190613ea2565b6001600160a01b031614611e3b5760405162461bcd60e51b815260040161073a906140e1565b604051620e75bb60e21b81526001600160a01b038516906239d6ec90611e6990339087903090600401613ed8565b6020604051808303816000875af1158015611e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eac9190613ebf565b50604051632e1a7d4d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b50505050611f31828461284c565b509092915050565b6000610ac9848484613103565b611f4e612743565b6001600160a01b0316336001600160a01b031614611f7e5760405162461bcd60e51b815260040161073a90613e6b565b60405163cfbd488560e01b81526001600160a01b03828116600483015283169063cfbd4885906024015b600060405180830381600087803b158015611fc257600080fd5b505af11580156110cf573d6000803e3d6000fd5b611fde612743565b6001600160a01b0316336001600160a01b03161461200e5760405162461bcd60e51b815260040161073a90613e6b565b6000612018612743565b6040516340c10f1960e01b81526001600160a01b03808316600483015260248201859052919250908416906340c10f19906044016020604051808303816000875af115801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f9190614012565b50604051620e75bb60e21b81526001600160a01b038416906239d6ec906120be90849086908290600401613ed8565b6020604051808303816000875af11580156120dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190613ebf565b612109612743565b6001600160a01b0316336001600160a01b0316146121395760405162461bcd60e51b815260040161073a90613e6b565b604051637e51dad560e11b81526001600160a01b03828116600483015283169063fca3b5aa90602401611fa8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f39190613ea2565b6001600160a01b0316146122195760405162461bcd60e51b815260040161073a906140e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b0387811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156122fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123209190614012565b61232c5761232c6136d7565b6001600160a01b0380831690339085167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a3446604080519283526020830191909152810186905260600160405180910390a4505050565b6000610ac98484846131cc565b604051632770a7eb60e21b8152336004820152602481018390526001600160a01b03851690639dc29fac906044016020604051808303816000875af11580156123dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124019190614012565b50336001600160a01b0385167f409e0ad946b19f77602d6cf11d59e1796ddaa4828159a0b4fb7fa2ff6b161b79858546610a9d565b6060610c7f7f00000000000000000000000000000000000000000000000000000000000000008484612cb2565b60005460ff166124855760405162461bcd60e51b815260040161073a90613f82565b81428110156124a65760405162461bcd60e51b815260040161073a90613fc5565b6124bd33878760008181106119cf576119cf613ffc565b858560008181106124d0576124d0613ffc565b90506020020160208101906124e59190613cdb565b604051630bebbf4d60e41b8152600481018a90523360248201526001600160a01b03919091169063bebbf4d0906044016020604051808303816000875af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190613ebf565b5085856000818110610b7257610b72613ffc565b612574612743565b6001600160a01b0316336001600160a01b0316146125a45760405162461bcd60e51b815260040161073a90613e6b565b806001600160a01b0316630d707df86040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125df57600080fd5b505af1158015611d80573d6000803e3d6000fd5b50565b60005b8781101561269c5761268a338a8a8481811061261757612617613ffc565b905060200201602081019061262c9190613cdb565b89898581811061263e5761263e613ffc565b90506020020160208101906126539190613cdb565b88888681811061266557612665613ffc565b9050602002013587878781811061267e5761267e613ffc565b90506020020135612bdb565b80612694816140af565b9150506125f9565b505050505050505050565b6126eb338584876001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a38573d6000803e3d6000fd5b6001600160a01b0380841690339086167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a8546604080519283526020830191909152810186905260600160405180910390a450505050565b6000600254421061275e57506001546001600160a01b031690565b5060005461010090046001600160a01b031690565b6040516340c10f1960e01b81526001600160a01b038481166004830152602482018490528516906340c10f19906044016020604051808303816000875af11580156127c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e69190614012565b50826001600160a01b0316846001600160a01b0316867faac9ce45fe3adf5143598c4f18a369591a20a3384aedaf1b525d29127e1fcd5585856128264690565b604080519384526020840192909252908201526060015b60405180910390a45050505050565b604080516000808252602082019092526001600160a01b0384169083906040516128769190614143565b60006040518083038185875af1925050503d80600081146128b3576040519150601f19603f3d011682016040523d82523d6000602084013e6128b8565b606091505b50509050806129185760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657248656c7065723a204e41544956455f5452414e534645525f60448201526511905253115160d21b606482015260840161073a565b505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c9590859061325c565b60008084116129cc5760405162461bcd60e51b815260206004820152602d602482015260008051602061427083398151915260448201526c17d25394155517d05353d55395609a1b606482015260840161073a565b6000831180156129dc5750600082115b6129f85760405162461bcd60e51b815260040161073a9061415f565b6000612a06856103e56133e3565b90506000612a1482856133e3565b90506000612a2e83612a28886103e86133e3565b90613447565b9050612a3a81836141ad565b979650505050505050565b6060600282511015612a995760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161073a565b815167ffffffffffffffff811115612ab357612ab3613754565b604051908082528060200260200182016040528015612adc578160200160208202803683370190505b509050828160018351612aef91906140ca565b81518110612aff57612aff613ffc565b602002602001018181525050600060018351612b1b91906140ca565b90505b8015612bd357600080612b6e8786612b376001876140ca565b81518110612b4757612b47613ffc565b6020026020010151878681518110612b6157612b61613ffc565b6020026020010151613491565b91509150612b96848481518110612b8757612b87613ffc565b60200260200101518383613103565b84612ba26001866140ca565b81518110612bb257612bb2613ffc565b60200260200101818152505050508080612bcb906141cf565b915050612b1e565b509392505050565b604051632770a7eb60e21b81526001600160a01b03868116600483015260248201849052851690639dc29fac906044016020604051808303816000875af1158015612c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4e9190614012565b50826001600160a01b0316856001600160a01b0316856001600160a01b03167f97116cf6cd4f6412bb47914d6db18da9e16ab2142f543b86e207c24fbd16b23a85612c964690565b604080519283526020830191909152810186905260600161283d565b6060600282511015612d065760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161073a565b815167ffffffffffffffff811115612d2057612d20613754565b604051908082528060200260200182016040528015612d49578160200160208202803683370190505b5090508281600081518110612d6057612d60613ffc565b60200260200101818152505060005b60018351612d7d91906140ca565b811015612bd357600080612dc387868581518110612d9d57612d9d613ffc565b602002602001015187866001612db3919061412b565b81518110612b6157612b61613ffc565b91509150612deb848481518110612ddc57612ddc613ffc565b60200260200101518383612977565b84612df785600161412b565b81518110612e0757612e07613ffc565b60200260200101818152505050508080612e20906140af565b915050612d6f565b6000806000612e37858561355b565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001612edf9291906001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b60005b60018351612f1291906140ca565b811015610c9557600080848381518110612f2e57612f2e613ffc565b602002602001015185846001612f44919061412b565b81518110612f5457612f54613ffc565b6020026020010151915091506000612f6c838361355b565b509050600087612f7d86600161412b565b81518110612f8d57612f8d613ffc565b60200260200101519050600080836001600160a01b0316866001600160a01b031614612fbb57826000612fbf565b6000835b91509150600060028a51612fd391906140ca565b8810612fdf578861302d565b61302d7f0000000000000000000000000000000000000000000000000000000000000000878c6130108c600261412b565b8151811061302057613020613ffc565b6020026020010151612e28565b905061305a7f00000000000000000000000000000000000000000000000000000000000000008888612e28565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613097576020820181803683370190505b506040518563ffffffff1660e01b81526004016130b794939291906141e6565b600060405180830381600087803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b505050505050505050505080806130fb906140af565b915050612f04565b60008084116131595760405162461bcd60e51b815260206004820152602e602482015260008051602061427083398151915260448201526d17d3d55514155517d05353d5539560921b606482015260840161073a565b6000831180156131695750600082115b6131855760405162461bcd60e51b815260040161073a9061415f565b600061319d6103e861319786886133e3565b906133e3565b905060006131b16103e56131978689613655565b90506131c26001612a2883856141ad565b9695505050505050565b600080841161321b5760405162461bcd60e51b8152602060048201526027602482015260008051602061427083398151915260448201526617d05353d5539560ca1b606482015260840161073a565b60008311801561322b5750600082115b6132475760405162461bcd60e51b815260040161073a9061415f565b8261325285846133e3565b610ac991906141ad565b61326e826001600160a01b03166136a0565b6132ba5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161073a565b600080836001600160a01b0316836040516132d59190614143565b6000604051808303816000865af19150503d8060008114613312576040519150601f19603f3d011682016040523d82523d6000602084013e613317565b606091505b5091509150816133695760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161073a565b805115610c9557808060200190518101906133849190614012565b610c955760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161073a565b60008115806134045750508082028282828161340157613401614197565b04145b610c825760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161073a565b80820182811015610c825760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161073a565b60008060006134a0858561355b565b5090506000806134b1888888612e28565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156134ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613512919061422a565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461354957808261354c565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b031614156135d05760405162461bcd60e51b815260206004820152602760248201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446044820152664452455353455360c81b606482015260840161073a565b826001600160a01b0316846001600160a01b0316106135f05782846135f3565b83835b90925090506001600160a01b03821661364e5760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604482015260640161073a565b9250929050565b80820382811115610c825760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161073a565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590610ac95750141592915050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03811681146125f357600080fd5b600080600080600060a0868803121561371a57600080fd5b85359450602086013561372c816136ed565b9350604086013561373c816136ed565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561379357613793613754565b604052919050565b600082601f8301126137ac57600080fd5b813567ffffffffffffffff8111156137c6576137c6613754565b6137d9601f8201601f191660200161376a565b8181528460208386010111156137ee57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561382157600080fd5b843561382c816136ed565b9350602085013567ffffffffffffffff81111561384857600080fd5b6138548782880161379b565b949794965050505060408301359260600135919050565b60008060006060848603121561388057600080fd5b505081359360208301359350604090920135919050565b80151581146125f357600080fd5b6000602082840312156138b757600080fd5b81356138c281613897565b9392505050565b60008083601f8401126138db57600080fd5b50813567ffffffffffffffff8111156138f357600080fd5b6020830191508360208260051b850101111561364e57600080fd5b600080600080600080600060c0888a03121561392957600080fd5b8735965060208801359550604088013567ffffffffffffffff81111561394e57600080fd5b61395a8a828b016138c9565b909650945050606088013561396e816136ed565b969995985093969295946080840135945060a09093013592915050565b6000806040838503121561399e57600080fd5b8235915060208084013567ffffffffffffffff808211156139be57600080fd5b818601915086601f8301126139d257600080fd5b8135818111156139e4576139e4613754565b8060051b91506139f584830161376a565b8181529183018401918481019089841115613a0f57600080fd5b938501935b83851015613a395784359250613a29836136ed565b8282529385019390850190613a14565b8096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015613a8157835183529284019291840191600101613a65565b50909695505050505050565b60008060008060808587031215613aa357600080fd5b8435613aae816136ed565b93506020850135613abe816136ed565b93969395505050506040820135916060013590565b60008060008060008060008060008060a08b8d031215613af257600080fd5b8a3567ffffffffffffffff80821115613b0a57600080fd5b613b168e838f016138c9565b909c509a5060208d0135915080821115613b2f57600080fd5b613b3b8e838f016138c9565b909a50985060408d0135915080821115613b5457600080fd5b613b608e838f016138c9565b909850965060608d0135915080821115613b7957600080fd5b613b858e838f016138c9565b909650945060808d0135915080821115613b9e57600080fd5b50613bab8d828e016138c9565b915080935050809150509295989b9194979a5092959850565b60008060008060008060008060e0898b031215613be057600080fd5b883597506020890135965060408901359550606089013567ffffffffffffffff811115613c0c57600080fd5b613c188b828c016138c9565b9096509450506080890135613c2c816136ed565b979a969950949793969295929450505060a08201359160c0013590565b60008060408385031215613c5c57600080fd5b8235613c67816136ed565b91506020830135613c77816136ed565b809150509250929050565b600080600060608486031215613c9757600080fd5b8335613ca2816136ed565b9250602084013567ffffffffffffffff811115613cbe57600080fd5b613cca8682870161379b565b925050604084013590509250925092565b600060208284031215613ced57600080fd5b81356138c2816136ed565b600080600060608486031215613d0d57600080fd5b8335613d18816136ed565b9250602084013591506040840135613d2f816136ed565b809150509250925092565b60008060408385031215613d4d57600080fd5b8235613d58816136ed565b946020939093013593505050565b600080600060608486031215613d7b57600080fd5b8335613d86816136ed565b92506020840135613d96816136ed565b929592945050506040919091013590565b6000806000806000806000806080898b031215613dc357600080fd5b883567ffffffffffffffff80821115613ddb57600080fd5b613de78c838d016138c9565b909a50985060208b0135915080821115613e0057600080fd5b613e0c8c838d016138c9565b909850965060408b0135915080821115613e2557600080fd5b613e318c838d016138c9565b909650945060608b0135915080821115613e4a57600080fd5b50613e578b828c016138c9565b999c989b5096995094979396929594505050565b6020808252601a908201527f416e79737761705633526f757465723a20464f5242494444454e000000000000604082015260600190565b600060208284031215613eb457600080fd5b81516138c2816136ed565b600060208284031215613ed157600080fd5b5051919050565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60005b83811015613f16578181015183820152602001613efe565b83811115610c955750506000910152565b60008151808452613f3f816020860160208601613efb565b601f01601f19169290920160200192915050565b608081526000613f666080830187613f27565b6020830195909552506040810192909252606090910152919050565b60208082526023908201527f416e79737761705636526f757465723a205377617054726164652064697361626040820152621b195960ea1b606082015260800190565b60208082526018908201527f416e79737761705633526f757465723a20455850495245440000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561402457600080fd5b81516138c281613897565b60a0808252810186905260008760c08301825b89811015614072578235614055816136ed565b6001600160a01b0316825260209283019290910190600101614042565b50602084019790975250506040810193909352606083019190915260809091015292915050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156140c3576140c3614099565b5060010190565b6000828210156140dc576140dc614099565b500390565b6020808252602a908201527f416e79737761705633526f757465723a20756e6465726c79696e67206973206e6040820152696f7420774e415449564560b01b606082015260800190565b6000821982111561413e5761413e614099565b500190565b60008251614155818460208701613efb565b9190910192915050565b6020808252602a908201526000805160206142708339815191526040820152695f4c495155494449545960b01b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826141ca57634e487b7160e01b600052601260045260246000fd5b500490565b6000816141de576141de614099565b506000190190565b84815283602082015260018060a01b03831660408201526080606082015260006131c26080830184613f27565b80516001600160701b038116811461185b57600080fd5b60008060006060848603121561423f57600080fd5b61424884614213565b925061425660208501614213565b9150604084015163ffffffff81168114613d2f57600080fdfe53757368697377617056324c6962726172793a20494e53554646494349454e54a2646970667358221220c17babedbab069763375fabccc1245cac6dcebfc453595e3a48e4d855008db3364736f6c634300080a0033000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002a038e100f8b85df21e4d44121bdbfe0c288a869