MON Price: $0.018704 (-2.06%)

Contract

0x264950F87B31b06573a8D35d88778C22FB615b9A

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Fee Tier378263852025-11-25 4:07:1161 days ago1764043631IN
0x264950F8...2FB615b9A
0 MON0.00654252129.1
Update State Vie...378203962025-11-25 3:27:0861 days ago1764041228IN
0x264950F8...2FB615b9A
0 MON0.00598222118.27729467

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OffchainOracle

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2025-11-24
*/

// SPDX-License-Identifier: No

pragma solidity 0.8.24;

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

library Sqrt {
    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;
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}
// ver 1 ==> For Uniswap v1
interface IUniswapV1 {
    function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 );
}
// ver 2 ==> For Uniswap v2, Quickswap v2, Sushiswap v2, pancakeswap v2    
interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1);
    function token0() external view returns (address);
    function token1() external view returns (address);
}
// ver 22 ==> For Meshswap
interface IMeshswapPool {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function reserve0() external view returns (uint112);
    function reserve1() external view returns (uint112);
}
// ver 23 ==> For Kyber swap
interface IKyberDmmPool {
    function getTradeInfo() external view returns (uint112 reserve0, uint112 reserve1, uint112 _vReserve0, uint112 _vReserve1, uint256 feeInPrecision);
    function token0() external view returns (address);
    function token1() external view returns (address);
}
// ver 3 ==> For Uniswap v3, Sushiswap v3, Pancakeswap v3, Solidly v3
interface IUniswapV3Pool {
    function slot0() external view returns (uint160 sqrtPriceX96);
    function token0() external view returns (address);
    function token1() external view returns (address);
}
// ver 30101~30104~30199, 30201~30204~30299 ==> For Uniswap v4: StateView
interface IUniswapV4StateView {
    function getSlot0(bytes32 poolId) external view returns (uint160 sqrtPriceX96);
}
// ver 31 ==> For iZiSwap pool of iZUMi finance
interface IiZiSwapPool {
    function state() external view returns (uint160 sqrtPriceX96);
    function tokenX() external view returns (address);
    function tokenY() external view returns (address);
}
// ver 4 ==> For Quickswap v3
interface IAlgebraPool {
    function globalState() external view returns (uint160 price);
    function token0() external view returns (address);
    function token1() external view returns (address);
}

// ver: 611 ==> For Cowswap BCoWPool: weighted pool
interface IBCoWPool {
    function getBalance(address tokenAddress) external view returns (uint256);
    function getNormalizedWeight(address tokenAddress) external view returns (uint256);
}

