ETH Price: $2,411.41 (+2.43%)

Contract

0x28aD54A7208608D17B8d4A4A4034f254A28df85e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Token102003912020-06-04 16:28:441562 days ago1591288124IN
0x28aD54A7...4A28df85e
0 ETH0.0009032124.5
Withdraw Knc Fee102003862020-06-04 16:27:461562 days ago1591288066IN
0x28aD54A7...4A28df85e
0 ETH0.0008982224
Cancel Token To ...102003762020-06-04 16:25:461562 days ago1591287946IN
0x28aD54A7...4A28df85e
0 ETH0.0013464126
Cancel Token To ...102003722020-06-04 16:25:081562 days ago1591287908IN
0x28aD54A7...4A28df85e
0 ETH0.0021264126
Cancel Token To ...102003632020-06-04 16:23:011562 days ago1591287781IN
0x28aD54A7...4A28df85e
0 ETH0.0025151126
Update Token To ...101255532020-05-24 1:16:381574 days ago1590282998IN
0x28aD54A7...4A28df85e
0 ETH0.0015371218.1
Withdraw Knc Fee100979522020-05-19 18:24:371578 days ago1589912677IN
0x28aD54A7...4A28df85e
0 ETH0.0009434518
Submit Token To ...100377802020-05-10 9:57:181588 days ago1589104638IN
0x28aD54A7...4A28df85e
0 ETH0.0008861112.3
Submit Token To ...100377722020-05-10 9:55:581588 days ago1589104558IN
0x28aD54A7...4A28df85e
0 ETH0.0010305912.3
Cancel Token To ...100364062020-05-10 4:50:361588 days ago1589086236IN
0x28aD54A7...4A28df85e
0 ETH0.0011614212
Submit Token To ...99989222020-05-04 9:33:201594 days ago1588584800IN
0x28aD54A7...4A28df85e
0 ETH0.0006948810.1
Submit Token To ...99989182020-05-04 9:31:401594 days ago1588584700IN
0x28aD54A7...4A28df85e
0 ETH0.00097288.8
Deposit Knc For ...99989092020-05-04 9:29:331594 days ago1588584573IN
0x28aD54A7...4A28df85e
0 ETH0.000723768.3
Deposit Token99988882020-05-04 9:25:201594 days ago1588584320IN
0x28aD54A7...4A28df85e
0 ETH0.000862828.3
Withdraw Token99479522020-04-26 11:47:551601 days ago1587901675IN
0x28aD54A7...4A28df85e
0 ETH0.0004165811.3
Withdraw Knc Fee99479512020-04-26 11:47:431601 days ago1587901663IN
0x28aD54A7...4A28df85e
0 ETH0.0002961311.3
Cancel Token To ...99479472020-04-26 11:46:571601 days ago1587901617IN
0x28aD54A7...4A28df85e
0 ETH0.0005371411.3
Cancel Token To ...99479452020-04-26 11:46:421601 days ago1587901602IN
0x28aD54A7...4A28df85e
0 ETH0.0010936711.3
Submit Token To ...99028412020-04-19 12:18:381608 days ago1587298718IN
0x28aD54A7...4A28df85e
0 ETH0.000388595.2
Update Token To ...99028292020-04-19 12:16:381608 days ago1587298598IN
0x28aD54A7...4A28df85e
0 ETH0.000496865.2
Submit Token To ...99028152020-04-19 12:14:181608 days ago1587298458IN
0x28aD54A7...4A28df85e
0 ETH0.000525565.5
Deposit Token99028052020-04-19 12:12:061608 days ago1587298326IN
0x28aD54A7...4A28df85e
0 ETH0.000571755.50000023
Deposit Knc For ...99027032020-04-19 11:50:531608 days ago1587297053IN
0x28aD54A7...4A28df85e
0 ETH0.000453385.2
Withdraw Token96506642020-03-11 14:09:351647 days ago1583935775IN
0x28aD54A7...4A28df85e
0 ETH0.000188015.1
Withdraw Knc Fee96506592020-03-11 14:08:361647 days ago1583935716IN
0x28aD54A7...4A28df85e
0 ETH0.000190815.1
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
90415172019-12-03 3:23:081747 days ago1575343388  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OrderbookReserve

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-12-04
*/

// File: contracts/reserves/orderBookReserve/permissionless/OrderListInterface.sol

pragma solidity 0.4.18;


interface OrderListInterface {
    function getOrderDetails(uint32 orderId) public view returns (address, uint128, uint128, uint32, uint32);
    function add(address maker, uint32 orderId, uint128 srcAmount, uint128 dstAmount) public returns (bool);
    function remove(uint32 orderId) public returns (bool);
    function update(uint32 orderId, uint128 srcAmount, uint128 dstAmount) public returns (bool);
    function getFirstOrder() public view returns(uint32 orderId, bool isEmpty);
    function allocateIds(uint32 howMany) public returns(uint32);
    function findPrevOrderId(uint128 srcAmount, uint128 dstAmount) public view returns(uint32);

    function addAfterId(address maker, uint32 orderId, uint128 srcAmount, uint128 dstAmount, uint32 prevId) public
        returns (bool);

    function updateWithPositionHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount, uint32 prevId) public
        returns(bool, uint);
}

// File: contracts/reserves/orderBookReserve/permissionless/OrderIdManager.sol

pragma solidity 0.4.18;


contract OrderIdManager {
    struct OrderIdData {
        uint32 firstOrderId;
        uint takenBitmap;
    }

    uint constant public NUM_ORDERS = 32;

    function fetchNewOrderId(OrderIdData storage freeOrders)
        internal
        returns(uint32)
    {
        uint orderBitmap = freeOrders.takenBitmap;
        uint bitPointer = 1;

        for (uint i = 0; i < NUM_ORDERS; ++i) {

            if ((orderBitmap & bitPointer) == 0) {
                freeOrders.takenBitmap = orderBitmap | bitPointer;
                return(uint32(uint(freeOrders.firstOrderId) + i));
            }

            bitPointer *= 2;
        }

        revert();
    }

    /// @dev mark order as free to use.
    function releaseOrderId(OrderIdData storage freeOrders, uint32 orderId)
        internal
        returns(bool)
    {
        require(orderId >= freeOrders.firstOrderId);
        require(orderId < (freeOrders.firstOrderId + NUM_ORDERS));

        uint orderBitNum = uint(orderId) - uint(freeOrders.firstOrderId);
        uint bitPointer = uint(1) << orderBitNum;

        require(bitPointer & freeOrders.takenBitmap > 0);

        freeOrders.takenBitmap &= ~bitPointer;
        return true;
    }

    function allocateOrderIds(
        OrderIdData storage makerOrders,
        uint32 firstAllocatedId
    )
        internal
        returns(bool)
    {
        if (makerOrders.firstOrderId > 0) {
            return false;
        }

        makerOrders.firstOrderId = firstAllocatedId;
        makerOrders.takenBitmap = 0;

        return true;
    }

    function orderAllocationRequired(OrderIdData storage freeOrders) internal view returns (bool) {

        if (freeOrders.firstOrderId == 0) return true;
        return false;
    }

    function getNumActiveOrderIds(OrderIdData storage makerOrders) internal view returns (uint numActiveOrders) {
        for (uint i = 0; i < NUM_ORDERS; ++i) {
            if ((makerOrders.takenBitmap & (uint(1) << i)) > 0) numActiveOrders++;
        }
    }
}

// File: contracts/reserves/orderBookReserve/permissionless/OrderListFactoryInterface.sol

pragma solidity 0.4.18;



interface OrderListFactoryInterface {
    function newOrdersContract(address admin) public returns(OrderListInterface);
}

// File: contracts/reserves/orderBookReserve/permissionless/OrderbookReserveInterface.sol

pragma solidity 0.4.18;



interface OrderbookReserveInterface {
    function init() public returns(bool);
    function kncRateBlocksTrade() public view returns(bool);
}

// File: contracts/ERC20Interface.sol

pragma solidity 0.4.18;


// https://github.com/ethereum/EIPs/issues/20
interface ERC20 {
    function totalSupply() public view returns (uint supply);
    function balanceOf(address _owner) public view returns (uint balance);
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint remaining);
    function decimals() public view returns(uint digits);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

// File: contracts/Utils.sol

pragma solidity 0.4.18;



/// @title Kyber constants contract
contract Utils {

    ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
    uint  constant internal PRECISION = (10**18);
    uint  constant internal MAX_QTY   = (10**28); // 10B tokens
    uint  constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint  constant internal MAX_DECIMALS = 18;
    uint  constant internal ETH_DECIMALS = 18;
    mapping(address=>uint) internal decimals;

    function setDecimals(ERC20 token) internal {
        if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
        else decimals[token] = token.decimals();
    }

    function getDecimals(ERC20 token) internal view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint tokenDecimals = decimals[token];
        // technically, there might be token with decimals 0
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if(tokenDecimals == 0) return token.decimals();

        return tokenDecimals;
    }

    function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(srcQty <= MAX_QTY);
        require(rate <= MAX_RATE);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(dstQty <= MAX_QTY);
        require(rate <= MAX_RATE);
        
        //source quantity is rounded up. to avoid dest quantity being too low.
        uint numerator;
        uint denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }
}

// File: contracts/Utils2.sol

pragma solidity 0.4.18;



contract Utils2 is Utils {

    /// @dev get the balance of a user.
    /// @param token The token type
    /// @return The balance
    function getBalance(ERC20 token, address user) public view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS)
            return user.balance;
        else
            return token.balanceOf(user);
    }

    function getDecimalsSafe(ERC20 token) internal returns(uint) {

        if (decimals[token] == 0) {
            setDecimals(token);
        }

        return decimals[token];
    }

    function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) {
        return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) {
        return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
        internal pure returns(uint)
    {
        require(srcAmount <= MAX_QTY);
        require(destAmount <= MAX_QTY);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
        }
    }
}

// File: contracts/KyberReserveInterface.sol

pragma solidity 0.4.18;


/// @title Kyber Reserve contract
interface KyberReserveInterface {

    function trade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        address destAddress,
        uint conversionRate,
        bool validate
    )
        public
        payable
        returns(bool);

    function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint);
}

// File: contracts/reserves/orderBookReserve/permissionless/OrderbookReserve.sol

pragma solidity 0.4.18;







contract FeeBurnerRateInterface {
    uint public kncPerEthRatePrecision;
}


interface MedianizerInterface {
    function peek() public view returns (bytes32, bool);
}


