FTM Price: $1.26 (-2.66%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap Exact ETH F...995605812024-12-09 8:06:5711 mins ago1733731617IN
0x2aa07920...75623B285
14.11192062 FTM0.0120760754
Swap Exact Token...995605682024-12-09 8:06:4311 mins ago1733731603IN
0x2aa07920...75623B285
0 FTM0.0041580312.24879875
Swap Exact Token...995605632024-12-09 8:06:3911 mins ago1733731599IN
0x2aa07920...75623B285
0 FTM0.0041573612.24879875
Swap Exact Token...995605612024-12-09 8:06:3511 mins ago1733731595IN
0x2aa07920...75623B285
0 FTM0.0041570912.24879875
Swap Exact Token...995605592024-12-09 8:06:3311 mins ago1733731593IN
0x2aa07920...75623B285
0 FTM0.0041573212.24879875
Swap Exact Token...995605572024-12-09 8:06:3111 mins ago1733731591IN
0x2aa07920...75623B285
0 FTM0.0041586712.25742866
Swap Exact Token...995605552024-12-09 8:06:3011 mins ago1733731590IN
0x2aa07920...75623B285
0 FTM0.0041586112.25742866
Swap Exact Token...995605532024-12-09 8:06:2911 mins ago1733731589IN
0x2aa07920...75623B285
0 FTM0.0041556912.25742866
Swap Exact Token...995605512024-12-09 8:06:2711 mins ago1733731587IN
0x2aa07920...75623B285
0 FTM0.0041555712.25742866
Swap Exact Token...995605492024-12-09 8:06:2411 mins ago1733731584IN
0x2aa07920...75623B285
0 FTM0.0168951947.66931194
Swap Exact Token...995597932024-12-09 7:53:4724 mins ago1733730827IN
0x2aa07920...75623B285
0 FTM0.0042006612.4085907
Swap Exact Token...995597912024-12-09 7:53:4524 mins ago1733730825IN
0x2aa07920...75623B285
0 FTM0.0042006612.4085907
Swap Exact Token...995597852024-12-09 7:53:3824 mins ago1733730818IN
0x2aa07920...75623B285
0 FTM0.0041848912.39830045
Swap Exact Token...995597832024-12-09 7:53:3624 mins ago1733730816IN
0x2aa07920...75623B285
0 FTM0.004160212.39830045
Swap Exact Token...995597812024-12-09 7:53:3524 mins ago1733730815IN
0x2aa07920...75623B285
0 FTM0.0041600612.39830045
Swap Exact Token...995597782024-12-09 7:53:3224 mins ago1733730812IN
0x2aa07920...75623B285
0 FTM0.0041109112.39830045
Swap Exact Token...995597742024-12-09 7:53:2824 mins ago1733730808IN
0x2aa07920...75623B285
0 FTM0.0040123512.39830045
Swap Exact Token...995597742024-12-09 7:53:2824 mins ago1733730808IN
0x2aa07920...75623B285
0 FTM0.0094446628.15150995
Swap Exact Token...995597622024-12-09 7:53:1325 mins ago1733730793IN
0x2aa07920...75623B285
0 FTM0.0041085712.39588344
Swap Exact Token...995594972024-12-09 7:48:3529 mins ago1733730515IN
0x2aa07920...75623B285
0 FTM0.0042061213.00699611
Swap Exact Token...995594972024-12-09 7:48:3529 mins ago1733730515IN
0x2aa07920...75623B285
0 FTM0.0045380813.00699611
Swap Exact Token...995594952024-12-09 7:48:3329 mins ago1733730513IN
0x2aa07920...75623B285
0 FTM0.0044597213.00699611
Swap Exact Token...995594932024-12-09 7:48:3229 mins ago1733730512IN
0x2aa07920...75623B285
0 FTM0.0043052713.00699611
Swap Exact Token...995594922024-12-09 7:48:3029 mins ago1733730510IN
0x2aa07920...75623B285
0 FTM0.0149292141.67018521
Swap Exact Token...995572972024-12-09 7:12:591 hr ago1733728379IN
0x2aa07920...75623B285
0 FTM0.0038328111.63363254
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
995605812024-12-09 8:06:5711 mins ago1733731617
0x2aa07920...75623B285
14.11192062 FTM
995598942024-12-09 7:55:3522 mins ago1733730935
0x2aa07920...75623B285
39.70584882 FTM
995598942024-12-09 7:55:3522 mins ago1733730935
0x2aa07920...75623B285
39.70584882 FTM
995472232024-12-09 4:22:103 hrs ago1733718130
0x2aa07920...75623B285
385 FTM
995472232024-12-09 4:22:103 hrs ago1733718130
0x2aa07920...75623B285
385 FTM
995415542024-12-09 2:31:505 hrs ago1733711510
0x2aa07920...75623B285
4.2 FTM
995415542024-12-09 2:31:505 hrs ago1733711510
0x2aa07920...75623B285
4.2 FTM
995368582024-12-09 1:06:257 hrs ago1733706385
0x2aa07920...75623B285
14.41801126 FTM
995368582024-12-09 1:06:257 hrs ago1733706385
0x2aa07920...75623B285
14.41801126 FTM
995367292024-12-09 1:04:067 hrs ago1733706246
0x2aa07920...75623B285
39.14394185 FTM
995367292024-12-09 1:04:067 hrs ago1733706246
0x2aa07920...75623B285
39.14394185 FTM
995360802024-12-09 0:53:097 hrs ago1733705589
0x2aa07920...75623B285
6 FTM
995360802024-12-09 0:53:097 hrs ago1733705589
0x2aa07920...75623B285
6 FTM
995337222024-12-09 0:17:168 hrs ago1733703436
0x2aa07920...75623B285
216.17144728 FTM
995337222024-12-09 0:17:168 hrs ago1733703436
0x2aa07920...75623B285
216.17144728 FTM
995334242024-12-09 0:12:058 hrs ago1733703125
0x2aa07920...75623B285
100 FTM
995334112024-12-09 0:11:568 hrs ago1733703116
0x2aa07920...75623B285
100 FTM
995311722024-12-08 23:33:208 hrs ago1733700800
0x2aa07920...75623B285
74.55372912 FTM
995311722024-12-08 23:33:208 hrs ago1733700800
0x2aa07920...75623B285
74.55372912 FTM
995307432024-12-08 23:26:048 hrs ago1733700364
0x2aa07920...75623B285
2.43632982 FTM
995307432024-12-08 23:26:048 hrs ago1733700364
0x2aa07920...75623B285
2.43632982 FTM
995307392024-12-08 23:26:008 hrs ago1733700360
0x2aa07920...75623B285
75.04752556 FTM
995307392024-12-08 23:26:008 hrs ago1733700360
0x2aa07920...75623B285
75.04752556 FTM
995307252024-12-08 23:25:508 hrs ago1733700350
0x2aa07920...75623B285
2.51481992 FTM
995307252024-12-08 23:25:508 hrs ago1733700350
0x2aa07920...75623B285
2.51481992 FTM
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2023-04-03
*/

// SPDX-License-Identifier: Unlicensed
// Solidly Extended
// ftm.guru's extension of Solidly's periphery (Router)
// https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol
//
// BaseV1Router02.sol : Supporting Fee-on-transfer Tokens
// https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol


/**v1.1.0
 *0x1A05EB736873485655F29a37DEf8a0AA87F5a447
 *Submitted for verification at FtmScan.com on 2022-11-18
*/

/**
 *  EQUALIZER EXCHANGE
 *  The New Liquidity Hub of Fantom chain!
 *  https://equalizer.exchange  (Dapp)
 *  https://discord.gg/MaMhbgHMby   (Community)
 *
 *
 *
 *  Version: 2.0.0
 *	- Add Support for Fee-on-Transfer tokens (Original work Based on "Solidly Extended" by ftm.guru)
 *	- Remove "calculation" of Pair Address and instead use Factory.pairFor
 *
 *
 *  Contributors:
 *   -   Andre Cronje, Solidly.Exchange
 *   -   543#3017 (Sam), ftm.guru & Equalizer.exchange
 *
 *
*/
// File: contracts/interfaces/IRouter.sol


pragma solidity 0.8.9;

interface IRouter {
    function pairFor(
        address tokenA,
        address tokenB,
        bool stable
    ) external view returns (address pair);
}

// File: contracts/interfaces/IWETH.sol


pragma solidity 0.8.9;

interface IWETH {
    function deposit() external payable returns (uint);
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external returns (uint);
}

// File: contracts/interfaces/IPairFactory.sol


pragma solidity 0.8.9;

interface IPairFactory {
    function isPaused() external view returns (bool);
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function getFee(bool _stable) external view returns(uint256);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function getInitializable() external view returns (address, address, bool);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

// File: contracts/interfaces/IPair.sol


pragma solidity 0.8.9;

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

// File: contracts/interfaces/IERC20.sol


pragma solidity 0.8.9;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/libraries/Math.sol


pragma solidity 0.8.9;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
    function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
        uint256 x = 0;
        for (uint256 y = 1 << 255; y > 0; y >>= 3) {
            x <<= 1;
            uint256 z = 3 * x * (x + 1) + 1;
            if (n / y >= z) {
                n -= y * z;
                x += 1;
            }
        }
        return x;
    }}
}

// File: contracts/Router.sol


pragma solidity 0.8.9;







