POL Price: $0.220744 (+4.63%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Pause227616362021-12-20 20:02:341219 days ago1640030554IN
Gains Network: Callbacks 1
0 POL0.0099198300
Pause207026682021-10-28 12:20:291272 days ago1635423629IN
Gains Network: Callbacks 1
0 POL0.0099198300
Pause207024282021-10-28 12:10:051272 days ago1635423005IN
Gains Network: Callbacks 1
0 POL0.0099198300
Pause202092572021-10-14 12:21:501286 days ago1634214110IN
Gains Network: Callbacks 1
0 POL0.0099198300
Pause201508052021-10-12 21:34:341288 days ago1634074474IN
Gains Network: Callbacks 1
0 POL0.0099198300

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

Contract Source Code Verified (Exact Match)

Contract Name:
GFarmTradingCallbacksV5

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-10-12
*/

// File: contracts\interfaces\UniswapRouterInterfaceV5.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

interface UniswapRouterInterfaceV5{
	function swapExactTokensForTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);

	function swapTokensForExactTokens(
		uint amountOut,
		uint amountInMax,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);
}

// File: contracts\interfaces\AggregatorInterfaceV5.sol

pragma solidity 0.8.7;

interface AggregatorInterfaceV5{
    enum OrderType { MARKET_OPEN, MARKET_CLOSE, LIMIT_OPEN, LIMIT_CLOSE }
    function getPrice(uint,OrderType,uint) external returns(uint);
    function tokenPriceDai() external view returns(uint);
    function pairMinOpenLimitSlippageP(uint) external view returns(uint);
    function closeFeeP(uint) external view returns(uint);
    function linkFee(uint,uint) external view returns(uint);
    function openFeeP(uint) external view returns(uint);
    function pairMinLeverage(uint) external view returns(uint);
    function pairMaxLeverage(uint) external view returns(uint);
    function pairsCount() external view returns(uint);
    function tokenDaiReservesLp() external view returns(uint, uint);
    function referralP(uint) external view returns(uint);
    function nftLimitOrderFeeP(uint) external view returns(uint);
}

// File: contracts\interfaces\TokenInterfaceV5.sol

pragma solidity 0.8.7;

interface TokenInterfaceV5{
    function burn(address, uint256) external;
    function mint(address, uint256) external;
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns(bool);
    function balanceOf(address) external view returns(uint256);
    function hasRole(bytes32, address) external view returns (bool);
    function approve(address, uint256) external returns (bool);
    function allowance(address, address) external view returns (uint256);
}

// File: contracts\interfaces\NftInterfaceV5.sol

pragma solidity 0.8.7;

interface NftInterfaceV5{
    function balanceOf(address) external view returns (uint);
    function ownerOf(uint) external view returns (address);
    function transferFrom(address, address, uint) external;
    function tokenOfOwnerByIndex(address, uint) external view returns(uint);
}

// File: contracts\interfaces\VaultInterfaceV5.sol

pragma solidity 0.8.7;

interface VaultInterfaceV5{
	function sendDaiToTrader(address, uint) external;
}

// File: contracts\interfaces\StorageInterfaceV5.sol

pragma solidity 0.8.7;