contract OrderbookReserve is OrderIdManager, Utils2, KyberReserveInterface, OrderbookReserveInterface {

    uint public constant BURN_TO_STAKE_FACTOR = 5;      // stake per order must be xfactor expected burn amount.
    uint public constant MAX_BURN_FEE_BPS = 100;        // 1%
    uint public constant MIN_REMAINING_ORDER_RATIO = 2; // Ratio between min new order value and min order value.
    uint public constant MAX_USD_PER_ETH = 100000;      // Above this value price is surely compromised.

    uint32 constant public TAIL_ID = 1;         // tail Id in order list contract
    uint32 constant public HEAD_ID = 2;         // head Id in order list contract

    struct OrderLimits {
        uint minNewOrderSizeUsd; // Basis for setting min new order size Eth
        uint maxOrdersPerTrade;     // Limit number of iterated orders per trade / getRate loops.
        uint minNewOrderSizeWei;    // Below this value can't create new order.
        uint minOrderSizeWei;       // below this value order will be removed.
    }

    uint public kncPerEthBaseRatePrecision; // according to base rate all stakes are calculated.

    struct ExternalContracts {
        ERC20 kncToken;          // not constant. to enable testing while not on main net
        ERC20 token;             // only supported token.
        FeeBurnerRateInterface feeBurner;
        address kyberNetwork;
        MedianizerInterface medianizer; // price feed Eth - USD from maker DAO.
        OrderListFactoryInterface orderListFactory;
    }

    //struct for getOrderData() return value. used only in memory.
    struct OrderData {
        address maker;
        uint32 nextId;
        bool isLastOrder;
        uint128 srcAmount;
        uint128 dstAmount;
    }

    OrderLimits public limits;
    ExternalContracts public contracts;

    // sorted lists of orders. one list for token to Eth, other for Eth to token.
    // Each order is added in the correct position in the list to keep it sorted.
    OrderListInterface public tokenToEthList;
    OrderListInterface public ethToTokenList;

    //funds data
    mapping(address => mapping(address => uint)) public makerFunds; // deposited maker funds.
    mapping(address => uint) public makerKnc;            // for knc staking.
    mapping(address => uint) public makerTotalOrdersWei; // per maker how many Wei in orders, for stake calculation.

    uint public makerBurnFeeBps;    // knc burn fee per order that is taken.

    //each maker will have orders that will be reused.
    mapping(address => OrderIdData) public makerOrdersTokenToEth;
    mapping(address => OrderIdData) public makerOrdersEthToToken;

    function OrderbookReserve(
        ERC20 knc,
        ERC20 reserveToken,
        address burner,
        address network,
        MedianizerInterface medianizer,
        OrderListFactoryInterface factory,
        uint minNewOrderUsd,
        uint maxOrdersPerTrade,
        uint burnFeeBps
    )
        public
    {

        require(knc != address(0));
        require(reserveToken != address(0));
        require(burner != address(0));
        require(network != address(0));
        require(medianizer != address(0));
        require(factory != address(0));
        require(burnFeeBps != 0);
        require(burnFeeBps <= MAX_BURN_FEE_BPS);
        require(maxOrdersPerTrade != 0);
        require(minNewOrderUsd > 0);

        contracts.kyberNetwork = network;
        contracts.feeBurner = FeeBurnerRateInterface(burner);
        contracts.medianizer = medianizer;
        contracts.orderListFactory = factory;
        contracts.kncToken = knc;
        contracts.token = reserveToken;

        makerBurnFeeBps = burnFeeBps;
        limits.minNewOrderSizeUsd = minNewOrderUsd;
        limits.maxOrdersPerTrade = maxOrdersPerTrade;

        require(setMinOrderSizeEth());
    
        require(contracts.kncToken.approve(contracts.feeBurner, (2**255)));

        //can only support tokens with decimals() API
        setDecimals(contracts.token);

        kncPerEthBaseRatePrecision = contracts.feeBurner.kncPerEthRatePrecision();
    }

    ///@dev separate init function for this contract, if this init is in the C'tor. gas consumption too high.
    function init() public returns(bool) {
        if ((tokenToEthList != address(0)) && (ethToTokenList != address(0))) return true;
        if ((tokenToEthList != address(0)) || (ethToTokenList != address(0))) revert();

        tokenToEthList = contracts.orderListFactory.newOrdersContract(this);
        ethToTokenList = contracts.orderListFactory.newOrdersContract(this);

        return true;
    }

    function setKncPerEthBaseRate() public {
        uint kncPerEthRatePrecision = contracts.feeBurner.kncPerEthRatePrecision();
        if (kncPerEthRatePrecision < kncPerEthBaseRatePrecision) {
            kncPerEthBaseRatePrecision = kncPerEthRatePrecision;
        }
    }

    function getConversionRate(ERC20 src, ERC20 dst, uint srcQty, uint blockNumber) public view returns(uint) {
        require((src == ETH_TOKEN_ADDRESS) || (dst == ETH_TOKEN_ADDRESS));
        require((src == contracts.token) || (dst == contracts.token));
        require(srcQty <= MAX_QTY);

        if (kncRateBlocksTrade() || (srcQty == 0)) return 0;

        blockNumber; // in this reserve no order expiry == no use for blockNumber. here to avoid compiler warning.

        //user order ETH -> token is matched with maker order token -> ETH
        OrderListInterface list = (src == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList;

        uint32 orderId;
        OrderData memory orderData;

        uint128 userRemainingSrcQty = uint128(srcQty);
        uint128 totalUserDstAmount = 0;
        uint maxOrders = limits.maxOrdersPerTrade;

        for (
            (orderId, orderData.isLastOrder) = list.getFirstOrder();
            ((userRemainingSrcQty > 0) && (!orderData.isLastOrder) && (maxOrders-- > 0));
            orderId = orderData.nextId
        ) {
            orderData = getOrderData(list, orderId);
            // maker dst quantity is the requested quantity he wants to receive. user src quantity is what user gives.
            // so user src quantity is matched with maker dst quantity
            if (orderData.dstAmount <= userRemainingSrcQty) {
                totalUserDstAmount += orderData.srcAmount;
                userRemainingSrcQty -= orderData.dstAmount;
            } else {
                totalUserDstAmount += uint128(uint(orderData.srcAmount) * uint(userRemainingSrcQty) /
                    uint(orderData.dstAmount));
                userRemainingSrcQty = 0;
            }
        }

        if (userRemainingSrcQty != 0) return 0; //not enough tokens to exchange.

        return calcRateFromQty(srcQty, totalUserDstAmount, getDecimals(src), getDecimals(dst));
    }

    event OrderbookReserveTrade(ERC20 srcToken, ERC20 dstToken, uint srcAmount, uint dstAmount);

    function trade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 dstToken,
        address dstAddress,
        uint conversionRate,
        bool validate
    )
        public
        payable
        returns(bool)
    {
        require(msg.sender == contracts.kyberNetwork);
        require((srcToken == ETH_TOKEN_ADDRESS) || (dstToken == ETH_TOKEN_ADDRESS));
        require((srcToken == contracts.token) || (dstToken == contracts.token));
        require(srcAmount <= MAX_QTY);

        conversionRate;
        validate;

        if (srcToken == ETH_TOKEN_ADDRESS) {
            require(msg.value == srcAmount);
        } else {
            require(msg.value == 0);
            require(srcToken.transferFrom(msg.sender, this, srcAmount));
        }

        uint totalDstAmount = doTrade(
                srcToken,
                srcAmount,
                dstToken
            );

        require(conversionRate <= calcRateFromQty(srcAmount, totalDstAmount, getDecimals(srcToken),
            getDecimals(dstToken)));

        //all orders were successfully taken. send to dstAddress
        if (dstToken == ETH_TOKEN_ADDRESS) {
            dstAddress.transfer(totalDstAmount);
        } else {
            require(dstToken.transfer(dstAddress, totalDstAmount));
        }

        OrderbookReserveTrade(srcToken, dstToken, srcAmount, totalDstAmount);
        return true;
    }

    function doTrade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 dstToken
    )
        internal
        returns(uint)
    {
        OrderListInterface list = (srcToken == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList;

        uint32 orderId;
        OrderData memory orderData;
        uint128 userRemainingSrcQty = uint128(srcAmount);
        uint128 totalUserDstAmount = 0;

        for (
            (orderId, orderData.isLastOrder) = list.getFirstOrder();
            ((userRemainingSrcQty > 0) && (!orderData.isLastOrder));
            orderId = orderData.nextId
        ) {
        // maker dst quantity is the requested quantity he wants to receive. user src quantity is what user gives.
        // so user src quantity is matched with maker dst quantity
            orderData = getOrderData(list, orderId);
            if (orderData.dstAmount <= userRemainingSrcQty) {
                totalUserDstAmount += orderData.srcAmount;
                userRemainingSrcQty -= orderData.dstAmount;
                require(takeFullOrder({
                    maker: orderData.maker,
                    orderId: orderId,
                    userSrc: srcToken,
                    userDst: dstToken,
                    userSrcAmount: orderData.dstAmount,
                    userDstAmount: orderData.srcAmount
                }));
            } else {
                uint128 partialDstQty = uint128(uint(orderData.srcAmount) * uint(userRemainingSrcQty) /
                    uint(orderData.dstAmount));
                totalUserDstAmount += partialDstQty;
                require(takePartialOrder({
                    maker: orderData.maker,
                    orderId: orderId,
                    userSrc: srcToken,
                    userDst: dstToken,
                    userPartialSrcAmount: userRemainingSrcQty,
                    userTakeDstAmount: partialDstQty,
                    orderSrcAmount: orderData.srcAmount,
                    orderDstAmount: orderData.dstAmount
                }));
                userRemainingSrcQty = 0;
            }
        }

        require(userRemainingSrcQty == 0 && totalUserDstAmount > 0);

        return totalUserDstAmount;
    }

    ///@param srcAmount is the token amount that will be payed. must be deposited before hand in the makers account.
    ///@param dstAmount is the eth amount the maker expects to get for his tokens.
    function submitTokenToEthOrder(uint128 srcAmount, uint128 dstAmount)
        public
        returns(bool)
    {
        return submitTokenToEthOrderWHint(srcAmount, dstAmount, 0);
    }

    function submitTokenToEthOrderWHint(uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder)
        public
        returns(bool)
    {
        uint32 newId = fetchNewOrderId(makerOrdersTokenToEth[msg.sender]);
        return addOrder(false, newId, srcAmount, dstAmount, hintPrevOrder);
    }

    ///@param srcAmount is the Ether amount that will be payed, must be deposited before hand.
    ///@param dstAmount is the token amount the maker expects to get for his Ether.
    function submitEthToTokenOrder(uint128 srcAmount, uint128 dstAmount)
        public
        returns(bool)
    {
        return submitEthToTokenOrderWHint(srcAmount, dstAmount, 0);
    }

    function submitEthToTokenOrderWHint(uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder)
        public
        returns(bool)
    {
        uint32 newId = fetchNewOrderId(makerOrdersEthToToken[msg.sender]);
        return addOrder(true, newId, srcAmount, dstAmount, hintPrevOrder);
    }

    ///@dev notice here a batch of orders represented in arrays. order x is represented by x cells of all arrays.
    ///@dev all arrays expected to the same length.
    ///@param isEthToToken per each order. is order x eth to token (= src is Eth) or vice versa.
    ///@param srcAmount per each order. source amount for order x.
    ///@param dstAmount per each order. destination amount for order x.
    ///@param hintPrevOrder per each order what is the order it should be added after in ordered list. 0 for no hint.
    ///@param isAfterPrevOrder per each order, set true if should be added in list right after previous added order.
    function addOrderBatch(bool[] isEthToToken, uint128[] srcAmount, uint128[] dstAmount,
        uint32[] hintPrevOrder, bool[] isAfterPrevOrder)
        public
        returns(bool)
    {
        require(isEthToToken.length == hintPrevOrder.length);
        require(isEthToToken.length == dstAmount.length);
        require(isEthToToken.length == srcAmount.length);
        require(isEthToToken.length == isAfterPrevOrder.length);

        address maker = msg.sender;
        uint32 prevId;
        uint32 newId = 0;

        for (uint i = 0; i < isEthToToken.length; ++i) {
            prevId = isAfterPrevOrder[i] ? newId : hintPrevOrder[i];
            newId = fetchNewOrderId(isEthToToken[i] ? makerOrdersEthToToken[maker] : makerOrdersTokenToEth[maker]);
            require(addOrder(isEthToToken[i], newId, srcAmount[i], dstAmount[i], prevId));
        }

        return true;
    }

    function updateTokenToEthOrder(uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount)
        public
        returns(bool)
    {
        require(updateTokenToEthOrderWHint(orderId, newSrcAmount, newDstAmount, 0));
        return true;
    }

    function updateTokenToEthOrderWHint(
        uint32 orderId,
        uint128 newSrcAmount,
        uint128 newDstAmount,
        uint32 hintPrevOrder
    )
        public
        returns(bool)
    {
        require(updateOrder(false, orderId, newSrcAmount, newDstAmount, hintPrevOrder));
        return true;
    }

    function updateEthToTokenOrder(uint32 orderId, uint128 newSrcAmount, uint128 newDstAmount)
        public
        returns(bool)
    {
        return updateEthToTokenOrderWHint(orderId, newSrcAmount, newDstAmount, 0);
    }

    function updateEthToTokenOrderWHint(
        uint32 orderId,
        uint128 newSrcAmount,
        uint128 newDstAmount,
        uint32 hintPrevOrder
    )
        public
        returns(bool)
    {
        require(updateOrder(true, orderId, newSrcAmount, newDstAmount, hintPrevOrder));
        return true;
    }

    function updateOrderBatch(bool[] isEthToToken, uint32[] orderId, uint128[] newSrcAmount,
        uint128[] newDstAmount, uint32[] hintPrevOrder)
        public
        returns(bool)
    {
        require(isEthToToken.length == orderId.length);
        require(isEthToToken.length == newSrcAmount.length);
        require(isEthToToken.length == newDstAmount.length);
        require(isEthToToken.length == hintPrevOrder.length);

        for (uint i = 0; i < isEthToToken.length; ++i) {
            require(updateOrder(isEthToToken[i], orderId[i], newSrcAmount[i], newDstAmount[i],
                hintPrevOrder[i]));
        }

        return true;
    }

    event TokenDeposited(address indexed maker, uint amount);

    function depositToken(address maker, uint amount) public {
        require(maker != address(0));
        require(amount < MAX_QTY);

        require(contracts.token.transferFrom(msg.sender, this, amount));

        makerFunds[maker][contracts.token] += amount;
        TokenDeposited(maker, amount);
    }

    event EtherDeposited(address indexed maker, uint amount);

    function depositEther(address maker) public payable {
        require(maker != address(0));

        makerFunds[maker][ETH_TOKEN_ADDRESS] += msg.value;
        EtherDeposited(maker, msg.value);
    }

    event KncFeeDeposited(address indexed maker, uint amount);

    // knc will be staked per order. part of the amount will be used as fee.
    function depositKncForFee(address maker, uint amount) public {
        require(maker != address(0));
        require(amount < MAX_QTY);

        require(contracts.kncToken.transferFrom(msg.sender, this, amount));

        makerKnc[maker] += amount;

        KncFeeDeposited(maker, amount);

        if (orderAllocationRequired(makerOrdersTokenToEth[maker])) {
            require(allocateOrderIds(
                makerOrdersTokenToEth[maker], /* makerOrders */
                tokenToEthList.allocateIds(uint32(NUM_ORDERS)) /* firstAllocatedId */
            ));
        }

        if (orderAllocationRequired(makerOrdersEthToToken[maker])) {
            require(allocateOrderIds(
                makerOrdersEthToToken[maker], /* makerOrders */
                ethToTokenList.allocateIds(uint32(NUM_ORDERS)) /* firstAllocatedId */
            ));
        }
    }

    function withdrawToken(uint amount) public {

        address maker = msg.sender;
        uint makerFreeAmount = makerFunds[maker][contracts.token];

        require(makerFreeAmount >= amount);

        makerFunds[maker][contracts.token] -= amount;

        require(contracts.token.transfer(maker, amount));
    }

    function withdrawEther(uint amount) public {

        address maker = msg.sender;
        uint makerFreeAmount = makerFunds[maker][ETH_TOKEN_ADDRESS];

        require(makerFreeAmount >= amount);

        makerFunds[maker][ETH_TOKEN_ADDRESS] -= amount;

        maker.transfer(amount);
    }

    function withdrawKncFee(uint amount) public {

        address maker = msg.sender;
        
        require(makerKnc[maker] >= amount);
        require(makerUnlockedKnc(maker) >= amount);

        makerKnc[maker] -= amount;

        require(contracts.kncToken.transfer(maker, amount));
    }

    function cancelTokenToEthOrder(uint32 orderId) public returns(bool) {
        require(cancelOrder(false, orderId));
        return true;
    }

    function cancelEthToTokenOrder(uint32 orderId) public returns(bool) {
        require(cancelOrder(true, orderId));
        return true;
    }

    function setMinOrderSizeEth() public returns(bool) {
        //get eth to $ from maker dao;
        bytes32 usdPerEthInWei;
        bool valid;
        (usdPerEthInWei, valid) = contracts.medianizer.peek();
        require(valid);

        // ensuring that there is no underflow or overflow possible,
        // even if the price is compromised
        uint usdPerEth = uint(usdPerEthInWei) / (1 ether);
        require(usdPerEth != 0);
        require(usdPerEth < MAX_USD_PER_ETH);

        // set Eth order limits according to price
        uint minNewOrderSizeWei = limits.minNewOrderSizeUsd * PRECISION * (1 ether) / uint(usdPerEthInWei);

        limits.minNewOrderSizeWei = minNewOrderSizeWei;
        limits.minOrderSizeWei = limits.minNewOrderSizeWei / MIN_REMAINING_ORDER_RATIO;

        return true;
    }

    ///@dev Each maker stakes per order KNC that is factor of the required burn amount.
    ///@dev If Knc per Eth rate becomes lower by more then factor, stake will not be enough and trade will be blocked.
    function kncRateBlocksTrade() public view returns (bool) {
        return (contracts.feeBurner.kncPerEthRatePrecision() > kncPerEthBaseRatePrecision * BURN_TO_STAKE_FACTOR);
    }

    function getTokenToEthAddOrderHint(uint128 srcAmount, uint128 dstAmount) public view returns (uint32) {
        require(dstAmount >= limits.minNewOrderSizeWei);
        return tokenToEthList.findPrevOrderId(srcAmount, dstAmount);
    }

    function getEthToTokenAddOrderHint(uint128 srcAmount, uint128 dstAmount) public view returns (uint32) {
        require(srcAmount >= limits.minNewOrderSizeWei);
        return ethToTokenList.findPrevOrderId(srcAmount, dstAmount);
    }

    function getTokenToEthUpdateOrderHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount)
        public
        view
        returns (uint32)
    {
        require(dstAmount >= limits.minNewOrderSizeWei);
        uint32 prevId = tokenToEthList.findPrevOrderId(srcAmount, dstAmount);
        address add;
        uint128 noUse;
        uint32 next;

        if (prevId == orderId) {
            (add, noUse, noUse, prevId, next) = tokenToEthList.getOrderDetails(orderId);
        }

        return prevId;
    }

    function getEthToTokenUpdateOrderHint(uint32 orderId, uint128 srcAmount, uint128 dstAmount)
        public
        view
        returns (uint32)
    {
        require(srcAmount >= limits.minNewOrderSizeWei);
        uint32 prevId = ethToTokenList.findPrevOrderId(srcAmount, dstAmount);
        address add;
        uint128 noUse;
        uint32 next;

        if (prevId == orderId) {
            (add, noUse, noUse, prevId, next) = ethToTokenList.getOrderDetails(orderId);
        }

        return prevId;
    }

    function getTokenToEthOrder(uint32 orderId)
        public view
        returns (
            address _maker,
            uint128 _srcAmount,
            uint128 _dstAmount,
            uint32 _prevId,
            uint32 _nextId
        )
    {
        return tokenToEthList.getOrderDetails(orderId);
    }

    function getEthToTokenOrder(uint32 orderId)
        public view
        returns (
            address _maker,
            uint128 _srcAmount,
            uint128 _dstAmount,
            uint32 _prevId,
            uint32 _nextId
        )
    {
        return ethToTokenList.getOrderDetails(orderId);
    }

    function makerRequiredKncStake(address maker) public view returns (uint) {
        return(calcKncStake(makerTotalOrdersWei[maker]));
    }

    function makerUnlockedKnc(address maker) public view returns (uint) {
        uint requiredKncStake = makerRequiredKncStake(maker);
        if (requiredKncStake > makerKnc[maker]) return 0;
        return (makerKnc[maker] - requiredKncStake);
    }

    function calcKncStake(uint weiAmount) public view returns(uint) {
        return(calcBurnAmount(weiAmount) * BURN_TO_STAKE_FACTOR);
    }

    function calcBurnAmount(uint weiAmount) public view returns(uint) {
        return(weiAmount * makerBurnFeeBps * kncPerEthBaseRatePrecision / (10000 * PRECISION));
    }

    function calcBurnAmountFromFeeBurner(uint weiAmount) public view returns(uint) {
        return(weiAmount * makerBurnFeeBps * contracts.feeBurner.kncPerEthRatePrecision() / (10000 * PRECISION));
    }

    ///@dev This function is not fully optimized gas wise. Consider before calling on chain.
    function getEthToTokenMakerOrderIds(address maker) public view returns(uint32[] orderList) {
        OrderIdData storage makerOrders = makerOrdersEthToToken[maker];
        orderList = new uint32[](getNumActiveOrderIds(makerOrders));
        uint activeOrder = 0;

        for (uint32 i = 0; i < NUM_ORDERS; ++i) {
            if ((makerOrders.takenBitmap & (uint(1) << i) > 0)) orderList[activeOrder++] = makerOrders.firstOrderId + i;
        }
    }

    ///@dev This function is not fully optimized gas wise. Consider before calling on chain.
    function getTokenToEthMakerOrderIds(address maker) public view returns(uint32[] orderList) {
        OrderIdData storage makerOrders = makerOrdersTokenToEth[maker];
        orderList = new uint32[](getNumActiveOrderIds(makerOrders));
        uint activeOrder = 0;

        for (uint32 i = 0; i < NUM_ORDERS; ++i) {
            if ((makerOrders.takenBitmap & (uint(1) << i) > 0)) orderList[activeOrder++] = makerOrders.firstOrderId + i;
        }
    }

    ///@dev This function is not fully optimized gas wise. Consider before calling on chain.
    function getEthToTokenOrderList() public view returns(uint32[] orderList) {
        OrderListInterface list = ethToTokenList;
        return getList(list);
    }

    ///@dev This function is not fully optimized gas wise. Consider before calling on chain.
    function getTokenToEthOrderList() public view returns(uint32[] orderList) {
        OrderListInterface list = tokenToEthList;
        return getList(list);
    }

    event NewLimitOrder(
        address indexed maker,
        uint32 orderId,
        bool isEthToToken,
        uint128 srcAmount,
        uint128 dstAmount,
        bool addedWithHint
    );

    function addOrder(bool isEthToToken, uint32 newId, uint128 srcAmount, uint128 dstAmount, uint32 hintPrevOrder)
        internal
        returns(bool)
    {
        require(srcAmount < MAX_QTY);
        require(dstAmount < MAX_QTY);
        address maker = msg.sender;

        require(secureAddOrderFunds(maker, isEthToToken, srcAmount, dstAmount));
        require(validateLegalRate(srcAmount, dstAmount, isEthToToken));

        bool addedWithHint = false;
        OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList;

        if (hintPrevOrder != 0) {
            addedWithHint = list.addAfterId(maker, newId, srcAmount, dstAmount, hintPrevOrder);
        }

        if (!addedWithHint) {
            require(list.add(maker, newId, srcAmount, dstAmount));
        }

        NewLimitOrder(maker, newId, isEthToToken, srcAmount, dstAmount, addedWithHint);

        return true;
    }

    event OrderUpdated(
        address indexed maker,
        bool isEthToToken,
        uint orderId,
        uint128 srcAmount,
        uint128 dstAmount,
        bool updatedWithHint
    );

    function updateOrder(bool isEthToToken, uint32 orderId, uint128 newSrcAmount,
        uint128 newDstAmount, uint32 hintPrevOrder)
        internal
        returns(bool)
    {
        require(newSrcAmount < MAX_QTY);
        require(newDstAmount < MAX_QTY);
        address maker;
        uint128 currDstAmount;
        uint128 currSrcAmount;
        uint32 noUse;
        uint noUse2;

        require(validateLegalRate(newSrcAmount, newDstAmount, isEthToToken));

        OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList;

        (maker, currSrcAmount, currDstAmount, noUse, noUse) = list.getOrderDetails(orderId);
        require(maker == msg.sender);

        if (!secureUpdateOrderFunds(maker, isEthToToken, currSrcAmount, currDstAmount, newSrcAmount, newDstAmount)) {
            return false;
        }

        bool updatedWithHint = false;

        if (hintPrevOrder != 0) {
            (updatedWithHint, noUse2) = list.updateWithPositionHint(orderId, newSrcAmount, newDstAmount, hintPrevOrder);
        }

        if (!updatedWithHint) {
            require(list.update(orderId, newSrcAmount, newDstAmount));
        }

        OrderUpdated(maker, isEthToToken, orderId, newSrcAmount, newDstAmount, updatedWithHint);

        return true;
    }

    event OrderCanceled(address indexed maker, bool isEthToToken, uint32 orderId, uint128 srcAmount, uint dstAmount);

    function cancelOrder(bool isEthToToken, uint32 orderId) internal returns(bool) {

        address maker = msg.sender;
        OrderListInterface list = isEthToToken ? ethToTokenList : tokenToEthList;
        OrderData memory orderData = getOrderData(list, orderId);

        require(orderData.maker == maker);

        uint weiAmount = isEthToToken ? orderData.srcAmount : orderData.dstAmount;
        require(releaseOrderStakes(maker, weiAmount, 0));

        require(removeOrder(list, maker, isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token, orderId));

        //funds go back to makers account
        makerFunds[maker][isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token] += orderData.srcAmount;

        OrderCanceled(maker, isEthToToken, orderId, orderData.srcAmount, orderData.dstAmount);

        return true;
    }

    ///@param maker is the maker of this order
    ///@param isEthToToken which order type the maker is updating / adding
    ///@param srcAmount is the orders src amount (token or ETH) could be negative if funds are released.
    function bindOrderFunds(address maker, bool isEthToToken, int srcAmount)
        internal
        returns(bool)
    {
        address fundsAddress = isEthToToken ? ETH_TOKEN_ADDRESS : contracts.token;

        if (srcAmount < 0) {
            makerFunds[maker][fundsAddress] += uint(-srcAmount);
        } else {
            require(makerFunds[maker][fundsAddress] >= uint(srcAmount));
            makerFunds[maker][fundsAddress] -= uint(srcAmount);
        }

        return true;
    }

    ///@param maker is the maker address
    ///@param weiAmount is the wei amount inside order that should result in knc staking
    function bindOrderStakes(address maker, int weiAmount) internal returns(bool) {

        if (weiAmount < 0) {
            uint decreaseWeiAmount = uint(-weiAmount);
            if (decreaseWeiAmount > makerTotalOrdersWei[maker]) decreaseWeiAmount = makerTotalOrdersWei[maker];
            makerTotalOrdersWei[maker] -= decreaseWeiAmount;
            return true;
        }

        require(makerKnc[maker] >= calcKncStake(makerTotalOrdersWei[maker] + uint(weiAmount)));

        makerTotalOrdersWei[maker] += uint(weiAmount);

        return true;
    }

    ///@dev if totalWeiAmount is 0 we only release stakes.
    ///@dev if totalWeiAmount == weiForBurn. all staked amount will be burned. so no knc returned to maker
    ///@param maker is the maker address
    ///@param totalWeiAmount is total wei amount that was released from order - including taken wei amount.
    ///@param weiForBurn is the part in order wei amount that was taken and should result in burning.
    function releaseOrderStakes(address maker, uint totalWeiAmount, uint weiForBurn) internal returns(bool) {

        require(weiForBurn <= totalWeiAmount);

        if (totalWeiAmount > makerTotalOrdersWei[maker]) {
            makerTotalOrdersWei[maker] = 0;
        } else {
            makerTotalOrdersWei[maker] -= totalWeiAmount;
        }

        if (weiForBurn == 0) return true;

        uint burnAmount = calcBurnAmountFromFeeBurner(weiForBurn);

        require(makerKnc[maker] >= burnAmount);
        makerKnc[maker] -= burnAmount;

        return true;
    }

    ///@dev funds are valid only when required knc amount can be staked for this order.
    function secureAddOrderFunds(address maker, bool isEthToToken, uint128 srcAmount, uint128 dstAmount)
        internal returns(bool)
    {
        uint weiAmount = isEthToToken ? srcAmount : dstAmount;

        require(weiAmount >= limits.minNewOrderSizeWei);
        require(bindOrderFunds(maker, isEthToToken, int(srcAmount)));
        require(bindOrderStakes(maker, int(weiAmount)));

        return true;
    }

    ///@dev funds are valid only when required knc amount can be staked for this order.
    function secureUpdateOrderFunds(address maker, bool isEthToToken, uint128 prevSrcAmount, uint128 prevDstAmount,
        uint128 newSrcAmount, uint128 newDstAmount)
        internal
        returns(bool)
    {
        uint weiAmount = isEthToToken ? newSrcAmount : newDstAmount;
        int weiDiff = isEthToToken ? (int(newSrcAmount) - int(prevSrcAmount)) :
            (int(newDstAmount) - int(prevDstAmount));

        require(weiAmount >= limits.minNewOrderSizeWei);

        require(bindOrderFunds(maker, isEthToToken, int(newSrcAmount) - int(prevSrcAmount)));

        require(bindOrderStakes(maker, weiDiff));

        return true;
    }

    event FullOrderTaken(address maker, uint32 orderId, bool isEthToToken);

    function takeFullOrder(
        address maker,
        uint32 orderId,
        ERC20 userSrc,
        ERC20 userDst,
        uint128 userSrcAmount,
        uint128 userDstAmount
    )
        internal
        returns (bool)
    {
        OrderListInterface list = (userSrc == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList;

        //userDst == maker source
        require(removeOrder(list, maker, userDst, orderId));

        FullOrderTaken(maker, orderId, userSrc == ETH_TOKEN_ADDRESS);

        return takeOrder(maker, userSrc, userSrcAmount, userDstAmount, 0);
    }

    event PartialOrderTaken(address maker, uint32 orderId, bool isEthToToken, bool isRemoved);

    function takePartialOrder(
        address maker,
        uint32 orderId,
        ERC20 userSrc,
        ERC20 userDst,
        uint128 userPartialSrcAmount,
        uint128 userTakeDstAmount,
        uint128 orderSrcAmount,
        uint128 orderDstAmount
    )
        internal
        returns(bool)
    {
        require(userPartialSrcAmount < orderDstAmount);
        require(userTakeDstAmount < orderSrcAmount);

        //must reuse parameters, otherwise stack too deep error.
        orderSrcAmount -= userTakeDstAmount;
        orderDstAmount -= userPartialSrcAmount;

        OrderListInterface list = (userSrc == ETH_TOKEN_ADDRESS) ? tokenToEthList : ethToTokenList;
        uint weiValueNotReleasedFromOrder = (userSrc == ETH_TOKEN_ADDRESS) ? orderDstAmount : orderSrcAmount;
        uint additionalReleasedWei = 0;

        if (weiValueNotReleasedFromOrder < limits.minOrderSizeWei) {
            // remaining order amount too small. remove order and add remaining funds to free funds
            makerFunds[maker][userDst] += orderSrcAmount;
            additionalReleasedWei = weiValueNotReleasedFromOrder;

            //for remove order we give makerSrc == userDst
            require(removeOrder(list, maker, userDst, orderId));
        } else {
            bool isSuccess;

            // update order values, taken order is always first order
            (isSuccess,) = list.updateWithPositionHint(orderId, orderSrcAmount, orderDstAmount, HEAD_ID);
            require(isSuccess);
        }

        PartialOrderTaken(maker, orderId, userSrc == ETH_TOKEN_ADDRESS, additionalReleasedWei > 0);

        //stakes are returned for unused wei value
        return(takeOrder(maker, userSrc, userPartialSrcAmount, userTakeDstAmount, additionalReleasedWei));
    }
    
    function takeOrder(
        address maker,
        ERC20 userSrc,
        uint userSrcAmount,
        uint userDstAmount,
        uint additionalReleasedWei
    )
        internal
        returns(bool)
    {
        uint weiAmount = userSrc == (ETH_TOKEN_ADDRESS) ? userSrcAmount : userDstAmount;

        //token / eth already collected. just update maker balance
        makerFunds[maker][userSrc] += userSrcAmount;

        // send dst tokens in one batch. not here
        //handle knc stakes and fee. releasedWeiValue was released and not traded.
        return releaseOrderStakes(maker, (weiAmount + additionalReleasedWei), weiAmount);
    }

    function removeOrder(
        OrderListInterface list,
        address maker,
        ERC20 makerSrc,
        uint32 orderId
    )
        internal returns(bool)
    {
        require(list.remove(orderId));
        OrderIdData storage orders = (makerSrc == ETH_TOKEN_ADDRESS) ?
            makerOrdersEthToToken[maker] : makerOrdersTokenToEth[maker];
        require(releaseOrderId(orders, orderId));

        return true;
    }

    function getList(OrderListInterface list) internal view returns(uint32[] memory orderList) {
        OrderData memory orderData;
        uint32 orderId;
        bool isEmpty;

        (orderId, isEmpty) = list.getFirstOrder();
        if (isEmpty) return(new uint32[](0));

        uint numOrders = 0;

        for (; !orderData.isLastOrder; orderId = orderData.nextId) {
            orderData = getOrderData(list, orderId);
            numOrders++;
        }

        orderList = new uint32[](numOrders);

        (orderId, orderData.isLastOrder) = list.getFirstOrder();

        for (uint i = 0; i < numOrders; i++) {
            orderList[i] = orderId;
            orderData = getOrderData(list, orderId);
            orderId = orderData.nextId;
        }
    }

    function getOrderData(OrderListInterface list, uint32 orderId) internal view returns (OrderData data) {
        uint32 prevId;
        (data.maker, data.srcAmount, data.dstAmount, prevId, data.nextId) = list.getOrderDetails(orderId);
        data.isLastOrder = (data.nextId == TAIL_ID);
    }

    function validateLegalRate (uint srcAmount, uint dstAmount, bool isEthToToken)
        internal view returns(bool)
    {
        uint rate;

        /// notice, rate is calculated from taker perspective,
        ///     for taker amounts are opposite. order srcAmount will be DstAmount for taker.
        if (isEthToToken) {
            rate = calcRateFromQty(dstAmount, srcAmount, getDecimals(contracts.token), ETH_DECIMALS);
        } else {
            rate = calcRateFromQty(dstAmount, srcAmount, ETH_DECIMALS, getDecimals(contracts.token));
        }

        if (rate > MAX_RATE) return false;
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"NUM_ORDERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"submitEthToTokenOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcBurnAmountFromFeeBurner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"},{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getEthToTokenUpdateOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerKnc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerOrdersTokenToEth","outputs":[{"name":"firstOrderId","type":"uint32"},{"name":"takenBitmap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"},{"name":"amount","type":"uint256"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kncPerEthBaseRatePrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getTokenToEthAddOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BURN_TO_STAKE_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"isEthToToken","type":"bool[]"},{"name":"srcAmount","type":"uint128[]"},{"name":"dstAmount","type":"uint128[]"},{"name":"hintPrevOrder","type":"uint32[]"},{"name":"isAfterPrevOrder","type":"bool[]"}],"name":"addOrderBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"}],"name":"depositEther","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_REMAINING_ORDER_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerOrdersEthToToken","outputs":[{"name":"firstOrderId","type":"uint32"},{"name":"takenBitmap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"updateEthToTokenOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"}],"name":"cancelTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"getEthToTokenMakerOrderIds","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokenToEthOrderList","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getEthToTokenAddOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_USD_PER_ETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenToEthList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contracts","outputs":[{"name":"kncToken","type":"address"},{"name":"token","type":"address"},{"name":"feeBurner","type":"address"},{"name":"kyberNetwork","type":"address"},{"name":"medianizer","type":"address"},{"name":"orderListFactory","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"}],"name":"getTokenToEthOrder","outputs":[{"name":"_maker","type":"address"},{"name":"_srcAmount","type":"uint128"},{"name":"_dstAmount","type":"uint128"},{"name":"_prevId","type":"uint32"},{"name":"_nextId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dstToken","type":"address"},{"name":"dstAddress","type":"address"},{"name":"conversionRate","type":"uint256"},{"name":"validate","type":"bool"}],"name":"trade","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"submitTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"submitEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BURN_FEE_BPS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"srcQty","type":"uint256"},{"name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setKncPerEthBaseRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcKncStake","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"}],"name":"updateEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"}],"name":"calcBurnAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"limits","outputs":[{"name":"minNewOrderSizeUsd","type":"uint256"},{"name":"maxOrdersPerTrade","type":"uint256"},{"name":"minNewOrderSizeWei","type":"uint256"},{"name":"minOrderSizeWei","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"makerUnlockedKnc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"},{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"}],"name":"getTokenToEthUpdateOrderHint","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"updateTokenToEthOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawKncFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"},{"name":"newSrcAmount","type":"uint128"},{"name":"newDstAmount","type":"uint128"}],"name":"updateTokenToEthOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcAmount","type":"uint128"},{"name":"dstAmount","type":"uint128"},{"name":"hintPrevOrder","type":"uint32"}],"name":"submitTokenToEthOrderWHint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setMinOrderSizeEth","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"getTokenToEthMakerOrderIds","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maker","type":"address"}],"name":"makerRequiredKncStake","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"orderId","type":"uint32"}],"name":"getEthToTokenOrder","outputs":[{"name":"_maker","type":"address"},{"name":"_srcAmount","type":"uint128"},{"name":"_dstAmount","type":"uint128"},{"name":"_prevId","type":"uint32"},{"name":"_nextId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HEAD_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"makerTotalOrdersWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"maker","type":"address"},{"name":"amount","type":"uint256"}],"name":"depositKncForFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"makerFunds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerBurnFeeBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TAIL_ID","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"init","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kncRateBlocksTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"isEthToToken","type":"bool[]"},{"name":"orderId","type":"uint32[]"},{"name":"newSrcAmount","type":"uint128[]"},{"name":"newDstAmount","type":"uint128[]"},{"name":"hintPrevOrder","type":"uint32[]"}],"name":"updateOrderBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEthToTokenOrderList","outputs":[{"name":"orderList","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderId","type":"uint32"}],"name":"cancelEthToTokenOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethToTokenList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"knc","type":"address"},{"name":"reserveToken","type":"address"},{"name":"burner","type":"address"},{"name":"network","type":"address"},{"name":"medianizer","type":"address"},{"name":"factory","type":"address"},{"name":"minNewOrderUsd","type":"uint256"},{"name":"maxOrdersPerTrade","type":"uint256"},{"name":"burnFeeBps","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"srcToken","type":"address"},{"indexed":false,"name":"dstToken","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"dstAmount","type":"uint256"}],"name":"OrderbookReserveTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EtherDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"KncFeeDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint128"},{"indexed":false,"name":"addedWithHint","type":"bool"}],"name":"NewLimitOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"orderId","type":"uint256"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint128"},{"indexed":false,"name":"updatedWithHint","type":"bool"}],"name":"OrderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"srcAmount","type":"uint128"},{"indexed":false,"name":"dstAmount","type":"uint256"}],"name":"OrderCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"}],"name":"FullOrderTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maker","type":"address"},{"indexed":false,"name":"orderId","type":"uint32"},{"indexed":false,"name":"isEthToToken","type":"bool"},{"indexed":false,"name":"isRemoved","type":"bool"}],"name":"PartialOrderTaken","type":"event"}]