// ver: 621 ==> For Balancer v2: weighted pool
interface IWeightedPoolV2 {
    function getVault() external view returns (address);
    function getPoolId() external view returns (bytes32);
    function getNormalizedWeights() external view returns (uint256[] memory);
}
// ver: 622 ==> For Balancer v2: stable pool 
interface IStablePoolV2 {
    function getVault() external view returns (address);
    function getTokenRate(address) external view returns (uint256);
}
// ver: 623 For Balancer v2: Gyro E-CLP pool
interface IGyroECLPPoolV2 {
    function getVault() external view returns (address);
    function getPoolId() external view returns (bytes32);
    function getPrice() external view returns (uint256);
}
// ver: 621,622,623 ==> For Balancer v2: vault
interface IVaultV2 {
    function getPoolTokens(bytes32 poolId) external view returns (address[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock);
}
// ver: 631 ==> For Balancer v3: weighted pool
interface IWeightedPoolV3 {
    function getVault() external view returns (address);
    function getNormalizedWeights() external view returns (uint256[] memory);
}
// ver: 632 ==> For Balancer v3: stable pool 
interface IStablePoolV3 {
    function getVault() external view returns (address);
}
// ver: 633 For Balancer v3: Gyro E-CLP pool
interface IGyroECLPPoolV3 {
    function getVault() external view returns (address);
}
// ver: 631,632,633 ==> For Balancer v3: vault
interface IVaultV3 {
    function getPoolTokens(address pool) external view returns (address[] memory tokens);
    function getCurrentLiveBalances(address) external view returns (uint256[] memory balances);
    function getPoolTokenRates(address) external view returns (uint256[] memory decimalScalingFactors, uint256[] memory tokenRates);
}
// ver 7,71,72,73,74,75 ==> For Traderjoe V2.2
interface ITraderjoeV2_2Pool {
    function getSwapOut(uint128 amountIn, bool swapForY) external view returns (uint128 amountInLeft, uint128 amountOut, uint128 fee);
    function getTokenX() external view returns (address);
    function getTokenY() external view returns (address);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurveProvider {
    function get_address (uint256 _id) external view returns (address);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurveMetaregistry {
    //function find_pools_for_coins(address srcToken, address dstToken) external view returns (address[] memory);
    function get_coin_indices(address _pool, address _from, address _to) external view returns (int128, int128, bool);
    //function get_underlying_balances(address _pool) external view returns (uint256[8] memory);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurvePool {
    function allowed_extra_profit() external view returns (uint256);
    function get_rate_mul() external view returns (uint256);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurveStableSwapMeta {
    function get_dy_underlying(int128,int128,uint256) external view returns (uint256);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurveStableSwap {
    function get_dy(int128,int128,uint256) external view returns (uint256);
}
// ver 8,81,82,83,84,85 ==> For Curve
interface ICurveCryptoSwap {
    function get_dy(uint256,uint256,uint256) external view returns (uint256);
}
// ver 9,91,92,93,94,95 ==> For Dodoex V2 DVM & DSP
interface IDodoDVM {
    function _BASE_TOKEN_() external view returns (address);
    function _QUOTE_TOKEN_() external view returns (address);
    function querySellBase(address trader, uint256 payBaseAmount) external view returns (uint256 receiveQuoteAmount, uint256 mtFee);
    function querySellQuote(address trader, uint256 payQuoteAmount) external view returns (uint256 receiveBaseAmount, uint256 mtFee);
}

contract OffchainOracle {
    using SafeMath for uint256;
    using SafeMath for uint112;
    using SafeMath for uint128;
    using Sqrt for uint256;
    address private constant _NULL                              = 0x0000000000000000000000000000000000000000;
    address private constant _ETH                               = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    mapping(uint256 => address) private _StateViews;
    struct PoolKey {
        address currency0;
        address currency1;
        uint24 fee;
        int24 tickSpacing;
        address hooks;
    }
    struct FeeTier {
        uint24 fee;
        int24 tickSpacing;
    }
    mapping(uint32 => FeeTier) private _FeeTiers;
    mapping(uint256 => address) private _CurveAddressProvider;

    constructor() {
        _StateViews[1]              =  0x7fFE42C4a5DEeA5b0feC41C94C136Cf115597227;         // _StateView_ethereum;
        _StateViews[130]            =  0x86e8631A016F9068C3f085fAF484Ee3F5fDee8f2;         // _StateView_unichain;
        _StateViews[10]             =  0xc18a3169788F4F75A170290584ECA6395C75Ecdb;         // _StateView_optimism;
        _StateViews[8453]           =  0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71;         // _StateView_base;
        _StateViews[42161]          =  0x76Fd297e2D437cd7f76d50F01AfE6160f86e9990;         // _StateView_arbitrum;
        _StateViews[137]            =  0x5eA1bD7974c8A611cBAB0bDCAFcB1D9CC9b3BA5a;         // _StateView_polygon;
        _StateViews[81457]          =  0x12a88AE16F46DCe4e8B15368008Ab3380885df30;         // _StateView_blast;
        _StateViews[7777777]        =  0x385785Af07d63b50d0a0ea57C4FF89D06adf7328;         // _StateView_zora;
        _StateViews[480]            =  0x51D394718bc09297262e368c1A481217FdEB71eb;         // _StateView_worldchain;
        _StateViews[57073]          =  0x76Fd297e2D437cd7f76d50F01AfE6160f86e9990;         // _StateView_ink;
        _StateViews[1868]           =  0x76Fd297e2D437cd7f76d50F01AfE6160f86e9990;         // _StateView_soneium;
        _StateViews[43114]          =  0xc3c9e198C735a4b97e3e683f391cCBDD60B69286;         // _StateView_avalanche;
        _StateViews[56]             =  0xd13Dd3D6E93f276FAfc9Db9E6BB47C1180aeE0c4;         // _StateView_bsc;

        _FeeTiers[30101] = FeeTier(3000, 60);           // 0.3%
        _FeeTiers[30102] = FeeTier(10000, 200);         // 1%
        _FeeTiers[30103] = FeeTier(500, 10);            // 0.05%
        _FeeTiers[30104] = FeeTier(100, 1);             // 0.01%
        _FeeTiers[30201] = FeeTier(3000, 60);           // 0.3%
        _FeeTiers[30202] = FeeTier(10000, 200);         // 1%
        _FeeTiers[30203] = FeeTier(500, 10);            // 0.05%
        _FeeTiers[30204] = FeeTier(100, 1);             // 0.01%

        _CurveAddressProvider[1]            = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_ethereum
        _CurveAddressProvider[42161]        = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_arbitrum
        _CurveAddressProvider[1313161554]   = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_aurora
        _CurveAddressProvider[43114]        = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_avalanche
        _CurveAddressProvider[8453]         = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_base
        _CurveAddressProvider[56]           = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_bsc
        _CurveAddressProvider[42220]        = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_celo
        _CurveAddressProvider[21000000]     = 0xd2002373543Ce3527023C75e7518C274A51ce712;   // _CurveAddressProvider_corn
        _CurveAddressProvider[42793]        = 0x4574921eb950d3Fd5B01562162EC566Cb8bc3648;   // _CurveAddressProvider_etherlink
        _CurveAddressProvider[250]          = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_fantom
        _CurveAddressProvider[252]          = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_fraxtal
        _CurveAddressProvider[100]          = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_gnosis
        _CurveAddressProvider[999]          = 0x1764ee18e8B3ccA4787249Ceb249356192594585;   // _CurveAddressProvider_HyperEVM
        _CurveAddressProvider[57073]        = 0x604388Bb1159AFd21eB5191cE22b4DeCdEE2Ae22;   // _CurveAddressProvider_ink
        _CurveAddressProvider[2222]         = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_kava
        _CurveAddressProvider[5000]         = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_mantle
        _CurveAddressProvider[10]           = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_optimism
        _CurveAddressProvider[9745]         = 0x4574921eb950d3Fd5B01562162EC566Cb8bc3648;   // _CurveAddressProvider_plasma
        _CurveAddressProvider[98866]        = 0x907CE289E9Ee0BBcb0F69132B1C28A9Affc29FCA;   // _CurveAddressProvider_plume
        _CurveAddressProvider[137]          = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_polygon
        _CurveAddressProvider[146]          = 0x87FE17697D0f14A222e8bEf386a0860eCffDD617;   // _CurveAddressProvider_sonic
        _CurveAddressProvider[239]          = 0x907CE289E9Ee0BBcb0F69132B1C28A9Affc29FCA;   // _CurveAddressProvider_tac
        _CurveAddressProvider[167000]       = 0x87FE17697D0f14A222e8bEf386a0860eCffDD617;   // _CurveAddressProvider_taiko
        _CurveAddressProvider[196]          = 0x5ffe7FB82894076ECB99A30D6A32e969e6e35E98;   // _CurveAddressProvider_xlayer
        _CurveAddressProvider[50]           = 0x907CE289E9Ee0BBcb0F69132B1C28A9Affc29FCA;   // _CurveAddressProvider_xdc
        _CurveAddressProvider[324]          = 0x54A5a69e17Aa6eB89d77aa3828E38C9Eb4fF263D;   // _CurveAddressProvider_zksync
    }
    function getStateView(uint256 chainId) public view returns (address) {
        return _StateViews[chainId];
    }
    function updateStateView(uint256 chainId, address stateView) public {
        _StateViews[chainId] = stateView;
    }
    function getFeeTier(uint32 ver) public view returns (uint24 fee, int24 tickSpacing) {
        return (_FeeTiers[ver].fee, _FeeTiers[ver].tickSpacing);
    }
    function updateFeeTier(uint32 ver, uint24 fee, int24 tickSpacing) public {
        _FeeTiers[ver] = FeeTier(fee, tickSpacing);
    }
    function getCurveAddressProvider(uint256 chainId) public view returns (address) {
        return _CurveAddressProvider[chainId];
    }
    function updateCurveAddressProvider(uint256 chainId, address curveAddressProvider) public {
        _CurveAddressProvider[chainId] = curveAddressProvider;
    }
    function toId(PoolKey memory poolKey) internal pure returns (bytes32 poolId) {
        return keccak256(abi.encode(poolKey));
    }
    function _getCurvePoolType(address pool) private view returns (uint8) {
        // 0 for stableswap, 1 for cryptoswap, 2 for LLAMMA.

        // check if cryptoswap
        (bool success, bytes memory data) = pool.staticcall(abi.encodeWithSelector(ICurvePool.allowed_extra_profit.selector));
        if (success && data.length >= 32) { // vyper could return redundant bytes
            return 1;
        }

        // check if llamma
        (success, data) = pool.staticcall(abi.encodeWithSelector(ICurvePool.get_rate_mul.selector));
        if (success && data.length >= 32) { // vyper could return redundant bytes
            return 2;
        }

        return 0;
    }
    function _getAmountIn(uint32 _ver, uint8 _decimalsFrom) private pure returns (uint256) {
        uint8 num = 4;
        if(_ver == 7 || _ver == 8 || _ver == 9) {
            num = 4;
        }
        if(_ver == 71 || _ver == 81 || _ver == 91) {
            num = 0;
        }
        if(_ver == 72 || _ver == 82 || _ver == 92) {
            num = 2;
        }
        if(_ver == 73 || _ver == 83 || _ver == 93) {
            num = 6;
        }
        if(_ver == 74 || _ver == 84 || _ver == 94) {
            num = 8;
        }
        if(_ver == 75 || _ver == 85 || _ver == 95) {
            num = 10;
        }
        uint256 amountIn = 10**(_decimalsFrom + num - 4);
        return amountIn;
    }

    function getRate(address tokenFrom, address tokenTo, address poolAddress, uint32 ver) external view returns (uint256 rate, uint8 decimalsFrom, uint8 decimalsTo) {
        // version = 2 : like Uniswap V2
        if(ver == 2 || ver == 22 || ver == 23) {
            address token0;
            address token1;
            uint256 reserve0;
            uint256 reserve1;
            // version = 2 : Uniswap V2 like
            if(ver == 2) {
                token0 = IUniswapV2Pair(poolAddress).token0();
                token1 = IUniswapV2Pair(poolAddress).token1();
                (reserve0, reserve1) = IUniswapV2Pair(poolAddress).getReserves(); 
            }
            // version = 22 : Meshswap
            else if(ver == 22) {
                token0 = IMeshswapPool(poolAddress).token0();
                token1 = IMeshswapPool(poolAddress).token1();
                reserve0 = IMeshswapPool(poolAddress).reserve0();
                reserve1 = IMeshswapPool(poolAddress).reserve1();
            }
            // version = 23 : Kyber swap
            else if(ver == 23) {
                token0 = IKyberDmmPool(poolAddress).token0();
                token1 = IKyberDmmPool(poolAddress).token1();
                (,, reserve0, reserve1,) = IKyberDmmPool(poolAddress).getTradeInfo();
            }
            if(token0 == tokenFrom) {
                decimalsFrom = IERC20Metadata(token0).decimals();
                decimalsTo = IERC20Metadata(token1).decimals();
                rate = reserve1.mul(1e18).div(reserve0);
            } else {
                decimalsFrom = IERC20Metadata(token1).decimals();
                decimalsTo = IERC20Metadata(token0).decimals();
                rate = reserve0.mul(1e18).div(reserve1);
            }
        }
        // version = 1 : Uniswap V1
        else if(ver == 1) {
            decimalsFrom = IERC20Metadata(tokenFrom).decimals();
            decimalsTo = 18;
            rate = IUniswapV1(poolAddress).getTokenToEthInputPrice(10**decimalsFrom);
        }
        // version = 3 : like Uniswap V3; Uniswap V4
        else if(ver == 3 || (ver > 30000 && ver < 40000) || ver == 31) {
            address token0;
            address token1;
            uint8 decimals0;
            uint8 decimals1;
            uint256 sqrtPriceX96;
            // ver = 3: for Uniswap V3, Sushiswap v3, Pancakeswap v3, Solidly v3
            if(ver == 3) {
                token0 = IUniswapV3Pool(poolAddress).token0();
                token1 = IUniswapV3Pool(poolAddress).token1();
                sqrtPriceX96 = IUniswapV3Pool(poolAddress).slot0();
            } 
            // ver = 30101~30104~30199: for Uniswap V4 with token0 = tokenFrom
            // ver = 30201~30204~30299: for Uniswap V4 with token0 = tokenTo
            // hooks ===> poolAddress
            else if(ver > 30000 && ver < 40000) {
                if(ver > 30100 && ver < 30200) {
                    token0 = tokenFrom;
                    token1 = tokenTo;
                } else if(ver > 30200 && ver < 30300) {
                    token0 = tokenTo;
                    token1 = tokenFrom;
                }
                address stateView = getStateView(block.chainid);
                (uint24 fee, int24 tickSpacing) = getFeeTier(ver);
                PoolKey memory poolKey = PoolKey(token0, token1, fee, tickSpacing, poolAddress);
                sqrtPriceX96 = IUniswapV4StateView(stateView).getSlot0(toId(poolKey));
            }
            // ver = 31: for iZiSwap izumi finance
            else if(ver == 31) {
                token0 = IiZiSwapPool(poolAddress).tokenX();
                token1 = IiZiSwapPool(poolAddress).tokenY();
                sqrtPriceX96 = IiZiSwapPool(poolAddress).state();
            }

            if(token0 == _ETH || token0 == _NULL) {
                decimals0 = 18;
            } else {
                decimals0 = IERC20Metadata(token0).decimals();
            }
            if(token1 == _ETH || token1 == _NULL) {
                decimals1 = 18;
            } else {
                decimals1 = IERC20Metadata(token1).decimals();
            }
            if(token0 == tokenFrom) {
                decimalsFrom = decimals0;
                decimalsTo = decimals1;
                rate = (((1e18 * sqrtPriceX96) >> 96) * sqrtPriceX96) >> 96;
            } else {
                decimalsFrom = decimals1;
                decimalsTo = decimals0;
                rate = (1e18 << 192) / sqrtPriceX96 / sqrtPriceX96;
            }
        } 
        // version = 4 : QuickSwap V3
        else if(ver == 4) {
            address token0 = IAlgebraPool(poolAddress).token0();
            address token1 = IAlgebraPool(poolAddress).token1();
            (uint256 sqrtPriceX96) = IAlgebraPool(poolAddress).globalState();
            if(token0 == tokenFrom) {
                decimalsFrom = IERC20Metadata(token0).decimals();
                decimalsTo = IERC20Metadata(token1).decimals();
                rate = (((1e18 * sqrtPriceX96) >> 96) * sqrtPriceX96) >> 96;
            } else {
                decimalsFrom = IERC20Metadata(token1).decimals();
                decimalsTo = IERC20Metadata(token0).decimals();
                rate = (1e18 << 192) / sqrtPriceX96 / sqrtPriceX96;
            }
        }
        // version = 611 : Cowswap BCoWPool: weighted pool
        else if(ver == 611) {
            uint256 balanceOfTokenFrom = IBCoWPool(poolAddress).getBalance(tokenFrom);
            uint256 balanceOfTokenTo = IBCoWPool(poolAddress).getBalance(tokenTo);
            uint256 weightFrom = IBCoWPool(poolAddress).getNormalizedWeight(tokenFrom);
            uint256 weightTo = IBCoWPool(poolAddress).getNormalizedWeight(tokenTo);
            balanceOfTokenFrom = balanceOfTokenFrom.mul(1e18).div(weightFrom);
            balanceOfTokenTo = balanceOfTokenTo.mul(1e18).div(weightTo);
            decimalsFrom = IERC20Metadata(tokenFrom).decimals();
            decimalsTo = IERC20Metadata(tokenTo).decimals();
            rate = balanceOfTokenTo.mul(1e18).div(balanceOfTokenFrom);
        }
        // version = 621 : balancer v2 weighted pool
        else if(ver == 621) {
            address vaultAddress = IWeightedPoolV2(poolAddress).getVault();
            bytes32 poolId = IWeightedPoolV2(poolAddress).getPoolId();
            (uint256[] memory weights) = IWeightedPoolV2(poolAddress).getNormalizedWeights();
            (address[] memory tokens, uint256[] memory balances,) = IVaultV2(vaultAddress).getPoolTokens(poolId);
            uint256 balanceOfTokenFrom = 0;
            uint256 balanceOfTokenTo = 0;
            for(uint8 i = 0; i < tokens.length; i++ ){
                if(tokens[i] == tokenFrom) {
                    balanceOfTokenFrom = balances[i].mul(1e18).div(weights[i]);
                }
                if(tokens[i] == tokenTo) {
                    balanceOfTokenTo = balances[i].mul(1e18).div(weights[i]);
                }
            }
            decimalsFrom = IERC20Metadata(tokenFrom).decimals();
            decimalsTo = IERC20Metadata(tokenTo).decimals();
            rate = balanceOfTokenTo.mul(1e18).div(balanceOfTokenFrom);
        }
        // version = 622 : balancer v2 stable pool
        else if(ver == 622) {
            uint256 rateFrom = IStablePoolV2(poolAddress).getTokenRate(tokenFrom);
            uint256 rateTo = IStablePoolV2(poolAddress).getTokenRate(tokenTo);
            rate = rateFrom.mul(1e18).div(rateTo);
            decimalsFrom = 18;
            decimalsTo = 18;
        }
        // version = 623 : balancer v2 Gyro E-CLP pool
        else if(ver == 623) {
            rate = IGyroECLPPoolV2(poolAddress).getPrice();
            address vaultAddress = IGyroECLPPoolV2(poolAddress).getVault();
            bytes32 poolId = IGyroECLPPoolV2(poolAddress).getPoolId();
            (address[] memory tokens, ,) = IVaultV2(vaultAddress).getPoolTokens(poolId);
            if(tokens[0] == tokenTo) {
                rate = (1e36) / rate;
            }
            decimalsFrom = 18;
            decimalsTo = 18;
        }
        // version = 631 : balancer v3 weighted pool
        else if(ver == 631) {
            address vaultAddress = IWeightedPoolV3(poolAddress).getVault();
            (uint256[] memory weights) = IWeightedPoolV3(poolAddress).getNormalizedWeights();
            (address[] memory tokens) = IVaultV3(vaultAddress).getPoolTokens(poolAddress);
            (uint256[] memory balances) = IVaultV3(vaultAddress).getCurrentLiveBalances(poolAddress);
            uint256 balanceOfTokenFrom = 0;
            uint256 balanceOfTokenTo = 0;
            for(uint8 i = 0; i < tokens.length; i++ ){
                if(tokens[i] == tokenFrom) {
                    balanceOfTokenFrom = balances[i].mul(1e18).div(weights[i]);
                }
                if(tokens[i] == tokenTo) {
                    balanceOfTokenTo = balances[i].mul(1e18).div(weights[i]);
                }
            }
            rate = balanceOfTokenTo.mul(1e18).div(balanceOfTokenFrom);
            decimalsFrom = 18;
            decimalsTo = 18;
        }
        // version = 632 : balancer v3 stable pool
        else if(ver == 632) {
            address vaultAddress = IStablePoolV3(poolAddress).getVault();
            (address[] memory tokens) = IVaultV3(vaultAddress).getPoolTokens(poolAddress);
            (, uint256[] memory tokenRates) = IVaultV3(vaultAddress).getPoolTokenRates(poolAddress); 
            uint256 rateFrom = 1;
            uint256 rateTo = 1;
            for(uint8 i = 0; i < tokens.length; i++ ) {
                if(tokenFrom == tokens[i]) {
                    rateFrom = tokenRates[i];
                }
                if(tokenTo == tokens[i]) {
                    rateTo = tokenRates[i];
                }
            }
            rate = rateFrom.mul(1e18).div(rateTo);
            decimalsFrom = 18;
            decimalsTo = 18;
        }
        // version = 633 : balancer v2 Gyro E-CLP pool
        else if(ver == 633) {
             address vaultAddress = IGyroECLPPoolV3(poolAddress).getVault();
            (address[] memory tokens) = IVaultV3(vaultAddress).getPoolTokens(poolAddress);
            (, uint256[] memory tokenRates) = IVaultV3(vaultAddress).getPoolTokenRates(poolAddress); 
            uint256 rateFrom = 1;
            uint256 rateTo = 1;
            for(uint8 i = 0; i < tokens.length; i++ ) {
                if(tokenFrom == tokens[i]) {
                    rateFrom = tokenRates[i];
                }
                if(tokenTo == tokens[i]) {
                    rateTo = tokenRates[i];
                }
            }
            rate = rateFrom.mul(1e18).div(rateTo);
            decimalsFrom = 18;
            decimalsTo = 18;
        }
        // version = 7 : Traderjoe V2.2 with sell = 1 
        // (ver=71 : sell=10^(-4)) 
        // (ver=72 : sell=10^(-2)) 
        // (ver=73 : sell=10^(2)) 
        // (ver=74 : sell=10^(4)) 
        // (ver=75 : sell=10^(6)) 
        else if(ver == 7 || ver == 71 || ver == 72 || ver == 73 || ver == 74 || ver == 75) {
            address token0 = ITraderjoeV2_2Pool(poolAddress).getTokenX();
            address token1 = ITraderjoeV2_2Pool(poolAddress).getTokenY();

            if(tokenFrom == token0) {
                decimalsFrom = IERC20Metadata(token0).decimals();
                decimalsTo = IERC20Metadata(token1).decimals();
                uint128 amountIn = uint128(_getAmountIn(ver, decimalsFrom));
                (, uint128 amountOut, ) = ITraderjoeV2_2Pool(poolAddress).getSwapOut(amountIn, true);
                rate = amountOut.mul(1e18).div(amountIn);
            } else {
                decimalsFrom = IERC20Metadata(token1).decimals();
                decimalsTo = IERC20Metadata(token0).decimals();
                uint128 amountIn = uint128(_getAmountIn(ver, decimalsFrom));
                (, uint128 amountOut, ) = ITraderjoeV2_2Pool(poolAddress).getSwapOut(amountIn, false);
                rate = amountOut.mul(1e18).div(amountIn);
            }
        }
        // version = 8 : Curve CryptoSwap, StableSwap, StableSwapMeta sell = 1 
        // (ver=81 : sell=10^(-4)) 
        // (ver=82 : sell=10^(-2)) 
        // (ver=83 : sell=10^(2)) 
        // (ver=84 : sell=10^(4)) 
        // (ver=85 : sell=10^(6)) 
        else if(ver == 8 || ver == 81 || ver == 82 || ver == 83 || ver == 84 || ver == 85) {
            ICurveProvider curveProvider;
            address curveAddressProvider = getCurveAddressProvider(block.chainid);
            curveProvider = ICurveProvider(curveAddressProvider);
            ICurveMetaregistry curveMetaregistry = ICurveMetaregistry(curveProvider.get_address(7));
            int128 i;
            int128 j;
            bool isUnderlying = false;
            (i, j, isUnderlying) = curveMetaregistry.get_coin_indices(poolAddress, tokenFrom, tokenTo);
            uint8 poolType = _getCurvePoolType(poolAddress);
            bytes4 selector;
            if (poolType == 0 && isUnderlying) {
                selector = ICurveStableSwapMeta.get_dy_underlying.selector;
            } else if (poolType == 0 && !isUnderlying) {
                selector = ICurveStableSwap.get_dy.selector;
            } else {
                selector = ICurveCryptoSwap.get_dy.selector;
            }
            
            if(tokenFrom == _ETH) {
                decimalsFrom = 18;
            } else {
                decimalsFrom = IERC20Metadata(tokenFrom).decimals();
            }
            if(tokenTo == _ETH) {
                decimalsTo = 18;
            } else {
                decimalsTo = IERC20Metadata(tokenTo).decimals();
            }
            uint256 amountIn = _getAmountIn(ver, decimalsFrom);
            
            (bool success, bytes memory data) = poolAddress.staticcall(abi.encodeWithSelector(selector, uint128(i), uint128(j), amountIn));
            if (success && data.length >= 32) { // vyper could return redundant bytes
                uint256 amountOut = abi.decode(data, (uint256));
                if (amountOut > 0) {
                    //rate = amountOut * 1e18 / amountIn;
                    rate = amountOut.mul(1e18).div(amountIn);
                }
            }
        }
        // version = 9 : Dodoex v2 DVM & DSP with sell = 1 
        // (ver=91 : sell=10^(-4)) 
        // (ver=92 : sell=10^(-2)) 
        // (ver=93 : sell=10^(2)) 
        // (ver=94 : sell=10^(4)) 
        // (ver=95 : sell=10^(6)) 
        else if(ver == 9 || ver == 91 || ver == 92 || ver == 93 || ver == 94 || ver == 95) {
            address token0 = IDodoDVM(poolAddress)._BASE_TOKEN_();
            address token1 = IDodoDVM(poolAddress)._QUOTE_TOKEN_();

            if(tokenFrom == token0) {
                decimalsFrom = IERC20Metadata(token0).decimals();
                decimalsTo = IERC20Metadata(token1).decimals();
                uint256 amountIn = _getAmountIn(ver, decimalsFrom);
                (uint256 receiveQuoteAmount, ) = IDodoDVM(poolAddress).querySellBase(0xD692C31E5ec0d87D032ABC243c1eb2C9Ae204FeA, amountIn);
                rate = receiveQuoteAmount.mul(1e18).div(amountIn);
            } else {
                decimalsFrom = IERC20Metadata(token1).decimals();
                decimalsTo = IERC20Metadata(token0).decimals();
                uint256 amountIn = _getAmountIn(ver, decimalsFrom);
                (uint256 receiveBaseAmount, ) = IDodoDVM(poolAddress).querySellQuote(0xD692C31E5ec0d87D032ABC243c1eb2C9Ae204FeA, amountIn);
                rate = receiveBaseAmount.mul(1e18).div(amountIn);
            }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getCurveAddressProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"ver","type":"uint32"}],"name":"getFeeTier","outputs":[{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint32","name":"ver","type":"uint32"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint8","name":"decimalsFrom","type":"uint8"},{"internalType":"uint8","name":"decimalsTo","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getStateView","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"curveAddressProvider","type":"address"}],"name":"updateCurveAddressProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"ver","type":"uint32"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"}],"name":"updateFeeTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"stateView","type":"address"}],"name":"updateStateView","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f80fd5b507fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d8054737ffe42c4a5deea5b0fec41c94c136cf1155972276001600160a01b0319918216179091557f130e7a9555e59f2848b31c1782763e19b7a6b507f6deb72e7f4c13b21a12052580547386e8631a016f9068c3f085faf484ee3f5fdee8f29083161790557f3e9abaca0aad9ede81f4474766c846d8539f70688e1c8f521bbe1597874e3dc4805473c18a3169788f4f75a170290584eca6395c75ecdb9083161790557f22a98197600ae2960822976fafee2963422cbfd9d3be331a5f63275bc824b2ab805473a3c0c9b65bad0b08107aa264b0f3db444b867a719083161790557faf53aac3c4613282336edb809001bb3c8f8a5f4f8bef81faa04ce7c3b152209c80547376fd297e2d437cd7f76d50f01afe6160f86e999090831681179091557f8839e33ea8bc27e2dca8c9b90c78bcf651bd5273f6d53154cb494f42572e41d88054735ea1bd7974c8a611cbab0bdcafcb1d9cc9b3ba5a9084161790557ff7e7c0a746a78c0fe3cea53c1ba4c775bb8c78e19e977ecbb20adcb8085e07e180547312a88ae16f46dce4e8b15368008ab3380885df309084161790557f3248a30fe9255391438607895eb422b995ebb0a5ccb4607b591bacd65918b7da805473385785af07d63b50d0a0ea57c4ff89d06adf73289084161790557f4115ab6dee63da78950ac0a3ed6bebb017d9a5fc2e00608c82a3571125cfc38f80547351d394718bc09297262e368c1a481217fdeb71eb9084161790557fd503026ad3d022822d0de4fe5209650a97d89c2d55d0b2c6fc7bc4db07e7658780548316821790557f881bf1870b5008518831f5a2ccff0aa38a63fdfe6b9dc0f0762b126723dd4c8d8054831690911790557fe55429d6356a3a3d1deee6146037258f56a07c4928905a1a2d4106b29881558c805473c3c9e198c735a4b97e3e683f391ccbdd60b692869083161790557f463154dffd5ddce82baa6ddaa825ffda4b4cc1dd8abd5af72f421c487b1335db805473d13dd3d6e93f276fafc9db9e6bb47c1180aee0c4908316179055604080518082018252610bb8808252603c60208084018281526175955f908152600180845295517f62cdd21b5a8f8781ff74a3f7b7614bb0f7f00c9e76e6f70194cb84d5ae9f42888054935162ffffff92831665ffffffffffff199586161763010000009184168202179091558851808a018a5261271080825260c882880181815261759687528b895292517f475ad9fca92ded63fd0323eaf58c1e2a74423baf7b8ad4e4e15efe1fe82f4bec80549451918716948916949094179086168502179092558a51808c018c526101f4808252600a828a0181815261759789528d8b5292517f0b04fbb1af7005f274a47a45604e23b838fcae83435c07c2791c1f9ebb184a0280549451918916948b16949094179088168702179092558c51808e018e526064808252818b018e81526175988a528e8c5291517ff644cd33ee00eb6310102d00f6af92e5dc19cc3a48966b7124df70a2427721eb80549351918a16938c16939093179089168802179091558d51808f018f529b8c528b8a019a8b526175f988528c8a529a517fbafc65e8d858566db8760fd7cab528affe2677b9b7d19293ed3425bf0821a7d080549b519188169b8a169b909b179087168602179099558b51808d018d529182528188019283526175fa86528a885290517f6837c0bf2511810f156601de68462714195adcb3d9476e45a83edc52deb7120e80549351918616938816939093179085168402179091558951808b018b529687528686019081526175fb845288865295517f457c2a27d311945e7e891df639c1e2851ccc88c7c0198c9f2c9b152a219b343b805497519184169786169790971790831682021790955587518089019098529487528683018681526175fc825295835295517f178a6db0a084b186a8008f19be580ffaac18753268a31bb75e8e663abfa40de280549651918616969092169590951794909316909102929092179055600290527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e08054735ffe7fb82894076ecb99a30d6a32e969e6e35e9890841681179091557f5fa80452b166d50ac062987ccf92fbd09d4d791a0828f45943bd937cb4ec508580548416821790557fc5b020490d63ea06a1647afd65590198e150497dc1ed006db4ba6d8397ca65b780548416821790557f3f06966e66c0f44a3add9bdf355d4fd8e6c39fe649026d2546d3ff630c014a8880548416821790557fb45a023a5b47e335be59bc3f73b9ac8b4a6ac7edfab69af24a46b6a6673560f480548416821790557f7235287a5cb1908d23369905908658187d8d258d18d7ad15bcb288795998bcba80548416821790557f0f23ec5052111a8a0eadc27c4d6cc2348d4d0a71f49648fc1662829afcb426dd80548416821790557fc679bdd578cad15ad3758f4ffcb92f8921cd43d978bd1eb8ecb044c82044f14d805473d2002373543ce3527023c75e7518c274a51ce7129085161790557fed9769bad6a90121249ec01d8a2dec3045b01cf972e90d34c49159495d947b7f8054734574921eb950d3fd5b01562162ec566cb8bc364890851681179091557f2246e3a745c1df3cc2a1c7eecb7d02c255de440492ab220c839a47c0ff0ff61f80548516831790557fdfdee7db5cebd46e0cb2df537c27fe171d4d27da7372573af885790ab2da818180548516831790557f7673bcbb3401a7cbae68f81d40eea2cf35afdaf7ecd016ebf3f02857fcc1260a80548516831790557fb4c8a47455e1a045cb1b6ee58110c8d95008aab5dfd1854d3951c2768f7e7e118054731764ee18e8b3cca4787249ceb2493561925945859086161790557fa042e2519e304776163c8ca402fffe2f08c6e343adedcb5269282327576fe7d1805473604388bb1159afd21eb5191ce22b4decdee2ae229086161790557f37af46f176b6db0f729635f8ec0ab540e9f75a3e00e03b3f14229631ed87c0e480548516831790557fa6dcbcc95096a68253fb092c26da6e28b45359542bab867ddd6e973dcabc573280548516831790557fd3604db978f6137b0d18816b77b2ce810487a3af08a922e0b184963be5f3adfc80548516831790557f38c3faadcf13bb8e56427c1c0039c11954d0b9d28778d1ba34a4404dae0363da8054851690911790557f54c0b5710c7d90212e1378fbb66df17d35dcc7bf2cd9a927d54df6e4034931d4805473907ce289e9ee0bbcb0f69132b1c28a9affc29fca90851681179091557f0cb0be258cd4e0f89ef5514ec447dd8846b0cf865c7d0d8ea82ff58a1eae81a180548516831790557f21a49d52f151ab5234e739e2ae44ac8acddc80c46b3fc5f0ffb16efc79d8d48080547387fe17697d0f14a222e8bef386a0860ecffdd61790861681179091557f853661dc8a7981caf0e08873c7579d7536e09113007b9ad31b15539247145e2d80548616831790557f941374451e06c5fd6750c9f7cc00c6533581947dfb566af4043d864e842fbb1a8054861690911790557f0bb06b8300aa2d85f466f25052d659d856f6e200b8a4bd8c426026e46494ea56805485169092179091557f6d00efa09a7071d855bc5fb7d93921fbf02f2c4e3992802f2a9b08050cf48ea880548416909117905561014481527f17793c19dcf272a744740fd34bb7ca531de0c52fa1bb65a0191e5dcb5ffc273f80547354a5a69e17aa6eb89d77aa3828e38c9eb4ff263d931692909217909155613b81908190610ad090395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c8063348967ff11610058578063348967ff1461017d578063374aa8ac146101af578063996186ab146101ef578063abf6712a14610217575f80fd5b80630c92f2f41461007e5780631653dc52146100d857806326c3cb4614610115575b5f80fd5b6100b561008c366004613425565b63ffffffff165f9081526001602052604090205462ffffff811691630100000090910460020b90565b6040805162ffffff909316835260029190910b6020830152015b60405180910390f35b6101136100e6366004613455565b5f9182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b005b610113610123366004613483565b60408051808201825262ffffff938416815260029290920b602080840191825263ffffffff9095165f90815260019095529320905181549351831663010000000265ffffffffffff19909416921691909117919091179055565b61019061018b3660046134d6565b610252565b6040805193845260ff92831660208501529116908201526060016100cf565b6101d76101bd36600461352d565b5f908152602081905260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016100cf565b6101d76101fd36600461352d565b5f908152600260205260409020546001600160a01b031690565b610113610225366004613455565b5f9182526020829052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f805f8363ffffffff166002148061027057508363ffffffff166016145b8061028157508363ffffffff166017145b156108a9575f805f808763ffffffff166002036103d057886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f89190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610336573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035a9190613544565b9250886001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015610397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bb9190613575565b6001600160701b0391821693501690506106c3565b8763ffffffff1660160361057d57886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561041a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043e9190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561047c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a09190613544565b9250886001600160a01b031663443cb4bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050291906135a6565b6001600160701b03169150886001600160a01b0316635a76f25e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056d91906135a6565b6001600160701b031690506106c3565b8763ffffffff166017036106c357886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105eb9190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610629573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064d9190613544565b9250886001600160a01b031663d66940276040518163ffffffff1660e01b815260040160a060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af91906135bf565b506001600160701b03918216955016925050505b8a6001600160a01b0316846001600160a01b0316036107c357836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c9190613619565b9550826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079e9190613619565b94506107bc826107b683670de0b6b3a7640000612ffa565b90613086565b96506108a0565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190613619565b9550836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108859190613619565b945061089d816107b684670de0b6b3a7640000612ffa565b96505b50505050612ff0565b8363ffffffff1660010361099b57866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109179190613619565b9150601290506001600160a01b0385166395b68fe761093784600a61372d565b6040518263ffffffff1660e01b815260040161095591815260200190565b602060405180830381865afa158015610970573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610994919061373b565b9250612ff0565b8363ffffffff16600314806109c957506175308463ffffffff161180156109c95750619c408463ffffffff16105b806109da57508363ffffffff16601f145b15610f93575f805f805f8863ffffffff16600303610b2657896001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a529190613544565b9450896001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab49190613544565b9350896001600160a01b0316633850c7bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b169190613544565b6001600160a01b03169050610dce565b6175308963ffffffff16118015610b445750619c408963ffffffff16105b15610c90576175948963ffffffff16118015610b6757506175f88963ffffffff16105b15610b77578b94508a9350610ba1565b6175f88963ffffffff16118015610b95575061765c8963ffffffff16105b15610ba1578a94508b93505b465f908152602081815260408083205463ffffffff8d168452600183529281902054815160a0810183526001600160a01b038a811682528981169482019490945262ffffff8216928101839052630100000090910460020b606082018190528e8416608083015292909316929091908363c815641c610c1f836130e0565b6040518263ffffffff1660e01b8152600401610c3d91815260200190565b602060405180830381865afa158015610c58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613544565b6001600160a01b0316945050505050610dce565b8863ffffffff16601f03610dce57896001600160a01b03166316dc165b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cfe9190613544565b9450896001600160a01b031663b7d19fc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d609190613544565b9350896001600160a01b031663c19d93fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc29190613544565b6001600160a01b031690505b6001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480610e0057506001600160a01b038516155b15610e0e5760129250610e71565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190613619565b92505b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480610ea357506001600160a01b038416155b15610eb15760129150610f14565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f119190613619565b91505b8b6001600160a01b0316856001600160a01b031603610f6057829650819550606081606083670de0b6b3a7640000610f4c9190613752565b610f5792911c613752565b901c9750610f89565b81965082955080816503782dace9d960d21b610f7c9190613769565b610f869190613769565b97505b5050505050612ff0565b8363ffffffff166004036112c7575f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110029190613544565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611041573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110659190613544565b90505f876001600160a01b031663e76c01e46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c89190613544565b6001600160a01b03169050896001600160a01b0316836001600160a01b0316036111da57826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114c9190613619565b9450816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ae9190613619565b9350606081816111c682670de0b6b3a7640000613752565b6111d192911c613752565b901c95506112bf565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611216573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a9190613619565b9450826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c9190613619565b9350806112b2816503782dace9d960d21b613769565b6112bc9190613769565b95505b505050612ff0565b8363ffffffff16610263036115945760405163f8b2cb4f60e01b81526001600160a01b0388811660048301525f919087169063f8b2cb4f90602401602060405180830381865afa15801561131d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611341919061373b565b60405163f8b2cb4f60e01b81526001600160a01b0389811660048301529192505f9188169063f8b2cb4f90602401602060405180830381865afa15801561138a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ae919061373b565b60405163f1b8a9b760e01b81526001600160a01b038b811660048301529192505f9189169063f1b8a9b790602401602060405180830381865afa1580156113f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141b919061373b565b60405163f1b8a9b760e01b81526001600160a01b038b811660048301529192505f918a169063f1b8a9b790602401602060405180830381865afa158015611464573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611488919061373b565b90506114a0826107b686670de0b6b3a7640000612ffa565b93506114b8816107b685670de0b6b3a7640000612ffa565b92508a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151a9190613619565b9550896001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611558573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157c9190613619565b945061089d846107b685670de0b6b3a7640000612ffa565b8363ffffffff1661026d0361192e575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116049190613544565b90505f866001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611667919061373b565b90505f876001600160a01b031663f89f27ed6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116a5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116cc919081019061385c565b90505f80846001600160a01b031663f94d4668856040518263ffffffff1660e01b81526004016116fe91815260200190565b5f60405180830381865afa158015611718573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261173f91908101906138fb565b50915091505f805f5b84518160ff161015611845578e6001600160a01b0316858260ff168151811061177357611773613963565b60200260200101516001600160a01b0316036117e3576117e0868260ff16815181106117a1576117a1613963565b60200260200101516107b6670de0b6b3a7640000878560ff16815181106117ca576117ca613963565b6020026020010151612ffa90919063ffffffff16565b92505b8d6001600160a01b0316858260ff168151811061180257611802613963565b60200260200101516001600160a01b03160361183357611830868260ff16815181106117a1576117a1613963565b91505b8061183d81613977565b915050611748565b508d6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611882573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a69190613619565b98508c6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119089190613619565b9750611920826107b683670de0b6b3a7640000612ffa565b995050505050505050612ff0565b8363ffffffff1661026e03611a3e57604051632a6f500560e11b81526001600160a01b0388811660048301525f91908716906354dea00a90602401602060405180830381865afa158015611984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a8919061373b565b604051632a6f500560e11b81526001600160a01b0389811660048301529192505f918816906354dea00a90602401602060405180830381865afa1580156119f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a15919061373b565b9050611a2d816107b684670de0b6b3a7640000612ffa565b945060129350601292505050612ff0565b8363ffffffff1661026f03611c4357846001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aad919061373b565b92505f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b109190613544565b90505f866001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b73919061373b565b604051631f29a8cd60e31b8152600481018290529091505f906001600160a01b0384169063f94d4668906024015f60405180830381865afa158015611bba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611be191908101906138fb565b50509050886001600160a01b0316815f81518110611c0157611c01613963565b60200260200101516001600160a01b031603611c3357611c30866ec097ce7bc90715b34b9f1000000000613769565b95505b6012945060129350505050612ff0565b8363ffffffff1661027703611ee6575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb39190613544565b90505f866001600160a01b031663f89f27ed6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d18919081019061385c565b60405163ca4f280360e01b81526001600160a01b0389811660048301529192505f9184169063ca4f2803906024015f60405180830381865afa158015611d60573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d879190810190613995565b6040516329ae7ec560e11b81526001600160a01b038a811660048301529192505f9185169063535cfd8a906024015f60405180830381865afa158015611dcf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611df6919081019061385c565b90505f805f5b84518160ff161015611eba578d6001600160a01b0316858260ff1681518110611e2757611e27613963565b60200260200101516001600160a01b031603611e5857611e55868260ff16815181106117a1576117a1613963565b92505b8c6001600160a01b0316858260ff1681518110611e7757611e77613963565b60200260200101516001600160a01b031603611ea857611ea5868260ff16815181106117a1576117a1613963565b91505b80611eb281613977565b915050611dfc565b50611ed1826107b683670de0b6b3a7640000612ffa565b98506012975060129650505050505050612ff0565b8363ffffffff1661027803612130575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f569190613544565b60405163ca4f280360e01b81526001600160a01b0388811660048301529192505f9183169063ca4f2803906024015f60405180830381865afa158015611f9e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc59190810190613995565b604051633f1b0def60e11b81526001600160a01b0389811660048301529192505f91841690637e361bde906024015f60405180830381865afa15801561200d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261203491908101906139c7565b915060019050805f5b84518160ff16101561210557848160ff168151811061205e5761205e613963565b60200260200101516001600160a01b03168d6001600160a01b03160361209e57838160ff168151811061209357612093613963565b602002602001015192505b848160ff16815181106120b3576120b3613963565b60200260200101516001600160a01b03168c6001600160a01b0316036120f357838160ff16815181106120e8576120e8613963565b602002602001015191505b806120fd81613977565b91505061203d565b5061211c816107b684670de0b6b3a7640000612ffa565b975060129650601295505050505050612ff0565b8363ffffffff166102790361234f575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a09190613544565b60405163ca4f280360e01b81526001600160a01b0388811660048301529192505f9183169063ca4f2803906024015f60405180830381865afa1580156121e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261220f9190810190613995565b604051633f1b0def60e11b81526001600160a01b0389811660048301529192505f91841690637e361bde906024015f60405180830381865afa158015612257573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261227e91908101906139c7565b915060019050805f5b84518160ff16101561210557848160ff16815181106122a8576122a8613963565b60200260200101516001600160a01b03168d6001600160a01b0316036122e857838160ff16815181106122dd576122dd613963565b602002602001015192505b848160ff16815181106122fd576122fd613963565b60200260200101516001600160a01b03168c6001600160a01b03160361233d57838160ff168151811061233257612332613963565b602002602001015191505b8061234781613977565b915050612287565b8363ffffffff166007148061236a57508363ffffffff166047145b8061237b57508363ffffffff166048145b8061238c57508363ffffffff166049145b8061239d57508363ffffffff16604a145b806123ae57508363ffffffff16604b145b1561279f575f856001600160a01b03166305e8746d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124149190613544565b90505f866001600160a01b031663da10610c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612453573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124779190613544565b9050816001600160a01b0316896001600160a01b03160361261a57816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f29190613619565b9350806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612530573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125549190613619565b92505f6125618786613155565b604051631cee6cdf60e31b81526001600160801b0382166004820152600160248201529091505f906001600160a01b038a169063e77366f890604401606060405180830381865afa1580156125b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125dc9190613a3d565b50915050612611826001600160801b03166107b6670de0b6b3a7640000846001600160801b0316612ffa90919063ffffffff16565b96505050612798565b806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267a9190613619565b9350816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126dc9190613619565b92505f6126e98786613155565b604051631cee6cdf60e31b81526001600160801b03821660048201525f602482018190529192506001600160a01b038a169063e77366f890604401606060405180830381865afa15801561273f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127639190613a3d565b5091505061089d826001600160801b03166107b6670de0b6b3a7640000846001600160801b0316612ffa90919063ffffffff16565b5050612ff0565b8363ffffffff16600814806127ba57508363ffffffff166051145b806127cb57508363ffffffff166052145b806127dc57508363ffffffff166053145b806127ed57508363ffffffff166054145b806127fe57508363ffffffff166055145b15612bc257465f9081526002602052604081205481906001600160a01b031660405163124fd3dd60e21b8152600760048201529092508291505f906001600160a01b0383169063493f4f7490602401602060405180830381865afa158015612868573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288c9190613544565b60405163eb85226d60e01b81526001600160a01b038a811660048301528c811660248301528b811660448301529192505f918291829185169063eb85226d90606401606060405180830381865afa1580156128e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290d9190613a8e565b919450925090505f61291e8c6132c0565b90505f60ff821615801561292f5750825b1561294257506307211ef760e01b61296e565b60ff8216158015612951575082155b156129645750635e0d443f60e01b61296e565b5063556d6e9f60e01b5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168f6001600160a01b0316036129a45760129950612a07565b8e6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a049190613619565b99505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038f1601612a355760129850612a98565b8d6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a959190613619565b98505b5f612aa38d8c613155565b90505f808f6001600160a01b031684898986604051602401612ae6939291906001600160801b039384168152919092166020820152604081019190915260600190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b249190613acb565b5f60405180830381855afa9150503d805f8114612b5c576040519150601f19603f3d011682016040523d82523d5f602084013e612b61565b606091505b5091509150818015612b7557506020815110155b15612bb2575f81806020019051810190612b8f919061373b565b90508015612bb057612bad846107b683670de0b6b3a7640000612ffa565b9e505b505b5050505050505050505050612ff0565b8363ffffffff1660091480612bdd57508363ffffffff16605b145b80612bee57508363ffffffff16605c145b80612bff57508363ffffffff16605d145b80612c1057508363ffffffff16605e145b80612c2157508363ffffffff16605f145b15612ff0575f856001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c879190613544565b90505f866001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cea9190613544565b9050816001600160a01b0316896001600160a01b031603612e7b57816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d659190613619565b9350806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc79190613619565b92505f612dd48786613155565b604051633cd0243b60e11b815273d692c31e5ec0d87d032abc243c1eb2c9ae204fea6004820152602481018290529091505f906001600160a01b038a16906379a04876906044016040805180830381865afa158015612e35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e599190613af7565b509050612e72826107b683670de0b6b3a7640000612ffa565b96505050612fed565b806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edb9190613619565b9350816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3d9190613619565b92505f612f4a8786613155565b6040516366410a2160e01b815273d692c31e5ec0d87d032abc243c1eb2c9ae204fea6004820152602481018290529091505f906001600160a01b038a16906366410a21906044016040805180830381865afa158015612fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fcf9190613af7565b509050612fe8826107b683670de0b6b3a7640000612ffa565b965050505b50505b9450945094915050565b5f825f0361300957505f613080565b5f6130148385613752565b9050826130218583613769565b1461307d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b5f8082116130d65760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401613074565b61307d8284613769565b5f81604051602001613138919081516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b90830152608092830151169181019190915260a00190565b604051602081830303815290604052805190602001209050919050565b5f6004600763ffffffff8516148061317357508363ffffffff166008145b8061318457508363ffffffff166009145b1561318d575060045b8363ffffffff16604714806131a857508363ffffffff166051145b806131b957508363ffffffff16605b145b156131c157505f5b8363ffffffff16604814806131dc57508363ffffffff166052145b806131ed57508363ffffffff16605c145b156131f6575060025b8363ffffffff166049148061321157508363ffffffff166053145b8061322257508363ffffffff16605d145b1561322b575060065b8363ffffffff16604a148061324657508363ffffffff166054145b8061325757508363ffffffff16605e145b15613260575060085b8363ffffffff16604b148061327b57508363ffffffff166055145b8061328c57508363ffffffff16605f145b156132955750600a5b5f60046132a28386613b19565b6132ac9190613b32565b6132b790600a61372d565b95945050505050565b60408051600481526024810182526020810180516001600160e01b03166349fe9e7760e01b17905290515f91829182916001600160a01b038616916133059190613acb565b5f60405180830381855afa9150503d805f811461333d576040519150601f19603f3d011682016040523d82523d5f602084013e613342565b606091505b509150915081801561335657506020815110155b15613365575060019392505050565b60408051600481526024810182526020810180516001600160e01b03166304ad07e360e11b17905290516001600160a01b038616916133a391613acb565b5f60405180830381855afa9150503d805f81146133db576040519150601f19603f3d011682016040523d82523d5f602084013e6133e0565b606091505b5090925090508180156133f557506020815110155b15613404575060029392505050565b505f9392505050565b803563ffffffff81168114613420575f80fd5b919050565b5f60208284031215613435575f80fd5b61307d8261340d565b6001600160a01b0381168114613452575f80fd5b50565b5f8060408385031215613466575f80fd5b8235915060208301356134788161343e565b809150509250929050565b5f805f60608486031215613495575f80fd5b61349e8461340d565b9250602084013562ffffff811681146134b5575f80fd5b91506040840135600281900b81146134cb575f80fd5b809150509250925092565b5f805f80608085870312156134e9575f80fd5b84356134f48161343e565b935060208501356135048161343e565b925060408501356135148161343e565b91506135226060860161340d565b905092959194509250565b5f6020828403121561353d575f80fd5b5035919050565b5f60208284031215613554575f80fd5b815161307d8161343e565b80516001600160701b0381168114613420575f80fd5b5f8060408385031215613586575f80fd5b61358f8361355f565b915061359d6020840161355f565b90509250929050565b5f602082840312156135b6575f80fd5b61307d8261355f565b5f805f805f60a086880312156135d3575f80fd5b6135dc8661355f565b94506135ea6020870161355f565b93506135f86040870161355f565b92506136066060870161355f565b9150608086015190509295509295909350565b5f60208284031215613629575f80fd5b815160ff8116811461307d575f80fd5b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561368757815f190482111561366d5761366d613639565b8085161561367a57918102915b93841c9390800290613652565b509250929050565b5f8261369d57506001613080565b816136a957505f613080565b81600181146136bf57600281146136c9576136e5565b6001915050613080565b60ff8411156136da576136da613639565b50506001821b613080565b5060208310610133831016604e8410600b8410161715613708575081810a613080565b613712838361364d565b805f190482111561372557613725613639565b029392505050565b5f61307d60ff84168361368f565b5f6020828403121561374b575f80fd5b5051919050565b808202811582820484141761308057613080613639565b5f8261378357634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137c5576137c5613788565b604052919050565b5f67ffffffffffffffff8211156137e6576137e6613788565b5060051b60200190565b5f82601f8301126137ff575f80fd5b8151602061381461380f836137cd565b61379c565b8083825260208201915060208460051b870101935086841115613835575f80fd5b602086015b84811015613851578051835291830191830161383a565b509695505050505050565b5f6020828403121561386c575f80fd5b815167ffffffffffffffff811115613882575f80fd5b61388e848285016137f0565b949350505050565b5f82601f8301126138a5575f80fd5b815160206138b561380f836137cd565b8083825260208201915060208460051b8701019350868411156138d6575f80fd5b602086015b848110156138515780516138ee8161343e565b83529183019183016138db565b5f805f6060848603121561390d575f80fd5b835167ffffffffffffffff80821115613924575f80fd5b61393087838801613896565b94506020860151915080821115613945575f80fd5b50613952868287016137f0565b925050604084015190509250925092565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff810361398c5761398c613639565b60010192915050565b5f602082840312156139a5575f80fd5b815167ffffffffffffffff8111156139bb575f80fd5b61388e84828501613896565b5f80604083850312156139d8575f80fd5b825167ffffffffffffffff808211156139ef575f80fd5b6139fb868387016137f0565b93506020850151915080821115613a10575f80fd5b50613a1d858286016137f0565b9150509250929050565b80516001600160801b0381168114613420575f80fd5b5f805f60608486031215613a4f575f80fd5b613a5884613a27565b9250613a6660208501613a27565b9150613a7460408501613a27565b90509250925092565b8051600f81900b8114613420575f80fd5b5f805f60608486031215613aa0575f80fd5b613aa984613a7d565b9250613ab760208501613a7d565b9150604084015180151581146134cb575f80fd5b5f82515f5b81811015613aea5760208186018101518583015201613ad0565b505f920191825250919050565b5f8060408385031215613b08575f80fd5b505080516020909101519092909150565b60ff818116838216019081111561308057613080613639565b60ff82811682821603908111156130805761308061363956fea26469706673582212204a952d92e9a268236e90d8f2d6ab23473ef99a632d9d2856ba22b5ac6c1e2e7364736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c8063348967ff11610058578063348967ff1461017d578063374aa8ac146101af578063996186ab146101ef578063abf6712a14610217575f80fd5b80630c92f2f41461007e5780631653dc52146100d857806326c3cb4614610115575b5f80fd5b6100b561008c366004613425565b63ffffffff165f9081526001602052604090205462ffffff811691630100000090910460020b90565b6040805162ffffff909316835260029190910b6020830152015b60405180910390f35b6101136100e6366004613455565b5f9182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b005b610113610123366004613483565b60408051808201825262ffffff938416815260029290920b602080840191825263ffffffff9095165f90815260019095529320905181549351831663010000000265ffffffffffff19909416921691909117919091179055565b61019061018b3660046134d6565b610252565b6040805193845260ff92831660208501529116908201526060016100cf565b6101d76101bd36600461352d565b5f908152602081905260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016100cf565b6101d76101fd36600461352d565b5f908152600260205260409020546001600160a01b031690565b610113610225366004613455565b5f9182526020829052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f805f8363ffffffff166002148061027057508363ffffffff166016145b8061028157508363ffffffff166017145b156108a9575f805f808763ffffffff166002036103d057886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f89190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610336573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035a9190613544565b9250886001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015610397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103bb9190613575565b6001600160701b0391821693501690506106c3565b8763ffffffff1660160361057d57886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561041a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043e9190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561047c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a09190613544565b9250886001600160a01b031663443cb4bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050291906135a6565b6001600160701b03169150886001600160a01b0316635a76f25e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056d91906135a6565b6001600160701b031690506106c3565b8763ffffffff166017036106c357886001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105eb9190613544565b9350886001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610629573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064d9190613544565b9250886001600160a01b031663d66940276040518163ffffffff1660e01b815260040160a060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af91906135bf565b506001600160701b03918216955016925050505b8a6001600160a01b0316846001600160a01b0316036107c357836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c9190613619565b9550826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079e9190613619565b94506107bc826107b683670de0b6b3a7640000612ffa565b90613086565b96506108a0565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190613619565b9550836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108859190613619565b945061089d816107b684670de0b6b3a7640000612ffa565b96505b50505050612ff0565b8363ffffffff1660010361099b57866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109179190613619565b9150601290506001600160a01b0385166395b68fe761093784600a61372d565b6040518263ffffffff1660e01b815260040161095591815260200190565b602060405180830381865afa158015610970573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610994919061373b565b9250612ff0565b8363ffffffff16600314806109c957506175308463ffffffff161180156109c95750619c408463ffffffff16105b806109da57508363ffffffff16601f145b15610f93575f805f805f8863ffffffff16600303610b2657896001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a529190613544565b9450896001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab49190613544565b9350896001600160a01b0316633850c7bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b169190613544565b6001600160a01b03169050610dce565b6175308963ffffffff16118015610b445750619c408963ffffffff16105b15610c90576175948963ffffffff16118015610b6757506175f88963ffffffff16105b15610b77578b94508a9350610ba1565b6175f88963ffffffff16118015610b95575061765c8963ffffffff16105b15610ba1578a94508b93505b465f908152602081815260408083205463ffffffff8d168452600183529281902054815160a0810183526001600160a01b038a811682528981169482019490945262ffffff8216928101839052630100000090910460020b606082018190528e8416608083015292909316929091908363c815641c610c1f836130e0565b6040518263ffffffff1660e01b8152600401610c3d91815260200190565b602060405180830381865afa158015610c58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7c9190613544565b6001600160a01b0316945050505050610dce565b8863ffffffff16601f03610dce57896001600160a01b03166316dc165b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cfe9190613544565b9450896001600160a01b031663b7d19fc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d609190613544565b9350896001600160a01b031663c19d93fb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc29190613544565b6001600160a01b031690505b6001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480610e0057506001600160a01b038516155b15610e0e5760129250610e71565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190613619565b92505b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1480610ea357506001600160a01b038416155b15610eb15760129150610f14565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f119190613619565b91505b8b6001600160a01b0316856001600160a01b031603610f6057829650819550606081606083670de0b6b3a7640000610f4c9190613752565b610f5792911c613752565b901c9750610f89565b81965082955080816503782dace9d960d21b610f7c9190613769565b610f869190613769565b97505b5050505050612ff0565b8363ffffffff166004036112c7575f856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110029190613544565b90505f866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611041573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110659190613544565b90505f876001600160a01b031663e76c01e46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c89190613544565b6001600160a01b03169050896001600160a01b0316836001600160a01b0316036111da57826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114c9190613619565b9450816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ae9190613619565b9350606081816111c682670de0b6b3a7640000613752565b6111d192911c613752565b901c95506112bf565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611216573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123a9190613619565b9450826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c9190613619565b9350806112b2816503782dace9d960d21b613769565b6112bc9190613769565b95505b505050612ff0565b8363ffffffff16610263036115945760405163f8b2cb4f60e01b81526001600160a01b0388811660048301525f919087169063f8b2cb4f90602401602060405180830381865afa15801561131d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611341919061373b565b60405163f8b2cb4f60e01b81526001600160a01b0389811660048301529192505f9188169063f8b2cb4f90602401602060405180830381865afa15801561138a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ae919061373b565b60405163f1b8a9b760e01b81526001600160a01b038b811660048301529192505f9189169063f1b8a9b790602401602060405180830381865afa1580156113f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141b919061373b565b60405163f1b8a9b760e01b81526001600160a01b038b811660048301529192505f918a169063f1b8a9b790602401602060405180830381865afa158015611464573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611488919061373b565b90506114a0826107b686670de0b6b3a7640000612ffa565b93506114b8816107b685670de0b6b3a7640000612ffa565b92508a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151a9190613619565b9550896001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611558573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157c9190613619565b945061089d846107b685670de0b6b3a7640000612ffa565b8363ffffffff1661026d0361192e575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116049190613544565b90505f866001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611667919061373b565b90505f876001600160a01b031663f89f27ed6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116a5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116cc919081019061385c565b90505f80846001600160a01b031663f94d4668856040518263ffffffff1660e01b81526004016116fe91815260200190565b5f60405180830381865afa158015611718573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261173f91908101906138fb565b50915091505f805f5b84518160ff161015611845578e6001600160a01b0316858260ff168151811061177357611773613963565b60200260200101516001600160a01b0316036117e3576117e0868260ff16815181106117a1576117a1613963565b60200260200101516107b6670de0b6b3a7640000878560ff16815181106117ca576117ca613963565b6020026020010151612ffa90919063ffffffff16565b92505b8d6001600160a01b0316858260ff168151811061180257611802613963565b60200260200101516001600160a01b03160361183357611830868260ff16815181106117a1576117a1613963565b91505b8061183d81613977565b915050611748565b508d6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611882573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a69190613619565b98508c6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119089190613619565b9750611920826107b683670de0b6b3a7640000612ffa565b995050505050505050612ff0565b8363ffffffff1661026e03611a3e57604051632a6f500560e11b81526001600160a01b0388811660048301525f91908716906354dea00a90602401602060405180830381865afa158015611984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a8919061373b565b604051632a6f500560e11b81526001600160a01b0389811660048301529192505f918816906354dea00a90602401602060405180830381865afa1580156119f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a15919061373b565b9050611a2d816107b684670de0b6b3a7640000612ffa565b945060129350601292505050612ff0565b8363ffffffff1661026f03611c4357846001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aad919061373b565b92505f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b109190613544565b90505f866001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b73919061373b565b604051631f29a8cd60e31b8152600481018290529091505f906001600160a01b0384169063f94d4668906024015f60405180830381865afa158015611bba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611be191908101906138fb565b50509050886001600160a01b0316815f81518110611c0157611c01613963565b60200260200101516001600160a01b031603611c3357611c30866ec097ce7bc90715b34b9f1000000000613769565b95505b6012945060129350505050612ff0565b8363ffffffff1661027703611ee6575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb39190613544565b90505f866001600160a01b031663f89f27ed6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d18919081019061385c565b60405163ca4f280360e01b81526001600160a01b0389811660048301529192505f9184169063ca4f2803906024015f60405180830381865afa158015611d60573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d879190810190613995565b6040516329ae7ec560e11b81526001600160a01b038a811660048301529192505f9185169063535cfd8a906024015f60405180830381865afa158015611dcf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611df6919081019061385c565b90505f805f5b84518160ff161015611eba578d6001600160a01b0316858260ff1681518110611e2757611e27613963565b60200260200101516001600160a01b031603611e5857611e55868260ff16815181106117a1576117a1613963565b92505b8c6001600160a01b0316858260ff1681518110611e7757611e77613963565b60200260200101516001600160a01b031603611ea857611ea5868260ff16815181106117a1576117a1613963565b91505b80611eb281613977565b915050611dfc565b50611ed1826107b683670de0b6b3a7640000612ffa565b98506012975060129650505050505050612ff0565b8363ffffffff1661027803612130575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f569190613544565b60405163ca4f280360e01b81526001600160a01b0388811660048301529192505f9183169063ca4f2803906024015f60405180830381865afa158015611f9e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc59190810190613995565b604051633f1b0def60e11b81526001600160a01b0389811660048301529192505f91841690637e361bde906024015f60405180830381865afa15801561200d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261203491908101906139c7565b915060019050805f5b84518160ff16101561210557848160ff168151811061205e5761205e613963565b60200260200101516001600160a01b03168d6001600160a01b03160361209e57838160ff168151811061209357612093613963565b602002602001015192505b848160ff16815181106120b3576120b3613963565b60200260200101516001600160a01b03168c6001600160a01b0316036120f357838160ff16815181106120e8576120e8613963565b602002602001015191505b806120fd81613977565b91505061203d565b5061211c816107b684670de0b6b3a7640000612ffa565b975060129650601295505050505050612ff0565b8363ffffffff166102790361234f575f856001600160a01b0316638d928af86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a09190613544565b60405163ca4f280360e01b81526001600160a01b0388811660048301529192505f9183169063ca4f2803906024015f60405180830381865afa1580156121e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261220f9190810190613995565b604051633f1b0def60e11b81526001600160a01b0389811660048301529192505f91841690637e361bde906024015f60405180830381865afa158015612257573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261227e91908101906139c7565b915060019050805f5b84518160ff16101561210557848160ff16815181106122a8576122a8613963565b60200260200101516001600160a01b03168d6001600160a01b0316036122e857838160ff16815181106122dd576122dd613963565b602002602001015192505b848160ff16815181106122fd576122fd613963565b60200260200101516001600160a01b03168c6001600160a01b03160361233d57838160ff168151811061233257612332613963565b602002602001015191505b8061234781613977565b915050612287565b8363ffffffff166007148061236a57508363ffffffff166047145b8061237b57508363ffffffff166048145b8061238c57508363ffffffff166049145b8061239d57508363ffffffff16604a145b806123ae57508363ffffffff16604b145b1561279f575f856001600160a01b03166305e8746d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124149190613544565b90505f866001600160a01b031663da10610c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612453573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124779190613544565b9050816001600160a01b0316896001600160a01b03160361261a57816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f29190613619565b9350806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612530573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125549190613619565b92505f6125618786613155565b604051631cee6cdf60e31b81526001600160801b0382166004820152600160248201529091505f906001600160a01b038a169063e77366f890604401606060405180830381865afa1580156125b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125dc9190613a3d565b50915050612611826001600160801b03166107b6670de0b6b3a7640000846001600160801b0316612ffa90919063ffffffff16565b96505050612798565b806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267a9190613619565b9350816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126dc9190613619565b92505f6126e98786613155565b604051631cee6cdf60e31b81526001600160801b03821660048201525f602482018190529192506001600160a01b038a169063e77366f890604401606060405180830381865afa15801561273f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127639190613a3d565b5091505061089d826001600160801b03166107b6670de0b6b3a7640000846001600160801b0316612ffa90919063ffffffff16565b5050612ff0565b8363ffffffff16600814806127ba57508363ffffffff166051145b806127cb57508363ffffffff166052145b806127dc57508363ffffffff166053145b806127ed57508363ffffffff166054145b806127fe57508363ffffffff166055145b15612bc257465f9081526002602052604081205481906001600160a01b031660405163124fd3dd60e21b8152600760048201529092508291505f906001600160a01b0383169063493f4f7490602401602060405180830381865afa158015612868573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288c9190613544565b60405163eb85226d60e01b81526001600160a01b038a811660048301528c811660248301528b811660448301529192505f918291829185169063eb85226d90606401606060405180830381865afa1580156128e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290d9190613a8e565b919450925090505f61291e8c6132c0565b90505f60ff821615801561292f5750825b1561294257506307211ef760e01b61296e565b60ff8216158015612951575082155b156129645750635e0d443f60e01b61296e565b5063556d6e9f60e01b5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168f6001600160a01b0316036129a45760129950612a07565b8e6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a049190613619565b99505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038f1601612a355760129850612a98565b8d6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a959190613619565b98505b5f612aa38d8c613155565b90505f808f6001600160a01b031684898986604051602401612ae6939291906001600160801b039384168152919092166020820152604081019190915260600190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612b249190613acb565b5f60405180830381855afa9150503d805f8114612b5c576040519150601f19603f3d011682016040523d82523d5f602084013e612b61565b606091505b5091509150818015612b7557506020815110155b15612bb2575f81806020019051810190612b8f919061373b565b90508015612bb057612bad846107b683670de0b6b3a7640000612ffa565b9e505b505b5050505050505050505050612ff0565b8363ffffffff1660091480612bdd57508363ffffffff16605b145b80612bee57508363ffffffff16605c145b80612bff57508363ffffffff16605d145b80612c1057508363ffffffff16605e145b80612c2157508363ffffffff16605f145b15612ff0575f856001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c879190613544565b90505f866001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cea9190613544565b9050816001600160a01b0316896001600160a01b031603612e7b57816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d659190613619565b9350806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc79190613619565b92505f612dd48786613155565b604051633cd0243b60e11b815273d692c31e5ec0d87d032abc243c1eb2c9ae204fea6004820152602481018290529091505f906001600160a01b038a16906379a04876906044016040805180830381865afa158015612e35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e599190613af7565b509050612e72826107b683670de0b6b3a7640000612ffa565b96505050612fed565b806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edb9190613619565b9350816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f3d9190613619565b92505f612f4a8786613155565b6040516366410a2160e01b815273d692c31e5ec0d87d032abc243c1eb2c9ae204fea6004820152602481018290529091505f906001600160a01b038a16906366410a21906044016040805180830381865afa158015612fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fcf9190613af7565b509050612fe8826107b683670de0b6b3a7640000612ffa565b965050505b50505b9450945094915050565b5f825f0361300957505f613080565b5f6130148385613752565b9050826130218583613769565b1461307d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b5f8082116130d65760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401613074565b61307d8284613769565b5f81604051602001613138919081516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b90830152608092830151169181019190915260a00190565b604051602081830303815290604052805190602001209050919050565b5f6004600763ffffffff8516148061317357508363ffffffff166008145b8061318457508363ffffffff166009145b1561318d575060045b8363ffffffff16604714806131a857508363ffffffff166051145b806131b957508363ffffffff16605b145b156131c157505f5b8363ffffffff16604814806131dc57508363ffffffff166052145b806131ed57508363ffffffff16605c145b156131f6575060025b8363ffffffff166049148061321157508363ffffffff166053145b8061322257508363ffffffff16605d145b1561322b575060065b8363ffffffff16604a148061324657508363ffffffff166054145b8061325757508363ffffffff16605e145b15613260575060085b8363ffffffff16604b148061327b57508363ffffffff166055145b8061328c57508363ffffffff16605f145b156132955750600a5b5f60046132a28386613b19565b6132ac9190613b32565b6132b790600a61372d565b95945050505050565b60408051600481526024810182526020810180516001600160e01b03166349fe9e7760e01b17905290515f91829182916001600160a01b038616916133059190613acb565b5f60405180830381855afa9150503d805f811461333d576040519150601f19603f3d011682016040523d82523d5f602084013e613342565b606091505b509150915081801561335657506020815110155b15613365575060019392505050565b60408051600481526024810182526020810180516001600160e01b03166304ad07e360e11b17905290516001600160a01b038616916133a391613acb565b5f60405180830381855afa9150503d805f81146133db576040519150601f19603f3d011682016040523d82523d5f602084013e6133e0565b606091505b5090925090508180156133f557506020815110155b15613404575060029392505050565b505f9392505050565b803563ffffffff81168114613420575f80fd5b919050565b5f60208284031215613435575f80fd5b61307d8261340d565b6001600160a01b0381168114613452575f80fd5b50565b5f8060408385031215613466575f80fd5b8235915060208301356134788161343e565b809150509250929050565b5f805f60608486031215613495575f80fd5b61349e8461340d565b9250602084013562ffffff811681146134b5575f80fd5b91506040840135600281900b81146134cb575f80fd5b809150509250925092565b5f805f80608085870312156134e9575f80fd5b84356134f48161343e565b935060208501356135048161343e565b925060408501356135148161343e565b91506135226060860161340d565b905092959194509250565b5f6020828403121561353d575f80fd5b5035919050565b5f60208284031215613554575f80fd5b815161307d8161343e565b80516001600160701b0381168114613420575f80fd5b5f8060408385031215613586575f80fd5b61358f8361355f565b915061359d6020840161355f565b90509250929050565b5f602082840312156135b6575f80fd5b61307d8261355f565b5f805f805f60a086880312156135d3575f80fd5b6135dc8661355f565b94506135ea6020870161355f565b93506135f86040870161355f565b92506136066060870161355f565b9150608086015190509295509295909350565b5f60208284031215613629575f80fd5b815160ff8116811461307d575f80fd5b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561368757815f190482111561366d5761366d613639565b8085161561367a57918102915b93841c9390800290613652565b509250929050565b5f8261369d57506001613080565b816136a957505f613080565b81600181146136bf57600281146136c9576136e5565b6001915050613080565b60ff8411156136da576136da613639565b50506001821b613080565b5060208310610133831016604e8410600b8410161715613708575081810a613080565b613712838361364d565b805f190482111561372557613725613639565b029392505050565b5f61307d60ff84168361368f565b5f6020828403121561374b575f80fd5b5051919050565b808202811582820484141761308057613080613639565b5f8261378357634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137c5576137c5613788565b604052919050565b5f67ffffffffffffffff8211156137e6576137e6613788565b5060051b60200190565b5f82601f8301126137ff575f80fd5b8151602061381461380f836137cd565b61379c565b8083825260208201915060208460051b870101935086841115613835575f80fd5b602086015b84811015613851578051835291830191830161383a565b509695505050505050565b5f6020828403121561386c575f80fd5b815167ffffffffffffffff811115613882575f80fd5b61388e848285016137f0565b949350505050565b5f82601f8301126138a5575f80fd5b815160206138b561380f836137cd565b8083825260208201915060208460051b8701019350868411156138d6575f80fd5b602086015b848110156138515780516138ee8161343e565b83529183019183016138db565b5f805f6060848603121561390d575f80fd5b835167ffffffffffffffff80821115613924575f80fd5b61393087838801613896565b94506020860151915080821115613945575f80fd5b50613952868287016137f0565b925050604084015190509250925092565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff810361398c5761398c613639565b60010192915050565b5f602082840312156139a5575f80fd5b815167ffffffffffffffff8111156139bb575f80fd5b61388e84828501613896565b5f80604083850312156139d8575f80fd5b825167ffffffffffffffff808211156139ef575f80fd5b6139fb868387016137f0565b93506020850151915080821115613a10575f80fd5b50613a1d858286016137f0565b9150509250929050565b80516001600160801b0381168114613420575f80fd5b5f805f60608486031215613a4f575f80fd5b613a5884613a27565b9250613a6660208501613a27565b9150613a7460408501613a27565b90509250925092565b8051600f81900b8114613420575f80fd5b5f805f60608486031215613aa0575f80fd5b613aa984613a7d565b9250613ab760208501613a7d565b9150604084015180151581146134cb575f80fd5b5f82515f5b81811015613aea5760208186018101518583015201613ad0565b505f920191825250919050565b5f8060408385031215613b08575f80fd5b505080516020909101519092909150565b60ff818116838216019081111561308057613080613639565b60ff82811682821603908111156130805761308061363956fea26469706673582212204a952d92e9a268236e90d8f2d6ab23473ef99a632d9d2856ba22b5ac6c1e2e7364736f6c63430008180033

Deployed Bytecode Sourcemap

9765:24366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16084:158;;;;;;:::i;:::-;16187:14;;16137:10;16187:14;;;:9;:14;;;;;:18;;;;;16207:26;;;;;;;16084:158;;;;;569:8:1;557:21;;;539:40;;626:1;615:21;;;;610:2;595:18;;588:49;512:18;16084:158:0;;;;;;;;16530:162;;;;;;:::i;:::-;16631:30;;;;:21;:30;;;;;;:53;;-1:-1:-1;;;;;;16631:53:0;-1:-1:-1;;;;;16631:53:0;;;;;;;;;16530:162;;;16248:134;;;;;;:::i;:::-;16349:25;;;;;;;;;;;;;;;;;;;;;;;;;;16332:14;;;;-1:-1:-1;16332:14:0;;;:9;:14;;;;;:42;;;;;;;;;;-1:-1:-1;;16332:42:0;;;;;;;;;;;;;;;16248:134;18264:15864;;;;;;:::i;:::-;;:::i;:::-;;;;2425:25:1;;;2498:4;2486:17;;;2481:2;2466:18;;2459:45;2540:17;;2520:18;;;2513:45;2413:2;2398:18;18264:15864:0;2231:333:1;15838:115:0;;;;;;:::i;:::-;15898:7;15925:20;;;;;;;;;;;-1:-1:-1;;;;;15925:20:0;;15838:115;;;;-1:-1:-1;;;;;2918:32:1;;;2900:51;;2888:2;2873:18;15838:115:0;2754:203:1;16388:136:0;;;;;;:::i;:::-;16459:7;16486:30;;;:21;:30;;;;;;-1:-1:-1;;;;;16486:30:0;;16388:136;15959:119;;;;;;:::i;:::-;16038:11;:20;;;;;;;;;;;:32;;-1:-1:-1;;;;;;16038:32:0;-1:-1:-1;;;;;16038:32:0;;;;;;;;;15959:119;18264:15864;18373:12;18387:18;18407:16;18481:3;:8;;18488:1;18481:8;:21;;;;18493:3;:9;;18500:2;18493:9;18481:21;:34;;;;18506:3;:9;;18513:2;18506:9;18481:34;18478:15643;;;18532:14;18561;18590:16;18621;18701:3;:8;;18708:1;18701:8;18698:894;;18754:11;-1:-1:-1;;;;;18739:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18730:45;;18818:11;-1:-1:-1;;;;;18803:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18794:45;;18896:11;-1:-1:-1;;;;;18881:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18858:64:0;;;;-1:-1:-1;18858:64:0;;-1:-1:-1;18698:894:0;;;19001:3;:9;;19008:2;19001:9;18998:594;;19054:11;-1:-1:-1;;;;;19040:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19031:44;;19117:11;-1:-1:-1;;;;;19103:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19094:44;;19182:11;-1:-1:-1;;;;;19168:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19157:48:0;;;19249:11;-1:-1:-1;;;;;19235:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19224:48:0;;;18998:594;;;19352:3;:9;;19359:2;19352:9;19349:243;;19405:11;-1:-1:-1;;;;;19391:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19382:44;;19468:11;-1:-1:-1;;;;;19454:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19445:44;;19549:11;-1:-1:-1;;;;;19535:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;19508:68:0;;;;-1:-1:-1;19508:68:0;;-1:-1:-1;;;19349:243:0;19619:9;-1:-1:-1;;;;;19609:19:0;:6;-1:-1:-1;;;;;19609:19:0;;19606:442;;19679:6;-1:-1:-1;;;;;19664:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19649:48;;19744:6;-1:-1:-1;;;;;19729:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19716:46;-1:-1:-1;19788:32:0;19811:8;19788:18;:8;19801:4;19788:12;:18::i;:::-;:22;;:32::i;:::-;19781:39;;19606:442;;;19891:6;-1:-1:-1;;;;;19876:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19861:48;;19956:6;-1:-1:-1;;;;;19941:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19928:46;-1:-1:-1;20000:32:0;20023:8;20000:18;:8;20013:4;20000:12;:18::i;:32::-;19993:39;;19606:442;18517:1542;;;;18478:15643;;;20114:3;:8;;20121:1;20114:8;20111:14010;;20169:9;-1:-1:-1;;;;;20154:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20139:51;-1:-1:-1;20218:2:0;;-1:-1:-1;;;;;;20242:47:0;;;20290:16;20139:51;20290:2;:16;:::i;:::-;20242:65;;;;;;;;;;;;;6386:25:1;;6374:2;6359:18;;6240:177;20242:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20235:72;;20111:14010;;;20391:3;:8;;20398:1;20391:8;:40;;;;20410:5;20404:3;:11;;;:26;;;;;20425:5;20419:3;:11;;;20404:26;20391:53;;;;20435:3;:9;;20442:2;20435:9;20391:53;20388:13733;;;20461:14;20490;20519:15;20549;20579:20;20699:3;:8;;20706:1;20699:8;20696:1388;;20752:11;-1:-1:-1;;;;;20737:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20728:45;;20816:11;-1:-1:-1;;;;;20801:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20792:45;;20886:11;-1:-1:-1;;;;;20871:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20856:50:0;;;20696:1388;;;21148:5;21142:3;:11;;;:26;;;;;21163:5;21157:3;:11;;;21142:26;21139:945;;;21198:5;21192:3;:11;;;:26;;;;;21213:5;21207:3;:11;;;21192:26;21189:268;;;21252:9;21243:18;;21293:7;21284:16;;21189:268;;;21335:5;21329:3;:11;;;:26;;;;;21350:5;21344:3;:11;;;21329:26;21326:131;;;21389:7;21380:16;;21428:9;21419:18;;21326:131;21508:13;21475:17;15925:20;;;;;;;;;;;;16187:14;;;;;:9;:14;;;;;;:18;21634:54;;;;;;;-1:-1:-1;;;;;21634:54:0;;;;;;;;;;;;;;;16187:18;;;21634:54;;;;;;16207:26;;;;;;21634:54;;;;;;;;;;;;;15925:20;;;;;16187:18;;16207:26;15925:20;21722:39;21762:13;21634:54;21762:4;:13::i;:::-;21722:54;;;;;;;;;;;;;6386:25:1;;6374:2;6359:18;;6240:177;21722:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21707:69:0;;;21170:622;;;;21139:945;;;21866:3;:9;;21873:2;21866:9;21863:221;;21918:11;-1:-1:-1;;;;;21905:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21896:43;;21980:11;-1:-1:-1;;;;;21967:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21958:43;;22048:11;-1:-1:-1;;;;;22035:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22020:48:0;;;21863:221;-1:-1:-1;;;;;22103:14:0;;10097:42;22103:14;;:33;;-1:-1:-1;;;;;;22121:15:0;;;22103:33;22100:173;;;22169:2;22157:14;;22100:173;;;22239:6;-1:-1:-1;;;;;22224:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22212:45;;22100:173;-1:-1:-1;;;;;22290:14:0;;10097:42;22290:14;;:33;;-1:-1:-1;;;;;;22308:15:0;;;22290:33;22287:173;;;22356:2;22344:14;;22287:173;;;22426:6;-1:-1:-1;;;;;22411:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22399:45;;22287:173;22487:9;-1:-1:-1;;;;;22477:19:0;:6;-1:-1:-1;;;;;22477:19:0;;22474:377;;22532:9;22517:24;;22573:9;22560:22;;22658:2;22641:12;22635:2;22618:12;22611:4;:19;;;;:::i;:::-;22609:44;;;22610:27;22609:44;:::i;:::-;22608:52;;22601:59;;22474:377;;;22716:9;22701:24;;22757:9;22744:22;;22823:12;22808;-1:-1:-1;;;22792:28:0;;;;:::i;:::-;:43;;;;:::i;:::-;22785:50;;22474:377;20446:2416;;;;;20388:13733;;;22920:3;:8;;22927:1;22920:8;22917:11204;;22945:14;22975:11;-1:-1:-1;;;;;22962:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22945:51;;23011:14;23041:11;-1:-1:-1;;;;;23028:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23011:51;;23078:20;23115:11;-1:-1:-1;;;;;23102:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23077:64:0;;;23169:9;-1:-1:-1;;;;;23159:19:0;:6;-1:-1:-1;;;;;23159:19:0;;23156:473;;23229:6;-1:-1:-1;;;;;23214:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23199:48;;23294:6;-1:-1:-1;;;;;23279:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23266:46;-1:-1:-1;23388:2:0;23371:12;23388:2;23341:19;23371:12;23341:4;:19;:::i;:::-;23339:44;;;23340:27;23339:44;:::i;:::-;23338:52;;23331:59;;23156:473;;;23461:6;-1:-1:-1;;;;;23446:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23431:48;;23526:6;-1:-1:-1;;;;;23511:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23498:46;-1:-1:-1;23601:12:0;23570:28;23601:12;-1:-1:-1;;;23570:28:0;:::i;:::-;:43;;;;:::i;:::-;23563:50;;23156:473;22930:710;;;22917:11204;;;23718:3;:10;;23725:3;23718:10;23715:10406;;23774:44;;-1:-1:-1;;;23774:44:0;;-1:-1:-1;;;;;2918:32:1;;;23774:44:0;;;2900:51:1;23745:26:0;;23774:33;;;;;;2873:18:1;;23774:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23860:42;;-1:-1:-1;;;23860:42:0;;-1:-1:-1;;;;;2918:32:1;;;23860:42:0;;;2900:51:1;23745:73:0;;-1:-1:-1;23833:24:0;;23860:33;;;;;2873:18:1;;23860:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23938:53;;-1:-1:-1;;;23938:53:0;;-1:-1:-1;;;;;2918:32:1;;;23938:53:0;;;2900:51:1;23833:69:0;;-1:-1:-1;23917:18:0;;23938:42;;;;;2873:18:1;;23938:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24025:51;;-1:-1:-1;;;24025:51:0;;-1:-1:-1;;;;;2918:32:1;;;24025:51:0;;;2900::1;23917:74:0;;-1:-1:-1;24006:16:0;;24025:42;;;;;2873:18:1;;24025:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24006:70;-1:-1:-1;24112:44:0;24145:10;24112:28;:18;24135:4;24112:22;:28::i;:44::-;24091:65;-1:-1:-1;24190:40:0;24221:8;24190:26;:16;24211:4;24190:20;:26::i;:40::-;24171:59;;24275:9;-1:-1:-1;;;;;24260:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24245:51;;24339:7;-1:-1:-1;;;;;24324:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24311:47;-1:-1:-1;24380:50:0;24411:18;24380:26;:16;24401:4;24380:20;:26::i;23715:10406::-;24514:3;:10;;24521:3;24514:10;24511:9610;;24541:20;24580:11;-1:-1:-1;;;;;24564:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24541:62;;24618:14;24651:11;-1:-1:-1;;;;;24635:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24618:57;;24691:24;24735:11;-1:-1:-1;;;;;24719:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24719:51:0;;;;;;;;;;;;:::i;:::-;24690:80;;24786:23;24811:25;24850:12;-1:-1:-1;;;;;24841:36:0;;24878:6;24841:44;;;;;;;;;;;;;6386:25:1;;6374:2;6359:18;;6240:177;24841:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24841:44:0;;;;;;;;;;;;:::i;:::-;24785:100;;;;;24900:26;24945:24;24992:7;24988:345;25009:6;:13;25005:1;:17;;;24988:345;;;25064:9;-1:-1:-1;;;;;25051:22:0;:6;25058:1;25051:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;25051:22:0;;25048:128;;25119:37;25145:7;25153:1;25145:10;;;;;;;;;;:::i;:::-;;;;;;;25119:21;25135:4;25119:8;25128:1;25119:11;;;;;;;;;;:::i;:::-;;;;;;;:15;;:21;;;;:::i;:37::-;25098:58;;25048:128;25210:7;-1:-1:-1;;;;;25197:20:0;:6;25204:1;25197:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;25197:20:0;;25194:124;;25261:37;25287:7;25295:1;25287:10;;;;;;;;;;:::i;25261:37::-;25242:56;;25194:124;25024:3;;;;:::i;:::-;;;;24988:345;;;;25377:9;-1:-1:-1;;;;;25362:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25347:51;;25441:7;-1:-1:-1;;;;;25426:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25413:47;-1:-1:-1;25482:50:0;25513:18;25482:26;:16;25503:4;25482:20;:26::i;:50::-;25475:57;;24526:1018;;;;;;;24511:9610;;;25614:3;:10;;25621:3;25614:10;25611:8510;;25660:50;;-1:-1:-1;;;25660:50:0;;-1:-1:-1;;;;;2918:32:1;;;25660:50:0;;;2900:51:1;25641:16:0;;25660:39;;;;;;2873:18:1;;25660:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25742:48;;-1:-1:-1;;;25742:48:0;;-1:-1:-1;;;;;2918:32:1;;;25742:48:0;;;2900:51:1;25641:69:0;;-1:-1:-1;25725:14:0;;25742:39;;;;;2873:18:1;;25742:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25725:65;-1:-1:-1;25812:30:0;25725:65;25812:18;:8;25825:4;25812:12;:18::i;:30::-;25805:37;;25872:2;25857:17;;25902:2;25889:15;;25626:290;;25611:8510;;;25990:3;:10;;25997:3;25990:10;25987:8134;;26040:11;-1:-1:-1;;;;;26024:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26017:46;;26078:20;26117:11;-1:-1:-1;;;;;26101:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26078:62;;26155:14;26188:11;-1:-1:-1;;;;;26172:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26258:44;;-1:-1:-1;;;26258:44:0;;;;;6386:25:1;;;26155:57:0;;-1:-1:-1;26228:23:0;;-1:-1:-1;;;;;26258:36:0;;;;;6359:18:1;;26258:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26258:44:0;;;;;;;;;;;;:::i;:::-;26227:75;;;;26333:7;-1:-1:-1;;;;;26320:20:0;:6;26327:1;26320:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;26320:20:0;;26317:80;;26368:13;26377:4;26369;26368:13;:::i;:::-;26361:20;;26317:80;26426:2;26411:17;;26456:2;26443:15;;26002:468;;;25987:8134;;;26542:3;:10;;26549:3;26542:10;26539:7582;;26569:20;26608:11;-1:-1:-1;;;;;26592:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26569:62;;26647:24;26691:11;-1:-1:-1;;;;;26675:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26675:51:0;;;;;;;;;;;;:::i;:::-;26769:49;;-1:-1:-1;;;26769:49:0;;-1:-1:-1;;;;;2918:32:1;;;26769:49:0;;;2900:51:1;26646:80:0;;-1:-1:-1;26742:23:0;;26769:36;;;;;2873:18:1;;26769:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26769:49:0;;;;;;;;;;;;:::i;:::-;26863:58;;-1:-1:-1;;;26863:58:0;;-1:-1:-1;;;;;2918:32:1;;;26863:58:0;;;2900:51:1;26741:77:0;;-1:-1:-1;26834:25:0;;26863:45;;;;;2873:18:1;;26863:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26863:58:0;;;;;;;;;;;;:::i;:::-;26833:88;;26936:26;26981:24;27028:7;27024:345;27045:6;:13;27041:1;:17;;;27024:345;;;27100:9;-1:-1:-1;;;;;27087:22:0;:6;27094:1;27087:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;27087:22:0;;27084:128;;27155:37;27181:7;27189:1;27181:10;;;;;;;;;;:::i;27155:37::-;27134:58;;27084:128;27246:7;-1:-1:-1;;;;;27233:20:0;:6;27240:1;27233:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;27233:20:0;;27230:124;;27297:37;27323:7;27331:1;27323:10;;;;;;;;;;:::i;27297:37::-;27278:56;;27230:124;27060:3;;;;:::i;:::-;;;;27024:345;;;-1:-1:-1;27390:50:0;27421:18;27390:26;:16;27411:4;27390:20;:26::i;:50::-;27383:57;;27470:2;27455:17;;27500:2;27487:15;;26554:960;;;;;;26539:7582;;;27584:3;:10;;27591:3;27584:10;27581:6540;;27611:20;27648:11;-1:-1:-1;;;;;27634:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27714:49;;-1:-1:-1;;;27714:49:0;;-1:-1:-1;;;;;2918:32:1;;;27714:49:0;;;2900:51:1;27611:60:0;;-1:-1:-1;27687:23:0;;27714:36;;;;;2873:18:1;;27714:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27714:49:0;;;;;;;;;;;;:::i;:::-;27812:53;;-1:-1:-1;;;27812:53:0;;-1:-1:-1;;;;;2918:32:1;;;27812:53:0;;;2900:51:1;27686:77:0;;-1:-1:-1;27781:27:0;;27812:40;;;;;2873:18:1;;27812:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27812:53:0;;;;;;;;;;;;:::i;:::-;27778:87;-1:-1:-1;27900:1:0;;-1:-1:-1;27900:1:0;27881:16;27949:278;27970:6;:13;27966:1;:17;;;27949:278;;;28026:6;28033:1;28026:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28013:22:0;:9;-1:-1:-1;;;;;28013:22:0;;28010:94;;28071:10;28082:1;28071:13;;;;;;;;;;:::i;:::-;;;;;;;28060:24;;28010:94;28136:6;28143:1;28136:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28125:20:0;:7;-1:-1:-1;;;;;28125:20:0;;28122:90;;28179:10;28190:1;28179:13;;;;;;;;;;:::i;:::-;;;;;;;28170:22;;28122:90;27985:3;;;;:::i;:::-;;;;27949:278;;;-1:-1:-1;28248:30:0;28271:6;28248:18;:8;28261:4;28248:12;:18::i;:30::-;28241:37;;28308:2;28293:17;;28338:2;28325:15;;27596:756;;;;;27581:6540;;;28426:3;:10;;28433:3;28426:10;28423:5698;;28454:20;28493:11;-1:-1:-1;;;;;28477:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28559:49;;-1:-1:-1;;;28559:49:0;;-1:-1:-1;;;;;2918:32:1;;;28559:49:0;;;2900:51:1;28454:62:0;;-1:-1:-1;28532:23:0;;28559:36;;;;;2873:18:1;;28559:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28559:49:0;;;;;;;;;;;;:::i;:::-;28657:53;;-1:-1:-1;;;28657:53:0;;-1:-1:-1;;;;;2918:32:1;;;28657:53:0;;;2900:51:1;28531:77:0;;-1:-1:-1;28626:27:0;;28657:40;;;;;2873:18:1;;28657:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28657:53:0;;;;;;;;;;;;:::i;:::-;28623:87;-1:-1:-1;28745:1:0;;-1:-1:-1;28745:1:0;28726:16;28794:278;28815:6;:13;28811:1;:17;;;28794:278;;;28871:6;28878:1;28871:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28858:22:0;:9;-1:-1:-1;;;;;28858:22:0;;28855:94;;28916:10;28927:1;28916:13;;;;;;;;;;:::i;:::-;;;;;;;28905:24;;28855:94;28981:6;28988:1;28981:9;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28970:20:0;:7;-1:-1:-1;;;;;28970:20:0;;28967:90;;29024:10;29035:1;29024:13;;;;;;;;;;:::i;:::-;;;;;;;29015:22;;28967:90;28830:3;;;;:::i;:::-;;;;28794:278;;28423:5698;29453:3;:8;;29460:1;29453:8;:21;;;;29465:3;:9;;29472:2;29465:9;29453:21;:34;;;;29478:3;:9;;29485:2;29478:9;29453:34;:47;;;;29491:3;:9;;29498:2;29491:9;29453:47;:60;;;;29504:3;:9;;29511:2;29504:9;29453:60;:73;;;;29517:3;:9;;29524:2;29517:9;29453:73;29450:4671;;;29543:14;29579:11;-1:-1:-1;;;;;29560:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29543:60;;29618:14;29654:11;-1:-1:-1;;;;;29635:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29618:60;;29711:6;-1:-1:-1;;;;;29698:19:0;:9;-1:-1:-1;;;;;29698:19:0;;29695:807;;29768:6;-1:-1:-1;;;;;29753:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29738:48;;29833:6;-1:-1:-1;;;;;29818:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29805:46;;29870:16;29897:31;29910:3;29915:12;29897;:31::i;:::-;29974:58;;-1:-1:-1;;;29974:58:0;;-1:-1:-1;;;;;12181:47:1;;29974:58:0;;;12163:66:1;30027:4:0;12245:18:1;;;12238:50;29870:59:0;;-1:-1:-1;29951:17:0;;-1:-1:-1;;;;;29974:42:0;;;;;12136:18:1;;29974:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29948:84;;;;30058:33;30082:8;-1:-1:-1;;;;;30058:33:0;:19;30072:4;30058:9;-1:-1:-1;;;;;30058:13:0;;;:19;;;;:::i;:33::-;30051:40;;29719:388;;29695:807;;;30162:6;-1:-1:-1;;;;;30147:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30132:48;;30227:6;-1:-1:-1;;;;;30212:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30199:46;;30264:16;30291:31;30304:3;30309:12;30291;:31::i;:::-;30368:59;;-1:-1:-1;;;30368:59:0;;-1:-1:-1;;;;;12181:47:1;;30368:59:0;;;12163:66:1;30345:17:0;12245:18:1;;;12238:50;;;30264:59:0;;-1:-1:-1;;;;;;30368:42:0;;;;;12136:18:1;;30368:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30342:85;;;;30453:33;30477:8;-1:-1:-1;;;;;30453:33:0;:19;30467:4;30453:9;-1:-1:-1;;;;;30453:13:0;;;:19;;;;:::i;29695:807::-;29528:985;;29450:4671;;;30794:3;:8;;30801:1;30794:8;:21;;;;30806:3;:9;;30813:2;30806:9;30794:21;:34;;;;30819:3;:9;;30826:2;30819:9;30794:34;:47;;;;30832:3;:9;;30839:2;30832:9;30794:47;:60;;;;30845:3;:9;;30852:2;30845:9;30794:60;:73;;;;30858:3;:9;;30865:2;30858:9;30794:73;30791:3330;;;30982:13;30884:28;16486:30;;;:21;:30;;;;;;30884:28;;-1:-1:-1;;;;;16486:30:0;31136:28;;-1:-1:-1;;;31136:28:0;;31162:1;31136:28;;;6386:25:1;30927:69:0;;-1:-1:-1;30927:69:0;;-1:-1:-1;31078:36:0;;-1:-1:-1;;;;;31136:25:0;;;;;6359:18:1;;31136:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31289:67;;-1:-1:-1;;;31289:67:0;;-1:-1:-1;;;;;13327:15:1;;;31289:67:0;;;13309:34:1;13379:15;;;13359:18;;;13352:43;13431:15;;;13411:18;;;13404:43;31078:87:0;;-1:-1:-1;31180:8:0;;;;;;31289:34;;;;;13244:18:1;;31289:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31266:90;;-1:-1:-1;31266:90:0;-1:-1:-1;31266:90:0;-1:-1:-1;31371:14:0;31388:30;31406:11;31388:17;:30::i;:::-;31371:47;-1:-1:-1;31433:15:0;31467:13;;;;:29;;;;;31484:12;31467:29;31463:332;;;-1:-1:-1;;;;31463:332:0;;;31601:13;;;;:30;;;;;31619:12;31618:13;31601:30;31597:198;;;-1:-1:-1;;;;31597:198:0;;;-1:-1:-1;;;;31597:198:0;10097:42;-1:-1:-1;;;;;31826:17:0;:9;-1:-1:-1;;;;;31826:17:0;;31823:166;;31879:2;31864:17;;31823:166;;;31952:9;-1:-1:-1;;;;;31937:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31922:51;;31823:166;-1:-1:-1;;;;;;;32006:15:0;;;32003:158;;32055:2;32042:15;;32003:158;;;32126:7;-1:-1:-1;;;;;32111:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32098:47;;32003:158;32175:16;32194:31;32207:3;32212:12;32194;:31::i;:::-;32175:50;;32255:12;32269:17;32290:11;-1:-1:-1;;;;;32290:22:0;32336:8;32354:1;32366;32370:8;32313:66;;;;;;;;;-1:-1:-1;;;;;14350:15:1;;;14332:34;;14402:15;;;;14397:2;14382:18;;14375:43;14449:2;14434:18;;14427:34;;;;14267:2;14252:18;;14077:390;32313:66:0;;;;-1:-1:-1;;32313:66:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32313:66:0;-1:-1:-1;;;;;;32313:66:0;;;;;;;;;;32290:90;;;;32313:66;32290:90;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32254:126;;;;32399:7;:28;;;;;32425:2;32410:4;:11;:17;;32399:28;32395:333;;;32486:17;32517:4;32506:27;;;;;;;;;;;;:::i;:::-;32486:47;-1:-1:-1;32556:13:0;;32552:161;;32660:33;32684:8;32660:19;:9;32674:4;32660:13;:19::i;:33::-;32653:40;;32552:161;32429:299;32395:333;30869:1870;;;;;;;;;;;30791:3330;;;33000:3;:8;;33007:1;33000:8;:21;;;;33012:3;:9;;33019:2;33012:9;33000:21;:34;;;;33025:3;:9;;33032:2;33025:9;33000:34;:47;;;;33038:3;:9;;33045:2;33038:9;33000:47;:60;;;;33051:3;:9;;33058:2;33051:9;33000:60;:73;;;;33064:3;:9;;33071:2;33064:9;33000:73;32997:1124;;;33090:14;33116:11;-1:-1:-1;;;;;33107:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33090:53;;33158:14;33184:11;-1:-1:-1;;;;;33175:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33158:54;;33245:6;-1:-1:-1;;;;;33232:19:0;:9;-1:-1:-1;;;;;33232:19:0;;33229:881;;33302:6;-1:-1:-1;;;;;33287:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33272:48;;33367:6;-1:-1:-1;;;;;33352:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33339:46;;33404:16;33423:31;33436:3;33441:12;33423;:31::i;:::-;33506:89;;-1:-1:-1;;;33506:89:0;;33542:42;33506:89;;;15063:51:1;15130:18;;;15123:34;;;33404:50:0;;-1:-1:-1;33474:26:0;;-1:-1:-1;;;;;33506:35:0;;;;;15036:18:1;;33506:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33473:122:0;-1:-1:-1;33621:42:0;33654:8;33621:28;33473:122;33644:4;33621:22;:28::i;:42::-;33614:49;;33253:426;;33229:881;;;33734:6;-1:-1:-1;;;;;33719:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33704:48;;33799:6;-1:-1:-1;;;;;33784:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33771:46;;33836:16;33855:31;33868:3;33873:12;33855;:31::i;:::-;33937:90;;-1:-1:-1;;;33937:90:0;;33974:42;33937:90;;;15063:51:1;15130:18;;;15123:34;;;33836:50:0;;-1:-1:-1;33906:25:0;;-1:-1:-1;;;;;33937:36:0;;;;;15036:18:1;;33937:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33905:122:0;-1:-1:-1;34053:41:0;34085:8;34053:27;33905:122;34075:4;34053:21;:27::i;:41::-;34046:48;;33685:425;;33229:881;33075:1046;;32997:1124;18264:15864;;;;;;;;:::o;1328:220::-;1386:7;1410:1;1415;1410:6;1406:20;;-1:-1:-1;1425:1:0;1418:8;;1406:20;1437:9;1449:5;1453:1;1449;:5;:::i;:::-;1437:17;-1:-1:-1;1482:1:0;1473:5;1477:1;1437:17;1473:5;:::i;:::-;:10;1465:56;;;;-1:-1:-1;;;1465:56:0;;15620:2:1;1465:56:0;;;15602:21:1;15659:2;15639:18;;;15632:30;15698:34;15678:18;;;15671:62;-1:-1:-1;;;15749:18:1;;;15742:31;15790:19;;1465:56:0;;;;;;;;;1539:1;-1:-1:-1;1328:220:0;;;;;:::o;1554:153::-;1612:7;1644:1;1640;:5;1632:44;;;;-1:-1:-1;;;1632:44:0;;16022:2:1;1632:44:0;;;16004:21:1;16061:2;16041:18;;;16034:30;16100:28;16080:18;;;16073:56;16146:18;;1632:44:0;15820:350:1;1632:44:0;1694:5;1698:1;1694;:5;:::i;16698:133::-;16759:14;16814:7;16803:19;;;;;;;16430:13:1;;-1:-1:-1;;;;;16426:22:1;;;16408:41;;16509:4;16497:17;;;16491:24;16487:33;;16465:20;;;16458:63;16581:4;16569:17;;;16563:24;16589:8;16559:39;16537:20;;;16530:69;16669:4;16657:17;;;16651:24;16648:1;16637:39;16615:20;;;16608:69;16737:4;16725:17;;;16719:24;16715:33;16693:20;;;16686:63;;;;16357:3;16342:19;;16175:580;16803:19:0;;;;;;;;;;;;;16793:30;;;;;;16786:37;;16698:133;;;:::o;17532:724::-;17610:7;17642:1;17665;17657:9;;;;;:22;;;17670:4;:9;;17678:1;17670:9;17657:22;:35;;;;17683:4;:9;;17691:1;17683:9;17657:35;17654:74;;;-1:-1:-1;17715:1:0;17654:74;17741:4;:10;;17749:2;17741:10;:24;;;;17755:4;:10;;17763:2;17755:10;17741:24;:38;;;;17769:4;:10;;17777:2;17769:10;17741:38;17738:77;;;-1:-1:-1;17802:1:0;17738:77;17828:4;:10;;17836:2;17828:10;:24;;;;17842:4;:10;;17850:2;17842:10;17828:24;:38;;;;17856:4;:10;;17864:2;17856:10;17828:38;17825:77;;;-1:-1:-1;17889:1:0;17825:77;17915:4;:10;;17923:2;17915:10;:24;;;;17929:4;:10;;17937:2;17929:10;17915:24;:38;;;;17943:4;:10;;17951:2;17943:10;17915:38;17912:77;;;-1:-1:-1;17976:1:0;17912:77;18002:4;:10;;18010:2;18002:10;:24;;;;18016:4;:10;;18024:2;18016:10;18002:24;:38;;;;18030:4;:10;;18038:2;18030:10;18002:38;17999:77;;;-1:-1:-1;18063:1:0;17999:77;18089:4;:10;;18097:2;18089:10;:24;;;;18103:4;:10;;18111:2;18103:10;18089:24;:38;;;;18117:4;:10;;18125:2;18117:10;18089:38;18086:78;;;-1:-1:-1;18150:2:0;18086:78;18174:16;18220:1;18198:19;18214:3;18198:13;:19;:::i;:::-;:23;;;;:::i;:::-;18193:29;;:2;:29;:::i;:::-;18174:48;17532:724;-1:-1:-1;;;;;17532:724:0:o;16837:689::-;17066:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17066:64:0;-1:-1:-1;;;17066:64:0;;;17050:81;;16900:5;;;;;;-1:-1:-1;;;;;17050:15:0;;;:81;;17066:64;17050:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17014:117;;;;17146:7;:28;;;;;17172:2;17157:4;:11;:17;;17146:28;17142:107;;;-1:-1:-1;17236:1:0;;16837:689;-1:-1:-1;;;16837:689:0:o;17142:107::-;17323:56;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17323:56:0;-1:-1:-1;;;17323:56:0;;;17307:73;;-1:-1:-1;;;;;17307:15:0;;;:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17289:91:0;;-1:-1:-1;17289:91:0;-1:-1:-1;17289:91:0;17395:28;;;;;17421:2;17406:4;:11;:17;;17395:28;17391:107;;;-1:-1:-1;17485:1:0;;16837:689;-1:-1:-1;;;16837:689:0:o;17391:107::-;-1:-1:-1;17517:1:0;;16837:689;-1:-1:-1;;;16837:689:0:o;14:163:1:-;81:20;;141:10;130:22;;120:33;;110:61;;167:1;164;157:12;110:61;14:163;;;:::o;182:184::-;240:6;293:2;281:9;272:7;268:23;264:32;261:52;;;309:1;306;299:12;261:52;332:28;350:9;332:28;:::i;648:131::-;-1:-1:-1;;;;;723:31:1;;713:42;;703:70;;769:1;766;759:12;703:70;648:131;:::o;784:315::-;852:6;860;913:2;901:9;892:7;888:23;884:32;881:52;;;929:1;926;919:12;881:52;965:9;952:23;942:33;;1025:2;1014:9;1010:18;997:32;1038:31;1063:5;1038:31;:::i;:::-;1088:5;1078:15;;;784:315;;;;;:::o;1104:515::-;1177:6;1185;1193;1246:2;1234:9;1225:7;1221:23;1217:32;1214:52;;;1262:1;1259;1252:12;1214:52;1285:28;1303:9;1285:28;:::i;:::-;1275:38;;1363:2;1352:9;1348:18;1335:32;1407:8;1400:5;1396:20;1389:5;1386:31;1376:59;;1431:1;1428;1421:12;1376:59;1454:5;-1:-1:-1;1511:2:1;1496:18;;1483:32;1557:1;1546:22;;;1534:35;;1524:63;;1583:1;1580;1573:12;1524:63;1606:7;1596:17;;;1104:515;;;;;:::o;1624:602::-;1709:6;1717;1725;1733;1786:3;1774:9;1765:7;1761:23;1757:33;1754:53;;;1803:1;1800;1793:12;1754:53;1842:9;1829:23;1861:31;1886:5;1861:31;:::i;:::-;1911:5;-1:-1:-1;1968:2:1;1953:18;;1940:32;1981:33;1940:32;1981:33;:::i;:::-;2033:7;-1:-1:-1;2092:2:1;2077:18;;2064:32;2105:33;2064:32;2105:33;:::i;:::-;2157:7;-1:-1:-1;2183:37:1;2216:2;2201:18;;2183:37;:::i;:::-;2173:47;;1624:602;;;;;;;:::o;2569:180::-;2628:6;2681:2;2669:9;2660:7;2656:23;2652:32;2649:52;;;2697:1;2694;2687:12;2649:52;-1:-1:-1;2720:23:1;;2569:180;-1:-1:-1;2569:180:1:o;2962:251::-;3032:6;3085:2;3073:9;3064:7;3060:23;3056:32;3053:52;;;3101:1;3098;3091:12;3053:52;3133:9;3127:16;3152:31;3177:5;3152:31;:::i;3218:188::-;3297:13;;-1:-1:-1;;;;;3339:42:1;;3329:53;;3319:81;;3396:1;3393;3386:12;3411:293;3490:6;3498;3551:2;3539:9;3530:7;3526:23;3522:32;3519:52;;;3567:1;3564;3557:12;3519:52;3590:40;3620:9;3590:40;:::i;:::-;3580:50;;3649:49;3694:2;3683:9;3679:18;3649:49;:::i;:::-;3639:59;;3411:293;;;;;:::o;3709:208::-;3779:6;3832:2;3820:9;3811:7;3807:23;3803:32;3800:52;;;3848:1;3845;3838:12;3800:52;3871:40;3901:9;3871:40;:::i;3922:526::-;4028:6;4036;4044;4052;4060;4113:3;4101:9;4092:7;4088:23;4084:33;4081:53;;;4130:1;4127;4120:12;4081:53;4153:40;4183:9;4153:40;:::i;:::-;4143:50;;4212:49;4257:2;4246:9;4242:18;4212:49;:::i;:::-;4202:59;;4280:49;4325:2;4314:9;4310:18;4280:49;:::i;:::-;4270:59;;4348:49;4393:2;4382:9;4378:18;4348:49;:::i;:::-;4338:59;;4437:3;4426:9;4422:19;4416:26;4406:36;;3922:526;;;;;;;;:::o;4453:273::-;4521:6;4574:2;4562:9;4553:7;4549:23;4545:32;4542:52;;;4590:1;4587;4580:12;4542:52;4622:9;4616:16;4672:4;4665:5;4661:16;4654:5;4651:27;4641:55;;4692:1;4689;4682:12;4731:127;4792:10;4787:3;4783:20;4780:1;4773:31;4823:4;4820:1;4813:15;4847:4;4844:1;4837:15;4863:416;4952:1;4989:5;4952:1;5003:270;5024:7;5014:8;5011:21;5003:270;;;5083:4;5079:1;5075:6;5071:17;5065:4;5062:27;5059:53;;;5092:18;;:::i;:::-;5142:7;5132:8;5128:22;5125:55;;;5162:16;;;;5125:55;5241:22;;;;5201:15;;;;5003:270;;;5007:3;4863:416;;;;;:::o;5284:806::-;5333:5;5363:8;5353:80;;-1:-1:-1;5404:1:1;5418:5;;5353:80;5452:4;5442:76;;-1:-1:-1;5489:1:1;5503:5;;5442:76;5534:4;5552:1;5547:59;;;;5620:1;5615:130;;;;5527:218;;5547:59;5577:1;5568:10;;5591:5;;;5615:130;5652:3;5642:8;5639:17;5636:43;;;5659:18;;:::i;:::-;-1:-1:-1;;5715:1:1;5701:16;;5730:5;;5527:218;;5829:2;5819:8;5816:16;5810:3;5804:4;5801:13;5797:36;5791:2;5781:8;5778:16;5773:2;5767:4;5764:12;5760:35;5757:77;5754:159;;;-1:-1:-1;5866:19:1;;;5898:5;;5754:159;5945:34;5970:8;5964:4;5945:34;:::i;:::-;6015:6;6011:1;6007:6;6003:19;5994:7;5991:32;5988:58;;;6026:18;;:::i;:::-;6064:20;;5284:806;-1:-1:-1;;;5284:806:1:o;6095:140::-;6153:5;6182:47;6223:4;6213:8;6209:19;6203:4;6182:47;:::i;6422:184::-;6492:6;6545:2;6533:9;6524:7;6520:23;6516:32;6513:52;;;6561:1;6558;6551:12;6513:52;-1:-1:-1;6584:16:1;;6422:184;-1:-1:-1;6422:184:1:o;7049:168::-;7122:9;;;7153;;7170:15;;;7164:22;;7150:37;7140:71;;7191:18;;:::i;7222:217::-;7262:1;7288;7278:132;;7332:10;7327:3;7323:20;7320:1;7313:31;7367:4;7364:1;7357:15;7395:4;7392:1;7385:15;7278:132;-1:-1:-1;7424:9:1;;7222:217::o;7633:127::-;7694:10;7689:3;7685:20;7682:1;7675:31;7725:4;7722:1;7715:15;7749:4;7746:1;7739:15;7765:275;7836:2;7830:9;7901:2;7882:13;;-1:-1:-1;;7878:27:1;7866:40;;7936:18;7921:34;;7957:22;;;7918:62;7915:88;;;7983:18;;:::i;:::-;8019:2;8012:22;7765:275;;-1:-1:-1;7765:275:1:o;8045:183::-;8105:4;8138:18;8130:6;8127:30;8124:56;;;8160:18;;:::i;:::-;-1:-1:-1;8205:1:1;8201:14;8217:4;8197:25;;8045:183::o;8233:665::-;8298:5;8351:3;8344:4;8336:6;8332:17;8328:27;8318:55;;8369:1;8366;8359:12;8318:55;8398:6;8392:13;8424:4;8448:60;8464:43;8504:2;8464:43;:::i;:::-;8448:60;:::i;:::-;8530:3;8554:2;8549:3;8542:15;8582:4;8577:3;8573:14;8566:21;;8639:4;8633:2;8630:1;8626:10;8618:6;8614:23;8610:34;8596:48;;8667:3;8659:6;8656:15;8653:35;;;8684:1;8681;8674:12;8653:35;8720:4;8712:6;8708:17;8734:135;8750:6;8745:3;8742:15;8734:135;;;8816:10;;8804:23;;8847:12;;;;8767;;8734:135;;;-1:-1:-1;8887:5:1;8233:665;-1:-1:-1;;;;;;8233:665:1:o;8903:363::-;8998:6;9051:2;9039:9;9030:7;9026:23;9022:32;9019:52;;;9067:1;9064;9057:12;9019:52;9100:9;9094:16;9133:18;9125:6;9122:30;9119:50;;;9165:1;9162;9155:12;9119:50;9188:72;9252:7;9243:6;9232:9;9228:22;9188:72;:::i;:::-;9178:82;8903:363;-1:-1:-1;;;;8903:363:1:o;9271:740::-;9336:5;9389:3;9382:4;9374:6;9370:17;9366:27;9356:55;;9407:1;9404;9397:12;9356:55;9436:6;9430:13;9462:4;9486:60;9502:43;9542:2;9502:43;:::i;9486:60::-;9568:3;9592:2;9587:3;9580:15;9620:4;9615:3;9611:14;9604:21;;9677:4;9671:2;9668:1;9664:10;9656:6;9652:23;9648:34;9634:48;;9705:3;9697:6;9694:15;9691:35;;;9722:1;9719;9712:12;9691:35;9758:4;9750:6;9746:17;9772:210;9788:6;9783:3;9780:15;9772:210;;;9861:3;9855:10;9878:31;9903:5;9878:31;:::i;:::-;9922:18;;9960:12;;;;9805;;9772:210;;10016:675;10154:6;10162;10170;10223:2;10211:9;10202:7;10198:23;10194:32;10191:52;;;10239:1;10236;10229:12;10191:52;10272:9;10266:16;10301:18;10342:2;10334:6;10331:14;10328:34;;;10358:1;10355;10348:12;10328:34;10381:72;10445:7;10436:6;10425:9;10421:22;10381:72;:::i;:::-;10371:82;;10499:2;10488:9;10484:18;10478:25;10462:41;;10528:2;10518:8;10515:16;10512:36;;;10544:1;10541;10534:12;10512:36;;10567:74;10633:7;10622:8;10611:9;10607:24;10567:74;:::i;:::-;10557:84;;;10681:2;10670:9;10666:18;10660:25;10650:35;;10016:675;;;;;:::o;10696:127::-;10757:10;10752:3;10748:20;10745:1;10738:31;10788:4;10785:1;10778:15;10812:4;10809:1;10802:15;10828:175;10865:3;10909:4;10902:5;10898:16;10938:4;10929:7;10926:17;10923:43;;10946:18;;:::i;:::-;10995:1;10982:15;;10828:175;-1:-1:-1;;10828:175:1:o;11008:363::-;11103:6;11156:2;11144:9;11135:7;11131:23;11127:32;11124:52;;;11172:1;11169;11162:12;11124:52;11205:9;11199:16;11238:18;11230:6;11227:30;11224:50;;;11270:1;11267;11260:12;11224:50;11293:72;11357:7;11348:6;11337:9;11333:22;11293:72;:::i;11376:614::-;11505:6;11513;11566:2;11554:9;11545:7;11541:23;11537:32;11534:52;;;11582:1;11579;11572:12;11534:52;11615:9;11609:16;11644:18;11685:2;11677:6;11674:14;11671:34;;;11701:1;11698;11691:12;11671:34;11724:72;11788:7;11779:6;11768:9;11764:22;11724:72;:::i;:::-;11714:82;;11842:2;11831:9;11827:18;11821:25;11805:41;;11871:2;11861:8;11858:16;11855:36;;;11887:1;11884;11877:12;11855:36;;11910:74;11976:7;11965:8;11954:9;11950:24;11910:74;:::i;:::-;11900:84;;;11376:614;;;;;:::o;12299:192::-;12378:13;;-1:-1:-1;;;;;12420:46:1;;12410:57;;12400:85;;12481:1;12478;12471:12;12496:378;12584:6;12592;12600;12653:2;12641:9;12632:7;12628:23;12624:32;12621:52;;;12669:1;12666;12659:12;12621:52;12692:40;12722:9;12692:40;:::i;:::-;12682:50;;12751:49;12796:2;12785:9;12781:18;12751:49;:::i;:::-;12741:59;;12819:49;12864:2;12853:9;12849:18;12819:49;:::i;:::-;12809:59;;12496:378;;;;;:::o;13458:166::-;13536:13;;13589:2;13578:21;;;13568:32;;13558:60;;13614:1;13611;13604:12;13629:443;13712:6;13720;13728;13781:2;13769:9;13760:7;13756:23;13752:32;13749:52;;;13797:1;13794;13787:12;13749:52;13820:39;13849:9;13820:39;:::i;:::-;13810:49;;13878:48;13922:2;13911:9;13907:18;13878:48;:::i;:::-;13868:58;;13969:2;13958:9;13954:18;13948:25;14016:5;14009:13;14002:21;13995:5;13992:32;13982:60;;14038:1;14035;14028:12;14472:412;14601:3;14639:6;14633:13;14664:1;14674:129;14688:6;14685:1;14682:13;14674:129;;;14786:4;14770:14;;;14766:25;;14760:32;14747:11;;;14740:53;14703:12;14674:129;;;-1:-1:-1;14858:1:1;14822:16;;14847:13;;;-1:-1:-1;14822:16:1;14472:412;-1:-1:-1;14472:412:1:o;15168:245::-;15247:6;15255;15308:2;15296:9;15287:7;15283:23;15279:32;15276:52;;;15324:1;15321;15314:12;15276:52;-1:-1:-1;;15347:16:1;;15403:2;15388:18;;;15382:25;15347:16;;15382:25;;-1:-1:-1;15168:245:1:o;16760:148::-;16848:4;16827:12;;;16841;;;16823:31;;16866:13;;16863:39;;;16882:18;;:::i;16913:151::-;17003:4;16996:12;;;16982;;;16978:31;;17021:14;;17018:40;;;17038:18;;:::i

Swarm Source

ipfs://4a952d92e9a268236e90d8f2d6ab23473ef99a632d9d2856ba22b5ac6c1e2e73

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  ]

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.