contract Router is IRouter {
    struct Route {
        address from;
        address to;
        bool stable;
    }

    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    address public immutable factory;
    IWETH public immutable weth;
    bytes32 public immutable pairCodeHash;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, "Equalizer Router: EXPIRED");
        _;
    }

    constructor(address _factory, address _weth) {
        factory = _factory;
        pairCodeHash = IPairFactory(_factory).pairCodeHash();
        weth = IWETH(_weth);
    }

    /// @dev only accept ETH via fallback from the WETH contract
    receive() external payable {
        assert(msg.sender == address(weth));
    }

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, "Equalizer Router: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), "Equalizer Router: ZERO_ADDRESS");
    }

    /// @dev calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) {
        /*
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint256(keccak256(abi.encodePacked(
            hex'ff',
            factory,
            keccak256(abi.encodePacked(token0, token1, stable)),
            pairCodeHash // init code hash
        )))));
        */
        return IPairFactory(factory).getPair(tokenA,tokenB,stable);
    }

    /// @dev given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, "Equalizer Router: INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "Equalizer Router: INSUFFICIENT_LIQUIDITY");
        amountB = amountA * reserveB / reserveA;
    }

    /// @dev fetches and sorts the reserves for a pair
    function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IPair(pairFor(tokenA, tokenB, stable)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    /// @dev performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IPairFactory(factory).isPair(pair)) {
            amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IPairFactory(factory).isPair(pair)) {
            amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    /// @dev performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, Route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, "Equalizer Router: INVALID_PATH");
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IPairFactory(factory).isPair(pair)) {
                amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IPairFactory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = IERC20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = IERC20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin, "Equalizer Router: invalid desired amountA");
        require(amountBDesired >= amountBMin, "Equalizer Router: invalid desired amountB");
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, "Equalizer Router: INSUFFICIENT_B_AMOUNT");
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, "Equalizer Router: INSUFFICIENT_A_AMOUNT");
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(weth),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(weth), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        weth.deposit{value: amountETH}();
        assert(weth.transfer(pair, amountETH));
        liquidity = IPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IPair(pair).transferFrom(msg.sender, pair, liquidity), "Equalizer Router: transfer failed"); // send liquidity to pair
        (uint amount0, uint amount1) = IPair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, "Equalizer Router: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "Equalizer Router: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    /// @dev requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, Route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        Route[] memory routes = new Route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, Route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(weth), "Equalizer Router: INVALID_PATH");
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        weth.deposit{value: amounts[0]}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(weth), "Equalizer Router: INVALID_PATH");
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, "Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT");
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        weth.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

    /***************************************************************************************************************************
     ***************************************************************************************************************************
     ** Experimental Extension [ftm.guru/solidly/BaseV1Router02]
     ***************************************************************************************************************************
     */

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }
    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(Route[] calldata routes, address _to) internal virtual {
        for (uint i; i < routes.length; i++) {
        	(address input, address output) = (routes[i].from, routes[i].to);
            (address token0,) = sortTokens(input, output);
            IPair pair = IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput,) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)) - (reserveInput);
            (amountOutput,) = getAmountOut(amountInput, input, output);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) {
        _safeTransferFrom(
        	routes[0].from,
        	msg.sender,
        	pairFor(routes[0].from, routes[0].to, routes[0].stable),
        	amountIn
        );
        uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin,
            'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    )
        external
        payable
        ensure(deadline)
    {
        require(routes[0].from == address(weth), 'Equalizer Router: INVALID_PATH');
        uint amountIn = msg.value;
        weth.deposit{value: amountIn}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn));
        uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            IERC20(routes[routes.length - 1].to).balanceOf(to) - (balanceBefore) >= amountOutMin,
            'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    )
        external
        ensure(deadline)
    {
        require(routes[routes.length - 1].to == address(weth), 'Equalizer Router: INVALID_PATH');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn
        );
        _swapSupportingFeeOnTransferTokens(routes, address(this));
        uint amountOut = IERC20(address(weth)).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'Equalizer Router: INSUFFICIENT_OUTPUT_AMOUNT');
        weth.withdraw(amountOut);
        _safeTransferETH(to, amountOut);
    }


    function _safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0, "Equalizer Router: invalid token");
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: token transfer failed");
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0, "Equalizer Router: invalid token");
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Equalizer Router: token transfer failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairCodeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162004b1738038062004b178339810160408190526200003491620000e8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab924891600480820192602092909190829003018186803b1580156200007a57600080fd5b505afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b5919062000120565b60c0526001600160a01b031660a052506200013a565b80516001600160a01b0381168114620000e357600080fd5b919050565b60008060408385031215620000fc57600080fd5b6200010783620000cb565b91506200011760208401620000cb565b90509250929050565b6000602082840312156200013357600080fd5b5051919050565b60805160a05160c0516148db6200023c60003960006104bf0152600081816101b00152818161027d01528181610a6b01528181610caa01528181610f3a0152818161161601528181611729015281816117d801528181611c8501528181611d0301528181611d9801528181611fb60152818161206901528181612123015281816127570152818161278d015281816127c20152818161287b015281816129d401528181612a2401528181612acb0152612d7201526000818161053401528181610db101528181611022015281816112d201528181611404015281816122c80152818161245a01528181612ba101528181613377015261342701526148db6000f3fe6080604052600436106101a05760003560e01c80637301e3c8116100ec578063b7e0d4c01161008a578063e2d9d4dc11610064578063e2d9d4dc14610576578063e5e31b1314610596578063f41766d8146105c6578063fe411f14146105e657600080fd5b8063b7e0d4c01461050f578063c45a015514610522578063d7b0e0a51461055657600080fd5b80639881fcb4116100c65780639881fcb41461046d57806398a0fb3c1461048d5780639aab9248146104ad578063a32b1fcd146104ef57600080fd5b80637301e3c81461041a57806376c727511461043a5780637af728c81461044d57600080fd5b80634c1ee03e116101595780635e1e6325116101335780635e1e6325146103925780635e60dab5146103c757806367ffb66a146103e75780636cc1ae13146103fa57600080fd5b80634c1ee03e146102f7578063544caa56146103175780635a47ddc31461035757600080fd5b80630dede6c4146101e457806313dcfc591461021e57806318a130861461024b5780633fc8cef31461026b5780634386e63c146102b7578063448725b4146102d757600080fd5b366101df57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101dd576101dd613ba2565b005b600080fd5b3480156101f057600080fd5b506102046101ff366004613be9565b610606565b604080519283526020830191909152015b60405180910390f35b34801561022a57600080fd5b5061023e610239366004613c6e565b61082b565b6040516102159190613ce9565b34801561025757600080fd5b5061023e610266366004613d72565b610a3e565b34801561027757600080fd5b5061029f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610215565b3480156102c357600080fd5b506102046102d2366004613de5565b610daa565b3480156102e357600080fd5b506102046102f2366004613e47565b610f2f565b34801561030357600080fd5b5061029f610312366004613ef1565b611008565b34801561032357600080fd5b50610337610332366004613f3c565b6110b3565b604080516001600160a01b03938416815292909116602083015201610215565b34801561036357600080fd5b50610377610372366004613f75565b6111ab565b60408051938452602084019290925290820152606001610215565b34801561039e57600080fd5b506103b26103ad366004614004565b61129a565b60408051928352901515602083015201610215565b3480156103d357600080fd5b506102046103e2366004613ef1565b61152a565b61023e6103f536600461403b565b6115f1565b34801561040657600080fd5b506101dd610415366004613d72565b611980565b34801561042657600080fd5b5061023e61043536600461410d565b611b8c565b6101dd61044836600461403b565b611c62565b34801561045957600080fd5b506101dd610468366004613d72565b611f8b565b34801561047957600080fd5b5061023e61048836600461424f565b6121b2565b34801561049957600080fd5b506103776104a83660046142f5565b612452565b3480156104b957600080fd5b506104e17f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610215565b3480156104fb57600080fd5b5061020461050a366004614350565b612670565b61037761051d36600461440c565b61272b565b34801561052e57600080fd5b5061029f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056257600080fd5b5061020461057136600461440c565b6129aa565b34801561058257600080fd5b50610204610591366004613e47565b612ac0565b3480156105a257600080fd5b506105b66105b1366004614467565b612b7f565b6040519015158152602001610215565b3480156105d257600080fd5b5061023e6105e1366004613d72565b612c23565b3480156105f257600080fd5b5061020461060136600461440c565b612d48565b60008082428110156106335760405162461bcd60e51b815260040161062a90614484565b60405180910390fd5b60006106408c8c8c611008565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561069157600080fd5b505af11580156106a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c991906144bb565b61071f5760405162461bcd60e51b815260206004820152602160248201527f457175616c697a657220526f757465723a207472616e73666572206661696c656044820152601960fa1b606482015260840161062a565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561076657600080fd5b505af115801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e91906144d8565b9150915060006107ae8f8f6110b3565b509050806001600160a01b03168f6001600160a01b0316146107d15781836107d4565b82825b90975095508a8710156107f95760405162461bcd60e51b815260040161062a906144fc565b898610156108195760405162461bcd60e51b815260040161062a90614543565b50505050509850989650505050505050565b6060814281101561084e5760405162461bcd60e51b815260040161062a90614484565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161086557905050905087816000815181106108a8576108a861458a565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106108e0576108e061458a565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106109185761091861458a565b60209081029190910101519015156040909101526109368a826121b2565b925088836001855161094891906145b6565b815181106109585761095861458a565b6020026020010151101561097e5760405162461bcd60e51b815260040161062a906145cd565b610a26816000815181106109945761099461458a565b60200260200101516000015133610a06846000815181106109b7576109b761458a565b602002602001015160000151856000815181106109d6576109d661458a565b602002602001015160200151866000815181106109f5576109f561458a565b602002602001015160400151611008565b86600081518110610a1957610a1961458a565b6020026020010151612e25565b610a31838287612f73565b5050979650505050505050565b60608142811015610a615760405162461bcd60e51b815260040161062a90614484565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610a986001826145b6565b818110610aa757610aa761458a565b9050606002016020016020810190610abf9190614467565b6001600160a01b031614610ae55760405162461bcd60e51b815260040161062a90614619565b610b41888787808060200260200160405190810160405280939291908181526020016000905b82821015610b3757610b2860608302860136819003810190614650565b81526020019060010190610b0b565b50505050506121b2565b9150868260018451610b5391906145b6565b81518110610b6357610b6361458a565b60200260200101511015610b895760405162461bcd60e51b815260040161062a906145cd565b610c4b86866000818110610b9f57610b9f61458a565b610bb59260206060909202019081019150614467565b33610c3889896000818110610bcc57610bcc61458a565b610be29260206060909202019081019150614467565b8a8a6000818110610bf557610bf561458a565b9050606002016020016020810190610c0d9190614467565b8b8b6000818110610c2057610c2061458a565b9050606002016040016020810190610312919061466c565b85600081518110610a1957610a1961458a565b610ca8828787808060200260200160405190810160405280939291908181526020016000905b82821015610c9d57610c8e60608302860136819003810190614650565b81526020019060010190610c71565b505050505030612f73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610ce691906145b6565b81518110610cf657610cf661458a565b60200260200101516040518263ffffffff1660e01b8152600401610d1c91815260200190565b602060405180830381600087803b158015610d3657600080fd5b505af1158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190614689565b50610d9f848360018551610d8291906145b6565b81518110610d9257610d9261458a565b60200260200101516131c8565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610dff939291906146a2565b60206040518083038186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f91906146c6565b90506001600160a01b038116610e6c576000809250925050610f26565b600080610e7a89898961152a565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb957600080fd5b505afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190614689565b905080610efe84896146e3565b610f089190614702565b955080610f1583896146e3565b610f1f9190614702565b9450505050505b94509492505050565b6000806000610f5f8e7f00000000000000000000000000000000000000000000000000000000000000008f611008565b9050600087610f6e578c610f72565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610fad903390309086908f908e908e908e90600401614724565b600060405180830381600087803b158015610fc757600080fd5b505af1158015610fdb573d6000803e3d6000fd5b50505050610fee8f8f8f8f8f8f8f6129aa565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc309061105b908790879087906004016146a2565b60206040518083038186803b15801561107357600080fd5b505afa158015611087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ab91906146c6565b949350505050565b600080826001600160a01b0316846001600160a01b031614156111265760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b606482015260840161062a565b826001600160a01b0316846001600160a01b031610611146578284611149565b83835b90925090506001600160a01b0382166111a45760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f414444524553530000604482015260640161062a565b9250929050565b600080600083428110156111d15760405162461bcd60e51b815260040161062a90614484565b6111e08d8d8d8d8d8d8d613296565b909450925060006111f28e8e8e611008565b90506112008e338388612e25565b61120c8d338387612e25565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561124f57600080fd5b505af1158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190614689565b9250505099509950999650505050505050565b60008060006112ab85856001611008565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e91906144bb565b156113d6576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614689565b91505b6113e287876000611008565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561144857600080fd5b505afa15801561145c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148091906144bb565b15611508576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115059190614689565b90505b8082116115175780600061151b565b8160015b94509450505050935093915050565b600080600061153986866110b3565b50905060008061154a888888611008565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba9190614765565b5091509150826001600160a01b0316886001600160a01b0316146115df5780826115e2565b81815b90999098509650505050505050565b606081428110156116145760405162461bcd60e51b815260040161062a90614484565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106116515761165161458a565b6116679260206060909202019081019150614467565b6001600160a01b03161461168d5760405162461bcd60e51b815260040161062a90614619565b6116df348787808060200260200160405190810160405280939291908181526020016000905b82821015610b37576116d060608302860136819003810190614650565b815260200190600101906116b3565b91508682600184516116f191906145b6565b815181106117015761170161458a565b602002602001015110156117275760405162461bcd60e51b815260040161062a906145cd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106117695761176961458a565b60200260200101516040518263ffffffff1660e01b81526004016020604051808303818588803b15801561179c57600080fd5b505af11580156117b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117d59190614689565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61186f8888600081811061181b5761181b61458a565b6118319260206060909202019081019150614467565b898960008181106118445761184461458a565b905060600201602001602081019061185c9190614467565b8a8a6000818110610c2057610c2061458a565b846000815181106118825761188261458a565b60200260200101516040518363ffffffff1660e01b81526004016118bb9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906144bb565b61191957611919613ba2565b611976828787808060200260200160405190810160405280939291908181526020016000905b8282101561196b5761195c60608302860136819003810190614650565b8152602001906001019061193f565b505050505086612f73565b5095945050505050565b80428110156119a15760405162461bcd60e51b815260040161062a90614484565b6119ea858560008181106119b7576119b761458a565b6119cd9260206060909202019081019150614467565b336119e48888600081811061181b5761181b61458a565b8a612e25565b600085856119f96001826145b6565b818110611a0857611a0861458a565b9050606002016020016020810190611a209190614467565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190614689565b9050611aa886868661357c565b86818787611ab76001826145b6565b818110611ac657611ac661458a565b9050606002016020016020810190611ade9190614467565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614689565b611b6491906145b6565b1015611b825760405162461bcd60e51b815260040161062a906145cd565b5050505050505050565b60608142811015611baf5760405162461bcd60e51b815260040161062a90614484565b611c0586866000818110611bc557611bc561458a565b611bdb9260206060909202019081019150614467565b33611bf289896000818110610bcc57610bcc61458a565b8a600081518110610a1957610a1961458a565b611c57878787808060200260200160405190810160405280939291908181526020016000905b8282101561196b57611c4860608302860136819003810190614650565b81526020019060010190611c2b565b509495945050505050565b8042811015611c835760405162461bcd60e51b815260040161062a90614484565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611cc057611cc061458a565b611cd69260206060909202019081019150614467565b6001600160a01b031614611cfc5760405162461bcd60e51b815260040161062a90614619565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016020604051808303818588803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d959190614689565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611ddb8888600081811061181b5761181b61458a565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611e2357600080fd5b505af1158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b91906144bb565b611e6757611e67613ba2565b60008686611e766001826145b6565b818110611e8557611e8561458a565b9050606002016020016020810190611e9d9190614467565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b158015611ee057600080fd5b505afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190614689565b9050611f2587878761357c565b87818888611f346001826145b6565b818110611f4357611f4361458a565b9050606002016020016020810190611f5b9190614467565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611b0a565b8042811015611fac5760405162461bcd60e51b815260040161062a90614484565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611fe36001826145b6565b818110611ff257611ff261458a565b905060600201602001602081019061200a9190614467565b6001600160a01b0316146120305760405162461bcd60e51b815260040161062a90614619565b612046858560008181106119b7576119b761458a565b61205185853061357c565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156120b357600080fd5b505afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb9190614689565b90508681101561210d5760405162461bcd60e51b815260040161062a906145cd565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401602060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a79190614689565b50611b8284826131c8565b60606001825110156121d65760405162461bcd60e51b815260040161062a90614619565b81516121e3906001614793565b67ffffffffffffffff8111156121fb576121fb6140a2565b604051908082528060200260200182016040528015612224578160200160208202803683370190505b509050828160008151811061223b5761223b61458a565b60200260200101818152505060005b825181101561244b5760006122a684838151811061226a5761226a61458a565b6020026020010151600001518584815181106122885761228861458a565b6020026020010151602001518685815181106109f5576109f561458a565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234491906144bb565b1561243857806001600160a01b031663f140a35a84848151811061236a5761236a61458a565b60200260200101518685815181106123845761238461458a565b6020026020010151600001516040518363ffffffff1660e01b81526004016123bf9291909182526001600160a01b0316602082015260400190565b60206040518083038186803b1580156123d757600080fd5b505afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614689565b8361241b846001614793565b8151811061242b5761242b61458a565b6020026020010181815250505b5080612443816147ab565b91505061224a565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016124a8939291906146a2565b60206040518083038186803b1580156124c057600080fd5b505afa1580156124d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f891906146c6565b9050600080806001600160a01b0384161561259157836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561254657600080fd5b505afa15801561255a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257e9190614689565b905061258b8c8c8c61152a565b90935091505b8215801561259d575081155b156125ce578896508795506103e86125bd6125b8888a6146e3565b6138f4565b6125c791906145b6565b9450612661565b60006125db8a8585613964565b90508881116126235789975095508561261c846125f8848b6146e3565b6126029190614702565b8461260d858b6146e3565b6126179190614702565b613a45565b955061265f565b60006126308a8587613964565b985089975088905061265b8561264685846146e3565b6126509190614702565b8561260d868c6146e3565b9650505b505b50505050955095509592505050565b60008060006126808f8f8f611008565b905060008761268f578c612693565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906126ce903390309086908f908e908e908e90600401614724565b600060405180830381600087803b1580156126e857600080fd5b505af11580156126fc573d6000803e3d6000fd5b50505050506127118f8f8f8f8f8f8f8f610606565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156127515760405162461bcd60e51b815260040161062a90614484565b6127808b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613296565b909450925060006127b28c7f00000000000000000000000000000000000000000000000000000000000000008d611008565b90506127c08c338388612e25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016020604051808303818588803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128549190614689565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156128bf57600080fd5b505af11580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906144bb565b61290357612903613ba2565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561294657600080fd5b505af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190614689565b92508334111561299b5761299b3361299686346145b6565b6131c8565b50509750975097945050505050565b60008082428110156129ce5760405162461bcd60e51b815260040161062a90614484565b6129fe8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610606565b9093509150612a0e8a8685613a5d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401602060405180830381600087803b158015612a7057600080fd5b505af1158015612a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa89190614689565b50612ab385836131c8565b5097509795505050505050565b6000806000612af08e7f00000000000000000000000000000000000000000000000000000000000000008f611008565b9050600087612aff578c612b03565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612b3e903390309086908f908e908e908e90600401614724565b600060405180830381600087803b158015612b5857600080fd5b505af1158015612b6c573d6000803e3d6000fd5b50505050610fee8f8f8f8f8f8f8f612d48565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b139060240160206040518083038186803b158015612be557600080fd5b505afa158015612bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1d91906144bb565b92915050565b60608142811015612c465760405162461bcd60e51b815260040161062a90614484565b612c98888787808060200260200160405190810160405280939291908181526020016000905b82821015610b3757612c8960608302860136819003810190614650565b81526020019060010190612c6c565b9150868260018451612caa91906145b6565b81518110612cba57612cba61458a565b60200260200101511015612ce05760405162461bcd60e51b815260040161062a906145cd565b612cf686866000818110610b9f57610b9f61458a565b610d9f828787808060200260200160405190810160405280939291908181526020016000905b8282101561196b57612d3960608302860136819003810190614650565b81526020019060010190612d1c565b6000808242811015612d6c5760405162461bcd60e51b815260040161062a90614484565b612d9c8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b610606565b6040516370a0823160e01b81523060048201529194509250612a0e908b9087906001600160a01b038316906370a082319060240160206040518083038186803b158015612de857600080fd5b505afa158015612dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e209190614689565b613a5d565b6000846001600160a01b03163b11612e7f5760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e00604482015260640161062a565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612ee391906147f2565b6000604051808303816000865af19150503d8060008114612f20576040519150601f19603f3d011682016040523d82523d6000602084013e612f25565b606091505b5091509150818015612f4f575080511580612f4f575080806020019051810190612f4f91906144bb565b612f6b5760405162461bcd60e51b815260040161062a9061480e565b505050505050565b60005b82518110156131c2576000612fc5848381518110612f9657612f9661458a565b602002602001015160000151858481518110612fb457612fb461458a565b6020026020010151602001516110b3565b509050600085612fd6846001614793565b81518110612fe657612fe661458a565b60200260200101519050600080836001600160a01b031687868151811061300f5761300f61458a565b6020026020010151600001516001600160a01b03161461303157826000613035565b6000835b9150915060006001885161304991906145b6565b861061305557866130c8565b6130c888613064886001614793565b815181106130745761307461458a565b6020026020010151600001518988600161308e9190614793565b8151811061309e5761309e61458a565b6020026020010151602001518a8960016130b89190614793565b815181106109f5576109f561458a565b905061311b8887815181106130df576130df61458a565b6020026020010151600001518988815181106130fd576130fd61458a565b6020026020010151602001518a89815181106109f5576109f561458a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613158576020820181803683370190505b506040518563ffffffff1660e01b81526004016131789493929190614855565b600060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b50505050505050505080806131ba906147ab565b915050612f76565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516131f291906147f2565b60006040518083038185875af1925050503d806000811461322f576040519150601f19603f3d011682016040523d82523d6000602084013e613234565b606091505b50509050806132915760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161062a565b505050565b600080838610156132fb5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b606482015260840161062a565b8285101561335d5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b606482015260840161062a565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc30906133b0908d908d908d906004016146a2565b60206040518083038186803b1580156133c857600080fd5b505afa1580156133dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340091906146c6565b90506001600160a01b0381166134b5576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490613460908d908d908d906004016146a2565b602060405180830381600087803b15801561347a57600080fd5b505af115801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b291906146c6565b90505b6000806134c38c8c8c61152a565b915091508160001480156134d5575080155b156134e55788945087935061356d565b60006134f28a8484613964565b9050888111613526578681101561351b5760405162461bcd60e51b815260040161062a90614543565b89955093508361356b565b60006135338a8486613964565b90508a81111561354557613545613ba2565b888110156135655760405162461bcd60e51b815260040161062a906144fc565b95508894505b505b50505097509795505050505050565b60005b828110156131c25760008085858481811061359c5761359c61458a565b6135b29260206060909202019081019150614467565b8686858181106135c4576135c461458a565b90506060020160200160208101906135dc9190614467565b9150915060006135ec83836110b3565b50905060006136588888878181106136065761360661458a565b61361c9260206060909202019081019150614467565b89898881811061362e5761362e61458a565b90506060020160200160208101906136469190614467565b8a8a89818110610c2057610c2061458a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561369957600080fd5b505afa1580156136ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d19190614765565b50915091506000866001600160a01b0316896001600160a01b0316146136f85781836136fb565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a082319060240160206040518083038186803b15801561374257600080fd5b505afa158015613756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377a9190614689565b61378491906145b6565b9450613791858a8a61129a565b5080945050505050600080856001600160a01b0316886001600160a01b0316146137bd578260006137c1565b6000835b909250905060006137d360018d6145b6565b8a106137df578a613864565b6138648d8d6137ef8d6001614793565b8181106137fe576137fe61458a565b6138149260206060909202019081019150614467565b8e8e6138218e6001614793565b8181106138305761383061458a565b90506060020160200160208101906138489190614467565b8f8f6138558f6001614793565b818110610c2057610c2061458a565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906138a69086908690869060248101614855565b600060405180830381600087803b1580156138c057600080fd5b505af11580156138d4573d6000803e3d6000fd5b5050505050505050505050505080806138ec906147ab565b91505061357f565b60006003821115613955575080600061390e600283614702565b613919906001614793565b90505b8181101561394f579050806002816139348186614702565b61393e9190614793565b6139489190614702565b905061391c565b50919050565b811561395f575060015b919050565b60008084116139c35760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b606482015260840161062a565b6000831180156139d35750600082115b613a305760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b606482015260840161062a565b82613a3b83866146e3565b6110ab9190614702565b6000818310613a545781613a56565b825b9392505050565b6000836001600160a01b03163b11613ab75760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e00604482015260640161062a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b1391906147f2565b6000604051808303816000865af19150503d8060008114613b50576040519150601f19603f3d011682016040523d82523d6000602084013e613b55565b606091505b5091509150818015613b7f575080511580613b7f575080806020019051810190613b7f91906144bb565b613b9b5760405162461bcd60e51b815260040161062a9061480e565b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613bcd57600080fd5b50565b803561395f81613bb8565b8015158114613bcd57600080fd5b600080600080600080600080610100898b031215613c0657600080fd5b8835613c1181613bb8565b97506020890135613c2181613bb8565b96506040890135613c3181613bdb565b9550606089013594506080890135935060a0890135925060c0890135613c5681613bb8565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613c8957600080fd5b87359650602088013595506040880135613ca281613bb8565b94506060880135613cb281613bb8565b93506080880135613cc281613bdb565b925060a0880135613cd281613bb8565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d2157835183529284019291840191600101613d05565b50909695505050505050565b60008083601f840112613d3f57600080fd5b50813567ffffffffffffffff811115613d5757600080fd5b6020830191508360206060830285010111156111a457600080fd5b60008060008060008060a08789031215613d8b57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613db057600080fd5b613dbc89828a01613d2d565b9095509350506060870135613dd081613bb8565b80925050608087013590509295509295509295565b60008060008060808587031215613dfb57600080fd5b8435613e0681613bb8565b93506020850135613e1681613bb8565b92506040850135613e2681613bdb565b9396929550929360600135925050565b803560ff8116811461395f57600080fd5b60008060008060008060008060008060006101608c8e031215613e6957600080fd5b8b35613e7481613bb8565b9a5060208c0135613e8481613bdb565b995060408c0135985060608c0135975060808c0135965060a08c0135613ea981613bb8565b955060c08c0135945060e08c0135613ec081613bdb565b9350613ecf6101008d01613e36565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613f0657600080fd5b8335613f1181613bb8565b92506020840135613f2181613bb8565b91506040840135613f3181613bdb565b809150509250925092565b60008060408385031215613f4f57600080fd5b8235613f5a81613bb8565b91506020830135613f6a81613bb8565b809150509250929050565b60008060008060008060008060006101208a8c031215613f9457600080fd5b8935613f9f81613bb8565b985060208a0135613faf81613bb8565b975060408a0135613fbf81613bdb565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613feb81613bb8565b809250506101008a013590509295985092959850929598565b60008060006060848603121561401957600080fd5b83359250602084013561402b81613bb8565b91506040840135613f3181613bb8565b60008060008060006080868803121561405357600080fd5b85359450602086013567ffffffffffffffff81111561407157600080fd5b61407d88828901613d2d565b909550935050604086013561409181613bb8565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156140e1576140e16140a2565b604052919050565b600067ffffffffffffffff821115614103576141036140a2565b5060051b60200190565b60008060008060006080868803121561412557600080fd5b853567ffffffffffffffff8082111561413d57600080fd5b818801915088601f83011261415157600080fd5b81356020614166614161836140e9565b6140b8565b82815260059290921b8401810191818101908c84111561418557600080fd5b948201945b838610156141a35785358252948201949082019061418a565b995050890135925050808211156141b957600080fd5b506141c688828901613d2d565b9095509350614091905060408701613bd0565b6000606082840312156141eb57600080fd5b6040516060810181811067ffffffffffffffff8211171561420e5761420e6140a2565b604052905080823561421f81613bb8565b8152602083013561422f81613bb8565b6020820152604083013561424281613bdb565b6040919091015292915050565b6000806040838503121561426257600080fd5b8235915060208084013567ffffffffffffffff81111561428157600080fd5b8401601f8101861361429257600080fd5b80356142a0614161826140e9565b818152606091820283018401918482019190898411156142bf57600080fd5b938501935b838510156142e5576142d68a866141d9565b835293840193918501916142c4565b5080955050505050509250929050565b600080600080600060a0868803121561430d57600080fd5b853561431881613bb8565b9450602086013561432881613bb8565b9350604086013561433881613bdb565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561437357600080fd5b8c3561437e81613bb8565b9b5060208d013561438e81613bb8565b9a5060408d013561439e81613bdb565b995060608d0135985060808d0135975060a08d0135965060c08d01356143c381613bb8565b955060e08d013594506101008d01356143db81613bdb565b93506143ea6101208e01613e36565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561442757600080fd5b873561443281613bb8565b9650602088013561444281613bdb565b955060408801359450606088013593506080880135925060a0880135613cd281613bb8565b60006020828403121561447957600080fd5b8135613a5681613bb8565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b6000602082840312156144cd57600080fd5b8151613a5681613bdb565b600080604083850312156144eb57600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145c8576145c86145a0565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b60006060828403121561466257600080fd5b613a5683836141d9565b60006020828403121561467e57600080fd5b8135613a5681613bdb565b60006020828403121561469b57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d857600080fd5b8151613a5681613bb8565b60008160001904831182151516156146fd576146fd6145a0565b500290565b60008261471f57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561477a57600080fd5b8351925060208401519150604084015190509250925092565b600082198211156147a6576147a66145a0565b500190565b60006000198214156147bf576147bf6145a0565b5060010190565b60005b838110156147e15781810151838201526020016147c9565b838111156131c25750506000910152565b600082516148048184602087016147c6565b9190910192915050565b60208082526027908201527f457175616c697a657220526f757465723a20746f6b656e207472616e736665726040820152660819985a5b195960ca1b606082015260800190565b84815283602082015260018060a01b0383166040820152608060608201526000825180608084015261488e8160a08501602087016147c6565b601f01601f19169190910160a0019594505050505056fea26469706673582212208d13bb610d984630b1ac638e933819188d85103d5e6c9febe3cb38fc333bc17364736f6c63430008090033000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