606060405234156200001057600080fd5b60405161012080620046e1833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051915050600160a060020a03891615156200007657600080fd5b600160a060020a03881615156200008c57600080fd5b600160a060020a0387161515620000a257600080fd5b600160a060020a0386161515620000b857600080fd5b600160a060020a0385161515620000ce57600080fd5b600160a060020a0384161515620000e457600080fd5b801515620000f157600080fd5b60648111156200010057600080fd5b8115156200010d57600080fd5b600083116200011b57600080fd5b60098054600160a060020a0319908116600160a060020a03898116919091179092556008805482168a8416179055600a80548216888416179055600b805482168784161790556006805482168c841617905560078054909116918a16919091179055601181905560028390556003829055620001a46401000000006200032d8102620020801704565b1515620001b057600080fd5b600654600854600160a060020a039182169163095ea7b391167f80000000000000000000000000000000000000000000000000000000000000006000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200025057600080fd5b6102c65a03f115156200026257600080fd5b5050506040518051905015156200027857600080fd5b6007546200029d90600160a060020a0316640100000000620040bb6200042e82021704565b600854600160a060020a031663301254166000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620002ff57600080fd5b6102c65a03f115156200031157600080fd5b5050506040518051600155506200050e98505050505050505050565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016040805180830381600087803b15156200039857600080fd5b6102c65a03f11515620003aa57600080fd5b505050604051805190602001805191955090935050821515620003cc57600080fd5b670de0b6b3a764000084049150811515620003e657600080fd5b620186a08210620003f657600080fd5b60025484906ec097ce7bc90715b34b9f1000000000028115156200041657fe5b04600481905560029004600555506001949350505050565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156200047657600160a060020a0381166000908152602081905260409020601290556200050b565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620004d657600080fd5b6102c65a03f11515620004e857600080fd5b5050506040518051600160a060020a038316600090815260208190526040902055505b50565b6141c3806200051e6000396000f30060606040526004361061029a5763ffffffff60e060020a60003504166304068ae2811461029f57806314fd6da0146102c4578063269fe82e146103065780632ac1db5a1461031c5780632b4d53031461036357806330cbb66f14610382578063338b5dea146103c05780633b443e3b146103e45780633bed33ce146103f7578063411273d81461040d57806344909b741461043257806350baa6221461044557806350d91deb1461045b57806352802121146105aa578063541e15b6146105be57806357df82e0146105d15780635cd36325146105f05780635e310670146106275780635ff468571461064357806362bb7533146106b557806362c5aecc146106c8578063685e7fc2146106ed578063690d986b146107005780636c0f79b61461072f5780636c3aacf9146107875780636cf69811146107f1578063744fa2c81461081d57806374d88c50146108425780637a03b624146108675780637cd442721461087a5780637f18b569146108a55780638108592c146108b857806384d062b4146108ce578063853717bb146108fc578063860aefcf146109125780638b7d6b05146109505780638fb2fbe11461096f57806390f3dd331461099d57806392418cf6146109d4578063971e668f146109ea5780639d0d647314610a185780639ebbf23114610a465780639f7ba82814610a59578063a9055b8114610a78578063abdde3d114610a97578063b7b2c52514610ab3578063ba6b0fa014610ac6578063bc1f71e114610ae5578063c01a3cd214610b07578063c444214a14610b2c578063d11dfdec14610b3f578063d4fac45d14610b52578063e1c7392a14610b77578063e934853214610b8a578063f2e9135014610b9d578063f67e8db214610cec578063f719254d14610cff578063fe459fdf14610d1b575b600080fd5b34156102aa57600080fd5b6102b2610d2e565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102f26001608060020a036004358116906024351663ffffffff60443516610d33565b604051901515815260200160405180910390f35b341561031157600080fd5b6102b2600435610d71565b341561032757600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516610dfa565b60405163ffffffff909116815260200160405180910390f35b341561036e57600080fd5b6102b2600160a060020a0360043516610f4f565b341561038d57600080fd5b6103a1600160a060020a0360043516610f61565b60405163ffffffff909216825260208201526040908101905180910390f35b34156103cb57600080fd5b6103e2600160a060020a0360043516602435610f83565b005b34156103ef57600080fd5b6102b26110aa565b341561040257600080fd5b6103e26004356110b0565b341561041857600080fd5b61034a6001608060020a0360043581169060243516611156565b341561043d57600080fd5b6102b26111f5565b341561045057600080fd5b6103e26004356111fa565b341561046657600080fd5b6102f26004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506112e095505050505050565b6103e2600160a060020a0360043516611435565b34156105c957600080fd5b6102b26114ba565b34156105dc57600080fd5b6103a1600160a060020a03600435166114bf565b34156105fb57600080fd5b6102f263ffffffff6004358116906001608060020a0360243581169160443590911690606435166114e1565b341561063257600080fd5b6102f263ffffffff60043516611508565b341561064e57600080fd5b610662600160a060020a0360043516611528565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156106a1578082015183820152602001610689565b505050509050019250505060405180910390f35b34156106c057600080fd5b6106626115ea565b34156106d357600080fd5b61034a6001608060020a036004358116906024351661160d565b34156106f857600080fd5b6102b2611689565b341561070b57600080fd5b610713611690565b604051600160a060020a03909116815260200160405180910390f35b341561073a57600080fd5b61074261169f565b604051600160a060020a0396871681529486166020860152928516604080860191909152918516606085015284166080840152921660a082015260c001905180910390f35b341561079257600080fd5b6107a363ffffffff600435166116d1565b604051600160a060020a0390951685526001608060020a0393841660208601529190921660408085019190915263ffffffff92831660608501529116608083015260a0909101905180910390f35b6102f2600160a060020a03600435811690602435906044358116906064351660843560a4351515611772565b341561082857600080fd5b6102f26001608060020a0360043581169060243516611a64565b341561084d57600080fd5b6102f26001608060020a0360043581169060243516611a79565b341561087257600080fd5b6102b2611a87565b341561088557600080fd5b6102b2600160a060020a0360043581169060243516604435606435611a8c565b34156108b057600080fd5b6103e2611d09565b34156108c357600080fd5b6102b2600435611d83565b34156108d957600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516611d97565b341561090757600080fd5b6102b2600435611da6565b341561091d57600080fd5b610925611dc3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b341561095b57600080fd5b6102b2600160a060020a0360043516611dd2565b341561097a57600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516611e2f565b34156109a857600080fd5b6102f263ffffffff6004358116906001608060020a036024358116916044359091169060643516611f38565b34156109df57600080fd5b6103e2600435611f48565b34156109f557600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516612029565b3415610a2357600080fd5b6102f26001608060020a036004358116906024351663ffffffff6044351661204d565b3415610a5157600080fd5b6102f2612080565b3415610a6457600080fd5b610662600160a060020a0360043516612162565b3415610a8357600080fd5b6102b2600160a060020a036004351661221c565b3415610aa257600080fd5b6107a363ffffffff6004351661223e565b3415610abe57600080fd5b61034a6114ba565b3415610ad157600080fd5b6102b2600160a060020a036004351661229b565b3415610af057600080fd5b6103e2600160a060020a03600435166024356122ad565b3415610b1257600080fd5b6102b2600160a060020a036004358116906024351661251d565b3415610b3757600080fd5b6102b261253a565b3415610b4a57600080fd5b61034a612540565b3415610b5d57600080fd5b6102b2600160a060020a0360043581169060243516612545565b3415610b8257600080fd5b6102f26125f0565b3415610b9557600080fd5b6102f261278e565b3415610ba857600080fd5b6102f260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061280095505050505050565b3415610cf757600080fd5b6106626128de565b3415610d0a57600080fd5b6102f263ffffffff600435166128fb565b3415610d2657600080fd5b610713612908565b602081565b600160a060020a03331660009081526013602052604081208190610d5690612917565b9050610d6660018287878761295c565b91505b509392505050565b60085460009069021e19e0c9bab240000090600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc757600080fd5b6102c65a03f11515610dd857600080fd5b50505060405180519050601154840202811515610df157fe5b0490505b919050565b60008060008060006002800154876001608060020a031610151515610e1e57600080fd5b600d54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515610e7f57600080fd5b6102c65a03f11515610e9057600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600d54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b6102c65a03f11515610f1457600080fd5b505050604051805190602001805190602001805190602001805190602001805191985093965091945090925050505b50919695505050505050565b600f6020526000908152604090205481565b6012602052600090815260409020805460019091015463ffffffff9091169082565b600160a060020a0382161515610f9857600080fd5b6b204fce5e3e250261100000008110610fb057600080fd5b600754600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561101c57600080fd5b6102c65a03f1151561102d57600080fd5b50505060405180519050151561104257600080fd5b600160a060020a038083166000818152600e602090815260408083206007549095168352939052829020805484019055907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9083905190815260200160405180910390a25050565b60015481565b33600160a060020a0381166000908152600e602090815260408083206000805160206141788339815191528452909152902054828110156110f057600080fd5b600160a060020a0382166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054869003905584156108fc0290859051600060405180830381858888f19350505050151561115157600080fd5b505050565b6004546000906001608060020a038316101561117157600080fd5b600c54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b50505060405180519150505b92915050565b600581565b33600160a060020a038181166000908152600e60209081526040808320600754909416835292905220548281101561123157600080fd5b600160a060020a038083166000908152600e60209081526040808320600780548616855292528083208054889003905590549092169163a9059cbb918591879190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156112ba57600080fd5b6102c65a03f115156112cb57600080fd5b50505060405180519050151561115157600080fd5b600080600080600086518a51146112f657600080fd5b87518a511461130457600080fd5b88518a511461131257600080fd5b85518a511461132057600080fd5b5033925060009050805b89518110156114255785818151811061133f57fe5b906020019060200201516113685786818151811061135957fe5b9060200190602002015161136a565b815b92506113c48a828151811061137b57fe5b906020019060200201516113a657600160a060020a03851660009081526012602052604090206113bf565b600160a060020a03851660009081526013602052604090205b612917565b91506114128a82815181106113d557fe5b90602001906020020151838b84815181106113ec57fe5b906020019060200201518b858151811061140257fe5b906020019060200201518761295c565b151561141d57600080fd5b60010161132a565b5060019998505050505050505050565b600160a060020a038116151561144a57600080fd5b600160a060020a0381166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054349081019091557f939e51ac2fd009b158d6344f7e68a83d8d18d9b0cc88cf514aac6aaa9cad2a18915190815260200160405180910390a250565b600281565b6013602052600090815260409020805460019091015463ffffffff9091169082565b60006114f1600186868686612be8565b15156114fc57600080fd5b5060015b949350505050565b6000611515600083612f0b565b151561152057600080fd5b506001919050565b61153061407b565b600160a060020a03821660009081526013602052604081209080611553836130cc565b6040518059106115605750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a0284600101541611156115da578254600183019263ffffffff9091168201908590815181106115c557fe5b63ffffffff9092166020928302909101909101525b60010161157c565b505050919050565b6115f261407b565b600c54600160a060020a0316611607816130fe565b91505090565b6004546000906001608060020a038416101561162857600080fd5b600d54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b620186a081565b600c54600160a060020a031681565b600654600754600854600954600a54600b54600160a060020a0395861695948516949384169392831692918216911686565b600c546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b6102c65a03f1151561173f57600080fd5b5050506040518051906020018051906020018051906020018051906020018051949b939a50919850965091945092505050565b600954600090819033600160a060020a0390811691161461179257600080fd5b600160a060020a03881660008051602061417883398151915214806117cd5750600160a060020a038616600080516020614178833981519152145b15156117d857600080fd5b600754600160a060020a03898116911614806118015750600754600160a060020a038781169116145b151561180c57600080fd5b6b204fce5e3e2502611000000087111561182557600080fd5b600160a060020a03881660008051602061417883398151915214156118555734871461185057600080fd5b6118f0565b341561186057600080fd5b87600160a060020a03166323b872dd33308a60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156118ca57600080fd5b6102c65a03f115156118db57600080fd5b5050506040518051905015156118f057600080fd5b6118fb8888886132bc565b9050611919878261190b8b6134b0565b6119148a6134b0565b613564565b84111561192557600080fd5b600160a060020a038616600080516020614178833981519152141561197a57600160a060020a03851681156108fc0282604051600060405180830381858888f19350505050151561197557600080fd5b6119fd565b85600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119d757600080fd5b6102c65a03f115156119e857600080fd5b5050506040518051905015156119fd57600080fd5b7f36cfc7e9779b5ccf22f92f2f0d9adf9c74df05ab07de27c8cb508020389f9adc88878984604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a1506001979650505050505050565b6000611a728383600061204d565b9392505050565b6000611a7283836000610d33565b606481565b6000806000611a9961408d565b60008080600160a060020a038b166000805160206141788339815191521480611ad85750600160a060020a038a16600080516020614178833981519152145b1515611ae357600080fd5b600754600160a060020a038c811691161480611b0c5750600754600160a060020a038b81169116145b1515611b1757600080fd5b6b204fce5e3e25026110000000891115611b3057600080fd5b611b3861278e565b80611b41575088155b15611b4f5760009650611cfb565b600160a060020a038b1660008051602061417883398151915214611b7e57600d54600160a060020a0316611b8b565b600c54600160a060020a03165b600354909650899350600092509050600160a060020a03861663a3fb591783604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b1515611bde57600080fd5b6102c65a03f11515611bef57600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a0316118015611c2357508360400151155b8015611c355750600019810190600090115b15611cc057611c4486866135ff565b9350826001608060020a031684608001516001608060020a031611611c7a57836060015182019150836080015183039250611cb4565b83608001516001608060020a0316836001608060020a031685606001516001608060020a031602811515611caa57fe5b0482019150600092505b83602001519450611c08565b6001608060020a03831615611cd85760009650611cfb565b611cf889836001608060020a0316611cef8e6134b0565b6119148e6134b0565b96505b505050505050949350505050565b600854600090600160a060020a0316633012541682604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d5357600080fd5b6102c65a03f11515611d6457600080fd5b505050604051805190509050600154811015611d805760018190555b50565b60006005611d9083611da6565b0292915050565b600061150084848460006114e1565b60015460115460009169021e19e0c9bab240000091840202610df1565b60025460035460045460055484565b600080611dde8361221c565b600160a060020a0384166000908152600f6020526040902054909150811115611e0a5760009150611e29565b600160a060020a0383166000908152600f602052604090205481900391505b50919050565b60008060008060006002800154866001608060020a031610151515611e5357600080fd5b600c54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515611eb457600080fd5b6102c65a03f11515611ec557600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600c54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b60006114f1600086868686612be8565b33600160a060020a0381166000908152600f602052604090205482901015611f6f57600080fd5b81611f7982611dd2565b1015611f8457600080fd5b600160a060020a038082166000908152600f6020526040808220805486900390556006549092169163a9059cbb918491869190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fff57600080fd5b6102c65a03f1151561201057600080fd5b50505060405180519050151561202557600080fd5b5050565b60006120388484846000611f38565b151561204357600080fd5b5060019392505050565b600160a060020a0333166000908152601260205260408120819061207090612917565b9050610d6660008287878761295c565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b15156120d157600080fd5b6102c65a03f115156120e257600080fd5b50505060405180519060200180519195509093505082151561210357600080fd5b670de0b6b3a76400008404915081151561211c57600080fd5b620186a0821061212b57600080fd5b60025484906ec097ce7bc90715b34b9f10000000000281151561214a57fe5b04600481905560029004600555506001949350505050565b61216a61407b565b600160a060020a0382166000908152601260205260408120908061218d836130cc565b60405180591061219a5750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a028460010154161115612214578254600183019263ffffffff9091168201908590815181106121ff57fe5b63ffffffff9092166020928302909101909101525b6001016121b6565b600160a060020a0381166000908152601060205260408120546111ef90611d83565b600d546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b60106020526000908152604090205481565b600160a060020a03821615156122c257600080fd5b6b204fce5e3e2502611000000081106122da57600080fd5b600654600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561234657600080fd5b6102c65a03f1151561235757600080fd5b50505060405180519050151561236c57600080fd5b600160a060020a0382166000818152600f6020526040908190208054840190557f7616f7b36d352f805882b5e6af4b72e6d1f325e5d73feef17ba9f064468498769083905190815260200160405180910390a2600160a060020a03821660009081526012602052604090206123e0906136d9565b1561247e57600160a060020a038083166000908152601260209081526040808320600c54612473959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b6102c65a03f1151561246457600080fd5b505050604051805190506136fa565b151561247e57600080fd5b600160a060020a038216600090815260136020526040902061249f906136d9565b1561202557600160a060020a038083166000908152601360209081526040808320600d54612512959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b151561202557600080fd5b600e60209081526000928352604080842090915290825290205481565b60115481565b600181565b6000600160a060020a03831660008051602061417883398151915214156125775750600160a060020a038116316111ef565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125ce57600080fd5b6102c65a03f115156125df57600080fd5b5050506040518051905090506111ef565b600c54600090600160a060020a0316158015906126175750600d54600160a060020a031615155b156126245750600161278b565b600c54600160a060020a03161515806126475750600d54600160a060020a031615155b1561265157600080fd5b600b54600160a060020a031663fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156126aa57600080fd5b6102c65a03f115156126bb57600080fd5b5050506040518051600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055600b5416905063fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561273f57600080fd5b6102c65a03f1151561275057600080fd5b5050506040518051600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550600190505b90565b60015460085460009160050290600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156127df57600080fd5b6102c65a03f115156127f057600080fd5b5050506040518051905011905090565b600080855187511461281157600080fd5b845187511461281f57600080fd5b835187511461282d57600080fd5b825187511461283b57600080fd5b5060005b86518110156128d1576128be87828151811061285757fe5b9060200190602002015187838151811061286d57fe5b9060200190602002015187848151811061288357fe5b9060200190602002015187858151811061289957fe5b906020019060200201518786815181106128af57fe5b90602001906020020151612be8565b15156128c957600080fd5b60010161283f565b5060019695505050505050565b6128e661407b565b600d54600160a060020a0316611607816130fe565b6000611515600183612f0b565b600d54600160a060020a031681565b600180820154600091825b602081101561029a57828216151561294d578282176001860155845463ffffffff16810193506115e2565b60029190910290600101612922565b60008080806b204fce5e3e250261100000006001608060020a0388161061298257600080fd5b6b204fce5e3e250261100000006001608060020a038716106129a357600080fd5b3392506129b2838a8989613736565b15156129bd57600080fd5b6129da876001608060020a0316876001608060020a03168b6137a3565b15156129e557600080fd5b60009150886129ff57600c54600160a060020a0316612a0c565b600d54600160a060020a03165b905063ffffffff851615612abb5780600160a060020a031663a5da0bf5848a8a8a8a60006040516020015260405163ffffffff87811660e060020a028252600160a060020a0396909616600482015293851660248501526001608060020a03928316604485015291166064830152909116608482015260a401602060405180830381600087803b1515612a9e57600080fd5b6102c65a03f11515612aaf57600080fd5b50505060405180519250505b811515612b655780600160a060020a031663c92ba8b2848a8a8a60006040516020015260405163ffffffff86811660e060020a028252600160a060020a039590951660048201529290931660248301526001608060020a0390811660448301529091166064820152608401602060405180830381600087803b1515612b3f57600080fd5b6102c65a03f11515612b5057600080fd5b505050604051805190501515612b6557600080fd5b82600160a060020a03167f2fb3fe66d41cb2d1b0d335656d86e7c779ebdc34c6f6fc806d35790a30be0e6d898b8a8a8760405163ffffffff909516855292151560208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a250600198975050505050505050565b6000808080808080806b204fce5e3e250261100000006001608060020a038c1610612c1257600080fd5b6b204fce5e3e250261100000006001608060020a038b1610612c3357600080fd5b612c508b6001608060020a03168b6001608060020a03168f6137a3565b1515612c5b57600080fd5b8c612c7157600c54600160a060020a0316612c7e565b600d54600160a060020a03165b915081600160a060020a03166361592b858d600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515612cd157600080fd5b6102c65a03f11515612ce257600080fd5b505050604051805190602001805190602001805190602001805190602001805150939a5090985090965094505033600160a060020a0390811690881614612d2857600080fd5b612d36878e87898f8f613815565b1515612d455760009750612efb565b50600063ffffffff891615612dec5781600160a060020a031663a590529e8d8d8d8d60006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515612dc657600080fd5b6102c65a03f11515612dd757600080fd5b50505060405180519060200180519450909150505b801515612e825781600160a060020a031663cb2f7b878d8d8d60006040516020015260405163ffffffff85811660e060020a0282529390931660048401526001608060020a039182166024840152166044820152606401602060405180830381600087803b1515612e5c57600080fd5b6102c65a03f11515612e6d57600080fd5b505050604051805190501515612e8257600080fd5b86600160a060020a03167f2bf327e052ee7ab98550e3d864a5b2a61f7737dc75cbcaada4e55f88222ebbd78e8e8e8e86604051941515855263ffffffff90931660208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a2600197505b5050505050505095945050505050565b6000806000612f1861408d565b600033935086612f3357600c54600160a060020a0316612f40565b600d54600160a060020a03165b9250612f4c83876135ff565b9150600160a060020a0384168251600160a060020a031614612f6d57600080fd5b86612f7c578160800151612f82565b81606001515b6001608060020a03169050612f99848260006138c7565b1515612fa457600080fd5b612fd5838589612fbf57600754600160a060020a0316612fcf565b6000805160206141788339815191525b896139a2565b1515612fe057600080fd5b8160600151600160a060020a0385166000908152600e602052604081206001608060020a039290921691908961302157600754600160a060020a0316613031565b6000805160206141788339815191525b600160a060020a0390811682526020820192909252604001600020805490920190915584167f179f16fddc625e40df9cb92cfcea70d64a6262c82b7a769e52996b1ff511ff56888860608601518660800151604051931515845263ffffffff90921660208401526001608060020a03908116604080850191909152911660608301526080909101905180910390a25060019695505050505050565b6000805b6020811015611e295760008160019060020a0284600101541611156130f6576001909101905b6001016130d0565b61310661407b565b61310e61408d565b60008060008086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561315957600080fd5b6102c65a03f1151561316a57600080fd5b50505060405180519060200180519195509093505082156131ac5760006040518059106131945750595b908082528060200260200182016040525095506132b2565b600091505b846040015115156131da576131c687856135ff565b9450600190910190602085015193506131b1565b816040518059106131e85750595b9080825280602002602001820160405250955086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561324057600080fd5b6102c65a03f1151561325157600080fd5b505050604051805190602001805115156040880152509350600090505b818110156132b2578386828151811061328357fe5b63ffffffff9092166020928302909101909101526132a187856135ff565b94508460200151935060010161326e565b5050505050919050565b60008060006132c961408d565b60008080600160a060020a038a16600080516020614178833981519152146132fc57600d54600160a060020a0316613309565b600c54600160a060020a03165b95508892506000915085600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561335757600080fd5b6102c65a03f1151561336857600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a031611801561339c57508360400151155b1561346f576133ab86866135ff565b9350826001608060020a031684608001516001608060020a031611613403578360600151820191508360800151909203916133f38451868c8b88608001518960600151613a7b565b15156133fe57600080fd5b613463565b83608001516001608060020a0316836001608060020a031685606001516001608060020a03160281151561343357fe5b049182019190506134538451868c8b87868a606001518b60800151613b70565b151561345e57600080fd5b600092505b83602001519450613381565b6001608060020a03831615801561348f57506000826001608060020a0316115b151561349a57600080fd5b506001608060020a031698975050505050505050565b600080600160a060020a03831660008051602061417883398151915214156134db5760129150611e29565b50600160a060020a0382166000908152602081905260409020548015156111ef5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561354257600080fd5b6102c65a03f1151561355357600080fd5b505050604051805190509150611e29565b60006b204fce5e3e2502611000000085111561357f57600080fd5b6b204fce5e3e2502611000000084111561359857600080fd5b8282106135d357601283830311156135af57600080fd5b84838303600a0a02670de0b6b3a764000085028115156135cb57fe5b049050611500565b601282840311156135e357600080fd5b84828403600a0a670de0b6b3a76400008602028115156135cb57fe5b61360761408d565b600083600160a060020a03166361592b8584600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561365a57600080fd5b6102c65a03f1151561366b57600080fd5b505050604051805190602001805190602001805190602001805190602001805163ffffffff16602088019081526001608060020a039384166080890152939092166060870152600160a060020a039093168552509091506001905163ffffffff161460408301525092915050565b805460009063ffffffff1615156136f257506001610df5565b506000919050565b815460009063ffffffff1681901115613715575060006111ef565b50815463ffffffff191663ffffffff91909116178155600060019182015590565b600080846137445782613746565b835b6004546001608060020a0391909116915081101561376357600080fd5b6137778686866001608060020a0316613dd3565b151561378257600080fd5b61378c8682613ea9565b151561379757600080fd5b50600195945050505050565b60008082156137d7576007546137d090859087906137c990600160a060020a03166134b0565b6012613564565b90506137fa565b6007546137f7908590879060129061191490600160a060020a03166134b0565b90505b69d3c21bcecceda10000008111156114fc5760009150610d69565b6000806000876138255783613827565b845b6001608060020a031691508761385157856001608060020a0316846001608060020a031603613867565b866001608060020a0316856001608060020a0316035b60045490915082101561387957600080fd5b6138988989896001608060020a0316886001608060020a031603613dd3565b15156138a357600080fd5b6138ad8982613ea9565b15156138b857600080fd5b50600198975050505050505050565b600080838311156138d757600080fd5b600160a060020a03851660009081526010602052604090205484111561391557600160a060020a038516600090815260106020526040812055613935565b600160a060020a0385166000908152601060205260409020805485900390555b8215156139455760019150610d69565b61394e83610d71565b600160a060020a0386166000908152600f60205260409020549091508190101561397757600080fd5b600160a060020a0385166000908152600f602052604090208054829003905560019150509392505050565b60008085600160a060020a031662d84fd88460006040516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b15156139f557600080fd5b6102c65a03f11515613a0657600080fd5b505050604051805190501515613a1b57600080fd5b600160a060020a03841660008051602061417883398151915214613a5657600160a060020a0385166000908152601260205260409020613a6f565b600160a060020a03851660009081526013602052604090205b905061378c8184613f90565b600080600160a060020a03861660008051602061417883398151915214613aad57600d54600160a060020a0316613aba565b600c54600160a060020a03165b9050613ac88189878a6139a2565b1515613ad357600080fd5b7ffc2eaa59b7259e4eb0ce92d7a86fce8b0fb67fade6f9f69df98f4771035a50c28888600160a060020a03891660008051602061417883398151915214604051600160a060020a03909316835263ffffffff909116602083015215156040808301919091526060909101905180910390a1613b648887866001608060020a0316866001608060020a0316600061400d565b98975050505050505050565b6000808080806001608060020a03808716908a1610613b8e57600080fd5b6001608060020a0380881690891610613ba657600080fd5b95879003959488900394600160a060020a038b1660008051602061417883398151915214613bdf57600d54600160a060020a0316613bec565b600c54600160a060020a03165b9350600160a060020a038b1660008051602061417883398151915214613c125786613c14565b855b6001608060020a0316925060009150600260030154831015613c8357600160a060020a03808e166000908152600e60209081526040808320938e1683529290522080546001608060020a038916019055829150613c73848e8c8f6139a2565b1515613c7e57600080fd5b613d26565b83600160a060020a031663a590529e8d8989600260006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515613cf657600080fd5b6102c65a03f11515613d0757600080fd5b50505060405180519060200180515090915050801515613d2657600080fd5b7fd499cca7d46b5236c2cb522ceec930ccf485eefca1f0472c020a1b7328bf06438d8d600160a060020a038e166000805160206141788339815191521460008611604051600160a060020a03909416845263ffffffff9092166020840152151560408084019190915290151560608301526080909101905180910390a1613dc28d8c8b6001608060020a03168b6001608060020a03168661400d565b9d9c50505050505050505050505050565b60008083613dec57600754600160a060020a0316613dfc565b6000805160206141788339815191525b90506000831215613e3e57600160a060020a038581166000908152600e60209081526040808320938516835292905290812080549185900390910190556114fc565b600160a060020a038086166000908152600e602090815260408083209385168352929052205483901015613e7157600080fd5b600160a060020a038086166000908152600e602090815260408083209385168352929052208054849003905560019150509392505050565b6000806000831215613f1e5750600160a060020a0383166000908152601060205260408120549083900390811115613ef65750600160a060020a0383166000908152601060205260409020545b600160a060020a03841660009081526010602052604090208054829003905560019150613f89565b600160a060020a038416600090815260106020526040902054613f42908401611d83565b600160a060020a0385166000908152600f60205260409020541015613f6657600080fd5b600160a060020a0384166000908152601060205260409020805484019055600191505b5092915050565b81546000908190819063ffffffff9081169085161015613faf57600080fd5b845463ffffffff90811660200190851610613fc957600080fd5b50508254600184015463ffffffff9182169184169190910390600282900a90600090821611613ff757600080fd5b6001808601805483191690559250505092915050565b600080600160a060020a038616600080516020614178833981519152146140345783614036565b845b600160a060020a038089166000908152600e60209081526040808320938b16835292905220805487019055905061407087848301836138c7565b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b600160a060020a03811660008051602061417883398151915214156140fb57600160a060020a038116600090815260208190526040902060129055611d80565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561414157600080fd5b6102c65a03f1151561415257600080fd5b5050506040518051600160a060020a03831660009081526020819052604090205550505600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058207eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d0029000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000e8d6b471e332f140e7d9dbb99e5e3822f728da60000000000000000000000008007aa43792a392b221dc091bdb2191e5ff626d100000000000000000000000065bf64ff5f51272f729bdcd7acfb00677ced86cd000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab6800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000019