interface StorageInterfaceV5{
    enum LimitOrder { TP, SL, LIQ, OPEN }
    struct Trader{
        uint leverageUnlocked;
        address referral;
        uint referralRewardsTotal;  // 1e18
    }
    struct Trade{
        address trader;
        uint pairIndex;
        uint index;
        uint initialPosToken;       // 1e18
        uint positionSizeDai;       // 1e18
        uint openPrice;             // PRECISION
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION
        uint sl;                    // PRECISION
    }
    struct TradeInfo{
        uint tokenId;
        uint tokenPriceDai;         // PRECISION
        uint openInterestDai;       // 1e18
        uint tpLastUpdated;
        uint slLastUpdated;
        bool beingMarketClosed;
    }
    struct OpenLimitOrder{
        address trader;
        uint pairIndex;
        uint index;
        uint positionSize;          // 1e18 (DAI or GFARM2)
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION (%)
        uint sl;                    // PRECISION (%)
        uint minPrice;              // PRECISION
        uint maxPrice;              // PRECISION
        uint block;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingMarketOrder{
        Trade trade;
        uint block;
        uint wantedPrice;           // PRECISION
        uint slippageP;             // PRECISION (%)
        uint spreadReductionP;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingNftOrder{
        address nftHolder;
        uint nftId;
        address trader;
        uint pairIndex;
        uint index;
        LimitOrder orderType;
    }
    function PRECISION() external pure returns(uint);
    function gov() external view returns(address);
    function dev() external view returns(address);
    function dai() external view returns(TokenInterfaceV5);
    function token() external view returns(TokenInterfaceV5);
    function linkErc677() external view returns(TokenInterfaceV5);
    function tokenDaiRouter() external view returns(UniswapRouterInterfaceV5);
    function priceAggregator() external view returns(AggregatorInterfaceV5);
    function vault() external view returns(VaultInterfaceV5);
    function trading() external view returns(address);
    function callbacks() external view returns(address);
    function handleTokens(address,uint,bool) external;
    function transferDai(address, address, uint) external;
    function transferLinkToAggregator(address, uint, uint) external;
    function unregisterTrade(address, uint, uint) external;
    function unregisterPendingMarketOrder(uint, bool) external;
    function unregisterOpenLimitOrder(address, uint, uint) external;
    function hasOpenLimitOrder(address, uint, uint) external view returns(bool);
    function storePendingMarketOrder(PendingMarketOrder memory, uint, bool) external;
    function storeReferral(address, address) external;
    function openTrades(address, uint, uint) external view returns(Trade memory);
    function openTradesInfo(address, uint, uint) external view returns(TradeInfo memory);
    function updateSl(address, uint, uint, uint) external;
    function updateTp(address, uint, uint, uint) external;
    function getOpenLimitOrder(address, uint, uint) external view returns(OpenLimitOrder memory);
    function spreadReductionsP(uint) external view returns(uint);
    function positionSizeTokenDynamic(uint,uint) external view returns(uint);
    function maxSlP() external view returns(uint);
    function storeOpenLimitOrder(OpenLimitOrder memory) external;
    function reqID_pendingMarketOrder(uint) external view returns(PendingMarketOrder memory);
    function storePendingNftOrder(PendingNftOrder memory, uint) external;
    function updateOpenLimitOrder(OpenLimitOrder calldata) external;
    function firstEmptyTradeIndex(address, uint) external view returns(uint);
    function firstEmptyOpenLimitIndex(address, uint) external view returns(uint);
    function increaseNftRewards(uint, uint) external;
    function nftSuccessTimelock() external view returns(uint);
    function currentPercentProfit(uint,uint,bool,uint) external view returns(int);
    function reqID_pendingNftOrder(uint) external view returns(PendingNftOrder memory);
    function setNftLastSuccess(uint) external;
    function updateTrade(Trade memory) external;
    function nftLastSuccess(uint) external view returns(uint);
    function unregisterPendingNftOrder(uint) external;
    function handleDevGovFees(uint, uint, bool, bool) external returns(uint);
    function distributeLpRewards(uint) external;
    function getReferral(address) external view returns(address);
    function increaseReferralRewards(address, uint) external;
    function storeTrade(Trade memory, TradeInfo memory) external;
    function setLeverageUnlocked(address, uint) external;
    function getLeverageUnlocked(address) external view returns(uint);
    function openLimitOrdersCount(address, uint) external view returns(uint);
    function maxOpenLimitOrdersPerPair() external view returns(uint);
    function openTradesCount(address, uint) external view returns(uint);
    function pendingMarketOpenCount(address, uint) external view returns(uint);
    function pendingMarketCloseCount(address, uint) external view returns(uint);
    function maxTradesPerPair() external view returns(uint);
    function maxTradesPerBlock() external view returns(uint);
    function tradesPerBlock(uint) external view returns(uint);
    function pendingOrderIdsCount(address) external view returns(uint);
    function maxPendingMarketOrders() external view returns(uint);
    function maxGainP() external view returns(uint);
    function defaultLeverageUnlocked() external view returns(uint);
    function openInterestDai(uint, uint) external view returns(uint);
    function getPendingOrderIds(address) external view returns(uint[] memory);
    function traders(address) external view returns(Trader memory);
    function nfts(uint) external view returns(NftInterfaceV5);
}

// File: contracts\GFarmTradingCallbacksV5.sol


pragma solidity 0.8.7;

contract GFarmTradingCallbacksV5{

    // Constants
    uint public constant LIQ_THRESHOLD = 90;   // -90% PNL

    // Is contract active
    bool public isPaused;

    // Trading storage
    StorageInterfaceV5 public storageT;

    // Structs
    struct AggregatorAnswer{
        uint order;
        uint price;
        uint spreadP;
    }

    // Events
    event MarketExecuted(
        uint orderId,
        StorageInterfaceV5.Trade t,
        bool open,
        uint price,
        uint positionSizeDai,
        int percentProfit,
        uint tokenPriceDai
    );
    event LimitExecuted(
        uint orderId,
        uint limitIndex,
        StorageInterfaceV5.Trade t,
        StorageInterfaceV5.TradeInfo tInfo,
        address indexed nftHolder,
        StorageInterfaceV5.LimitOrder orderType,
        uint price,
        uint positionSizeDai,
        int percentProfit,
        uint tokenPriceDai
    );
    event MarketCanceled(
        uint orderId,
        address indexed trader,
        uint indexed pairIndex,
        uint wantedPrice,
        uint currentPrice,
        uint slippageToleranceP
    );
    event TradeUpdatedMarketClosed(
        uint orderId,
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );
    event AddressUpdated(string name, address a);
    event NumberUpdated(string name,uint value);
    event Pause(bool paused);

    constructor(StorageInterfaceV5 _storageT) {
        require(address(_storageT) != address(0), "ADDRESS_0");
        storageT = _storageT;
    }

    // Modifiers
    modifier onlyGov(){ require(msg.sender == storageT.gov(), "GOV_ONLY"); _; }
    modifier onlyPriceAggregator(){ require(msg.sender == address(storageT.priceAggregator()), "AGGREGATOR_ONLY"); _; }
    modifier notPaused(){ require(!isPaused, "PAUSED"); _; }

    // Manage trading storage address
    // CAREFUL: IF ADDRESS WRONG, CONTRACT CAN BE STUCK
    function setStorageT(StorageInterfaceV5 _storageT) external onlyGov{
        require(_storageT.gov() == storageT.gov(), "WRONG_CONTRACT");
        storageT = _storageT;
        emit AddressUpdated("storageT", address(_storageT));
    }

    // Prevent doing anything => during contracts update
    function pause() external onlyGov{ isPaused = !isPaused; emit Pause(isPaused); }

    // Called by oracle node to execute the open market order
    function openTradeMarketCallback(AggregatorAnswer memory a) external onlyPriceAggregator notPaused{

        StorageInterfaceV5.PendingMarketOrder memory o = storageT.reqID_pendingMarketOrder(a.order);
        if(o.block == 0){ return; }

        uint PRECISION = storageT.PRECISION();
        a.spreadP -= a.spreadP * o.spreadReductionP / 100;

        uint priceDiff = a.price * a.spreadP / 100 / PRECISION;
        uint maxSlippage = o.wantedPrice * o.slippageP / 100 / PRECISION;
        
        StorageInterfaceV5.Trade memory t = o.trade;
        t.openPrice = t.buy ? a.price + priceDiff : a.price - priceDiff;

        // 1. Cancel because of slippage or tp/sl already reached or market closed or above max open interest
        if(t.buy && t.openPrice > o.wantedPrice + maxSlippage
        || !t.buy && t.openPrice < o.wantedPrice - maxSlippage
        || t.tp > 0 && t.buy && t.openPrice >= t.tp
        || t.sl > 0 && t.buy && t.openPrice <= t.sl
        || t.tp > 0 && !t.buy && t.openPrice <= t.tp
        || t.sl > 0 && !t.buy && t.openPrice >= t.sl
        || a.price == 0
        || storageT.openInterestDai(t.pairIndex, t.buy ? 0 : 1) + t.positionSizeDai * t.leverage > storageT.openInterestDai(t.pairIndex, 2)){

            t.positionSizeDai -= storageT.handleDevGovFees(
                t.pairIndex, 
                t.positionSizeDai * t.leverage, 
                true, 
                true
            );
            storageT.transferDai(address(storageT), t.trader, t.positionSizeDai);

            emit MarketCanceled(
                a.order,
                t.trader,
                t.pairIndex,
                o.wantedPrice,
                t.openPrice,
                o.slippageP
            );

        // 2. Register the trade (swap DAI pos to GFARM2)
        }else{
            t.index = storageT.firstEmptyTradeIndex(t.trader, t.pairIndex);
            t.tp = correctTp(t.openPrice, t.leverage, t.tp, t.buy);
            t.sl = correctSl(t.openPrice, t.leverage, t.sl, t.buy);

            registerTrade(
                t, 
                storageT.getReferral(t.trader), 
                address(0), 
                0
            );

            StorageInterfaceV5.Trade memory finalTrade = storageT.openTrades(t.trader, t.pairIndex, t.index);
            StorageInterfaceV5.TradeInfo memory finalTradeInfo = storageT.openTradesInfo(t.trader, t.pairIndex, t.index);
            emit MarketExecuted(
                a.order,
                finalTrade,
                true,
                finalTrade.openPrice,
                finalTrade.initialPosToken * finalTradeInfo.tokenPriceDai / PRECISION,
                0,
                finalTradeInfo.tokenPriceDai
            );

        }

        storageT.unregisterPendingMarketOrder(a.order, true);
    }

    // Called by oracle node to execute the close market order
    function closeTradeMarketCallback(AggregatorAnswer memory a) external onlyPriceAggregator notPaused{
        
        StorageInterfaceV5.PendingMarketOrder memory o = storageT.reqID_pendingMarketOrder(a.order);
        if(o.block == 0){ return; }

        uint PRECISION = storageT.PRECISION();
        StorageInterfaceV5.Trade memory t = storageT.openTrades(o.trade.trader, o.trade.pairIndex, o.trade.index);
        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(o.trade.trader, o.trade.pairIndex, o.trade.index);

        uint posTokenDynamic = t.initialPosToken * i.tokenPriceDai / storageT.priceAggregator().tokenPriceDai();

        // 1. If market closed => simply take dev/gov fees and reduce position size token
        if(a.price == 0){

            uint feeToken = storageT.handleDevGovFees(
                t.pairIndex, 
                posTokenDynamic * t.leverage,
                false,
                true
            );

            if(t.initialPosToken > feeToken){
                t.initialPosToken -= feeToken;
                storageT.updateTrade(t);
            }else{
                storageT.unregisterTrade(t.trader, t.pairIndex, t.index);
            }

            emit TradeUpdatedMarketClosed(a.order, t.trader, t.pairIndex, t.index);

        // 2. If trade not already closed => close it
        }else if(t.leverage > 0){

            int percentProfit = currentPercentProfit(t.openPrice, a.price, t.buy, t.leverage);

            // 3. Send tokens back => mint/burn GFARM2 PnL & Pos
            handleTokensBack(
                t.trader,
                percentProfit,
                t.initialPosToken * i.tokenPriceDai / PRECISION,
                0,
                posTokenDynamic * t.leverage * storageT.priceAggregator().closeFeeP(t.pairIndex) / 100 / PRECISION
            );

            emit MarketExecuted(
                a.order,
                t,
                false,
                a.price,
                t.initialPosToken * i.tokenPriceDai / PRECISION,
                percentProfit,
                storageT.priceAggregator().tokenPriceDai()
            );

            storageT.unregisterTrade(t.trader, t.pairIndex, t.index);
        }

        storageT.unregisterPendingMarketOrder(a.order, false);
    }

    // Called by oracle node to execute open limit order
    function executeNftOpenOrderCallback(AggregatorAnswer memory a) external onlyPriceAggregator notPaused{

        StorageInterfaceV5.PendingNftOrder memory nftOrder = storageT.reqID_pendingNftOrder(a.order);
        if(nftOrder.trader == address(0)){ return; }

        // 1. If limit order not already triggered and nft not in timelock and market open
        if(storageT.hasOpenLimitOrder(nftOrder.trader, nftOrder.pairIndex, nftOrder.index)
        && block.number >= storageT.nftLastSuccess(nftOrder.nftId) + storageT.nftSuccessTimelock()
        && a.price != 0){

            StorageInterfaceV5.OpenLimitOrder memory o = storageT.getOpenLimitOrder(
                nftOrder.trader, 
                nftOrder.pairIndex,
                nftOrder.index
            );

            uint PRECISION = storageT.PRECISION();

            a.spreadP -= a.spreadP * o.spreadReductionP / 100;
            a.price = o.buy ? a.price + a.price * a.spreadP / 100 / PRECISION 
                            : a.price - a.price * a.spreadP / 100 / PRECISION;

            o.tp = correctTp(a.price, o.leverage, o.tp, o.buy);
            o.sl = correctSl(a.price, o.leverage, o.sl, o.buy);

            // 2. If limit order can be triggered
            if(a.price >= o.minPrice && a.price <= o.maxPrice
            && storageT.openInterestDai(o.pairIndex, o.buy ? 0 : 1) + o.positionSize * o.leverage <= storageT.openInterestDai(o.pairIndex, 2)){
                uint index = storageT.firstEmptyTradeIndex(o.trader, o.pairIndex);

                // 3. Trigger it (swap DAI pos to GFARM2)
                registerTrade(
                    StorageInterfaceV5.Trade(
                        o.trader,
                        o.pairIndex,
                        index,
                        0,
                        o.positionSize,
                        a.price,
                        o.buy,
                        o.leverage,
                        o.tp,
                        o.sl
                    ), 
                    storageT.getReferral(o.trader), 
                    nftOrder.nftHolder,
                    nftOrder.nftId
                );

                storageT.unregisterOpenLimitOrder(o.trader, o.pairIndex, o.index);
                StorageInterfaceV5.Trade memory finalTrade = storageT.openTrades(o.trader, o.pairIndex, index);
                StorageInterfaceV5.TradeInfo memory finalTradeInfo = storageT.openTradesInfo(o.trader, o.pairIndex, index);

                emit LimitExecuted(
                    a.order,
                    nftOrder.index,
                    finalTrade,
                    finalTradeInfo,
                    nftOrder.nftHolder,
                    StorageInterfaceV5.LimitOrder.OPEN,
                    finalTrade.openPrice,
                    finalTrade.initialPosToken * finalTradeInfo.tokenPriceDai / PRECISION,
                    0,
                    finalTradeInfo.tokenPriceDai
                );
            }
        }
        storageT.unregisterPendingNftOrder(a.order);
    }

    // Called by oracle node to execute close limit order
    function executeNftCloseOrderCallback(AggregatorAnswer memory a) external onlyPriceAggregator notPaused{
        
        StorageInterfaceV5.PendingNftOrder memory o = storageT.reqID_pendingNftOrder(a.order);
        if(o.trader == address(0)){ return; }

        StorageInterfaceV5.Trade memory t = storageT.openTrades(o.trader, o.pairIndex, o.index);
        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(o.trader, o.pairIndex, o.index);

        // 1. If trade still open and nft not in timelock and market open
        if(t.leverage > 0 && block.number >= storageT.nftLastSuccess(o.nftId) + storageT.nftSuccessTimelock()
        && a.price != 0){ 

            int percentProfit = currentPercentProfit(
                t.openPrice, 
                a.price, 
                t.buy, 
                t.leverage
            );
            uint posTokenDynamic = t.initialPosToken * i.tokenPriceDai / storageT.priceAggregator().tokenPriceDai();

            uint amountNftToken = 
                (o.orderType == StorageInterfaceV5.LimitOrder.TP && t.tp > 0 && t.buy && a.price >= t.tp)
             || (o.orderType == StorageInterfaceV5.LimitOrder.TP && t.tp > 0 && !t.buy && a.price <= t.tp)
             || (o.orderType == StorageInterfaceV5.LimitOrder.SL && t.sl > 0 && t.buy && a.price <= t.sl)
             || (o.orderType == StorageInterfaceV5.LimitOrder.SL && t.sl > 0 && !t.buy && a.price >= t.sl)
               ? storageT.priceAggregator().nftLimitOrderFeeP(t.pairIndex) * posTokenDynamic * t.leverage / 100 / storageT.PRECISION()
               : o.orderType == StorageInterfaceV5.LimitOrder.LIQ 
              && percentProfit <= int(LIQ_THRESHOLD*storageT.PRECISION()) * (-1) ? posTokenDynamic / 20 : 0;

            // 2. If limit order can be triggered
            if(amountNftToken > 0){

                storageT.handleTokens(o.nftHolder, amountNftToken, true); 
                storageT.increaseNftRewards(o.nftId, amountNftToken);

                // 3. Send tokens back => mint/burn GFARM2 & swap
                handleTokensBack(
                    t.trader,
                    percentProfit,
                    t.initialPosToken * i.tokenPriceDai / storageT.PRECISION(),
                    amountNftToken,
                    o.orderType == StorageInterfaceV5.LimitOrder.LIQ ? amountNftToken // Same rewards as NFT (5%)
                    : posTokenDynamic * t.leverage * storageT.priceAggregator().closeFeeP(t.pairIndex) / 100 / storageT.PRECISION()
                );
                    
                storageT.unregisterTrade(t.trader, t.pairIndex, t.index);

                emit LimitExecuted(
                    a.order,
                    o.index,
                    t,
                    i,
                    o.nftHolder,
                    o.orderType,
                    a.price,
                    t.initialPosToken * i.tokenPriceDai / storageT.PRECISION(),
                    percentProfit,
                    storageT.priceAggregator().tokenPriceDai()
                );
            }
        }

        storageT.unregisterPendingNftOrder(a.order);
    }

    // Trade opening & storing
    function registerTrade(
        StorageInterfaceV5.Trade memory _trade, 
        address _referral,
        address _nftHolder, 
        uint _nftId
    ) private{

        uint PRECISION = storageT.PRECISION();

        // 1. Take fee in DAI => fee DAI stays in storage
        _trade.positionSizeDai -= storageT.handleDevGovFees(
            _trade.pairIndex,
            _trade.positionSizeDai * _trade.leverage,
            true,
            false
        );

        // 2. Transfer position size in DAI - fees to this contract
        storageT.transferDai(address(storageT), address(this), _trade.positionSizeDai);

        // 3. Store price before swap
        uint tokenPriceDaiBeforeSwap = storageT.priceAggregator().tokenPriceDai();

        // 4. Swap position in DAI to GFARM2
        storageT.dai().approve(address(storageT.tokenDaiRouter()), _trade.positionSizeDai);
        uint[] memory amounts = storageT.tokenDaiRouter().swapExactTokensForTokens(
            _trade.positionSizeDai,
            0,
            daiToTokenPath(),
            address(this),
            block.timestamp + 300
        );

        // 5. Position size in DAI is 0
        _trade.positionSizeDai = 0;
        
        // 6. GFARM2 position size is simply the output amount
        _trade.initialPosToken = amounts[1];

        // 7. Burn the whole GFARM2 collateral
        storageT.handleTokens(address(this), _trade.initialPosToken, false);

        // 8. Take fee in GFARM2 (gov & dev)
        _trade.initialPosToken -= storageT.handleDevGovFees(
            _trade.pairIndex,
            _trade.initialPosToken * _trade.leverage,
            false,
            false
        );

        // 9. Distribute rewards to referral or burn them if no referral
        uint referralTokens = _trade.initialPosToken * _trade.leverage * storageT.priceAggregator().referralP(_trade.pairIndex) / PRECISION / 100;
        if(_referral != address(0)){ 
            referralTokens /= 2;
            storageT.handleTokens(_referral, referralTokens, true);
            storageT.increaseReferralRewards(_referral, referralTokens);
        }
        _trade.initialPosToken -= referralTokens;

        // 10. Distribute fees to NFT holder if relevant
        if(_nftHolder != address(0)){
            uint amountNftToken = _trade.initialPosToken * _trade.leverage * storageT.priceAggregator().nftLimitOrderFeeP(_trade.pairIndex) / 100 / PRECISION;
            storageT.handleTokens(_nftHolder, amountNftToken, true);
            storageT.increaseNftRewards(_nftId, amountNftToken);
            _trade.initialPosToken -= amountNftToken;
        }

        // 11. Store trade in storage
        storageT.storeTrade(
            _trade, 
            StorageInterfaceV5.TradeInfo(
                0, 
                tokenPriceDaiBeforeSwap, 
                _trade.initialPosToken*_trade.leverage*tokenPriceDaiBeforeSwap/PRECISION,
                0,
                0,
                false
            )
        );

        // 12. Unlock next leverage
        storageT.setLeverageUnlocked(
            _trade.trader, 
            storageT.getLeverageUnlocked(_trade.trader) == 0 ? 100 : 1000
        );
    }

    // Send tokens to trader & reward liquidity providers
    function handleTokensBack(
        address _trader,
        int _percentProfit,             // PRECISION
        uint _daiPos,                   // 1e18
        uint _amountNftToken,           // 1e18
        uint _lpFee                     // 1e18
    ) private{

        uint PRECISION = storageT.PRECISION();

        // 1. Reward LPs
        storageT.distributeLpRewards(_lpFee);

        // 2. If trade cannot be liquidated
        if(_percentProfit > int(LIQ_THRESHOLD*PRECISION)*(-1)){

            // 3. Calculate PnL in DAI
            int pnlDai = _percentProfit * int(_daiPos) / 100 / int(PRECISION);

            // 4. Deduce LP fee and NFT fee from PnL
            pnlDai -= int((_lpFee + _amountNftToken) * storageT.priceAggregator().tokenPriceDai() / PRECISION);

            // 5. Send DAI from vault to trader
            storageT.vault().sendDaiToTrader(_trader, uint(int(_daiPos) + pnlDai));
        }
    }

    // Utils
    function currentPercentProfit(uint openPrice, uint currentPrice, bool buy, uint leverage) private view returns(int p){
        int PRECISION = int(storageT.PRECISION());
        int maxGainP = int(storageT.maxGainP());
        p = buy ? (int(currentPrice) - int(openPrice)) * 100 * PRECISION * int(leverage) / int(openPrice)
                : (int(openPrice) - int(currentPrice)) * 100 * PRECISION * int(leverage) / int(openPrice);
        p = p < PRECISION * (-100) ? PRECISION * (-100) : p;
        p = p > maxGainP * PRECISION ? maxGainP * PRECISION : p;
    }
    function correctTp(uint openPrice, uint leverage, uint tp, bool buy) private view returns(uint){
        if(tp == 0 || currentPercentProfit(openPrice, tp, buy, leverage) == int(storageT.maxGainP()*storageT.PRECISION())){
            uint tpDiff = openPrice*storageT.maxGainP()/leverage/1e2;
            if(buy){ return openPrice + tpDiff; }
            else if(tpDiff <= openPrice){ return openPrice - tpDiff; }
            else{
                return 0;
            }
        }
        return tp;
    }
    function correctSl(uint openPrice, uint leverage, uint sl, bool buy) private view returns(uint){
        if(sl > 0 && currentPercentProfit(openPrice, sl, buy, leverage) < int(storageT.maxSlP()*storageT.PRECISION()) * (-1)){
            uint slDiff = openPrice*storageT.maxSlP()/leverage/1e2;
            if(buy){ return openPrice - slDiff; }
            else{ return openPrice + slDiff; }
        }
        return sl;
    }
    function daiToTokenPath() private view returns(address[] memory){
        address[] memory path = new address[](2);
        path[0] = address(storageT.dai());
        path[1] = address(storageT.token());
        return path;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract StorageInterfaceV5","name":"_storageT","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"limitIndex","type":"uint256"},{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"indexed":false,"internalType":"struct StorageInterfaceV5.Trade","name":"t","type":"tuple"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenPriceDai","type":"uint256"},{"internalType":"uint256","name":"openInterestDai","type":"uint256"},{"internalType":"uint256","name":"tpLastUpdated","type":"uint256"},{"internalType":"uint256","name":"slLastUpdated","type":"uint256"},{"internalType":"bool","name":"beingMarketClosed","type":"bool"}],"indexed":false,"internalType":"struct StorageInterfaceV5.TradeInfo","name":"tInfo","type":"tuple"},{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":false,"internalType":"enum StorageInterfaceV5.LimitOrder","name":"orderType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"indexed":false,"internalType":"int256","name":"percentProfit","type":"int256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceDai","type":"uint256"}],"name":"LimitExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wantedPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageToleranceP","type":"uint256"}],"name":"MarketCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"indexed":false,"internalType":"struct StorageInterfaceV5.Trade","name":"t","type":"tuple"},{"indexed":false,"internalType":"bool","name":"open","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"indexed":false,"internalType":"int256","name":"percentProfit","type":"int256"},{"indexed":false,"internalType":"uint256","name":"tokenPriceDai","type":"uint256"}],"name":"MarketExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NumberUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"TradeUpdatedMarketClosed","type":"event"},{"inputs":[],"name":"LIQ_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"order","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"spreadP","type":"uint256"}],"internalType":"struct GFarmTradingCallbacksV5.AggregatorAnswer","name":"a","type":"tuple"}],"name":"closeTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"order","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"spreadP","type":"uint256"}],"internalType":"struct GFarmTradingCallbacksV5.AggregatorAnswer","name":"a","type":"tuple"}],"name":"executeNftCloseOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"order","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"spreadP","type":"uint256"}],"internalType":"struct GFarmTradingCallbacksV5.AggregatorAnswer","name":"a","type":"tuple"}],"name":"executeNftOpenOrderCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"order","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"spreadP","type":"uint256"}],"internalType":"struct GFarmTradingCallbacksV5.AggregatorAnswer","name":"a","type":"tuple"}],"name":"openTradeMarketCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract StorageInterfaceV5","name":"_storageT","type":"address"}],"name":"setStorageT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageT","outputs":[{"internalType":"contract StorageInterfaceV5","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620059c5380380620059c58339810160408190526200003491620000a7565b6001600160a01b0381166200007b5760405162461bcd60e51b81526020600482015260096024820152680414444524553535f360bc1b604482015260640160405180910390fd5b600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055620000d9565b600060208284031215620000ba57600080fd5b81516001600160a01b0381168114620000d257600080fd5b9392505050565b6158dc80620000e96000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80638456cb5911610076578063b187bd261161005b578063b187bd2614610136578063b5228d1314610153578063e2f537101461016657600080fd5b80638456cb591461011b57806392818d661461012357600080fd5b806302982635146100a857806316fff074146100bd57806354a67352146100f257806380d670eb14610108575b600080fd5b6100bb6100b6366004615111565b610179565b005b6000546100d59061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100fa605a81565b6040519081526020016100e9565b6100bb610116366004615111565b610d79565b6100bb611d31565b6100bb6101313660046150f4565b611e4f565b6000546101439060ff1681565b60405190151581526020016100e9565b6100bb610161366004615111565b61212d565b6100bb610174366004615111565b612c32565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156101c757600080fd5b505afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190615008565b6001600160a01b0316336001600160a01b0316146102565760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b60448201526064015b60405180910390fd5b60005460ff16156102925760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b6000805482516040516399794d3560e01b815260048101919091526101009091046001600160a01b0316906399794d359060240160c06040518083038186803b1580156102de57600080fd5b505afa1580156102f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031691906152a3565b60408101519091506001600160a01b031661032f575050565b6000546040828101516060840151608085015192517fdcdf339a0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063dcdf339a9060640160206040518083038186803b1580156103b257600080fd5b505afa1580156103c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ea91906150d9565b801561050b5750600060019054906101000a90046001600160a01b03166001600160a01b031663f8d24b486040518163ffffffff1660e01b815260040160206040518083038186803b15801561043f57600080fd5b505afa158015610453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610477919061538a565b600054602083015160405163aa3b7d7760e01b815260048101919091526101009091046001600160a01b03169063aa3b7d779060240160206040518083038186803b1580156104c557600080fd5b505afa1580156104d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fd919061538a565b61050791906156cd565b4310155b801561051a5750602082015115155b15610d0f57600080546040838101516060850151608086015192517fb8878a2c0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063b8878a2c906064016101a06040518083038186803b1580156105a457600080fd5b505afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc919061516d565b905060008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561062d57600080fd5b505afa158015610641573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610665919061538a565b905060648260800151856040015161067d91906157ae565b6106879190615713565b84604001818151610698919061580c565b90525060a08201516106e357806064856040015186602001516106bb91906157ae565b6106c59190615713565b6106cf9190615713565b84602001516106de919061580c565b61071d565b806064856040015186602001516106fa91906157ae565b6107049190615713565b61070e9190615713565b846020015161071d91906156cd565b6020850181905260c083015160e084015160a085015161073f939291906136a5565b8260e001818152505061076584602001518360c001518461010001518560a001516138c1565b61010083015261012082015160208501511080159061078d5750816101400151846020015111155b80156108f5575060005460208301516040516328daca2160e01b81526004810191909152600260248201526101009091046001600160a01b0316906328daca219060440160206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610821919061538a565b8260c00151836060015161083591906157ae565b600060019054906101000a90046001600160a01b03166001600160a01b03166328daca2185602001518660a0015161086e576001610871565b60005b6040516001600160e01b031960e085901b168152600481019290925260ff16602482015260440160206040518083038186803b1580156108b057600080fd5b505afa1580156108c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e8919061538a565b6108f291906156cd565b11155b15610d0c57600080548351602085015160405163292c161760e01b81526001600160a01b0392831660048201526024810191909152610100909204169063292c16179060440160206040518083038186803b15801561095357600080fd5b505afa158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b919061538a565b9050610ab360405180610140016040528085600001516001600160a01b03168152602001856020015181526020018381526020016000815260200185606001518152602001876020015181526020018560a00151151581526020018560c0015181526020018560e001518152602001856101000151815250600060019054906101000a90046001600160a01b03166001600160a01b0316633b0f0f2f86600001516040518263ffffffff1660e01b8152600401610a5791906001600160a01b0391909116815260200190565b60206040518083038186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190615008565b86516020880151613ac7565b6000548351602085015160408087015190517fb4b0f5670000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092526044820152610100909204169063b4b0f56790606401600060405180830381600087803b158015610b3057600080fd5b505af1158015610b44573d6000803e3d6000fd5b505060008054865160208801516040516351d407ff60e11b81526001600160a01b03928316600482015260248101919091526044810187905292945061010090910416915063a3a80ffe906064016101406040518083038186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be3919061536d565b6000805486516020880151604051638c8ff1d560e01b81526001600160a01b039283166004820152602481019190915260448101879052939450919261010090910490911690638c8ff1d59060640160c06040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c82919061531b565b905085600001516001600160a01b03167f15f192ad872076db7d7571711429e445b0eabf30dc598ab77f02cacf622eec8388600001518860800151858560038860a001518b89602001518b60600151610cdb91906157ae565b610ce59190615713565b60208a0151604051610d009897969594939291600091615557565b60405180910390a25050505b50505b600054825160405163201d8bdb60e01b815260048101919091526101009091046001600160a01b03169063201d8bdb90602401600060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b50505050505b50565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190615008565b6001600160a01b0316336001600160a01b031614610e515760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff1615610e8d5760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b6000805482516040516399794d3560e01b815260048101919091526101009091046001600160a01b0316906399794d359060240160c06040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1191906152a3565b60408101519091506001600160a01b0316610f2a575050565b600080546040838101516060850151608086015192516351d407ff60e11b81526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063a3a80ffe906064016101406040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce919061536d565b60008054604085810151606087015160808801519251638c8ff1d560e01b81526001600160a01b0392831660048201526024810191909152604481019290925293945091926101009091041690638c8ff1d59060640160c06040518083038186803b15801561103c57600080fd5b505afa158015611050573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611074919061531b565b905060008260e0015111801561119f5750600060019054906101000a90046001600160a01b03166001600160a01b031663f8d24b486040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061538a565b600054602085015160405163aa3b7d7760e01b815260048101919091526101009091046001600160a01b03169063aa3b7d779060240160206040518083038186803b15801561115957600080fd5b505afa15801561116d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611191919061538a565b61119b91906156cd565b4310155b80156111ae5750602084015115155b15611cc65760006111d18360a0015186602001518560c001518660e00151614874565b905060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561129257600080fd5b505afa1580156112a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ca919061538a565b836020015185606001516112de91906157ae565b6112e89190615713565b90506000808660a0015160038111156113035761130361584f565b14801561131557506000856101000151115b801561132257508460c001515b80156113375750846101000151876020015110155b8061138a575060008660a0015160038111156113555761135561584f565b14801561136757506000856101000151115b801561137557508460c00151155b801561138a5750846101000151876020015111155b806113dc575060018660a0015160038111156113a8576113a861584f565b1480156113ba57506000856101200151115b80156113c757508460c001515b80156113dc5750846101200151876020015111155b8061142f575060018660a0015160038111156113fa576113fa61584f565b14801561140c57506000856101200151115b801561141a57508460c00151155b801561142f5750846101200151876020015110155b61150f5760028660a00151600381111561144b5761144b61584f565b1480156114f45750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a157600080fd5b505afa1580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d9919061538a565b6114e490605a6157ae565b6114f090600019615727565b8313155b6114ff5760006116cc565b61150a601483615713565b6116cc565b600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561155d57600080fd5b505afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611595919061538a565b60648660e0015184600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116239190615008565b6001600160a01b0316637eeeae648a602001516040518263ffffffff1660e01b815260040161165491815260200190565b60206040518083038186803b15801561166c57600080fd5b505afa158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a4919061538a565b6116ae91906157ae565b6116b891906157ae565b6116c29190615713565b6116cc9190615713565b90508015611cc25760005486516040516329bc0a1f60e11b81526001600160a01b03918216600482015260248101849052600160448201526101009092041690635378143e90606401600060405180830381600087803b15801561172f57600080fd5b505af1158015611743573d6000803e3d6000fd5b505060005460208901516040516339caebcf60e11b81526004810191909152602481018590526101009091046001600160a01b03169250637395d79e9150604401600060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b50505050611a48856000015184600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611845919061538a565b8760200151896060015161185991906157ae565b6118639190615713565b8460028b60a00151600381111561187c5761187c61584f565b14611a4257600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611907919061538a565b6064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561195757600080fd5b505afa15801561196b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198f9190615008565b6001600160a01b031663037df8ab8d602001516040518263ffffffff1660e01b81526004016119c091815260200190565b60206040518083038186803b1580156119d857600080fd5b505afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a10919061538a565b60e08d0151611a1f908b6157ae565b611a2991906157ae565b611a339190615713565b611a3d9190615713565b614a51565b85614a51565b6000548551602087015160408089015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b158015611aac57600080fd5b505af1158015611ac0573d6000803e3d6000fd5b5050505085600001516001600160a01b03167f15f192ad872076db7d7571711429e445b0eabf30dc598ab77f02cacf622eec838860000151886080015188888b60a001518d60200151600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f919061538a565b8c602001518e60600151611ba391906157ae565b611bad9190615713565b8b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6c57600080fd5b505afa158015611c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca4919061538a565b604051611cb999989796959493929190615557565b60405180910390a25b5050505b600054845160405163201d8bdb60e01b815260048101919091526101009091046001600160a01b03169063201d8bdb90602401600060405180830381600087803b158015611d1357600080fd5b505af1158015611d27573d6000803e3d6000fd5b5050505050505050565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db79190615008565b6001600160a01b0316336001600160a01b031614611e025760405162461bcd60e51b8152602060048201526008602482015267474f565f4f4e4c5960c01b604482015260640161024d565b6000805460ff8082161560ff1990921682179092556040519116151581527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f4593049060200160405180910390a1565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9d57600080fd5b505afa158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed59190615008565b6001600160a01b0316336001600160a01b031614611f205760405162461bcd60e51b8152602060048201526008602482015267474f565f4f4e4c5960c01b604482015260640161024d565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190615008565b6001600160a01b0316816001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe857600080fd5b505afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190615008565b6001600160a01b0316146120765760405162461bcd60e51b815260206004820152600e60248201527f57524f4e475f434f4e5452414354000000000000000000000000000000000000604482015260640161024d565b600080546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790556040517f943e9d45a11aaae5d87503e3bc248665d9807856e5cf2bdb4a988bee444227819061212290839060408082526008908201527f73746f726167655400000000000000000000000000000000000000000000000060608201526001600160a01b0391909116602082015260800190565b60405180910390a150565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217b57600080fd5b505afa15801561218f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b39190615008565b6001600160a01b0316336001600160a01b0316146122055760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff16156122415760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b60008054825160405163b66e6b0560e01b815260048101919091526101009091046001600160a01b03169063b66e6b05906024016101e06040518083038186803b15801561228e57600080fd5b505afa1580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c69190615220565b90508060200151600014156122d9575050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561232857600080fd5b505afa15801561233c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612360919061538a565b905060648260800151846040015161237891906157ae565b6123829190615713565b83604001818151612393919061580c565b9052506040830151602084015160009183916064916123b1916157ae565b6123bb9190615713565b6123c59190615713565b90506000826064856060015186604001516123e091906157ae565b6123ea9190615713565b6123f49190615713565b845160c08101519192509061241857828660200151612413919061580c565b612428565b82866020015161242891906156cd565b60a082015260c08101518015612450575081856040015161244991906156cd565b8160a00151115b8061247a57508060c0015115801561247a5750818560400151612473919061580c565b8160a00151105b806124ab5750600081610100015111801561249657508060c001515b80156124ab57508061010001518160a0015110155b806124dc575060008161012001511180156124c757508060c001515b80156124dc57508061012001518160a0015111155b8061250e575060008161010001511180156124f957508060c00151155b801561250e57508061010001518160a0015111155b806125405750600081610120015111801561252b57508060c00151155b801561254057508061012001518160a0015110155b8061254d57506020860151155b806126b3575060005460208201516040516328daca2160e01b81526004810191909152600260248201526101009091046001600160a01b0316906328daca219060440160206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e0919061538a565b8160e0015182608001516125f491906157ae565b600060019054906101000a90046001600160a01b03166001600160a01b03166328daca2184602001518560c0015161262d576001612630565b60005b6040516001600160e01b031960e085901b168152600481019290925260ff16602482015260440160206040518083038186803b15801561266f57600080fd5b505afa158015612683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a7919061538a565b6126b191906156cd565b115b1561287f57600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1482602001518360e0015184608001516126f591906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526001604482018190526064820152608401602060405180830381600087803b15801561274157600080fd5b505af1158015612755573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612779919061538a565b8160800181815161278a919061580c565b9052506000548151608083015160405163373873db60e11b81526101009093046001600160a01b039081166004850181905292166024840152604483015290636e70e7b690606401600060405180830381600087803b1580156127ec57600080fd5b505af1158015612800573d6000803e3d6000fd5b50505050806020015181600001516001600160a01b03167ff28d9c4fccf41a289b5e0978a2538087edc644771992ef7def43703462f227f3886000015188604001518560a001518a60600151604051612872949392919093845260208401929092526040830152606082015260800190565b60405180910390a3612bbd565b6000548151602083015160405163292c161760e01b81526001600160a01b0392831660048201526024810191909152610100909204169063292c16179060440160206040518083038186803b1580156128d757600080fd5b505afa1580156128eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290f919061538a565b8160400181815250506129358160a001518260e001518361010001518460c001516136a5565b8161010001818152505061295c8160a001518260e001518361012001518460c001516138c1565b61012082015260005481516040517f3b0f0f2f0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152612a0c9284926101009091041690633b0f0f2f9060240160206040518083038186803b1580156129cc57600080fd5b505afa1580156129e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a049190615008565b600080613ac7565b600080548251602084015160408086015190516351d407ff60e11b81526001600160a01b03938416600482015260248101929092526044820152610100909204169063a3a80ffe906064016101406040518083038186803b158015612a7057600080fd5b505afa158015612a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa8919061536d565b60008054845160208601516040808801519051638c8ff1d560e01b81526001600160a01b03938416600482015260248101929092526044820152939450919261010090910490911690638c8ff1d59060640160c06040518083038186803b158015612b1257600080fd5b505afa158015612b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4a919061531b565b90507fc74e5bdf3e3b91b5cda39fb8ee72fb93dbb735b9cbbaddc7eef34178ffbaf55588600001518360018560a001518a86602001518860600151612b8f91906157ae565b612b999190615713565b6020870151604051612bb2969594939291600091615514565b60405180910390a150505b6000548651604051630195728b60e71b81526004810191909152600160248201526101009091046001600160a01b03169063cab94580906044015b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b50505050505050505050565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190615008565b6001600160a01b0316336001600160a01b031614612d0a5760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff1615612d465760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b60008054825160405163b66e6b0560e01b815260048101919091526101009091046001600160a01b03169063b66e6b05906024016101e06040518083038186803b158015612d9357600080fd5b505afa158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb9190615220565b9050806020015160001415612dde575050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015612e2d57600080fd5b505afa158015612e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e65919061538a565b6000805484518051602082015160409283015192516351d407ff60e11b81526001600160a01b039283166004820152602481019190915260448101929092529394509192610100909104169063a3a80ffe906064016101406040518083038186803b158015612ed357600080fd5b505afa158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b919061536d565b600080548551805160208201516040928301519251638c8ff1d560e01b81526001600160a01b0392831660048201526024810191909152604481019290925293945091926101009091041690638c8ff1d59060640160c06040518083038186803b158015612f7857600080fd5b505afa158015612f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb0919061531b565b905060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561300157600080fd5b505afa158015613015573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130399190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561307157600080fd5b505afa158015613085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a9919061538a565b826020015184606001516130bd91906157ae565b6130c79190615713565b905085602001516000141561331b5760008060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1485602001518660e001518561311091906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526000604482015260016064820152608401602060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613194919061538a565b9050808460600151111561323b5780846060018181516131b4919061580c565b9052506000546040517fd4bda9080000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03169063d4bda90890613204908790600401615439565b600060405180830381600087803b15801561321e57600080fd5b505af1158015613232573d6000803e3d6000fd5b505050506132b8565b6000548451602086015160408088015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b15801561329f57600080fd5b505af11580156132b3573d6000803e3d6000fd5b505050505b836020015184600001516001600160a01b03167fab1c81913f915c5b148c741324596b0f7bd5c5efa0f0aaabfdcf3157e2c5f4e58960000151876040015160405161330d929190918252602082015260400190565b60405180910390a350613665565b60e0830151156136655760006133438460a0015188602001518660c001518760e00151614874565b9050613488846000015182878660200151886060015161336391906157ae565b61336d9190615713565b6000896064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f89190615008565b6001600160a01b031663037df8ab8c602001516040518263ffffffff1660e01b815260040161342991815260200190565b60206040518083038186803b15801561344157600080fd5b505afa158015613455573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613479919061538a565b60e08c0151611a1f908b6157ae565b7fc74e5bdf3e3b91b5cda39fb8ee72fb93dbb735b9cbbaddc7eef34178ffbaf55587600001518560008a602001518988602001518a606001516134cb91906157ae565b6134d59190615713565b86600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561352457600080fd5b505afa158015613538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355c9190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561359457600080fd5b505afa1580156135a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cc919061538a565b6040516135df9796959493929190615514565b60405180910390a16000548451602086015160408088015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b15801561364b57600080fd5b505af115801561365f573d6000803e3d6000fd5b50505050505b600080548751604051630195728b60e71b81526004810191909152602481019290925261010090046001600160a01b03169063cab9458090604401612bf8565b60008215806137d35750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613735919061538a565b600060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561378357600080fd5b505afa158015613797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bb919061538a565b6137c591906157ae565b6137d186858588614874565b145b156138b6576000606485600060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561382b57600080fd5b505afa15801561383f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613863919061538a565b61386d90896157ae565b6138779190615713565b6138819190615713565b9050821561389b5761389381876156cd565b9150506138b9565b8581116138ac57613893818761580c565b60009150506138b9565b50815b949350505050565b600080831180156139fd5750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613953919061538a565b600060019054906101000a90046001600160a01b03166001600160a01b0316635a9125516040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a157600080fd5b505afa1580156139b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d9919061538a565b6139e391906157ae565b6139ef90600019615727565b6139fb86858588614874565b125b156138b6576000606485600060019054906101000a90046001600160a01b03166001600160a01b0316635a9125516040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5557600080fd5b505afa158015613a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8d919061538a565b613a9790896157ae565b613aa19190615713565b613aab9190615713565b90508215613abd57613893818761580c565b61389381876156cd565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015613b1657600080fd5b505afa158015613b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4e919061538a565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1486602001518760e001518860800151613b8d91906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526001604482015260006064820152608401602060405180830381600087803b158015613bd957600080fd5b505af1158015613bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c11919061538a565b85608001818151613c22919061580c565b905250600054608086015160405163373873db60e11b81526101009092046001600160a01b031660048301819052306024840152604483019190915290636e70e7b690606401600060405180830381600087803b158015613c8257600080fd5b505af1158015613c96573d6000803e3d6000fd5b5050505060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015613ce957600080fd5b505afa158015613cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d219190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015613d5957600080fd5b505afa158015613d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d91919061538a565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015613de157600080fd5b505afa158015613df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e199190615008565b6001600160a01b031663095ea7b3600060019054906101000a90046001600160a01b03166001600160a01b031663f2c13bdf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e7557600080fd5b505afa158015613e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ead9190615008565b60808901516040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015613ef857600080fd5b505af1158015613f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3091906150d9565b5060008060019054906101000a90046001600160a01b03166001600160a01b031663f2c13bdf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8057600080fd5b505afa158015613f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb89190615008565b6001600160a01b03166338ed173988608001516000613fd5614dc1565b30613fe24261012c6156cd565b6040518663ffffffff1660e01b81526004016140029594939291906154a3565b600060405180830381600087803b15801561401c57600080fd5b505af1158015614030573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614058919081019061502c565b6000608089015280519091508190600190811061407757614077615865565b602090810291909101015160608801819052600080546040516329bc0a1f60e11b81523060048201526024810193909352604483019190915261010090046001600160a01b031690635378143e90606401600060405180830381600087803b1580156140e257600080fd5b505af11580156140f6573d6000803e3d6000fd5b50505050600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1488602001518960e001518a6060015161413791906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526000604482018190526064820152608401602060405180830381600087803b15801561418357600080fd5b505af1158015614197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bb919061538a565b876060018181516141cc919061580c565b915081815250506000606484600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561422657600080fd5b505afa15801561423a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061425e9190615008565b6001600160a01b0316639bb853d78b602001516040518263ffffffff1660e01b815260040161428f91815260200190565b60206040518083038186803b1580156142a757600080fd5b505afa1580156142bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142df919061538a565b8a60e001518b606001516142f391906157ae565b6142fd91906157ae565b6143079190615713565b6143119190615713565b90506001600160a01b038716156144295761432d600282615713565b6000546040516329bc0a1f60e11b81526001600160a01b038a81166004830152602482018490526001604483015292935061010090910490911690635378143e90606401600060405180830381600087803b15801561438b57600080fd5b505af115801561439f573d6000803e3d6000fd5b50506000546040517f21f7a30b0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301526024820186905261010090920490911692506321f7a30b9150604401600060405180830381600087803b15801561441057600080fd5b505af1158015614424573d6000803e3d6000fd5b505050505b808860600181815161443b919061580c565b9052506001600160a01b03861615614681576000846064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a057600080fd5b505afa1580156144b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d89190615008565b6001600160a01b0316637eeeae648c602001516040518263ffffffff1660e01b815260040161450991815260200190565b60206040518083038186803b15801561452157600080fd5b505afa158015614535573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614559919061538a565b8b60e001518c6060015161456d91906157ae565b61457791906157ae565b6145819190615713565b61458b9190615713565b6000546040516329bc0a1f60e11b81526001600160a01b038a81166004830152602482018490526001604483015292935061010090910490911690635378143e90606401600060405180830381600087803b1580156145e957600080fd5b505af11580156145fd573d6000803e3d6000fd5b50506000546040516339caebcf60e11b8152600481018a9052602481018590526101009091046001600160a01b03169250637395d79e9150604401600060405180830381600087803b15801561465257600080fd5b505af1158015614666573d6000803e3d6000fd5b50505050808960600181815161467c919061580c565b905250505b600060019054906101000a90046001600160a01b03166001600160a01b031663c311ab31896040518060c001604052806000815260200187815260200188888e60e001518f606001516146d491906157ae565b6146de91906157ae565b6146e89190615713565b81526020016000815260200160008152602001600015158152506040518363ffffffff1660e01b815260040161471f92919061544e565b600060405180830381600087803b15801561473957600080fd5b505af115801561474d573d6000803e3d6000fd5b50506000548a516040517f68ca199d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015261010090930490921693506328b1f88792509083906368ca199d9060240160206040518083038186803b1580156147c057600080fd5b505afa1580156147d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f8919061538a565b15614805576103e8614808565b60645b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015261ffff166024820152604401600060405180830381600087803b15801561485257600080fd5b505af1158015614866573d6000803e3d6000fd5b505050505050505050505050565b600080600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156148c557600080fd5b505afa1580156148d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148fd919061538a565b905060008060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561494e57600080fd5b505afa158015614962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614986919061538a565b9050846149c85786848361499a89846157cd565b6149a5906064615727565b6149af9190615727565b6149b99190615727565b6149c391906156e5565b6149fe565b8684836149d5838a6157cd565b6149e0906064615727565b6149ea9190615727565b6149f49190615727565b6149fe91906156e5565b9250614a0c82606319615727565b8312614a185782614a24565b614a2482606319615727565b9250614a308282615727565b8313614a3c5782614a46565b614a468282615727565b979650505050505050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015614aa057600080fd5b505afa158015614ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ad8919061538a565b6000546040517fe3f04eba0000000000000000000000000000000000000000000000000000000081526004810185905291925061010090046001600160a01b03169063e3f04eba90602401600060405180830381600087803b158015614b3d57600080fd5b505af1158015614b51573d6000803e3d6000fd5b5050505080605a614b6291906157ae565b614b6e90600019615727565b851315610d70576000816064614b848789615727565b614b8e91906156e5565b614b9891906156e5565b905081600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015614be957600080fd5b505afa158015614bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c219190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015614c5957600080fd5b505afa158015614c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c91919061538a565b614c9b86866156cd565b614ca591906157ae565b614caf9190615713565b614cb990826157cd565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015614d0957600080fd5b505afa158015614d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d419190615008565b6001600160a01b031663214a9a3388614d5a848961568e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015614da057600080fd5b505af1158015614db4573d6000803e3d6000fd5b5050505050505050505050565b60408051600280825260608083018452926000929190602083019080368337019050509050600060019054906101000a90046001600160a01b03166001600160a01b031663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015614e3457600080fd5b505afa158015614e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e6c9190615008565b81600081518110614e7f57614e7f615865565b60200260200101906001600160a01b031690816001600160a01b031681525050600060019054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015614eed57600080fd5b505afa158015614f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f259190615008565b81600181518110614f3857614f38615865565b6001600160a01b0390921660209283029190910190910152919050565b8051614f6081615891565b919050565b80518015158114614f6057600080fd5b60006101408284031215614f8857600080fd5b614f906155ec565b9050614f9b82614f55565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a0820152614fdb60c08301614f65565b60c082015260e082015160e082015261010080830151818301525061012080830151818301525092915050565b60006020828403121561501a57600080fd5b815161502581615891565b9392505050565b6000602080838503121561503f57600080fd5b825167ffffffffffffffff8082111561505757600080fd5b818501915085601f83011261506b57600080fd5b81518181111561507d5761507d61587b565b8060051b915061508e84830161565d565b8181528481019084860184860187018a10156150a957600080fd5b600095505b838610156150cc5780518352600195909501949186019186016150ae565b5098975050505050505050565b6000602082840312156150eb57600080fd5b61502582614f65565b60006020828403121561510657600080fd5b813561502581615891565b60006060828403121561512357600080fd5b6040516060810181811067ffffffffffffffff821117156151465761514661587b565b80604052508235815260208301356020820152604083013560408201528091505092915050565b60006101a0828403121561518057600080fd5b615188615616565b61519183614f55565b8152602083015160208201526040830151604082015260608301516060820152608083015160808201526151c760a08401614f65565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101608084015190820152610180928301519281019290925250919050565b60006101e0828403121561523357600080fd5b60405160c0810181811067ffffffffffffffff821117156152565761525661587b565b6040526152638484614f75565b81526101408301516020820152610160830151604082015261018083015160608201526101a083015160808201526101c09092015160a083015250919050565b600060c082840312156152b557600080fd5b6152bd61563a565b82516152c881615891565b81526020838101519082015260408301516152e281615891565b80604083015250606083015160608201526080830151608082015260a08301516004811061530f57600080fd5b60a08201529392505050565b600060c0828403121561532d57600080fd5b61533561563a565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015261530f60a08401614f65565b6000610140828403121561538057600080fd5b6150258383614f75565b60006020828403121561539c57600080fd5b5051919050565b600481106153c157634e487b7160e01b600052602160045260246000fd5b9052565b80516001600160a01b031682526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015161541760c084018215159052565b5060e08181015190830152610100808201519083015261012090810151910152565b610140810161544882846153c5565b92915050565b610200810161545d82856153c5565b82516101408301526020830151610160830152604083015161018083015260608301516101a083015260808301516101c083015260a083015115156101e0830152615025565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154f35784516001600160a01b0316835293830193918301916001016154ce565b50506001600160a01b03969096166060850152505050608001529392505050565b878152610200810161552960208301896153c5565b9515156101608201526101808101949094526101a08401929092526101c08301526101e09091015292915050565b898152602081018990526102e08101615573604083018a6153c5565b875161018083015260208801516101a083015260408801516101c083015260608801516101e0830152608088015161020083015260a088015115156102208301526155c26102408301886153a3565b8561026083015284610280830152836102a0830152826102c08301529a9950505050505050505050565b604051610140810167ffffffffffffffff811182821017156156105761561061587b565b60405290565b6040516101a0810167ffffffffffffffff811182821017156156105761561061587b565b60405160c0810167ffffffffffffffff811182821017156156105761561061587b565b604051601f8201601f1916810167ffffffffffffffff811182821017156156865761568661587b565b604052919050565b6000808212826001600160ff1b03038413811516156156af576156af615823565b82600160ff1b0384128116156156c7576156c7615823565b50500190565b600082198211156156e0576156e0615823565b500190565b6000826156f4576156f4615839565b600160ff1b82146000198414161561570e5761570e615823565b500590565b60008261572257615722615839565b500490565b60006001600160ff1b0360008413600084138583048511828216161561574f5761574f615823565b600160ff1b600087128682058812818416161561576e5761576e615823565b6000871292508782058712848416161561578a5761578a615823565b878505871281841616156157a0576157a0615823565b505050929093029392505050565b60008160001904831182151516156157c8576157c8615823565b500290565b600080831283600160ff1b018312811516156157eb576157eb615823565b836001600160ff1b0301831381161561580657615806615823565b50500390565b60008282101561581e5761581e615823565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d7657600080fdfea2646970667358221220002c6612d705c42bb908512ac151c9ee28eef670cf6dc95270020f987fbf156264736f6c63430008070033000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80638456cb5911610076578063b187bd261161005b578063b187bd2614610136578063b5228d1314610153578063e2f537101461016657600080fd5b80638456cb591461011b57806392818d661461012357600080fd5b806302982635146100a857806316fff074146100bd57806354a67352146100f257806380d670eb14610108575b600080fd5b6100bb6100b6366004615111565b610179565b005b6000546100d59061010090046001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100fa605a81565b6040519081526020016100e9565b6100bb610116366004615111565b610d79565b6100bb611d31565b6100bb6101313660046150f4565b611e4f565b6000546101439060ff1681565b60405190151581526020016100e9565b6100bb610161366004615111565b61212d565b6100bb610174366004615111565b612c32565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156101c757600080fd5b505afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190615008565b6001600160a01b0316336001600160a01b0316146102565760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b60448201526064015b60405180910390fd5b60005460ff16156102925760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b6000805482516040516399794d3560e01b815260048101919091526101009091046001600160a01b0316906399794d359060240160c06040518083038186803b1580156102de57600080fd5b505afa1580156102f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031691906152a3565b60408101519091506001600160a01b031661032f575050565b6000546040828101516060840151608085015192517fdcdf339a0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063dcdf339a9060640160206040518083038186803b1580156103b257600080fd5b505afa1580156103c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ea91906150d9565b801561050b5750600060019054906101000a90046001600160a01b03166001600160a01b031663f8d24b486040518163ffffffff1660e01b815260040160206040518083038186803b15801561043f57600080fd5b505afa158015610453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610477919061538a565b600054602083015160405163aa3b7d7760e01b815260048101919091526101009091046001600160a01b03169063aa3b7d779060240160206040518083038186803b1580156104c557600080fd5b505afa1580156104d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fd919061538a565b61050791906156cd565b4310155b801561051a5750602082015115155b15610d0f57600080546040838101516060850151608086015192517fb8878a2c0000000000000000000000000000000000000000000000000000000081526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063b8878a2c906064016101a06040518083038186803b1580156105a457600080fd5b505afa1580156105b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105dc919061516d565b905060008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561062d57600080fd5b505afa158015610641573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610665919061538a565b905060648260800151856040015161067d91906157ae565b6106879190615713565b84604001818151610698919061580c565b90525060a08201516106e357806064856040015186602001516106bb91906157ae565b6106c59190615713565b6106cf9190615713565b84602001516106de919061580c565b61071d565b806064856040015186602001516106fa91906157ae565b6107049190615713565b61070e9190615713565b846020015161071d91906156cd565b6020850181905260c083015160e084015160a085015161073f939291906136a5565b8260e001818152505061076584602001518360c001518461010001518560a001516138c1565b61010083015261012082015160208501511080159061078d5750816101400151846020015111155b80156108f5575060005460208301516040516328daca2160e01b81526004810191909152600260248201526101009091046001600160a01b0316906328daca219060440160206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610821919061538a565b8260c00151836060015161083591906157ae565b600060019054906101000a90046001600160a01b03166001600160a01b03166328daca2185602001518660a0015161086e576001610871565b60005b6040516001600160e01b031960e085901b168152600481019290925260ff16602482015260440160206040518083038186803b1580156108b057600080fd5b505afa1580156108c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e8919061538a565b6108f291906156cd565b11155b15610d0c57600080548351602085015160405163292c161760e01b81526001600160a01b0392831660048201526024810191909152610100909204169063292c16179060440160206040518083038186803b15801561095357600080fd5b505afa158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b919061538a565b9050610ab360405180610140016040528085600001516001600160a01b03168152602001856020015181526020018381526020016000815260200185606001518152602001876020015181526020018560a00151151581526020018560c0015181526020018560e001518152602001856101000151815250600060019054906101000a90046001600160a01b03166001600160a01b0316633b0f0f2f86600001516040518263ffffffff1660e01b8152600401610a5791906001600160a01b0391909116815260200190565b60206040518083038186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190615008565b86516020880151613ac7565b6000548351602085015160408087015190517fb4b0f5670000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092526044820152610100909204169063b4b0f56790606401600060405180830381600087803b158015610b3057600080fd5b505af1158015610b44573d6000803e3d6000fd5b505060008054865160208801516040516351d407ff60e11b81526001600160a01b03928316600482015260248101919091526044810187905292945061010090910416915063a3a80ffe906064016101406040518083038186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be3919061536d565b6000805486516020880151604051638c8ff1d560e01b81526001600160a01b039283166004820152602481019190915260448101879052939450919261010090910490911690638c8ff1d59060640160c06040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c82919061531b565b905085600001516001600160a01b03167f15f192ad872076db7d7571711429e445b0eabf30dc598ab77f02cacf622eec8388600001518860800151858560038860a001518b89602001518b60600151610cdb91906157ae565b610ce59190615713565b60208a0151604051610d009897969594939291600091615557565b60405180910390a25050505b50505b600054825160405163201d8bdb60e01b815260048101919091526101009091046001600160a01b03169063201d8bdb90602401600060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b50505050505b50565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff9190615008565b6001600160a01b0316336001600160a01b031614610e515760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff1615610e8d5760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b6000805482516040516399794d3560e01b815260048101919091526101009091046001600160a01b0316906399794d359060240160c06040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1191906152a3565b60408101519091506001600160a01b0316610f2a575050565b600080546040838101516060850151608086015192516351d407ff60e11b81526001600160a01b039283166004820152602481019190915260448101929092526101009092049091169063a3a80ffe906064016101406040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce919061536d565b60008054604085810151606087015160808801519251638c8ff1d560e01b81526001600160a01b0392831660048201526024810191909152604481019290925293945091926101009091041690638c8ff1d59060640160c06040518083038186803b15801561103c57600080fd5b505afa158015611050573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611074919061531b565b905060008260e0015111801561119f5750600060019054906101000a90046001600160a01b03166001600160a01b031663f8d24b486040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061538a565b600054602085015160405163aa3b7d7760e01b815260048101919091526101009091046001600160a01b03169063aa3b7d779060240160206040518083038186803b15801561115957600080fd5b505afa15801561116d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611191919061538a565b61119b91906156cd565b4310155b80156111ae5750602084015115155b15611cc65760006111d18360a0015186602001518560c001518660e00151614874565b905060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561129257600080fd5b505afa1580156112a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ca919061538a565b836020015185606001516112de91906157ae565b6112e89190615713565b90506000808660a0015160038111156113035761130361584f565b14801561131557506000856101000151115b801561132257508460c001515b80156113375750846101000151876020015110155b8061138a575060008660a0015160038111156113555761135561584f565b14801561136757506000856101000151115b801561137557508460c00151155b801561138a5750846101000151876020015111155b806113dc575060018660a0015160038111156113a8576113a861584f565b1480156113ba57506000856101200151115b80156113c757508460c001515b80156113dc5750846101200151876020015111155b8061142f575060018660a0015160038111156113fa576113fa61584f565b14801561140c57506000856101200151115b801561141a57508460c00151155b801561142f5750846101200151876020015110155b61150f5760028660a00151600381111561144b5761144b61584f565b1480156114f45750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a157600080fd5b505afa1580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d9919061538a565b6114e490605a6157ae565b6114f090600019615727565b8313155b6114ff5760006116cc565b61150a601483615713565b6116cc565b600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561155d57600080fd5b505afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611595919061538a565b60648660e0015184600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116239190615008565b6001600160a01b0316637eeeae648a602001516040518263ffffffff1660e01b815260040161165491815260200190565b60206040518083038186803b15801561166c57600080fd5b505afa158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a4919061538a565b6116ae91906157ae565b6116b891906157ae565b6116c29190615713565b6116cc9190615713565b90508015611cc25760005486516040516329bc0a1f60e11b81526001600160a01b03918216600482015260248101849052600160448201526101009092041690635378143e90606401600060405180830381600087803b15801561172f57600080fd5b505af1158015611743573d6000803e3d6000fd5b505060005460208901516040516339caebcf60e11b81526004810191909152602481018590526101009091046001600160a01b03169250637395d79e9150604401600060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b50505050611a48856000015184600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611845919061538a565b8760200151896060015161185991906157ae565b6118639190615713565b8460028b60a00151600381111561187c5761187c61584f565b14611a4257600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611907919061538a565b6064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561195757600080fd5b505afa15801561196b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198f9190615008565b6001600160a01b031663037df8ab8d602001516040518263ffffffff1660e01b81526004016119c091815260200190565b60206040518083038186803b1580156119d857600080fd5b505afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a10919061538a565b60e08d0151611a1f908b6157ae565b611a2991906157ae565b611a339190615713565b611a3d9190615713565b614a51565b85614a51565b6000548551602087015160408089015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b158015611aac57600080fd5b505af1158015611ac0573d6000803e3d6000fd5b5050505085600001516001600160a01b03167f15f192ad872076db7d7571711429e445b0eabf30dc598ab77f02cacf622eec838860000151886080015188888b60a001518d60200151600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f919061538a565b8c602001518e60600151611ba391906157ae565b611bad9190615713565b8b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6c57600080fd5b505afa158015611c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca4919061538a565b604051611cb999989796959493929190615557565b60405180910390a25b5050505b600054845160405163201d8bdb60e01b815260048101919091526101009091046001600160a01b03169063201d8bdb90602401600060405180830381600087803b158015611d1357600080fd5b505af1158015611d27573d6000803e3d6000fd5b5050505050505050565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db79190615008565b6001600160a01b0316336001600160a01b031614611e025760405162461bcd60e51b8152602060048201526008602482015267474f565f4f4e4c5960c01b604482015260640161024d565b6000805460ff8082161560ff1990921682179092556040519116151581527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f4593049060200160405180910390a1565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9d57600080fd5b505afa158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed59190615008565b6001600160a01b0316336001600160a01b031614611f205760405162461bcd60e51b8152602060048201526008602482015267474f565f4f4e4c5960c01b604482015260640161024d565b600060019054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa69190615008565b6001600160a01b0316816001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b158015611fe857600080fd5b505afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190615008565b6001600160a01b0316146120765760405162461bcd60e51b815260206004820152600e60248201527f57524f4e475f434f4e5452414354000000000000000000000000000000000000604482015260640161024d565b600080546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790556040517f943e9d45a11aaae5d87503e3bc248665d9807856e5cf2bdb4a988bee444227819061212290839060408082526008908201527f73746f726167655400000000000000000000000000000000000000000000000060608201526001600160a01b0391909116602082015260800190565b60405180910390a150565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217b57600080fd5b505afa15801561218f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b39190615008565b6001600160a01b0316336001600160a01b0316146122055760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff16156122415760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b60008054825160405163b66e6b0560e01b815260048101919091526101009091046001600160a01b03169063b66e6b05906024016101e06040518083038186803b15801561228e57600080fd5b505afa1580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c69190615220565b90508060200151600014156122d9575050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561232857600080fd5b505afa15801561233c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612360919061538a565b905060648260800151846040015161237891906157ae565b6123829190615713565b83604001818151612393919061580c565b9052506040830151602084015160009183916064916123b1916157ae565b6123bb9190615713565b6123c59190615713565b90506000826064856060015186604001516123e091906157ae565b6123ea9190615713565b6123f49190615713565b845160c08101519192509061241857828660200151612413919061580c565b612428565b82866020015161242891906156cd565b60a082015260c08101518015612450575081856040015161244991906156cd565b8160a00151115b8061247a57508060c0015115801561247a5750818560400151612473919061580c565b8160a00151105b806124ab5750600081610100015111801561249657508060c001515b80156124ab57508061010001518160a0015110155b806124dc575060008161012001511180156124c757508060c001515b80156124dc57508061012001518160a0015111155b8061250e575060008161010001511180156124f957508060c00151155b801561250e57508061010001518160a0015111155b806125405750600081610120015111801561252b57508060c00151155b801561254057508061012001518160a0015110155b8061254d57506020860151155b806126b3575060005460208201516040516328daca2160e01b81526004810191909152600260248201526101009091046001600160a01b0316906328daca219060440160206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e0919061538a565b8160e0015182608001516125f491906157ae565b600060019054906101000a90046001600160a01b03166001600160a01b03166328daca2184602001518560c0015161262d576001612630565b60005b6040516001600160e01b031960e085901b168152600481019290925260ff16602482015260440160206040518083038186803b15801561266f57600080fd5b505afa158015612683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a7919061538a565b6126b191906156cd565b115b1561287f57600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1482602001518360e0015184608001516126f591906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526001604482018190526064820152608401602060405180830381600087803b15801561274157600080fd5b505af1158015612755573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612779919061538a565b8160800181815161278a919061580c565b9052506000548151608083015160405163373873db60e11b81526101009093046001600160a01b039081166004850181905292166024840152604483015290636e70e7b690606401600060405180830381600087803b1580156127ec57600080fd5b505af1158015612800573d6000803e3d6000fd5b50505050806020015181600001516001600160a01b03167ff28d9c4fccf41a289b5e0978a2538087edc644771992ef7def43703462f227f3886000015188604001518560a001518a60600151604051612872949392919093845260208401929092526040830152606082015260800190565b60405180910390a3612bbd565b6000548151602083015160405163292c161760e01b81526001600160a01b0392831660048201526024810191909152610100909204169063292c16179060440160206040518083038186803b1580156128d757600080fd5b505afa1580156128eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290f919061538a565b8160400181815250506129358160a001518260e001518361010001518460c001516136a5565b8161010001818152505061295c8160a001518260e001518361012001518460c001516138c1565b61012082015260005481516040517f3b0f0f2f0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152612a0c9284926101009091041690633b0f0f2f9060240160206040518083038186803b1580156129cc57600080fd5b505afa1580156129e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a049190615008565b600080613ac7565b600080548251602084015160408086015190516351d407ff60e11b81526001600160a01b03938416600482015260248101929092526044820152610100909204169063a3a80ffe906064016101406040518083038186803b158015612a7057600080fd5b505afa158015612a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa8919061536d565b60008054845160208601516040808801519051638c8ff1d560e01b81526001600160a01b03938416600482015260248101929092526044820152939450919261010090910490911690638c8ff1d59060640160c06040518083038186803b158015612b1257600080fd5b505afa158015612b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4a919061531b565b90507fc74e5bdf3e3b91b5cda39fb8ee72fb93dbb735b9cbbaddc7eef34178ffbaf55588600001518360018560a001518a86602001518860600151612b8f91906157ae565b612b999190615713565b6020870151604051612bb2969594939291600091615514565b60405180910390a150505b6000548651604051630195728b60e71b81526004810191909152600160248201526101009091046001600160a01b03169063cab94580906044015b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b50505050505050505050565b600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190615008565b6001600160a01b0316336001600160a01b031614612d0a5760405162461bcd60e51b815260206004820152600f60248201526e41474752454741544f525f4f4e4c5960881b604482015260640161024d565b60005460ff1615612d465760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b604482015260640161024d565b60008054825160405163b66e6b0560e01b815260048101919091526101009091046001600160a01b03169063b66e6b05906024016101e06040518083038186803b158015612d9357600080fd5b505afa158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb9190615220565b9050806020015160001415612dde575050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015612e2d57600080fd5b505afa158015612e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e65919061538a565b6000805484518051602082015160409283015192516351d407ff60e11b81526001600160a01b039283166004820152602481019190915260448101929092529394509192610100909104169063a3a80ffe906064016101406040518083038186803b158015612ed357600080fd5b505afa158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b919061536d565b600080548551805160208201516040928301519251638c8ff1d560e01b81526001600160a01b0392831660048201526024810191909152604481019290925293945091926101009091041690638c8ff1d59060640160c06040518083038186803b158015612f7857600080fd5b505afa158015612f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb0919061531b565b905060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561300157600080fd5b505afa158015613015573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130399190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561307157600080fd5b505afa158015613085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a9919061538a565b826020015184606001516130bd91906157ae565b6130c79190615713565b905085602001516000141561331b5760008060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1485602001518660e001518561311091906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526000604482015260016064820152608401602060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613194919061538a565b9050808460600151111561323b5780846060018181516131b4919061580c565b9052506000546040517fd4bda9080000000000000000000000000000000000000000000000000000000081526101009091046001600160a01b03169063d4bda90890613204908790600401615439565b600060405180830381600087803b15801561321e57600080fd5b505af1158015613232573d6000803e3d6000fd5b505050506132b8565b6000548451602086015160408088015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b15801561329f57600080fd5b505af11580156132b3573d6000803e3d6000fd5b505050505b836020015184600001516001600160a01b03167fab1c81913f915c5b148c741324596b0f7bd5c5efa0f0aaabfdcf3157e2c5f4e58960000151876040015160405161330d929190918252602082015260400190565b60405180910390a350613665565b60e0830151156136655760006133438460a0015188602001518660c001518760e00151614874565b9050613488846000015182878660200151886060015161336391906157ae565b61336d9190615713565b6000896064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f89190615008565b6001600160a01b031663037df8ab8c602001516040518263ffffffff1660e01b815260040161342991815260200190565b60206040518083038186803b15801561344157600080fd5b505afa158015613455573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613479919061538a565b60e08c0151611a1f908b6157ae565b7fc74e5bdf3e3b91b5cda39fb8ee72fb93dbb735b9cbbaddc7eef34178ffbaf55587600001518560008a602001518988602001518a606001516134cb91906157ae565b6134d59190615713565b86600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561352457600080fd5b505afa158015613538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355c9190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b15801561359457600080fd5b505afa1580156135a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cc919061538a565b6040516135df9796959493929190615514565b60405180910390a16000548451602086015160408088015190516390d112b960e01b81526001600160a01b0393841660048201526024810192909252604482015261010090920416906390d112b990606401600060405180830381600087803b15801561364b57600080fd5b505af115801561365f573d6000803e3d6000fd5b50505050505b600080548751604051630195728b60e71b81526004810191909152602481019290925261010090046001600160a01b03169063cab9458090604401612bf8565b60008215806137d35750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613735919061538a565b600060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561378357600080fd5b505afa158015613797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bb919061538a565b6137c591906157ae565b6137d186858588614874565b145b156138b6576000606485600060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561382b57600080fd5b505afa15801561383f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613863919061538a565b61386d90896157ae565b6138779190615713565b6138819190615713565b9050821561389b5761389381876156cd565b9150506138b9565b8581116138ac57613893818761580c565b60009150506138b9565b50815b949350505050565b600080831180156139fd5750600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613953919061538a565b600060019054906101000a90046001600160a01b03166001600160a01b0316635a9125516040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a157600080fd5b505afa1580156139b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d9919061538a565b6139e391906157ae565b6139ef90600019615727565b6139fb86858588614874565b125b156138b6576000606485600060019054906101000a90046001600160a01b03166001600160a01b0316635a9125516040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5557600080fd5b505afa158015613a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8d919061538a565b613a9790896157ae565b613aa19190615713565b613aab9190615713565b90508215613abd57613893818761580c565b61389381876156cd565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015613b1657600080fd5b505afa158015613b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4e919061538a565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1486602001518760e001518860800151613b8d91906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526001604482015260006064820152608401602060405180830381600087803b158015613bd957600080fd5b505af1158015613bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c11919061538a565b85608001818151613c22919061580c565b905250600054608086015160405163373873db60e11b81526101009092046001600160a01b031660048301819052306024840152604483019190915290636e70e7b690606401600060405180830381600087803b158015613c8257600080fd5b505af1158015613c96573d6000803e3d6000fd5b5050505060008060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015613ce957600080fd5b505afa158015613cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d219190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015613d5957600080fd5b505afa158015613d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d91919061538a565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015613de157600080fd5b505afa158015613df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e199190615008565b6001600160a01b031663095ea7b3600060019054906101000a90046001600160a01b03166001600160a01b031663f2c13bdf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e7557600080fd5b505afa158015613e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ead9190615008565b60808901516040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015613ef857600080fd5b505af1158015613f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3091906150d9565b5060008060019054906101000a90046001600160a01b03166001600160a01b031663f2c13bdf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8057600080fd5b505afa158015613f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb89190615008565b6001600160a01b03166338ed173988608001516000613fd5614dc1565b30613fe24261012c6156cd565b6040518663ffffffff1660e01b81526004016140029594939291906154a3565b600060405180830381600087803b15801561401c57600080fd5b505af1158015614030573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614058919081019061502c565b6000608089015280519091508190600190811061407757614077615865565b602090810291909101015160608801819052600080546040516329bc0a1f60e11b81523060048201526024810193909352604483019190915261010090046001600160a01b031690635378143e90606401600060405180830381600087803b1580156140e257600080fd5b505af11580156140f6573d6000803e3d6000fd5b50505050600060019054906101000a90046001600160a01b03166001600160a01b031663cfbacc1488602001518960e001518a6060015161413791906157ae565b6040516001600160e01b031960e085901b168152600481019290925260248201526000604482018190526064820152608401602060405180830381600087803b15801561418357600080fd5b505af1158015614197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bb919061538a565b876060018181516141cc919061580c565b915081815250506000606484600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b15801561422657600080fd5b505afa15801561423a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061425e9190615008565b6001600160a01b0316639bb853d78b602001516040518263ffffffff1660e01b815260040161428f91815260200190565b60206040518083038186803b1580156142a757600080fd5b505afa1580156142bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142df919061538a565b8a60e001518b606001516142f391906157ae565b6142fd91906157ae565b6143079190615713565b6143119190615713565b90506001600160a01b038716156144295761432d600282615713565b6000546040516329bc0a1f60e11b81526001600160a01b038a81166004830152602482018490526001604483015292935061010090910490911690635378143e90606401600060405180830381600087803b15801561438b57600080fd5b505af115801561439f573d6000803e3d6000fd5b50506000546040517f21f7a30b0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301526024820186905261010090920490911692506321f7a30b9150604401600060405180830381600087803b15801561441057600080fd5b505af1158015614424573d6000803e3d6000fd5b505050505b808860600181815161443b919061580c565b9052506001600160a01b03861615614681576000846064600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a057600080fd5b505afa1580156144b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d89190615008565b6001600160a01b0316637eeeae648c602001516040518263ffffffff1660e01b815260040161450991815260200190565b60206040518083038186803b15801561452157600080fd5b505afa158015614535573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614559919061538a565b8b60e001518c6060015161456d91906157ae565b61457791906157ae565b6145819190615713565b61458b9190615713565b6000546040516329bc0a1f60e11b81526001600160a01b038a81166004830152602482018490526001604483015292935061010090910490911690635378143e90606401600060405180830381600087803b1580156145e957600080fd5b505af11580156145fd573d6000803e3d6000fd5b50506000546040516339caebcf60e11b8152600481018a9052602481018590526101009091046001600160a01b03169250637395d79e9150604401600060405180830381600087803b15801561465257600080fd5b505af1158015614666573d6000803e3d6000fd5b50505050808960600181815161467c919061580c565b905250505b600060019054906101000a90046001600160a01b03166001600160a01b031663c311ab31896040518060c001604052806000815260200187815260200188888e60e001518f606001516146d491906157ae565b6146de91906157ae565b6146e89190615713565b81526020016000815260200160008152602001600015158152506040518363ffffffff1660e01b815260040161471f92919061544e565b600060405180830381600087803b15801561473957600080fd5b505af115801561474d573d6000803e3d6000fd5b50506000548a516040517f68ca199d0000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015261010090930490921693506328b1f88792509083906368ca199d9060240160206040518083038186803b1580156147c057600080fd5b505afa1580156147d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f8919061538a565b15614805576103e8614808565b60645b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015261ffff166024820152604401600060405180830381600087803b15801561485257600080fd5b505af1158015614866573d6000803e3d6000fd5b505050505050505050505050565b600080600060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b1580156148c557600080fd5b505afa1580156148d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148fd919061538a565b905060008060019054906101000a90046001600160a01b03166001600160a01b031663c122fea66040518163ffffffff1660e01b815260040160206040518083038186803b15801561494e57600080fd5b505afa158015614962573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614986919061538a565b9050846149c85786848361499a89846157cd565b6149a5906064615727565b6149af9190615727565b6149b99190615727565b6149c391906156e5565b6149fe565b8684836149d5838a6157cd565b6149e0906064615727565b6149ea9190615727565b6149f49190615727565b6149fe91906156e5565b9250614a0c82606319615727565b8312614a185782614a24565b614a2482606319615727565b9250614a308282615727565b8313614a3c5782614a46565b614a468282615727565b979650505050505050565b60008060019054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b815260040160206040518083038186803b158015614aa057600080fd5b505afa158015614ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ad8919061538a565b6000546040517fe3f04eba0000000000000000000000000000000000000000000000000000000081526004810185905291925061010090046001600160a01b03169063e3f04eba90602401600060405180830381600087803b158015614b3d57600080fd5b505af1158015614b51573d6000803e3d6000fd5b5050505080605a614b6291906157ae565b614b6e90600019615727565b851315610d70576000816064614b848789615727565b614b8e91906156e5565b614b9891906156e5565b905081600060019054906101000a90046001600160a01b03166001600160a01b0316633078fff56040518163ffffffff1660e01b815260040160206040518083038186803b158015614be957600080fd5b505afa158015614bfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c219190615008565b6001600160a01b0316633c88e8826040518163ffffffff1660e01b815260040160206040518083038186803b158015614c5957600080fd5b505afa158015614c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c91919061538a565b614c9b86866156cd565b614ca591906157ae565b614caf9190615713565b614cb990826157cd565b9050600060019054906101000a90046001600160a01b03166001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015614d0957600080fd5b505afa158015614d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d419190615008565b6001600160a01b031663214a9a3388614d5a848961568e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015614da057600080fd5b505af1158015614db4573d6000803e3d6000fd5b5050505050505050505050565b60408051600280825260608083018452926000929190602083019080368337019050509050600060019054906101000a90046001600160a01b03166001600160a01b031663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015614e3457600080fd5b505afa158015614e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e6c9190615008565b81600081518110614e7f57614e7f615865565b60200260200101906001600160a01b031690816001600160a01b031681525050600060019054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015614eed57600080fd5b505afa158015614f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f259190615008565b81600181518110614f3857614f38615865565b6001600160a01b0390921660209283029190910190910152919050565b8051614f6081615891565b919050565b80518015158114614f6057600080fd5b60006101408284031215614f8857600080fd5b614f906155ec565b9050614f9b82614f55565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a0820152614fdb60c08301614f65565b60c082015260e082015160e082015261010080830151818301525061012080830151818301525092915050565b60006020828403121561501a57600080fd5b815161502581615891565b9392505050565b6000602080838503121561503f57600080fd5b825167ffffffffffffffff8082111561505757600080fd5b818501915085601f83011261506b57600080fd5b81518181111561507d5761507d61587b565b8060051b915061508e84830161565d565b8181528481019084860184860187018a10156150a957600080fd5b600095505b838610156150cc5780518352600195909501949186019186016150ae565b5098975050505050505050565b6000602082840312156150eb57600080fd5b61502582614f65565b60006020828403121561510657600080fd5b813561502581615891565b60006060828403121561512357600080fd5b6040516060810181811067ffffffffffffffff821117156151465761514661587b565b80604052508235815260208301356020820152604083013560408201528091505092915050565b60006101a0828403121561518057600080fd5b615188615616565b61519183614f55565b8152602083015160208201526040830151604082015260608301516060820152608083015160808201526151c760a08401614f65565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101608084015190820152610180928301519281019290925250919050565b60006101e0828403121561523357600080fd5b60405160c0810181811067ffffffffffffffff821117156152565761525661587b565b6040526152638484614f75565b81526101408301516020820152610160830151604082015261018083015160608201526101a083015160808201526101c09092015160a083015250919050565b600060c082840312156152b557600080fd5b6152bd61563a565b82516152c881615891565b81526020838101519082015260408301516152e281615891565b80604083015250606083015160608201526080830151608082015260a08301516004811061530f57600080fd5b60a08201529392505050565b600060c0828403121561532d57600080fd5b61533561563a565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015261530f60a08401614f65565b6000610140828403121561538057600080fd5b6150258383614f75565b60006020828403121561539c57600080fd5b5051919050565b600481106153c157634e487b7160e01b600052602160045260246000fd5b9052565b80516001600160a01b031682526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015161541760c084018215159052565b5060e08181015190830152610100808201519083015261012090810151910152565b610140810161544882846153c5565b92915050565b610200810161545d82856153c5565b82516101408301526020830151610160830152604083015161018083015260608301516101a083015260808301516101c083015260a083015115156101e0830152615025565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154f35784516001600160a01b0316835293830193918301916001016154ce565b50506001600160a01b03969096166060850152505050608001529392505050565b878152610200810161552960208301896153c5565b9515156101608201526101808101949094526101a08401929092526101c08301526101e09091015292915050565b898152602081018990526102e08101615573604083018a6153c5565b875161018083015260208801516101a083015260408801516101c083015260608801516101e0830152608088015161020083015260a088015115156102208301526155c26102408301886153a3565b8561026083015284610280830152836102a0830152826102c08301529a9950505050505050505050565b604051610140810167ffffffffffffffff811182821017156156105761561061587b565b60405290565b6040516101a0810167ffffffffffffffff811182821017156156105761561061587b565b60405160c0810167ffffffffffffffff811182821017156156105761561061587b565b604051601f8201601f1916810167ffffffffffffffff811182821017156156865761568661587b565b604052919050565b6000808212826001600160ff1b03038413811516156156af576156af615823565b82600160ff1b0384128116156156c7576156c7615823565b50500190565b600082198211156156e0576156e0615823565b500190565b6000826156f4576156f4615839565b600160ff1b82146000198414161561570e5761570e615823565b500590565b60008261572257615722615839565b500490565b60006001600160ff1b0360008413600084138583048511828216161561574f5761574f615823565b600160ff1b600087128682058812818416161561576e5761576e615823565b6000871292508782058712848416161561578a5761578a615823565b878505871281841616156157a0576157a0615823565b505050929093029392505050565b60008160001904831182151516156157c8576157c8615823565b500290565b600080831283600160ff1b018312811516156157eb576157eb615823565b836001600160ff1b0301831381161561580657615806615823565b50500390565b60008282101561581e5761581e615823565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d7657600080fdfea2646970667358221220002c6612d705c42bb908512ac151c9ee28eef670cf6dc95270020f987fbf156264736f6c63430008070033

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

000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd

-----Decoded View---------------
Arg [0] : _storageT (address): 0xaee4d11a16B2bc65EDD6416Fb626EB404a6D65BD

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd


Deployed Bytecode Sourcemap

9106:20277:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16900:3108;;;;;;:::i;:::-;;:::i;:::-;;9307:34;;;;;;;;-1:-1:-1;;;;;9307:34:0;;;;;;-1:-1:-1;;;;;10188:55:1;;;10170:74;;10158:2;10143:18;9307:34:0;;;;;;;;9165:39;;9202:2;9165:39;;;;;15074:25:1;;;15062:2;15047:18;9165:39:0;14928:177:1;20075:3191:0;;;;;;:::i;:::-;;:::i;11406:80::-;;;:::i;11101:239::-;;;;;;:::i;:::-;;:::i;9254:20::-;;;;;;;;;;;;12195:14:1;;12188:22;12170:41;;12158:2;12143:18;9254:20:0;12030:187:1;11557:2867:0;;;;;;:::i;:::-;;:::i;14496:2338::-;;;;;;:::i;:::-;;:::i;16900:3108::-;10882:8;;;;;;;;;-1:-1:-1;;;;;10882:8:0;-1:-1:-1;;;;;10882:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10860:49:0;:10;-1:-1:-1;;;;;10860:49:0;;10852:77;;;;-1:-1:-1;;;10852:77:0;;13474:2:1;10852:77:0;;;13456:21:1;13513:2;13493:18;;;13486:30;-1:-1:-1;;;13532:18:1;;;13525:45;13587:18;;10852:77:0;;;;;;;;;10972:8:::1;::::0;::::1;;10971:9;10963:28;;;::::0;-1:-1:-1;;;10963:28:0;;12681:2:1;10963:28:0::1;::::0;::::1;12663:21:1::0;12720:1;12700:18;;;12693:29;-1:-1:-1;;;12738:18:1;;;12731:36;12784:18;;10963:28:0::1;12479:329:1::0;10963:28:0::1;17015:50:::2;17068:8:::0;;17099:7;;17068:39:::2;::::0;-1:-1:-1;;;17068:39:0;;::::2;::::0;::::2;15074:25:1::0;;;;17068:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;17068:8:0::2;::::0;:30:::2;::::0;15047:18:1;;17068:39:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17121:15;::::0;::::2;::::0;17015:92;;-1:-1:-1;;;;;;17121:29:0::2;17118:44;;17153:7;16900:3108:::0;:::o;17118:44::-:2;17269:8;::::0;17296:15:::2;::::0;;::::2;::::0;17313:18:::2;::::0;::::2;::::0;17333:14:::2;::::0;::::2;::::0;17269:79;;;;;-1:-1:-1;;;;;11877:55:1;;;17269:79:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;17269:8:0::2;::::0;;::::2;::::0;;::::2;::::0;:26:::2;::::0;11832:18:1;;17269:79:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:179;;;;;17419:8;;;;;;;;;-1:-1:-1::0;;;;;17419:8:0::2;-1:-1:-1::0;;;;;17419:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17377:8;::::0;17401:14:::2;::::0;::::2;::::0;17377:39:::2;::::0;-1:-1:-1;;;17377:39:0;;::::2;::::0;::::2;15074:25:1::0;;;;17377:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;17377:8:0::2;::::0;:23:::2;::::0;15047:18:1;;17377:39:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;17361:12;:87;;17269:179;:204;;;;-1:-1:-1::0;17461:7:0::2;::::0;::::2;::::0;:12;::::2;17269:204;17266:2681;;;17491:42;17536:8:::0;;17581:15:::2;::::0;;::::2;::::0;17616:18:::2;::::0;::::2;::::0;17653:14:::2;::::0;::::2;::::0;17536:146;;;;;-1:-1:-1;;;;;11877:55:1;;;17536:146:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;17536:8:0::2;::::0;;::::2;::::0;;::::2;::::0;:26:::2;::::0;11832:18:1;;17536:146:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17491:191;;17699:14;17716:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;17716:8:0::2;-1:-1:-1::0;;;;;17716:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17699:37;;17799:3;17778:1;:18;;;17766:1;:9;;;:30;;;;:::i;:::-;:36;;;;:::i;:::-;17753:1;:9;;:49;;;;;;;:::i;:::-;::::0;;-1:-1:-1;17827:5:0::2;::::0;::::2;::::0;:135:::2;;17953:9;17947:3;17935:1;:9;;;17925:1;:7;;;:19;;;;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;17915:1;:7;;;:47;;;;:::i;:::-;17827:135;;;17873:9;17867:3;17855:1;:9;;;17845:1;:7;;;:19;;;;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;17835:1;:7;;;:47;;;;:::i;:::-;17817:7;::::0;::::2;:145:::0;;;18005:10:::2;::::0;::::2;::::0;18017:4:::2;::::0;::::2;::::0;18023:5:::2;::::0;::::2;::::0;17986:43:::2;::::0;17817:145;18005:10;18017:4;17986:9:::2;:43::i;:::-;17979:1;:4;;:50;;;::::0;::::2;18051:43;18061:1;:7;;;18070:1;:10;;;18082:1;:4;;;18088:1;:5;;;18051:9;:43::i;:::-;18044:4;::::0;::::2;:50:::0;18176:10:::2;::::0;::::2;::::0;18165:7:::2;::::0;::::2;::::0;:21:::2;::::0;::::2;::::0;:46:::2;;;18201:1;:10;;;18190:1;:7;;;:21;;18165:46;:189;;;;-1:-1:-1::0;18314:8:0::2;::::0;18339:11:::2;::::0;::::2;::::0;18314:40:::2;::::0;-1:-1:-1;;;18314:40:0;;::::2;::::0;::::2;16586:25:1::0;;;;18352:1:0::2;16627:18:1::0;;;16620:34;18314:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;18314:8:0::2;::::0;:24:::2;::::0;16559:18:1;;18314:40:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18300:1;:10;;;18283:1;:14;;;:27;;;;:::i;:::-;18228:8;;;;;;;;;-1:-1:-1::0;;;;;18228:8:0::2;-1:-1:-1::0;;;;;18228:24:0::2;;18253:1;:11;;;18266:1;:5;;;:13;;18278:1;18266:13;;;18274:1;18266:13;18228:52;::::0;-1:-1:-1;;;;;;18228:52:0::2;::::0;;;;;;::::2;::::0;::::2;21128:25:1::0;;;;21201:4;21189:17;21169:18;;;21162:45;21101:18;;18228:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:82;;;;:::i;:::-;:126;;18165:189;18162:1774;;;18374:10;18387:8:::0;;18417;;18427:11:::2;::::0;::::2;::::0;18387:52:::2;::::0;-1:-1:-1;;;18387:52:0;;-1:-1:-1;;;;;11164:55:1;;;18387:52:0::2;::::0;::::2;11146:74:1::0;11236:18;;;11229:34;;;;18387:8:0::2;::::0;;::::2;;::::0;:29:::2;::::0;11119:18:1;;18387:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18374:65;;18519:574;18555:386;;;;;;;;18606:1;:8;;;-1:-1:-1::0;;;;;18555:386:0::2;;;;;18641:1;:11;;;18555:386;;;;18679:5;18555:386;;;;18711:1;18555:386;;;;18739:1;:14;;;18555:386;;;;18780:1;:7;;;18555:386;;;;18814:1;:5;;;18555:386;;;;;;18846:1;:10;;;18555:386;;;;18883:1;:4;;;18555:386;;;;18914:1;:4;;;18555:386;;::::0;18965:8:::2;;;;;;;;;-1:-1:-1::0;;;;;18965:8:0::2;-1:-1:-1::0;;;;;18965:20:0::2;;18986:1;:8;;;18965:30;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10188:55:1;;;;10170:74;;10158:2;10143:18;;10024:226;18965:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19019:18:::0;;19060:14:::2;::::0;::::2;::::0;18519:13:::2;:574::i;:::-;19114:8;::::0;19148;;19158:11:::2;::::0;::::2;::::0;19171:7:::2;::::0;;::::2;::::0;19114:65;;;;;-1:-1:-1;;;;;11877:55:1;;;19114:65:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;19114:8:0::2;::::0;;::::2;;::::0;:33:::2;::::0;11832:18:1;;19114:65:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;19198:42:0::2;19243:8:::0;;19263;;19273:11:::2;::::0;::::2;::::0;19243:49:::2;::::0;-1:-1:-1;;;19243:49:0;;-1:-1:-1;;;;;11877:55:1;;;19243:49:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;19198:42:0;;-1:-1:-1;19243:8:0::2;::::0;;::::2;;::::0;-1:-1:-1;19243:19:0::2;::::0;11832:18:1;;19243:49:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19311:50;19364:8:::0;;19388;;19398:11:::2;::::0;::::2;::::0;19364:53:::2;::::0;-1:-1:-1;;;19364:53:0;;-1:-1:-1;;;;;11877:55:1;;;19364:53:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;19198:94:0;;-1:-1:-1;19311:50:0;;19364:8:::2;::::0;;::::2;::::0;;::::2;::::0;:23:::2;::::0;11832:18:1;;19364:53:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19311:106;;19616:8;:18;;;-1:-1:-1::0;;;;;19443:477:0::2;;19479:1;:7;;;19509:8;:14;;;19546:10;19579:14;19657:34;19714:10;:20;;;19817:9;19786:14;:28;;;19757:10;:26;;;:57;;;;:::i;:::-;:69;;;;:::i;:::-;19873:28;::::0;::::2;::::0;19443:477:::2;::::0;::::2;::::0;;;;;;;;19849:1:::2;::::0;19443:477:::2;:::i;:::-;;;;;;;;18355:1581;;;18162:1774;17474:2473;;17266:2681;19957:8;::::0;19992:7;;19957:43:::2;::::0;-1:-1:-1;;;19957:43:0;;::::2;::::0;::::2;15074:25:1::0;;;;19957:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;19957:8:0::2;::::0;:34:::2;::::0;15047:18:1;;19957:43:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;17002:3006;10993:1;16900:3108:::0;:::o;20075:3191::-;10882:8;;;;;;;;;-1:-1:-1;;;;;10882:8:0;-1:-1:-1;;;;;10882:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10860:49:0;:10;-1:-1:-1;;;;;10860:49:0;;10852:77;;;;-1:-1:-1;;;10852:77:0;;13474:2:1;10852:77:0;;;13456:21:1;13513:2;13493:18;;;13486:30;-1:-1:-1;;;13532:18:1;;;13525:45;13587:18;;10852:77:0;13272:339:1;10852:77:0;10972:8:::1;::::0;::::1;;10971:9;10963:28;;;::::0;-1:-1:-1;;;10963:28:0;;12681:2:1;10963:28:0::1;::::0;::::1;12663:21:1::0;12720:1;12700:18;;;12693:29;-1:-1:-1;;;12738:18:1;;;12731:36;12784:18;;10963:28:0::1;12479:329:1::0;10963:28:0::1;20199:43:::2;20245:8:::0;;20276:7;;20245:39:::2;::::0;-1:-1:-1;;;20245:39:0;;::::2;::::0;::::2;15074:25:1::0;;;;20245:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;20245:8:0::2;::::0;:30:::2;::::0;15047:18:1;;20245:39:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20298:8;::::0;::::2;::::0;20199:85;;-1:-1:-1;;;;;;20298:22:0::2;20295:37;;20323:7;16900:3108:::0;:::o;20295:37::-:2;20344:33;20380:8:::0;;20400::::2;::::0;;::::2;::::0;20410:11:::2;::::0;::::2;::::0;20423:7:::2;::::0;::::2;::::0;20380:51;;-1:-1:-1;;;20380:51:0;;-1:-1:-1;;;;;11877:55:1;;;20380:51:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;20380:8:0::2;::::0;;::::2;::::0;;::::2;::::0;:19:::2;::::0;11832:18:1;;20380:51:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20442:37;20482:8:::0;;20506::::2;::::0;;::::2;::::0;20516:11:::2;::::0;::::2;::::0;20529:7:::2;::::0;::::2;::::0;20482:55;;-1:-1:-1;;;20482:55:0;;-1:-1:-1;;;;;11877:55:1;;;20482::0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;20344:87:0;;-1:-1:-1;20442:37:0;;20482:8:::2;::::0;;::::2;;::::0;:23:::2;::::0;11832:18:1;;20482:55:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20442:95;;20641:1;20628;:10;;;:14;:98;;;;;20697:8;;;;;;;;;-1:-1:-1::0;;;;;20697:8:0::2;-1:-1:-1::0;;;;;20697:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20662:8;::::0;20686:7:::2;::::0;::::2;::::0;20662:32:::2;::::0;-1:-1:-1;;;20662:32:0;;::::2;::::0;::::2;15074:25:1::0;;;;20662:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;20662:8:0::2;::::0;:23:::2;::::0;15047:18:1;;20662:32:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;20646:12;:80;;20628:98;:123;;;;-1:-1:-1::0;20739:7:0::2;::::0;::::2;::::0;:12;::::2;20628:123;20625:2578;;;20770:17;20790:147;20829:1;:11;;;20860:1;:7;;;20887:1;:5;;;20912:1;:10;;;20790:20;:147::i;:::-;20770:167;;20952:20;21013:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;21013:8:0::2;-1:-1:-1::0;;;;;21013:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21013:40:0::2;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20995:1;:15;;;20975:1;:17;;;:35;;;;:::i;:::-;:80;;;;:::i;:::-;20952:103:::0;-1:-1:-1;21072:19:0::2;::::0;21113:1:::2;:11;;;:47;;;;;;;;:::i;:::-;;:59;;;;;21171:1;21164;:4;;;:8;21113:59;:68;;;;;21176:1;:5;;;21113:68;:87;;;;;21196:1;:4;;;21185:1;:7;;;:15;;21113:87;21112:197;;;-1:-1:-1::0;21235:32:0::2;21220:1;:11;;;:47;;;;;;;;:::i;:::-;;:59;;;;;21278:1;21271;:4;;;:8;21220:59;:69;;;;;21284:1;:5;;;21283:6;21220:69;:88;;;;;21304:1;:4;;;21293:1;:7;;;:15;;21220:88;21112:304;;;-1:-1:-1::0;21343:32:0::2;21328:1;:11;;;:47;;;;;;;;:::i;:::-;;:59;;;;;21386:1;21379;:4;;;:8;21328:59;:68;;;;;21391:1;:5;;;21328:68;:87;;;;;21411:1;:4;;;21400:1;:7;;;:15;;21328:87;21112:412;;;-1:-1:-1::0;21450:32:0::2;21435:1;:11;;;:47;;;;;;;;:::i;:::-;;:59;;;;;21493:1;21486;:4;;;:8;21435:59;:69;;;;;21499:1;:5;;;21498:6;21435:69;:88;;;;;21519:1;:4;;;21508:1;:7;;;:15;;21435:88;21112:725;;21694:33;21679:1;:11;;;:48;;;;;;;;:::i;:::-;;:131;;;;;21782:8;;;;;;;;;-1:-1:-1::0;;;;;21782:8:0::2;-1:-1:-1::0;;;;;21782:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21768:34;::::0;9202:2:::2;21768:34;:::i;:::-;21764:46;::::0;-1:-1:-1;;21764:46:0::2;:::i;:::-;21747:13;:63;;21679:131;:158;;21836:1;21112:725;;21679:158;21813:20;21831:2;21813:15:::0;:20:::2;:::i;:::-;21112:725;;;21640:8;;;;;;;;;-1:-1:-1::0;;;;;21640:8:0::2;-1:-1:-1::0;;;;;21640:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21634:3;21621:1;:10;;;21603:15;21543:8;;;;;;;;;-1:-1:-1::0;;;;;21543:8:0::2;-1:-1:-1::0;;;;;21543:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21543:44:0::2;;21588:1;:11;;;21543:57;;;;;;;;;;;;;15074:25:1::0;;15062:2;15047:18;;14928:177;21543:57:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;:88;;;;:::i;:::-;:94;;;;:::i;:::-;:117;;;;:::i;:::-;21072:765:::0;-1:-1:-1;21908:18:0;;21905:1287:::2;;21948:8;::::0;21970:11;;21948:56:::2;::::0;-1:-1:-1;;;21948:56:0;;-1:-1:-1;;;;;11488:55:1;;;21948:56:0::2;::::0;::::2;11470:74:1::0;11560:18;;;11553:34;;;21948:8:0::2;11603:18:1::0;;;11596:50;21948:8:0::2;::::0;;::::2;;::::0;:21:::2;::::0;11443:18:1;;21948:56:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;22024:8:0::2;::::0;22052:7:::2;::::0;::::2;::::0;22024:52:::2;::::0;-1:-1:-1;;;22024:52:0;;::::2;::::0;::::2;16586:25:1::0;;;;16627:18;;;16620:34;;;22024:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;22024:8:0::2;::::0;-1:-1:-1;22024:27:0::2;::::0;-1:-1:-1;16559:18:1;;22024:52:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22164:469;22203:1;:8;;;22234:13;22308:8;;;;;;;;;-1:-1:-1::0;;;;;22308:8:0::2;-1:-1:-1::0;;;;;22308:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22290:1;:15;;;22270:1;:17;;;:35;;;;:::i;:::-;:58;;;;:::i;:::-;22351:14:::0;22403:33:::2;22388:1;:11;;;:48;;;;;;;;:::i;:::-;;:226;;22594:8;;;;;;;;;-1:-1:-1::0;;;;;22594:8:0::2;-1:-1:-1::0;;;;;22594:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22588:3;22536:8;;;;;;;;;-1:-1:-1::0;;;;;22536:8:0::2;-1:-1:-1::0;;;;;22536:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22536:36:0::2;;22573:1;:11;;;22536:49;;;;;;;;;;;;;15074:25:1::0;;15062:2;15047:18;;14928:177;22536:49:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22523:10;::::0;::::2;::::0;22505:28:::2;::::0;:15;:28:::2;:::i;:::-;:80;;;;:::i;:::-;:86;;;;:::i;:::-;:109;;;;:::i;:::-;22164:16;:469::i;22388:226::-;22439:14;22164:16;:469::i;:::-;22674:8;::::0;22699;;22709:11:::2;::::0;::::2;::::0;22722:7:::2;::::0;;::::2;::::0;22674:56;;-1:-1:-1;;;22674:56:0;;-1:-1:-1;;;;;11877:55:1;;;22674:56:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;22674:8:0::2;::::0;;::::2;;::::0;:24:::2;::::0;11832:18:1;;22674:56:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22900:1;:11;;;-1:-1:-1::0;;;;;22756:420:0::2;;22792:1;:7;;;22822:1;:7;;;22852:1;22876;22934;:11;;;22968:1;:7;;;23036:8;;;;;;;;;-1:-1:-1::0;;;;;23036:8:0::2;-1:-1:-1::0;;;;;23036:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23018:1;:15;;;22998:1;:17;;;:35;;;;:::i;:::-;:58;;;;:::i;:::-;23079:13;23115:8;;;;;;;;;-1:-1:-1::0;;;;;23115:8:0::2;-1:-1:-1::0;;;;;23115:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23115:40:0::2;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22756:420;;;;;;;;;;;;;;:::i;:::-;;;;;;;;21905:1287;20752:2451;;;20625:2578;23215:8;::::0;23250:7;;23215:43:::2;::::0;-1:-1:-1;;;23215:43:0;;::::2;::::0;::::2;15074:25:1::0;;;;23215:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;23215:8:0::2;::::0;:34:::2;::::0;15047:18:1;;23215:43:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;20178:3088;;;20075:3191:::0;:::o;11406:80::-;10781:8;;;;;;;;;-1:-1:-1;;;;;10781:8:0;-1:-1:-1;;;;;10781:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10767:28:0;:10;-1:-1:-1;;;;;10767:28:0;;10759:49;;;;-1:-1:-1;;;10759:49:0;;13818:2:1;10759:49:0;;;13800:21:1;13857:1;13837:18;;;13830:29;-1:-1:-1;;;13875:18:1;;;13868:38;13923:18;;10759:49:0;13616:331:1;10759:49:0;11453:8:::1;::::0;;::::1;::::0;;::::1;11452:9;-1:-1:-1::0;;11441:20:0;;::::1;::::0;::::1;::::0;;;11468:15:::1;::::0;11474:8;;12195:14:1;12188:22;12170:41;;11468:15:0::1;::::0;12158:2:1;12143:18;11468:15:0::1;;;;;;;11406:80::o:0;11101:239::-;10781:8;;;;;;;;;-1:-1:-1;;;;;10781:8:0;-1:-1:-1;;;;;10781:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10767:28:0;:10;-1:-1:-1;;;;;10767:28:0;;10759:49;;;;-1:-1:-1;;;10759:49:0;;13818:2:1;10759:49:0;;;13800:21:1;13857:1;13837:18;;;13830:29;-1:-1:-1;;;13875:18:1;;;13868:38;13923:18;;10759:49:0;13616:331:1;10759:49:0;11206:8:::1;;;;;;;;;-1:-1:-1::0;;;;;11206:8:0::1;-1:-1:-1::0;;;;;11206:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11187:33:0::1;:9;-1:-1:-1::0;;;;;11187:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11187:33:0::1;;11179:60;;;::::0;-1:-1:-1;;;11179:60:0;;14154:2:1;11179:60:0::1;::::0;::::1;14136:21:1::0;14193:2;14173:18;;;14166:30;14232:16;14212:18;;;14205:44;14266:18;;11179:60:0::1;13952:338:1::0;11179:60:0::1;11250:8;:20:::0;;-1:-1:-1;;;;;11250:20:0;::::1;;;::::0;;;::::1;;::::0;;11286:46:::1;::::0;::::1;::::0;::::1;::::0;11261:9;;13043:2:1;13025:21;;;13082:1;13062:18;;;13055:29;13120:10;13115:2;13100:18;;13093:38;-1:-1:-1;;;;;13205:55:1;;;;13198:4;13183:20;;13176:85;13163:3;13148:19;;12813:454;11286:46:0::1;;;;;;;;11101:239:::0;:::o;11557:2867::-;10882:8;;;;;;;;;-1:-1:-1;;;;;10882:8:0;-1:-1:-1;;;;;10882:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10860:49:0;:10;-1:-1:-1;;;;;10860:49:0;;10852:77;;;;-1:-1:-1;;;10852:77:0;;13474:2:1;10852:77:0;;;13456:21:1;13513:2;13493:18;;;13486:30;-1:-1:-1;;;13532:18:1;;;13525:45;13587:18;;10852:77:0;13272:339:1;10852:77:0;10972:8:::1;::::0;::::1;;10971:9;10963:28;;;::::0;-1:-1:-1;;;10963:28:0;;12681:2:1;10963:28:0::1;::::0;::::1;12663:21:1::0;12720:1;12700:18;;;12693:29;-1:-1:-1;;;12738:18:1;;;12731:36;12784:18;;10963:28:0::1;12479:329:1::0;10963:28:0::1;11668:46:::2;11717:8:::0;;11751:7;;11717:42:::2;::::0;-1:-1:-1;;;11717:42:0;;::::2;::::0;::::2;15074:25:1::0;;;;11717:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;11717:8:0::2;::::0;:33:::2;::::0;15047:18:1;;11717:42:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11668:91;;11773:1;:7;;;11784:1;11773:12;11770:27;;;11788:7;16900:3108:::0;:::o;11770:27::-:2;11809:14;11826:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;11826:8:0::2;-1:-1:-1::0;;;;;11826:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11809:37;;11903:3;11882:1;:18;;;11870:1;:9;;;:30;;;;:::i;:::-;:36;;;;:::i;:::-;11857:1;:9;;:49;;;;;;;:::i;:::-;::::0;;-1:-1:-1;11946:9:0::2;::::0;::::2;::::0;11936:7:::2;::::0;::::2;::::0;11919:14:::2;::::0;11964:9;;11958:3:::2;::::0;11936:19:::2;::::0;::::2;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;11919:54;;11984:16;12039:9;12033:3;12019:1;:11;;;12003:1;:13;;;:27;;;;:::i;:::-;:33;;;;:::i;:::-;:45;;;;:::i;:::-;12105:7:::0;;12137:5:::2;::::0;::::2;::::0;11984:64;;-1:-1:-1;12105:7:0;12137:49:::2;;12177:9;12167:1;:7;;;:19;;;;:::i;:::-;12137:49;;;12155:9;12145:1;:7;;;:19;;;;:::i;:::-;12123:11;::::0;::::2;:63:::0;12313:5:::2;::::0;::::2;::::0;:50;::::2;;;;12352:11;12336:1;:13;;;:27;;;;:::i;:::-;12322:1;:11;;;:41;12313:50;:114;;;;12377:1;:5;;;12376:6;:51;;;;;12416:11;12400:1;:13;;;:27;;;;:::i;:::-;12386:1;:11;;;:41;12376:51;12313:167;;;;12447:1;12440;:4;;;:8;:17;;;;;12452:1;:5;;;12440:17;:40;;;;;12476:1;:4;;;12461:1;:11;;;:19;;12440:40;12313:220;;;;12500:1;12493;:4;;;:8;:17;;;;;12505:1;:5;;;12493:17;:40;;;;;12529:1;:4;;;12514:1;:11;;;:19;;12493:40;12313:274;;;;12553:1;12546;:4;;;:8;:18;;;;;12559:1;:5;;;12558:6;12546:18;:41;;;;;12583:1;:4;;;12568:1;:11;;;:19;;12546:41;12313:328;;;;12607:1;12600;:4;;;:8;:18;;;;;12613:1;:5;;;12612:6;12600:18;:41;;;;;12637:1;:4;;;12622:1;:11;;;:19;;12600:41;12313:353;;;-1:-1:-1::0;12654:7:0::2;::::0;::::2;::::0;:12;12313:353:::2;:494;;;-1:-1:-1::0;12767:8:0::2;::::0;12792:11:::2;::::0;::::2;::::0;12767:40:::2;::::0;-1:-1:-1;;;12767:40:0;;::::2;::::0;::::2;16586:25:1::0;;;;12805:1:0::2;16627:18:1::0;;;16620:34;12767:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;12767:8:0::2;::::0;:24:::2;::::0;16559:18:1;;12767:40:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12754:1;:10;;;12734:1;:17;;;:30;;;;:::i;:::-;12679:8;;;;;;;;;-1:-1:-1::0;;;;;12679:8:0::2;-1:-1:-1::0;;;;;12679:24:0::2;;12704:1;:11;;;12717:1;:5;;;:13;;12729:1;12717:13;;;12725:1;12717:13;12679:52;::::0;-1:-1:-1;;;;;;12679:52:0::2;::::0;;;;;;::::2;::::0;::::2;21128:25:1::0;;;;21201:4;21189:17;21169:18;;;21162:45;21101:18;;12679:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;;;;:::i;:::-;:128;12313:494;12310:2042;;;12846:8;;;;;;;;;-1:-1:-1::0;;;;;12846:8:0::2;-1:-1:-1::0;;;;;12846:25:0::2;;12890:1;:11;;;12941:1;:10;;;12921:1;:17;;;:30;;;;:::i;:::-;12846:168;::::0;-1:-1:-1;;;;;;12846:168:0::2;::::0;;;;;;::::2;::::0;::::2;18512:25:1::0;;;;18553:18;;;18546:34;12971:4:0::2;18596:18:1::0;;;18589:50;;;18655:18;;;18648:50;18484:19;;12846:168:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12825:1;:17;;:189;;;;;;;:::i;:::-;::::0;;-1:-1:-1;13029:8:0::2;::::0;13069;;13079:17:::2;::::0;::::2;::::0;13029:68:::2;::::0;-1:-1:-1;;;13029:68:0;;:8:::2;::::0;;::::2;-1:-1:-1::0;;;;;13029:8:0;;::::2;:68;::::0;::::2;10518:34:1::0;;;10588:15;;10568:18;;;10561:43;10620:18;;;10613:34;13029:8:0;:20:::2;::::0;10430:18:1;;13029:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;13205:1;:11;;;13178:1;:8;;;-1:-1:-1::0;;;;;13119:204:0::2;;13152:1;:7;;;13235:1;:13;;;13267:1;:11;;;13297:1;:11;;;13119:204;;;;;;;;20791:25:1::0;;;20847:2;20832:18;;20825:34;;;;20890:2;20875:18;;20868:34;20933:2;20918:18;;20911:34;20778:3;20763:19;;20560:391;13119:204:0::2;;;;;;;;12310:2042;;;13425:8;::::0;13455;;13465:11:::2;::::0;::::2;::::0;13425:52:::2;::::0;-1:-1:-1;;;13425:52:0;;-1:-1:-1;;;;;11164:55:1;;;13425:52:0::2;::::0;::::2;11146:74:1::0;11236:18;;;11229:34;;;;13425:8:0::2;::::0;;::::2;;::::0;:29:::2;::::0;11119:18:1;;13425:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13415:1;:7;;:62;;;::::0;::::2;13499:47;13509:1;:11;;;13522:1;:10;;;13534:1;:4;;;13540:1;:5;;;13499:9;:47::i;:::-;13492:1;:4;;:54;;;::::0;::::2;13568:47;13578:1;:11;;;13591:1;:10;;;13603:1;:4;;;13609:1;:5;;;13568:9;:47::i;:::-;13561:4;::::0;::::2;:54:::0;13685:8:::2;::::0;13706;;13685:30:::2;::::0;;;;-1:-1:-1;;;;;10188:55:1;;;13685:30:0::2;::::0;::::2;10170:74:1::0;13632:149:0::2;::::0;13561:4;;13685:8:::2;::::0;;::::2;;::::0;:20:::2;::::0;10143:18:1;;13685:30:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13743:1;13765::::0;13632:13:::2;:149::i;:::-;13798:42;13843:8:::0;;13863;;13873:11:::2;::::0;::::2;::::0;13886:7:::2;::::0;;::::2;::::0;13843:51;;-1:-1:-1;;;13843:51:0;;-1:-1:-1;;;;;11877:55:1;;;13843:51:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;13843:8:0::2;::::0;;::::2;;::::0;:19:::2;::::0;11832:18:1;;13843:51:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13909:50;13962:8:::0;;13986;;13996:11:::2;::::0;::::2;::::0;14009:7:::2;::::0;;::::2;::::0;13962:55;;-1:-1:-1;;;13962:55:0;;-1:-1:-1;;;;;11877:55:1;;;13962::0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;13798:96:0;;-1:-1:-1;13909:50:0;;13962:8:::2;::::0;;::::2;::::0;;::::2;::::0;:23:::2;::::0;11832:18:1;;13962:55:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13909:108;;14037:301;14070:1;:7;;;14096:10;14125:4;14148:10;:20;;;14247:9;14216:14;:28;;;14187:10;:26;;;:57;;;;:::i;:::-;:69;;;;:::i;:::-;14295:28;::::0;::::2;::::0;14037:301:::2;::::0;::::2;::::0;;;;;;14275:1:::2;::::0;14037:301:::2;:::i;:::-;;;;;;;;13400:952;;12310:2042;14364:8;::::0;14402:7;;14364:52:::2;::::0;-1:-1:-1;;;14364:52:0;;::::2;::::0;::::2;15278:25:1::0;;;;14364:8:0::2;15319:18:1::0;;;15312:50;14364:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;14364:8:0::2;::::0;:37:::2;::::0;15251:18:1;;14364:52:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11655:2769;;;;;11557:2867:::0;:::o;14496:2338::-;10882:8;;;;;;;;;-1:-1:-1;;;;;10882:8:0;-1:-1:-1;;;;;10882:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10860:49:0;:10;-1:-1:-1;;;;;10860:49:0;;10852:77;;;;-1:-1:-1;;;10852:77:0;;13474:2:1;10852:77:0;;;13456:21:1;13513:2;13493:18;;;13486:30;-1:-1:-1;;;13532:18:1;;;13525:45;13587:18;;10852:77:0;13272:339:1;10852:77:0;10972:8:::1;::::0;::::1;;10971:9;10963:28;;;::::0;-1:-1:-1;;;10963:28:0;;12681:2:1;10963:28:0::1;::::0;::::1;12663:21:1::0;12720:1;12700:18;;;12693:29;-1:-1:-1;;;12738:18:1;;;12731:36;12784:18;;10963:28:0::1;12479:329:1::0;10963:28:0::1;14616:46:::2;14665:8:::0;;14699:7;;14665:42:::2;::::0;-1:-1:-1;;;14665:42:0;;::::2;::::0;::::2;15074:25:1::0;;;;14665:8:0::2;::::0;;::::2;-1:-1:-1::0;;;;;14665:8:0::2;::::0;:33:::2;::::0;15047:18:1;;14665:42:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14616:91;;14721:1;:7;;;14732:1;14721:12;14718:27;;;14736:7;16900:3108:::0;:::o;14718:27::-:2;14757:14;14774:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;14774:8:0::2;-1:-1:-1::0;;;;;14774:18:0::2;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14805:33;14841:8:::0;;14861:7;;:14;;14877:17:::2;::::0;::::2;::::0;14896:13:::2;::::0;;::::2;::::0;14841:69;;-1:-1:-1;;;14841:69:0;;-1:-1:-1;;;;;11877:55:1;;;14841:69:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;14757:37:0;;-1:-1:-1;14805:33:0;;14841:8:::2;::::0;;::::2;;::::0;:19:::2;::::0;11832:18:1;;14841:69:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14921:37;14961:8:::0;;14985:7;;:14;;15001:17:::2;::::0;::::2;::::0;15020:13:::2;::::0;;::::2;::::0;14961:73;;-1:-1:-1;;;14961:73:0;;-1:-1:-1;;;;;11877:55:1;;;14961:73:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;;;;14805:105:0;;-1:-1:-1;14921:37:0;;14961:8:::2;::::0;;::::2;;::::0;:23:::2;::::0;11832:18:1;;14961:73:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14921:113;;15047:20;15108:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;15108:8:0::2;-1:-1:-1::0;;;;;15108:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15108:40:0::2;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15090:1;:15;;;15070:1;:17;;;:35;;;;:::i;:::-;:80;;;;:::i;:::-;15047:103;;15257:1;:7;;;15268:1;15257:12;15254:1507;;;15287:13;15303:8:::0;::::2;;;;;;;;-1:-1:-1::0;;;;;15303:8:0::2;-1:-1:-1::0;;;;;15303:25:0::2;;15347:1;:11;;;15396:1;:10;;;15378:15;:28;;;;:::i;:::-;15303:165;::::0;-1:-1:-1;;;;;;15303:165:0::2;::::0;;;;;;::::2;::::0;::::2;18512:25:1::0;;;;18553:18;;;18546:34;15425:5:0::2;18596:18:1::0;;;18589:50;15449:4:0::2;18655:18:1::0;;;18648:50;18484:19;;15303:165:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15287:181;;15508:8;15488:1;:17;;;:28;15485:233;;;15557:8;15536:1;:17;;:29;;;;;;;:::i;:::-;::::0;;-1:-1:-1;15584:8:0::2;::::0;:23:::2;::::0;;;;:8:::2;::::0;;::::2;-1:-1:-1::0;;;;;15584:8:0::2;::::0;:20:::2;::::0;:23:::2;::::0;15605:1;;15584:23:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15485:233;;;15646:8;::::0;15671;;15681:11:::2;::::0;::::2;::::0;15694:7:::2;::::0;;::::2;::::0;15646:56;;-1:-1:-1;;;15646:56:0;;-1:-1:-1;;;;;11877:55:1;;;15646:56:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;15646:8:0::2;::::0;;::::2;;::::0;:24:::2;::::0;11832:18:1;;15646:56:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15485:233;15783:1;:11;;;15773:1;:8;;;-1:-1:-1::0;;;;;15739:65:0::2;;15764:1;:7;;;15796:1;:7;;;15739:65;;;;;;16586:25:1::0;;;16642:2;16627:18;;16620:34;16574:2;16559:18;;16404:256;15739:65:0::2;;;;;;;;15270:603;15254:1507;;;15881:10;::::0;::::2;::::0;:14;15878:883:::2;;15913:17;15933:61;15954:1;:11;;;15967:1;:7;;;15976:1;:5;;;15983:1;:10;;;15933:20;:61::i;:::-;15913:81;;16077:293;16112:1;:8;;;16139:13;16209:9;16191:1;:15;;;16171:1;:17;;;:35;;;;:::i;:::-;:47;;;;:::i;:::-;16237:1;16346:9;16340:3;16288:8;;;;;;;;;-1:-1:-1::0;;;;;16288:8:0::2;-1:-1:-1::0;;;;;16288:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16288:36:0::2;;16325:1;:11;;;16288:49;;;;;;;;;;;;;15074:25:1::0;;15062:2;15047:18;;14928:177;16288:49:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16275:10;::::0;::::2;::::0;16257:28:::2;::::0;:15;:28:::2;:::i;16077:293::-;16392:284;16425:1;:7;;;16451:1;16471:5;16495:1;:7;;;16559:9;16541:1;:15;;;16521:1;:17;;;:35;;;;:::i;:::-;:47;;;;:::i;:::-;16587:13;16619:8;;;;;;;;;-1:-1:-1::0;;;;;16619:8:0::2;-1:-1:-1::0;;;;;16619:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16619:40:0::2;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16392:284;;;;;;;;;;;;:::i;:::-;;;;;;;;16693:8;::::0;16718;;16728:11:::2;::::0;::::2;::::0;16741:7:::2;::::0;;::::2;::::0;16693:56;;-1:-1:-1;;;16693:56:0;;-1:-1:-1;;;;;11877:55:1;;;16693:56:0::2;::::0;::::2;11859:74:1::0;11949:18;;;11942:34;;;;11992:18;;;11985:34;16693:8:0::2;::::0;;::::2;;::::0;:24:::2;::::0;11832:18:1;;16693:56:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15896:865;15878:883;16773:8;::::0;;16811:7;;16773:53:::2;::::0;-1:-1:-1;;;16773:53:0;;::::2;::::0;::::2;15278:25:1::0;;;;15319:18;;;15312:50;;;;16773:8:0::2;::::0;::::2;-1:-1:-1::0;;;;;16773:8:0::2;::::0;:37:::2;::::0;15251:18:1;;16773:53:0::2;15110:258:1::0;28189:514:0;28279:4;28298:7;;;:110;;;28387:8;;;;;;;;;-1:-1:-1;;;;;28387:8:0;-1:-1:-1;;;;;28387:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28367:8;;;;;;;;;-1:-1:-1;;;;;28367:8:0;-1:-1:-1;;;;;28367:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;28309:50;28330:9;28341:2;28345:3;28350:8;28309:20;:50::i;:::-;:99;28298:110;28295:381;;;28424:11;28477:3;28468:8;28448;;;;;;;;;-1:-1:-1;;;;;28448:8:0;-1:-1:-1;;;;;28448:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28438:29;;:9;:29;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;:::-;28424:56;;28498:3;28495:170;;;28511:18;28523:6;28511:9;:18;:::i;:::-;28504:25;;;;;28495:170;28564:9;28554:6;:19;28551:114;;28583:18;28595:6;28583:9;:18;:::i;28551:114::-;28648:1;28641:8;;;;;28295:381;-1:-1:-1;28693:2:0;28189:514;;;;;;;:::o;28709:430::-;28799:4;28823:1;28818:2;:6;:113;;;;;28903:8;;;;;;;;;-1:-1:-1;;;;;28903:8:0;-1:-1:-1;;;;;28903:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28885:8;;;;;;;;;-1:-1:-1;;;;;28885:8:0;-1:-1:-1;;;;;28885:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;;:::i;:::-;28881:50;;-1:-1:-1;;28881:50:0;:::i;:::-;28828;28849:9;28860:2;28864:3;28869:8;28828:20;:50::i;:::-;:103;28818:113;28815:297;;;28947:11;28998:3;28989:8;28971;;;;;;;;;-1:-1:-1;;;;;28971:8:0;-1:-1:-1;;;;;28971:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28961:27;;:9;:27;:::i;:::-;:36;;;;:::i;:::-;:40;;;;:::i;:::-;28947:54;;29019:3;29016:85;;;29032:18;29044:6;29032:9;:18;:::i;29016:85::-;29080:18;29092:6;29080:9;:18;:::i;23306:3267::-;23486:14;23503:8;;;;;;;;;-1:-1:-1;;;;;23503:8:0;-1:-1:-1;;;;;23503:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23486:37;;23621:8;;;;;;;;;-1:-1:-1;;;;;23621:8:0;-1:-1:-1;;;;;23621:25:0;;23661:6;:16;;;23717:6;:15;;;23692:6;:22;;;:40;;;;:::i;:::-;23621:161;;-1:-1:-1;;;;;;23621:161:0;;;;;;;;;;18512:25:1;;;;18553:18;;;18546:34;23747:4:0;18596:18:1;;;18589:50;23766:5:0;18655:18:1;;;18648:50;18484:19;;23621:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23595:6;:22;;:187;;;;;;;:::i;:::-;;;-1:-1:-1;23864:8:0;;23919:22;;;;23864:78;;-1:-1:-1;;;23864:78:0;;:8;;;;-1:-1:-1;;;;;23864:8:0;:78;;;10518:34:1;;;23912:4:0;10568:18:1;;;10561:43;10620:18;;;10613:34;;;;23864:8:0;:20;;10430:18:1;;23864:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23994:28;24025:8;;;;;;;;;-1:-1:-1;;;;;24025:8:0;-1:-1:-1;;;;;24025:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24025:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23994:73;;24126:8;;;;;;;;;-1:-1:-1;;;;;24126:8:0;-1:-1:-1;;;;;24126:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24126:22:0;;24157:8;;;;;;;;;-1:-1:-1;;;;;24157:8:0;-1:-1:-1;;;;;24157:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24185:22;;;;24126:82;;-1:-1:-1;;;;;;24126:82:0;;;;;;;-1:-1:-1;;;;;11164:55:1;;;24126:82:0;;;11146:74:1;11236:18;;;11229:34;11119:18;;24126:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24219:21;24243:8;;;;;;;;;-1:-1:-1;;;;;24243:8:0;-1:-1:-1;;;;;24243:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24243:50:0;;24308:6;:22;;;24345:1;24361:16;:14;:16::i;:::-;24400:4;24420:21;:15;24438:3;24420:21;:::i;:::-;24243:209;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24243:209:0;;;;;;;;;;;;:::i;:::-;24531:1;24506:22;;;:26;24642:10;;24219:233;;-1:-1:-1;24219:233:0;;24650:1;;24642:10;;;;;;:::i;:::-;;;;;;;;;;;24617:22;;;:35;;;24713:8;;;:67;;-1:-1:-1;;;24713:67:0;;24743:4;24713:67;;;11470:74:1;11560:18;;;11553:34;;;;11603:18;;;11596:50;;;;24713:8:0;;;-1:-1:-1;;;;;24713:8:0;;:21;;11443:18:1;;24713:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24865:8;;;;;;;;;-1:-1:-1;;;;;24865:8:0;-1:-1:-1;;;;;24865:25:0;;24905:6;:16;;;24961:6;:15;;;24936:6;:22;;;:40;;;;:::i;:::-;24865:162;;-1:-1:-1;;;;;;24865:162:0;;;;;;;;;;18512:25:1;;;;18553:18;;;18546:34;24991:5:0;18596:18:1;;;18589:50;;;18655:18;;;18648:50;18484:19;;24865:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24839:6;:22;;:188;;;;;;;:::i;:::-;;;;;;;;25114:19;25248:3;25236:9;25179:8;;;;;;;;;-1:-1:-1;;;;;25179:8:0;-1:-1:-1;;;;;25179:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25179:36:0;;25216:6;:16;;;25179:54;;;;;;;;;;;;;15074:25:1;;15062:2;15047:18;;14928:177;25179:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25161:6;:15;;;25136:6;:22;;;:40;;;;:::i;:::-;:97;;;;:::i;:::-;:109;;;;:::i;:::-;:115;;;;:::i;:::-;25114:137;-1:-1:-1;;;;;;25265:23:0;;;25262:217;;25305:19;25323:1;25305:19;;:::i;:::-;25339:8;;:54;;-1:-1:-1;;;25339:54:0;;-1:-1:-1;;;;;11488:55:1;;;25339:54:0;;;11470:74:1;11560:18;;;11553:34;;;25339:8:0;11603:18:1;;;11596:50;25305:19:0;;-1:-1:-1;25339:8:0;;;;;;;;:21;;11443:18:1;;25339:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25408:8:0;;:59;;;;;-1:-1:-1;;;;;11164:55:1;;;25408:59:0;;;11146:74:1;11236:18;;;11229:34;;;25408:8:0;;;;;;;;-1:-1:-1;25408:32:0;;-1:-1:-1;11119:18:1;;25408:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25262:217;25515:14;25489:6;:22;;:40;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;;25603:24:0;;;25600:391;;25643:19;25779:9;25773:3;25708:8;;;;;;;;;-1:-1:-1;;;;;25708:8:0;-1:-1:-1;;;;;25708:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25708:44:0;;25753:6;:16;;;25708:62;;;;;;;;;;;;;15074:25:1;;15062:2;15047:18;;14928:177;25708:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25690:6;:15;;;25665:6;:22;;;:40;;;;:::i;:::-;:105;;;;:::i;:::-;:111;;;;:::i;:::-;:123;;;;:::i;:::-;25803:8;;:55;;-1:-1:-1;;;25803:55:0;;-1:-1:-1;;;;;11488:55:1;;;25803::0;;;11470:74:1;11560:18;;;11553:34;;;25803:8:0;11603:18:1;;;11596:50;25643:145:0;;-1:-1:-1;25803:8:0;;;;;;;;:21;;11443:18:1;;25803:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25873:8:0;;:51;;-1:-1:-1;;;25873:51:0;;;;;16586:25:1;;;16627:18;;;16620:34;;;25873:8:0;;;;-1:-1:-1;;;;;25873:8:0;;-1:-1:-1;25873:27:0;;-1:-1:-1;16559:18:1;;25873:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25965:14;25939:6;:22;;:40;;;;;;;:::i;:::-;;;-1:-1:-1;;25600:391:0;26042:8;;;;;;;;;-1:-1:-1;;;;;26042:8:0;-1:-1:-1;;;;;26042:19:0;;26076:6;26098:262;;;;;;;;26145:1;26098:262;;;;26166:23;26098:262;;;;26272:9;26248:23;26232:6;:15;;;26209:6;:22;;;:38;;;;:::i;:::-;:62;;;;:::i;:::-;:72;;;;:::i;:::-;26098:262;;;;26300:1;26098:262;;;;26320:1;26098:262;;;;26340:5;26098:262;;;;;26042:329;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26421:8:0;;26464:13;;26493:43;;;;;-1:-1:-1;;;;;10188:55:1;;;26493:43:0;;;10170:74:1;26421:8:0;;;;;;;;-1:-1:-1;26421:28:0;;-1:-1:-1;26464:13:0;26421:8;;26493:28;;10143:18:1;;26493:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;:61;;26550:4;26493:61;;;26544:3;26493:61;26421:144;;-1:-1:-1;;;;;;26421:144:0;;;;;;;-1:-1:-1;;;;;10849:55:1;;;26421:144:0;;;10831:74:1;10953:6;10941:19;10921:18;;;10914:47;10804:18;;26421:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23473:3100;;;;23306:3267;;;;:::o;27613:570::-;27724:5;27741:13;27761:8;;;;;;;;;-1:-1:-1;;;;;27761:8:0;-1:-1:-1;;;;;27761:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27741:41;;27793:12;27812:8;;;;;;;;;-1:-1:-1;;;;;27812:8:0;-1:-1:-1;;;;;27812:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27793:39;;27847:3;:200;;28037:9;28021:8;28005:9;27961:34;27982:12;28037:9;27961:34;:::i;:::-;27960:42;;27999:3;27960:42;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:87;;;;:::i;:::-;27847:200;;;27930:9;27914:8;27898:9;27854:34;27930:9;27858:12;27854:34;:::i;:::-;27853:42;;27892:3;27853:42;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:87;;;;:::i;:::-;27843:204;-1:-1:-1;28066:18:0;:9;-1:-1:-1;;28066:18:0;:::i;:::-;28062:1;:22;:47;;28108:1;28062:47;;;28087:18;:9;-1:-1:-1;;28087:18:0;:::i;:::-;28058:51;-1:-1:-1;28128:20:0;28139:9;28128:8;:20;:::i;:::-;28124:1;:24;:51;;28174:1;28124:51;;;28151:20;28162:9;28151:8;:20;:::i;:::-;28120:55;27613:570;-1:-1:-1;;;;;;;27613:570:0:o;26640:951::-;26921:14;26938:8;;;;;;;;;-1:-1:-1;;;;;26938:8:0;-1:-1:-1;;;;;26938:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26997:8;;:36;;;;;;;;15074:25:1;;;26921:37:0;;-1:-1:-1;26997:8:0;;;-1:-1:-1;;;;;26997:8:0;;:28;;15047:18:1;;26997:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27129:9;9202:2;27115:23;;;;:::i;:::-;27111:33;;-1:-1:-1;;27111:33:0;:::i;:::-;27094:14;:50;27091:493;;;27202:10;27257:9;27247:3;27215:29;27236:7;27215:14;:29;:::i;:::-;:35;;;;:::i;:::-;:52;;;;:::i;:::-;27202:65;;27426:9;27381:8;;;;;;;;;-1:-1:-1;;;;;27381:8:0;-1:-1:-1;;;;;27381:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27381:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27353:24;27362:15;27353:6;:24;:::i;:::-;27352:71;;;;:::i;:::-;:83;;;;:::i;:::-;27338:98;;;;:::i;:::-;;;27502:8;;;;;;;;;-1:-1:-1;;;;;27502:8:0;-1:-1:-1;;;;;27502:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27502:32:0;;27535:7;27549:21;27564:6;27553:7;27549:21;:::i;:::-;27502:70;;-1:-1:-1;;;;;;27502:70:0;;;;;;;-1:-1:-1;;;;;11164:55:1;;;27502:70:0;;;11146:74:1;11236:18;;;11229:34;11119:18;;27502:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27145:439;26908:683;26640:951;;;;;:::o;29145:235::-;29244:16;;;29258:1;29244:16;;;29192;29244;;;;;29192;29220:21;;29244:16;29258:1;29244:16;;;;;;;;;;-1:-1:-1;29244:16:0;29220:40;;29289:8;;;;;;;;;-1:-1:-1;;;;;29289:8:0;-1:-1:-1;;;;;29289:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29271:4;29276:1;29271:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;29271:33:0;;;-1:-1:-1;;;;;29271:33:0;;;;;29333:8;;;;;;;;;-1:-1:-1;;;;;29333:8:0;-1:-1:-1;;;;;29333:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29315:4;29320:1;29315:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29315:35:0;;;:7;;;;;;;;;;;:35;29368:4;29145:235;-1:-1:-1;29145:235:0:o;14:138:1:-;93:13;;115:31;93:13;115:31;:::i;:::-;14:138;;;:::o;157:164::-;233:13;;282;;275:21;265:32;;255:60;;311:1;308;301:12;326:840;389:5;437:6;425:9;420:3;416:19;412:32;409:52;;;457:1;454;447:12;409:52;479:22;;:::i;:::-;470:31;;524:40;554:9;524:40;:::i;:::-;517:5;510:55;618:2;607:9;603:18;597:25;592:2;585:5;581:14;574:49;676:2;665:9;661:18;655:25;650:2;643:5;639:14;632:49;734:2;723:9;719:18;713:25;708:2;701:5;697:14;690:49;793:3;782:9;778:19;772:26;766:3;759:5;755:15;748:51;853:3;842:9;838:19;832:26;826:3;819:5;815:15;808:51;892:47;934:3;923:9;919:19;892:47;:::i;:::-;886:3;879:5;875:15;868:72;994:3;983:9;979:19;973:26;967:3;960:5;956:15;949:51;1019:3;1075:2;1064:9;1060:18;1054:25;1049:2;1042:5;1038:14;1031:49;;1099:3;1155:2;1144:9;1140:18;1134:25;1129:2;1122:5;1118:14;1111:49;;326:840;;;;:::o;1171:251::-;1241:6;1294:2;1282:9;1273:7;1269:23;1265:32;1262:52;;;1310:1;1307;1300:12;1262:52;1342:9;1336:16;1361:31;1386:5;1361:31;:::i;:::-;1411:5;1171:251;-1:-1:-1;;;1171:251:1:o;1427:947::-;1522:6;1553:2;1596;1584:9;1575:7;1571:23;1567:32;1564:52;;;1612:1;1609;1602:12;1564:52;1645:9;1639:16;1674:18;1715:2;1707:6;1704:14;1701:34;;;1731:1;1728;1721:12;1701:34;1769:6;1758:9;1754:22;1744:32;;1814:7;1807:4;1803:2;1799:13;1795:27;1785:55;;1836:1;1833;1826:12;1785:55;1865:2;1859:9;1887:2;1883;1880:10;1877:36;;;1893:18;;:::i;:::-;1939:2;1936:1;1932:10;1922:20;;1962:28;1986:2;1982;1978:11;1962:28;:::i;:::-;2024:15;;;2055:12;;;;2087:11;;;2117;;;2113:20;;2110:33;-1:-1:-1;2107:53:1;;;2156:1;2153;2146:12;2107:53;2178:1;2169:10;;2188:156;2202:2;2199:1;2196:9;2188:156;;;2259:10;;2247:23;;2220:1;2213:9;;;;;2290:12;;;;2322;;2188:156;;;-1:-1:-1;2363:5:1;1427:947;-1:-1:-1;;;;;;;;1427:947:1:o;2379:202::-;2446:6;2499:2;2487:9;2478:7;2474:23;2470:32;2467:52;;;2515:1;2512;2505:12;2467:52;2538:37;2565:9;2538:37;:::i;2871:273::-;2956:6;3009:2;2997:9;2988:7;2984:23;2980:32;2977:52;;;3025:1;3022;3015:12;2977:52;3064:9;3051:23;3083:31;3108:5;3083:31;:::i;3996:578::-;4088:6;4141:2;4129:9;4120:7;4116:23;4112:32;4109:52;;;4157:1;4154;4147:12;4109:52;4190:2;4184:9;4232:2;4224:6;4220:15;4301:6;4289:10;4286:22;4265:18;4253:10;4250:34;4247:62;4244:88;;;4312:18;;:::i;:::-;4352:10;4348:2;4341:22;;4400:9;4387:23;4379:6;4372:39;4472:2;4461:9;4457:18;4444:32;4439:2;4431:6;4427:15;4420:57;4538:2;4527:9;4523:18;4510:32;4505:2;4497:6;4493:15;4486:57;4562:6;4552:16;;;3996:578;;;;:::o;4579:1148::-;4680:6;4733:3;4721:9;4712:7;4708:23;4704:33;4701:53;;;4750:1;4747;4740:12;4701:53;4776:22;;:::i;:::-;4821:40;4851:9;4821:40;:::i;:::-;4814:5;4807:55;4915:2;4904:9;4900:18;4894:25;4889:2;4882:5;4878:14;4871:49;4973:2;4962:9;4958:18;4952:25;4947:2;4940:5;4936:14;4929:49;5031:2;5020:9;5016:18;5010:25;5005:2;4998:5;4994:14;4987:49;5090:3;5079:9;5075:19;5069:26;5063:3;5056:5;5052:15;5045:51;5129:47;5171:3;5160:9;5156:19;5129:47;:::i;:::-;5123:3;5112:15;;5105:72;5231:3;5216:19;;;5210:26;5193:15;;;5186:51;5291:3;5276:19;;;5270:26;5253:15;;;5246:51;5316:3;5357:18;;;5351:25;5335:14;;;5328:49;5396:3;5437:18;;;5431:25;5415:14;;;5408:49;5476:3;5517:18;;;5511:25;5495:14;;;5488:49;5556:3;5597:18;;;5591:25;5575:14;;;5568:49;5636:3;5677:18;;;5671:25;5655:14;;;5648:49;;;;-1:-1:-1;5116:5:1;4579:1148;-1:-1:-1;4579:1148:1:o;5732:801::-;5837:6;5890:3;5878:9;5869:7;5865:23;5861:33;5858:53;;;5907:1;5904;5897:12;5858:53;5940:2;5934:9;5982:4;5974:6;5970:17;6053:6;6041:10;6038:22;6017:18;6005:10;6002:34;5999:62;5996:88;;;6064:18;;:::i;:::-;6100:2;6093:22;6139:54;6185:7;6174:9;6139:54;:::i;:::-;6124:70;;6250:3;6235:19;;6229:26;6222:4;6210:17;;6203:53;6310:3;6295:19;;6289:26;6284:2;6272:15;;6265:51;6372:3;6357:19;;6351:26;6344:4;6332:17;;6325:53;6434:3;6419:19;;6413:26;6406:4;6394:17;;6387:53;6496:3;6481:19;;;6475:26;6468:4;6456:17;;6449:53;-1:-1:-1;6131:6:1;5732:801;-1:-1:-1;5732:801:1:o;6538:812::-;6640:6;6693:3;6681:9;6672:7;6668:23;6664:33;6661:53;;;6710:1;6707;6700:12;6661:53;6736:22;;:::i;:::-;6788:9;6782:16;6807:33;6832:7;6807:33;:::i;:::-;6849:22;;6924:2;6909:18;;;6903:25;6887:14;;;6880:49;6974:2;6959:18;;6953:25;6987:33;6953:25;6987:33;:::i;:::-;7052:7;7047:2;7040:5;7036:14;7029:31;;7113:2;7102:9;7098:18;7092:25;7087:2;7080:5;7076:14;7069:49;7172:3;7161:9;7157:19;7151:26;7145:3;7138:5;7134:15;7127:51;7223:3;7212:9;7208:19;7202:26;7259:1;7250:7;7247:14;7237:42;;7275:1;7272;7265:12;7237:42;7306:3;7295:15;;7288:32;7299:5;6538:812;-1:-1:-1;;;6538:812:1:o;7355:599::-;7451:6;7504:3;7492:9;7483:7;7479:23;7475:33;7472:53;;;7521:1;7518;7511:12;7472:53;7547:22;;:::i;:::-;7598:9;7592:16;7585:5;7578:31;7662:2;7651:9;7647:18;7641:25;7636:2;7629:5;7625:14;7618:49;7720:2;7709:9;7705:18;7699:25;7694:2;7687:5;7683:14;7676:49;7778:2;7767:9;7763:18;7757:25;7752:2;7745:5;7741:14;7734:49;7837:3;7826:9;7822:19;7816:26;7810:3;7803:5;7799:15;7792:51;7876:47;7918:3;7907:9;7903:19;7876:47;:::i;7959:245::-;8051:6;8104:3;8092:9;8083:7;8079:23;8075:33;8072:53;;;8121:1;8118;8111:12;8072:53;8144:54;8190:7;8179:9;8144:54;:::i;8209:184::-;8279:6;8332:2;8320:9;8311:7;8307:23;8303:32;8300:52;;;8348:1;8345;8338:12;8300:52;-1:-1:-1;8371:16:1;;8209:184;-1:-1:-1;8209:184:1:o;8626:295::-;8708:1;8701:5;8698:12;8688:200;;-1:-1:-1;;;8741:1:1;8734:88;8845:4;8842:1;8835:15;8873:4;8870:1;8863:15;8688:200;8897:18;;8626:295::o;9321:698::-;9399:12;;-1:-1:-1;;;;;8464:54:1;8452:67;;9466:4;9459:5;9455:16;9449:23;9442:4;9437:3;9433:14;9426:47;9522:4;9515:5;9511:16;9505:23;9498:4;9493:3;9489:14;9482:47;9578:4;9571:5;9567:16;9561:23;9554:4;9549:3;9545:14;9538:47;9634:4;9627:5;9623:16;9617:23;9610:4;9605:3;9601:14;9594:47;9690:4;9683:5;9679:16;9673:23;9666:4;9661:3;9657:14;9650:47;9743:4;9736:5;9732:16;9726:23;9758:45;9797:4;9792:3;9788:14;9774:12;8600:13;8593:21;8581:34;;8530:91;9758:45;-1:-1:-1;9852:4:1;9841:16;;;9835:23;9819:14;;;9812:47;9878:6;9920:14;;;9914:21;9900:12;;;9893:43;9955:6;9997:14;;;9991:21;9977:12;;9970:43;9321:698::o;14295:239::-;14473:3;14458:19;;14486:42;14462:9;14510:6;14486:42;:::i;:::-;14295:239;;;;:::o;14539:384::-;14797:3;14782:19;;14810:42;14786:9;14834:6;14810:42;:::i;:::-;9001:12;;14912:3;14897:19;;8989:25;9063:4;9052:16;;9046:23;9030:14;;;9023:47;9119:4;9108:16;;9102:23;9086:14;;;9079:47;9175:4;9164:16;;9158:23;9142:14;;;9135:47;9231:4;9220:16;;9214:23;9198:14;;;9191:47;9301:4;9290:16;;9284:23;9277:31;9270:39;9254:14;;;9247:63;14861:56;8926:390;15373:1026;15635:4;15683:3;15672:9;15668:19;15714:6;15703:9;15696:25;15740:2;15778:6;15773:2;15762:9;15758:18;15751:34;15821:3;15816:2;15805:9;15801:18;15794:31;15845:6;15880;15874:13;15911:6;15903;15896:22;15949:3;15938:9;15934:19;15927:26;;15988:2;15980:6;15976:15;15962:29;;16009:1;16019:218;16033:6;16030:1;16027:13;16019:218;;;16098:13;;-1:-1:-1;;;;;16094:62:1;16082:75;;16212:15;;;;16177:12;;;;16055:1;16048:9;16019:218;;;-1:-1:-1;;;;;;;16293:55:1;;;;16288:2;16273:18;;16266:83;-1:-1:-1;;;16380:3:1;16365:19;16358:35;16254:3;15373:1026;-1:-1:-1;;;15373:1026:1:o;16665:678::-;17016:25;;;17003:3;16988:19;;17050:51;17097:2;17082:18;;17074:6;17050:51;:::i;:::-;17145:14;;17138:22;17132:3;17117:19;;17110:51;17192:3;17177:19;;17170:35;;;;17236:3;17221:19;;17214:35;;;;17280:3;17265:19;;17258:35;17324:3;17309:19;;;17302:35;16665:678;;-1:-1:-1;;16665:678:1:o;18709:916::-;19186:25;;;19242:2;19227:18;;19220:34;;;19173:3;19158:19;;19263:51;19310:2;19295:18;;19287:6;19263:51;:::i;:::-;9001:12;;19374:3;19359:19;;8989:25;9063:4;9052:16;;9046:23;9030:14;;;9023:47;9119:4;9108:16;;9102:23;9086:14;;;9079:47;9175:4;9164:16;;9158:23;9142:14;;;9135:47;9231:4;9220:16;;9214:23;9198:14;;;9191:47;9301:4;9290:16;;9284:23;9277:31;9270:39;9254:14;;;9247:63;19388:55;19438:3;19427:9;19423:19;19415:6;19388:55;:::i;:::-;19480:6;19474:3;19463:9;19459:19;19452:35;19524:6;19518:3;19507:9;19503:19;19496:35;19568:6;19562:3;19551:9;19547:19;19540:35;19612:6;19606:3;19595:9;19591:19;19584:35;18709:916;;;;;;;;;;;;:::o;21218:255::-;21290:2;21284:9;21332:6;21320:19;;21369:18;21354:34;;21390:22;;;21351:62;21348:88;;;21416:18;;:::i;:::-;21452:2;21445:22;21218:255;:::o;21478:252::-;21550:2;21544:9;21592:3;21580:16;;21626:18;21611:34;;21647:22;;;21608:62;21605:88;;;21673:18;;:::i;21735:252::-;21807:2;21801:9;21849:3;21837:16;;21883:18;21868:34;;21904:22;;;21865:62;21862:88;;;21930:18;;:::i;21992:275::-;22063:2;22057:9;22128:2;22109:13;;-1:-1:-1;;22105:27:1;22093:40;;22163:18;22148:34;;22184:22;;;22145:62;22142:88;;;22210:18;;:::i;:::-;22246:2;22239:22;21992:275;;-1:-1:-1;21992:275:1:o;22272:367::-;22311:3;22346:1;22343;22339:9;22455:1;-1:-1:-1;;;;;22383:74:1;22380:1;22376:82;22371:2;22364:10;22360:99;22357:125;;;22462:18;;:::i;:::-;22581:1;-1:-1:-1;;;22509:74:1;22506:1;22502:82;22498:2;22494:91;22491:117;;;22588:18;;:::i;:::-;-1:-1:-1;;22624:9:1;;22272:367::o;22644:128::-;22684:3;22715:1;22711:6;22708:1;22705:13;22702:39;;;22721:18;;:::i;:::-;-1:-1:-1;22757:9:1;;22644:128::o;22777:248::-;22816:1;22842;22832:35;;22847:18;;:::i;:::-;-1:-1:-1;;;22883:73:1;;-1:-1:-1;;22958:13:1;;22879:93;22876:119;;;22975:18;;:::i;:::-;-1:-1:-1;23009:10:1;;22777:248::o;23030:120::-;23070:1;23096;23086:35;;23101:18;;:::i;:::-;-1:-1:-1;23135:9:1;;23030:120::o;23155:655::-;23194:7;-1:-1:-1;;;;;23318:1:1;23315;23311:9;23346:1;23343;23339:9;23391:1;23387:2;23383:10;23380:1;23377:17;23372:2;23368;23364:11;23360:35;23357:61;;;23398:18;;:::i;:::-;-1:-1:-1;;;23529:1:1;23526;23522:9;23576:1;23572:2;23567:11;23564:1;23560:19;23555:2;23551;23547:11;23543:37;23540:63;;;23583:18;;:::i;:::-;23629:1;23626;23622:9;23612:19;;23676:1;23672:2;23667:11;23664:1;23660:19;23655:2;23651;23647:11;23643:37;23640:63;;;23683:18;;:::i;:::-;23748:1;23744:2;23739:11;23736:1;23732:19;23727:2;23723;23719:11;23715:37;23712:63;;;23755:18;;:::i;:::-;-1:-1:-1;;;23795:9:1;;;;;23155:655;-1:-1:-1;;;23155:655:1:o;23815:168::-;23855:7;23921:1;23917;23913:6;23909:14;23906:1;23903:21;23898:1;23891:9;23884:17;23880:45;23877:71;;;23928:18;;:::i;:::-;-1:-1:-1;23968:9:1;;23815:168::o;23988:369::-;24027:4;24063:1;24060;24056:9;24172:1;-1:-1:-1;;;24100:74:1;24097:1;24093:82;24088:2;24081:10;24077:99;24074:125;;;24179:18;;:::i;:::-;24298:1;-1:-1:-1;;;;;24226:74:1;24223:1;24219:82;24215:2;24211:91;24208:117;;;24305:18;;:::i;:::-;-1:-1:-1;;24342:9:1;;23988:369::o;24362:125::-;24402:4;24430:1;24427;24424:8;24421:34;;;24435:18;;:::i;:::-;-1:-1:-1;24472:9:1;;24362:125::o;24492:184::-;-1:-1:-1;;;24541:1:1;24534:88;24641:4;24638:1;24631:15;24665:4;24662:1;24655:15;24681:184;-1:-1:-1;;;24730:1:1;24723:88;24830:4;24827:1;24820:15;24854:4;24851:1;24844:15;24870:184;-1:-1:-1;;;24919:1:1;24912:88;25019:4;25016:1;25009:15;25043:4;25040:1;25033:15;25059:184;-1:-1:-1;;;25108:1:1;25101:88;25208:4;25205:1;25198:15;25232:4;25229:1;25222:15;25248:184;-1:-1:-1;;;25297:1:1;25290:88;25397:4;25394:1;25387:15;25421:4;25418:1;25411:15;25437:154;-1:-1:-1;;;;;25516:5:1;25512:54;25505:5;25502:65;25492:93;;25581:1;25578;25571:12

Swarm Source

ipfs://002c6612d705c42bb908512ac151c9ee28eef670cf6dc95270020f987fbf1562

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.