Latest 25 from a total of 78 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact ETH F... | 21723671 | 220 days ago | IN | 5.79999999 FRAX | 0.00025604 | ||||
| Swap Exact ETH F... | 21717233 | 220 days ago | IN | 1 FRAX | 0.00012958 | ||||
| Swap Exact ETH F... | 21716975 | 220 days ago | IN | 1 FRAX | 0.00017153 | ||||
| Swap Exact ETH F... | 21714097 | 220 days ago | IN | 400 FRAX | 0.000065 | ||||
| Swap Exact ETH F... | 21619765 | 222 days ago | IN | 2.37329999 FRAX | 0.0000305 | ||||
| Swap Exact ETH F... | 21359946 | 228 days ago | IN | 1.5 FRAX | 0.00014266 | ||||
| Swap Exact ETH F... | 21359937 | 228 days ago | IN | 1.7532 FRAX | 0.00012091 | ||||
| Swap Exact ETH F... | 21114698 | 234 days ago | IN | 33.51979999 FRAX | 0.00006235 | ||||
| Swap Exact ETH F... | 21114678 | 234 days ago | IN | 67 FRAX | 0.00006165 | ||||
| Swap Exact ETH F... | 21109323 | 234 days ago | IN | 1.5524 FRAX | 0.0000167 | ||||
| Swap Exact ETH F... | 21043113 | 235 days ago | IN | 5.2633 FRAX | 0.00002788 | ||||
| Swap Exact ETH F... | 21037423 | 235 days ago | IN | 148 FRAX | 0.00003352 | ||||
| Swap Exact ETH F... | 20971317 | 237 days ago | IN | 20.9182344 FRAX | 0.00000103 | ||||
| Swap Exact ETH F... | 20962152 | 237 days ago | IN | 2 FRAX | 0.00000107 | ||||
| Swap Exact ETH F... | 20960831 | 237 days ago | IN | 1 FRAX | 0.00000097 | ||||
| Swap Exact ETH F... | 20960800 | 237 days ago | IN | 1 FRAX | 0.00000101 | ||||
| Swap Exact ETH F... | 20938078 | 238 days ago | IN | 2.79999999 FRAX | 0.00000108 | ||||
| Swap Exact ETH F... | 20933587 | 238 days ago | IN | 126.6653 FRAX | 0.00000079 | ||||
| Swap Exact ETH F... | 20933541 | 238 days ago | IN | 5 FRAX | 0.00000081 | ||||
| Swap Exact ETH F... | 20918049 | 238 days ago | IN | 2.50999999 FRAX | 0.00000212 | ||||
| Swap Exact ETH F... | 20888375 | 239 days ago | IN | 4.45769999 FRAX | 0.00001795 | ||||
| Swap Exact ETH F... | 20862745 | 239 days ago | IN | 2.7534 FRAX | 0.00000333 | ||||
| Swap Exact ETH F... | 20724468 | 243 days ago | IN | 8.28149999 FRAX | 0.00000078 | ||||
| Swap Exact ETH F... | 20721578 | 243 days ago | IN | 1.69999999 FRAX | 0.00000136 | ||||
| Swap Exact ETH F... | 20655237 | 244 days ago | IN | 1 FRAX | 0.0000006 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 31217851 | 5 hrs ago | 10.08321204 FRAX | ||||
| 31217851 | 5 hrs ago | 10.08321204 FRAX | ||||
| 31191700 | 20 hrs ago | 2.05518371 FRAX | ||||
| 31191700 | 20 hrs ago | 2.05518371 FRAX | ||||
| 31191578 | 20 hrs ago | 4,071.66069999 FRAX | ||||
| 31159189 | 38 hrs ago | 5.5 FRAX | ||||
| 31158955 | 38 hrs ago | 2 FRAX | ||||
| 31122153 | 2 days ago | 0.48951822 FRAX | ||||
| 31122153 | 2 days ago | 0.48951822 FRAX | ||||
| 31022118 | 4 days ago | 828.42999999 FRAX | ||||
| 31018828 | 4 days ago | 0.37356117 FRAX | ||||
| 31018828 | 4 days ago | 0.37356117 FRAX | ||||
| 30999656 | 5 days ago | 790 FRAX | ||||
| 30960456 | 6 days ago | 5 FRAX | ||||
| 30936169 | 6 days ago | 2.03170419 FRAX | ||||
| 30936169 | 6 days ago | 2.03170419 FRAX | ||||
| 30935965 | 6 days ago | 0.0366 FRAX | ||||
| 30922401 | 7 days ago | 0.15903367 FRAX | ||||
| 30922401 | 7 days ago | 0.15903367 FRAX | ||||
| 30908941 | 7 days ago | 5 FRAX | ||||
| 30867451 | 8 days ago | 8.25451957 FRAX | ||||
| 30867451 | 8 days ago | 8.25451957 FRAX | ||||
| 30863049 | 8 days ago | 1.77937671 FRAX | ||||
| 30863049 | 8 days ago | 1.77937671 FRAX | ||||
| 30862975 | 8 days ago | 14.55282794 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxswapRouter
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;
// Sources flattened with hardhat v2.19.4 https://hardhat.org
// File contracts/Fraxswap/core/interfaces/IUniswapV2PairV5.sol
interface IUniswapV2PairV5 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File contracts/Fraxswap/core/interfaces/IFraxswapPair.sol
// Original license: SPDX_License_Identifier: GPL-2.0-or-later
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================= IFraxswapPair ==========================
// ====================================================================
// Fraxswap LP Pair Interface
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
interface IFraxswapPair is IUniswapV2PairV5 {
// TWAMM
event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals);
event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals);
event CancelLongTermOrder(address indexed addr, uint256 orderId, address sellToken, uint256 unsoldAmount, address buyToken, uint256 purchasedAmount);
event WithdrawProceedsFromLongTermOrder(address indexed addr, uint256 orderId, address indexed proceedToken, uint256 proceeds, bool orderExpired);
function fee() external view returns (uint);
function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function cancelLongTermSwap(uint256 orderId) external;
function withdrawProceedsFromLongTermSwap(uint256 orderId) external returns (bool is_expired, address rewardTkn, uint256 totalReward);
function executeVirtualOrders(uint256 blockTimestamp) external;
function getAmountOut(uint amountIn, address tokenIn) external view returns (uint);
function getAmountIn(uint amountOut, address tokenOut) external view returns (uint);
function orderTimeInterval() external returns (uint256);
function getTWAPHistoryLength() external view returns (uint);
function getTwammReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast, uint112 _twammReserve0, uint112 _twammReserve1, uint256 _fee);
function getReserveAfterTwamm(uint256 blockTimestamp) external view returns (uint112 _reserve0, uint112 _reserve1, uint256 lastVirtualOrderTimestamp, uint112 _twammReserve0, uint112 _twammReserve1);
function getNextOrderID() external view returns (uint256);
function getOrderIDsForUser(address user) external view returns (uint256[] memory);
function getOrderIDsForUserLength(address user) external view returns (uint256);
// function getDetailedOrdersForUser(address user, uint256 offset, uint256 limit) external view returns (LongTermOrdersLib.Order[] memory detailed_orders);
function twammUpToDate() external view returns (bool);
function getTwammState() external view returns (uint256 token0Rate, uint256 token1Rate, uint256 lastVirtualOrderTimestamp, uint256 orderTimeInterval_rtn, uint256 rewardFactorPool0, uint256 rewardFactorPool1);
function getTwammSalesRateEnding(uint256 _blockTimestamp) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding);
function getTwammRewardFactor(uint256 _blockTimestamp) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp);
function getTwammOrder(uint256 orderId) external view returns (uint256 id, uint256 creationTimestamp, uint256 expirationTimestamp, uint256 saleRate, address owner, address sellTokenAddr, address buyTokenAddr);
function getTwammOrderProceedsView(uint256 orderId, uint256 blockTimestamp) external view returns (bool orderExpired, uint256 totalReward);
function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward);
function togglePauseNewSwaps() external;
}
// File contracts/Fraxswap/core/interfaces/IUniswapV2FactoryV5.sol
interface IUniswapV2FactoryV5 {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function globalPause() external view returns (bool);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function createPair(address tokenA, address tokenB, uint fee) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function toggleGlobalPause() external;
}
// File contracts/Fraxswap/libraries/TransferHelper.sol
// Original license: SPDX_License_Identifier: GPL-3.0-or-later
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
// File contracts/Fraxswap/periphery/interfaces/IERC20.sol
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
// File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router01V5.sol
interface IUniswapV2Router01V5 {
function factory() external view returns (address);
function WETH() external view returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router02V5.sol
interface IUniswapV2Router02V5 is IUniswapV2Router01V5 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File contracts/Fraxswap/periphery/interfaces/IWETH.sol
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
// File contracts/Fraxswap/periphery/libraries/FraxswapRouterLibrary.sol
// Original license: SPDX_License_Identifier: BUSL-1.1
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ======================= FraxswapRouterLibrary ======================
// ====================================================================
// Fraxswap Router Library Functions
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM
library FraxswapRouterLibrary {
bytes public constant INIT_CODE_HASH = hex'676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1'; // init code / init hash
// 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, 'FraxswapRouterLibrary: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'FraxswapRouterLibrary: 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(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
INIT_CODE_HASH // init code / init 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,) = IFraxswapPair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function getReservesWithTwamm(address factory, address tokenA, address tokenB) internal returns (uint reserveA, uint reserveB, uint twammReserveA, uint twammReserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
IFraxswapPair pair = IFraxswapPair(pairFor(factory, tokenA, tokenB));
pair.executeVirtualOrders(block.timestamp);
(uint reserve0, uint reserve1,,uint twammReserve0, uint twammReserve1, ) = pair.getTwammReserves();
(reserveA, reserveB, twammReserveA, twammReserveB) = tokenA == token0 ? (reserve0, reserve1, twammReserve0, twammReserve1) : (reserve1, reserve0, twammReserve1, twammReserve0);
}
// 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, 'FraxswapRouterLibrary: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'FraxswapRouterLibrary: INSUFFICIENT_LIQUIDITY');
amountB = amountA * reserveB / reserveA;
}
// 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, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
require(pair.twammUpToDate(), 'twamm out of date');
amounts[i + 1] = getAmountOutU112Fixed(address(pair), amounts[i], path[i]);
}
}
// 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, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
require(pair.twammUpToDate(), 'twamm out of date');
amounts[i - 1] = getAmountInU112Fixed(address(pair), amounts[i], path[i - 1]);
}
}
// performs chained getAmountOut calculations on any number of pairs with Twamm
function getAmountsOutWithTwamm(address factory, uint amountIn, address[] memory path) internal returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
pair.executeVirtualOrders(block.timestamp);
amounts[i + 1] = getAmountOutU112Fixed(address(pair), amounts[i], path[i]);
}
}
// performs chained getAmountIn calculations on any number of pairs with Twamm
function getAmountsInWithTwamm(address factory, uint amountOut, address[] memory path) internal returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
pair.executeVirtualOrders(block.timestamp);
(uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves();
amounts[i - 1] = getAmountInU112Fixed(address(pair), amounts[i], path[i - 1]);
}
}
// Fixes overflow issues with some tokens
// =====================================================
// // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountInU112Fixed(address _pairAddress, uint _amountOut, address _tokenOut) internal view returns (uint) {
IFraxswapPair pair = IFraxswapPair(_pairAddress);
(uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves();
(uint112 _reserveInFlipped, uint112 _reserveOutFlipped) = _tokenOut == pair.token0() ? (_reserve0, _reserve1) : (_reserve1, _reserve0);
require(_amountOut > 0 && _reserveInFlipped > 0 && _reserveOutFlipped > 0); // INSUFFICIENT_OUTPUT_AMOUNT, INSUFFICIENT_LIQUIDITY
uint numerator = uint256(_reserveInFlipped) * _amountOut * 10000;
uint denominator = (uint256(_reserveOutFlipped) - _amountOut) * pair.fee();
return (numerator / denominator) + 1;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOutU112Fixed(address _pairAddress, uint _amountIn, address _tokenIn) internal view returns (uint) {
IFraxswapPair pair = IFraxswapPair(_pairAddress);
(uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves();
(uint112 _reserveIn, uint112 _reserveOut) = _tokenIn == pair.token0() ? (_reserve0, _reserve1) : (_reserve1, _reserve0);
require(_amountIn > 0 && _reserveIn > 0 && _reserveOut > 0); // INSUFFICIENT_INPUT_AMOUNT, INSUFFICIENT_LIQUIDITY
uint amountInWithFee = uint256(_amountIn) * pair.fee();
uint numerator = amountInWithFee * uint256(_reserveOut);
uint denominator = (uint256(_reserveIn) * 10000) + amountInWithFee;
return numerator / denominator;
}
}
// File contracts/Fraxswap/periphery/FraxswapRouter.sol
// Original license: SPDX_License_Identifier: BUSL-1.1
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================== FraxswapRouter ==========================
// ====================================================================
// TWAMM Router
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// 2.0.1: UInt112 fixes
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM
contract FraxswapRouter is IUniswapV2Router02V5 {
address public immutable override factory;
address public immutable override WETH;
string constant public version = "2.0.1";
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'FraxswapV1Router: EXPIRED');
_;
}
constructor(address _factory, address _WETH) public {
factory = _factory;
WETH = _WETH;
}
receive() external payable {
assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
}
function INIT_CODE_HASH() public pure returns (bytes memory hash) {
return FraxswapRouterLibrary.INIT_CODE_HASH;
}
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
) internal virtual returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
if (IUniswapV2FactoryV5(factory).getPair(tokenA, tokenB) == address(0)) {
IUniswapV2FactoryV5(factory).createPair(tokenA, tokenB);
}
(uint reserveA, uint reserveB,,) = FraxswapRouterLibrary.getReservesWithTwamm(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = FraxswapRouterLibrary.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = FraxswapRouterLibrary.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IFraxswapPair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value: amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IFraxswapPair(pair).mint(to);
// refund dust eth, if any
if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
IFraxswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = IFraxswapPair(pair).burn(to);
(address token0,) = FraxswapRouterLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
require(amountB >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
}
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountA, uint amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
}
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountToken, uint amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
}
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountETH) {
(, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
token, liquidity, amountTokenMin, amountETHMin, to, deadline
);
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FraxswapRouterLibrary.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 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)).swap(
amount0Out, amount1Out, to, new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
virtual
override
payable
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, msg.value, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
}
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
virtual
override
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
virtual
override
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
virtual
override
payable
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= msg.value, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
// refund dust eth, if any
if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FraxswapRouterLibrary.sortTokens(input, output);
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output));
uint amountInput;
uint amountOutput;
{ // scope to avoid stack too deep errors
(uint reserveInput, uint reserveOutput, uint twammReserveInput, uint twammReserveOutput) = FraxswapRouterLibrary.getReservesWithTwamm(factory, input, output);
amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput - twammReserveInput;
amountOutput = FraxswapRouterLibrary.getAmountOutU112Fixed(address(pair), amountInput, input);
}
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
);
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
)
external
virtual
override
payable
ensure(deadline)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
uint amountIn = msg.value;
IWETH(WETH).deposit{value: amountIn}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn));
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
)
external
virtual
override
ensure(deadline)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
return FraxswapRouterLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
public
pure
virtual
override
returns (uint amountOut)
{
revert("Deprecated: Use getAmountsOut"); // depends on the fee of the pool
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
public
pure
virtual
override
returns (uint amountIn)
{
revert("Deprecated: Use getAmountsIn"); // depends on the fee of the pool
}
function getAmountsOut(uint amountIn, address[] memory path)
public
view
virtual
override
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint amountOut, address[] memory path)
public
view
virtual
override
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsIn(factory, amountOut, path);
}
function getAmountsOutWithTwamm(uint amountIn, address[] memory path)
public
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
}
function getAmountsInWithTwamm(uint amountOut, address[] memory path)
public
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
}
}{
"remappings": [
"frax-std/=node_modules/frax-standard-solidity/src/",
"@prb/test/=node_modules/@prb/test/",
"forge-std/=node_modules/forge-std/src/",
"ds-test/=node_modules/ds-test/src/",
"@uniswap/v2-core/=lib/v2-core/",
"@uniswap/v2-periphery/=lib/v2-periphery/",
"@uniswap/v3-core/=lib/v3-core/",
"@uniswap/v3-periphery/=lib/v3-periphery/",
"@chainlink/=node_modules/@chainlink/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@openzeppelin/=node_modules/@openzeppelin/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"v2-core/=lib/v2-core/contracts/",
"v2-periphery/=lib/v2-periphery/contracts/",
"v3-core/=lib/v3-core/",
"v3-periphery/=lib/v3-periphery/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 777777
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"INIT_CODE_HASH","outputs":[{"internalType":"bytes","name":"hash","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"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":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsInWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOutWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801561001057600080fd5b506040516161ef3803806161ef83398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051615fb461023b600039600081816101d80152818161049e015281816106c60152818161072e0152818161089e01528181610b880152818161103d0152818161123f01528181611778015281816118cb01528181611a0c01528181611af601528181611ce801528181611d8301528181612149015281816122400152818161235501528181612436015281816124b701528181612b0901528181612e1201528181612e6801528181612e9c01528181612f640152818161310d015281816132f3015261338e01526000818161058a0152818161097101528181610ab301528181610c7b01528181610cb401528181610e53015281816111100152818161121d015281816113fc015281816116d001528181611bd501528181611dc201528181611fbc015281816122c2015281816124f6015281816127cd01528181612ab701528181612ae701528181612cb801528181612e46015281816131ec015281816133cd01528181613dca01528181613dfd01528181614496015281816144cc0152818161462001528181614c8201528181614d570152614dce0152615fb46000f3fe6080604052600436106101bb5760003560e01c806385f8c259116100ec578063baa2abde1161008a578063ded9382a11610064578063ded9382a146105cc578063e8e33700146105ec578063f305d71914610627578063fb3bdb411461063a57600080fd5b8063baa2abde14610558578063c45a015514610578578063d06ca61f146105ac57600080fd5b8063ad615dec116100c6578063ad615dec146104e5578063af2979eb14610505578063b66caf0614610525578063b6f9de951461054557600080fd5b806385f8c2591461044c5780638803dbee1461046c578063ad5c46481461048c57600080fd5b80634a25d94a116101595780635c11d795116101335780635c11d795146103d9578063704c32cf146103f9578063791ac947146104195780637ff36ab51461043957600080fd5b80634a25d94a1461035057806354fd4d50146103705780635b0d5984146103b957600080fd5b80631f00ca74116101955780631f00ca74146102a15780632195995c146102c1578063257671f5146102e157806338ed17391461033057600080fd5b806302751cec1461020c578063054d50d41461024657806318cbafe51461027457600080fd5b36610207573373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610205576102056155fd565b005b600080fd5b34801561021857600080fd5b5061022c610227366004615661565b61064d565b604080519283526020830191909152015b60405180910390f35b34801561025257600080fd5b506102666102613660046156bf565b6107b5565b60405190815260200161023d565b34801561028057600080fd5b5061029461028f366004615730565b61081a565b60405161023d91906157a3565b3480156102ad57600080fd5b506102946102bc366004615815565b610c74565b3480156102cd57600080fd5b5061022c6102dc36600461592e565b610caa565b3480156102ed57600080fd5b506040805180820190915260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1908201525b60405161023d9190615a4b565b34801561033c57600080fd5b5061029461034b366004615730565b610de1565b34801561035c57600080fd5b5061029461036b366004615730565b610fb9565b34801561037c57600080fd5b506103236040518060400160405280600581526020017f322e302e3100000000000000000000000000000000000000000000000000000081525081565b3480156103c557600080fd5b506102666103d4366004615a5e565b611215565b3480156103e557600080fd5b506102056103f4366004615730565b611360565b34801561040557600080fd5b50610294610414366004615815565b6116c9565b34801561042557600080fd5b50610205610434366004615730565b6116f6565b610294610447366004615af7565b611a87565b34801561045857600080fd5b506102666104673660046156bf565b611ee5565b34801561047857600080fd5b50610294610487366004615730565b611f4a565b34801561049857600080fd5b506104c07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b3480156104f157600080fd5b506102666105003660046156bf565b6120c1565b34801561051157600080fd5b50610266610520366004615661565b6120d6565b34801561053157600080fd5b50610294610540366004615815565b6122bb565b610205610553366004615af7565b6122e8565b34801561056457600080fd5b5061022c610573366004615b5e565b612758565b34801561058457600080fd5b506104c07f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b857600080fd5b506102946105c7366004615815565b612ab0565b3480156105d857600080fd5b5061022c6105e7366004615a5e565b612add565b3480156105f857600080fd5b5061060c610607366004615bd1565b612c2e565b6040805193845260208401929092529082015260600161023d565b61060c610635366004615661565b612d9c565b610294610648366004615af7565b61309e565b60008082428110156106c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b6106ef897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612758565b90935091506106ff898685613532565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561078757600080fd5b505af115801561079b573d6000803e3d6000fd5b505050506107a985836136c8565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f757400000060448201526000906064016106b7565b60608142811015610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866108cb600182615c7c565b8181106108da576108da615c8f565b90506020020160208101906108ef9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6109ca7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b91508682600184516109dc9190615c7c565b815181106109ec576109ec615c8f565b60200260200101511015610a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b610b4786866000818110610a9857610a98615c8f565b9050602002016020810190610aad9190615cbe565b33610b277f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ae557610ae5615c8f565b9050602002016020810190610afa9190615cbe565b8b8b6001818110610b0d57610b0d615c8f565b9050602002016020810190610b229190615cbe565b613a2b565b85600081518110610b3a57610b3a615c8f565b6020026020010151613b2e565b610b8682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ccd915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610bd19190615c7c565b81518110610be157610be1615c8f565b60200260200101516040518263ffffffff1660e01b8152600401610c0791815260200190565b600060405180830381600087803b158015610c2157600080fd5b505af1158015610c35573d6000803e3d6000fd5b50505050610c69848360018551610c4c9190615c7c565b81518110610c5c57610c5c615c8f565b60200260200101516136c8565b509695505050505050565b6060610ca17f00000000000000000000000000000000000000000000000000000000000000008484613ed8565b90505b92915050565b6000806000610cda7f00000000000000000000000000000000000000000000000000000000000000008f8f613a2b565b9050600087610ce9578c610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b50505050610dc78f8f8f8f8f8f8f612758565b809450819550505050509b509b9950505050505050505050565b60608142811015610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b610eac7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b9150868260018451610ebe9190615c7c565b81518110610ece57610ece615c8f565b60200260200101511015610f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b610f7a86866000818110610a9857610a98615c8f565b610c6982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b60608142811015611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016868661106a600182615c7c565b81811061107957611079615c8f565b905060200201602081019061108e9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6111697f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150868260008151811061117f5761117f615c8f565b60200260200101511115610a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b6000806112637f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613a2b565b9050600086611272578b611294565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b15801561132957600080fd5b505af115801561133d573d6000803e3d6000fd5b5050505061134f8d8d8d8d8d8d6120d6565b9d9c50505050505050505050505050565b80428110156113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b61145c858560008181106113e1576113e1615c8f565b90506020020160208101906113f69190615cbe565b336114567f00000000000000000000000000000000000000000000000000000000000000008989600081811061142e5761142e615c8f565b90506020020160208101906114439190615cbe565b8a8a6001818110610b0d57610b0d615c8f565b8a613b2e565b6000858561146b600182615c7c565b81811061147a5761147a615c8f565b905060200201602081019061148f9190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190615ce2565b9050611561868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250614421915050565b86818787611570600182615c7c565b81811061157f5761157f615c8f565b90506020020160208101906115949190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190615ce2565b6116319190615c7c565b10156116bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b5050505050505050565b6060610ca17f000000000000000000000000000000000000000000000000000000000000000084846137d7565b8042811015611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856117a5600182615c7c565b8181106117b4576117b4615c8f565b90506020020160208101906117c99190615cbe565b73ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b61185c858560008181106113e1576113e1615c8f565b61189a858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614421915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190615ce2565b9050868110156119dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b505050506116bf84826136c8565b60608142811015611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110611b3e57611b3e615c8f565b9050602002016020810190611b539190615cbe565b73ffffffffffffffffffffffffffffffffffffffff1614611bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b611c2e7f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b9150868260018451611c409190615c7c565b81518110611c5057611c50615c8f565b60200260200101511015611ce6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611d3557611d35615c8f565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6857600080fd5b505af1158015611d7c573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611df47f00000000000000000000000000000000000000000000000000000000000000008989600081811061142e5761142e615c8f565b84600081518110611e0757611e07615c8f565b60200260200101516040518363ffffffff1660e01b8152600401611e4d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e909190615cfb565b611e9c57611e9c6155fd565b611edb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e0000000060448201526000906064016106b7565b60608142811015611fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b6120157f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150868260008151811061202b5761202b615c8f565b60200260200101511115610f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b60006120ce8484846146fb565b949350505050565b60008142811015612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612172887f00000000000000000000000000000000000000000000000000000000000000008989893089612758565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061221191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156121e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c9190615ce2565b613532565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561229957600080fd5b505af11580156122ad573d6000803e3d6000fd5b50505050610c6984836136c8565b6060610ca17f0000000000000000000000000000000000000000000000000000000000000000848461418d565b8042811015612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061239d5761239d615c8f565b90506020020160208101906123b29190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6125287f00000000000000000000000000000000000000000000000000000000000000008989600081811061142e5761142e615c8f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190615cfb565b6125ca576125ca6155fd565b600086866125d9600182615c7c565b8181106125e8576125e8615c8f565b90506020020160208101906125fd9190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190615ce2565b90506126cf878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614421915050565b878188886126de600182615c7c565b8181106126ed576126ed615c8f565b90506020020160208101906127029190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024016115e6565b60008082428110156127c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b60006127f37f00000000000000000000000000000000000000000000000000000000000000008c8c613a2b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128939190615cfb565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292a9190615d18565b91509150600061293a8e8e61483d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461297757818361297a565b82825b90975095508a871015612a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b89861015612a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b505050505097509795505050505050565b6060610ca17f000000000000000000000000000000000000000000000000000000000000000084846149e7565b6000806000612b2d7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613a2b565b9050600087612b3c578c612b5e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612bf357600080fd5b505af1158015612c07573d6000803e3d6000fd5b50505050612c198e8e8e8e8e8e61064d565b909f909e509c50505050505050505050505050565b60008060008342811015612c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612cac8c8c8c8c8c8c614c2e565b90945092506000612cde7f00000000000000000000000000000000000000000000000000000000000000008e8e613a2b565b9050612cec8d338388613b2e565b612cf88c338387613b2e565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8a9190615ce2565b92505050985098509895505050505050565b60008060008342811015612e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612e3a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614c2e565b90945092506000612e8c7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613a2b565b9050612e9a8b338388613b2e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd59190615cfb565b612fe157612fe16155fd565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130739190615ce2565b925083341115613090576130903361308b8634615c7c565b6136c8565b505096509650969350505050565b6060814281101561310b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061315557613155615c8f565b905060200201602081019061316a9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff16146131e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6132457f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150348260008151811061325b5761325b615c8f565b602002602001015111156132f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061334057613340615c8f565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561337357600080fd5b505af1158015613387573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133ff7f00000000000000000000000000000000000000000000000000000000000000008989600081811061142e5761142e615c8f565b8460008151811061341257613412615c8f565b60200260200101516040518363ffffffff1660e01b815260040161345892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015613477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349b9190615cfb565b6134a7576134a76155fd565b6134e682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b816000815181106134f9576134f9615c8f565b6020026020010151341115611edb57611edb338360008151811061351f5761351f615c8f565b60200260200101513461308b9190615c7c565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135c99190615d3c565b6000604051808303816000865af19150503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b50915091508180156136355750805115806136355750808060200190518101906136359190615cfb565b6136c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016106b7565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136ff9190615d3c565b60006040518083038185875af1925050503d806000811461373c576040519150601f19603f3d011682016040523d82523d6000602084013e613741565b606091505b50509050806137d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016106b7565b505050565b606060028251101561386b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115613885576138856157e6565b6040519080825280602002602001820160405280156138ae578160200160208202803683370190505b50905082816000815181106138c5576138c5615c8f565b60200260200101818152505060005b600183516138e29190615c7c565b811015613a235760006139348685848151811061390157613901615c8f565b6020026020010151868560016139179190615d58565b8151811061392757613927615c8f565b6020026020010151613a2b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561399e57600080fd5b505af11580156139b2573d6000803e3d6000fd5b505050506139f3818484815181106139cc576139cc615c8f565b60200260200101518685815181106139e6576139e6615c8f565b6020026020010151614f8d565b836139ff846001615d58565b81518110613a0f57613a0f615c8f565b6020908102919091010152506001016138d4565b509392505050565b6000806000613a3a858561483d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613aee94939101615d6b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613bcd9190615d3c565b6000604051808303816000865af19150503d8060008114613c0a576040519150601f19603f3d011682016040523d82523d6000602084013e613c0f565b606091505b5091509150818015613c39575080511580613c39575080806020019051810190613c399190615cfb565b613cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016106b7565b505050505050565b60005b60018351613cde9190615c7c565b811015613ed257600080848381518110613cfa57613cfa615c8f565b602002602001015185846001613d109190615d58565b81518110613d2057613d20615c8f565b6020026020010151915091506000613d38838361483d565b509050600087613d49866001615d58565b81518110613d5957613d59615c8f565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613da157826000613da5565b6000835b91509150600060028a51613db99190615c7c565b8810613dc55788613df6565b613df67f0000000000000000000000000000000000000000000000000000000000000000878c6139178c6002615d58565b9050613e237f00000000000000000000000000000000000000000000000000000000000000008888613a2b565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e6d576020820181803683370190505b506040518563ffffffff1660e01b8152600401613e8d9493929190615de3565b600060405180830381600087803b158015613ea757600080fd5b505af1158015613ebb573d6000803e3d6000fd5b505060019099019850613cd0975050505050505050565b50505050565b6060600282511015613f6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115613f8657613f866157e6565b604051908082528060200260200182016040528015613faf578160200160208202803683370190505b509050828160018351613fc29190615c7c565b81518110613fd257613fd2615c8f565b602002602001018181525050600060018351613fee9190615c7c565b90505b8015613a235760006140338685614009600186615c7c565b8151811061401957614019615c8f565b602002602001015186858151811061392757613927615c8f565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a49190615cfb565b61410a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f66206461746500000000000000000000000000000060448201526064016106b7565b6141538184848151811061412057614120615c8f565b6020026020010151866001866141369190615c7c565b8151811061414657614146615c8f565b60200260200101516151e1565b8361415f600185615c7c565b8151811061416f5761416f615c8f565b6020908102919091010152508061418581615e28565b915050613ff1565b6060600282511015614221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff81111561423b5761423b6157e6565b604051908082528060200260200182016040528015614264578160200160208202803683370190505b5090508281600183516142779190615c7c565b8151811061428757614287615c8f565b6020026020010181815250506000600183516142a39190615c7c565b90505b8015613a235760006142be8685614009600186615c7c565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561432857600080fd5b505af115801561433c573d6000803e3d6000fd5b505050506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561438e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143b29190615e8f565b50915091506143e3838686815181106143cd576143cd615c8f565b6020026020010151886001886141369190615c7c565b856143ef600187615c7c565b815181106143ff576143ff615c8f565b602002602001018181525050505050808061441990615e28565b9150506142a6565b60005b600183516144329190615c7c565b8110156137d25760008084838151811061444e5761444e615c8f565b6020026020010151858460016144649190615d58565b8151811061447457614474615c8f565b602002602001015191509150600061448c838361483d565b50905060006144bc7f00000000000000000000000000000000000000000000000000000000000000008585613a2b565b90506000806000806000806144f27f00000000000000000000000000000000000000000000000000000000000000008b8b61543a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa15801561456e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145929190615ce2565b61459c9190615c7c565b6145a69190615c7c565b95506145b387878c614f8d565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146145f7578260006145fb565b6000835b91509150600060028c5161460f9190615c7c565b8a1061461b578a61464c565b61464c7f0000000000000000000000000000000000000000000000000000000000000000898e6139178e6002615d58565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906146b49086908690869060248101615de3565b600060405180830381600087803b1580156146ce57600080fd5b505af11580156146e2573d6000803e3d6000fd5b50506001909b019a506144249950505050505050505050565b600080841161478c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e540000000000000000000000000000000000000000000060648201526084016106b7565b60008311801561479c5750600082115b614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c49515549444954590000000000000000000000000000000000000060648201526084016106b7565b826148338386615ed2565b6120ce9190615ee9565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036148fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f4144445245535345530000000000000000000000000000000000000000000060648201526084016106b7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614935578284614938565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166149e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f455353000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b9250929050565b6060600282511015614a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115614a9557614a956157e6565b604051908082528060200260200182016040528015614abe578160200160208202803683370190505b5090508281600081518110614ad557614ad5615c8f565b60200260200101818152505060005b60018351614af29190615c7c565b811015613a23576000614b118685848151811061390157613901615c8f565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b829190615cfb565b614be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f66206461746500000000000000000000000000000060448201526064016106b7565b614bfe818484815181106139cc576139cc615c8f565b83614c0a846001615d58565b81518110614c1a57614c1a615c8f565b602090810291909101015250600101614ae4565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015614ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cef9190615f24565b73ffffffffffffffffffffffffffffffffffffffff1603614dc6576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dc49190615f24565b505b600080614df47f00000000000000000000000000000000000000000000000000000000000000008b8b61543a565b505091509150816000148015614e08575080155b15614e1857879350869250614f80565b6000614e258984846146fb565b9050878111614ec95785811015614ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b889450925082614f7e565b6000614ed68984866146fb565b905089811115614ee857614ee86155fd565b87811015614f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b94508793505b505b5050965096945050505050565b6000808490506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150059190615e8f565b50915091506000808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015615058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061507c9190615f24565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146150b55782846150b8565b83835b915091506000881180156150dc57506000826dffffffffffffffffffffffffffff16115b80156150f857506000816dffffffffffffffffffffffffffff16115b61510157600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561514e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151729190615ce2565b61517c908a615ed2565b9050600061519a6dffffffffffffffffffffffffffff841683615ed2565b90506000826151bb6dffffffffffffffffffffffffffff8716612710615ed2565b6151c59190615d58565b90506151d18183615ee9565b9c9b505050505050505050505050565b6000808490506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152599190615e8f565b50915091506000808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156152ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152d09190615f24565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461530957828461530c565b83835b9150915060008811801561533057506000826dffffffffffffffffffffffffffff16115b801561534c57506000816dffffffffffffffffffffffffffff16115b61535557600080fd5b6000615371896dffffffffffffffffffffffffffff8516615ed2565b61537d90612710615ed2565b905060008673ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156153cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153f09190615ce2565b61540a8b6dffffffffffffffffffffffffffff8616615c7c565b6154149190615ed2565b90506154208183615ee9565b61542b906001615d58565b9b9a5050505050505050505050565b600080600080600061544c878761483d565b509050600061545c898989613a2b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156154c657600080fd5b505af11580156154da573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa15801561552f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155539190615f41565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146155d957828482846155de565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461564e57600080fd5b50565b803561565c8161562c565b919050565b60008060008060008060c0878903121561567a57600080fd5b86356156858161562c565b955060208701359450604087013593506060870135925060808701356156aa8161562c565b9598949750929591949360a090920135925050565b6000806000606084860312156156d457600080fd5b505081359360208301359350604090920135919050565b60008083601f8401126156fd57600080fd5b50813567ffffffffffffffff81111561571557600080fd5b6020830191508360208260051b85010111156149e057600080fd5b60008060008060008060a0878903121561574957600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561576e57600080fd5b61577a89828a016156eb565b909550935050606087013561578e8161562c565b95989497509295919493608090920135925050565b602080825282518282018190526000918401906040840190835b818110156157db5783518352602093840193909201916001016157bd565b509095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561582857600080fd5b82359150602083013567ffffffffffffffff81111561584657600080fd5b8301601f8101851361585757600080fd5b803567ffffffffffffffff811115615871576158716157e6565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff821117156158bc576158bc6157e6565b6040529182526020818401810192908101888411156158da57600080fd5b6020850194505b83851015615900576158f285615651565b8152602094850194016158e1565b50809450505050509250929050565b801515811461564e57600080fd5b803560ff8116811461565c57600080fd5b60008060008060008060008060008060006101608c8e03121561595057600080fd5b8b3561595b8161562c565b9a5060208c013561596b8161562c565b995060408c0135985060608c0135975060808c0135965060a08c01356159908161562c565b955060c08c0135945060e08c01356159a78161590f565b93506159b66101008d0161591d565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b60005b838110156159f85781810151838201526020016159e0565b50506000910152565b60008151808452615a198160208601602086016159dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ca16020830184615a01565b6000806000806000806000806000806101408b8d031215615a7e57600080fd5b8a35615a898161562c565b995060208b0135985060408b0135975060608b0135965060808b0135615aae8161562c565b955060a08b0135945060c08b0135615ac58161590f565b9350615ad360e08c0161591d565b999c989b509699959894979396509194610100810135936101209091013592509050565b600080600080600060808688031215615b0f57600080fd5b85359450602086013567ffffffffffffffff811115615b2d57600080fd5b615b39888289016156eb565b9095509350506040860135615b4d8161562c565b949793965091946060013592915050565b600080600080600080600060e0888a031215615b7957600080fd5b8735615b848161562c565b96506020880135615b948161562c565b955060408801359450606088013593506080880135925060a0880135615bb98161562c565b96999598509396929591949193505060c09091013590565b600080600080600080600080610100898b031215615bee57600080fd5b8835615bf98161562c565b97506020890135615c098161562c565b965060408901359550606089013594506080890135935060a0890135925060c0890135615c358161562c565b979a969950949793969295919450919260e001359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610ca457610ca4615c4d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215615cd057600080fd5b8135615cdb8161562c565b9392505050565b600060208284031215615cf457600080fd5b5051919050565b600060208284031215615d0d57600080fd5b8151615cdb8161590f565b60008060408385031215615d2b57600080fd5b505080516020909101519092909150565b60008251615d4e8184602087016159dd565b9190910192915050565b80820180821115610ca457610ca4615c4d565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600182015282601582015260008251615dd48160358501602087016159dd565b91909101603501949350505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615e1e6080830184615a01565b9695505050505050565b600081615e3757615e37615c4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff8116811461565c57600080fd5b805163ffffffff8116811461565c57600080fd5b600080600060608486031215615ea457600080fd5b615ead84615e5d565b9250615ebb60208501615e5d565b9150615ec960408501615e7b565b90509250925092565b8082028115828204841417610ca457610ca4615c4d565b600082615f1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615f3657600080fd5b8151615cdb8161562c565b60008060008060008060c08789031215615f5a57600080fd5b615f6387615e5d565b9550615f7160208801615e5d565b9450615f7f60408801615e7b565b9350615f8d60608801615e5d565b9250615f9b60808801615e5d565b9150600060a0880151905080915050929550929550929556000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c806385f8c259116100ec578063baa2abde1161008a578063ded9382a11610064578063ded9382a146105cc578063e8e33700146105ec578063f305d71914610627578063fb3bdb411461063a57600080fd5b8063baa2abde14610558578063c45a015514610578578063d06ca61f146105ac57600080fd5b8063ad615dec116100c6578063ad615dec146104e5578063af2979eb14610505578063b66caf0614610525578063b6f9de951461054557600080fd5b806385f8c2591461044c5780638803dbee1461046c578063ad5c46481461048c57600080fd5b80634a25d94a116101595780635c11d795116101335780635c11d795146103d9578063704c32cf146103f9578063791ac947146104195780637ff36ab51461043957600080fd5b80634a25d94a1461035057806354fd4d50146103705780635b0d5984146103b957600080fd5b80631f00ca74116101955780631f00ca74146102a15780632195995c146102c1578063257671f5146102e157806338ed17391461033057600080fd5b806302751cec1461020c578063054d50d41461024657806318cbafe51461027457600080fd5b36610207573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000021614610205576102056155fd565b005b600080fd5b34801561021857600080fd5b5061022c610227366004615661565b61064d565b604080519283526020830191909152015b60405180910390f35b34801561025257600080fd5b506102666102613660046156bf565b6107b5565b60405190815260200161023d565b34801561028057600080fd5b5061029461028f366004615730565b61081a565b60405161023d91906157a3565b3480156102ad57600080fd5b506102946102bc366004615815565b610c74565b3480156102cd57600080fd5b5061022c6102dc36600461592e565b610caa565b3480156102ed57600080fd5b506040805180820190915260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1908201525b60405161023d9190615a4b565b34801561033c57600080fd5b5061029461034b366004615730565b610de1565b34801561035c57600080fd5b5061029461036b366004615730565b610fb9565b34801561037c57600080fd5b506103236040518060400160405280600581526020017f322e302e3100000000000000000000000000000000000000000000000000000081525081565b3480156103c557600080fd5b506102666103d4366004615a5e565b611215565b3480156103e557600080fd5b506102056103f4366004615730565b611360565b34801561040557600080fd5b50610294610414366004615815565b6116c9565b34801561042557600080fd5b50610205610434366004615730565b6116f6565b610294610447366004615af7565b611a87565b34801561045857600080fd5b506102666104673660046156bf565b611ee5565b34801561047857600080fd5b50610294610487366004615730565b611f4a565b34801561049857600080fd5b506104c07f000000000000000000000000fc0000000000000000000000000000000000000281565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023d565b3480156104f157600080fd5b506102666105003660046156bf565b6120c1565b34801561051157600080fd5b50610266610520366004615661565b6120d6565b34801561053157600080fd5b50610294610540366004615815565b6122bb565b610205610553366004615af7565b6122e8565b34801561056457600080fd5b5061022c610573366004615b5e565b612758565b34801561058457600080fd5b506104c07f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e681565b3480156105b857600080fd5b506102946105c7366004615815565b612ab0565b3480156105d857600080fd5b5061022c6105e7366004615a5e565b612add565b3480156105f857600080fd5b5061060c610607366004615bd1565b612c2e565b6040805193845260208401929092529082015260600161023d565b61060c610635366004615661565b612d9c565b610294610648366004615af7565b61309e565b60008082428110156106c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b6106ef897f000000000000000000000000fc000000000000000000000000000000000000028a8a8a308a612758565b90935091506106ff898685613532565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561078757600080fd5b505af115801561079b573d6000803e3d6000fd5b505050506107a985836136c8565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f757400000060448201526000906064016106b7565b60608142811015610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000021686866108cb600182615c7c565b8181106108da576108da615c8f565b90506020020160208101906108ef9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6109ca7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b91508682600184516109dc9190615c7c565b815181106109ec576109ec615c8f565b60200260200101511015610a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b610b4786866000818110610a9857610a98615c8f565b9050602002016020810190610aad9190615cbe565b33610b277f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68a8a6000818110610ae557610ae5615c8f565b9050602002016020810190610afa9190615cbe565b8b8b6001818110610b0d57610b0d615c8f565b9050602002016020810190610b229190615cbe565b613a2b565b85600081518110610b3a57610b3a615c8f565b6020026020010151613b2e565b610b8682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ccd915050565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610bd19190615c7c565b81518110610be157610be1615c8f565b60200260200101516040518263ffffffff1660e01b8152600401610c0791815260200190565b600060405180830381600087803b158015610c2157600080fd5b505af1158015610c35573d6000803e3d6000fd5b50505050610c69848360018551610c4c9190615c7c565b81518110610c5c57610c5c615c8f565b60200260200101516136c8565b509695505050505050565b6060610ca17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484613ed8565b90505b92915050565b6000806000610cda7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68f8f613a2b565b9050600087610ce9578c610d0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b50505050610dc78f8f8f8f8f8f8f612758565b809450819550505050509b509b9950505050505050505050565b60608142811015610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b610eac7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b9150868260018451610ebe9190615c7c565b81518110610ece57610ece615c8f565b60200260200101511015610f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b610f7a86866000818110610a9857610a98615c8f565b610c6982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b60608142811015611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc0000000000000000000000000000000000000216868661106a600182615c7c565b81811061107957611079615c8f565b905060200201602081019061108e9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6111697f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150868260008151811061117f5761117f615c8f565b60200260200101511115610a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b6000806112637f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68d7f000000000000000000000000fc00000000000000000000000000000000000002613a2b565b9050600086611272578b611294565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b15801561132957600080fd5b505af115801561133d573d6000803e3d6000fd5b5050505061134f8d8d8d8d8d8d6120d6565b9d9c50505050505050505050505050565b80428110156113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b61145c858560008181106113e1576113e1615c8f565b90506020020160208101906113f69190615cbe565b336114567f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68989600081811061142e5761142e615c8f565b90506020020160208101906114439190615cbe565b8a8a6001818110610b0d57610b0d615c8f565b8a613b2e565b6000858561146b600182615c7c565b81811061147a5761147a615c8f565b905060200201602081019061148f9190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190615ce2565b9050611561868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250614421915050565b86818787611570600182615c7c565b81811061157f5761157f615c8f565b90506020020160208101906115949190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190615ce2565b6116319190615c7c565b10156116bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b5050505050505050565b6060610ca17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e684846137d7565b8042811015611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000021685856117a5600182615c7c565b8181106117b4576117b4615c8f565b90506020020160208101906117c99190615cbe565b73ffffffffffffffffffffffffffffffffffffffff1614611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b61185c858560008181106113e1576113e1615c8f565b61189a858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614421915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190615ce2565b9050868110156119dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b505050506116bf84826136c8565b60608142811015611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1686866000818110611b3e57611b3e615c8f565b9050602002016020810190611b539190615cbe565b73ffffffffffffffffffffffffffffffffffffffff1614611bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b611c2e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137d792505050565b9150868260018451611c409190615c7c565b81518110611c5057611c50615c8f565b60200260200101511015611ce6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e54000000000000000000000000000000000000000060648201526084016106b7565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611d3557611d35615c8f565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d6857600080fd5b505af1158015611d7c573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611df47f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68989600081811061142e5761142e615c8f565b84600081518110611e0757611e07615c8f565b60200260200101516040518363ffffffff1660e01b8152600401611e4d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e909190615cfb565b611e9c57611e9c6155fd565b611edb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e0000000060448201526000906064016106b7565b60608142811015611fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b6120157f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150868260008151811061202b5761202b615c8f565b60200260200101511115610f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b60006120ce8484846146fb565b949350505050565b60008142811015612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612172887f000000000000000000000000fc000000000000000000000000000000000000028989893089612758565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061221191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156121e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c9190615ce2565b613532565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561229957600080fd5b505af11580156122ad573d6000803e3d6000fd5b50505050610c6984836136c8565b6060610ca17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6848461418d565b8042811015612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff168585600081811061239d5761239d615c8f565b90506020020160208101906123b29190615cbe565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b60003490507f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6125287f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68989600081811061142e5761142e615c8f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190615cfb565b6125ca576125ca6155fd565b600086866125d9600182615c7c565b8181106125e8576125e8615c8f565b90506020020160208101906125fd9190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190615ce2565b90506126cf878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614421915050565b878188886126de600182615c7c565b8181106126ed576126ed615c8f565b90506020020160208101906127029190615cbe565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024016115e6565b60008082428110156127c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b60006127f37f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c8c613a2b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128939190615cfb565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292a9190615d18565b91509150600061293a8e8e61483d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461297757818361297a565b82825b90975095508a871015612a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b89861015612a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b505050505097509795505050505050565b6060610ca17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e684846149e7565b6000806000612b2d7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e7f000000000000000000000000fc00000000000000000000000000000000000002613a2b565b9050600087612b3c578c612b5e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612bf357600080fd5b505af1158015612c07573d6000803e3d6000fd5b50505050612c198e8e8e8e8e8e61064d565b909f909e509c50505050505050505050505050565b60008060008342811015612c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612cac8c8c8c8c8c8c614c2e565b90945092506000612cde7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e8e613a2b565b9050612cec8d338388613b2e565b612cf88c338387613b2e565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8a9190615ce2565b92505050985098509895505050505050565b60008060008342811015612e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b612e3a8a7f000000000000000000000000fc000000000000000000000000000000000000028b348c8c614c2e565b90945092506000612e8c7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c7f000000000000000000000000fc00000000000000000000000000000000000002613a2b565b9050612e9a8b338388613b2e565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f0257600080fd5b505af1158015612f16573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000fc0000000000000000000000000000000000000216935063a9059cbb925060440190506020604051808303816000875af1158015612fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd59190615cfb565b612fe157612fe16155fd565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130739190615ce2565b925083341115613090576130903361308b8634615c7c565b6136c8565b505096509650969350505050565b6060814281101561310b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064016106b7565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff168686600081811061315557613155615c8f565b905060200201602081019061316a9190615cbe565b73ffffffffffffffffffffffffffffffffffffffff16146131e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f50415448000060448201526064016106b7565b6132457f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061418d92505050565b9150348260008151811061325b5761325b615c8f565b602002602001015111156132f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106b7565b7f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061334057613340615c8f565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561337357600080fd5b505af1158015613387573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133ff7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68989600081811061142e5761142e615c8f565b8460008151811061341257613412615c8f565b60200260200101516040518363ffffffff1660e01b815260040161345892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015613477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349b9190615cfb565b6134a7576134a76155fd565b6134e682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ccd915050565b816000815181106134f9576134f9615c8f565b6020026020010151341115611edb57611edb338360008151811061351f5761351f615c8f565b60200260200101513461308b9190615c7c565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135c99190615d3c565b6000604051808303816000865af19150503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b50915091508180156136355750805115806136355750808060200190518101906136359190615cfb565b6136c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016106b7565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136ff9190615d3c565b60006040518083038185875af1925050503d806000811461373c576040519150601f19603f3d011682016040523d82523d6000602084013e613741565b606091505b50509050806137d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016106b7565b505050565b606060028251101561386b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115613885576138856157e6565b6040519080825280602002602001820160405280156138ae578160200160208202803683370190505b50905082816000815181106138c5576138c5615c8f565b60200260200101818152505060005b600183516138e29190615c7c565b811015613a235760006139348685848151811061390157613901615c8f565b6020026020010151868560016139179190615d58565b8151811061392757613927615c8f565b6020026020010151613a2b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561399e57600080fd5b505af11580156139b2573d6000803e3d6000fd5b505050506139f3818484815181106139cc576139cc615c8f565b60200260200101518685815181106139e6576139e6615c8f565b6020026020010151614f8d565b836139ff846001615d58565b81518110613a0f57613a0f615c8f565b6020908102919091010152506001016138d4565b509392505050565b6000806000613a3a858561483d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613aee94939101615d6b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613bcd9190615d3c565b6000604051808303816000865af19150503d8060008114613c0a576040519150601f19603f3d011682016040523d82523d6000602084013e613c0f565b606091505b5091509150818015613c39575080511580613c39575080806020019051810190613c399190615cfb565b613cc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016106b7565b505050505050565b60005b60018351613cde9190615c7c565b811015613ed257600080848381518110613cfa57613cfa615c8f565b602002602001015185846001613d109190615d58565b81518110613d2057613d20615c8f565b6020026020010151915091506000613d38838361483d565b509050600087613d49866001615d58565b81518110613d5957613d59615c8f565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613da157826000613da5565b6000835b91509150600060028a51613db99190615c7c565b8810613dc55788613df6565b613df67f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6878c6139178c6002615d58565b9050613e237f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68888613a2b565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e6d576020820181803683370190505b506040518563ffffffff1660e01b8152600401613e8d9493929190615de3565b600060405180830381600087803b158015613ea757600080fd5b505af1158015613ebb573d6000803e3d6000fd5b505060019099019850613cd0975050505050505050565b50505050565b6060600282511015613f6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115613f8657613f866157e6565b604051908082528060200260200182016040528015613faf578160200160208202803683370190505b509050828160018351613fc29190615c7c565b81518110613fd257613fd2615c8f565b602002602001018181525050600060018351613fee9190615c7c565b90505b8015613a235760006140338685614009600186615c7c565b8151811061401957614019615c8f565b602002602001015186858151811061392757613927615c8f565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a49190615cfb565b61410a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f66206461746500000000000000000000000000000060448201526064016106b7565b6141538184848151811061412057614120615c8f565b6020026020010151866001866141369190615c7c565b8151811061414657614146615c8f565b60200260200101516151e1565b8361415f600185615c7c565b8151811061416f5761416f615c8f565b6020908102919091010152508061418581615e28565b915050613ff1565b6060600282511015614221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff81111561423b5761423b6157e6565b604051908082528060200260200182016040528015614264578160200160208202803683370190505b5090508281600183516142779190615c7c565b8151811061428757614287615c8f565b6020026020010181815250506000600183516142a39190615c7c565b90505b8015613a235760006142be8685614009600186615c7c565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561432857600080fd5b505af115801561433c573d6000803e3d6000fd5b505050506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561438e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143b29190615e8f565b50915091506143e3838686815181106143cd576143cd615c8f565b6020026020010151886001886141369190615c7c565b856143ef600187615c7c565b815181106143ff576143ff615c8f565b602002602001018181525050505050808061441990615e28565b9150506142a6565b60005b600183516144329190615c7c565b8110156137d25760008084838151811061444e5761444e615c8f565b6020026020010151858460016144649190615d58565b8151811061447457614474615c8f565b602002602001015191509150600061448c838361483d565b50905060006144bc7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68585613a2b565b90506000806000806000806144f27f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68b8b61543a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa15801561456e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145929190615ce2565b61459c9190615c7c565b6145a69190615c7c565b95506145b387878c614f8d565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146145f7578260006145fb565b6000835b91509150600060028c5161460f9190615c7c565b8a1061461b578a61464c565b61464c7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898e6139178e6002615d58565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906146b49086908690869060248101615de3565b600060405180830381600087803b1580156146ce57600080fd5b505af11580156146e2573d6000803e3d6000fd5b50506001909b019a506144249950505050505050505050565b600080841161478c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e540000000000000000000000000000000000000000000060648201526084016106b7565b60008311801561479c5750600082115b614828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c49515549444954590000000000000000000000000000000000000060648201526084016106b7565b826148338386615ed2565b6120ce9190615ee9565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036148fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f4144445245535345530000000000000000000000000000000000000000000060648201526084016106b7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614935578284614938565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166149e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f455353000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b9250929050565b6060600282511015614a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f415448000000000000000000000000000000000000000000000000000000000060648201526084016106b7565b815167ffffffffffffffff811115614a9557614a956157e6565b604051908082528060200260200182016040528015614abe578160200160208202803683370190505b5090508281600081518110614ad557614ad5615c8f565b60200260200101818152505060005b60018351614af29190615c7c565b811015613a23576000614b118685848151811061390157613901615c8f565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b829190615cfb565b614be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f66206461746500000000000000000000000000000060448201526064016106b7565b614bfe818484815181106139cc576139cc615c8f565b83614c0a846001615d58565b81518110614c1a57614c1a615c8f565b602090810291909101015250600101614ae4565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e69091169063e6a4390590604401602060405180830381865afa158015614ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cef9190615f24565b73ffffffffffffffffffffffffffffffffffffffff1603614dc6576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6169063c9c65396906044016020604051808303816000875af1158015614da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dc49190615f24565b505b600080614df47f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68b8b61543a565b505091509150816000148015614e08575080155b15614e1857879350869250614f80565b6000614e258984846146fb565b9050878111614ec95785811015614ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b889450925082614f7e565b6000614ed68984866146fb565b905089811115614ee857614ee86155fd565b87811015614f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e540000000000000000000000000000000000000000000000000060648201526084016106b7565b94508793505b505b5050965096945050505050565b6000808490506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150059190615e8f565b50915091506000808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015615058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061507c9190615f24565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146150b55782846150b8565b83835b915091506000881180156150dc57506000826dffffffffffffffffffffffffffff16115b80156150f857506000816dffffffffffffffffffffffffffff16115b61510157600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561514e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151729190615ce2565b61517c908a615ed2565b9050600061519a6dffffffffffffffffffffffffffff841683615ed2565b90506000826151bb6dffffffffffffffffffffffffffff8716612710615ed2565b6151c59190615d58565b90506151d18183615ee9565b9c9b505050505050505050505050565b6000808490506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152599190615e8f565b50915091506000808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156152ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152d09190615f24565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461530957828461530c565b83835b9150915060008811801561533057506000826dffffffffffffffffffffffffffff16115b801561534c57506000816dffffffffffffffffffffffffffff16115b61535557600080fd5b6000615371896dffffffffffffffffffffffffffff8516615ed2565b61537d90612710615ed2565b905060008673ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156153cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153f09190615ce2565b61540a8b6dffffffffffffffffffffffffffff8616615c7c565b6154149190615ed2565b90506154208183615ee9565b61542b906001615d58565b9b9a5050505050505050505050565b600080600080600061544c878761483d565b509050600061545c898989613a2b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156154c657600080fd5b505af11580156154da573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa15801561552f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155539190615f41565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146155d957828482846155de565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461564e57600080fd5b50565b803561565c8161562c565b919050565b60008060008060008060c0878903121561567a57600080fd5b86356156858161562c565b955060208701359450604087013593506060870135925060808701356156aa8161562c565b9598949750929591949360a090920135925050565b6000806000606084860312156156d457600080fd5b505081359360208301359350604090920135919050565b60008083601f8401126156fd57600080fd5b50813567ffffffffffffffff81111561571557600080fd5b6020830191508360208260051b85010111156149e057600080fd5b60008060008060008060a0878903121561574957600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561576e57600080fd5b61577a89828a016156eb565b909550935050606087013561578e8161562c565b95989497509295919493608090920135925050565b602080825282518282018190526000918401906040840190835b818110156157db5783518352602093840193909201916001016157bd565b509095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561582857600080fd5b82359150602083013567ffffffffffffffff81111561584657600080fd5b8301601f8101851361585757600080fd5b803567ffffffffffffffff811115615871576158716157e6565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff821117156158bc576158bc6157e6565b6040529182526020818401810192908101888411156158da57600080fd5b6020850194505b83851015615900576158f285615651565b8152602094850194016158e1565b50809450505050509250929050565b801515811461564e57600080fd5b803560ff8116811461565c57600080fd5b60008060008060008060008060008060006101608c8e03121561595057600080fd5b8b3561595b8161562c565b9a5060208c013561596b8161562c565b995060408c0135985060608c0135975060808c0135965060a08c01356159908161562c565b955060c08c0135945060e08c01356159a78161590f565b93506159b66101008d0161591d565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b60005b838110156159f85781810151838201526020016159e0565b50506000910152565b60008151808452615a198160208601602086016159dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ca16020830184615a01565b6000806000806000806000806000806101408b8d031215615a7e57600080fd5b8a35615a898161562c565b995060208b0135985060408b0135975060608b0135965060808b0135615aae8161562c565b955060a08b0135945060c08b0135615ac58161590f565b9350615ad360e08c0161591d565b999c989b509699959894979396509194610100810135936101209091013592509050565b600080600080600060808688031215615b0f57600080fd5b85359450602086013567ffffffffffffffff811115615b2d57600080fd5b615b39888289016156eb565b9095509350506040860135615b4d8161562c565b949793965091946060013592915050565b600080600080600080600060e0888a031215615b7957600080fd5b8735615b848161562c565b96506020880135615b948161562c565b955060408801359450606088013593506080880135925060a0880135615bb98161562c565b96999598509396929591949193505060c09091013590565b600080600080600080600080610100898b031215615bee57600080fd5b8835615bf98161562c565b97506020890135615c098161562c565b965060408901359550606089013594506080890135935060a0890135925060c0890135615c358161562c565b979a969950949793969295919450919260e001359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610ca457610ca4615c4d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215615cd057600080fd5b8135615cdb8161562c565b9392505050565b600060208284031215615cf457600080fd5b5051919050565b600060208284031215615d0d57600080fd5b8151615cdb8161590f565b60008060408385031215615d2b57600080fd5b505080516020909101519092909150565b60008251615d4e8184602087016159dd565b9190910192915050565b80820180821115610ca457610ca4615c4d565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600182015282601582015260008251615dd48160358501602087016159dd565b91909101603501949350505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615e1e6080830184615a01565b9695505050505050565b600081615e3757615e37615c4d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff8116811461565c57600080fd5b805163ffffffff8116811461565c57600080fd5b600080600060608486031215615ea457600080fd5b615ead84615e5d565b9250615ebb60208501615e5d565b9150615ec960408501615e7b565b90509250925092565b8082028115828204841417610ca457610ca4615c4d565b600082615f1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615f3657600080fd5b8151615cdb8161562c565b60008060008060008060c08789031215615f5a57600080fd5b615f6387615e5d565b9550615f7160208801615e5d565b9450615f7f60408801615e7b565b9350615f8d60608801615e5d565b9250615f9b60808801615e5d565b9150600060a0880151905080915050929550929550929556
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : _factory (address): 0xE30521fe7f3bEB6Ad556887b50739d6C7CA667E6
Arg [1] : _WETH (address): 0xFc00000000000000000000000000000000000002
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6
Arg [1] : 000000000000000000000000fc00000000000000000000000000000000000002
Deployed Bytecode Sourcemap
26274:18793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26757:10;:18;26771:4;26757:18;;26750:26;;;;:::i;:::-;26274:18793;;;;;30998:653;;;;;;;;;;-1:-1:-1;30998:653:0;;;;;:::i;:::-;;:::i;:::-;;;;1551:25:1;;;1607:2;1592:18;;1585:34;;;;1524:18;30998:653:0;;;;;;;;43673:238;;;;;;;;;;-1:-1:-1;43673:238:0;;;;;:::i;:::-;;:::i;:::-;;;2247:25:1;;;2235:2;2220:18;43673:238:0;2101:177:1;38085:835:0;;;;;;;;;;-1:-1:-1;38085:835:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;44395:230::-;;;;;;;;;;-1:-1:-1;44395:230:0;;;;;:::i;:::-;;:::i;31656:673::-;;;;;;;;;;-1:-1:-1;31656:673:0;;;;;:::i;:::-;;:::i;26844:126::-;;;;;;;;;;-1:-1:-1;26927:36:0;;;;;;;;;;;;;;;;;;26844:126;;;;;;;:::i;35324:635::-;;;;;;;;;;-1:-1:-1;35324:635:0;;;;;:::i;:::-;;:::i;37267:813::-;;;;;;;;;;-1:-1:-1;37267:813:0;;;;;:::i;:::-;;:::i;26421:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33761:713;;;;;;;;;;-1:-1:-1;33761:713:0;;;;;:::i;:::-;;:::i;41099:701::-;;;;;;;;;;-1:-1:-1;41099:701:0;;;;;:::i;:::-;;:::i;44631:214::-;;;;;;;;;;-1:-1:-1;44631:214:0;;;;;:::i;:::-;;:::i;42622:813::-;;;;;;;;;;-1:-1:-1;42622:813:0;;;;;:::i;:::-;;:::i;36582:680::-;;;;;;:::i;:::-;;:::i;43917:236::-;;;;;;;;;;-1:-1:-1;43917:236:0;;;;;:::i;:::-;;:::i;35964:613::-;;;;;;;;;;-1:-1:-1;35964:613:0;;;;;:::i;:::-;;:::i;26376:38::-;;;;;;;;;;;;;;;;;;10811:42:1;10799:55;;;10781:74;;10769:2;10754:18;26376:38:0;10635:226:1;43476:191:0;;;;;;;;;;-1:-1:-1;43476:191:0;;;;;:::i;:::-;;:::i;33076:680::-;;;;;;;;;;-1:-1:-1;33076:680:0;;;;;:::i;:::-;;:::i;44851:214::-;;;;;;;;;;-1:-1:-1;44851:214:0;;;;;:::i;:::-;;:::i;41805:812::-;;;;;;:::i;:::-;;:::i;30134:859::-;;;;;;;;;;-1:-1:-1;30134:859:0;;;;;:::i;:::-;;:::i;26329:41::-;;;;;;;;;;;;;;;44159:230;;;;;;;;;;-1:-1:-1;44159:230:0;;;;;:::i;:::-;;:::i;32334:666::-;;;;;;;;;;-1:-1:-1;32334:666:0;;;;;:::i;:::-;;:::i;28407:727::-;;;;;;;;;;-1:-1:-1;28407:727:0;;;;;:::i;:::-;;:::i;:::-;;;;13225:25:1;;;13281:2;13266:18;;13259:34;;;;13309:18;;;13302:34;13213:2;13198:18;28407:727:0;13023:319:1;29139:955:0;;;;;;:::i;:::-;;:::i;38925:791::-;;;;;;:::i;:::-;;:::i;30998:653::-;31228:16;31246:14;31209:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;;;;;;;;;31299:188:::1;31328:5;31347:4;31365:9;31388:14;31416:12;31450:4;31469:8;31299:15;:188::i;:::-;31272:215:::0;;-1:-1:-1;31272:215:0;-1:-1:-1;31497:51:0::1;31525:5:::0;31532:2;31272:215;31497:27:::1;:51::i;:::-;31558:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;31564:4:0::1;31558:20;;::::0;::::1;::::0;2220:18:1;;31558:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31599:45;31630:2;31634:9;31599:30;:45::i;:::-;30998:653:::0;;;;;;;;;;:::o;43673:238::-;43831:39;;;;;13903:2:1;43831:39:0;;;13885:21:1;13942:2;13922:18;;;13915:30;13981:31;13961:18;;;13954:59;43801:14:0;;14030:18:1;;43831:39:0;13701:353:1;38085:835:0;38274:21;38251:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;38319:29:::1;38344:4;38319:29;:4:::0;;38324:15:::1;38338:1;38319:4:::0;38324:15:::1;:::i;:::-;38319:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;38311:72;;;::::0;::::1;::::0;;15024:2:1;38311:72:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;38311:72:0::1;14822:354:1::0;38311:72:0::1;38403:69;38448:7;38457:8;38467:4;;38403:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38403:44:0::1;::::0;-1:-1:-1;;;38403:69:0:i:1;:::-;38393:79;;38521:12;38490:7;38515:1;38498:7;:14;:18;;;;:::i;:::-;38490:27;;;;;;;;:::i;:::-;;;;;;;:43;;38482:100;;;::::0;::::1;::::0;;15383:2:1;38482:100:0::1;::::0;::::1;15365:21:1::0;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;15532:14;15512:18;;;15505:42;15564:19;;38482:100:0::1;15181:408:1::0;38482:100:0::1;38592:144;38637:4;;38642:1;38637:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38646:10;38658:56;38688:7;38697:4;;38702:1;38697:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38706:4;;38711:1;38706:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38658:29;:56::i;:::-;38716:7;38724:1;38716:10;;;;;;;;:::i;:::-;;;;;;;38592:31;:144::i;:::-;38746:35;38752:7;38761:4;;38746:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38775:4:0::1;::::0;-1:-1:-1;38746:5:0::1;::::0;-1:-1:-1;;38746:35:0:i:1;:::-;38797:4;38791:20;;;38812:7;38837:1;38820:7;:14;:18;;;;:::i;:::-;38812:27;;;;;;;;:::i;:::-;;;;;;;38791:49;;;;;;;;;;;;;2247:25:1::0;;2235:2;2220:18;;2101:177;38791:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38850:63;38881:2;38885:7;38910:1;38893:7;:14;:18;;;;:::i;:::-;38885:27;;;;;;;;:::i;:::-;;;;;;;38850:30;:63::i;:::-;38085:835:::0;;;;;;;;;:::o;44395:230::-;44514:21;44558:60;44593:7;44602:9;44613:4;44558:34;:60::i;:::-;44551:67;;44395:230;;;;;:::o;31656:673::-;31953:12;31967;31991;32006:54;32036:7;32045:6;32053;32006:29;:54::i;:::-;31991:69;;32070:10;32083;:39;;32113:9;32083:39;;;32096:14;32083:39;32132:79;;;;;32159:10;32132:79;;;15905:74:1;32179:4:0;15995:18:1;;;15988:83;16087:18;;;16080:34;;;16130:18;;;16123:34;;;16206:4;16194:17;;16173:19;;;16166:46;16228:19;;;16221:35;;;16272:19;;;16265:35;;;32070:52:0;;-1:-1:-1;32132:26:0;;;;;;15877:19:1;;32132:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32242:80;32258:6;32266;32274:9;32285:10;32297;32309:2;32313:8;32242:15;:80::i;:::-;32221:101;;;;;;;;31981:348;;31656:673;;;;;;;;;;;;;;:::o;35324:635::-;35542:21;35523:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;35585:69:::1;35630:7;35639:8;35649:4;;35585:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35585:44:0::1;::::0;-1:-1:-1;;;35585:69:0:i:1;:::-;35575:79;;35703:12;35672:7;35697:1;35680:7;:14;:18;;;;:::i;:::-;35672:27;;;;;;;;:::i;:::-;;;;;;;:43;;35664:100;;;::::0;::::1;::::0;;15383:2:1;35664:100:0::1;::::0;::::1;15365:21:1::0;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;15532:14;15512:18;;;15505:42;15564:19;;35664:100:0::1;15181:408:1::0;35664:100:0::1;35774:144;35819:4;;35824:1;35819:7;;;;;;;:::i;35774:144::-;35928:24;35934:7;35943:4;;35928:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35949:2:0;;-1:-1:-1;35928:5:0::1;::::0;-1:-1:-1;;35928:24:0:i:1;37267:813::-:0;37456:21;37433:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;37501:29:::1;37526:4;37501:29;:4:::0;;37506:15:::1;37520:1;37501:4:::0;37506:15:::1;:::i;:::-;37501:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;37493:72;;;::::0;::::1;::::0;;15024:2:1;37493:72:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;37493:72:0::1;14822:354:1::0;37493:72:0::1;37585:69;37629:7;37638:9;37649:4;;37585:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37585:43:0::1;::::0;-1:-1:-1;;;37585:69:0:i:1;:::-;37575:79;;37686:11;37672:7;37680:1;37672:10;;;;;;;;:::i;:::-;;;;;;;:25;;37664:78;;;::::0;::::1;::::0;;16513:2:1;37664:78:0::1;::::0;::::1;16495:21:1::0;16552:2;16532:18;;;16525:30;16591:34;16571:18;;;16564:62;16662:10;16642:18;;;16635:38;16690:19;;37664:78:0::1;16311:404:1::0;33761:713:0;34071:14;34097:12;34112:51;34142:7;34151:5;34158:4;34112:29;:51::i;:::-;34097:66;;34173:10;34186;:39;;34216:9;34186:39;;;34199:14;34186:39;34235:79;;;;;34262:10;34235:79;;;15905:74:1;34282:4:0;15995:18:1;;;15988:83;16087:18;;;16080:34;;;16130:18;;;16123:34;;;16206:4;16194:17;;16173:19;;;16166:46;16228:19;;;16221:35;;;16272:19;;;16265:35;;;34173:52:0;;-1:-1:-1;34235:26:0;;;;;;15877:19:1;;34235:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34336:131;34397:5;34404:9;34415:14;34431:12;34445:2;34449:8;34336:47;:131::i;:::-;34324:143;33761:713;-1:-1:-1;;;;;;;;;;;;;33761:713:0:o;41099:701::-;41327:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;41347:142:::1;41392:4;;41397:1;41392:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41401:10;41413:56;41443:7;41452:4;;41457:1;41452:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41461:4;;41466:1;41461:7;;;;;;;:::i;41413:56::-;41471:8;41347:31;:142::i;:::-;41499:18;41527:4:::0;;41532:15:::1;41546:1;41527:4:::0;41532:15:::1;:::i;:::-;41527:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41520:43;::::0;;;;:39:::1;10799:55:1::0;;;41520:43:0::1;::::0;::::1;10781:74:1::0;41520:39:0;;;::::1;::::0;::::1;::::0;10754:18:1;;41520:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41499:64;;41573:44;41608:4;;41573:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41614:2:0;;-1:-1:-1;41573:34:0::1;::::0;-1:-1:-1;;41573:44:0:i:1;:::-;41711:12:::0;41694:13;41655:4;;41660:15:::1;41674:1;41655:4:::0;41660:15:::1;:::i;:::-;41655:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41648:43;::::0;;;;:39:::1;10799:55:1::0;;;41648:43:0::1;::::0;::::1;10781:74:1::0;41648:39:0;;;::::1;::::0;::::1;::::0;10754:18:1;;41648:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;41627:166;;;::::0;::::1;::::0;;15383:2:1;41627:166:0::1;::::0;::::1;15365:21:1::0;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;15532:14;15512:18;;;15505:42;15564:19;;41627:166:0::1;15181:408:1::0;41627:166:0::1;41337:463;41099:701:::0;;;;;;;:::o;44631:214::-;44725:21;44769:69;44814:7;44823:8;44833:4;44769:44;:69::i;42622:813::-;42863:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;42895:29:::1;42920:4;42895:29;:4:::0;;42900:15:::1;42914:1;42895:4:::0;42900:15:::1;:::i;:::-;42895:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;42887:72;;;::::0;::::1;::::0;;15024:2:1;42887:72:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;42887:72:0::1;14822:354:1::0;42887:72:0::1;42969:142;43014:4;;43019:1;43014:7;;;;;;;:::i;42969:142::-;43121:55;43156:4;;43121:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43170:4:0::1;::::0;-1:-1:-1;43121:34:0::1;::::0;-1:-1:-1;;43121:55:0:i:1;:::-;43203:37;::::0;;;;43234:4:::1;43203:37;::::0;::::1;10781:74:1::0;43186:14:0::1;::::0;43210:4:::1;43203:22;;::::0;::::1;::::0;10754:18:1;;43203:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43186:54;;43271:12;43258:9;:25;;43250:82;;;::::0;::::1;::::0;;15383:2:1;43250:82:0::1;::::0;::::1;15365:21:1::0;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;15532:14;15512:18;;;15505:42;15564:19;;43250:82:0::1;15181:408:1::0;43250:82:0::1;43342:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;43348:4:0::1;43342:20;;::::0;::::1;::::0;2220:18:1;;43342:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43383:45;43414:2;43418:9;43383:30;:45::i;36582:680::-:0;36768:21;36745:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;36824:4:::1;36813:15;;:4;;36818:1;36813:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;36805:58;;;::::0;::::1;::::0;;15024:2:1;36805:58:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;36805:58:0::1;14822:354:1::0;36805:58:0::1;36883:70;36928:7;36937:9;36948:4;;36883:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36883:44:0::1;::::0;-1:-1:-1;;;36883:70:0:i:1;:::-;36873:80;;37002:12;36971:7;36996:1;36979:7;:14;:18;;;;:::i;:::-;36971:27;;;;;;;;:::i;:::-;;;;;;;:43;;36963:100;;;::::0;::::1;::::0;;15383:2:1;36963:100:0::1;::::0;::::1;15365:21:1::0;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;15532:14;15512:18;;;15505:42;15564:19;;36963:100:0::1;15181:408:1::0;36963:100:0::1;37079:4;37073:19;;;37100:7;37108:1;37100:10;;;;;;;;:::i;:::-;;;;;;;37073:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37136:4;37130:20;;;37151:56;37181:7;37190:4;;37195:1;37190:7;;;;;;;:::i;37151:56::-;37209:7;37217:1;37209:10;;;;;;;;:::i;:::-;;;;;;;37130:90;;;;;;;;;;;;;;;17159:42:1::0;17147:55;;;;17129:74;;17234:2;17219:18;;17212:34;17117:2;17102:18;;16955:297;37130:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37123:98;;;;:::i;:::-;37231:24;37237:7;37246:4;;37231:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37252:2:0;;-1:-1:-1;37231:5:0::1;::::0;-1:-1:-1;;37231:24:0:i:1;:::-;36582:680:::0;;;;;;;;:::o;43917:236::-;44074:38;;;;;17709:2:1;44074:38:0;;;17691:21:1;17748:2;17728:18;;;17721:30;17787;17767:18;;;17760:58;44045:13:0;;17835:18:1;;44074:38:0;17507:352:1;35964:613:0;36182:21;36163:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;36225:69:::1;36269:7;36278:9;36289:4;;36225:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36225:43:0::1;::::0;-1:-1:-1;;;36225:69:0:i:1;:::-;36215:79;;36326:11;36312:7;36320:1;36312:10;;;;;;;;:::i;:::-;;;;;;;:25;;36304:78;;;::::0;::::1;::::0;;16513:2:1;36304:78:0::1;::::0;::::1;16495:21:1::0;16552:2;16532:18;;;16525:30;16591:34;16571:18;;;16564:62;16662:10;16642:18;;;16635:38;16690:19;;36304:78:0::1;16311:404:1::0;43476:191:0;43573:12;43604:56;43632:7;43641:8;43651;43604:27;:56::i;:::-;43597:63;43476:191;-1:-1:-1;;;;43476:191:0:o;33076:680::-;33335:14;33316:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;33377:188:::1;33406:5;33425:4;33443:9;33466:14;33494:12;33528:4;33547:8;33377:15;:188::i;:::-;33614:38;::::0;;;;33646:4:::1;33614:38;::::0;::::1;10781:74:1::0;33361:204:0;;-1:-1:-1;33575:78:0::1;::::0;-1:-1:-1;33603:5:0;;33610:2;;33614:23:::1;::::0;::::1;::::0;::::1;::::0;10754:18:1;;33614:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33575:27;:78::i;:::-;33663:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;33669:4:0::1;33663:20;;::::0;::::1;::::0;2220:18:1;;33663:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33704:45;33735:2;33739:9;33704:30;:45::i;44851:214::-:0;44945:21;44989:69;45033:7;45042:9;45053:4;44989:43;:69::i;41805:812::-;42035:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;42078:4:::1;42067:15;;:4;;42072:1;42067:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;42059:58;;;::::0;::::1;::::0;;15024:2:1;42059:58:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;42059:58:0::1;14822:354:1::0;42059:58:0::1;42127:13;42143:9;42127:25;;42168:4;42162:19;;;42189:8;42162:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42223:4;42217:20;;;42238:56;42268:7;42277:4;;42282:1;42277:7;;;;;;;:::i;42238:56::-;42217:88;::::0;;::::1;::::0;;;;;;17159:42:1;17147:55;;;42217:88:0::1;::::0;::::1;17129:74:1::0;17219:18;;;17212:34;;;17102:18;;42217:88:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42210:96;;;;:::i;:::-;42316:18;42344:4:::0;;42349:15:::1;42363:1;42344:4:::0;42349:15:::1;:::i;:::-;42344:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42337:43;::::0;;;;:39:::1;10799:55:1::0;;;42337:43:0::1;::::0;::::1;10781:74:1::0;42337:39:0;;;::::1;::::0;::::1;::::0;10754:18:1;;42337:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42316:64;;42390:44;42425:4;;42390:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42431:2:0;;-1:-1:-1;42390:34:0::1;::::0;-1:-1:-1;;42390:44:0:i:1;:::-;42528:12:::0;42511:13;42472:4;;42477:15:::1;42491:1;42472:4:::0;42477:15:::1;:::i;:::-;42472:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42465:43;::::0;;;;:39:::1;10799:55:1::0;;;42465:43:0::1;::::0;::::1;10781:74:1::0;42465:39:0;;;::::1;::::0;::::1;::::0;10754:18:1;;42465:43:0::1;10635:226:1::0;30134:859:0;30380:12;30394;30361:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;30418:12:::1;30433:54;30463:7;30472:6;30480;30433:29;:54::i;:::-;30497:61;::::0;;;;30530:10:::1;30497:61;::::0;::::1;18066:74:1::0;30497:32:0::1;::::0;::::1;18156:18:1::0;;;18149:83;;;18248:18;;;18241:34;;;30418:69:0;;-1:-1:-1;30497:32:0::1;::::0;18039:18:1;;30497:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;30625:28:0::1;::::0;;;;:24:::1;10799:55:1::0;;;30625:28:0::1;::::0;::::1;10781:74:1::0;30595:12:0::1;::::0;;;30625:24;::::1;::::0;::::1;::::0;10754:18:1;;30625:28:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30594:59;;;;30664:14;30683:48;30716:6;30724;30683:32;:48::i;:::-;30663:68;;;30772:6;30762:16;;:6;:16;;;:58;;30803:7;30812;30762:58;;;30782:7;30791;30762:58;30741:79:::0;;-1:-1:-1;30741:79:0;-1:-1:-1;30838:21:0;;::::1;;30830:73;;;::::0;::::1;::::0;;18836:2:1;30830:73:0::1;::::0;::::1;18818:21:1::0;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;18985:9;18965:18;;;18958:37;19012:19;;30830:73:0::1;18634:403:1::0;30830:73:0::1;30932:10;30921:7;:21;;30913:73;;;::::0;::::1;::::0;;19244:2:1;30913:73:0::1;::::0;::::1;19226:21:1::0;19283:2;19263:18;;;19256:30;19322:34;19302:18;;;19295:62;19393:9;19373:18;;;19366:37;19420:19;;30913:73:0::1;19042:403:1::0;30913:73:0::1;30408:585;;;;30134:859:::0;;;;;;;;;;;:::o;44159:230::-;44278:21;44322:60;44358:7;44367:8;44377:4;44322:35;:60::i;32334:666::-;32615:16;32633:14;32659:12;32674:51;32704:7;32713:5;32720:4;32674:29;:51::i;:::-;32659:66;;32735:10;32748;:39;;32778:9;32748:39;;;32761:14;32748:39;32797:79;;;;;32824:10;32797:79;;;15905:74:1;32844:4:0;15995:18:1;;;15988:83;16087:18;;;16080:34;;;16130:18;;;16123:34;;;16206:4;16194:17;;16173:19;;;16166:46;16228:19;;;16221:35;;;16272:19;;;16265:35;;;32735:52:0;;-1:-1:-1;32797:26:0;;;;;;15877:19:1;;32797:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32913:80;32932:5;32939:9;32950:14;32966:12;32980:2;32984:8;32913:18;:80::i;:::-;32886:107;;;;-1:-1:-1;32334:666:0;-1:-1:-1;;;;;;;;;;;;;32334:666:0:o;28407:727::-;28686:12;28700;28714:14;28667:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;28761:85:::1;28775:6;28783;28791:14;28807;28823:10;28835;28761:13;:85::i;:::-;28740:106:::0;;-1:-1:-1;28740:106:0;-1:-1:-1;28856:12:0::1;28871:54;28901:7;28910:6:::0;28918;28871:29:::1;:54::i;:::-;28856:69;;28935:66;28967:6;28975:10;28987:4;28993:7;28935:31;:66::i;:::-;29011;29043:6;29051:10;29063:4;29069:7;29011:31;:66::i;:::-;29099:28;::::0;;;;:24:::1;10799:55:1::0;;;29099:28:0::1;::::0;::::1;10781:74:1::0;29099:24:0;::::1;::::0;::::1;::::0;10754:18:1;;29099:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29087:40;;28730:404;28407:727:::0;;;;;;;;;;;;;:::o;29139:955::-;29385:16;29403:14;29419;29366:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;29472:169:::1;29499:5;29518:4;29536:18;29568:9;29591:14;29619:12;29472:13;:169::i;:::-;29445:196:::0;;-1:-1:-1;29445:196:0;-1:-1:-1;29651:12:0::1;29666:51;29696:7;29705:5:::0;29712:4:::1;29666:29;:51::i;:::-;29651:66;;29727:69;29759:5;29766:10;29778:4;29784:11;29727:31;:69::i;:::-;29812:4;29806:19;;;29833:9;29806:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29862:37:0::1;::::0;;;;:20:::1;17147:55:1::0;;;29862:37:0::1;::::0;::::1;17129:74:1::0;17219:18;;;17212:34;;;29868:4:0::1;29862:20;::::0;-1:-1:-1;29862:20:0::1;::::0;-1:-1:-1;17102:18:1;;;-1:-1:-1;29862:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29855:45;;;;:::i;:::-;29922:28;::::0;;;;:24:::1;10799:55:1::0;;;29922:28:0::1;::::0;::::1;10781:74:1::0;29922:24:0;::::1;::::0;::::1;::::0;10754:18:1;;29922:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29910:40;;30011:9;29999;:21;29995:92;;;30022:65;30053:10;30065:21;30077:9:::0;30065::::1;:21;:::i;:::-;30022:30;:65::i;:::-;29435:659;29139:955:::0;;;;;;;;;;;:::o;38925:791::-;39108:21;39085:8;26529:15;26517:8;:27;;26509:65;;;;;;;13549:2:1;26509:65:0;;;13531:21:1;13588:2;13568:18;;;13561:30;13627:27;13607:18;;;13600:55;13672:18;;26509:65:0;13347:349:1;26509:65:0;39164:4:::1;39153:15;;:4;;39158:1;39153:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;39145:58;;;::::0;::::1;::::0;;15024:2:1;39145:58:0::1;::::0;::::1;15006:21:1::0;15063:2;15043:18;;;15036:30;15102:32;15082:18;;;15075:60;15152:18;;39145:58:0::1;14822:354:1::0;39145:58:0::1;39223:69;39267:7;39276:9;39287:4;;39223:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39223:43:0::1;::::0;-1:-1:-1;;;39223:69:0:i:1;:::-;39213:79;;39324:9;39310:7;39318:1;39310:10;;;;;;;;:::i;:::-;;;;;;;:23;;39302:76;;;::::0;::::1;::::0;;16513:2:1;39302:76:0::1;::::0;::::1;16495:21:1::0;16552:2;16532:18;;;16525:30;16591:34;16571:18;;;16564:62;16662:10;16642:18;;;16635:38;16690:19;;39302:76:0::1;16311:404:1::0;39302:76:0::1;39394:4;39388:19;;;39415:7;39423:1;39415:10;;;;;;;;:::i;:::-;;;;;;;39388:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;39451:4;39445:20;;;39466:56;39496:7;39505:4;;39510:1;39505:7;;;;;;;:::i;39466:56::-;39524:7;39532:1;39524:10;;;;;;;;:::i;:::-;;;;;;;39445:90;;;;;;;;;;;;;;;17159:42:1::0;17147:55;;;;17129:74;;17234:2;17219:18;;17212:34;17117:2;17102:18;;16955:297;39445:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39438:98;;;;:::i;:::-;39546:24;39552:7;39561:4;;39546:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39567:2:0;;-1:-1:-1;39546:5:0::1;::::0;-1:-1:-1;;39546:24:0:i:1;:::-;39631:7;39639:1;39631:10;;;;;;;;:::i;:::-;;;;;;;39619:9;:22;39615:94;;;39643:66;39674:10;39698:7;39706:1;39698:10;;;;;;;;:::i;:::-;;;;;;;39686:9;:22;;;;:::i;8818:438::-:0;9044:45;;;9033:10;17147:55:1;;;9044:45:0;;;17129:74:1;17219:18;;;;17212:34;;;9044:45:0;;;;;;;;;;17102:18:1;;;;9044:45:0;;;;;;;;;;;;;9033:57;;-1:-1:-1;;;;9033:10:0;;;;:57;;9044:45;9033:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8997:93;;;;9121:7;:57;;;;-1:-1:-1;9133:11:0;;:16;;:44;;;9164:4;9153:24;;;;;;;;;;;;:::i;:::-;9100:149;;;;;;;19944:2:1;9100:149:0;;;19926:21:1;19983:2;19963:18;;;19956:30;20022:34;20002:18;;;19995:62;20093:15;20073:18;;;20066:43;20126:19;;9100:149:0;19742:409:1;9100:149:0;8921:335;;8818:438;;;:::o;9754:214::-;9866:12;;;9826;9866;;;;;;;;;9844:7;;;;9859:5;;9844:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9825:54;;;9897:7;9889:72;;;;;;;20358:2:1;9889:72:0;;;20340:21:1;20397:2;20377:18;;;20370:30;20436:34;20416:18;;;20409:62;20507:22;20487:18;;;20480:50;20547:19;;9889:72:0;20156:416:1;9889:72:0;9815:153;9754:214;;:::o;21589:596::-;21694:21;21750:1;21735:4;:11;:16;;21727:64;;;;;;;20779:2:1;21727:64:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:34;20837:18;;;20830:62;20928:5;20908:18;;;20901:33;20951:19;;21727:64:0;20577:399:1;21727:64:0;21822:4;:11;21811:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21811:23:0;;21801:33;;21857:8;21844:7;21852:1;21844:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;21880:6;21875:304;21906:1;21892:4;:11;:15;;;;:::i;:::-;21888:1;:19;21875:304;;;21928:18;21963:60;21993:7;22002:4;22007:1;22002:7;;;;;;;;:::i;:::-;;;;;;;22011:4;22016:1;22020;22016:5;;;;:::i;:::-;22011:11;;;;;;;;:::i;:::-;;;;;;;21963:29;:60::i;:::-;22038:42;;;;;22064:15;22038:42;;;2247:25:1;21928:96:0;;-1:-1:-1;22038:25:0;;;;;;2220:18:1;;22038:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22111:57;22141:4;22148:7;22156:1;22148:10;;;;;;;;:::i;:::-;;;;;;;22160:4;22165:1;22160:7;;;;;;;;:::i;:::-;;;;;;;22111:21;:57::i;:::-;22094:7;22102:5;:1;22106;22102:5;:::i;:::-;22094:14;;;;;;;;:::i;:::-;;;;;;;;;;:74;-1:-1:-1;21909:3:0;;21875:304;;;;21589:596;;;;;:::o;18146:431::-;18235:12;18260:14;18276;18294:26;18305:6;18313;18294:10;:26::i;:::-;18462:32;;21301:66:1;21288:2;21284:15;;;21280:88;;18462:32:0;;;21268:101:1;21403:15;;;21399:88;21385:12;;;21378:110;18259:61:0;;-1:-1:-1;18259:61:0;-1:-1:-1;18427:7:0;;21504:12:1;;18462:32:0;;;;;;;;;;;;;18452:43;;18462:32;18452:43;;;;18513:14;;;;;;;;;;;;;18368:198;;;;;18462:32;18368:198;;:::i;:::-;;;;;;;;;;;;;;18358:209;;18368:198;18358:209;;;;;18146:431;-1:-1:-1;;;;;;18146:431:0:o;9262:486::-;9526:51;;;9515:10;18084:55:1;;;9526:51:0;;;18066:74:1;18176:55;;;18156:18;;;18149:83;18248:18;;;;18241:34;;;9526:51:0;;;;;;;;;;18039:18:1;;;;9526:51:0;;;;;;;;;;;;;9515:63;;-1:-1:-1;;;;9515:10:0;;;;:63;;9526:51;9515:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9479:99;;;;9609:7;:57;;;;-1:-1:-1;9621:11:0;;:16;;:44;;;9652:4;9641:24;;;;;;;;;;;;:::i;:::-;9588:153;;;;;;;22439:2:1;9588:153:0;;;22421:21:1;22478:2;22458:18;;;22451:30;22517:34;22497:18;;;22490:62;22588:19;22568:18;;;22561:47;22625:19;;9588:153:0;22237:413:1;9588:153:0;9391:357;;9262:486;;;;:::o;34581:738::-;34687:6;34682:631;34713:1;34699:4;:11;:15;;;;:::i;:::-;34695:1;:19;34682:631;;;34736:13;34751:14;34770:4;34775:1;34770:7;;;;;;;;:::i;:::-;;;;;;;34779:4;34784:1;34788;34784:5;;;;:::i;:::-;34779:11;;;;;;;;:::i;:::-;;;;;;;34735:56;;;;34806:14;34825:47;34858:5;34865:6;34825:32;:47::i;:::-;-1:-1:-1;34805:67:0;-1:-1:-1;34886:14:0;34903:7;34911:5;:1;34915;34911:5;:::i;:::-;34903:14;;;;;;;;:::i;:::-;;;;;;;34886:31;;34932:15;34949;34977:6;34968:15;;:5;:15;;;:61;;35010:9;35026:1;34968:61;;;34992:1;34996:9;34968:61;34931:98;;;;35043:10;35074:1;35060:4;:11;:15;;;;:::i;:::-;35056:1;:19;:87;;35140:3;35056:87;;;35078:59;35108:7;35117:6;35125:4;35130:5;:1;35134;35130:5;:::i;35078:59::-;35043:100;;35171:53;35201:7;35210:5;35217:6;35171:29;:53::i;:::-;35157:73;;;35248:10;35260;35272:2;35286:1;35276:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35276:12:0;;35157:145;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34716:3:0;;;;;-1:-1:-1;34682:631:0;;-1:-1:-1;;;;;;;;34682:631:0;;;34581:738;;;:::o;20874:625::-;20975:21;21031:1;21016:4;:11;:16;;21008:64;;;;;;;20779:2:1;21008:64:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:34;20837:18;;;20830:62;20928:5;20908:18;;;20901:33;20951:19;;21008:64:0;20577:399:1;21008:64:0;21103:4;:11;21092:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21092:23:0;;21082:33;;21155:9;21125:7;21150:1;21133:7;:14;:18;;;;:::i;:::-;21125:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;21179:6;21202:1;21188:4;:11;:15;;;;:::i;:::-;21179:24;;21174:319;21205:5;;21174:319;;21231:18;21266:60;21296:7;21305:4;21310:5;21314:1;21310;:5;:::i;:::-;21305:11;;;;;;;;:::i;:::-;;;;;;;21318:4;21323:1;21318:7;;;;;;;;:::i;21266:60::-;21231:96;;21349:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21341:50;;;;;;;23343:2:1;21341:50:0;;;23325:21:1;23382:2;23362:18;;;23355:30;23421:19;23401:18;;;23394:47;23458:18;;21341:50:0;23141:341:1;21341:50:0;21422:60;21451:4;21458:7;21466:1;21458:10;;;;;;;;:::i;:::-;;;;;;;21470:4;21479:1;21475;:5;;;;:::i;:::-;21470:11;;;;;;;;:::i;:::-;;;;;;;21422:20;:60::i;:::-;21405:7;21413:5;21417:1;21413;:5;:::i;:::-;21405:14;;;;;;;;:::i;:::-;;;;;;;;;;:77;-1:-1:-1;21212:3:0;;;;:::i;:::-;;;;21174:319;;22274:696;22379:21;22435:1;22420:4;:11;:16;;22412:64;;;;;;;20779:2:1;22412:64:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:34;20837:18;;;20830:62;20928:5;20908:18;;;20901:33;20951:19;;22412:64:0;20577:399:1;22412:64:0;22507:4;:11;22496:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22496:23:0;;22486:33;;22559:9;22529:7;22554:1;22537:7;:14;:18;;;;:::i;:::-;22529:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;22583:6;22606:1;22592:4;:11;:15;;;;:::i;:::-;22583:24;;22578:386;22609:5;;22578:386;;22635:18;22670:60;22700:7;22709:4;22714:5;22718:1;22714;:5;:::i;22670:60::-;22745:42;;;;;22771:15;22745:42;;;2247:25:1;22635:96:0;;-1:-1:-1;22745:25:0;;;;;;2220:18:1;;22745:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22802:17;22821;22844:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22801:61;;;;;22893:60;22922:4;22929:7;22937:1;22929:10;;;;;;;;:::i;:::-;;;;;;;22941:4;22950:1;22946;:5;;;;:::i;22893:60::-;22876:7;22884:5;22888:1;22884;:5;:::i;:::-;22876:14;;;;;;;;:::i;:::-;;;;;;:77;;;;;22621:343;;;22616:3;;;;;:::i;:::-;;;;22578:386;;39859:1235;39971:6;39966:1122;39997:1;39983:4;:11;:15;;;;:::i;:::-;39979:1;:19;39966:1122;;;40020:13;40035:14;40054:4;40059:1;40054:7;;;;;;;;:::i;:::-;;;;;;;40063:4;40068:1;40072;40068:5;;;;:::i;:::-;40063:11;;;;;;;;:::i;:::-;;;;;;;40019:56;;;;40090:14;40109:47;40142:5;40149:6;40109:32;:47::i;:::-;40089:67;;;40170:18;40205:53;40235:7;40244:5;40251:6;40205:29;:53::i;:::-;40170:89;;40273:16;40303:17;40393;40412:18;40432:22;40456:23;40484:66;40527:7;40536:5;40543:6;40484:42;:66::i;:::-;40582:38;;;;;:23;10799:55:1;;;40582:38:0;;;10781:74:1;40392:158:0;;-1:-1:-1;40392:158:0;;-1:-1:-1;40392:158:0;;-1:-1:-1;40392:158:0;-1:-1:-1;40392:158:0;;;;40582:23;;;;;;10754:18:1;;40582:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;:73;;;;:::i;:::-;40568:87;;40688:78;40740:4;40747:11;40760:5;40688:43;:78::i;:::-;40673:93;;40334:447;;;;40795:15;40812;40840:6;40831:15;;:5;:15;;;:67;;40876:12;40895:1;40831:67;;;40855:1;40859:12;40831:67;40794:104;;;;40912:10;40943:1;40929:4;:11;:15;;;;:::i;:::-;40925:1;:19;:87;;41009:3;40925:87;;;40947:59;40977:7;40986:6;40994:4;40999:5;:1;41003;40999:5;:::i;40947:59::-;41064:12;;;41074:1;41064:12;;;;;;;;;41026:51;;;;40912:100;;-1:-1:-1;41026:9:0;;;;;;:51;;41036:10;;41048;;40912:100;;41026:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40000:3:0;;;;;-1:-1:-1;39966:1122:0;;-1:-1:-1;;;;;;;;;;39966:1122:0;19793:324;19875:12;19917:1;19907:7;:11;19899:66;;;;;;;24636:2:1;19899:66:0;;;24618:21:1;24675:2;24655:18;;;24648:30;24714:34;24694:18;;;24687:62;24785:12;24765:18;;;24758:40;24815:19;;19899:66:0;24434:406:1;19899:66:0;19994:1;19983:8;:12;:28;;;;;20010:1;19999:8;:12;19983:28;19975:86;;;;;;;25047:2:1;19975:86:0;;;25029:21:1;25086:2;25066:18;;;25059:30;25125:34;25105:18;;;25098:62;25196:15;25176:18;;;25169:43;25229:19;;19975:86:0;24845:409:1;19975:86:0;20102:8;20081:18;20091:8;20081:7;:18;:::i;:::-;:29;;;;:::i;17702:355::-;17777:14;17793;17837:6;17827:16;;:6;:16;;;17819:71;;;;;;;25913:2:1;17819:71:0;;;25895:21:1;25952:2;25932:18;;;25925:30;25991:34;25971:18;;;25964:62;26062:12;26042:18;;;26035:40;26092:19;;17819:71:0;25711:406:1;17819:71:0;17928:6;17919:15;;:6;:15;;;:53;;17957:6;17965;17919:53;;;17938:6;17946;17919:53;17900:72;;-1:-1:-1;17900:72:0;-1:-1:-1;17990:20:0;;;17982:68;;;;;;;26324:2:1;17982:68:0;;;26306:21:1;26363:2;26343:18;;;26336:30;26402:34;26382:18;;;26375:62;26473:5;26453:18;;;26446:33;26496:19;;17982:68:0;26122:399:1;17982:68:0;17702:355;;;;;:::o;20196:600::-;20297:21;20353:1;20338:4;:11;:16;;20330:64;;;;;;;20779:2:1;20330:64:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:34;20837:18;;;20830:62;20928:5;20908:18;;;20901:33;20951:19;;20330:64:0;20577:399:1;20330:64:0;20425:4;:11;20414:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20414:23:0;;20404:33;;20460:8;20447:7;20455:1;20447:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;20483:6;20478:312;20509:1;20495:4;:11;:15;;;;:::i;:::-;20491:1;:19;20478:312;;;20531:18;20566:60;20596:7;20605:4;20610:1;20605:7;;;;;;;;:::i;20566:60::-;20531:96;;20649:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20641:50;;;;;;;23343:2:1;20641:50:0;;;23325:21:1;23382:2;23362:18;;;23355:30;23421:19;23401:18;;;23394:47;23458:18;;20641:50:0;23141:341:1;20641:50:0;20722:57;20752:4;20759:7;20767:1;20759:10;;;;;;;;:::i;20722:57::-;20705:7;20713:5;:1;20717;20713:5;:::i;:::-;20705:14;;;;;;;;:::i;:::-;;;;;;;;;;:74;-1:-1:-1;20512:3:0;;20478:312;;27007:1395;27311:52;;;;;:66;26718:55:1;;;27311:52:0;;;26700:74:1;26810:55;;;26790:18;;;26783:83;-1:-1:-1;;;;;;27331:7:0;27311:36;;;;;;26673:18:1;;27311:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;27307:152;;27393:55;;;;;:39;26718:55:1;;;27393::0;;;26700:74:1;26810:55;;;26790:18;;;26783:83;27413:7:0;27393:39;;;;26673:18:1;;27393:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27307:152;27469:13;27484;27503:67;27546:7;27555:6;27563;27503:42;:67::i;:::-;27468:102;;;;;;27584:8;27596:1;27584:13;:30;;;;-1:-1:-1;27601:13:0;;27584:30;27580:816;;;27652:14;;-1:-1:-1;27668:14:0;;-1:-1:-1;27580:816:0;;;27714:19;27736:63;27764:14;27780:8;27790;27736:27;:63::i;:::-;27714:85;;27835:14;27817;:32;27813:573;;27895:10;27877:14;:28;;27869:80;;;;;;;19244:2:1;27869:80:0;;;19226:21:1;19283:2;19263:18;;;19256:30;19322:34;19302:18;;;19295:62;19393:9;19373:18;;;19366:37;19420:19;;27869:80:0;19042:403:1;27869:80:0;27989:14;;-1:-1:-1;28005:14:0;-1:-1:-1;28005:14:0;27813:573;;;28059:19;28081:63;28109:14;28125:8;28135;28081:27;:63::i;:::-;28059:85;;28187:14;28169;:32;;28162:40;;;;:::i;:::-;28246:10;28228:14;:28;;28220:80;;;;;;;18836:2:1;28220:80:0;;;18818:21:1;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;18985:9;18965:18;;;18958:37;19012:19;;28220:80:0;18634:403:1;28220:80:0;28340:14;-1:-1:-1;28356:14:0;;-1:-1:-1;27813:573:0;27700:696;27580:816;27246:1156;;27007:1395;;;;;;;;;:::o;24059:749::-;24169:4;24186:18;24221:12;24186:48;;24245:17;24264;24287:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24244:61;;;;;24316:18;24336:19;24371:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24359:25;;:8;:25;;;:75;;24413:9;24424;24359:75;;;24388:9;24399;24359:75;24315:119;;;;24464:1;24452:9;:13;:31;;;;;24482:1;24469:10;:14;;;24452:31;:50;;;;;24501:1;24487:11;:15;;;24452:50;24444:59;;;;;;24566:20;24610:4;:8;;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24589:31;;24597:9;24589:31;:::i;:::-;24566:54;-1:-1:-1;24630:14:0;24647:38;24665:20;;;24566:54;24647:38;:::i;:::-;24630:55;-1:-1:-1;24695:16:0;24746:15;24715:27;:19;;;24737:5;24715:27;:::i;:::-;24714:47;;;;:::i;:::-;24695:66;-1:-1:-1;24778:23:0;24695:66;24778:9;:23;:::i;:::-;24771:30;24059:749;-1:-1:-1;;;;;;;;;;;;24059:749:0:o;23200:739::-;23311:4;23327:18;23362:12;23327:48;;23386:17;23405;23428:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23385:61;;;;;23457:25;23484:26;23527:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23514:26;;:9;:26;;;:76;;23569:9;23580;23514:76;;;23544:9;23555;23514:76;23456:134;;;;23621:1;23608:10;:14;:39;;;;;23646:1;23626:17;:21;;;23608:39;:65;;;;;23672:1;23651:18;:22;;;23608:65;23600:74;;;;;;23738:14;23755:39;23784:10;23755:26;;;:39;:::i;:::-;:47;;23797:5;23755:47;:::i;:::-;23738:64;;23812:16;23876:4;:8;;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23832:40;23862:10;23832:27;;;:40;:::i;:::-;23831:55;;;;:::i;:::-;23812:74;-1:-1:-1;23904:23:0;23812:74;23904:9;:23;:::i;:::-;23903:29;;23931:1;23903:29;:::i;:::-;23896:36;23200:739;-1:-1:-1;;;;;;;;;;;23200:739:0:o;19026:657::-;19123:13;19138;19153:18;19173;19204:14;19223:26;19234:6;19242;19223:10;:26::i;:::-;19203:46;;;19260:18;19295:32;19303:7;19312:6;19320;19295:7;:32::i;:::-;19339:42;;;;;19365:15;19339:42;;;2247:25:1;19260:68:0;;-1:-1:-1;19339:25:0;;;;;;2220:18:1;;19339:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19393:13;19408;19423:18;19443;19467:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19392:98;;;;;;;;;;;;;;;;;;19564:6;19554:16;;:6;:16;;;:122;;19627:8;19637;19647:13;19662;19554:122;;;19574:8;19584;19594:13;19609;19554:122;19501:175;;;;;;;;;;;;;;;;19193:490;;;;;;19026:657;;;;;;;:::o;14:184:1:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:134::-;430:20;;459:31;430:20;459:31;:::i;:::-;362:134;;;:::o;501:871::-;605:6;613;621;629;637;645;698:3;686:9;677:7;673:23;669:33;666:53;;;715:1;712;705:12;666:53;754:9;741:23;773:31;798:5;773:31;:::i;:::-;823:5;-1:-1:-1;901:2:1;886:18;;873:32;;-1:-1:-1;1004:2:1;989:18;;976:32;;-1:-1:-1;1107:2:1;1092:18;;1079:32;;-1:-1:-1;1189:3:1;1174:19;;1161:33;1203;1161;1203;:::i;:::-;501:871;;;;-1:-1:-1;501:871:1;;;;;1335:3;1320:19;;;1307:33;;-1:-1:-1;;501:871:1:o;1630:466::-;1707:6;1715;1723;1776:2;1764:9;1755:7;1751:23;1747:32;1744:52;;;1792:1;1789;1782:12;1744:52;-1:-1:-1;;1837:23:1;;;1957:2;1942:18;;1929:32;;-1:-1:-1;2060:2:1;2045:18;;;2032:32;;1630:466;-1:-1:-1;1630:466:1:o;2283:367::-;2346:8;2356:6;2410:3;2403:4;2395:6;2391:17;2387:27;2377:55;;2428:1;2425;2418:12;2377:55;-1:-1:-1;2451:20:1;;2494:18;2483:30;;2480:50;;;2526:1;2523;2516:12;2480:50;2563:4;2555:6;2551:17;2539:29;;2623:3;2616:4;2606:6;2603:1;2599:14;2591:6;2587:27;2583:38;2580:47;2577:67;;;2640:1;2637;2630:12;2655:934;2777:6;2785;2793;2801;2809;2817;2870:3;2858:9;2849:7;2845:23;2841:33;2838:53;;;2887:1;2884;2877:12;2838:53;2932:23;;;-1:-1:-1;3052:2:1;3037:18;;3024:32;;-1:-1:-1;3133:2:1;3118:18;;3105:32;3160:18;3149:30;;3146:50;;;3192:1;3189;3182:12;3146:50;3231:70;3293:7;3284:6;3273:9;3269:22;3231:70;:::i;:::-;3320:8;;-1:-1:-1;3205:96:1;-1:-1:-1;;3407:2:1;3392:18;;3379:32;3420:33;3379:32;3420:33;:::i;:::-;2655:934;;;;-1:-1:-1;2655:934:1;;;;;3552:3;3537:19;;;3524:33;;-1:-1:-1;;2655:934:1:o;3594:611::-;3784:2;3796:21;;;3866:13;;3769:18;;;3888:22;;;3736:4;;3967:15;;;3941:2;3926:18;;;3736:4;4010:169;4024:6;4021:1;4018:13;4010:169;;;4085:13;;4073:26;;4128:2;4154:15;;;;4119:12;;;;4046:1;4039:9;4010:169;;;-1:-1:-1;4196:3:1;;3594:611;-1:-1:-1;;;;;3594:611:1:o;4210:184::-;4262:77;4259:1;4252:88;4359:4;4356:1;4349:15;4383:4;4380:1;4373:15;4399:1300;4492:6;4500;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4614:23;;;-1:-1:-1;4712:2:1;4697:18;;4684:32;4739:18;4728:30;;4725:50;;;4771:1;4768;4761:12;4725:50;4794:22;;4847:4;4839:13;;4835:27;-1:-1:-1;4825:55:1;;4876:1;4873;4866:12;4825:55;4916:2;4903:16;4942:18;4934:6;4931:30;4928:56;;;4964:18;;:::i;:::-;5010:6;5007:1;5003:14;5046:2;5040:9;5105:66;5100:2;5096;5092:11;5088:84;5080:6;5076:97;5239:6;5227:10;5224:22;5203:18;5191:10;5188:34;5185:62;5182:88;;;5250:18;;:::i;:::-;5286:2;5279:22;5336;;;5386:2;5416:11;;;5412:20;;;5336:22;5374:15;;5444:19;;;5441:39;;;5476:1;5473;5466:12;5441:39;5508:2;5504;5500:11;5489:22;;5520:148;5536:6;5531:3;5528:15;5520:148;;;5602:23;5621:3;5602:23;:::i;:::-;5590:36;;5655:2;5553:12;;;;5646;5520:148;;;5524:3;5687:6;5677:16;;;;;;4399:1300;;;;;:::o;5704:118::-;5790:5;5783:13;5776:21;5769:5;5766:32;5756:60;;5812:1;5809;5802:12;5827:156;5893:20;;5953:4;5942:16;;5932:27;;5922:55;;5973:1;5970;5963:12;5988:1464;6132:6;6140;6148;6156;6164;6172;6180;6188;6196;6204;6212:7;6266:3;6254:9;6245:7;6241:23;6237:33;6234:53;;;6283:1;6280;6273:12;6234:53;6322:9;6309:23;6341:31;6366:5;6341:31;:::i;:::-;6391:5;-1:-1:-1;6448:2:1;6433:18;;6420:32;6461:33;6420:32;6461:33;:::i;:::-;6513:7;-1:-1:-1;6593:2:1;6578:18;;6565:32;;-1:-1:-1;6696:2:1;6681:18;;6668:32;;-1:-1:-1;6799:3:1;6784:19;;6771:33;;-1:-1:-1;6882:3:1;6867:19;;6854:33;6896;6854;6896;:::i;:::-;6948:7;-1:-1:-1;7028:3:1;7013:19;;7000:33;;-1:-1:-1;7111:3:1;7096:19;;7083:33;7125:30;7083:33;7125:30;:::i;:::-;7174:7;-1:-1:-1;7200:37:1;7232:3;7217:19;;7200:37;:::i;:::-;5988:1464;;;;-1:-1:-1;5988:1464:1;;;;;;;;-1:-1:-1;5988:1464:1;;;;7190:47;7310:3;7295:19;;7282:33;;-1:-1:-1;7414:3:1;7399:19;;;7386:33;;5988:1464;-1:-1:-1;5988:1464:1:o;7457:250::-;7542:1;7552:113;7566:6;7563:1;7560:13;7552:113;;;7642:11;;;7636:18;7623:11;;;7616:39;7588:2;7581:10;7552:113;;;-1:-1:-1;;7699:1:1;7681:16;;7674:27;7457:250::o;7712:329::-;7753:3;7791:5;7785:12;7818:6;7813:3;7806:19;7834:76;7903:6;7896:4;7891:3;7887:14;7880:4;7873:5;7869:16;7834:76;:::i;:::-;7955:2;7943:15;7960:66;7939:88;7930:98;;;;8030:4;7926:109;;7712:329;-1:-1:-1;;7712:329:1:o;8046:217::-;8193:2;8182:9;8175:21;8156:4;8213:44;8253:2;8242:9;8238:18;8230:6;8213:44;:::i;8492:1320::-;8627:6;8635;8643;8651;8659;8667;8675;8683;8691;8699;8752:3;8740:9;8731:7;8727:23;8723:33;8720:53;;;8769:1;8766;8759:12;8720:53;8808:9;8795:23;8827:31;8852:5;8827:31;:::i;:::-;8877:5;-1:-1:-1;8955:2:1;8940:18;;8927:32;;-1:-1:-1;9058:2:1;9043:18;;9030:32;;-1:-1:-1;9161:2:1;9146:18;;9133:32;;-1:-1:-1;9243:3:1;9228:19;;9215:33;9257;9215;9257;:::i;:::-;9309:7;-1:-1:-1;9389:3:1;9374:19;;9361:33;;-1:-1:-1;9472:3:1;9457:19;;9444:33;9486:30;9444:33;9486:30;:::i;:::-;9535:7;-1:-1:-1;9561:37:1;9593:3;9578:19;;9561:37;:::i;:::-;8492:1320;;;;-1:-1:-1;8492:1320:1;;;;;;;;-1:-1:-1;8492:1320:1;;9671:3;9656:19;;9643:33;;9775:3;9760:19;;;9747:33;;-1:-1:-1;8492:1320:1;-1:-1:-1;8492:1320:1:o;9817:813::-;9930:6;9938;9946;9954;9962;10015:3;10003:9;9994:7;9990:23;9986:33;9983:53;;;10032:1;10029;10022:12;9983:53;10077:23;;;-1:-1:-1;10175:2:1;10160:18;;10147:32;10202:18;10191:30;;10188:50;;;10234:1;10231;10224:12;10188:50;10273:70;10335:7;10326:6;10315:9;10311:22;10273:70;:::i;:::-;10362:8;;-1:-1:-1;10247:96:1;-1:-1:-1;;10449:2:1;10434:18;;10421:32;10462:33;10421:32;10462:33;:::i;:::-;9817:813;;;;-1:-1:-1;9817:813:1;;10594:2;10579:18;10566:32;;9817:813;-1:-1:-1;;9817:813:1:o;10866:1013::-;10979:6;10987;10995;11003;11011;11019;11027;11080:3;11068:9;11059:7;11055:23;11051:33;11048:53;;;11097:1;11094;11087:12;11048:53;11136:9;11123:23;11155:31;11180:5;11155:31;:::i;:::-;11205:5;-1:-1:-1;11262:2:1;11247:18;;11234:32;11275:33;11234:32;11275:33;:::i;:::-;11327:7;-1:-1:-1;11407:2:1;11392:18;;11379:32;;-1:-1:-1;11510:2:1;11495:18;;11482:32;;-1:-1:-1;11613:3:1;11598:19;;11585:33;;-1:-1:-1;11696:3:1;11681:19;;11668:33;11710;11668;11710;:::i;:::-;10866:1013;;;;-1:-1:-1;10866:1013:1;;;;;;;;-1:-1:-1;;11842:3:1;11827:19;;;11814:33;;10866:1013::o;11884:1134::-;12006:6;12014;12022;12030;12038;12046;12054;12062;12115:3;12103:9;12094:7;12090:23;12086:33;12083:53;;;12132:1;12129;12122:12;12083:53;12171:9;12158:23;12190:31;12215:5;12190:31;:::i;:::-;12240:5;-1:-1:-1;12297:2:1;12282:18;;12269:32;12310:33;12269:32;12310:33;:::i;:::-;12362:7;-1:-1:-1;12442:2:1;12427:18;;12414:32;;-1:-1:-1;12545:2:1;12530:18;;12517:32;;-1:-1:-1;12648:3:1;12633:19;;12620:33;;-1:-1:-1;12752:3:1;12737:19;;12724:33;;-1:-1:-1;12835:3:1;12820:19;;12807:33;12849;12807;12849;:::i;:::-;11884:1134;;;;-1:-1:-1;11884:1134:1;;;;;;;;-1:-1:-1;12901:7:1;;12981:3;12966:19;12953:33;;-1:-1:-1;11884:1134:1:o;14059:184::-;14111:77;14108:1;14101:88;14208:4;14205:1;14198:15;14232:4;14229:1;14222:15;14248:128;14315:9;;;14336:11;;;14333:37;;;14350:18;;:::i;14381:184::-;14433:77;14430:1;14423:88;14530:4;14527:1;14520:15;14554:4;14551:1;14544:15;14570:247;14629:6;14682:2;14670:9;14661:7;14657:23;14653:32;14650:52;;;14698:1;14695;14688:12;14650:52;14737:9;14724:23;14756:31;14781:5;14756:31;:::i;:::-;14806:5;14570:247;-1:-1:-1;;;14570:247:1:o;16720:230::-;16790:6;16843:2;16831:9;16822:7;16818:23;16814:32;16811:52;;;16859:1;16856;16849:12;16811:52;-1:-1:-1;16904:16:1;;16720:230;-1:-1:-1;16720:230:1:o;17257:245::-;17324:6;17377:2;17365:9;17356:7;17352:23;17348:32;17345:52;;;17393:1;17390;17383:12;17345:52;17425:9;17419:16;17444:28;17466:5;17444:28;:::i;18286:343::-;18365:6;18373;18426:2;18414:9;18405:7;18401:23;18397:32;18394:52;;;18442:1;18439;18432:12;18394:52;-1:-1:-1;;18487:16:1;;18593:2;18578:18;;;18572:25;18487:16;;18572:25;;-1:-1:-1;18286:343:1:o;19450:287::-;19579:3;19617:6;19611:13;19633:66;19692:6;19687:3;19680:4;19672:6;19668:17;19633:66;:::i;:::-;19715:16;;;;;19450:287;-1:-1:-1;;19450:287:1:o;20981:125::-;21046:9;;;21067:10;;;21064:36;;;21080:18;;:::i;21527:705::-;21843:66;21838:3;21831:79;21960:66;21951:6;21947:2;21943:15;21939:88;21935:1;21930:3;21926:11;21919:109;22058:6;22053:2;22048:3;22044:12;22037:28;21813:3;22094:6;22088:13;22110:75;22178:6;22173:2;22168:3;22164:12;22157:4;22149:6;22145:17;22110:75;:::i;:::-;22205:16;;;;22223:2;22201:25;;21527:705;-1:-1:-1;;;;21527:705:1:o;22655:481::-;22886:6;22875:9;22868:25;22929:6;22924:2;22913:9;22909:18;22902:34;22984:42;22976:6;22972:55;22967:2;22956:9;22952:18;22945:83;23064:3;23059:2;23048:9;23044:18;23037:31;22849:4;23085:45;23125:3;23114:9;23110:19;23102:6;23085:45;:::i;:::-;23077:53;22655:481;-1:-1:-1;;;;;;22655:481:1:o;23487:196::-;23526:3;23554:5;23544:39;;23563:18;;:::i;:::-;-1:-1:-1;23610:66:1;23599:78;;23487:196::o;23688:188::-;23767:13;;23820:30;23809:42;;23799:53;;23789:81;;23866:1;23863;23856:12;23881:167;23959:13;;24012:10;24001:22;;23991:33;;23981:61;;24038:1;24035;24028:12;24053:376;24140:6;24148;24156;24209:2;24197:9;24188:7;24184:23;24180:32;24177:52;;;24225:1;24222;24215:12;24177:52;24248:40;24278:9;24248:40;:::i;:::-;24238:50;;24307:49;24352:2;24341:9;24337:18;24307:49;:::i;:::-;24297:59;;24375:48;24419:2;24408:9;24404:18;24375:48;:::i;:::-;24365:58;;24053:376;;;;;:::o;25259:168::-;25332:9;;;25363;;25380:15;;;25374:22;;25360:37;25350:71;;25401:18;;:::i;25432:274::-;25472:1;25498;25488:189;;25533:77;25530:1;25523:88;25634:4;25631:1;25624:15;25662:4;25659:1;25652:15;25488:189;-1:-1:-1;25691:9:1;;25432:274::o;26877:251::-;26947:6;27000:2;26988:9;26979:7;26975:23;26971:32;26968:52;;;27016:1;27013;27006:12;26968:52;27048:9;27042:16;27067:31;27092:5;27067:31;:::i;27133:656::-;27247:6;27255;27263;27271;27279;27287;27340:3;27328:9;27319:7;27315:23;27311:33;27308:53;;;27357:1;27354;27347:12;27308:53;27380:40;27410:9;27380:40;:::i;:::-;27370:50;;27439:49;27484:2;27473:9;27469:18;27439:49;:::i;:::-;27429:59;;27507:48;27551:2;27540:9;27536:18;27507:48;:::i;:::-;27497:58;;27574:49;27619:2;27608:9;27604:18;27574:49;:::i;:::-;27564:59;;27642:50;27687:3;27676:9;27672:19;27642:50;:::i;:::-;27632:60;;27714:1;27754:3;27743:9;27739:19;27733:26;27724:35;;27778:5;27768:15;;;27133:656;;;;;;;;:::o
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.