Deployed Bytecode

0x60606040526004361061029a5763ffffffff60e060020a60003504166304068ae2811461029f57806314fd6da0146102c4578063269fe82e146103065780632ac1db5a1461031c5780632b4d53031461036357806330cbb66f14610382578063338b5dea146103c05780633b443e3b146103e45780633bed33ce146103f7578063411273d81461040d57806344909b741461043257806350baa6221461044557806350d91deb1461045b57806352802121146105aa578063541e15b6146105be57806357df82e0146105d15780635cd36325146105f05780635e310670146106275780635ff468571461064357806362bb7533146106b557806362c5aecc146106c8578063685e7fc2146106ed578063690d986b146107005780636c0f79b61461072f5780636c3aacf9146107875780636cf69811146107f1578063744fa2c81461081d57806374d88c50146108425780637a03b624146108675780637cd442721461087a5780637f18b569146108a55780638108592c146108b857806384d062b4146108ce578063853717bb146108fc578063860aefcf146109125780638b7d6b05146109505780638fb2fbe11461096f57806390f3dd331461099d57806392418cf6146109d4578063971e668f146109ea5780639d0d647314610a185780639ebbf23114610a465780639f7ba82814610a59578063a9055b8114610a78578063abdde3d114610a97578063b7b2c52514610ab3578063ba6b0fa014610ac6578063bc1f71e114610ae5578063c01a3cd214610b07578063c444214a14610b2c578063d11dfdec14610b3f578063d4fac45d14610b52578063e1c7392a14610b77578063e934853214610b8a578063f2e9135014610b9d578063f67e8db214610cec578063f719254d14610cff578063fe459fdf14610d1b575b600080fd5b34156102aa57600080fd5b6102b2610d2e565b60405190815260200160405180910390f35b34156102cf57600080fd5b6102f26001608060020a036004358116906024351663ffffffff60443516610d33565b604051901515815260200160405180910390f35b341561031157600080fd5b6102b2600435610d71565b341561032757600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516610dfa565b60405163ffffffff909116815260200160405180910390f35b341561036e57600080fd5b6102b2600160a060020a0360043516610f4f565b341561038d57600080fd5b6103a1600160a060020a0360043516610f61565b60405163ffffffff909216825260208201526040908101905180910390f35b34156103cb57600080fd5b6103e2600160a060020a0360043516602435610f83565b005b34156103ef57600080fd5b6102b26110aa565b341561040257600080fd5b6103e26004356110b0565b341561041857600080fd5b61034a6001608060020a0360043581169060243516611156565b341561043d57600080fd5b6102b26111f5565b341561045057600080fd5b6103e26004356111fa565b341561046657600080fd5b6102f26004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506112e095505050505050565b6103e2600160a060020a0360043516611435565b34156105c957600080fd5b6102b26114ba565b34156105dc57600080fd5b6103a1600160a060020a03600435166114bf565b34156105fb57600080fd5b6102f263ffffffff6004358116906001608060020a0360243581169160443590911690606435166114e1565b341561063257600080fd5b6102f263ffffffff60043516611508565b341561064e57600080fd5b610662600160a060020a0360043516611528565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156106a1578082015183820152602001610689565b505050509050019250505060405180910390f35b34156106c057600080fd5b6106626115ea565b34156106d357600080fd5b61034a6001608060020a036004358116906024351661160d565b34156106f857600080fd5b6102b2611689565b341561070b57600080fd5b610713611690565b604051600160a060020a03909116815260200160405180910390f35b341561073a57600080fd5b61074261169f565b604051600160a060020a0396871681529486166020860152928516604080860191909152918516606085015284166080840152921660a082015260c001905180910390f35b341561079257600080fd5b6107a363ffffffff600435166116d1565b604051600160a060020a0390951685526001608060020a0393841660208601529190921660408085019190915263ffffffff92831660608501529116608083015260a0909101905180910390f35b6102f2600160a060020a03600435811690602435906044358116906064351660843560a4351515611772565b341561082857600080fd5b6102f26001608060020a0360043581169060243516611a64565b341561084d57600080fd5b6102f26001608060020a0360043581169060243516611a79565b341561087257600080fd5b6102b2611a87565b341561088557600080fd5b6102b2600160a060020a0360043581169060243516604435606435611a8c565b34156108b057600080fd5b6103e2611d09565b34156108c357600080fd5b6102b2600435611d83565b34156108d957600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516611d97565b341561090757600080fd5b6102b2600435611da6565b341561091d57600080fd5b610925611dc3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b341561095b57600080fd5b6102b2600160a060020a0360043516611dd2565b341561097a57600080fd5b61034a63ffffffff600435166001608060020a0360243581169060443516611e2f565b34156109a857600080fd5b6102f263ffffffff6004358116906001608060020a036024358116916044359091169060643516611f38565b34156109df57600080fd5b6103e2600435611f48565b34156109f557600080fd5b6102f263ffffffff600435166001608060020a0360243581169060443516612029565b3415610a2357600080fd5b6102f26001608060020a036004358116906024351663ffffffff6044351661204d565b3415610a5157600080fd5b6102f2612080565b3415610a6457600080fd5b610662600160a060020a0360043516612162565b3415610a8357600080fd5b6102b2600160a060020a036004351661221c565b3415610aa257600080fd5b6107a363ffffffff6004351661223e565b3415610abe57600080fd5b61034a6114ba565b3415610ad157600080fd5b6102b2600160a060020a036004351661229b565b3415610af057600080fd5b6103e2600160a060020a03600435166024356122ad565b3415610b1257600080fd5b6102b2600160a060020a036004358116906024351661251d565b3415610b3757600080fd5b6102b261253a565b3415610b4a57600080fd5b61034a612540565b3415610b5d57600080fd5b6102b2600160a060020a0360043581169060243516612545565b3415610b8257600080fd5b6102f26125f0565b3415610b9557600080fd5b6102f261278e565b3415610ba857600080fd5b6102f260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061280095505050505050565b3415610cf757600080fd5b6106626128de565b3415610d0a57600080fd5b6102f263ffffffff600435166128fb565b3415610d2657600080fd5b610713612908565b602081565b600160a060020a03331660009081526013602052604081208190610d5690612917565b9050610d6660018287878761295c565b91505b509392505050565b60085460009069021e19e0c9bab240000090600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc757600080fd5b6102c65a03f11515610dd857600080fd5b50505060405180519050601154840202811515610df157fe5b0490505b919050565b60008060008060006002800154876001608060020a031610151515610e1e57600080fd5b600d54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515610e7f57600080fd5b6102c65a03f11515610e9057600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600d54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b6102c65a03f11515610f1457600080fd5b505050604051805190602001805190602001805190602001805190602001805191985093965091945090925050505b50919695505050505050565b600f6020526000908152604090205481565b6012602052600090815260409020805460019091015463ffffffff9091169082565b600160a060020a0382161515610f9857600080fd5b6b204fce5e3e250261100000008110610fb057600080fd5b600754600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561101c57600080fd5b6102c65a03f1151561102d57600080fd5b50505060405180519050151561104257600080fd5b600160a060020a038083166000818152600e602090815260408083206007549095168352939052829020805484019055907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9083905190815260200160405180910390a25050565b60015481565b33600160a060020a0381166000908152600e602090815260408083206000805160206141788339815191528452909152902054828110156110f057600080fd5b600160a060020a0382166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054869003905584156108fc0290859051600060405180830381858888f19350505050151561115157600080fd5b505050565b6004546000906001608060020a038316101561117157600080fd5b600c54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b6102c65a03f115156111e357600080fd5b50505060405180519150505b92915050565b600581565b33600160a060020a038181166000908152600e60209081526040808320600754909416835292905220548281101561123157600080fd5b600160a060020a038083166000908152600e60209081526040808320600780548616855292528083208054889003905590549092169163a9059cbb918591879190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156112ba57600080fd5b6102c65a03f115156112cb57600080fd5b50505060405180519050151561115157600080fd5b600080600080600086518a51146112f657600080fd5b87518a511461130457600080fd5b88518a511461131257600080fd5b85518a511461132057600080fd5b5033925060009050805b89518110156114255785818151811061133f57fe5b906020019060200201516113685786818151811061135957fe5b9060200190602002015161136a565b815b92506113c48a828151811061137b57fe5b906020019060200201516113a657600160a060020a03851660009081526012602052604090206113bf565b600160a060020a03851660009081526013602052604090205b612917565b91506114128a82815181106113d557fe5b90602001906020020151838b84815181106113ec57fe5b906020019060200201518b858151811061140257fe5b906020019060200201518761295c565b151561141d57600080fd5b60010161132a565b5060019998505050505050505050565b600160a060020a038116151561144a57600080fd5b600160a060020a0381166000818152600e602090815260408083206000805160206141788339815191528452909152908190208054349081019091557f939e51ac2fd009b158d6344f7e68a83d8d18d9b0cc88cf514aac6aaa9cad2a18915190815260200160405180910390a250565b600281565b6013602052600090815260409020805460019091015463ffffffff9091169082565b60006114f1600186868686612be8565b15156114fc57600080fd5b5060015b949350505050565b6000611515600083612f0b565b151561152057600080fd5b506001919050565b61153061407b565b600160a060020a03821660009081526013602052604081209080611553836130cc565b6040518059106115605750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a0284600101541611156115da578254600183019263ffffffff9091168201908590815181106115c557fe5b63ffffffff9092166020928302909101909101525b60010161157c565b505050919050565b6115f261407b565b600c54600160a060020a0316611607816130fe565b91505090565b6004546000906001608060020a038416101561162857600080fd5b600d54600160a060020a03166385fcb4a8848460006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b15156111d257600080fd5b620186a081565b600c54600160a060020a031681565b600654600754600854600954600a54600b54600160a060020a0395861695948516949384169392831692918216911686565b600c546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b6102c65a03f1151561173f57600080fd5b5050506040518051906020018051906020018051906020018051906020018051949b939a50919850965091945092505050565b600954600090819033600160a060020a0390811691161461179257600080fd5b600160a060020a03881660008051602061417883398151915214806117cd5750600160a060020a038616600080516020614178833981519152145b15156117d857600080fd5b600754600160a060020a03898116911614806118015750600754600160a060020a038781169116145b151561180c57600080fd5b6b204fce5e3e2502611000000087111561182557600080fd5b600160a060020a03881660008051602061417883398151915214156118555734871461185057600080fd5b6118f0565b341561186057600080fd5b87600160a060020a03166323b872dd33308a60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156118ca57600080fd5b6102c65a03f115156118db57600080fd5b5050506040518051905015156118f057600080fd5b6118fb8888886132bc565b9050611919878261190b8b6134b0565b6119148a6134b0565b613564565b84111561192557600080fd5b600160a060020a038616600080516020614178833981519152141561197a57600160a060020a03851681156108fc0282604051600060405180830381858888f19350505050151561197557600080fd5b6119fd565b85600160a060020a031663a9059cbb868360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119d757600080fd5b6102c65a03f115156119e857600080fd5b5050506040518051905015156119fd57600080fd5b7f36cfc7e9779b5ccf22f92f2f0d9adf9c74df05ab07de27c8cb508020389f9adc88878984604051600160a060020a0394851681529290931660208301526040808301919091526060820192909252608001905180910390a1506001979650505050505050565b6000611a728383600061204d565b9392505050565b6000611a7283836000610d33565b606481565b6000806000611a9961408d565b60008080600160a060020a038b166000805160206141788339815191521480611ad85750600160a060020a038a16600080516020614178833981519152145b1515611ae357600080fd5b600754600160a060020a038c811691161480611b0c5750600754600160a060020a038b81169116145b1515611b1757600080fd5b6b204fce5e3e25026110000000891115611b3057600080fd5b611b3861278e565b80611b41575088155b15611b4f5760009650611cfb565b600160a060020a038b1660008051602061417883398151915214611b7e57600d54600160a060020a0316611b8b565b600c54600160a060020a03165b600354909650899350600092509050600160a060020a03861663a3fb591783604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b1515611bde57600080fd5b6102c65a03f11515611bef57600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a0316118015611c2357508360400151155b8015611c355750600019810190600090115b15611cc057611c4486866135ff565b9350826001608060020a031684608001516001608060020a031611611c7a57836060015182019150836080015183039250611cb4565b83608001516001608060020a0316836001608060020a031685606001516001608060020a031602811515611caa57fe5b0482019150600092505b83602001519450611c08565b6001608060020a03831615611cd85760009650611cfb565b611cf889836001608060020a0316611cef8e6134b0565b6119148e6134b0565b96505b505050505050949350505050565b600854600090600160a060020a0316633012541682604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611d5357600080fd5b6102c65a03f11515611d6457600080fd5b505050604051805190509050600154811015611d805760018190555b50565b60006005611d9083611da6565b0292915050565b600061150084848460006114e1565b60015460115460009169021e19e0c9bab240000091840202610df1565b60025460035460045460055484565b600080611dde8361221c565b600160a060020a0384166000908152600f6020526040902054909150811115611e0a5760009150611e29565b600160a060020a0383166000908152600f602052604090205481900391505b50919050565b60008060008060006002800154866001608060020a031610151515611e5357600080fd5b600c54600160a060020a03166385fcb4a8888860006040516020015260405160e060020a63ffffffff85160281526001608060020a03928316600482015291166024820152604401602060405180830381600087803b1515611eb457600080fd5b6102c65a03f11515611ec557600080fd5b5050506040518051905093508763ffffffff168463ffffffff161415610f4357600c54600160a060020a03166361592b8589600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515610f0357600080fd5b60006114f1600086868686612be8565b33600160a060020a0381166000908152600f602052604090205482901015611f6f57600080fd5b81611f7982611dd2565b1015611f8457600080fd5b600160a060020a038082166000908152600f6020526040808220805486900390556006549092169163a9059cbb918491869190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611fff57600080fd5b6102c65a03f1151561201057600080fd5b50505060405180519050151561202557600080fd5b5050565b60006120388484846000611f38565b151561204357600080fd5b5060019392505050565b600160a060020a0333166000908152601260205260408120819061207090612917565b9050610d6660008287878761295c565b600a546000908190819081908190600160a060020a03166359e02dd782604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b15156120d157600080fd5b6102c65a03f115156120e257600080fd5b50505060405180519060200180519195509093505082151561210357600080fd5b670de0b6b3a76400008404915081151561211c57600080fd5b620186a0821061212b57600080fd5b60025484906ec097ce7bc90715b34b9f10000000000281151561214a57fe5b04600481905560029004600555506001949350505050565b61216a61407b565b600160a060020a0382166000908152601260205260408120908061218d836130cc565b60405180591061219a5750595b9080825280602002602001820160405250935060009150600090505b60208163ffffffff1610156115e25760008163ffffffff1660019060020a028460010154161115612214578254600183019263ffffffff9091168201908590815181106121ff57fe5b63ffffffff9092166020928302909101909101525b6001016121b6565b600160a060020a0381166000908152601060205260408120546111ef90611d83565b600d546000908190819081908190600160a060020a03166361592b85878360405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561172e57600080fd5b60106020526000908152604090205481565b600160a060020a03821615156122c257600080fd5b6b204fce5e3e2502611000000081106122da57600080fd5b600654600160a060020a03166323b872dd33308460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561234657600080fd5b6102c65a03f1151561235757600080fd5b50505060405180519050151561236c57600080fd5b600160a060020a0382166000818152600f6020526040908190208054840190557f7616f7b36d352f805882b5e6af4b72e6d1f325e5d73feef17ba9f064468498769083905190815260200160405180910390a2600160a060020a03821660009081526012602052604090206123e0906136d9565b1561247e57600160a060020a038083166000908152601260209081526040808320600c54612473959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b6102c65a03f1151561246457600080fd5b505050604051805190506136fa565b151561247e57600080fd5b600160a060020a038216600090815260136020526040902061249f906136d9565b1561202557600160a060020a038083166000908152601360209081526040808320600d54612512959194911692631f38c35892909190516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b151561245357600080fd5b151561202557600080fd5b600e60209081526000928352604080842090915290825290205481565b60115481565b600181565b6000600160a060020a03831660008051602061417883398151915214156125775750600160a060020a038116316111ef565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156125ce57600080fd5b6102c65a03f115156125df57600080fd5b5050506040518051905090506111ef565b600c54600090600160a060020a0316158015906126175750600d54600160a060020a031615155b156126245750600161278b565b600c54600160a060020a03161515806126475750600d54600160a060020a031615155b1561265157600080fd5b600b54600160a060020a031663fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156126aa57600080fd5b6102c65a03f115156126bb57600080fd5b5050506040518051600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055600b5416905063fccf6e673060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561273f57600080fd5b6102c65a03f1151561275057600080fd5b5050506040518051600d805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550600190505b90565b60015460085460009160050290600160a060020a0316633012541683604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156127df57600080fd5b6102c65a03f115156127f057600080fd5b5050506040518051905011905090565b600080855187511461281157600080fd5b845187511461281f57600080fd5b835187511461282d57600080fd5b825187511461283b57600080fd5b5060005b86518110156128d1576128be87828151811061285757fe5b9060200190602002015187838151811061286d57fe5b9060200190602002015187848151811061288357fe5b9060200190602002015187858151811061289957fe5b906020019060200201518786815181106128af57fe5b90602001906020020151612be8565b15156128c957600080fd5b60010161283f565b5060019695505050505050565b6128e661407b565b600d54600160a060020a0316611607816130fe565b6000611515600183612f0b565b600d54600160a060020a031681565b600180820154600091825b602081101561029a57828216151561294d578282176001860155845463ffffffff16810193506115e2565b60029190910290600101612922565b60008080806b204fce5e3e250261100000006001608060020a0388161061298257600080fd5b6b204fce5e3e250261100000006001608060020a038716106129a357600080fd5b3392506129b2838a8989613736565b15156129bd57600080fd5b6129da876001608060020a0316876001608060020a03168b6137a3565b15156129e557600080fd5b60009150886129ff57600c54600160a060020a0316612a0c565b600d54600160a060020a03165b905063ffffffff851615612abb5780600160a060020a031663a5da0bf5848a8a8a8a60006040516020015260405163ffffffff87811660e060020a028252600160a060020a0396909616600482015293851660248501526001608060020a03928316604485015291166064830152909116608482015260a401602060405180830381600087803b1515612a9e57600080fd5b6102c65a03f11515612aaf57600080fd5b50505060405180519250505b811515612b655780600160a060020a031663c92ba8b2848a8a8a60006040516020015260405163ffffffff86811660e060020a028252600160a060020a039590951660048201529290931660248301526001608060020a0390811660448301529091166064820152608401602060405180830381600087803b1515612b3f57600080fd5b6102c65a03f11515612b5057600080fd5b505050604051805190501515612b6557600080fd5b82600160a060020a03167f2fb3fe66d41cb2d1b0d335656d86e7c779ebdc34c6f6fc806d35790a30be0e6d898b8a8a8760405163ffffffff909516855292151560208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a250600198975050505050505050565b6000808080808080806b204fce5e3e250261100000006001608060020a038c1610612c1257600080fd5b6b204fce5e3e250261100000006001608060020a038b1610612c3357600080fd5b612c508b6001608060020a03168b6001608060020a03168f6137a3565b1515612c5b57600080fd5b8c612c7157600c54600160a060020a0316612c7e565b600d54600160a060020a03165b915081600160a060020a03166361592b858d600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b1515612cd157600080fd5b6102c65a03f11515612ce257600080fd5b505050604051805190602001805190602001805190602001805190602001805150939a5090985090965094505033600160a060020a0390811690881614612d2857600080fd5b612d36878e87898f8f613815565b1515612d455760009750612efb565b50600063ffffffff891615612dec5781600160a060020a031663a590529e8d8d8d8d60006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515612dc657600080fd5b6102c65a03f11515612dd757600080fd5b50505060405180519060200180519450909150505b801515612e825781600160a060020a031663cb2f7b878d8d8d60006040516020015260405163ffffffff85811660e060020a0282529390931660048401526001608060020a039182166024840152166044820152606401602060405180830381600087803b1515612e5c57600080fd5b6102c65a03f11515612e6d57600080fd5b505050604051805190501515612e8257600080fd5b86600160a060020a03167f2bf327e052ee7ab98550e3d864a5b2a61f7737dc75cbcaada4e55f88222ebbd78e8e8e8e86604051941515855263ffffffff90931660208501526001608060020a0391821660408086019190915291166060840152901515608083015260a0909101905180910390a2600197505b5050505050505095945050505050565b6000806000612f1861408d565b600033935086612f3357600c54600160a060020a0316612f40565b600d54600160a060020a03165b9250612f4c83876135ff565b9150600160a060020a0384168251600160a060020a031614612f6d57600080fd5b86612f7c578160800151612f82565b81606001515b6001608060020a03169050612f99848260006138c7565b1515612fa457600080fd5b612fd5838589612fbf57600754600160a060020a0316612fcf565b6000805160206141788339815191525b896139a2565b1515612fe057600080fd5b8160600151600160a060020a0385166000908152600e602052604081206001608060020a039290921691908961302157600754600160a060020a0316613031565b6000805160206141788339815191525b600160a060020a0390811682526020820192909252604001600020805490920190915584167f179f16fddc625e40df9cb92cfcea70d64a6262c82b7a769e52996b1ff511ff56888860608601518660800151604051931515845263ffffffff90921660208401526001608060020a03908116604080850191909152911660608301526080909101905180910390a25060019695505050505050565b6000805b6020811015611e295760008160019060020a0284600101541611156130f6576001909101905b6001016130d0565b61310661407b565b61310e61408d565b60008060008086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561315957600080fd5b6102c65a03f1151561316a57600080fd5b50505060405180519060200180519195509093505082156131ac5760006040518059106131945750595b908082528060200260200182016040525095506132b2565b600091505b846040015115156131da576131c687856135ff565b9450600190910190602085015193506131b1565b816040518059106131e85750595b9080825280602002602001820160405250955086600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561324057600080fd5b6102c65a03f1151561325157600080fd5b505050604051805190602001805115156040880152509350600090505b818110156132b2578386828151811061328357fe5b63ffffffff9092166020928302909101909101526132a187856135ff565b94508460200151935060010161326e565b5050505050919050565b60008060006132c961408d565b60008080600160a060020a038a16600080516020614178833981519152146132fc57600d54600160a060020a0316613309565b600c54600160a060020a03165b95508892506000915085600160a060020a031663a3fb59176000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561335757600080fd5b6102c65a03f1151561336857600080fd5b5050506040518051906020018051151560408701525094505b6000836001608060020a031611801561339c57508360400151155b1561346f576133ab86866135ff565b9350826001608060020a031684608001516001608060020a031611613403578360600151820191508360800151909203916133f38451868c8b88608001518960600151613a7b565b15156133fe57600080fd5b613463565b83608001516001608060020a0316836001608060020a031685606001516001608060020a03160281151561343357fe5b049182019190506134538451868c8b87868a606001518b60800151613b70565b151561345e57600080fd5b600092505b83602001519450613381565b6001608060020a03831615801561348f57506000826001608060020a0316115b151561349a57600080fd5b506001608060020a031698975050505050505050565b600080600160a060020a03831660008051602061417883398151915214156134db5760129150611e29565b50600160a060020a0382166000908152602081905260409020548015156111ef5782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561354257600080fd5b6102c65a03f1151561355357600080fd5b505050604051805190509150611e29565b60006b204fce5e3e2502611000000085111561357f57600080fd5b6b204fce5e3e2502611000000084111561359857600080fd5b8282106135d357601283830311156135af57600080fd5b84838303600a0a02670de0b6b3a764000085028115156135cb57fe5b049050611500565b601282840311156135e357600080fd5b84828403600a0a670de0b6b3a76400008602028115156135cb57fe5b61360761408d565b600083600160a060020a03166361592b8584600060405160a0015260405163ffffffff83811660e060020a02825291909116600482015260240160a060405180830381600087803b151561365a57600080fd5b6102c65a03f1151561366b57600080fd5b505050604051805190602001805190602001805190602001805190602001805163ffffffff16602088019081526001608060020a039384166080890152939092166060870152600160a060020a039093168552509091506001905163ffffffff161460408301525092915050565b805460009063ffffffff1615156136f257506001610df5565b506000919050565b815460009063ffffffff1681901115613715575060006111ef565b50815463ffffffff191663ffffffff91909116178155600060019182015590565b600080846137445782613746565b835b6004546001608060020a0391909116915081101561376357600080fd5b6137778686866001608060020a0316613dd3565b151561378257600080fd5b61378c8682613ea9565b151561379757600080fd5b50600195945050505050565b60008082156137d7576007546137d090859087906137c990600160a060020a03166134b0565b6012613564565b90506137fa565b6007546137f7908590879060129061191490600160a060020a03166134b0565b90505b69d3c21bcecceda10000008111156114fc5760009150610d69565b6000806000876138255783613827565b845b6001608060020a031691508761385157856001608060020a0316846001608060020a031603613867565b866001608060020a0316856001608060020a0316035b60045490915082101561387957600080fd5b6138988989896001608060020a0316886001608060020a031603613dd3565b15156138a357600080fd5b6138ad8982613ea9565b15156138b857600080fd5b50600198975050505050505050565b600080838311156138d757600080fd5b600160a060020a03851660009081526010602052604090205484111561391557600160a060020a038516600090815260106020526040812055613935565b600160a060020a0385166000908152601060205260409020805485900390555b8215156139455760019150610d69565b61394e83610d71565b600160a060020a0386166000908152600f60205260409020549091508190101561397757600080fd5b600160a060020a0385166000908152600f602052604090208054829003905560019150509392505050565b60008085600160a060020a031662d84fd88460006040516020015260405163ffffffff83811660e060020a028252919091166004820152602401602060405180830381600087803b15156139f557600080fd5b6102c65a03f11515613a0657600080fd5b505050604051805190501515613a1b57600080fd5b600160a060020a03841660008051602061417883398151915214613a5657600160a060020a0385166000908152601260205260409020613a6f565b600160a060020a03851660009081526013602052604090205b905061378c8184613f90565b600080600160a060020a03861660008051602061417883398151915214613aad57600d54600160a060020a0316613aba565b600c54600160a060020a03165b9050613ac88189878a6139a2565b1515613ad357600080fd5b7ffc2eaa59b7259e4eb0ce92d7a86fce8b0fb67fade6f9f69df98f4771035a50c28888600160a060020a03891660008051602061417883398151915214604051600160a060020a03909316835263ffffffff909116602083015215156040808301919091526060909101905180910390a1613b648887866001608060020a0316866001608060020a0316600061400d565b98975050505050505050565b6000808080806001608060020a03808716908a1610613b8e57600080fd5b6001608060020a0380881690891610613ba657600080fd5b95879003959488900394600160a060020a038b1660008051602061417883398151915214613bdf57600d54600160a060020a0316613bec565b600c54600160a060020a03165b9350600160a060020a038b1660008051602061417883398151915214613c125786613c14565b855b6001608060020a0316925060009150600260030154831015613c8357600160a060020a03808e166000908152600e60209081526040808320938e1683529290522080546001608060020a038916019055829150613c73848e8c8f6139a2565b1515613c7e57600080fd5b613d26565b83600160a060020a031663a590529e8d8989600260006040516040015260405163ffffffff86811660e060020a02825294851660048201526001608060020a039384166024820152919092166044820152911660648201526084016040805180830381600087803b1515613cf657600080fd5b6102c65a03f11515613d0757600080fd5b50505060405180519060200180515090915050801515613d2657600080fd5b7fd499cca7d46b5236c2cb522ceec930ccf485eefca1f0472c020a1b7328bf06438d8d600160a060020a038e166000805160206141788339815191521460008611604051600160a060020a03909416845263ffffffff9092166020840152151560408084019190915290151560608301526080909101905180910390a1613dc28d8c8b6001608060020a03168b6001608060020a03168661400d565b9d9c50505050505050505050505050565b60008083613dec57600754600160a060020a0316613dfc565b6000805160206141788339815191525b90506000831215613e3e57600160a060020a038581166000908152600e60209081526040808320938516835292905290812080549185900390910190556114fc565b600160a060020a038086166000908152600e602090815260408083209385168352929052205483901015613e7157600080fd5b600160a060020a038086166000908152600e602090815260408083209385168352929052208054849003905560019150509392505050565b6000806000831215613f1e5750600160a060020a0383166000908152601060205260408120549083900390811115613ef65750600160a060020a0383166000908152601060205260409020545b600160a060020a03841660009081526010602052604090208054829003905560019150613f89565b600160a060020a038416600090815260106020526040902054613f42908401611d83565b600160a060020a0385166000908152600f60205260409020541015613f6657600080fd5b600160a060020a0384166000908152601060205260409020805484019055600191505b5092915050565b81546000908190819063ffffffff9081169085161015613faf57600080fd5b845463ffffffff90811660200190851610613fc957600080fd5b50508254600184015463ffffffff9182169184169190910390600282900a90600090821611613ff757600080fd5b6001808601805483191690559250505092915050565b600080600160a060020a038616600080516020614178833981519152146140345783614036565b845b600160a060020a038089166000908152600e60209081526040808320938b16835292905220805487019055905061407087848301836138c7565b979650505050505050565b60206040519081016040526000815290565b60a0604051908101604090815260008083526020830181905290820181905260608201819052608082015290565b600160a060020a03811660008051602061417883398151915214156140fb57600160a060020a038116600090815260208190526040902060129055611d80565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561414157600080fd5b6102c65a03f1151561415257600080fd5b5050506040518051600160a060020a03831660009081526020819052604090205550505600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a723058207eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d0029

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