Deployed Bytecode

0x6080604052600436106101a05760003560e01c80637301e3c8116100ec578063b7e0d4c01161008a578063e2d9d4dc11610064578063e2d9d4dc14610576578063e5e31b1314610596578063f41766d8146105c6578063fe411f14146105e657600080fd5b8063b7e0d4c01461050f578063c45a015514610522578063d7b0e0a51461055657600080fd5b80639881fcb4116100c65780639881fcb41461046d57806398a0fb3c1461048d5780639aab9248146104ad578063a32b1fcd146104ef57600080fd5b80637301e3c81461041a57806376c727511461043a5780637af728c81461044d57600080fd5b80634c1ee03e116101595780635e1e6325116101335780635e1e6325146103925780635e60dab5146103c757806367ffb66a146103e75780636cc1ae13146103fa57600080fd5b80634c1ee03e146102f7578063544caa56146103175780635a47ddc31461035757600080fd5b80630dede6c4146101e457806313dcfc591461021e57806318a130861461024b5780633fc8cef31461026b5780634386e63c146102b7578063448725b4146102d757600080fd5b366101df57336001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8316146101dd576101dd613ba2565b005b600080fd5b3480156101f057600080fd5b506102046101ff366004613be9565b610606565b604080519283526020830191909152015b60405180910390f35b34801561022a57600080fd5b5061023e610239366004613c6e565b61082b565b6040516102159190613ce9565b34801561025757600080fd5b5061023e610266366004613d72565b610a3e565b34801561027757600080fd5b5061029f7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b6040516001600160a01b039091168152602001610215565b3480156102c357600080fd5b506102046102d2366004613de5565b610daa565b3480156102e357600080fd5b506102046102f2366004613e47565b610f2f565b34801561030357600080fd5b5061029f610312366004613ef1565b611008565b34801561032357600080fd5b50610337610332366004613f3c565b6110b3565b604080516001600160a01b03938416815292909116602083015201610215565b34801561036357600080fd5b50610377610372366004613f75565b6111ab565b60408051938452602084019290925290820152606001610215565b34801561039e57600080fd5b506103b26103ad366004614004565b61129a565b60408051928352901515602083015201610215565b3480156103d357600080fd5b506102046103e2366004613ef1565b61152a565b61023e6103f536600461403b565b6115f1565b34801561040657600080fd5b506101dd610415366004613d72565b611980565b34801561042657600080fd5b5061023e61043536600461410d565b611b8c565b6101dd61044836600461403b565b611c62565b34801561045957600080fd5b506101dd610468366004613d72565b611f8b565b34801561047957600080fd5b5061023e61048836600461424f565b6121b2565b34801561049957600080fd5b506103776104a83660046142f5565b612452565b3480156104b957600080fd5b506104e17f02ada2a0163cd4f7e0f0c9805f5230716a95b174140e4c84c14883de216cc6a381565b604051908152602001610215565b3480156104fb57600080fd5b5061020461050a366004614350565b612670565b61037761051d36600461440c565b61272b565b34801561052e57600080fd5b5061029f7f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a81565b34801561056257600080fd5b5061020461057136600461440c565b6129aa565b34801561058257600080fd5b50610204610591366004613e47565b612ac0565b3480156105a257600080fd5b506105b66105b1366004614467565b612b7f565b6040519015158152602001610215565b3480156105d257600080fd5b5061023e6105e1366004613d72565b612c23565b3480156105f257600080fd5b5061020461060136600461440c565b612d48565b60008082428110156106335760405162461bcd60e51b815260040161062a90614484565b60405180910390fd5b60006106408c8c8c611008565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561069157600080fd5b505af11580156106a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c991906144bb565b61071f5760405162461bcd60e51b815260206004820152602160248201527f457175616c697a657220526f757465723a207472616e73666572206661696c656044820152601960fa1b606482015260840161062a565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561076657600080fd5b505af115801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e91906144d8565b9150915060006107ae8f8f6110b3565b509050806001600160a01b03168f6001600160a01b0316146107d15781836107d4565b82825b90975095508a8710156107f95760405162461bcd60e51b815260040161062a906144fc565b898610156108195760405162461bcd60e51b815260040161062a90614543565b50505050509850989650505050505050565b6060814281101561084e5760405162461bcd60e51b815260040161062a90614484565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161086557905050905087816000815181106108a8576108a861458a565b6020026020010151600001906001600160a01b031690816001600160a01b03168152505086816000815181106108e0576108e061458a565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106109185761091861458a565b60209081029190910101519015156040909101526109368a826121b2565b925088836001855161094891906145b6565b815181106109585761095861458a565b6020026020010151101561097e5760405162461bcd60e51b815260040161062a906145cd565b610a26816000815181106109945761099461458a565b60200260200101516000015133610a06846000815181106109b7576109b761458a565b602002602001015160000151856000815181106109d6576109d661458a565b602002602001015160200151866000815181106109f5576109f561458a565b602002602001015160400151611008565b86600081518110610a1957610a1961458a565b6020026020010151612e25565b610a31838287612f73565b5050979650505050505050565b60608142811015610a615760405162461bcd60e51b815260040161062a90614484565b6001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83168686610a986001826145b6565b818110610aa757610aa761458a565b9050606002016020016020810190610abf9190614467565b6001600160a01b031614610ae55760405162461bcd60e51b815260040161062a90614619565b610b41888787808060200260200160405190810160405280939291908181526020016000905b82821015610b3757610b2860608302860136819003810190614650565b81526020019060010190610b0b565b50505050506121b2565b9150868260018451610b5391906145b6565b81518110610b6357610b6361458a565b60200260200101511015610b895760405162461bcd60e51b815260040161062a906145cd565b610c4b86866000818110610b9f57610b9f61458a565b610bb59260206060909202019081019150614467565b33610c3889896000818110610bcc57610bcc61458a565b610be29260206060909202019081019150614467565b8a8a6000818110610bf557610bf561458a565b9050606002016020016020810190610c0d9190614467565b8b8b6000818110610c2057610c2061458a565b9050606002016040016020810190610312919061466c565b85600081518110610a1957610a1961458a565b610ca8828787808060200260200160405190810160405280939291908181526020016000905b82821015610c9d57610c8e60608302860136819003810190614650565b81526020019060010190610c71565b505050505030612f73565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316632e1a7d4d8360018551610ce691906145b6565b81518110610cf657610cf661458a565b60200260200101516040518263ffffffff1660e01b8152600401610d1c91815260200190565b602060405180830381600087803b158015610d3657600080fd5b505af1158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190614689565b50610d9f848360018551610d8291906145b6565b81518110610d9257610d9261458a565b60200260200101516131c8565b509695505050505050565b60008060007f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a6001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610dff939291906146a2565b60206040518083038186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f91906146c6565b90506001600160a01b038116610e6c576000809250925050610f26565b600080610e7a89898961152a565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb957600080fd5b505afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190614689565b905080610efe84896146e3565b610f089190614702565b955080610f1583896146e3565b610f1f9190614702565b9450505050505b94509492505050565b6000806000610f5f8e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838f611008565b9050600087610f6e578c610f72565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610fad903390309086908f908e908e908e90600401614724565b600060405180830381600087803b158015610fc757600080fd5b505af1158015610fdb573d6000803e3d6000fd5b50505050610fee8f8f8f8f8f8f8f6129aa565b809450819550505050509b509b9950505050505050505050565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a1690636801cc309061105b908790879087906004016146a2565b60206040518083038186803b15801561107357600080fd5b505afa158015611087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ab91906146c6565b949350505050565b600080826001600160a01b0316846001600160a01b031614156111265760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a204944454e544943414c5f41444452604482015264455353455360d81b606482015260840161062a565b826001600160a01b0316846001600160a01b031610611146578284611149565b83835b90925090506001600160a01b0382166111a45760405162461bcd60e51b815260206004820152601e60248201527f457175616c697a657220526f757465723a205a45524f5f414444524553530000604482015260640161062a565b9250929050565b600080600083428110156111d15760405162461bcd60e51b815260040161062a90614484565b6111e08d8d8d8d8d8d8d613296565b909450925060006111f28e8e8e611008565b90506112008e338388612e25565b61120c8d338387612e25565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561124f57600080fd5b505af1158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190614689565b9250505099509950999650505050505050565b60008060006112ab85856001611008565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e91906144bb565b156113d6576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614689565b91505b6113e287876000611008565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b15801561144857600080fd5b505afa15801561145c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148091906144bb565b15611508576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a9060440160206040518083038186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115059190614689565b90505b8082116115175780600061151b565b8160015b94509450505050935093915050565b600080600061153986866110b3565b50905060008061154a888888611008565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba9190614765565b5091509150826001600160a01b0316886001600160a01b0316146115df5780826115e2565b81815b90999098509650505050505050565b606081428110156116145760405162461bcd60e51b815260040161062a90614484565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316868660008181106116515761165161458a565b6116679260206060909202019081019150614467565b6001600160a01b03161461168d5760405162461bcd60e51b815260040161062a90614619565b6116df348787808060200260200160405190810160405280939291908181526020016000905b82821015610b37576116d060608302860136819003810190614650565b815260200190600101906116b3565b91508682600184516116f191906145b6565b815181106117015761170161458a565b602002602001015110156117275760405162461bcd60e51b815260040161062a906145cd565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0836000815181106117695761176961458a565b60200260200101516040518263ffffffff1660e01b81526004016020604051808303818588803b15801561179c57600080fd5b505af11580156117b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117d59190614689565b507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663a9059cbb61186f8888600081811061181b5761181b61458a565b6118319260206060909202019081019150614467565b898960008181106118445761184461458a565b905060600201602001602081019061185c9190614467565b8a8a6000818110610c2057610c2061458a565b846000815181106118825761188261458a565b60200260200101516040518363ffffffff1660e01b81526004016118bb9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156118d557600080fd5b505af11580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906144bb565b61191957611919613ba2565b611976828787808060200260200160405190810160405280939291908181526020016000905b8282101561196b5761195c60608302860136819003810190614650565b8152602001906001019061193f565b505050505086612f73565b5095945050505050565b80428110156119a15760405162461bcd60e51b815260040161062a90614484565b6119ea858560008181106119b7576119b761458a565b6119cd9260206060909202019081019150614467565b336119e48888600081811061181b5761181b61458a565b8a612e25565b600085856119f96001826145b6565b818110611a0857611a0861458a565b9050606002016020016020810190611a209190614467565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190614689565b9050611aa886868661357c565b86818787611ab76001826145b6565b818110611ac657611ac661458a565b9050606002016020016020810190611ade9190614467565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614689565b611b6491906145b6565b1015611b825760405162461bcd60e51b815260040161062a906145cd565b5050505050505050565b60608142811015611baf5760405162461bcd60e51b815260040161062a90614484565b611c0586866000818110611bc557611bc561458a565b611bdb9260206060909202019081019150614467565b33611bf289896000818110610bcc57610bcc61458a565b8a600081518110610a1957610a1961458a565b611c57878787808060200260200160405190810160405280939291908181526020016000905b8282101561196b57611c4860608302860136819003810190614650565b81526020019060010190611c2b565b509495945050505050565b8042811015611c835760405162461bcd60e51b815260040161062a90614484565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031685856000818110611cc057611cc061458a565b611cd69260206060909202019081019150614467565b6001600160a01b031614611cfc5760405162461bcd60e51b815260040161062a90614619565b60003490507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016020604051808303818588803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d959190614689565b507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663a9059cbb611ddb8888600081811061181b5761181b61458a565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611e2357600080fd5b505af1158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b91906144bb565b611e6757611e67613ba2565b60008686611e766001826145b6565b818110611e8557611e8561458a565b9050606002016020016020810190611e9d9190614467565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b158015611ee057600080fd5b505afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190614689565b9050611f2587878761357c565b87818888611f346001826145b6565b818110611f4357611f4361458a565b9050606002016020016020810190611f5b9190614467565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401611b0a565b8042811015611fac5760405162461bcd60e51b815260040161062a90614484565b6001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83168585611fe36001826145b6565b818110611ff257611ff261458a565b905060600201602001602081019061200a9190614467565b6001600160a01b0316146120305760405162461bcd60e51b815260040161062a90614619565b612046858560008181106119b7576119b761458a565b61205185853061357c565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a082319060240160206040518083038186803b1580156120b357600080fd5b505afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb9190614689565b90508681101561210d5760405162461bcd60e51b815260040161062a906145cd565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031690632e1a7d4d90602401602060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a79190614689565b50611b8284826131c8565b60606001825110156121d65760405162461bcd60e51b815260040161062a90614619565b81516121e3906001614793565b67ffffffffffffffff8111156121fb576121fb6140a2565b604051908082528060200260200182016040528015612224578160200160208202803683370190505b509050828160008151811061223b5761223b61458a565b60200260200101818152505060005b825181101561244b5760006122a684838151811061226a5761226a61458a565b6020026020010151600001518584815181106122885761228861458a565b6020026020010151602001518685815181106109f5576109f561458a565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234491906144bb565b1561243857806001600160a01b031663f140a35a84848151811061236a5761236a61458a565b60200260200101518685815181106123845761238461458a565b6020026020010151600001516040518363ffffffff1660e01b81526004016123bf9291909182526001600160a01b0316602082015260400190565b60206040518083038186803b1580156123d757600080fd5b505afa1580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614689565b8361241b846001614793565b8151811061242b5761242b61458a565b6020026020010181815250505b5080612443816147ab565b91505061224a565b5092915050565b6000806000807f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a6001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016124a8939291906146a2565b60206040518083038186803b1580156124c057600080fd5b505afa1580156124d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f891906146c6565b9050600080806001600160a01b0384161561259157836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561254657600080fd5b505afa15801561255a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257e9190614689565b905061258b8c8c8c61152a565b90935091505b8215801561259d575081155b156125ce578896508795506103e86125bd6125b8888a6146e3565b6138f4565b6125c791906145b6565b9450612661565b60006125db8a8585613964565b90508881116126235789975095508561261c846125f8848b6146e3565b6126029190614702565b8461260d858b6146e3565b6126179190614702565b613a45565b955061265f565b60006126308a8587613964565b985089975088905061265b8561264685846146e3565b6126509190614702565b8561260d868c6146e3565b9650505b505b50505050955095509592505050565b60008060006126808f8f8f611008565b905060008761268f578c612693565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906126ce903390309086908f908e908e908e90600401614724565b600060405180830381600087803b1580156126e857600080fd5b505af11580156126fc573d6000803e3d6000fd5b50505050506127118f8f8f8f8f8f8f8f610606565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156127515760405162461bcd60e51b815260040161062a90614484565b6127808b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838c8c348d8d613296565b909450925060006127b28c7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838d611008565b90506127c08c338388612e25565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016020604051808303818588803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128549190614689565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83169063a9059cbb90604401602060405180830381600087803b1580156128bf57600080fd5b505af11580156128d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f791906144bb565b61290357612903613ba2565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b15801561294657600080fd5b505af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e9190614689565b92508334111561299b5761299b3361299686346145b6565b6131c8565b50509750975097945050505050565b60008082428110156129ce5760405162461bcd60e51b815260040161062a90614484565b6129fe8a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b8b8b8b308b610606565b9093509150612a0e8a8685613a5d565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031690632e1a7d4d90602401602060405180830381600087803b158015612a7057600080fd5b505af1158015612a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa89190614689565b50612ab385836131c8565b5097509795505050505050565b6000806000612af08e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838f611008565b9050600087612aff578c612b03565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612b3e903390309086908f908e908e908e90600401614724565b600060405180830381600087803b158015612b5857600080fd5b505af1158015612b6c573d6000803e3d6000fd5b50505050610fee8f8f8f8f8f8f8f612d48565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a9091169063e5e31b139060240160206040518083038186803b158015612be557600080fd5b505afa158015612bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1d91906144bb565b92915050565b60608142811015612c465760405162461bcd60e51b815260040161062a90614484565b612c98888787808060200260200160405190810160405280939291908181526020016000905b82821015610b3757612c8960608302860136819003810190614650565b81526020019060010190612c6c565b9150868260018451612caa91906145b6565b81518110612cba57612cba61458a565b60200260200101511015612ce05760405162461bcd60e51b815260040161062a906145cd565b612cf686866000818110610b9f57610b9f61458a565b610d9f828787808060200260200160405190810160405280939291908181526020016000905b8282101561196b57612d3960608302860136819003810190614650565b81526020019060010190612d1c565b6000808242811015612d6c5760405162461bcd60e51b815260040161062a90614484565b612d9c8a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b8b8b8b308b610606565b6040516370a0823160e01b81523060048201529194509250612a0e908b9087906001600160a01b038316906370a082319060240160206040518083038186803b158015612de857600080fd5b505afa158015612dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e209190614689565b613a5d565b6000846001600160a01b03163b11612e7f5760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e00604482015260640161062a565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612ee391906147f2565b6000604051808303816000865af19150503d8060008114612f20576040519150601f19603f3d011682016040523d82523d6000602084013e612f25565b606091505b5091509150818015612f4f575080511580612f4f575080806020019051810190612f4f91906144bb565b612f6b5760405162461bcd60e51b815260040161062a9061480e565b505050505050565b60005b82518110156131c2576000612fc5848381518110612f9657612f9661458a565b602002602001015160000151858481518110612fb457612fb461458a565b6020026020010151602001516110b3565b509050600085612fd6846001614793565b81518110612fe657612fe661458a565b60200260200101519050600080836001600160a01b031687868151811061300f5761300f61458a565b6020026020010151600001516001600160a01b03161461303157826000613035565b6000835b9150915060006001885161304991906145b6565b861061305557866130c8565b6130c888613064886001614793565b815181106130745761307461458a565b6020026020010151600001518988600161308e9190614793565b8151811061309e5761309e61458a565b6020026020010151602001518a8960016130b89190614793565b815181106109f5576109f561458a565b905061311b8887815181106130df576130df61458a565b6020026020010151600001518988815181106130fd576130fd61458a565b6020026020010151602001518a89815181106109f5576109f561458a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613158576020820181803683370190505b506040518563ffffffff1660e01b81526004016131789493929190614855565b600060405180830381600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b50505050505050505080806131ba906147ab565b915050612f76565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516131f291906147f2565b60006040518083038185875af1925050503d806000811461322f576040519150601f19603f3d011682016040523d82523d6000602084013e613234565b606091505b50509050806132915760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b606482015260840161062a565b505050565b600080838610156132fb5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c6964206465736972656044820152686420616d6f756e744160b81b606482015260840161062a565b8285101561335d5760405162461bcd60e51b815260206004820152602960248201527f457175616c697a657220526f757465723a20696e76616c696420646573697265604482015268321030b6b7bab73a2160b91b606482015260840161062a565b6040516306801cc360e41b81526000906001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a1690636801cc30906133b0908d908d908d906004016146a2565b60206040518083038186803b1580156133c857600080fd5b505afa1580156133dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340091906146c6565b90506001600160a01b0381166134b5576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a16906382dfdce490613460908d908d908d906004016146a2565b602060405180830381600087803b15801561347a57600080fd5b505af115801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b291906146c6565b90505b6000806134c38c8c8c61152a565b915091508160001480156134d5575080155b156134e55788945087935061356d565b60006134f28a8484613964565b9050888111613526578681101561351b5760405162461bcd60e51b815260040161062a90614543565b89955093508361356b565b60006135338a8486613964565b90508a81111561354557613545613ba2565b888110156135655760405162461bcd60e51b815260040161062a906144fc565b95508894505b505b50505097509795505050505050565b60005b828110156131c25760008085858481811061359c5761359c61458a565b6135b29260206060909202019081019150614467565b8686858181106135c4576135c461458a565b90506060020160200160208101906135dc9190614467565b9150915060006135ec83836110b3565b50905060006136588888878181106136065761360661458a565b61361c9260206060909202019081019150614467565b89898881811061362e5761362e61458a565b90506060020160200160208101906136469190614467565b8a8a89818110610c2057610c2061458a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561369957600080fd5b505afa1580156136ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d19190614765565b50915091506000866001600160a01b0316896001600160a01b0316146136f85781836136fb565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a082319060240160206040518083038186803b15801561374257600080fd5b505afa158015613756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377a9190614689565b61378491906145b6565b9450613791858a8a61129a565b5080945050505050600080856001600160a01b0316886001600160a01b0316146137bd578260006137c1565b6000835b909250905060006137d360018d6145b6565b8a106137df578a613864565b6138648d8d6137ef8d6001614793565b8181106137fe576137fe61458a565b6138149260206060909202019081019150614467565b8e8e6138218e6001614793565b8181106138305761383061458a565b90506060020160200160208101906138489190614467565b8f8f6138558f6001614793565b818110610c2057610c2061458a565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906138a69086908690869060248101614855565b600060405180830381600087803b1580156138c057600080fd5b505af11580156138d4573d6000803e3d6000fd5b5050505050505050505050505080806138ec906147ab565b91505061357f565b60006003821115613955575080600061390e600283614702565b613919906001614793565b90505b8181101561394f579050806002816139348186614702565b61393e9190614793565b6139489190614702565b905061391c565b50919050565b811561395f575060015b919050565b60008084116139c35760405162461bcd60e51b815260206004820152602560248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f416044820152641353d5539560da1b606482015260840161062a565b6000831180156139d35750600082115b613a305760405162461bcd60e51b815260206004820152602860248201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4c604482015267495155494449545960c01b606482015260840161062a565b82613a3b83866146e3565b6110ab9190614702565b6000818310613a545781613a56565b825b9392505050565b6000836001600160a01b03163b11613ab75760405162461bcd60e51b815260206004820152601f60248201527f457175616c697a657220526f757465723a20696e76616c696420746f6b656e00604482015260640161062a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613b1391906147f2565b6000604051808303816000865af19150503d8060008114613b50576040519150601f19603f3d011682016040523d82523d6000602084013e613b55565b606091505b5091509150818015613b7f575080511580613b7f575080806020019051810190613b7f91906144bb565b613b9b5760405162461bcd60e51b815260040161062a9061480e565b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613bcd57600080fd5b50565b803561395f81613bb8565b8015158114613bcd57600080fd5b600080600080600080600080610100898b031215613c0657600080fd5b8835613c1181613bb8565b97506020890135613c2181613bb8565b96506040890135613c3181613bdb565b9550606089013594506080890135935060a0890135925060c0890135613c5681613bb8565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613c8957600080fd5b87359650602088013595506040880135613ca281613bb8565b94506060880135613cb281613bb8565b93506080880135613cc281613bdb565b925060a0880135613cd281613bb8565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d2157835183529284019291840191600101613d05565b50909695505050505050565b60008083601f840112613d3f57600080fd5b50813567ffffffffffffffff811115613d5757600080fd5b6020830191508360206060830285010111156111a457600080fd5b60008060008060008060a08789031215613d8b57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613db057600080fd5b613dbc89828a01613d2d565b9095509350506060870135613dd081613bb8565b80925050608087013590509295509295509295565b60008060008060808587031215613dfb57600080fd5b8435613e0681613bb8565b93506020850135613e1681613bb8565b92506040850135613e2681613bdb565b9396929550929360600135925050565b803560ff8116811461395f57600080fd5b60008060008060008060008060008060006101608c8e031215613e6957600080fd5b8b35613e7481613bb8565b9a5060208c0135613e8481613bdb565b995060408c0135985060608c0135975060808c0135965060a08c0135613ea981613bb8565b955060c08c0135945060e08c0135613ec081613bdb565b9350613ecf6101008d01613e36565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613f0657600080fd5b8335613f1181613bb8565b92506020840135613f2181613bb8565b91506040840135613f3181613bdb565b809150509250925092565b60008060408385031215613f4f57600080fd5b8235613f5a81613bb8565b91506020830135613f6a81613bb8565b809150509250929050565b60008060008060008060008060006101208a8c031215613f9457600080fd5b8935613f9f81613bb8565b985060208a0135613faf81613bb8565b975060408a0135613fbf81613bdb565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613feb81613bb8565b809250506101008a013590509295985092959850929598565b60008060006060848603121561401957600080fd5b83359250602084013561402b81613bb8565b91506040840135613f3181613bb8565b60008060008060006080868803121561405357600080fd5b85359450602086013567ffffffffffffffff81111561407157600080fd5b61407d88828901613d2d565b909550935050604086013561409181613bb8565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156140e1576140e16140a2565b604052919050565b600067ffffffffffffffff821115614103576141036140a2565b5060051b60200190565b60008060008060006080868803121561412557600080fd5b853567ffffffffffffffff8082111561413d57600080fd5b818801915088601f83011261415157600080fd5b81356020614166614161836140e9565b6140b8565b82815260059290921b8401810191818101908c84111561418557600080fd5b948201945b838610156141a35785358252948201949082019061418a565b995050890135925050808211156141b957600080fd5b506141c688828901613d2d565b9095509350614091905060408701613bd0565b6000606082840312156141eb57600080fd5b6040516060810181811067ffffffffffffffff8211171561420e5761420e6140a2565b604052905080823561421f81613bb8565b8152602083013561422f81613bb8565b6020820152604083013561424281613bdb565b6040919091015292915050565b6000806040838503121561426257600080fd5b8235915060208084013567ffffffffffffffff81111561428157600080fd5b8401601f8101861361429257600080fd5b80356142a0614161826140e9565b818152606091820283018401918482019190898411156142bf57600080fd5b938501935b838510156142e5576142d68a866141d9565b835293840193918501916142c4565b5080955050505050509250929050565b600080600080600060a0868803121561430d57600080fd5b853561431881613bb8565b9450602086013561432881613bb8565b9350604086013561433881613bdb565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561437357600080fd5b8c3561437e81613bb8565b9b5060208d013561438e81613bb8565b9a5060408d013561439e81613bdb565b995060608d0135985060808d0135975060a08d0135965060c08d01356143c381613bb8565b955060e08d013594506101008d01356143db81613bdb565b93506143ea6101208e01613e36565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561442757600080fd5b873561443281613bb8565b9650602088013561444281613bdb565b955060408801359450606088013593506080880135925060a0880135613cd281613bb8565b60006020828403121561447957600080fd5b8135613a5681613bb8565b60208082526019908201527f457175616c697a657220526f757465723a204558504952454400000000000000604082015260600190565b6000602082840312156144cd57600080fd5b8151613a5681613bdb565b600080604083850312156144eb57600080fd5b505080516020909101519092909150565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4160408201526617d05353d5539560ca1b606082015260800190565b60208082526027908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4260408201526617d05353d5539560ca1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145c8576145c86145a0565b500390565b6020808252602c908201527f457175616c697a657220526f757465723a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b6020808252601e908201527f457175616c697a657220526f757465723a20494e56414c49445f504154480000604082015260600190565b60006060828403121561466257600080fd5b613a5683836141d9565b60006020828403121561467e57600080fd5b8135613a5681613bdb565b60006020828403121561469b57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d857600080fd5b8151613a5681613bb8565b60008160001904831182151516156146fd576146fd6145a0565b500290565b60008261471f57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60008060006060848603121561477a57600080fd5b8351925060208401519150604084015190509250925092565b600082198211156147a6576147a66145a0565b500190565b60006000198214156147bf576147bf6145a0565b5060010190565b60005b838110156147e15781810151838201526020016147c9565b838111156131c25750506000910152565b600082516148048184602087016147c6565b9190910192915050565b60208082526027908201527f457175616c697a657220526f757465723a20746f6b656e207472616e736665726040820152660819985a5b195960ca1b606082015260800190565b84815283602082015260018060a01b0383166040820152608060608201526000825180608084015261488e8160a08501602087016147c6565b601f01601f19169190910160a0019594505050505056fea26469706673582212208d13bb610d984630b1ac638e933819188d85103d5e6c9febe3cb38fc333bc17364736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0xc6366EFD0AF1d09171fe0EBF32c7943BB310832a
Arg [1] : _weth (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c6366efd0af1d09171fe0ebf32c7943bb310832a
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed Bytecode Sourcemap

5054:23452:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5786:10;-1:-1:-1;;;;;5808:4:0;5786:27;;5779:35;;;;:::i;:::-;5054:23452;;;;;14768:865;;;;;;;;;;-1:-1:-1;14768:865:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;14768:865:0;;;;;;;;18506:790;;;;;;;;;;-1:-1:-1;18506:790:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20539:775::-;;;;;;;;;;-1:-1:-1;20539:775:0;;;;;:::i;:::-;;:::i;5277:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4643:32:1;;;4625:51;;4613:2;4598:18;5277:27:0;4467:215:1;10700:752:0;;;;;;;;;;-1:-1:-1;10700:752:0;;;;;:::i;:::-;;:::i;17031:670::-;;;;;;;;;;-1:-1:-1;17031:670:0;;;;;:::i;:::-;;:::i;6275:508::-;;;;;;;;;;-1:-1:-1;6275:508:0;;;;;:::i;:::-;;:::i;5830:347::-;;;;;;;;;;-1:-1:-1;5830:347:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7955:15:1;;;7937:34;;8007:15;;;;8002:2;7987:18;;7980:43;7872:18;5830:347:0;7725:304:1;13072:696:0;;;;;;;;;;-1:-1:-1;13072:696:0;;;;;:::i;:::-;;:::i;:::-;;;;9251:25:1;;;9307:2;9292:18;;9285:34;;;;9335:18;;;9328:34;9239:2;9224:18;13072:696:0;9049:319:1;7756:662:0;;;;;;;;;;-1:-1:-1;7756:662:0;;;;;:::i;:::-;;:::i;:::-;;;;10002:25:1;;;10070:14;;10063:22;10058:2;10043:18;;10036:50;9975:18;7756:662:0;9834:258:1;7293:375:0;;;;;;;;;;-1:-1:-1;7293:375:0;;;;;:::i;:::-;;:::i;19899:632::-;;;;;;:::i;:::-;;:::i;25061:737::-;;;;;;;;;;-1:-1:-1;25061:737:0;;;;;:::i;:::-;;:::i;21322:404::-;;;;;;;;;;-1:-1:-1;21322:404:0;;;;;:::i;:::-;;:::i;25804:838::-;;;;;;:::i;:::-;;:::i;26648:813::-;;;;;;;;;;-1:-1:-1;26648:813:0;;;;;:::i;:::-;;:::i;8506:569::-;;;;;;;;;;-1:-1:-1;8506:569:0;;;;;:::i;:::-;;:::i;9210:1482::-;;;;;;;;;;-1:-1:-1;9210:1482:0;;;;;:::i;:::-;;:::i;5311:37::-;;;;;;;;;;;;;;;;;;15463:25:1;;;15451:2;15436:18;5311:37:0;15317:177:1;16322:701:0;;;;;;;;;;-1:-1:-1;16322:701:0;;;;;:::i;:::-;;:::i;13776:949::-;;;;;;:::i;:::-;;:::i;5238:32::-;;;;;;;;;;;;;;;15641:673;;;;;;;;;;-1:-1:-1;15641:673:0;;;;;:::i;:::-;;:::i;23006:752::-;;;;;;;;;;-1:-1:-1;23006:752:0;;;;;:::i;:::-;;:::i;9083:119::-;;;;;;;;;;-1:-1:-1;9083:119:0;;;;;:::i;:::-;;:::i;:::-;;;18015:14:1;;18008:22;17990:41;;17978:2;17963:18;9083:119:0;17850:187:1;19304:587:0;;;;;;;;;;-1:-1:-1;19304:587:0;;;;;:::i;:::-;;:::i;22271:729::-;;;;;;;;;;-1:-1:-1;22271:729:0;;;;;:::i;:::-;;:::i;14768:865::-;15027:12;15041;15008:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;;;;;;;;;15066:12:::1;15081:31;15089:6;15097;15105;15081:7;:31::i;:::-;15131:53;::::0;-1:-1:-1;;;15131:53:0;;15156:10:::1;15131:53;::::0;::::1;18636:34:1::0;-1:-1:-1;;;;;15131:24:0;::::1;18686:18:1::0;;;18679:43;;;18738:18;;;18731:34;;;15066:46:0;;-1:-1:-1;15131:24:0::1;::::0;18571:18:1;;15131:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15123:99;;;::::0;-1:-1:-1;;;15123:99:0;;19228:2:1;15123:99:0::1;::::0;::::1;19210:21:1::0;19267:2;19247:18;;;19240:30;19306:34;19286:18;;;19279:62;-1:-1:-1;;;19357:18:1;;;19350:31;19398:19;;15123:99:0::1;19026:397:1::0;15123:99:0::1;15290:20;::::0;-1:-1:-1;;;15290:20:0;;-1:-1:-1;;;;;4643:32:1;;;15290:20:0::1;::::0;::::1;4625:51:1::0;15260:12:0::1;::::0;;;15290:16;::::1;::::0;::::1;::::0;4598:18:1;;15290:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15259:51;;;;15322:14;15341:26;15352:6;15360;15341:10;:26::i;:::-;15321:46;;;15409:6;-1:-1:-1::0;;;;;15399:16:0::1;:6;-1:-1:-1::0;;;;;15399:16:0::1;;:58;;15440:7;15449;15399:58;;;15419:7;15428;15399:58;15378:79:::0;;-1:-1:-1;15378:79:0;-1:-1:-1;15476:21:0;;::::1;;15468:73;;;;-1:-1:-1::0;;;15468:73:0::1;;;;;;;:::i;:::-;15571:10;15560:7;:21;;15552:73;;;;-1:-1:-1::0;;;15552:73:0::1;;;;;;;:::i;:::-;15055:578;;;;14768:865:::0;;;;;;;;;;;;:::o;18506:790::-;18761:21;18742:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;18819:14:::1;::::0;;18831:1:::1;18819:14:::0;;;;;::::1;::::0;;;18795:21:::1;::::0;18819:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;18819:14:0;;-1:-1:-1;;18819:14:0;;;;::::1;::::0;::::1;;;;;18795:38;;18861:9;18844:6;18851:1;18844:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;18844:26:0::1;;;-1:-1:-1::0;;;;;18844:26:0::1;;;::::0;::::1;18896:7;18881:6;18888:1;18881:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;18881:22:0::1;;;-1:-1:-1::0;;;;;18881:22:0::1;;;::::0;::::1;18933:6;18914;18921:1;18914:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;18960:31:::1;18974:8:::0;18984:6;18960:13:::1;:31::i;:::-;18950:41;;19041:12;19010:7;19035:1;19018:7;:14;:18;;;;:::i;:::-;19010:27;;;;;;;;:::i;:::-;;;;;;;:43;;19002:100;;;;-1:-1:-1::0;;;19002:100:0::1;;;;;;;:::i;:::-;19113:138;19145:6;19152:1;19145:9;;;;;;;;:::i;:::-;;;;;;;:14;;;19161:10;19173:55;19181:6;19188:1;19181:9;;;;;;;;:::i;:::-;;;;;;;:14;;;19197:6;19204:1;19197:9;;;;;;;;:::i;:::-;;;;;;;:12;;;19211:6;19218:1;19211:9;;;;;;;;:::i;:::-;;;;;;;:16;;;19173:7;:55::i;:::-;19230:7;19238:1;19230:10;;;;;;;;:::i;:::-;;;;;;;19113:17;:138::i;:::-;19262:26;19268:7;19277:6;19285:2;19262:5;:26::i;:::-;18784:512;18506:790:::0;;;;;;;;;;:::o;20539:775::-;20706:21;20682:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20793:4:0::1;20753:45;:6:::0;;20760:17:::1;20776:1;20753:6:::0;20760:17:::1;:::i;:::-;20753:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20753:45:0::1;;20745:88;;;;-1:-1:-1::0;;;20745:88:0::1;;;;;;;:::i;:::-;20854:31;20868:8;20878:6;;20854:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;20844:41;;20935:12;20904:7;20929:1;20912:7;:14;:18;;;;:::i;:::-;20904:27;;;;;;;;:::i;:::-;;;;;;;:43;;20896:100;;;;-1:-1:-1::0;;;20896:100:0::1;;;;;;;:::i;:::-;21007:138;21039:6;;21046:1;21039:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;21039:14:0::1;:::i;:::-;21055:10;21067:55;21075:6;;21082:1;21075:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;21075:14:0::1;:::i;:::-;21091:6;;21098:1;21091:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;21105:6;;21112:1;21105:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;21067:55::-;21124:7;21132:1;21124:10;;;;;;;;:::i;21007:138::-;21156:37;21162:7;21171:6;;21156:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;21187:4;21156:5;:37::i;:::-;21204:4;-1:-1:-1::0;;;;;21204:13:0::1;;21218:7;21243:1;21226:7;:14;:18;;;;:::i;:::-;21218:27;;;;;;;;:::i;:::-;;;;;;;21204:42;;;;;;;;;;;;;15463:25:1::0;;15451:2;15436:18;;15317:177;21204:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21257:49;21274:2;21278:7;21303:1;21286:7;:14;:18;;;;:::i;:::-;21278:27;;;;;;;;:::i;:::-;;;;;;;21257:16;:49::i;:::-;20539:775:::0;;;;;;;;;:::o;10700:752::-;10857:12;10871;10948:13;10977:7;-1:-1:-1;;;;;10964:29:0;;10994:6;11002;11010;10964:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10948:69;-1:-1:-1;;;;;;11034:19:0;;11030:64;;11078:1;11080;11070:12;;;;;;;11030:64;11107:13;11122;11139:35;11151:6;11159;11167;11139:11;:35::i;:::-;11106:68;;;;11185:17;11212:5;-1:-1:-1;;;;;11205:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11185:47;-1:-1:-1;11185:47:0;11255:20;11267:8;11255:9;:20;:::i;:::-;:35;;;;:::i;:::-;11245:45;-1:-1:-1;11382:12:0;11359:20;11371:8;11359:9;:20;:::i;:::-;:35;;;;:::i;:::-;11349:45;;10885:567;;;;10700:752;;;;;;;;:::o;17031:670::-;17325:16;17343:14;17370:12;17385:37;17393:5;17408:4;17415:6;17385:7;:37::i;:::-;17370:52;;17433:10;17446;:39;;17476:9;17446:39;;;-1:-1:-1;;17446:39:0;17496:71;;-1:-1:-1;;;17496:71:0;;17433:52;;-1:-1:-1;;;;;;17496:18:0;;;;;:71;;17515:10;;17535:4;;17433:52;;17549:8;;17559:1;;17562;;17565;;17496:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17605:88;17624:5;17631:6;17639:9;17650:14;17666:12;17680:2;17684:8;17605:18;:88::i;:::-;17578:115;;;;;;;;17359:342;;17031:670;;;;;;;;;;;;;;:::o;6275:508::-;6724:51;;-1:-1:-1;;;6724:51:0;;6358:12;;-1:-1:-1;;;;;6737:7:0;6724:29;;;;:51;;6754:6;;6761;;6768;;6724:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6717:58;6275:508;-1:-1:-1;;;;6275:508:0:o;5830:347::-;5903:14;5919;5964:6;-1:-1:-1;;;;;5954:16:0;:6;-1:-1:-1;;;;;5954:16:0;;;5946:66;;;;-1:-1:-1;;;5946:66:0;;24422:2:1;5946:66:0;;;24404:21:1;24461:2;24441:18;;;24434:30;24500:34;24480:18;;;24473:62;-1:-1:-1;;;24551:18:1;;;24544:35;24596:19;;5946:66:0;24220:401:1;5946:66:0;6051:6;-1:-1:-1;;;;;6042:15:0;:6;-1:-1:-1;;;;;6042:15:0;;:53;;6080:6;6088;6042:53;;;6061:6;6069;6042:53;6023:72;;-1:-1:-1;6023:72:0;-1:-1:-1;;;;;;6114:20:0;;6106:63;;;;-1:-1:-1;;;6106:63:0;;24828:2:1;6106:63:0;;;24810:21:1;24867:2;24847:18;;;24840:30;24906:32;24886:18;;;24879:60;24956:18;;6106:63:0;24626:354:1;6106:63:0;5830:347;;;;;:::o;13072:696::-;13365:12;13379;13393:14;13346:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;13441:93:::1;13455:6;13463;13471;13479:14;13495;13511:10;13523;13441:13;:93::i;:::-;13420:114:::0;;-1:-1:-1;13420:114:0;-1:-1:-1;13545:12:0::1;13560:31;13568:6:::0;13576;13584;13560:7:::1;:31::i;:::-;13545:46;;13602:52;13620:6;13628:10;13640:4;13646:7;13602:17;:52::i;:::-;13665;13683:6;13691:10;13703:4;13709:7;13665:17;:52::i;:::-;13740:20;::::0;-1:-1:-1;;;13740:20:0;;-1:-1:-1;;;;;4643:32:1;;;13740:20:0::1;::::0;::::1;4625:51:1::0;13740:16:0;::::1;::::0;::::1;::::0;4598:18:1;;13740:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13728:32;;13409:359;13072:696:::0;;;;;;;;;;;;;;:::o;7756:662::-;7849:11;7862;7886:12;7901:32;7909:7;7918:8;7928:4;7901:7;:32::i;:::-;8006:34;;-1:-1:-1;;;8006:34:0;;-1:-1:-1;;;;;4643:32:1;;;8006:34:0;;;4625:51:1;4643:32;;-1:-1:-1;;;;;8019:7:0;8006:28;;;;;;4598:18:1;;8006:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8002:125;;;8072:43;;-1:-1:-1;;;8072:43:0;;;;;25159:25:1;;;-1:-1:-1;;;;;25220:32:1;;;25200:18;;;25193:60;8072:24:0;;;;;25132:18:1;;8072:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8057:58;;8002:125;8144:33;8152:7;8161:8;8171:5;8144:7;:33::i;:::-;8192:34;;-1:-1:-1;;;8192:34:0;;-1:-1:-1;;;;;4643:32:1;;;8192:34:0;;;4625:51:1;8137:40:0;;-1:-1:-1;8205:7:0;8192:28;;;;;;4598:18:1;;8192:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8188:127;;;8260:43;;-1:-1:-1;;;8260:43:0;;;;;25159:25:1;;;-1:-1:-1;;;;;25220:32:1;;;25200:18;;;25193:60;8260:24:0;;;;;25132:18:1;;8260:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8243:60;;8188:127;8347:14;8332:12;:29;:78;;8388:14;8404:5;8332:78;;;8365:12;8379:4;8332:78;8325:85;;;;;;;7756:662;;;;;;:::o;7293:375::-;7380:13;7395;7422:14;7441:26;7452:6;7460;7441:10;:26::i;:::-;7421:46;;;7479:13;7494;7518:31;7526:6;7534;7542;7518:7;:31::i;:::-;-1:-1:-1;;;;;7512:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7478:86;;;;;7608:6;-1:-1:-1;;;;;7598:16:0;:6;-1:-1:-1;;;;;7598:16:0;;:62;;7641:8;7651;7598:62;;;7618:8;7628;7598:62;7575:85;;;;-1:-1:-1;7293:375:0;-1:-1:-1;;;;;;;7293:375:0:o;19899:632::-;20064:21;20040:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;20137:4:::1;-1:-1:-1::0;;;;;20111:31:0::1;:6;;20118:1;20111:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;20111:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;20111:31:0::1;;20103:74;;;;-1:-1:-1::0;;;20103:74:0::1;;;;;;;:::i;:::-;20198:32;20212:9;20223:6;;20198:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;20188:42;;20280:12;20249:7;20274:1;20257:7;:14;:18;;;;:::i;:::-;20249:27;;;;;;;;:::i;:::-;;;;;;;:43;;20241:100;;;;-1:-1:-1::0;;;20241:100:0::1;;;;;;;:::i;:::-;20352:4;-1:-1:-1::0;;;;;20352:12:0::1;;20372:7;20380:1;20372:10;;;;;;;;:::i;:::-;;;;;;;20352:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20403:4;-1:-1:-1::0;;;;;20403:13:0::1;;20417:55;20425:6;;20432:1;20425:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;20425:14:0::1;:::i;:::-;20441:6;;20448:1;20441:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;20455:6;;20462:1;20455:9;;;;;;;:::i;20417:55::-;20474:7;20482:1;20474:10;;;;;;;;:::i;:::-;;;;;;;20403:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25767:32:1;;;;25749:51;;25831:2;25816:18;;25809:34;25737:2;25722:18;;25575:274;20403:82:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20396:90;;;;:::i;:::-;20497:26;20503:7;20512:6;;20497:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;20520:2;20497:5;:26::i;:::-;19899:632:::0;;;;;;;;:::o;25061:737::-;25278:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;25299:163:::1;25328:6;;25335:1;25328:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;25328:14:0::1;:::i;:::-;25354:10;25376:55;25384:6;;25391:1;25384:9;;;;;;;:::i;25376:55::-;25443:8;25299:17;:163::i;:::-;25473:18;25501:6:::0;;25508:17:::1;25524:1;25501:6:::0;25508:17:::1;:::i;:::-;25501:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;25494:50;::::0;-1:-1:-1;;;25494:50:0;;-1:-1:-1;;;;;4643:32:1;;;25494:50:0::1;::::0;::::1;4625:51:1::0;25494:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;25494:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25473:71;;25555:46;25590:6;;25598:2;25555:34;:46::i;:::-;25706:12:::0;25688:13;25641:6;;25648:17:::1;25664:1;25641:6:::0;25648:17:::1;:::i;:::-;25641:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;25634:50;::::0;-1:-1:-1;;;25634:50:0;;-1:-1:-1;;;;;4643:32:1;;;25634:50:0::1;::::0;::::1;4625:51:1::0;25634:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;25634:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;25612:178;;;;-1:-1:-1::0;;;25612:178:0::1;;;;;;;:::i;:::-;25288:510;25061:737:::0;;;;;;;:::o;21322:404::-;21516:13;21497:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;21542:114:::1;21560:6;;21567:1;21560:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;21560:14:0::1;:::i;:::-;21576:10;21588:55;21596:6;;21603:1;21596:9;;;;;;;:::i;21588:55::-;21645:7;21653:1;21645:10;;;;;;;;:::i;21542:114::-;21667:26;21673:7;21682:6;;21667:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;21711:7:0;;21322:404;-1:-1:-1;;;;;21322:404:0:o;25804:838::-;26029:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;26089:4:::1;-1:-1:-1::0;;;;;26063:31:0::1;:6;;26070:1;26063:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;26063:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;26063:31:0::1;;26055:74;;;;-1:-1:-1::0;;;26055:74:0::1;;;;;;;:::i;:::-;26140:13;26156:9;26140:25;;26176:4;-1:-1:-1::0;;;;;26176:12:0::1;;26196:8;26176:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26225:4;-1:-1:-1::0;;;;;26225:13:0::1;;26239:55;26247:6;;26254:1;26247:9;;;;;;;:::i;26239:55::-;26225:80;::::0;-1:-1:-1;;;;;;26225:80:0::1;::::0;;;;;;-1:-1:-1;;;;;25767:32:1;;;26225:80:0::1;::::0;::::1;25749:51:1::0;25816:18;;;25809:34;;;25722:18;;26225:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26218:88;;;;:::i;:::-;26317:18;26345:6:::0;;26352:17:::1;26368:1;26345:6:::0;26352:17:::1;:::i;:::-;26345:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;26338:50;::::0;-1:-1:-1;;;26338:50:0;;-1:-1:-1;;;;;4643:32:1;;;26338:50:0::1;::::0;::::1;4625:51:1::0;26338:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;26338:50:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26317:71;;26399:46;26434:6;;26442:2;26399:34;:46::i;:::-;26550:12:::0;26532:13;26485:6;;26492:17:::1;26508:1;26485:6:::0;26492:17:::1;:::i;:::-;26485:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;26478:50;::::0;-1:-1:-1;;;26478:50:0;;-1:-1:-1;;;;;4643:32:1;;;26478:50:0::1;::::0;::::1;4625:51:1::0;26478:46:0;;;::::1;::::0;::::1;::::0;4598:18:1;;26478:50:0::1;4467:215:1::0;26648:813:0;26880:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26954:4:0::1;26914:45;:6:::0;;26921:17:::1;26937:1;26914:6:::0;26921:17:::1;:::i;:::-;26914:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26914:45:0::1;;26906:88;;;;-1:-1:-1::0;;;26906:88:0::1;;;;;;;:::i;:::-;27005:136;27037:6;;27044:1;27037:9;;;;;;;:::i;27005:136::-;27152:57;27187:6;;27203:4;27152:34;:57::i;:::-;27237:46;::::0;-1:-1:-1;;;27237:46:0;;27277:4:::1;27237:46;::::0;::::1;4625:51:1::0;27220:14:0::1;::::0;27252:4:::1;-1:-1:-1::0;;;;;27237:31:0::1;::::0;::::1;::::0;4598:18:1;;27237:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27220:63;;27315:12;27302:9;:25;;27294:82;;;;-1:-1:-1::0;;;27294:82:0::1;;;;;;;:::i;:::-;27387:24;::::0;-1:-1:-1;;;27387:24:0;;::::1;::::0;::::1;15463:25:1::0;;;27387:4:0::1;-1:-1:-1::0;;;;;27387:13:0::1;::::0;::::1;::::0;15436:18:1;;27387:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27422:31;27439:2;27443:9;27422:16;:31::i;8506:569::-:0;8588:21;8647:1;8630:6;:13;:18;;8622:61;;;;-1:-1:-1;;;8622:61:0;;;;;;;:::i;:::-;8715:13;;:15;;8729:1;8715:15;:::i;:::-;8704:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8704:27:0;;8694:37;;8755:8;8742:7;8750:1;8742:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8779:6;8774:294;8795:6;:13;8791:1;:17;8774:294;;;8830:12;8845:55;8853:6;8860:1;8853:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8869:6;8876:1;8869:9;;;;;;;;:::i;:::-;;;;;;;:12;;;8883:6;8890:1;8883:9;;;;;;;;:::i;8845:55::-;8919:34;;-1:-1:-1;;;8919:34:0;;-1:-1:-1;;;;;4643:32:1;;;8919:34:0;;;4625:51:1;8830:70:0;;-1:-1:-1;8932:7:0;8919:28;;;;;;4598:18:1;;8919:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8915:142;;;8995:4;-1:-1:-1;;;;;8989:24:0;;9014:7;9022:1;9014:10;;;;;;;;:::i;:::-;;;;;;;9026:6;9033:1;9026:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8989:52;;;;;;;;;;;;;;;25159:25:1;;;-1:-1:-1;;;;;25220:32:1;25215:2;25200:18;;25193:60;25147:2;25132:18;;24985:274;8989:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8974:7;8982:3;:1;8984;8982:3;:::i;:::-;8974:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;8915:142;-1:-1:-1;8810:3:0;;;;:::i;:::-;;;;8774:294;;;;8506:569;;;;:::o;9210:1482::-;9399:12;9413;9427:14;9506:13;9535:7;-1:-1:-1;;;;;9522:29:0;;9552:6;9560;9568;9522:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9506:69;-1:-1:-1;9587:13:0;;;-1:-1:-1;;;;;9671:19:0;;;9667:167;;9729:5;-1:-1:-1;;;;;9722:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9707:42;;9787:35;9799:6;9807;9815;9787:11;:35::i;:::-;9764:58;;-1:-1:-1;9764:58:0;-1:-1:-1;9667:167:0;9848:13;;:30;;;;-1:-1:-1;9865:13:0;;9848:30;9844:841;;;9917:14;;-1:-1:-1;9933:14:0;;-1:-1:-1;5226:5:0;9975:28;9985:17;9933:14;9917;9985:17;:::i;:::-;9975:9;:28::i;:::-;:48;;;;:::i;:::-;9963:60;;9844:841;;;10058:19;10080:50;10095:14;10111:8;10121;10080:14;:50::i;:::-;10058:72;;10167:14;10149;:32;10145:529;;10224:14;;-1:-1:-1;10240:14:0;-1:-1:-1;10240:14:0;10286:78;10320:8;10295:22;10305:12;10224:14;10295:22;:::i;:::-;:33;;;;:::i;:::-;10355:8;10330:22;10340:12;10330:7;:22;:::i;:::-;:33;;;;:::i;:::-;10286:8;:78::i;:::-;10274:90;;10145:529;;;10405:19;10427:50;10442:14;10458:8;10468;10427:14;:50::i;:::-;10405:72;-1:-1:-1;10534:14:0;;-1:-1:-1;10405:72:0;;-1:-1:-1;10580:78:0;10614:8;10589:22;10599:12;10405:72;10589:22;:::i;:::-;:33;;;;:::i;:::-;10649:8;10624:22;10634:12;10624:7;:22;:::i;10580:78::-;10568:90;;10386:288;10145:529;10041:644;9844:841;9443:1249;;;;9210:1482;;;;;;;;;:::o;16322:701::-;16633:12;16647;16672;16687:31;16695:6;16703;16711;16687:7;:31::i;:::-;16672:46;;16744:10;16757;:39;;16787:9;16757:39;;;-1:-1:-1;;16757:39:0;16811:71;;-1:-1:-1;;;16811:71:0;;16744:52;;-1:-1:-1;;;;;;16811:18:0;;;;;:71;;16830:10;;16850:4;;16744:52;;16864:8;;16874:1;;16877;;16880;;16811:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16729:165;16927:88;16943:6;16951;16959;16967:9;16978:10;16990;17002:2;17006:8;16927:15;:88::i;:::-;16906:109;;;;;;;;16661:362;16322:701;;;;;;;;;;;;;;;:::o;13776:949::-;14034:16;14052:14;14068;14015:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;14122:206:::1;14150:5;14178:4;14198:6;14219:18;14252:9;14276:14;14305:12;14122:13;:206::i;:::-;14095:233:::0;;-1:-1:-1;14095:233:0;-1:-1:-1;14339:12:0::1;14354:37;14362:5:::0;14377:4:::1;14384:6:::0;14354:7:::1;:37::i;:::-;14339:52;;14402:55;14420:5;14427:10;14439:4;14445:11;14402:17;:55::i;:::-;14468:4;-1:-1:-1::0;;;;;14468:12:0::1;;14488:9;14468:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14518:30:0::1;::::0;-1:-1:-1;;;14518:30:0;;-1:-1:-1;;;;;25767:32:1;;;14518:30:0::1;::::0;::::1;25749:51:1::0;25816:18;;;25809:34;;;14518:4:0::1;:13;::::0;::::1;::::0;25722:18:1;;14518:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14511:38;;;;:::i;:::-;14572:20;::::0;-1:-1:-1;;;14572:20:0;;-1:-1:-1;;;;;4643:32:1;;;14572:20:0::1;::::0;::::1;4625:51:1::0;14572:16:0;::::1;::::0;::::1;::::0;4598:18:1;;14572:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14560:32;;14655:9;14643;:21;14639:78;;;14666:51;14683:10;14695:21;14707:9:::0;14695::::1;:21;:::i;:::-;14666:16;:51::i;:::-;14084:641;13776:949:::0;;;;;;;;;;;;:::o;15641:673::-;15883:16;15901:14;15864:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;15955:226:::1;15985:5;16013:4;16033:6;16054:9;16078:14;16107:12;16142:4;16162:8;15955:15;:226::i;:::-;15928:253:::0;;-1:-1:-1;15928:253:0;-1:-1:-1;16192:37:0::1;16206:5:::0;16213:2;15928:253;16192:13:::1;:37::i;:::-;16240:24;::::0;-1:-1:-1;;;16240:24:0;;::::1;::::0;::::1;15463:25:1::0;;;16240:4:0::1;-1:-1:-1::0;;;;;16240:13:0::1;::::0;::::1;::::0;15436:18:1;;16240:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16275:31;16292:2;16296:9;16275:16;:31::i;:::-;15641:673:::0;;;;;;;;;;;:::o;23006:752::-;23329:16;23347:14;23374:12;23389:37;23397:5;23412:4;23419:6;23389:7;:37::i;:::-;23374:52;;23437:10;23450;:39;;23480:9;23450:39;;;-1:-1:-1;;23450:39:0;23500:71;;-1:-1:-1;;;23500:71:0;;23437:52;;-1:-1:-1;;;;;;23500:18:0;;;;;:71;;23519:10;;23539:4;;23437:52;;23553:8;;23563:1;;23566;;23569;;23500:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23609:141;23671:5;23678:6;23686:9;23697:14;23713:12;23727:2;23731:8;23609:47;:141::i;9083:119::-;9160:34;;-1:-1:-1;;;9160:34:0;;-1:-1:-1;;;;;4643:32:1;;;9160:34:0;;;4625:51:1;9136:4:0;;9173:7;9160:28;;;;;;4598:18:1;;9160:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9153:41;9083:119;-1:-1:-1;;9083:119:0:o;19304:587::-;19511:21;19492:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;19555:31:::1;19569:8;19579:6;;19555:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;19545:41;;19636:12;19605:7;19630:1;19613:7;:14;:18;;;;:::i;:::-;19605:27;;;;;;;;:::i;:::-;;;;;;;:43;;19597:100;;;;-1:-1:-1::0;;;19597:100:0::1;;;;;;;:::i;:::-;19708:138;19740:6;;19747:1;19740:9;;;;;;;:::i;19708:138::-;19857:26;19863:7;19872:6;;19857:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;22271:729:::0;22542:16;22560:14;22523:8;5419:15;5407:8;:27;;5399:65;;;;-1:-1:-1;;;5399:65:0;;;;;;;:::i;:::-;22614:226:::1;22644:5;22672:4;22692:6;22713:9;22737:14;22766:12;22801:4;22821:8;22614:15;:226::i;:::-;22876:38;::::0;-1:-1:-1;;;22876:38:0;;22908:4:::1;22876:38;::::0;::::1;4625:51:1::0;22587:253:0;;-1:-1:-1;22587:253:0;-1:-1:-1;22851:64:0::1;::::0;22865:5;;22872:2;;-1:-1:-1;;;;;22876:23:0;::::1;::::0;::::1;::::0;4598:18:1;;22876:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22851:13;:64::i;28079:424::-:0;28210:1;28190:5;-1:-1:-1;;;;;28190:17:0;;:21;28182:65;;;;-1:-1:-1;;;28182:65:0;;26329:2:1;28182:65:0;;;26311:21:1;26368:2;26348:18;;;26341:30;26407:33;26387:18;;;26380:61;26458:18;;28182:65:0;26127:355:1;28182:65:0;28305:69;;;-1:-1:-1;;;;;18654:15:1;;;28305:69:0;;;18636:34:1;18706:15;;;18686:18;;;18679:43;18738:18;;;;18731:34;;;28305:69:0;;;;;;;;;;18571:18:1;;;;28305:69:0;;;;;;;-1:-1:-1;;;;;28305:69:0;-1:-1:-1;;;28305:69:0;;;28294:81;;-1:-1:-1;;;;28294:10:0;;;;:81;;28305:69;28294:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28258:117;;;;28394:7;:57;;;;-1:-1:-1;28406:11:0;;:16;;:44;;;28437:4;28426:24;;;;;;;;;;;;:::i;:::-;28386:109;;;;-1:-1:-1;;;28386:109:0;;;;;;;:::i;:::-;28171:332;;28079:424;;;;:::o;17818:680::-;17925:6;17920:571;17941:6;:13;17937:1;:17;17920:571;;;17977:14;17996:40;18007:6;18014:1;18007:9;;;;;;;;:::i;:::-;;;;;;;:14;;;18023:6;18030:1;18023:9;;;;;;;;:::i;:::-;;;;;;;:12;;;17996:10;:40::i;:::-;-1:-1:-1;17976:60:0;-1:-1:-1;18051:14:0;18068:7;18076:5;:1;18080;18076:5;:::i;:::-;18068:14;;;;;;;;:::i;:::-;;;;;;;18051:31;;18098:15;18115;18152:6;-1:-1:-1;;;;;18134:24:0;:6;18141:1;18134:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;18134:24:0;;:70;;18185:9;18201:1;18134:70;;;18167:1;18171:9;18134:70;18097:107;;;;18219:10;18252:1;18236:6;:13;:17;;;;:::i;:::-;18232:1;:21;:91;;18320:3;18232:91;;;18256:61;18264:6;18271:3;:1;18273;18271:3;:::i;:::-;18264:11;;;;;;;;:::i;:::-;;;;;;;:16;;;18282:6;18289:1;18291;18289:3;;;;:::i;:::-;18282:11;;;;;;;;:::i;:::-;;;;;;;:14;;;18298:6;18305:1;18307;18305:3;;;;:::i;:::-;18298:11;;;;;;;;:::i;18256:61::-;18219:104;;18344:55;18352:6;18359:1;18352:9;;;;;;;;:::i;:::-;;;;;;;:14;;;18368:6;18375:1;18368:9;;;;;;;;:::i;:::-;;;;;;;:12;;;18382:6;18389:1;18382:9;;;;;;;;:::i;18344:55::-;-1:-1:-1;;;;;18338:67:0;;18424:10;18436;18448:2;18462:1;18452:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18452:12:0;;18338:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17961:530;;;;;17956:3;;;;;:::i;:::-;;;;17920:571;;;;17818:680;;;:::o;27471:196::-;27580:12;;;27542;27580;;;;;;;;;-1:-1:-1;;;;;27559:7:0;;;27573:5;;27559:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27541:52;;;27612:7;27604:55;;;;-1:-1:-1;;;27604:55:0;;28268:2:1;27604:55:0;;;28250:21:1;28307:2;28287:18;;;28280:30;28346:34;28326:18;;;28319:62;-1:-1:-1;;;28397:18:1;;;28390:33;28440:19;;27604:55:0;28066:399:1;27604:55:0;27530:137;27471:196;;:::o;11460:1604::-;11692:12;11706;11757:10;11739:14;:28;;11731:82;;;;-1:-1:-1;;;11731:82:0;;28672:2:1;11731:82:0;;;28654:21:1;28711:2;28691:18;;;28684:30;28750:34;28730:18;;;28723:62;-1:-1:-1;;;28801:18:1;;;28794:39;28850:19;;11731:82:0;28470:405:1;11731:82:0;11850:10;11832:14;:28;;11824:82;;;;-1:-1:-1;;;11824:82:0;;29082:2:1;11824:82:0;;;29064:21:1;29121:2;29101:18;;;29094:30;29160:34;29140:18;;;29133:62;-1:-1:-1;;;29211:18:1;;;29204:39;29260:19;;11824:82:0;28880:405:1;11824:82:0;11985:53;;-1:-1:-1;;;11985:53:0;;11969:13;;-1:-1:-1;;;;;11998:7:0;11985:29;;;;:53;;12015:6;;12023;;12031;;11985:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11969:69;-1:-1:-1;;;;;;12053:19:0;;12049:116;;12097:56;;-1:-1:-1;;;12097:56:0;;-1:-1:-1;;;;;12110:7:0;12097:32;;;;:56;;12130:6;;12138;;12146;;12097:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12089:64;;12049:116;12176:13;12191;12208:35;12220:6;12228;12236;12208:11;:35::i;:::-;12175:68;;;;12258:8;12270:1;12258:13;:30;;;;-1:-1:-1;12275:13:0;;12258:30;12254:803;;;12327:14;;-1:-1:-1;12343:14:0;;-1:-1:-1;12254:803:0;;;12391:19;12413:50;12428:14;12444:8;12454;12413:14;:50::i;:::-;12391:72;;12500:14;12482;:32;12478:568;;12561:10;12543:14;:28;;12535:80;;;;-1:-1:-1;;;12535:80:0;;;;;;;:::i;:::-;12656:14;;-1:-1:-1;12672:14:0;-1:-1:-1;12672:14:0;12478:568;;;12728:19;12750:50;12765:14;12781:8;12791;12750:14;:50::i;:::-;12728:72;;12844:14;12826;:32;;12819:40;;;;:::i;:::-;12904:10;12886:14;:28;;12878:80;;;;-1:-1:-1;;;12878:80:0;;;;;;;:::i;:::-;12999:14;-1:-1:-1;13015:14:0;;-1:-1:-1;12478:568:0;12376:681;12254:803;11720:1344;;;11460:1604;;;;;;;;;;:::o;23903:1152::-;24018:6;24013:1035;24026:17;;;24013:1035;;;24063:13;24078:14;24097:6;;24104:1;24097:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;24097:14:0;:::i;:::-;24113:6;;24120:1;24113:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;24062:64;;;;24142:14;24161:25;24172:5;24179:6;24161:10;:25::i;:::-;24141:45;;;24201:10;24220:55;24228:6;;24235:1;24228:9;;;;;;;:::i;:::-;:14;;;:9;;;;;:14;;;;-1:-1:-1;24228:14:0;:::i;:::-;24244:6;;24251:1;24244:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;24258:6;;24265:1;24258:9;;;;;;;:::i;24220:55::-;24201:75;;24291:16;24322:17;24410:13;24425;24443:4;-1:-1:-1;;;;;24443:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24409:52;;;;;24477:17;24508:6;-1:-1:-1;;;;;24499:15:0;:5;-1:-1:-1;;;;;24499:15:0;;:61;;24541:8;24551;24499:61;;;24518:8;24528;24499:61;-1:-1:-1;24589:38:0;;-1:-1:-1;;;24589:38:0;;-1:-1:-1;;;;;4643:32:1;;;24589:38:0;;;4625:51:1;24476:84:0;;-1:-1:-1;24476:84:0;;24589:23;;;;;4598:18:1;;24589:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;24575:69;;24677:40;24690:11;24703:5;24710:6;24677:12;:40::i;:::-;24659:58;;;;;24354:379;;;24748:15;24765;24793:6;-1:-1:-1;;;;;24784:15:0;:5;-1:-1:-1;;;;;24784:15:0;;:67;;24829:12;24848:1;24784:67;;;24808:1;24812:12;24784:67;24747:104;;-1:-1:-1;24747:104:0;-1:-1:-1;24866:10:0;24883:17;24899:1;24883:6;:17;:::i;:::-;24879:1;:21;:91;;24967:3;24879:91;;;24903:61;24911:6;;24918:3;:1;24920;24918:3;:::i;:::-;24911:11;;;;;;;:::i;:::-;:16;;;:11;;;;;:16;;;;-1:-1:-1;24911:16:0;:::i;:::-;24929:6;;24936:3;:1;24938;24936:3;:::i;:::-;24929:11;;;;;;;:::i;:::-;;;;;;:14;;;;;;;;;;:::i;:::-;24945:6;;24952:3;:1;24954;24952:3;:::i;:::-;24945:11;;;;;;;:::i;24903:61::-;25023:12;;;25033:1;25023:12;;;;;;;;;-1:-1:-1;;;24985:51:0;;;24866:104;;-1:-1:-1;;;;;;24985:9:0;;;;;:51;;24995:10;;25007;;24866:104;;24985:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:998;;;;;;;;;24045:3;;;;;:::i;:::-;;;;24013:1035;;4311:303;4356:6;4383:1;4379;:5;4375:232;;;-1:-1:-1;4405:1:0;4421:6;4430:5;4434:1;4405;4430:5;:::i;:::-;:9;;4438:1;4430:9;:::i;:::-;4421:18;;4454:92;4465:1;4461;:5;4454:92;;;4491:1;-1:-1:-1;4491:1:0;4529;4491;4516:5;4491:1;4516;:5;:::i;:::-;:9;;;;:::i;:::-;4515:15;;;;:::i;:::-;4511:19;;4454:92;;;4386:171;4311:303;;;:::o;4375:232::-;4567:6;;4563:44;;-1:-1:-1;4594:1:0;4563:44;4311:303;;;:::o;6902:327::-;6993:12;7036:1;7026:7;:11;7018:61;;;;-1:-1:-1;;;7018:61:0;;29492:2:1;7018:61:0;;;29474:21:1;29531:2;29511:18;;;29504:30;29570:34;29550:18;;;29543:62;-1:-1:-1;;;29621:18:1;;;29614:35;29666:19;;7018:61:0;29290:401:1;7018:61:0;7109:1;7098:8;:12;:28;;;;;7125:1;7114:8;:12;7098:28;7090:81;;;;-1:-1:-1;;;7090:81:0;;29898:2:1;7090:81:0;;;29880:21:1;29937:2;29917:18;;;29910:30;29976:34;29956:18;;;29949:62;-1:-1:-1;;;30027:18:1;;;30020:38;30075:19;;7090:81:0;29696:404:1;7090:81:0;7213:8;7192:18;7202:8;7192:7;:18;:::i;:::-;:29;;;;:::i;4208:97::-;4260:4;4288:1;4284;:5;:13;;4296:1;4284:13;;;4292:1;4284:13;4277:20;4208:97;-1:-1:-1;;;4208:97:0:o;27675:396::-;27788:1;27768:5;-1:-1:-1;;;;;27768:17:0;;:21;27760:65;;;;-1:-1:-1;;;27760:65:0;;26329:2:1;27760:65:0;;;26311:21:1;26368:2;26348:18;;;26341:30;26407:33;26387:18;;;26380:61;26458:18;;27760:65:0;26127:355:1;27760:65:0;27883:59;;;-1:-1:-1;;;;;25767:32:1;;;27883:59:0;;;25749:51:1;25816:18;;;;25809:34;;;27883:59:0;;;;;;;;;;25722:18:1;;;;27883:59:0;;;;;;;-1:-1:-1;;;;;27883:59:0;-1:-1:-1;;;27883:59:0;;;27872:71;;-1:-1:-1;;;;27872:10:0;;;;:71;;27883:59;27872:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27836:107;;;;27962:7;:57;;;;-1:-1:-1;27974:11:0;;:16;;:44;;;28005:4;27994:24;;;;;;;;;;;;:::i;:::-;27954:109;;;;-1:-1:-1;;;27954:109:0;;;;;;;:::i;:::-;27749:322;;27675:396;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:816;3792:6;3800;3808;3816;3824;3832;3885:3;3873:9;3864:7;3860:23;3856:33;3853:53;;;3902:1;3899;3892:12;3853:53;3938:9;3925:23;3915:33;;3995:2;3984:9;3980:18;3967:32;3957:42;;4050:2;4039:9;4035:18;4022:32;4077:18;4069:6;4066:30;4063:50;;;4109:1;4106;4099:12;4063:50;4148:84;4224:7;4215:6;4204:9;4200:22;4148:84;:::i;:::-;4251:8;;-1:-1:-1;4122:110:1;-1:-1:-1;;4336:2:1;4321:18;;4308:32;4349:31;4308:32;4349:31;:::i;:::-;4399:5;4389:15;;;4451:3;4440:9;4436:19;4423:33;4413:43;;3646:816;;;;;;;;:::o;4687:592::-;4770:6;4778;4786;4794;4847:3;4835:9;4826:7;4822:23;4818:33;4815:53;;;4864:1;4861;4854:12;4815:53;4903:9;4890:23;4922:31;4947:5;4922:31;:::i;:::-;4972:5;-1:-1:-1;5029:2:1;5014:18;;5001:32;5042:33;5001:32;5042:33;:::i;:::-;5094:7;-1:-1:-1;5153:2:1;5138:18;;5125:32;5166:30;5125:32;5166:30;:::i;:::-;4687:592;;;;-1:-1:-1;5215:7:1;;5269:2;5254:18;5241:32;;-1:-1:-1;;4687:592:1:o;5284:156::-;5350:20;;5410:4;5399:16;;5389:27;;5379:55;;5430:1;5427;5420:12;5445:1146;5586:6;5594;5602;5610;5618;5626;5634;5642;5650;5658;5666:7;5720:3;5708:9;5699:7;5695:23;5691:33;5688:53;;;5737:1;5734;5727:12;5688:53;5776:9;5763:23;5795:31;5820:5;5795:31;:::i;:::-;5845:5;-1:-1:-1;5902:2:1;5887:18;;5874:32;5915:30;5874:32;5915:30;:::i;:::-;5964:7;-1:-1:-1;6018:2:1;6003:18;;5990:32;;-1:-1:-1;6069:2:1;6054:18;;6041:32;;-1:-1:-1;6120:3:1;6105:19;;6092:33;;-1:-1:-1;6177:3:1;6162:19;;6149:33;6191;6149;6191;:::i;:::-;6243:7;-1:-1:-1;6297:3:1;6282:19;;6269:33;;-1:-1:-1;6354:3:1;6339:19;;6326:33;6368:30;6326:33;6368:30;:::i;:::-;6417:7;-1:-1:-1;6443:37:1;6475:3;6460:19;;6443:37;:::i;:::-;6433:47;;6527:3;6516:9;6512:19;6499:33;6489:43;;6580:3;6569:9;6565:19;6552:33;6541:44;;5445:1146;;;;;;;;;;;;;;:::o;6596:523::-;6670:6;6678;6686;6739:2;6727:9;6718:7;6714:23;6710:32;6707:52;;;6755:1;6752;6745:12;6707:52;6794:9;6781:23;6813:31;6838:5;6813:31;:::i;:::-;6863:5;-1:-1:-1;6920:2:1;6905:18;;6892:32;6933:33;6892:32;6933:33;:::i;:::-;6985:7;-1:-1:-1;7044:2:1;7029:18;;7016:32;7057:30;7016:32;7057:30;:::i;:::-;7106:7;7096:17;;;6596:523;;;;;:::o;7332:388::-;7400:6;7408;7461:2;7449:9;7440:7;7436:23;7432:32;7429:52;;;7477:1;7474;7467:12;7429:52;7516:9;7503:23;7535:31;7560:5;7535:31;:::i;:::-;7585:5;-1:-1:-1;7642:2:1;7627:18;;7614:32;7655:33;7614:32;7655:33;:::i;:::-;7707:7;7697:17;;;7332:388;;;;;:::o;8034:1010::-;8162:6;8170;8178;8186;8194;8202;8210;8218;8226;8279:3;8267:9;8258:7;8254:23;8250:33;8247:53;;;8296:1;8293;8286:12;8247:53;8335:9;8322:23;8354:31;8379:5;8354:31;:::i;:::-;8404:5;-1:-1:-1;8461:2:1;8446:18;;8433:32;8474:33;8433:32;8474:33;:::i;:::-;8526:7;-1:-1:-1;8585:2:1;8570:18;;8557:32;8598:30;8557:32;8598:30;:::i;:::-;8647:7;-1:-1:-1;8701:2:1;8686:18;;8673:32;;-1:-1:-1;8752:3:1;8737:19;;8724:33;;-1:-1:-1;8804:3:1;8789:19;;8776:33;;-1:-1:-1;8856:3:1;8841:19;;8828:33;;-1:-1:-1;8913:3:1;8898:19;;8885:33;8927;8885;8927;:::i;:::-;8979:7;8969:17;;;9033:3;9022:9;9018:19;9005:33;8995:43;;8034:1010;;;;;;;;;;;:::o;9373:456::-;9450:6;9458;9466;9519:2;9507:9;9498:7;9494:23;9490:32;9487:52;;;9535:1;9532;9525:12;9487:52;9571:9;9558:23;9548:33;;9631:2;9620:9;9616:18;9603:32;9644:31;9669:5;9644:31;:::i;:::-;9694:5;-1:-1:-1;9751:2:1;9736:18;;9723:32;9764:33;9723:32;9764:33;:::i;10097:747::-;10234:6;10242;10250;10258;10266;10319:3;10307:9;10298:7;10294:23;10290:33;10287:53;;;10336:1;10333;10326:12;10287:53;10372:9;10359:23;10349:33;;10433:2;10422:9;10418:18;10405:32;10460:18;10452:6;10449:30;10446:50;;;10492:1;10489;10482:12;10446:50;10531:84;10607:7;10598:6;10587:9;10583:22;10531:84;:::i;:::-;10634:8;;-1:-1:-1;10505:110:1;-1:-1:-1;;10719:2:1;10704:18;;10691:32;10732:31;10691:32;10732:31;:::i;:::-;10097:747;;;;-1:-1:-1;10097:747:1;;10834:2;10819:18;10806:32;;10097:747;-1:-1:-1;;10097:747:1:o;10849:127::-;10910:10;10905:3;10901:20;10898:1;10891:31;10941:4;10938:1;10931:15;10965:4;10962:1;10955:15;10981:275;11052:2;11046:9;11117:2;11098:13;;-1:-1:-1;;11094:27:1;11082:40;;11152:18;11137:34;;11173:22;;;11134:62;11131:88;;;11199:18;;:::i;:::-;11235:2;11228:22;10981:275;;-1:-1:-1;10981:275:1:o;11261:183::-;11321:4;11354:18;11346:6;11343:30;11340:56;;;11376:18;;:::i;:::-;-1:-1:-1;11421:1:1;11417:14;11433:4;11413:25;;11261:183::o;11449:1410::-;11611:6;11619;11627;11635;11643;11696:3;11684:9;11675:7;11671:23;11667:33;11664:53;;;11713:1;11710;11703:12;11664:53;11753:9;11740:23;11782:18;11823:2;11815:6;11812:14;11809:34;;;11839:1;11836;11829:12;11809:34;11877:6;11866:9;11862:22;11852:32;;11922:7;11915:4;11911:2;11907:13;11903:27;11893:55;;11944:1;11941;11934:12;11893:55;11980:2;11967:16;12002:4;12026:60;12042:43;12082:2;12042:43;:::i;:::-;12026:60;:::i;:::-;12120:15;;;12202:1;12198:10;;;;12190:19;;12186:28;;;12151:12;;;;12226:19;;;12223:39;;;12258:1;12255;12248:12;12223:39;12282:11;;;;12302:142;12318:6;12313:3;12310:15;12302:142;;;12384:17;;12372:30;;12335:12;;;;12422;;;;12302:142;;;12463:5;-1:-1:-1;;12506:18:1;;12493:32;;-1:-1:-1;;12537:16:1;;;12534:36;;;12566:1;12563;12556:12;12534:36;;12605:86;12683:7;12672:8;12661:9;12657:24;12605:86;:::i;:::-;12710:8;;-1:-1:-1;12579:112:1;-1:-1:-1;12764:38:1;;-1:-1:-1;12798:2:1;12783:18;;12764:38;:::i;12864:752::-;12916:5;12964:4;12952:9;12947:3;12943:19;12939:30;12936:50;;;12982:1;12979;12972:12;12936:50;13015:2;13009:9;13057:4;13049:6;13045:17;13128:6;13116:10;13113:22;13092:18;13080:10;13077:34;13074:62;13071:88;;;13139:18;;:::i;:::-;13175:2;13168:22;13208:6;-1:-1:-1;13208:6:1;13238:23;;13270:33;13238:23;13270:33;:::i;:::-;13312:23;;13387:2;13372:18;;13359:32;13400:33;13359:32;13400:33;:::i;:::-;13461:2;13449:15;;13442:32;13526:2;13511:18;;13498:32;13539:30;13498:32;13539:30;:::i;:::-;13597:2;13585:15;;;;13578:32;12864:752;;-1:-1:-1;;12864:752:1:o;13621:1025::-;13736:6;13744;13797:2;13785:9;13776:7;13772:23;13768:32;13765:52;;;13813:1;13810;13803:12;13765:52;13849:9;13836:23;13826:33;;13878:2;13931;13920:9;13916:18;13903:32;13958:18;13950:6;13947:30;13944:50;;;13990:1;13987;13980:12;13944:50;14013:22;;14066:4;14058:13;;14054:27;-1:-1:-1;14044:55:1;;14095:1;14092;14085:12;14044:55;14131:2;14118:16;14154:60;14170:43;14210:2;14170:43;:::i;14154:60::-;14248:15;;;14310:4;14349:11;;;14341:20;;14337:29;;;14279:12;;;;14236:3;14378:19;;;14375:39;;;14410:1;14407;14400:12;14375:39;14434:11;;;;14454:162;14470:6;14465:3;14462:15;14454:162;;;14536:37;14565:7;14560:3;14536:37;:::i;:::-;14524:50;;14487:12;;;;14594;;;;14454:162;;;14458:3;14635:5;14625:15;;;;;;;13621:1025;;;;;:::o;14651:661::-;14743:6;14751;14759;14767;14775;14828:3;14816:9;14807:7;14803:23;14799:33;14796:53;;;14845:1;14842;14835:12;14796:53;14884:9;14871:23;14903:31;14928:5;14903:31;:::i;:::-;14953:5;-1:-1:-1;15010:2:1;14995:18;;14982:32;15023:33;14982:32;15023:33;:::i;:::-;15075:7;-1:-1:-1;15134:2:1;15119:18;;15106:32;15147:30;15106:32;15147:30;:::i;:::-;14651:661;;;;-1:-1:-1;15196:7:1;;15250:2;15235:18;;15222:32;;-1:-1:-1;15301:3:1;15286:19;15273:33;;14651:661;-1:-1:-1;;14651:661:1:o;15499:1290::-;15649:6;15657;15665;15673;15681;15689;15697;15705;15713;15721;15729:7;15738;15792:3;15780:9;15771:7;15767:23;15763:33;15760:53;;;15809:1;15806;15799:12;15760:53;15848:9;15835:23;15867:31;15892:5;15867:31;:::i;:::-;15917:5;-1:-1:-1;15974:2:1;15959:18;;15946:32;15987:33;15946:32;15987:33;:::i;:::-;16039:7;-1:-1:-1;16098:2:1;16083:18;;16070:32;16111:30;16070:32;16111:30;:::i;:::-;16160:7;-1:-1:-1;16214:2:1;16199:18;;16186:32;;-1:-1:-1;16265:3:1;16250:19;;16237:33;;-1:-1:-1;16317:3:1;16302:19;;16289:33;;-1:-1:-1;16374:3:1;16359:19;;16346:33;16388;16346;16388;:::i;:::-;16440:7;-1:-1:-1;16494:3:1;16479:19;;16466:33;;-1:-1:-1;16551:3:1;16536:19;;16523:33;16565:30;16523:33;16565:30;:::i;:::-;16614:7;-1:-1:-1;16640:37:1;16672:3;16657:19;;16640:37;:::i;:::-;16630:47;;16725:3;16714:9;16710:19;16697:33;16686:44;;16778:3;16767:9;16763:19;16750:33;16739:44;;15499:1290;;;;;;;;;;;;;;:::o;16794:799::-;16904:6;16912;16920;16928;16936;16944;16952;17005:3;16993:9;16984:7;16980:23;16976:33;16973:53;;;17022:1;17019;17012:12;16973:53;17061:9;17048:23;17080:31;17105:5;17080:31;:::i;:::-;17130:5;-1:-1:-1;17187:2:1;17172:18;;17159:32;17200:30;17159:32;17200:30;:::i;:::-;17249:7;-1:-1:-1;17303:2:1;17288:18;;17275:32;;-1:-1:-1;17354:2:1;17339:18;;17326:32;;-1:-1:-1;17405:3:1;17390:19;;17377:33;;-1:-1:-1;17462:3:1;17447:19;;17434:33;17476;17434;17476;:::i;17598:247::-;17657:6;17710:2;17698:9;17689:7;17685:23;17681:32;17678:52;;;17726:1;17723;17716:12;17678:52;17765:9;17752:23;17784:31;17809:5;17784:31;:::i;18042:349::-;18244:2;18226:21;;;18283:2;18263:18;;;18256:30;18322:27;18317:2;18302:18;;18295:55;18382:2;18367:18;;18042:349::o;18776:245::-;18843:6;18896:2;18884:9;18875:7;18871:23;18867:32;18864:52;;;18912:1;18909;18902:12;18864:52;18944:9;18938:16;18963:28;18985:5;18963:28;:::i;19428:245::-;19507:6;19515;19568:2;19556:9;19547:7;19543:23;19539:32;19536:52;;;19584:1;19581;19574:12;19536:52;-1:-1:-1;;19607:16:1;;19663:2;19648:18;;;19642:25;19607:16;;19642:25;;-1:-1:-1;19428:245:1:o;19678:403::-;19880:2;19862:21;;;19919:2;19899:18;;;19892:30;19958:34;19953:2;19938:18;;19931:62;-1:-1:-1;;;20024:2:1;20009:18;;20002:37;20071:3;20056:19;;19678:403::o;20086:::-;20288:2;20270:21;;;20327:2;20307:18;;;20300:30;20366:34;20361:2;20346:18;;20339:62;-1:-1:-1;;;20432:2:1;20417:18;;20410:37;20479:3;20464:19;;20086:403::o;20494:127::-;20555:10;20550:3;20546:20;20543:1;20536:31;20586:4;20583:1;20576:15;20610:4;20607:1;20600:15;20626:127;20687:10;20682:3;20678:20;20675:1;20668:31;20718:4;20715:1;20708:15;20742:4;20739:1;20732:15;20758:125;20798:4;20826:1;20823;20820:8;20817:34;;;20831:18;;:::i;:::-;-1:-1:-1;20868:9:1;;20758:125::o;20888:408::-;21090:2;21072:21;;;21129:2;21109:18;;;21102:30;21168:34;21163:2;21148:18;;21141:62;-1:-1:-1;;;21234:2:1;21219:18;;21212:42;21286:3;21271:19;;20888:408::o;21301:354::-;21503:2;21485:21;;;21542:2;21522:18;;;21515:30;21581:32;21576:2;21561:18;;21554:60;21646:2;21631:18;;21301:354::o;21660:222::-;21741:6;21794:2;21782:9;21773:7;21769:23;21765:32;21762:52;;;21810:1;21807;21800:12;21762:52;21833:43;21868:7;21857:9;21833:43;:::i;21887:241::-;21943:6;21996:2;21984:9;21975:7;21971:23;21967:32;21964:52;;;22012:1;22009;22002:12;21964:52;22051:9;22038:23;22070:28;22092:5;22070:28;:::i;22315:184::-;22385:6;22438:2;22426:9;22417:7;22413:23;22409:32;22406:52;;;22454:1;22451;22444:12;22406:52;-1:-1:-1;22477:16:1;;22315:184;-1:-1:-1;22315:184:1:o;22504:385::-;-1:-1:-1;;;;;22756:15:1;;;22738:34;;22808:15;;;;22803:2;22788:18;;22781:43;22867:14;;22860:22;22855:2;22840:18;;22833:50;22688:2;22673:18;;22504:385::o;22894:251::-;22964:6;23017:2;23005:9;22996:7;22992:23;22988:32;22985:52;;;23033:1;23030;23023:12;22985:52;23065:9;23059:16;23084:31;23109:5;23084:31;:::i;23150:168::-;23190:7;23256:1;23252;23248:6;23244:14;23241:1;23238:21;23233:1;23226:9;23219:17;23215:45;23212:71;;;23263:18;;:::i;:::-;-1:-1:-1;23303:9:1;;23150:168::o;23323:217::-;23363:1;23389;23379:132;;23433:10;23428:3;23424:20;23421:1;23414:31;23468:4;23465:1;23458:15;23496:4;23493:1;23486:15;23379:132;-1:-1:-1;23525:9:1;;23323:217::o;23545:670::-;-1:-1:-1;;;;;23912:15:1;;;23894:34;;23964:15;;;;23959:2;23944:18;;23937:43;24011:2;23996:18;;23989:34;;;;24054:2;24039:18;;24032:34;;;;24115:4;24103:17;24097:3;24082:19;;24075:46;23874:3;24137:19;;24130:35;24196:3;24181:19;;24174:35;;;;23843:3;23828:19;;23545:670::o;25264:306::-;25352:6;25360;25368;25421:2;25409:9;25400:7;25396:23;25392:32;25389:52;;;25437:1;25434;25427:12;25389:52;25466:9;25460:16;25450:26;;25516:2;25505:9;25501:18;25495:25;25485:35;;25560:2;25549:9;25545:18;25539:25;25529:35;;25264:306;;;;;:::o;25854:128::-;25894:3;25925:1;25921:6;25918:1;25915:13;25912:39;;;25931:18;;:::i;:::-;-1:-1:-1;25967:9:1;;25854:128::o;25987:135::-;26026:3;-1:-1:-1;;26047:17:1;;26044:43;;;26067:18;;:::i;:::-;-1:-1:-1;26114:1:1;26103:13;;25987:135::o;26487:258::-;26559:1;26569:113;26583:6;26580:1;26577:13;26569:113;;;26659:11;;;26653:18;26640:11;;;26633:39;26605:2;26598:10;26569:113;;;26700:6;26697:1;26694:13;26691:48;;;-1:-1:-1;;26735:1:1;26717:16;;26710:27;26487:258::o;26750:274::-;26879:3;26917:6;26911:13;26933:53;26979:6;26974:3;26967:4;26959:6;26955:17;26933:53;:::i;:::-;27002:16;;;;;26750:274;-1:-1:-1;;26750:274:1:o;27029:403::-;27231:2;27213:21;;;27270:2;27250:18;;;27243:30;27309:34;27304:2;27289:18;;27282:62;-1:-1:-1;;;27375:2:1;27360:18;;27353:37;27422:3;27407:19;;27029:403::o;27437:624::-;27668:6;27657:9;27650:25;27711:6;27706:2;27695:9;27691:18;27684:34;27783:1;27779;27774:3;27770:11;27766:19;27758:6;27754:32;27749:2;27738:9;27734:18;27727:60;27823:3;27818:2;27807:9;27803:18;27796:31;27631:4;27856:6;27850:13;27900:6;27894:3;27883:9;27879:19;27872:35;27916:67;27976:6;27970:3;27959:9;27955:19;27950:2;27942:6;27938:15;27916:67;:::i;:::-;28044:2;28023:15;-1:-1:-1;;28019:29:1;28004:45;;;;28051:3;28000:55;;27437:624;-1:-1:-1;;;;;27437:624:1:o

Swarm Source

ipfs://8d13bb610d984630b1ac638e933819188d85103d5e6c9febe3cb38fc333bc173

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.