000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000E8d6b471e332F140e7d9dbB99E5E3822F728DA60000000000000000000000008007aa43792A392b221DC091bdb2191E5fF626d100000000000000000000000065bF64Ff5f51272f729BDcD7AcFB00677ced86Cd000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab6800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000019

-----Decoded View---------------
Arg [0] : knc (address): 0xdd974D5C2e2928deA5F71b9825b8b646686BD200
Arg [1] : reserveToken (address): 0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6
Arg [2] : burner (address): 0x8007aa43792A392b221DC091bdb2191E5fF626d1
Arg [3] : network (address): 0x65bF64Ff5f51272f729BDcD7AcFB00677ced86Cd
Arg [4] : medianizer (address): 0x729D19f657BD0614b4985Cf1D82531c67569197B
Arg [5] : factory (address): 0xABa982e0190e27a32400a622fe016A44c4fFab68
Arg [6] : minNewOrderUsd (uint256): 1000
Arg [7] : maxOrdersPerTrade (uint256): 5
Arg [8] : burnFeeBps (uint256): 25

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200
Arg [1] : 0000000000000000000000000E8d6b471e332F140e7d9dbB99E5E3822F728DA6
Arg [2] : 0000000000000000000000008007aa43792A392b221DC091bdb2191E5fF626d1
Arg [3] : 00000000000000000000000065bF64Ff5f51272f729BDcD7AcFB00677ced86Cd
Arg [4] : 000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b
Arg [5] : 000000000000000000000000aba982e0190e27a32400a622fe016a44c4ffab68
Arg [6] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000019


Deployed Bytecode Sourcemap

9722:37452:0:-;;;;;;;;;-1:-1:-1;;;9722:37452:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1297:36;;;;;;;;;;;;;;;;;;;;;;;;;;;21599:300;;;;;;;;;;-1:-1:-1;;;;;21599:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32449:202;;;;;;;;;;;;;;30528:529;;;;;;;;;;;;;;-1:-1:-1;;;;;30528:529:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11955:40;;;;;;;;;;-1:-1:-1;;;;;11955:40:0;;;;;12289:60;;;;;;;;;;-1:-1:-1;;;;;12289:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25368:313;;;;;;;;;;-1:-1:-1;;;;;25368:313:0;;;;;;;;;10774:38;;;;;;;;;;;;27335:301;;;;;;;;;;;;;;29499:238;;;;;;;;;;-1:-1:-1;;;;;29499:238:0;;;;;;;;;;9833:45;;;;;;;;;;;;27004:323;;;;;;;;;;;;;;22551:907;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22551:907:0;;-1:-1:-1;22551:907:0;;-1:-1:-1;;;;;;22551:907:0;25754:204;;-1:-1:-1;;;;;25754:204:0;;;;;10010:50;;;;;;;;;;;;12356:60;;;;;;;;;;-1:-1:-1;;;;;12356:60:0;;;;;24293:324;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24293:324:0;;;;;;;;;;;;;;;;27953:145;;;;;;;;;;;;;;;;32753:459;;;;;;;;;;-1:-1:-1;;;;;32753:459:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;34141:164:0;;;;;;;;;;;;29745:238;;;;;;;;;;-1:-1:-1;;;;;29745:238:0;;;;;;;;;;10125:45;;;;;;;;;;;;11746:40;;;;;;;;;;;;;;;-1:-1:-1;;;;;11746:40:0;;;;;;;;;;;;;;11537:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;11537:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31065:317;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31065:317:0;;;;;-1:-1:-1;;;;;31065:317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16793:1439;;-1:-1:-1;;;;;16793:1439:0;;;;;;;;;;;;;;;;;;;;;;;;20713:190;;;;;;;;;;-1:-1:-1;;;;;20713:190:0;;;;;;;;;;21401;;;;;;;;;;-1:-1:-1;;;;;21401:190:0;;;;;;;;;;9947:43;;;;;;;;;;;;14728:1957;;;;;;;;;;-1:-1:-1;;;;;14728:1957:0;;;;;;;;;;;;;;14443:277;;;;;;;;;;;;32123:139;;;;;;;;;;;;;;24058:227;;;;;;;;;;;;;;-1:-1:-1;;;;;24058:227:0;;;;;;;;;;32270:171;;;;;;;;;;;;;;11505:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31863:252;;;;;;;;;;-1:-1:-1;;;;;31863:252:0;;;;;29991:529;;;;;;;;;;;;;;-1:-1:-1;;;;;29991:529:0;;;;;;;;;;23725:325;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23725:325:0;;;;;;;;;;;;;;;;27644:301;;;;;;;;;;;;;;23466:251;;;;;;;;;;;;;;-1:-1:-1;;;;;23466:251:0;;;;;;;;;;20911:301;;;;;;;;;;-1:-1:-1;;;;;20911:301:0;;;;;;;;;;;;;;28258:835;;;;;;;;;;;;33314:459;;;;;;;;;;-1:-1:-1;;;;;33314:459:0;;;;;31715:140;;;;;;;;;;-1:-1:-1;;;;;31715:140:0;;;;;31390:317;;;;;;;;;;;;;;;;10316:34;;;;;;;;;;;;12033:51;;;;;;;;;;-1:-1:-1;;;;;12033:51:0;;;;;26110:886;;;;;;;;;;-1:-1:-1;;;;;26110:886:0;;;;;;;11860:62;;;;;;;;;;-1:-1:-1;;;;;11860:62:0;;;;;;;;;;12153:27;;;;;;;;;;;;10233:34;;;;;;;;;;;;7454:213;;;;;;;;;;-1:-1:-1;;;;;7454:213:0;;;;;;;;;;14027:408;;;;;;;;;;;;29310:181;;;;;;;;;;;;24625:670;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24625:670:0;;-1:-1:-1;24625:670:0;;-1:-1:-1;;;;;;24625:670:0;33875:164;;;;;;;;;;;;28106:144;;;;;;;;;;;;;;;;11793:40;;;;;;;;;;;;1297:36;1331:2;1297:36;:::o;21599:300::-;-1:-1:-1;;;;;21803:10:0;21781:33;21728:4;21781:33;;;:21;:33;;;;;21728:4;;21765:50;;:15;:50::i;:::-;21750:65;;21833:58;21842:4;21848:5;21855:9;21866;21877:13;21833:8;:58::i;:::-;21826:65;;21599:300;;;;;;;:::o;32449:202::-;32576:19;;32522:4;;32624:17;;-1:-1:-1;;;;;32576:19:0;:42;32522:4;32576:44;;;;;;;;;;-1:-1:-1;;;32576:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32558:15;;32546:9;:27;:74;:96;;;;;;;;32539:104;;32449:202;;;;:::o;30528:529::-;30668:6;30750:13;30829:11;30851:13;30875:11;30713:6;:25;;;30700:9;-1:-1:-1;;;;;30700:38:0;;;30692:47;;;;;;;;30766:14;;-1:-1:-1;;;;;30766:14:0;:30;30797:9;30808;30766:14;:52;;;;;;;-1:-1:-1;;;30766:52:0;;;;;;-1:-1:-1;;;;;30766:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30750:68;;30913:7;30903:17;;:6;:17;;;30899:125;;;30973:14;;-1:-1:-1;;;;;30973:14:0;:30;31004:7;30973:14;:39;;;;;;;;;;;-1:-1:-1;;;30973:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30937:75;;-1:-1:-1;30937:75:0;;-1:-1:-1;30937:75:0;;-1:-1:-1;30973:39:0;;-1:-1:-1;;;30899:125:0;-1:-1:-1;31043:6:0;;30528:529;-1:-1:-1;;;;;;30528:529:0:o;11955:40::-;;;;;;;;;;;;;:::o;12289:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25368:313::-;-1:-1:-1;;;;;25444:19:0;;;;25436:28;;;;;;4873:6;25483:16;;25475:25;;;;;;25521:15;;-1:-1:-1;;;;;25521:15:0;:28;25550:10;25562:4;25568:6;25521:15;:54;;;;;;;-1:-1:-1;;;25521:54:0;;;;;;-1:-1:-1;;;;;25521:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25513:63;;;;;;;;-1:-1:-1;;;;;25589:17:0;;;;;;;:10;:17;;;;;;;;25607:15;;;;;25589:34;;;;;;;;:44;;;;;;:17;25644:29;;25627:6;;25644:29;;;;;;;;;;;;;25368:313;;:::o;10774:38::-;;;;:::o;27335:301::-;27407:10;-1:-1:-1;;;;;27451:17:0;;27391:13;27451:17;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;27451:36:0;;;;;;;;27508:25;;;;27500:34;;;;;;-1:-1:-1;;;;;27547:17:0;;;;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;27547:36:0;;;;;;;;;:46;;;;;;;27606:22;;;;;27587:6;;27606:22;;;;;;;;;;;;;;;;;;;;;;;;;27335:301;;;:::o;29499:238::-;29633:25;;29593:6;;-1:-1:-1;;;;;29620:38:0;;;;29612:47;;;;;;29677:14;;-1:-1:-1;;;;;29677:14:0;:30;29708:9;29719;29677:14;:52;;;;;;;-1:-1:-1;;;29677:52:0;;;;;;-1:-1:-1;;;;;29677:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29499:238:0;;;;;:::o;9833:45::-;9877:1;9833:45;:::o;27004:323::-;27076:10;-1:-1:-1;;;;;27120:17:0;;;27060:13;27120:17;;;:10;:17;;;;;;;;27138:15;;;;;27120:34;;;;;;;27175:25;;;;27167:34;;;;;;-1:-1:-1;;;;;27214:17:0;;;;;;;:10;:17;;;;;;;;27232:15;;;;;27214:34;;;;;;;:44;;;;;;;27279:15;;;;;;:24;;27225:5;;27252:6;;27214:17;27279:39;;;;;;-1:-1:-1;;;27279:39:0;;;;;;-1:-1:-1;;;;;27279:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27271:48;;;;;;;22551:907;22728:4;22999:13;23036;23060:12;23094:6;22781:13;:20;22758:12;:19;:43;22750:52;;;;;;22844:9;:16;22821:12;:19;:39;22813:48;;;;;;22903:9;:16;22880:12;:19;:39;22872:48;;;;;;22962:16;:23;22939:12;:19;:46;22931:55;;;;;;-1:-1:-1;23015:10:0;;-1:-1:-1;23075:1:0;;-1:-1:-1;23075:1:0;23089:338;23110:12;:19;23106:1;:23;23089:338;;;23160:16;23177:1;23160:19;;;;;;;;;;;;;;;;:46;;23190:13;23204:1;23190:16;;;;;;;;;;;;;;;;23160:46;;;23182:5;23160:46;23151:55;;23229:94;23245:12;23258:1;23245:15;;;;;;;;;;;;;;;;:77;;-1:-1:-1;;;;;23294:28:0;;;;;;:21;:28;;;;;23245:77;;;-1:-1:-1;;;;;23263:28:0;;;;;;:21;:28;;;;;23245:77;23229:15;:94::i;:::-;23221:102;;23346:68;23355:12;23368:1;23355:15;;;;;;;;;;;;;;;;23372:5;23379:9;23389:1;23379:12;;;;;;;;;;;;;;;;23393:9;23403:1;23393:12;;;;;;;;;;;;;;;;23407:6;23346:8;:68::i;:::-;23338:77;;;;;;;;23131:3;;23089:338;;;-1:-1:-1;23446:4:0;;22551:907;-1:-1:-1;;;;;;;;;22551:907:0:o;25754:204::-;-1:-1:-1;;;;;25825:19:0;;;;25817:28;;;;;;-1:-1:-1;;;;;25858:17:0;;;;;;:10;:17;;;;;;;;-1:-1:-1;;;;;;;;;;;25858:36:0;;;;;;;;;:49;;25898:9;25858:49;;;;;;25918:32;;;;;;;;;;;;;;;25754:204;:::o;10010:50::-;10059:1;10010:50;:::o;12356:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;24293:324::-;24487:4;24517:69;24529:4;24535:7;24544:12;24558;24572:13;24517:11;:69::i;:::-;24509:78;;;;;;;;-1:-1:-1;24605:4:0;24293:324;;;;;;;:::o;27953:145::-;28015:4;28040:27;28052:5;28059:7;28040:11;:27::i;:::-;28032:36;;;;;;;;-1:-1:-1;28086:4:0;27953:145;;;:::o;32753:459::-;32824:18;;:::i;:::-;-1:-1:-1;;;;;32889:28:0;;32855:31;32889:28;;;:21;:28;;;;;;32855:31;32953:33;32889:28;32953:20;:33::i;:::-;32940:47;;;;;;;;;;;;;;;;;;;;;;;;32928:59;;33017:1;32998:20;;33047:1;33036:12;;33031:174;1331:2;33050:1;:14;;;33031:174;;;33134:1;33129;33118:12;;33123:1;33118:12;;;;33091:11;:23;;;:40;:44;33086:107;;;33165:24;;;33148:13;;;33165:24;;;;:28;;;33138:9;;;:24;;;;;;;:55;;;;:24;;;;;;;;;;:55;33086:107;33066:3;;33031:174;;;32753:459;;;;;;:::o;34141:164::-;34195:18;;:::i;:::-;34252:14;;-1:-1:-1;;;;;34252:14:0;34284:13;34252:14;34284:7;:13::i;:::-;34277:20;;34141:164;;:::o;29745:238::-;29879:25;;29839:6;;-1:-1:-1;;;;;29866:38:0;;;;29858:47;;;;;;29923:14;;-1:-1:-1;;;;;29923:14:0;:30;29954:9;29965;29923:14;:52;;;;;;;-1:-1:-1;;;29923:52:0;;;;;;-1:-1:-1;;;;;29923:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10125:45;10164:6;10125:45;:::o;11746:40::-;;;-1:-1:-1;;;;;11746:40:0;;:::o;11537:34::-;;;;;;;;;;;;;-1:-1:-1;;;;;11537:34:0;;;;;;;;;;;;;;;;;;;;;;:::o;31065:317::-;31335:14;;31162;;;;;;;;;;-1:-1:-1;;;;;31335:14:0;:30;31366:7;31162:14;31335:39;;;;;;;;;;;-1:-1:-1;;;31335:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31328:46;;;;-1:-1:-1;31328:46:0;;-1:-1:-1;31328:46:0;-1:-1:-1;31335:39:0;;-1:-1:-1;31065:317:0;-1:-1:-1;;;31065:317:0:o;16793:1439::-;17067:22;;17023:4;;;;17053:10;-1:-1:-1;;;;;17053:36:0;;;17067:22;;17053:36;17045:45;;;;;;-1:-1:-1;;;;;17110:29:0;;-1:-1:-1;;;;;;;;;;;17110:29:0;;17109:66;;-1:-1:-1;;;;;;17145:29:0;;-1:-1:-1;;;;;;;;;;;17145:29:0;17109:66;17101:75;;;;;;;;17208:15;;-1:-1:-1;;;;;17196:27:0;;;17208:15;;17196:27;;17195:62;;-1:-1:-1;17241:15:0;;-1:-1:-1;;;;;17229:27:0;;;17241:15;;17229:27;17195:62;17187:71;;;;;;;;4873:6;17277:20;;;17269:29;;;;;;-1:-1:-1;;;;;17361:29:0;;-1:-1:-1;;;;;;;;;;;17361:29:0;17357:223;;;17415:9;:22;;17407:31;;;;;;17357:223;;;17479:9;:14;17471:23;;;;;;17517:8;-1:-1:-1;;;;;17517:21:0;;17539:10;17551:4;17557:9;17517:50;;;;;;;;-1:-1:-1;;;17517:50:0;;;;;;-1:-1:-1;;;;;17517:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:59;;;;;;;;17614:104;17640:8;17667:9;17695:8;17614:7;:104::i;:::-;17592:126;;17757:101;17773:9;17784:14;17800:21;17812:8;17800:11;:21::i;:::-;17836;17848:8;17836:11;:21::i;:::-;17757:15;:101::i;:::-;17739:119;;;17731:128;;;;;;-1:-1:-1;;;;;17942:29:0;;-1:-1:-1;;;;;;;;;;;17942:29:0;17938:184;;;-1:-1:-1;;;;;17988:19:0;;:35;;;;18008:14;17988:35;;;;;;;;;;;;;;;;;;;;;;;;;;17938:184;;;18064:8;-1:-1:-1;;;;;18064:17:0;;18082:10;18094:14;18064:45;;;;;;;;-1:-1:-1;;;18064:45:0;;;;;;-1:-1:-1;;;;;18064:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18056:54;;;;;;;;18134:68;18156:8;18166;18176:9;18187:14;18134:68;;-1:-1:-1;;;;;18134:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18220:4:0;;16793:1439;-1:-1:-1;;;;;;;16793:1439:0:o;20713:190::-;20815:4;20844:51;20871:9;20882;20893:1;20844:26;:51::i;:::-;20837:58;20713:190;-1:-1:-1;;;20713:190:0:o;21401:::-;21503:4;21532:51;21559:9;21570;21581:1;21532:26;:51::i;9947:43::-;9987:3;9947:43;:::o;14728:1957::-;14828:4;15290:23;15389:14;15414:26;;:::i;:::-;15453:27;;;-1:-1:-1;;;;;14854:24:0;;-1:-1:-1;;;;;;;;;;;14854:24:0;;14853:56;;-1:-1:-1;;;;;;14884:24:0;;-1:-1:-1;;;;;;;;;;;14884:24:0;14853:56;14845:65;;;;;;;;14937:15;;-1:-1:-1;;;;;14930:22:0;;;14937:15;;14930:22;;14929:52;;-1:-1:-1;14965:15:0;;-1:-1:-1;;;;;14958:22:0;;;14965:15;;14958:22;14929:52;14921:61;;;;;;;;4873:6;15001:17;;;14993:26;;;;;;15036:20;:18;:20::i;:::-;:37;;;-1:-1:-1;15061:11:0;;15036:37;15032:51;;;15082:1;15075:8;;;;15032:51;-1:-1:-1;;;;;15317:24:0;;-1:-1:-1;;;;;;;;;;;15317:24:0;15316:60;;15362:14;;-1:-1:-1;;;;;15362:14:0;15316:60;;;15345:14;;-1:-1:-1;;;;;15345:14:0;15316:60;15567:24;;15290:86;;-1:-1:-1;15491:6:0;;-1:-1:-1;15538:1:0;;-1:-1:-1;15567:24:0;-1:-1:-1;;;;;;15658:18:0;;;15538:1;15658:20;;;;;;;;;;-1:-1:-1;;;15658:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15623:55;;15633:21;;;15623:55;-1:-1:-1;15623:55:0;-1:-1:-1;15604:891:0;15717:1;15695:19;-1:-1:-1;;;;;15695:23:0;;15694:53;;;;;15725:9;:21;;;15724:22;15694:53;:74;;;;-1:-1:-1;;;15752:11:0;;;15766:1;15752:15;;15694:74;15604:891;;;15849:27;15862:4;15868:7;15849:12;:27::i;:::-;15837:39;;16110:19;-1:-1:-1;;;;;16087:42:0;:9;:19;;;-1:-1:-1;;;;;16087:42:0;;16083:401;;16172:9;:19;;;16150:41;;;;16233:9;:19;;;16210:42;;;;16083:401;;;16405:9;:19;;;-1:-1:-1;;;;;16400:25:0;16356:19;-1:-1:-1;;;;;16351:25:0;16328:9;:19;;;-1:-1:-1;;;;;16323:25:0;:53;:102;;;;;;;;16293:133;;;;16467:1;16445:23;;16083:401;15794:9;:16;;;15784:26;;15604:891;;;-1:-1:-1;;;;;16511:24:0;;;16507:38;;16544:1;16537:8;;;;16507:38;16598:79;16614:6;16622:18;-1:-1:-1;;;;;16598:79:0;16642:16;16654:3;16642:11;:16::i;:::-;16660;16672:3;16660:11;:16::i;16598:79::-;16591:86;;14728:1957;;;;;;;;;;;;;:::o;14443:277::-;14523:19;;14493:27;;-1:-1:-1;;;;;14523:19:0;:42;14493:27;14523:44;;;;;;;;;;-1:-1:-1;;;14523:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14493:74;;14607:26;;14582:22;:51;14578:135;;;14650:26;:51;;;14578:135;14443:277;:::o;32123:139::-;32181:4;9877:1;32205:25;32220:9;32205:14;:25::i;:::-;:48;;32123:139;-1:-1:-1;;32123:139:0:o;24058:227::-;24182:4;24211:66;24238:7;24247:12;24261;24275:1;24211:26;:66::i;32270:171::-;32384:26;;32366:15;;32330:4;;32414:17;;32354:27;;:56;:78;;11505:25;;;;;;;;;;:::o;31863:252::-;31925:4;31942:21;31966:28;31988:5;31966:21;:28::i;:::-;-1:-1:-1;;;;;32028:15:0;;;;;;:8;:15;;;;;;31942:52;;-1:-1:-1;32009:34:0;;32005:48;;;32052:1;32045:8;;;;32005:48;-1:-1:-1;;;;;32072:15:0;;;;;;:8;:15;;;;;;:34;;;;-1:-1:-1;31863:252:0;;;;;:::o;29991:529::-;30131:6;30213:13;30292:11;30314:13;30338:11;30176:6;:25;;;30163:9;-1:-1:-1;;;;;30163:38:0;;;30155:47;;;;;;;;30229:14;;-1:-1:-1;;;;;30229:14:0;:30;30260:9;30271;30229:14;:52;;;;;;;-1:-1:-1;;;30229:52:0;;;;;;-1:-1:-1;;;;;30229:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30213:68;;30376:7;30366:17;;:6;:17;;;30362:125;;;30436:14;;-1:-1:-1;;;;;30436:14:0;:30;30467:7;30436:14;:39;;;;;;;;;;;-1:-1:-1;;;30436:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23725:325;23919:4;23949:70;23961:5;23968:7;23977:12;23991;24005:13;23949:11;:70::i;27644:301::-;27717:10;-1:-1:-1;;;;;27756:15:0;;27701:13;27756:15;;;:8;:15;;;;;;:25;;;;27748:34;;;;;;27828:6;27801:23;27818:5;27801:16;:23::i;:::-;:33;;27793:42;;;;;;-1:-1:-1;;;;;27848:15:0;;;;;;;:8;:15;;;;;;:25;;;;;;;27894:9;:18;;;;;:27;;27857:5;;27867:6;;27848:15;27894:42;;;;;;-1:-1:-1;;;27894:42:0;;;;;;-1:-1:-1;;;;;27894:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27886:51;;;;;;;;27644:301;;:::o;23466:251::-;23590:4;23620:66;23647:7;23656:12;23670;23684:1;23620:26;:66::i;:::-;23612:75;;;;;;;;-1:-1:-1;23705:4:0;23466:251;;;;;:::o;20911:301::-;-1:-1:-1;;;;;21115:10:0;21093:33;21040:4;21093:33;;;:21;:33;;;;;21040:4;;21077:50;;:15;:50::i;:::-;21062:65;;21145:59;21154:5;21161;21168:9;21179;21190:13;21145:8;:59::i;28258:835::-;28440:20;;28303:4;;;;;;;;;;-1:-1:-1;;;;;28440:20:0;:25;28303:4;28440:27;;;;;;;;;;-1:-1:-1;;;28440:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28414:53;;-1:-1:-1;28440:27:0;;-1:-1:-1;;28478:14:0;;;;;;;;;28661:7;28642:14;28637:32;;-1:-1:-1;28688:14:0;;;28680:23;;;;;;10164:6;28722:27;;28714:36;;;;;;28841:6;:25;28898:14;;28841:49;;:72;;;;;;;;28926:25;:46;;;:6;29008:53;;28983:22;:78;-1:-1:-1;29081:4:0;;28258:835;-1:-1:-1;;;;28258:835:0:o;33314:459::-;33385:18;;:::i;:::-;-1:-1:-1;;;;;33450:28:0;;33416:31;33450:28;;;:21;:28;;;;;;33416:31;33514:33;33450:28;33514:20;:33::i;:::-;33501:47;;;;;;;;;;;;;;;;;;;;;;;;33489:59;;33578:1;33559:20;;33608:1;33597:12;;33592:174;1331:2;33611:1;:14;;;33592:174;;;33695:1;33690;33679:12;;33684:1;33679:12;;;;33652:11;:23;;;:40;:44;33647:107;;;33726:24;;;33709:13;;;33726:24;;;;:28;;;33699:9;;;:24;;;;;;;:55;;;;:24;;;;;;;;;;:55;33647:107;33627:3;;33592:174;;31715:140;-1:-1:-1;;;;;31819:26:0;;31782:4;31819:26;;;:19;:26;;;;;;31806:40;;:12;:40::i;31390:317::-;31660:14;;31487;;;;;;;;;;-1:-1:-1;;;;;31660:14:0;:30;31691:7;31487:14;31660:39;;;;;;;;;;;-1:-1:-1;;;31660:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12033:51;;;;;;;;;;;;;:::o;26110:886::-;-1:-1:-1;;;;;26190:19:0;;;;26182:28;;;;;;4873:6;26229:16;;26221:25;;;;;;26267:9;:18;-1:-1:-1;;;;;26267:18:0;:31;26299:10;26311:4;26317:6;26267:18;:57;;;;;;;-1:-1:-1;;;26267:57:0;;;;;;-1:-1:-1;;;;;26267:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26259:66;;;;;;;;-1:-1:-1;;;;;26338:15:0;;;;;;:8;:15;;;;;;;:25;;;;;;26376:30;;26357:6;;26376:30;;;;;;;;;;;;;-1:-1:-1;;;;;26447:28:0;;;;;;:21;:28;;;;;26423:53;;:23;:53::i;:::-;26419:279;;;-1:-1:-1;;;;;26536:28:0;;;;;;;:21;:28;;;;;;;;26601:14;;26501:184;;26536:28;;26601:14;;;:26;;26536:28;;;26601:46;;;;;;;;;;-1:-1:-1;;;26601:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26501:16;:184::i;:::-;26493:193;;;;;;;;-1:-1:-1;;;;;26738:28:0;;;;;;:21;:28;;;;;26714:53;;:23;:53::i;:::-;26710:279;;;-1:-1:-1;;;;;26827:28:0;;;;;;;:21;:28;;;;;;;;26892:14;;26792:184;;26827:28;;26892:14;;;:26;;26827:28;;;26892:46;;;;;;;;;;-1:-1:-1;;;26892:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26792:184;26784:193;;;;;;;11860:62;;;;;;;;;;;;;;;;;;;;;;;;:::o;12153:27::-;;;;:::o;10233:34::-;10266:1;10233:34;:::o;7454:213::-;7521:4;-1:-1:-1;;;;;7542:26:0;;-1:-1:-1;;;;;;;;;;;7542:26:0;7538:121;;;-1:-1:-1;;;;;;7590:12:0;;;7583:19;;7538:121;7638:5;-1:-1:-1;;;;;7638:15:0;;7654:4;7638:21;;;;;;;;-1:-1:-1;;;7638:21:0;;;;;;-1:-1:-1;;;;;7638:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7631:28;;;;14027:408;14080:14;;14058:4;;-1:-1:-1;;;;;14080:14:0;:28;;;;14079:64;;-1:-1:-1;14114:14:0;;-1:-1:-1;;;;;14114:14:0;:28;;14079:64;14075:81;;;-1:-1:-1;14152:4:0;14145:11;;14075:81;14172:14;;-1:-1:-1;;;;;14172:14:0;:28;;;14171:64;;-1:-1:-1;14206:14:0;;-1:-1:-1;;;;;14206:14:0;:28;;14171:64;14167:78;;;14237:8;;;14167:78;14275:26;;-1:-1:-1;;;;;14275:26:0;:44;14320:4;14275:26;:50;;;;;;;-1:-1:-1;;;14275:50:0;;;;;;-1:-1:-1;;;;;14275:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14258:14;:67;;-1:-1:-1;;14258:67:0;-1:-1:-1;;;;;14258:67:0;;;;;;14353:26;;;;-1:-1:-1;14353:44:0;14398:4;-1:-1:-1;14353:50:0;;;;;;;-1:-1:-1;;;14353:50:0;;;;;;-1:-1:-1;;;;;14353:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14336:14;:67;;-1:-1:-1;;14336:67:0;-1:-1:-1;;;;;14336:67:0;;;;;;;;;;-1:-1:-1;;;;14027:408:0;;:::o;29310:181::-;29433:26;;29386:19;;29361:4;;9877:1;29433:49;;-1:-1:-1;;;;;29386:19:0;:42;29361:4;29386:44;;;;;;;;;;-1:-1:-1;;;29386:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:96;29378:105;;29310:181;:::o;24625:670::-;24804:4;25077:6;24857:7;:14;24834:12;:19;:37;24826:46;;;;;;24914:12;:19;24891:12;:19;:42;24883:51;;;;;;24976:12;:19;24953:12;:19;:42;24945:51;;;;;;25038:13;:20;25015:12;:19;:43;25007:52;;;;;;-1:-1:-1;25086:1:0;25072:192;25093:12;:19;25089:1;:23;25072:192;;;25142:109;25154:12;25167:1;25154:15;;;;;;;;;;;;;;;;25171:7;25179:1;25171:10;;;;;;;;;;;;;;;;25183:12;25196:1;25183:15;;;;;;;;;;;;;;;;25200:12;25213:1;25200:15;;;;;;;;;;;;;;;;25234:13;25248:1;25234:16;;;;;;;;;;;;;;;;25142:11;:109::i;:::-;25134:118;;;;;;;;25114:3;;25072:192;;;-1:-1:-1;25283:4:0;;24625:670;-1:-1:-1;;;;;;24625:670:0:o;33875:164::-;33929:18;;:::i;:::-;33986:14;;-1:-1:-1;;;;;33986:14:0;34018:13;33986:14;34018:7;:13::i;28106:144::-;28168:4;28193:26;28205:4;28211:7;28193:11;:26::i;11793:40::-;;;-1:-1:-1;;;;;11793:40:0;;:::o;1342:515::-;1477:22;;;;;1434:6;;;1542:287;1331:2;1559:1;:14;1542:287;;;1602:24;;;1601:31;1597:189;;;1678:24;;;1653:22;;;:49;1740:23;;;;1735:33;;;-1:-1:-1;1721:49:0;;1597:189;1816:1;1802:15;;;;;1575:3;;1542:287;;34518:931;34664:4;;;;4873:6;-1:-1:-1;;;;;34694:19:0;;;34686:28;;;;;;4873:6;-1:-1:-1;;;;;34733:19:0;;;34725:28;;;;;;34780:10;34764:26;;34811:62;34831:5;34838:12;34852:9;34863;34811:19;:62::i;:::-;34803:71;;;;;;;;34893:53;34911:9;-1:-1:-1;;;;;34893:53:0;34922:9;-1:-1:-1;;;;;34893:53:0;34933:12;34893:17;:53::i;:::-;34885:62;;;;;;;;34981:5;34960:26;;35023:12;:46;;35055:14;;-1:-1:-1;;;;;35055:14:0;35023:46;;;35038:14;;-1:-1:-1;;;;;35038:14:0;35023:46;34997:72;-1:-1:-1;35086:18:0;;;;35082:133;;35137:4;-1:-1:-1;;;;;35137:15:0;;35153:5;35160;35167:9;35178;35189:13;35137:66;;;;;;;;;;;;-1:-1:-1;;;35137:66:0;;;-1:-1:-1;;;;;35137:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35137:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35082:133:0;35232:13;35231:14;35227:100;;;35270:4;-1:-1:-1;;;;;35270:8:0;;35279:5;35286;35293:9;35304;35270:44;;;;;;;;;;;;-1:-1:-1;;;35270:44:0;;;-1:-1:-1;;;;;35270:44:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35270:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35262:53;;;;;;;;35353:5;-1:-1:-1;;;;;35339:78:0;;35360:5;35367:12;35381:9;35392;35403:13;35339:78;;;;;;;;;;;;;;;-1:-1:-1;;;;;35339:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35437:4:0;;34518:931;-1:-1:-1;;;;;;;;34518:931:0:o;35661:1315::-;35827:4;;;;;;;;4873:6;-1:-1:-1;;;;;35857:22:0;;;35849:31;;;;;;4873:6;-1:-1:-1;;;;;35899:22:0;;;35891:31;;;;;;36076:59;36094:12;-1:-1:-1;;;;;36076:59:0;36108:12;-1:-1:-1;;;;;36076:59:0;36122:12;36076:17;:59::i;:::-;36068:68;;;;;;;;36175:12;:46;;36207:14;;-1:-1:-1;;;;;36207:14:0;36175:46;;;36190:14;;-1:-1:-1;;;;;36190:14:0;36175:46;36149:72;;36288:4;-1:-1:-1;;;;;36288:20:0;;36309:7;36288:29;;;;;;;;;;;;-1:-1:-1;;;36288:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;;-1:-1:-1;36234:83:0;-1:-1:-1;;36345:10:0;-1:-1:-1;;;;;36336:19:0;;;;;;;36328:28;;;;;;36374:101;36397:5;36404:12;36418:13;36433;36448:12;36462;36374:22;:101::i;:::-;36373:102;36369:147;;;36499:5;36492:12;;;;36369:147;-1:-1:-1;36551:5:0;36573:18;;;;36569:158;;36636:4;-1:-1:-1;;;;;36636:27:0;;36664:7;36673:12;36687;36701:13;36636:79;;;;;;;;;;;;-1:-1:-1;;;36636:79:0;;;;;;;;;;-1:-1:-1;;;;;36636:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36608:107:0;;-1:-1:-1;;36569:158:0;36744:15;36743:16;36739:106;;;36784:4;-1:-1:-1;;;;;36784:11:0;;36796:7;36805:12;36819;36784:48;;;;;;;;;;;;-1:-1:-1;;;36784:48:0;;;;;;;;;;;-1:-1:-1;;;;;36784:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36776:57;;;;;;;;36870:5;-1:-1:-1;;;;;36857:87:0;;36877:12;36891:7;36900:12;36914;36928:15;36857:87;;;;;;;;;;;;;;;-1:-1:-1;;;;;36857:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36964:4;36957:11;;35661:1315;;;;;;;;;;;;;;;:::o;37105:844::-;37178:4;37197:13;37234:23;37317:26;;:::i;:::-;37432:14;37213:10;37197:26;;37260:12;:46;;37292:14;;-1:-1:-1;;;;;37292:14:0;37260:46;;;37275:14;;-1:-1:-1;;;;;37275:14:0;37260:46;37234:72;;37346:27;37359:4;37365:7;37346:12;:27::i;:::-;37317:56;-1:-1:-1;;;;;;37394:24:0;;37317:56;37394:15;-1:-1:-1;;;;;37394:24:0;;37386:33;;;;;;37449:12;:56;;37486:9;:19;;;37449:56;;;37464:9;:19;;;37449:56;-1:-1:-1;;;;;37432:73:0;;;37524:39;37543:5;37550:9;37561:1;37524:18;:39::i;:::-;37516:48;;;;;;;;37585:85;37597:4;37603:5;37610:12;:50;;37645:15;;-1:-1:-1;;;;;37645:15:0;37610:50;;;-1:-1:-1;;;;;;;;;;;37610:50:0;37662:7;37585:11;:85::i;:::-;37577:94;;;;;;;;37800:9;:19;;;-1:-1:-1;;;;;37727:17:0;;;;;;:10;:17;;;;;-1:-1:-1;;;;;37727:92:0;;;;;:17;37745:12;:50;;37780:15;;-1:-1:-1;;;;;37780:15:0;37745:50;;;-1:-1:-1;;;;;;;;;;;37745:50:0;-1:-1:-1;;;;;37727:69:0;;;;;;;;;;;;;;-1:-1:-1;37727:69:0;:92;;;;;;;;37832:85;;;37853:12;37867:7;37876:19;;;;37897:9;:19;;;37832:85;;;;;;;;;;;;;;;-1:-1:-1;;;;;37832:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37937:4:0;;37105:844;-1:-1:-1;;;;;;37105:844:0:o;2986:260::-;3072:20;;3105:134;1331:2;3122:1;:14;3105:134;;;3207:1;3201;3195;3190:12;;;;3163:11;:23;;;:40;3162:46;3158:69;;;3210:17;;;;;3158:69;3138:3;;3105:134;;45430:788;45494:25;;:::i;:::-;45532:26;;:::i;:::-;45569:14;45594:12;45720:14;46035:6;45640:4;-1:-1:-1;;;;;45640:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;45640:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45619:41;;-1:-1:-1;45640:20:0;;-1:-1:-1;;45671:36:0;;;;45704:1;45691:15;;;;;;;;;;;;;;;;;;;;;;;;45684:23;;;;45671:36;45737:1;45720:18;;45751:151;45759:9;:21;;;45758:22;45751:151;;;45837:27;45850:4;45856:7;45837:12;:27::i;:::-;45825:39;-1:-1:-1;45879:11:0;;;;;45792:16;;;;45782:26;;45751:151;;;45939:9;45926:23;;;;;;;;;;;;;;;;;;;;;;;;45914:35;;45997:4;-1:-1:-1;;;;;45997:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;45997:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45962:55;;45972:21;;;45962:55;-1:-1:-1;45962:55:0;-1:-1:-1;46044:1:0;;-1:-1:-1;46030:181:0;46051:9;46047:1;:13;46030:181;;;46097:7;46082:9;46092:1;46082:12;;;;;;;;:22;;;;:12;;;;;;;;;;:22;46131:27;46144:4;46150:7;46131:12;:27::i;:::-;46119:39;;46183:9;:16;;;46173:26;-1:-1:-1;46062:3:0;;46030:181;;;45430:788;;;;;;;;:::o;18240:2263::-;18374:4;18396:23;18500:14;18525:26;;:::i;:::-;18562:27;;;-1:-1:-1;;;;;18423:29:0;;-1:-1:-1;;;;;;;;;;;18423:29:0;18422:65;;18473:14;;-1:-1:-1;;;;;18473:14:0;18422:65;;;18456:14;;-1:-1:-1;;;;;18456:14:0;18422:65;18396:91;;18600:9;18562:48;;18650:1;18621:30;;18718:4;-1:-1:-1;;;;;18718:18:0;;:20;;;;;;;;;;;-1:-1:-1;;;18718:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18683:55;;18693:21;;;18683:55;-1:-1:-1;18683:55:0;-1:-1:-1;18664:1722:0;18777:1;18755:19;-1:-1:-1;;;;;18755:23:0;;18754:53;;;;;18785:9;:21;;;18784:22;18754:53;18664:1722;;;19072:27;19085:4;19091:7;19072:12;:27::i;:::-;19060:39;;19141:19;-1:-1:-1;;;;;19118:42:0;:9;:19;;;-1:-1:-1;;;;;19118:42:0;;19114:1261;;19203:9;:19;;;19181:41;;;;19264:9;:19;;;19241:42;;;;19310:312;19354:9;:15;19401:7;19440:8;19480;19526:9;:19;;;19583:9;:19;;;19310:13;:312::i;:::-;19302:321;;;;;;;;19114:1261;;;19778:9;:19;;;-1:-1:-1;;;;;19773:25:0;19729:19;-1:-1:-1;;;;;19724:25:0;19701:9;:19;;;-1:-1:-1;;;;;19696:25:0;:53;:102;;;;;;;;19818:35;;;;19696:102;-1:-1:-1;19880:436:0;19927:9;:15;19974:7;20013:8;20053;20106:19;20167:13;20219:9;:19;;;20277:9;:19;;;19880:16;:436::i;:::-;19872:445;;;;;;;;20358:1;20336:23;;19114:1261;18833:9;:16;;;18823:26;;18664:1722;;;-1:-1:-1;;;;;20406:24:0;;;:50;;;;;20455:1;20434:18;-1:-1:-1;;;;;20434:22:0;;20406:50;20398:59;;;;;;;;-1:-1:-1;;;;;;20470:25:0;;18240:2263;-1:-1:-1;;;;;;;;18240:2263:0:o;5317:479::-;5373:4;;-1:-1:-1;;;;;5394:26:0;;-1:-1:-1;;;;;;;;;;;5394:26:0;5390:51;;;5077:2;5422:19;;;;5390:51;-1:-1:-1;;;;;;5496:15:0;;:8;:15;;;;;;;;;;;5712:18;;5709:46;;;5739:5;-1:-1:-1;;;;;5739:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;5739:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5732:23;;;;8271:627;8396:4;4873:6;8426:20;;;8418:29;;;;;;4873:6;8466:21;;;8458:30;;;;;;8505:26;;;8501:390;;5029:2;8557:25;;;8556:43;;8548:52;;;;;;8687:9;8671:11;8657;:25;8650:2;:33;8649:47;4822:6;8623:10;:22;:74;;;;;;;;8615:83;;;;8501:390;5029:2;8740:25;;;8739:43;;8731:52;;;;;;8869:9;8853:11;8839;:25;8832:2;:33;4822:6;8806:10;:22;:60;:72;;;;;;46226:296;46312:14;;:::i;:::-;46339:13;46431:4;-1:-1:-1;;;;;46431:20:0;;46452:7;46431:29;;;;;;;;;;;;-1:-1:-1;;;46431:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46363:97;;46416:11;;;46363:97;;;-1:-1:-1;;;;;46363:97:0;;;46392:14;;;46363:97;;;;;46376:14;;;46363:97;-1:-1:-1;;;;;46363:97:0;;;;;-1:-1:-1;46363:97:0;;-1:-1:-1;10266:1:0;;46491:11;:22;;;46471:16;;;:43;-1:-1:-1;46471:4:0;46226:296;-1:-1:-1;;46226:296:0:o;2795:183::-;2906:23;;2883:4;;2906:23;;:28;2902:45;;;-1:-1:-1;2943:4:0;2936:11;;2902:45;-1:-1:-1;2965:5:0;2795:183;;;:::o;2423:364::-;2593:24;;2567:4;;2593:24;;:28;;;2589:73;;;-1:-1:-1;2645:5:0;2638:12;;2589:73;-1:-1:-1;2674:43:0;;-1:-1:-1;;2674:43:0;;;;;;;;;-1:-1:-1;;2728:23:0;;;:27;-1:-1:-1;2423:364:0:o;40509:423::-;40636:4;40658:14;40675:12;:36;;40702:9;40675:36;;;40690:9;40675:36;40745:25;;-1:-1:-1;;;;;40658:53:0;;;;;-1:-1:-1;40732:38:0;;;40724:47;;;;;;40790:51;40805:5;40812:12;40830:9;-1:-1:-1;;;;;40826:14:0;40790;:51::i;:::-;40782:60;;;;;;;;40861:38;40877:5;40888:9;40861:15;:38::i;:::-;40853:47;;;;;;;;-1:-1:-1;40920:4:0;;40509:423;-1:-1:-1;;;;;40509:423:0:o;46530:641::-;46640:4;46662:9;46846:12;46842:254;;;46932:15;;46882:81;;46898:9;;46909;;46920:28;;-1:-1:-1;;;;;46932:15:0;46920:11;:28::i;:::-;5077:2;46882:15;:81::i;:::-;46875:88;;46842:254;;;47067:15;;47003:81;;47019:9;;47030;;5077:2;;47055:28;;-1:-1:-1;;;;;47067:15:0;47055:11;:28::i;47003:81::-;46996:88;;46842:254;4938:17;47112:15;;47108:33;;;47136:5;47129:12;;;;41029:659;41229:4;41251:14;41321:11;41268:12;:42;;41298:12;41268:42;;;41283:12;41268:42;-1:-1:-1;;;;;41251:59:0;;;41335:12;:111;;41431:13;-1:-1:-1;;;;;41427:18:0;41411:12;-1:-1:-1;;;;;41407:17:0;:38;41335:111;;;41375:13;-1:-1:-1;;;;;41371:18:0;41355:12;-1:-1:-1;;;;;41351:17:0;:38;41335:111;41480:25;;41321:125;;-1:-1:-1;41467:38:0;;;41459:47;;;;;;41527:75;41542:5;41549:12;41587:13;-1:-1:-1;;;;;41583:18:0;41567:12;-1:-1:-1;;;;;41563:17:0;:38;41527:14;:75::i;:::-;41519:84;;;;;;;;41624:31;41640:5;41647:7;41624:15;:31::i;:::-;41616:40;;;;;;;;-1:-1:-1;41676:4:0;;41029:659;-1:-1:-1;;;;;;;;41029:659:0:o;39825:587::-;39923:4;;39950:28;;;;39942:37;;;;;;-1:-1:-1;;;;;40013:26:0;;;;;;:19;:26;;;;;;39996:43;;39992:183;;;-1:-1:-1;;;;;40056:26:0;;40085:1;40056:26;;;:19;:26;;;;;:30;39992:183;;;-1:-1:-1;;;;;40119:26:0;;;;;;:19;:26;;;;;:44;;;;;;;39992:183;40191:15;;40187:32;;;40215:4;40208:11;;;;40187:32;40250:39;40278:10;40250:27;:39::i;:::-;-1:-1:-1;;;;;40310:15:0;;;;;;:8;:15;;;;;;40232:57;;-1:-1:-1;40310:29:0;;;;40302:38;;;;;;-1:-1:-1;;;;;40351:15:0;;;;;;:8;:15;;;;;:29;;;;;;;-1:-1:-1;;;39825:587:0;;;;;;:::o;44980:442::-;45142:4;45204:26;45172:4;-1:-1:-1;;;;;45172:11:0;;45184:7;45172:20;;;;;;;;;;;;-1:-1:-1;;;45172:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45164:29;;;;;;;;-1:-1:-1;;;;;45234:29:0;;-1:-1:-1;;;;;;;;;;;45234:29:0;45233:106;;-1:-1:-1;;;;;45311:28:0;;;;;;:21;:28;;;;;45233:106;;;-1:-1:-1;;;;;45280:28:0;;;;;;:21;:28;;;;;45233:106;45204:135;;45358:31;45373:6;45381:7;45358:14;:31::i;41775:597::-;42002:4;;-1:-1:-1;;;;;42051:28:0;;-1:-1:-1;;;;;;;;;;;42051:28:0;42050:64;;42100:14;;-1:-1:-1;;;;;42100:14:0;42050:64;;;42083:14;;-1:-1:-1;;;;;42083:14:0;42050:64;42024:90;;42170:42;42182:4;42188:5;42195:7;42204;42170:11;:42::i;:::-;42162:51;;;;;;;;42226:60;42241:5;42248:7;-1:-1:-1;;;;;42257:28:0;;-1:-1:-1;;;;;;;;;;;42257:28:0;42226:60;;-1:-1:-1;;;;;42226:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42306:58;42316:5;42323:7;42332:13;-1:-1:-1;;;;;42306:58:0;42347:13;-1:-1:-1;;;;;42306:58:0;42362:1;42306:9;:58::i;:::-;42299:65;41775:597;-1:-1:-1;;;;;;;;41775:597:0:o;42478:1817::-;42784:4;;;;;-1:-1:-1;;;;;42814:37:0;;;;;;;42806:46;;;;;;-1:-1:-1;;;;;42871:34:0;;;;;;;42863:43;;;;;;42985:35;;;;;43031:38;;;;;-1:-1:-1;;;;;43109:28:0;;-1:-1:-1;;;;;;;;;;;43109:28:0;43108:64;;43158:14;;-1:-1:-1;;;;;43158:14:0;43108:64;;;43141:14;;-1:-1:-1;;;;;43141:14:0;43108:64;43082:90;-1:-1:-1;;;;;;43220:28:0;;-1:-1:-1;;;;;;;;;;;43220:28:0;43219:64;;43269:14;43219:64;;;43252:14;43219:64;-1:-1:-1;;;;;43183:100:0;;;43323:1;43294:30;;43372:6;:22;;;43341:28;:53;43337:686;;;-1:-1:-1;;;;;43512:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;:44;;-1:-1:-1;;;;;43512:44:0;;;;;43595:28;;-1:-1:-1;43708:42:0;43720:4;43523:5;43530:7;43742;43708:11;:42::i;:::-;43700:51;;;;;;;;43337:686;;;43901:4;-1:-1:-1;;;;;43901:27:0;;43929:7;43938:14;43954;10349:1;43901:77;;;;;;;;;;;;-1:-1:-1;;;43901:77:0;;;;;;;;;;-1:-1:-1;;;;;43901:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43886:92:0;;-1:-1:-1;;43993:18:0;;;;;;;;;44035:90;44053:5;44060:7;-1:-1:-1;;;;;44069:28:0;;-1:-1:-1;;;;;;;;;;;44069:28:0;44123:1;44099:25;;44035:90;;-1:-1:-1;;;;;44035:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44197:89;44207:5;44214:7;44223:20;-1:-1:-1;;;;;44197:89:0;44245:17;-1:-1:-1;;;;;44197:89:0;44264:21;44197:9;:89::i;:::-;44190:97;42478:1817;-1:-1:-1;;;;;;;;;;;;;42478:1817:0:o;38187:501::-;38295:4;38317:20;38340:12;:50;;38375:15;;-1:-1:-1;;;;;38375:15:0;38340:50;;;-1:-1:-1;;;;;;;;;;;38340:50:0;38317:73;;38419:1;38407:9;:13;38403:254;;;-1:-1:-1;;;;;38437:17:0;;;38477:10;38437:17;;;:10;:17;;;;;;;;:31;;;;;;;;;;;:51;;38477:10;;;;38437:51;;;;;38403:254;;;-1:-1:-1;;;;;38529:17:0;;;;;;;:10;:17;;;;;;;;:31;;;;;;;;;;:50;;;;38521:59;;;;;;-1:-1:-1;;;;;38595:17:0;;;;;;;:10;:17;;;;;;;;:31;;;;;;;;;:50;;;;;;;38676:4;38669:11;;38187:501;;;;;;:::o;38828:567::-;38900:4;38953:22;38935:1;38923:9;:13;38919:288;;;-1:-1:-1;;;;;;39033:26:0;;38983:10;39033:26;;;:19;:26;;;;;;38983:10;;;;;39013:46;;39009:98;;;-1:-1:-1;;;;;;39081:26:0;;;;;;:19;:26;;;;;;39009:98;-1:-1:-1;;;;;39122:26:0;;;;;;:19;:26;;;;;:47;;;;;;;-1:-1:-1;;;39184:11:0;;38919:288;-1:-1:-1;;;;;39259:26:0;;;;;;:19;:26;;;;;;39246:58;;39259:44;;39246:12;:58::i;:::-;-1:-1:-1;;;;;39227:15:0;;;;;;:8;:15;;;;;;:77;;39219:86;;;;;;-1:-1:-1;;;;;39318:26:0;;;;;;:19;:26;;;;;:45;;;;;;-1:-1:-1;;;38828:567:0;;;;;;:::o;1906:509::-;2054:23;;2013:4;;;;;;2054:23;;;;2043:34;;;;;2035:43;;;;;;2108:23;;;;;;1331:2;2108:36;2097:48;;;;2089:57;;;;;;-1:-1:-1;;2199:23:0;;;2308:22;;;2199:23;;;;2178:13;;;:45;;;;;2252:22;;;;;2199:23;2295:35;;;:39;2287:48;;;;;;2348:22;;;;:37;;2374:11;;2348:37;;;:22;-1:-1:-1;1906:509:0;;;;;;:::o;44307:665::-;44511:4;;-1:-1:-1;;;;;44550:30:0;;-1:-1:-1;;;;;;;;;;;44550:30:0;:62;;44599:13;44550:62;;;44583:13;44550:62;-1:-1:-1;;;;;44693:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;:43;;;;;;44533:79;-1:-1:-1;44891:73:0;44704:5;44918:33;;;44533:79;44891:18;:73::i;:::-;44884:80;44307:665;-1:-1:-1;;;;;;;44307:665:0:o;9722:37452::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5135:174::-;-1:-1:-1;;;;;5193:26:0;;-1:-1:-1;;;;;;;;;;;5193:26:0;5189:112;;;-1:-1:-1;;;;;5221:15:0;;:8;:15;;;;;;;;;;5077:2;5221:30;;5189:112;;;5285:5;-1:-1:-1;;;;;5285:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;5285:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5267:15:0;;:8;:15;;;;;;;;;;:34;-1:-1:-1;5135:174:0;:::o

Swarm Source

bzzr://7eb541f3d1a2548f0c8d7e0ff28ca2edb63374d5242dead60640e16d719ac99d

Block Transaction Difficulty 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
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.