ETH Price: $3,573.49 (+2.44%)
Gas: 34 Gwei

Contract

0x6c19E4CC4c87adB224697A1022F262b424F44d46
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve173062732023-05-21 7:30:23312 days ago1684654223IN
0x6c19E4CC...424F44d46
0 ETH0.0005957424.63390572
Approve160856192022-11-30 21:55:59483 days ago1669845359IN
0x6c19E4CC...424F44d46
0 ETH0.0002993812.3793704
Approve142315832022-02-18 18:05:02769 days ago1645207502IN
0x6c19E4CC...424F44d46
0 ETH0.00415646171.86842004
Approve142315812022-02-18 18:04:35769 days ago1645207475IN
0x6c19E4CC...424F44d46
0 ETH0.00396353163.89071433
Approve141262762022-02-02 11:08:31785 days ago1643800111IN
0x6c19E4CC...424F44d46
0 ETH0.0018379876
Approve140289792022-01-18 10:31:56800 days ago1642501916IN
0x6c19E4CC...424F44d46
0 ETH0.0022007491
Exit Pool125400972021-05-31 4:59:081032 days ago1622437148IN
0x6c19E4CC...424F44d46
0 ETH0.000765120
Exitswap Pool Am...125400972021-05-31 4:59:081032 days ago1622437148IN
0x6c19E4CC...424F44d46
0 ETH0.0014599618.7
Exitswap Pool Am...125400972021-05-31 4:59:081032 days ago1622437148IN
0x6c19E4CC...424F44d46
0 ETH0.0014053118
Exitswap Pool Am...125400972021-05-31 4:59:081032 days ago1622437148IN
0x6c19E4CC...424F44d46
0 ETH0.0014053118
Exitswap Pool Am...125400392021-05-31 4:45:431032 days ago1622436343IN
0x6c19E4CC...424F44d46
0 ETH0.0018149919
Exit Pool121268212021-03-28 9:23:291096 days ago1616923409IN
0x6c19E4CC...424F44d46
0 ETH0.0098779280
Exit Pool120376822021-03-14 16:07:141110 days ago1615738034IN
0x6c19E4CC...424F44d46
0 ETH0.01778776164
Exit Pool119426682021-02-28 0:39:461124 days ago1614472786IN
0x6c19E4CC...424F44d46
0 ETH0.01284254104
Exit Pool118871282021-02-19 11:39:191133 days ago1613734759IN
0x6c19E4CC...424F44d46
0 ETH0.01506529122
Joinswap Extern ...116960482021-01-21 2:10:351162 days ago1611195035IN
0x6c19E4CC...424F44d46
0 ETH0.0058410748
Exit Pool115807062021-01-03 9:34:181180 days ago1609666458IN
0x6c19E4CC...424F44d46
0 ETH0.0065091660
Exitswap Pool Am...115753302021-01-02 13:39:401181 days ago1609594780IN
0x6c19E4CC...424F44d46
0 ETH0.01821006170
Exit Pool115435462020-12-28 16:33:051186 days ago1609173185IN
0x6c19E4CC...424F44d46
0 ETH0.01497106138
Exitswap Pool Am...115224732020-12-25 11:15:241189 days ago1608894924IN
0x6c19E4CC...424F44d46
0 ETH0.003987840
Exit Pool115088482020-12-23 8:58:511191 days ago1608713931IN
0x6c19E4CC...424F44d46
0 ETH0.0100880893
Exit Pool114993162020-12-21 21:54:431192 days ago1608587683IN
0x6c19E4CC...424F44d46
0 ETH0.0033630631
Exit Pool114878302020-12-20 3:40:571194 days ago1608435657IN
0x6c19E4CC...424F44d46
0 ETH0.002278221
Exitswap Pool Am...114866222020-12-19 23:17:261194 days ago1608419846IN
0x6c19E4CC...424F44d46
0 ETH0.0023000522.00000134
Exit Pool114835892020-12-19 12:12:001195 days ago1608379920IN
0x6c19E4CC...424F44d46
0 ETH0.0029284727
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Txn Hash Block From To Value
110998122020-10-21 13:32:021254 days ago1603287122  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BPool

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 5 of 6: BPool.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BToken.sol";
import "./BMath.sol";

contract BPool is BBronze, BToken, BMath {

    struct Record {
        bool bound;   // is token bound to pool
        uint index;   // private
        uint denorm;  // denormalized weight
        uint balance;
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut,
        uint256         reservesAmount
    );

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256         tokenAmountIn,
        uint256         reservesAmount
    );

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut,
        uint256         reservesAmount
    );

    event LOG_DRAIN_RESERVES(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut
    );

    event LOG_ADD_RESERVES(
        address indexed token,
        uint256         reservesAmount
    );

    event LOG_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    modifier _lock_() {
        require(!_mutex);
        _mutex = true;
        _;
        _mutex = false;
    }

    modifier _viewlock_() {
        require(!_mutex);
        _;
    }

    bool private _mutex;

    address private _factory;    // BFactory address to push token exitFee to
    address private _controller; // has CONTROL role
    bool private _publicSwap; // true if PUBLIC can call SWAP functions

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint private _swapFee;
    uint private _reservesRatio;
    bool private _finalized;

    address[] private _tokens;
    mapping(address=>Record) private  _records;
    mapping(address=>uint) public totalReserves;

    uint private _totalWeight;

    constructor() public {
        _controller = msg.sender;
        _factory = msg.sender;
        _swapFee = MIN_FEE;
        _reservesRatio = DEFAULT_RESERVES_RATIO;
        _publicSwap = false;
        _finalized = false;
    }

    function isPublicSwap()
        external view
        returns (bool)
    {
        return _publicSwap;
    }

    function isFinalized()
        external view
        returns (bool)
    {
        return _finalized;
    }

    function isBound(address t)
        external view
        returns (bool)
    {
        return _records[t].bound;
    }

    function getNumTokens()
        external view
        returns (uint)
    {
        return _tokens.length;
    }

    function getCurrentTokens()
        external view _viewlock_
        returns (address[] memory tokens)
    {
        return _tokens;
    }

    function getFinalTokens()
        external view
        _viewlock_
        returns (address[] memory tokens)
    {
        require(_finalized);
        return _tokens;
    }

    function getDenormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        return _records[token].denorm;
    }

    function getTotalDenormalizedWeight()
        external view
        _viewlock_
        returns (uint)
    {
        return _totalWeight;
    }

    function getNormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        uint denorm = _records[token].denorm;
        return bdiv(denorm, _totalWeight);
    }

    function getBalance(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound);
        return _records[token].balance;
    }

    function getSwapFee()
        external view
        _viewlock_
        returns (uint)
    {
        return _swapFee;
    }

    function getReservesRatio()
        external view
        _viewlock_
        returns (uint)
    {
        return _reservesRatio;
    }

    function getController()
        external view
        _viewlock_
        returns (address)
    {
        return _controller;
    }

    function setSwapFee(uint swapFee)
        external
        _logs_
        _lock_
    {
        require(!_finalized);
        require(msg.sender == _controller);
        require(swapFee >= MIN_FEE);
        require(swapFee <= MAX_FEE);
        _swapFee = swapFee;
    }


    function setReservesRatio(uint reservesRatio)
        external
        _logs_
        _lock_
    {
        require(!_finalized);
        require(msg.sender == _controller);
        require(reservesRatio <= BONE);
        require(reservesRatio >= DEFAULT_RESERVES_RATIO);
        _reservesRatio = reservesRatio;
    }

    function setController(address manager)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        _controller = manager;
    }

    function setPublicSwap(bool public_)
        external
        _logs_
        _lock_
    {
        require(!_finalized);
        require(msg.sender == _controller);
        _publicSwap = public_;
    }

    function finalize()
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        require(!_finalized);
        require(_tokens.length >= MIN_BOUND_TOKENS);

        _finalized = true;
        _publicSwap = true;

        _mintPoolShare(INIT_POOL_SUPPLY);
        _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
    }


    function bind(address token, uint balance, uint denorm)
        external
        _logs_
        // _lock_  Bind does not lock because it jumps to `rebind`, which does
    {
        require(msg.sender == _controller);
        require(!_records[token].bound);
        require(!_finalized);

        require(_tokens.length < MAX_BOUND_TOKENS);

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: 0,    // balance and denorm will be validated
            balance: 0   // and set by `rebind`
        });
        _tokens.push(token);
        rebind(token, balance, denorm);
    }

    function rebind(address token, uint balance, uint denorm)
        public
        _logs_
        _lock_
    {

        require(msg.sender == _controller);
        require(_records[token].bound);
        require(!_finalized);

        require(denorm >= MIN_WEIGHT);
        require(denorm <= MAX_WEIGHT);
        require(balance >= MIN_BALANCE);

        // Adjust the denorm and totalWeight
        uint oldWeight = _records[token].denorm;
        if (denorm > oldWeight) {
            _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
            require(_totalWeight <= MAX_TOTAL_WEIGHT);
        } else if (denorm < oldWeight) {
            _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
        }
        _records[token].denorm = denorm;

        // Adjust the balance record and actual token balance
        uint oldBalance = _records[token].balance;
        _records[token].balance = balance;
        if (balance > oldBalance) {
            _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
        } else if (balance < oldBalance) {
            // In this case liquidity is being withdrawn, so charge EXIT_FEE
            uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
            uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
            _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
            _pushUnderlying(token, _factory, tokenExitFee);
        }
    }

    function unbind(address token)
        external
        _logs_
        _lock_
    {

        require(msg.sender == _controller);
        require(_records[token].bound);
        require(!_finalized);

        uint tokenBalance = _records[token].balance;
        uint tokenExitFee = bmul(tokenBalance, EXIT_FEE);

        _totalWeight = bsub(_totalWeight, _records[token].denorm);

        // Swap the token-to-unbind with the last token,
        // then delete the last token
        uint index = _records[token].index;
        uint last = _tokens.length - 1;
        _tokens[index] = _tokens[last];
        _records[_tokens[index]].index = index;
        _tokens.pop();
        _records[token] = Record({
            bound: false,
            index: 0,
            denorm: 0,
            balance: 0
        });

        _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
        _pushUnderlying(token, _factory, tokenExitFee);
    }

    // Absorb any tokens that have been sent to this contract into the pool
    function gulp(address token)
        external
        _logs_
        _lock_
    {
        require(_records[token].bound);
        uint erc20Balance = IERC20(token).balanceOf(address(this));
        uint reserves = totalReserves[token];
        // `_records[token].balance` should be equaled to `bsub(erc20Balance, reserves)` unless there are extra
        // tokens transferred to this pool without calling `joinxxx`.
        require(_records[token].balance <= bsub(erc20Balance, reserves));
        _records[token].balance = bsub(erc20Balance, reserves);
    }

    function seize(address token, uint amount)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller);
        require(!_records[token].bound);

        uint bal = IERC20(token).balanceOf(address(this));
        require(amount <= bal);

        _pushUnderlying(token, msg.sender, amount);
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
    }

    function getSpotPriceSansFee(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0);
    }

    function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
        external
        _logs_
        _lock_
    {
        require(_finalized, "ERR_NOT_FINALIZED");

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountIn = bmul(ratio, bal);
            require(tokenAmountIn != 0, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn, 0);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
        external
        _logs_
        _lock_
    {
        require(_finalized, "ERR_NOT_FINALIZED");

        uint poolTotal = totalSupply();
        uint exitFee = bmul(poolAmountIn, EXIT_FEE);
        uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
        uint ratio = bdiv(pAiAfterExitFee, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        _pushPoolShare(_factory, exitFee);
        _burnPoolShare(pAiAfterExitFee);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut != 0, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
            _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut, 0);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }

    }


    function swapExactAmountIn(
        address tokenIn,
        uint tokenAmountIn,
        address tokenOut,
        uint minAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut, uint spotPriceAfter)
    {

        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        uint tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            inRecord.denorm,
                                            outRecord.balance,
                                            outRecord.denorm,
                                            tokenAmountIn,
                                            _swapFee
                                        );
        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");

        uint reserves = calcReservesFromFee(tokenInFee, _reservesRatio);

        // Subtract `reserves`.
        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut, reserves);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);
        emit LOG_ADD_RESERVES(address(tokenIn), reserves);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint maxAmountIn,
        address tokenOut,
        uint tokenAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn, uint spotPriceAfter)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        uint tokenInFee;
        (tokenAmountIn, tokenInFee) = calcInGivenOut(
                                            inRecord.balance,
                                            inRecord.denorm,
                                            outRecord.balance,
                                            outRecord.denorm,
                                            tokenAmountOut,
                                            _swapFee
                                        );
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");

        uint reserves = calcReservesFromFee(
            tokenInFee,
            _reservesRatio
        );

        // Subtract `reserves` which is reserved for admin.
        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut, reserves);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);
        emit LOG_ADD_RESERVES(address(tokenIn), reserves);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountIn, spotPriceAfter);
    }


    function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut)
        external
        _logs_
        _lock_
        returns (uint poolAmountOut)

    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        Record storage inRecord = _records[tokenIn];

        uint reserves;
        (poolAmountOut, reserves) = calcPoolOutGivenSingleIn(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountIn,
                            _swapFee,
                            _reservesRatio
                        );

        require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT");

        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn, reserves);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);
        emit LOG_ADD_RESERVES(address(tokenIn), reserves);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return poolAmountOut;
    }

    function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn)
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");

        Record storage inRecord = _records[tokenIn];

        tokenAmountIn = calcSingleInGivenPoolOut(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountOut,
                            _swapFee
                        );

        require(tokenAmountIn != 0, "ERR_MATH_APPROX");
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");

        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        uint tokenAmountInZeroFee = calcSingleInGivenPoolOut(
            inRecord.balance,
            inRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountOut,
            0
        );
        uint reserves = calcReserves(
            tokenAmountIn,
            tokenAmountInZeroFee,
            _reservesRatio
        );

        inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn, reserves);

        totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves);
        emit LOG_ADD_RESERVES(address(tokenIn), reserves);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return tokenAmountIn;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");

        Record storage outRecord = _records[tokenOut];

        tokenAmountOut = calcSingleOutGivenPoolIn(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountIn,
                            _swapFee
                        );

        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");

        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        uint tokenAmountOutZeroFee = calcSingleOutGivenPoolIn(
            outRecord.balance,
            outRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountIn,
            0
        );
        uint reserves = calcReserves(
            tokenAmountOutZeroFee,
            tokenAmountOut,
            _reservesRatio
        );

        outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut, reserves);

        totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves);
        emit LOG_ADD_RESERVES(address(tokenOut), reserves);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return tokenAmountOut;
    }

    function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn)
        external
        _logs_
        _lock_
        returns (uint poolAmountIn)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        Record storage outRecord = _records[tokenOut];

        uint reserves;
        (poolAmountIn, reserves) = calcPoolInGivenSingleOut(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountOut,
                            _swapFee,
                            _reservesRatio
                        );

        require(poolAmountIn != 0, "ERR_MATH_APPROX");
        require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN");

        outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut, reserves);

        totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves);
        emit LOG_ADD_RESERVES(address(tokenOut), reserves);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return poolAmountIn;
    }

    function drainTotalReserves(address reservesAddress)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _factory);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint tokenAmountOut = totalReserves[t];
            totalReserves[t] = 0;
            emit LOG_DRAIN_RESERVES(reservesAddress, t, tokenAmountOut);
            _pushUnderlying(t, reservesAddress, tokenAmountOut);
        }
    }

    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety

    function _pullUnderlying(address erc20, address from, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer, "ERR_ERC20_FALSE");
    }

    function _pushUnderlying(address erc20, address to, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer, "ERR_ERC20_FALSE");
    }

    function _pullPoolShare(address from, uint amount)
        internal
    {
        _pull(from, amount);
    }

    function _pushPoolShare(address to, uint amount)
        internal
    {
        _push(to, amount);
    }

    function _mintPoolShare(uint amount)
        internal
    {
        _mint(amount);
    }

    function _burnPoolShare(uint amount)
        internal
    {
        _burn(amount);
    }

}

File 1 of 6: BColor.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

contract BColor {
    function getColor()
        external view
        returns (bytes32);
}

contract BBronze is BColor {
    function getColor()
        external view
        returns (bytes32) {
            return bytes32("BRONZE");
        }
}

File 2 of 6: BConst.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BColor.sol";

contract BConst is BBronze {
    uint public constant BONE              = 10**18;

    uint public constant MIN_BOUND_TOKENS  = 2;
    uint public constant MAX_BOUND_TOKENS  = 8;

    uint public constant MIN_FEE           = BONE / 40000; // MIN_FEE = 0.0025%
    uint public constant MAX_FEE           = BONE / 10; // MAX_FEE = 10%
    uint public constant EXIT_FEE          = 0;
    uint public constant DEFAULT_RESERVES_RATIO = BONE / 5;

    uint public constant MIN_WEIGHT        = BONE;
    uint public constant MAX_WEIGHT        = BONE * 50;
    uint public constant MAX_TOTAL_WEIGHT  = BONE * 50;
    uint public constant MIN_BALANCE       = BONE / 10**12;

    uint public constant INIT_POOL_SUPPLY  = BONE * 100;

    uint public constant MIN_BPOW_BASE     = 1 wei;
    uint public constant MAX_BPOW_BASE     = (2 * BONE) - 1 wei;
    uint public constant BPOW_PRECISION    = BONE / 10**10;

    uint public constant MAX_IN_RATIO      = BONE / 2;
    uint public constant MAX_OUT_RATIO     = (BONE / 3) + 1 wei;
}

File 3 of 6: BMath.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BNum.sol";

contract BMath is BBronze, BConst, BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcSpotPrice(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint swapFee
    )
        public pure
        returns (uint spotPrice)
    {
        uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint ratio = bdiv(numer, denom);
        uint scale = bdiv(BONE, bsub(BONE, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }

    /**********************************************************************************************
    // calcOutGivenIn                                                                            //
    // aO = tokenAmountOut                                                                       //
    // bO = tokenBalanceOut                                                                      //
    // bI = tokenBalanceIn              /      /            bI             \    (wI / wO) \      //
    // aI = tokenAmountIn    aO = bO * |  1 - | --------------------------  | ^            |     //
    // wI = tokenWeightIn               \      \ ( bI + ( aI * ( 1 - sF )) /              /      //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut, uint tokenInFee)
    {
        uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint adjustedIn = bsub(BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(BONE, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        tokenInFee = bsub(tokenAmountIn, adjustedIn);
        return (tokenAmountOut, tokenInFee);
    }

    /**********************************************************************************************
    // calcInGivenOut                                                                            //
    // aI = tokenAmountIn                                                                        //
    // bO = tokenBalanceOut               /  /     bO      \    (wO / wI)      \                 //
    // bI = tokenBalanceIn          bI * |  | ------------  | ^            - 1  |                //
    // aO = tokenAmountOut    aI =        \  \ ( bO - aO ) /                   /                 //
    // wI = tokenWeightIn           --------------------------------------------                 //
    // wO = tokenWeightOut                          ( 1 - sF )                                   //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcInGivenOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn, uint tokenInFee)
    {
        uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint y = bdiv(tokenBalanceOut, diff);
        uint foo = bpow(y, weightRatio);
        foo = bsub(foo, BONE);
        foo = bmul(tokenBalanceIn, foo);
        tokenAmountIn = bsub(BONE, swapFee);
        tokenAmountIn = bdiv(foo, tokenAmountIn);
        tokenInFee = bdiv(foo, BONE);
        tokenInFee = bsub(tokenAmountIn, tokenInFee);
        return (tokenAmountIn, tokenInFee);
    }

    /**********************************************************************************************
    // calcPoolOutGivenSingleIn                                                                  //
    // pAo = poolAmountOut         /                                              \              //
    // tAi = tokenAmountIn        ///      /     //    wI \      \\       \     wI \             //
    // wI = tokenWeightIn        //| tAi *| 1 - || 1 - --  | * sF || + tBi \    --  \            //
    // tW = totalWeight     pAo=||  \      \     \\    tW /      //         | ^ tW   | * pS - pS //
    // tBi = tokenBalanceIn      \\  ------------------------------------- /        /            //
    // pS = poolSupply            \\                    tBi               /        /             //
    // sF = swapFee                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee,
        uint reservesRatio
    )
        public pure
        returns (uint poolAmountOut, uint reserves)
    {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        // Exact fee portion of `tokenAmountIn`, i.e. (1- Wt)
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));

        reserves = calcReserves(tokenAmountIn, tokenAmountInAfterFee, reservesRatio);
        uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
        uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint poolRatio = bpow(tokenInRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        poolAmountOut = bsub(newPoolSupply, poolSupply);
        return (poolAmountOut, reserves);
    }

    /**********************************************************************************************
    // calcSingleInGivenPoolOut                                                                  //
    // tAi = tokenAmountIn              //(pS + pAo)\     /    1    \\                           //
    // pS = poolSupply                 || ---------  | ^ | --------- || * bI - bI                //
    // pAo = poolAmountOut              \\    pS    /     \(wI / tW)//                           //
    // bI = balanceIn          tAi =  --------------------------------------------               //
    // wI = weightIn                              /      wI  \                                   //
    // tW = totalWeight                          |  1 - ----  |  * sF                            //
    // sF = swapFee                               \      tW  /                                   //
    **********************************************************************************************/
    function calcSingleInGivenPoolOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint newPoolSupply = badd(poolSupply, poolAmountOut);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);

        //uint newBalTi = poolRatio^(1/weightTi) * balTi;
        uint boo = bdiv(BONE, normalizedWeight);
        uint tokenInRatio = bpow(poolRatio, boo);
        uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
        uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
        // Do reverse order of fees charged in joinswap_ExternAmountIn, this way
        //     ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
        //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);

        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
        uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);

        uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);

        // charge swap fee on the output token side
        //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcPoolInGivenSingleOut                                                                  //
    // pAi = poolAmountIn               // /               tAo             \\     / wO \     \   //
    // bO = tokenBalanceOut            // | bO - -------------------------- |\   | ---- |     \  //
    // tAo = tokenAmountOut      pS - ||   \     1 - ((1 - (tO / tW)) * sF)/  | ^ \ tW /  * pS | //
    // ps = poolSupply                 \\ -----------------------------------/                /  //
    // wO = tokenWeightOut  pAi =       \\               bO                 /                /   //
    // tW = totalWeight           -------------------------------------------------------------  //
    // sF = swapFee                                        ( 1 - eF )                            //
    // eF = exitFee                                                                              //
    **********************************************************************************************/
    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee,
        uint reservesRatio
    )
        public pure
        returns (uint poolAmountIn, uint reserves)
    {

        // charge swap fee on the output token side
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));
        reserves = calcReserves(tokenAmountOutBeforeSwapFee, tokenAmountOut, reservesRatio);

        uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
        uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);

        //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
        uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);

        // charge exit fee on the pool token side
        // pAi = pAiAfterExitFee/(1-exitFee)
        poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
        return (poolAmountIn, reserves);
    }

    // `swapFeeAndReserves = amountWithFee - amountWithoutFee` is the swap fee in balancer.
    // We divide `swapFeeAndReserves` into halves, `actualSwapFee` and `reserves`.
    // `reserves` goes to the admin and `actualSwapFee` still goes to the liquidity
    // providers.
    function calcReserves(uint amountWithFee, uint amountWithoutFee, uint reservesRatio)
        internal pure
        returns (uint reserves)
    {
        require(amountWithFee >= amountWithoutFee, "ERR_MATH_APPROX");
        require(reservesRatio <= BONE, "ERR_INVALID_RESERVE");
        uint swapFeeAndReserves = bsub(amountWithFee, amountWithoutFee);
        reserves = bmul(swapFeeAndReserves, reservesRatio);
        require(swapFeeAndReserves >= reserves, "ERR_MATH_APPROX");
    }

    function calcReservesFromFee(uint fee, uint reservesRatio)
        internal pure
        returns (uint reserves)
    {
        require(reservesRatio <= BONE, "ERR_INVALID_RESERVE");
        reserves = bmul(fee, reservesRatio);
    }
}

File 4 of 6: BNum.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BConst.sol";

contract BNum is BConst {

    function btoi(uint a)
        internal pure
        returns (uint)
    {
        return a / BONE;
    }

    function bfloor(uint a)
        internal pure
        returns (uint)
    {
        return btoi(a) * BONE;
    }

    function badd(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint a, uint b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint c1 = c0 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint c2 = c1 / BONE;
        return c2;
    }

    function bdiv(uint a, uint b)
        internal pure
        returns (uint)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint c0 = a * BONE;
        require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
        uint c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint c2 = c1 / b;
        return c2;
    }

    // DSMath.wpow
    function bpowi(uint a, uint n)
        internal pure
        returns (uint)
    {
        uint z = n % 2 != 0 ? a : BONE;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint base, uint exp)
        internal pure
        returns (uint)
    {
        require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");

        uint whole  = bfloor(exp);
        uint remain = bsub(exp, whole);

        uint wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint base, uint exp, uint precision)
        internal pure
        returns (uint)
    {
        // term 0:
        uint a     = exp;
        (uint x, bool xneg)  = bsubSign(base, BONE);
        uint term = BONE;
        uint sum   = term;
        bool negative = false;


        // term(k) = numer / denom
        //         = (product(a - i - 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint i = 1; term >= precision; i++) {
            uint bigK = i * BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

File 6 of 6: BToken.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.12;

import "./BNum.sol";

// Highly opinionated token implementation

interface IERC20 {
    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function totalSupply() external view returns (uint);
    function balanceOf(address whom) external view returns (uint);
    function allowance(address src, address dst) external view returns (uint);

    function approve(address dst, uint amt) external returns (bool);
    function transfer(address dst, uint amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint amt
    ) external returns (bool);
}

contract BTokenBase is BNum {

    mapping(address => uint)                   internal _balance;
    mapping(address => mapping(address=>uint)) internal _allowance;
    uint internal _totalSupply;

    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function _mint(uint amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        _totalSupply = badd(_totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint amt) internal {
        require(_balance[address(this)] >= amt);
        _balance[address(this)] = bsub(_balance[address(this)], amt);
        _totalSupply = bsub(_totalSupply, amt);
        emit Transfer(address(this), address(0), amt);
    }

    function _move(address src, address dst, uint amt) internal {
        require(_balance[src] >= amt);
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint amt) internal {
        _move(address(this), to, amt);
    }

    function _pull(address from, uint amt) internal {
        _move(from, address(this), amt);
    }
}

contract BToken is BTokenBase, IERC20 {

    string  private _name     = "Cream Pool Token";
    string  private _symbol   = "CRPT";
    uint8   private _decimals = 18;

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns(uint8) {
        return _decimals;
    }

    function allowance(address src, address dst) external view returns (uint) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint) {
        return _balance[whom];
    }

    function totalSupply() public view returns (uint) {
        return _totalSupply;
    }

    function approve(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint amt) external returns (bool) {
        uint oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function transfer(address dst, uint amt) external returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint amt) external returns (bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender]);
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_ADD_RESERVES","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_DRAIN_RESERVES","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_RESERVES_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"reservesAddress","type":"address"}],"name":"drainTotalReserves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReservesRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"setReservesRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60c0604052601060808190527f437265616d20506f6f6c20546f6b656e0000000000000000000000000000000060a0908152620000409160039190620000ff565b506040805180820190915260048082527f43525054000000000000000000000000000000000000000000000000000000006020909201918252620000859181620000ff565b506005805460ff19166012179055348015620000a057600080fd5b50600680546005805462010000600160b01b03191633620100008102919091179091556516bcc41e90006007556702c68af0bb1400006008556001600160a01b03199091161760ff60a01b191690556009805460ff19169055620001a4565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014257805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017257825182559160200191906001019062000155565b506200018092915062000184565b5090565b620001a191905b808211156200018057600081556001016200018b565b90565b61523980620001b46000396000f3fe608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b6104486111df565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611275565b604080519115158252519081900360200190f35b61042e6112ca565b61042e6004803603604081101561051b57600080fd5b506001600160a01b03813581169160200135166112d7565b61042e6004803603604081101561054957600080fd5b506001600160a01b03813581169160200135166113f6565b61042e61150c565b61042e611512565b61042e611526565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611532565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356115df565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166116f9565b61061e611717565b604080516001600160a01b039092168252519081900360200190f35b61064261173f565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b5035611748565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b03813516906020810135906040013561182c565b61042e600480360360608110156106bf57600080fd5b506001600160a01b038135169060208101359060400135611a68565b610675600480360360208110156106f157600080fd5b50351515611dcf565b610675611ea4565b61042e611fb4565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611fd3565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561228a565b61042e600480360360608110156107d057600080fd5b506001600160a01b03813516906020810135906040013561233d565b6104e96004803603604081101561080257600080fd5b506001600160a01b03813516906020013561265a565b61042e6004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135612732565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612a99565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612aab565b61042e612ac6565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612ad7565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fd7565b61042e6134bc565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356134d0565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316613580565b6104e9613726565b610675600480360360208110156109a557600080fd5b50356001600160a01b031661372f565b61042e6137fa565b61042e613819565b61042e613826565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316613836565b610448613892565b61042e6138f3565b61042e6138ff565b61042e600480360360a0811015610a2157600080fd5b508035906020810135906040810135906060810135906080013561390c565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135613971565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316613987565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050613acd565b61042e613dd2565b61067560048036036020811015610b2557600080fd5b5035613dd7565b61042e613ebd565b61042e613ec2565b6103e3600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613ec7565b61042e613f58565b61042e613f68565b610b8f613f74565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e613ffa565b610b8f613fff565b61042e614017565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b031661401d565b61042e6142b9565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356142d8565b61042e60048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516614359565b61067560048036036060811015610c9557600080fd5b506001600160a01b038135169060208101359060400135614384565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356144f3565b61042e614657565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316614667565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b03166146d5565b6103e3600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614731565b6104e96147db565b6000806000610d8389886147eb565b90506000610da2610d9c670de0b6b3a7640000846148fe565b87614960565b90506000610dc188610dbc670de0b6b3a7640000856148fe565b6147eb565b9050610dce818988614a22565b93506000610ddc8d836148fe565b90506000610dea828f6147eb565b90506000610df88287614b1f565b90506000610e06828f614960565b90506000610e148f836148fe565b9050610e2d81610dbc670de0b6b3a764000060006148fe565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610f15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16610f72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b60205260409020600390810154610fa791670de0b6b3a76400005b04600101614960565b831115610fef576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061103982600301548360020154600254600d5489600754600854610d74565b909350905082611082576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b838311156110c6576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6110dd6110d78360030154876148fe565b826148fe565b600383015560006110ee8482614960565b604080518881526020810185905281519293506001600160a01b038a16923392600080516020615165833981519152928290030190a36001600160a01b0387166000908152600c60205260409020546111479083614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a26111913385614c7a565b6111a361119e85836148fe565b614c88565b6005546111bf906201000090046001600160a01b031682614c94565b6111ca873388614c9e565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206151e5833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156112ef57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661134c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166113a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946113ed949293929061390c565b95945050505050565b600554600090610100900460ff161561140e57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661146b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166114c8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252902060038083015460028085015492840154908401546007546113ed9492919061390c565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600080600061154189886147eb565b9050600061155a610d9c670de0b6b3a7640000846148fe565b9050600061157988611574670de0b6b3a7640000856148fe565b614960565b9050611586888288614a22565b935060006115948d83614c2d565b905060006115a2828f6147eb565b905060006115b08287614b1f565b905060006115be828f614960565b90506115ca818f6148fe565b98505050505050505097509795505050505050565b6000336001600160a01b038516148061161b57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61162457600080fd5b61162f848484614d69565b336001600160a01b0385161480159061166d57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156116ef576001600160a01b03841660009081526001602090815260408083203384529091529020546116a090836148fe565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206151e58339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561172f57600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117be57600080fd5b6005805461ff00191661010017905560095460ff16156117dd57600080fd5b6006546001600160a01b031633146117f457600080fd5b6516bcc41e900081101561180757600080fd5b67016345785d8a000081111561181c57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118a257600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146118ca57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166118ef57600080fd5b60095460ff16156118ff57600080fd5b670de0b6b3a764000081101561191457600080fd5b6802b5e3af16b188000081111561192a57600080fd5b620f424082101561193a57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561199257611973600d5461196e84846148fe565b614c2d565b600d8190556802b5e3af16b1880000101561198d57600080fd5b6119b3565b808210156119b3576119af600d546119aa83856148fe565b6148fe565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156119fc576119f785336119f287856148fe565b614e28565b611a56565b80841015611a56576000611a1082866148fe565b90506000611a1f826000614960565b9050611a358733611a3085856148fe565b614c9e565b600554611a539088906201000090046001600160a01b031683614c9e565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611ae057600080fd5b6005805461ff00191661010017905560095460ff16611b3a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16611b97576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d54600754611bd1949392919089906134d0565b915082821015611c18576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b60205260409020600390810154611c4891670de0b6b3a7640000610f9e565b821115611c90576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000611cad82600301548360020154600254600d548960006134d0565b90506000611cbe8285600854614a22565b9050611cd16110d78460030154866148fe565b60038401556000611ce28782614960565b604080518781526020810185905281519293506001600160a01b038b16923392600080516020615165833981519152928290030190a36001600160a01b0388166000908152600c6020526040902054611d3b9083614c2d565b6001600160a01b0389166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a2611d853388614c7a565b611d9261119e88836148fe565b600554611dae906201000090046001600160a01b031682614c94565b611db9883387614c9e565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e4557600080fd5b6005805461ff00191661010017905560095460ff1615611e6457600080fd5b6006546001600160a01b03163314611e7b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f1a57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611f4257600080fd5b60095460ff1615611f5257600080fd5b600a5460021115611f6257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611f9468056bc75e2d63100000614e81565b611fa73368056bc75e2d63100000614c94565b6005805461ff0019169055565b600554600090610100900460ff1615611fcc57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561204957600080fd5b6005805461ff00191661010017905560095460ff166120a3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006120ad61150c565b905060006120bb85836147eb565b905080612101576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015612276576000600a828154811061211d57fe5b60009182526020808320909101546001600160a01b0316808352600b9091526040822060030154909250906121528583614960565b905080612198576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8787858181106121a457fe5b905060200201358111156121ee576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546122149082614c2d565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151a58339815191529281900390910190a361226b833383614e28565b505050600101612104565b5061228085614e81565b611a563386614c94565b60008061229787866147eb565b905060006122a58786614c2d565b905060006122b382896147eb565b905060006122c9670de0b6b3a7640000856147eb565b905060006122d78383614b1f565b905060006122e5828e614960565b905060006122f3828f6148fe565b9050600061231261230c670de0b6b3a76400008a6148fe565b8b614960565b905061232a82610dbc670de0b6b3a7640000846148fe565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156123b557600080fd5b6005805461ff00191661010017905560095460ff1661240f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff1661246c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206003015461249e906002670de0b6b3a76400005b04614960565b8311156124e5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061252f82600301548360020154600254600d5489600754600854611532565b909350905083831015612579576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61258a6110d7836003015487614c2d565b6003830155604080518681526020810183905281516001600160a01b0389169233926000805160206151a5833981519152929081900390910190a36001600160a01b0386166000908152600c60205260409020546125e89082614c2d565b6001600160a01b0387166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a261263183614e81565b61263b3384614c94565b612646863387614e28565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156126af573360009081526001602090815260408083206001600160a01b03881684529091528120556126de565b6126b981846148fe565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206151e5833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127aa57600080fd5b6005805461ff00191661010017905560095460ff16612804576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16612861576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461289b9493929190899061228a565b9150816128e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612925576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b6020526040902060030154612955906002670de0b6b3a7640000612498565b82111561299c576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006129b982600301548360020154600254600d5489600061228a565b905060006129ca8483600854614a22565b90506129dd6110d7846003015486614c2d565b6003840155604080518581526020810183905281516001600160a01b038a169233926000805160206151a5833981519152929081900390910190a36001600160a01b0387166000908152600c6020526040902054612a3b9082614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612a8486614e81565b612a8e3387614c94565b6111ca873386614e28565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b619c40670de0b6b3a7640000611522565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b3e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16612baa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16612c07576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612c5b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600380820154612c9491670de0b6b3a7640000610f9e565b861115612cdc576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612cfd836003015484600201548460030154856002015460075461390c565b905085811115612d4a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6000612d6c84600301548560020154856003015486600201548c600754614731565b909650905089861115612db5576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6000612dc382600854614e8a565b9050612dd66110d7866003015489614c2d565b8560030181905550612dec84600301548a6148fe565b600380860182905586015460028088015490870154600754612e0f94919061390c565b955082861015612e58576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87861115612e9f576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b612ea9878a6147eb565b831115612eef576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60408051888152602081018b905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c6020526040902054612f659082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612fb08c3389614e28565b612fbb8a338b614c9e565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166130aa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16613107576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff1661315b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b6020526040808220928816825290206003820154613195906002670de0b6b3a7640000612498565b8811156131dc576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006131fd836003015484600201548460030154856002015460075461390c565b90508581111561324a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b600061326c84600301548560020154856003015486600201548e600754613ec7565b9096509050878610156132b6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b60006132c482600854614e8a565b90506132d76110d786600301548d614c2d565b85600301819055506132ed8460030154886148fe565b60038086018290558601546002808801549087015460075461331094919061390c565b955082861015613359576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878611156133a0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6133aa8b886147eb565b8311156133f0576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b604080518c81526020810189905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c60205260409020546134669082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a26134b18c338d614e28565b612fbb8a3389614c9e565b64e8d4a51000670de0b6b3a7640000611522565b6000806134dd87866147eb565b905060006134f885611574670de0b6b3a764000060006148fe565b9050600061350688836148fe565b90506000613514828a6147eb565b905060006135338261352e670de0b6b3a7640000886147eb565b614b1f565b90506000613541828e614960565b9050600061354f8e836148fe565b9050600061356861230c670de0b6b3a76400008a6148fe565b905061232a82611574670de0b6b3a7640000846148fe565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156135f657600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff1661362a57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561367457600080fd5b505afa158015613688573d6000803e3d6000fd5b505050506040513d602081101561369e57600080fd5b50516001600160a01b0383166000908152600c60205260409020549091506136c682826148fe565b6001600160a01b0384166000908152600b602052604090206003015411156136ed57600080fd5b6136f782826148fe565b6001600160a01b039093166000908152600b602052604090206003019290925550506005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156137a557600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146137cd57600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561381257600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a7640000611522565b600554600090610100900460ff161561384e57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661387357600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b60008061391987876147eb565b9050600061392786866147eb565b9050600061393583836147eb565b90506000613957670de0b6b3a7640000610dbc670de0b6b3a7640000896148fe565b90506139638282614960565b9a9950505050505050505050565b600061397e338484614d69565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156139fd57600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314613a2a57600080fd5b60005b600a54811015613abe576000600a8281548110613a4657fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3613ab4828583614c9e565b5050600101613a2d565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b4357600080fd5b6005805461ff00191661010017905560095460ff16613b9d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613ba761150c565b90506000613bb6856000614960565b90506000613bc486836148fe565b90506000613bd282856147eb565b905080613c18576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613c223388614c7a565b600554613c3e906201000090046001600160a01b031684614c94565b613c4782614c88565b60005b600a54811015613dbd576000600a8281548110613c6357fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090613c988583614960565b905080613cde576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613cea57fe5b90506020020135811015613d35576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060030154613d5b90826148fe565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151658339815191529281900390910190a3613db2833383614c9e565b505050600101613c4a565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e4d57600080fd5b6005805461ff00191661010017905560095460ff1615613e6c57600080fd5b6006546001600160a01b03163314613e8357600080fd5b670de0b6b3a7640000811115613e9857600080fd5b6702c68af0bb140000811015613ead57600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806000613ed688876147eb565b90506000613eec670de0b6b3a7640000866148fe565b9050613ef88682614960565b90506000613f0a8b610dbc8d85614c2d565b90506000613f188285614b1f565b90506000613f2e670de0b6b3a7640000836148fe565b9050613f3a8b82614960565b9650613f4689856148fe565b95505050505050965096945050505050565b600a670de0b6b3a7640000611522565b671bc16d674ec7ffff81565b600554606090610100900460ff1615613f8c57600080fd5b60095460ff16613f9b57600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561126b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613fd3575050505050905090565b600081565b600554606090610100900460ff1615613f9b57600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561409357600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146140bb57600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166140e057600080fd5b60095460ff16156140f057600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906141178282614960565b600d546001600160a01b0385166000908152600b6020526040902060020154919250614142916148fe565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061417657fe5b600091825260209091200154600a80546001600160a01b03909216918490811061419c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106141dc57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a80548061420f57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561429b8533611a3087876148fe565b600554611a569086906201000090046001600160a01b031685614c9e565b600554600090610100900460ff16156142d157600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143069083614c2d565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206151e5833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146143fc57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561442257600080fd5b60095460ff161561443257600080fd5b600a5460081161444157600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556144ee83838361182c565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561456957600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461459157600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16156145b757600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561460157600080fd5b505afa158015614615573d6000803e3d6000fd5b505050506040513d602081101561462b57600080fd5b505190508082111561463c57600080fd5b614647833384614c9e565b50506005805461ff001916905550565b6002670de0b6b3a7640000611522565b600554600090610100900460ff161561467f57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166146a457600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d546146ce9082906147eb565b9392505050565b600554600090610100900460ff16156146ed57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661471257600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080600061474086896147eb565b9050600061474e88876148fe565b9050600061475c89836147eb565b9050600061476a8285614b1f565b905061477e81670de0b6b3a76400006148fe565b905061478a8c82614960565b905061479e670de0b6b3a7640000886148fe565b95506147aa81876147eb565b95506147be81670de0b6b3a76400006147eb565b94506147ca86866148fe565b945050505050965096945050505050565b600654600160a01b900460ff1690565b60008161482e576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806148565750670de0b6b3a764000084828161485357fe5b04145b61489a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156148e8576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60008482816148f357fe5b049695505050505050565b600080600061490d8585614ee9565b915091508015614958576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b600082820283158061497a57508284828161497757fe5b04145b6149be576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a11576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000826148f3565b600082841015614a6b576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b670de0b6b3a7640000821115614abe576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6000614aca85856148fe565b9050614ad68184614960565b915081811015614958576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60006001831015614b6f576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614bc5576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b6000614bd083614f0e565b90506000614bde84836148fe565b90506000614bf486614bef85614f29565b614f37565b905081614c055792506112c4915050565b6000614c1687846305f5e100614f8e565b9050614c228282614960565b979650505050505050565b6000828201838110156146ce576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b614c84828261506c565b5050565b614c9181615077565b50565b614c8482826150f6565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614cf157600080fd5b505af1158015614d05573d6000803e3d6000fd5b505050506040513d6020811015614d1b57600080fd5b5051905080614d63576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614d8e57600080fd5b6001600160a01b038316600090815260208190526040902054614db190826148fe565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614de09082614c2d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206151c583398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614cf157600080fd5b614c9181615101565b6000670de0b6b3a7640000821115614edf576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6146ce8383614960565b600080828410614eff5750508082036000614f07565b505081810360015b9250929050565b6000670de0b6b3a7640000614f2283614f29565b0292915050565b670de0b6b3a7640000900490565b60008060028306614f5057670de0b6b3a7640000614f52565b835b90506002830492505b82156146ce57614f6b8485614960565b93506002830615614f8357614f808185614960565b90505b600283049250614f5b565b6000828180614fa587670de0b6b3a7640000614ee9565b9092509050670de0b6b3a764000080600060015b88841061505d576000670de0b6b3a764000082029050600080614fed8a614fe885670de0b6b3a76400006148fe565b614ee9565b91509150614fff87611574848c614960565b965061500b87846147eb565b96508661501a5750505061505d565b8715615024579315935b801561502e579315935b84156150455761503e86886148fe565b9550615052565b61504f8688614c2d565b95505b505050600101614fb9565b50909998505050505050505050565b614c84823083614d69565b3060009081526020819052604090205481111561509357600080fd5b306000908152602081905260409020546150ad90826148fe565b306000908152602081905260409020556002546150ca90826148fe565b60025560408051828152905160009130916000805160206151c58339815191529181900360200190a350565b614c84308383614d69565b3060009081526020819052604090205461511b9082614c2d565b306000908152602081905260409020556002546151389082614c2d565b60025560408051828152905130916000916000805160206151c58339815191529181900360200190a35056fe9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f39448856d254ce9f0a13e70882297125673303bfaa163fc49ad146aa8bb55660715a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb64736f6c634300050c0032

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b6104486111df565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611275565b604080519115158252519081900360200190f35b61042e6112ca565b61042e6004803603604081101561051b57600080fd5b506001600160a01b03813581169160200135166112d7565b61042e6004803603604081101561054957600080fd5b506001600160a01b03813581169160200135166113f6565b61042e61150c565b61042e611512565b61042e611526565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611532565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356115df565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166116f9565b61061e611717565b604080516001600160a01b039092168252519081900360200190f35b61064261173f565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b5035611748565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b03813516906020810135906040013561182c565b61042e600480360360608110156106bf57600080fd5b506001600160a01b038135169060208101359060400135611a68565b610675600480360360208110156106f157600080fd5b50351515611dcf565b610675611ea4565b61042e611fb4565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611fd3565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561228a565b61042e600480360360608110156107d057600080fd5b506001600160a01b03813516906020810135906040013561233d565b6104e96004803603604081101561080257600080fd5b506001600160a01b03813516906020013561265a565b61042e6004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135612732565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612a99565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612aab565b61042e612ac6565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612ad7565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fd7565b61042e6134bc565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356134d0565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316613580565b6104e9613726565b610675600480360360208110156109a557600080fd5b50356001600160a01b031661372f565b61042e6137fa565b61042e613819565b61042e613826565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316613836565b610448613892565b61042e6138f3565b61042e6138ff565b61042e600480360360a0811015610a2157600080fd5b508035906020810135906040810135906060810135906080013561390c565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135613971565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316613987565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050613acd565b61042e613dd2565b61067560048036036020811015610b2557600080fd5b5035613dd7565b61042e613ebd565b61042e613ec2565b6103e3600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613ec7565b61042e613f58565b61042e613f68565b610b8f613f74565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e613ffa565b610b8f613fff565b61042e614017565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b031661401d565b61042e6142b9565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356142d8565b61042e60048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516614359565b61067560048036036060811015610c9557600080fd5b506001600160a01b038135169060208101359060400135614384565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356144f3565b61042e614657565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316614667565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b03166146d5565b6103e3600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614731565b6104e96147db565b6000806000610d8389886147eb565b90506000610da2610d9c670de0b6b3a7640000846148fe565b87614960565b90506000610dc188610dbc670de0b6b3a7640000856148fe565b6147eb565b9050610dce818988614a22565b93506000610ddc8d836148fe565b90506000610dea828f6147eb565b90506000610df88287614b1f565b90506000610e06828f614960565b90506000610e148f836148fe565b9050610e2d81610dbc670de0b6b3a764000060006148fe565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610f15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16610f72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b60205260409020600390810154610fa791670de0b6b3a76400005b04600101614960565b831115610fef576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061103982600301548360020154600254600d5489600754600854610d74565b909350905082611082576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b838311156110c6576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6110dd6110d78360030154876148fe565b826148fe565b600383015560006110ee8482614960565b604080518881526020810185905281519293506001600160a01b038a16923392600080516020615165833981519152928290030190a36001600160a01b0387166000908152600c60205260409020546111479083614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a26111913385614c7a565b6111a361119e85836148fe565b614c88565b6005546111bf906201000090046001600160a01b031682614c94565b6111ca873388614c9e565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206151e5833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156112ef57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661134c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166113a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946113ed949293929061390c565b95945050505050565b600554600090610100900460ff161561140e57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661146b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166114c8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252902060038083015460028085015492840154908401546007546113ed9492919061390c565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600080600061154189886147eb565b9050600061155a610d9c670de0b6b3a7640000846148fe565b9050600061157988611574670de0b6b3a7640000856148fe565b614960565b9050611586888288614a22565b935060006115948d83614c2d565b905060006115a2828f6147eb565b905060006115b08287614b1f565b905060006115be828f614960565b90506115ca818f6148fe565b98505050505050505097509795505050505050565b6000336001600160a01b038516148061161b57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61162457600080fd5b61162f848484614d69565b336001600160a01b0385161480159061166d57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156116ef576001600160a01b03841660009081526001602090815260408083203384529091529020546116a090836148fe565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206151e58339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561172f57600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117be57600080fd5b6005805461ff00191661010017905560095460ff16156117dd57600080fd5b6006546001600160a01b031633146117f457600080fd5b6516bcc41e900081101561180757600080fd5b67016345785d8a000081111561181c57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118a257600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146118ca57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166118ef57600080fd5b60095460ff16156118ff57600080fd5b670de0b6b3a764000081101561191457600080fd5b6802b5e3af16b188000081111561192a57600080fd5b620f424082101561193a57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561199257611973600d5461196e84846148fe565b614c2d565b600d8190556802b5e3af16b1880000101561198d57600080fd5b6119b3565b808210156119b3576119af600d546119aa83856148fe565b6148fe565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156119fc576119f785336119f287856148fe565b614e28565b611a56565b80841015611a56576000611a1082866148fe565b90506000611a1f826000614960565b9050611a358733611a3085856148fe565b614c9e565b600554611a539088906201000090046001600160a01b031683614c9e565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611ae057600080fd5b6005805461ff00191661010017905560095460ff16611b3a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16611b97576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d54600754611bd1949392919089906134d0565b915082821015611c18576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b60205260409020600390810154611c4891670de0b6b3a7640000610f9e565b821115611c90576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000611cad82600301548360020154600254600d548960006134d0565b90506000611cbe8285600854614a22565b9050611cd16110d78460030154866148fe565b60038401556000611ce28782614960565b604080518781526020810185905281519293506001600160a01b038b16923392600080516020615165833981519152928290030190a36001600160a01b0388166000908152600c6020526040902054611d3b9083614c2d565b6001600160a01b0389166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a2611d853388614c7a565b611d9261119e88836148fe565b600554611dae906201000090046001600160a01b031682614c94565b611db9883387614c9e565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e4557600080fd5b6005805461ff00191661010017905560095460ff1615611e6457600080fd5b6006546001600160a01b03163314611e7b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f1a57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611f4257600080fd5b60095460ff1615611f5257600080fd5b600a5460021115611f6257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611f9468056bc75e2d63100000614e81565b611fa73368056bc75e2d63100000614c94565b6005805461ff0019169055565b600554600090610100900460ff1615611fcc57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561204957600080fd5b6005805461ff00191661010017905560095460ff166120a3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006120ad61150c565b905060006120bb85836147eb565b905080612101576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015612276576000600a828154811061211d57fe5b60009182526020808320909101546001600160a01b0316808352600b9091526040822060030154909250906121528583614960565b905080612198576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8787858181106121a457fe5b905060200201358111156121ee576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546122149082614c2d565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151a58339815191529281900390910190a361226b833383614e28565b505050600101612104565b5061228085614e81565b611a563386614c94565b60008061229787866147eb565b905060006122a58786614c2d565b905060006122b382896147eb565b905060006122c9670de0b6b3a7640000856147eb565b905060006122d78383614b1f565b905060006122e5828e614960565b905060006122f3828f6148fe565b9050600061231261230c670de0b6b3a76400008a6148fe565b8b614960565b905061232a82610dbc670de0b6b3a7640000846148fe565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156123b557600080fd5b6005805461ff00191661010017905560095460ff1661240f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff1661246c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206003015461249e906002670de0b6b3a76400005b04614960565b8311156124e5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061252f82600301548360020154600254600d5489600754600854611532565b909350905083831015612579576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61258a6110d7836003015487614c2d565b6003830155604080518681526020810183905281516001600160a01b0389169233926000805160206151a5833981519152929081900390910190a36001600160a01b0386166000908152600c60205260409020546125e89082614c2d565b6001600160a01b0387166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a261263183614e81565b61263b3384614c94565b612646863387614e28565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156126af573360009081526001602090815260408083206001600160a01b03881684529091528120556126de565b6126b981846148fe565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206151e5833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127aa57600080fd5b6005805461ff00191661010017905560095460ff16612804576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16612861576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461289b9493929190899061228a565b9150816128e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612925576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b6020526040902060030154612955906002670de0b6b3a7640000612498565b82111561299c576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006129b982600301548360020154600254600d5489600061228a565b905060006129ca8483600854614a22565b90506129dd6110d7846003015486614c2d565b6003840155604080518581526020810183905281516001600160a01b038a169233926000805160206151a5833981519152929081900390910190a36001600160a01b0387166000908152600c6020526040902054612a3b9082614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612a8486614e81565b612a8e3387614c94565b6111ca873386614e28565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b619c40670de0b6b3a7640000611522565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b3e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16612baa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16612c07576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612c5b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600380820154612c9491670de0b6b3a7640000610f9e565b861115612cdc576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612cfd836003015484600201548460030154856002015460075461390c565b905085811115612d4a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6000612d6c84600301548560020154856003015486600201548c600754614731565b909650905089861115612db5576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6000612dc382600854614e8a565b9050612dd66110d7866003015489614c2d565b8560030181905550612dec84600301548a6148fe565b600380860182905586015460028088015490870154600754612e0f94919061390c565b955082861015612e58576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87861115612e9f576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b612ea9878a6147eb565b831115612eef576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60408051888152602081018b905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c6020526040902054612f659082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612fb08c3389614e28565b612fbb8a338b614c9e565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166130aa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16613107576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff1661315b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b6020526040808220928816825290206003820154613195906002670de0b6b3a7640000612498565b8811156131dc576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006131fd836003015484600201548460030154856002015460075461390c565b90508581111561324a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b600061326c84600301548560020154856003015486600201548e600754613ec7565b9096509050878610156132b6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b60006132c482600854614e8a565b90506132d76110d786600301548d614c2d565b85600301819055506132ed8460030154886148fe565b60038086018290558601546002808801549087015460075461331094919061390c565b955082861015613359576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878611156133a0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6133aa8b886147eb565b8311156133f0576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b604080518c81526020810189905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c60205260409020546134669082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a26134b18c338d614e28565b612fbb8a3389614c9e565b64e8d4a51000670de0b6b3a7640000611522565b6000806134dd87866147eb565b905060006134f885611574670de0b6b3a764000060006148fe565b9050600061350688836148fe565b90506000613514828a6147eb565b905060006135338261352e670de0b6b3a7640000886147eb565b614b1f565b90506000613541828e614960565b9050600061354f8e836148fe565b9050600061356861230c670de0b6b3a76400008a6148fe565b905061232a82611574670de0b6b3a7640000846148fe565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156135f657600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff1661362a57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561367457600080fd5b505afa158015613688573d6000803e3d6000fd5b505050506040513d602081101561369e57600080fd5b50516001600160a01b0383166000908152600c60205260409020549091506136c682826148fe565b6001600160a01b0384166000908152600b602052604090206003015411156136ed57600080fd5b6136f782826148fe565b6001600160a01b039093166000908152600b602052604090206003019290925550506005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156137a557600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146137cd57600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561381257600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a7640000611522565b600554600090610100900460ff161561384e57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661387357600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b60008061391987876147eb565b9050600061392786866147eb565b9050600061393583836147eb565b90506000613957670de0b6b3a7640000610dbc670de0b6b3a7640000896148fe565b90506139638282614960565b9a9950505050505050505050565b600061397e338484614d69565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156139fd57600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314613a2a57600080fd5b60005b600a54811015613abe576000600a8281548110613a4657fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3613ab4828583614c9e565b5050600101613a2d565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b4357600080fd5b6005805461ff00191661010017905560095460ff16613b9d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613ba761150c565b90506000613bb6856000614960565b90506000613bc486836148fe565b90506000613bd282856147eb565b905080613c18576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613c223388614c7a565b600554613c3e906201000090046001600160a01b031684614c94565b613c4782614c88565b60005b600a54811015613dbd576000600a8281548110613c6357fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090613c988583614960565b905080613cde576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613cea57fe5b90506020020135811015613d35576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060030154613d5b90826148fe565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151658339815191529281900390910190a3613db2833383614c9e565b505050600101613c4a565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e4d57600080fd5b6005805461ff00191661010017905560095460ff1615613e6c57600080fd5b6006546001600160a01b03163314613e8357600080fd5b670de0b6b3a7640000811115613e9857600080fd5b6702c68af0bb140000811015613ead57600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806000613ed688876147eb565b90506000613eec670de0b6b3a7640000866148fe565b9050613ef88682614960565b90506000613f0a8b610dbc8d85614c2d565b90506000613f188285614b1f565b90506000613f2e670de0b6b3a7640000836148fe565b9050613f3a8b82614960565b9650613f4689856148fe565b95505050505050965096945050505050565b600a670de0b6b3a7640000611522565b671bc16d674ec7ffff81565b600554606090610100900460ff1615613f8c57600080fd5b60095460ff16613f9b57600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561126b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613fd3575050505050905090565b600081565b600554606090610100900460ff1615613f9b57600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561409357600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146140bb57600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166140e057600080fd5b60095460ff16156140f057600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906141178282614960565b600d546001600160a01b0385166000908152600b6020526040902060020154919250614142916148fe565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061417657fe5b600091825260209091200154600a80546001600160a01b03909216918490811061419c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106141dc57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a80548061420f57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561429b8533611a3087876148fe565b600554611a569086906201000090046001600160a01b031685614c9e565b600554600090610100900460ff16156142d157600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143069083614c2d565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206151e5833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146143fc57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561442257600080fd5b60095460ff161561443257600080fd5b600a5460081161444157600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556144ee83838361182c565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561456957600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461459157600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16156145b757600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561460157600080fd5b505afa158015614615573d6000803e3d6000fd5b505050506040513d602081101561462b57600080fd5b505190508082111561463c57600080fd5b614647833384614c9e565b50506005805461ff001916905550565b6002670de0b6b3a7640000611522565b600554600090610100900460ff161561467f57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166146a457600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d546146ce9082906147eb565b9392505050565b600554600090610100900460ff16156146ed57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661471257600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080600061474086896147eb565b9050600061474e88876148fe565b9050600061475c89836147eb565b9050600061476a8285614b1f565b905061477e81670de0b6b3a76400006148fe565b905061478a8c82614960565b905061479e670de0b6b3a7640000886148fe565b95506147aa81876147eb565b95506147be81670de0b6b3a76400006147eb565b94506147ca86866148fe565b945050505050965096945050505050565b600654600160a01b900460ff1690565b60008161482e576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806148565750670de0b6b3a764000084828161485357fe5b04145b61489a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156148e8576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60008482816148f357fe5b049695505050505050565b600080600061490d8585614ee9565b915091508015614958576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b600082820283158061497a57508284828161497757fe5b04145b6149be576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a11576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000826148f3565b600082841015614a6b576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b670de0b6b3a7640000821115614abe576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6000614aca85856148fe565b9050614ad68184614960565b915081811015614958576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60006001831015614b6f576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614bc5576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b6000614bd083614f0e565b90506000614bde84836148fe565b90506000614bf486614bef85614f29565b614f37565b905081614c055792506112c4915050565b6000614c1687846305f5e100614f8e565b9050614c228282614960565b979650505050505050565b6000828201838110156146ce576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b614c84828261506c565b5050565b614c9181615077565b50565b614c8482826150f6565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614cf157600080fd5b505af1158015614d05573d6000803e3d6000fd5b505050506040513d6020811015614d1b57600080fd5b5051905080614d63576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614d8e57600080fd5b6001600160a01b038316600090815260208190526040902054614db190826148fe565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614de09082614c2d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206151c583398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614cf157600080fd5b614c9181615101565b6000670de0b6b3a7640000821115614edf576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6146ce8383614960565b600080828410614eff5750508082036000614f07565b505081810360015b9250929050565b6000670de0b6b3a7640000614f2283614f29565b0292915050565b670de0b6b3a7640000900490565b60008060028306614f5057670de0b6b3a7640000614f52565b835b90506002830492505b82156146ce57614f6b8485614960565b93506002830615614f8357614f808185614960565b90505b600283049250614f5b565b6000828180614fa587670de0b6b3a7640000614ee9565b9092509050670de0b6b3a764000080600060015b88841061505d576000670de0b6b3a764000082029050600080614fed8a614fe885670de0b6b3a76400006148fe565b614ee9565b91509150614fff87611574848c614960565b965061500b87846147eb565b96508661501a5750505061505d565b8715615024579315935b801561502e579315935b84156150455761503e86886148fe565b9550615052565b61504f8688614c2d565b95505b505050600101614fb9565b50909998505050505050505050565b614c84823083614d69565b3060009081526020819052604090205481111561509357600080fd5b306000908152602081905260409020546150ad90826148fe565b306000908152602081905260409020556002546150ca90826148fe565b60025560408051828152905160009130916000805160206151c58339815191529181900360200190a350565b614c84308383614d69565b3060009081526020819052604090205461511b9082614c2d565b306000908152602081905260409020556002546151389082614c2d565b60025560408051828152905130916000916000805160206151c58339815191529181900360200190a35056fe9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f39448856d254ce9f0a13e70882297125673303bfaa163fc49ad146aa8bb55660715a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb64736f6c634300050c0032

Deployed Bytecode Sourcemap

714:26575:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;714:26575:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13638:1305:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13638:1305:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24216:1601:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24216:1601:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2803:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2803:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3389:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3389:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1245:50:1;;;:::i;10890:481:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10890:481:4;;;;;;;;;;:::i;10403:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10403:481:4;;;;;;;;;;:::i;3297:86:5:-;;;:::i;1537:54:1:-;;;:::i;1138:45::-;;;:::i;6692:1342:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6692:1342:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4359:458:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4359:458:5;;;;;;;;;;;;;;;;;:::i;3237:118:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3237:118:4;-1:-1:-1;;;;;3237:118:4;;:::i;4876:131::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4876:131:4;;;;;;;;;;;;;;2981:80:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5013:268:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5013:268:4;;:::i;:::-;;7003:1457;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7003:1457:4;;;;;;;;;;;;;:::i;22379:1831::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22379:1831:4;;;;;;;;;;;;;:::i;5789:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5789:200:4;;;;:::i;5995:358::-;;;:::i;4736:134::-;;;:::i;11377:928::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11377:928:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11377:928:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11377:928:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11377:928:4;;-1:-1:-1;11377:928:4;-1:-1:-1;11377:928:4;:::i;9040:1159:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;9040:1159:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19197:1421:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19197:1421:4;;;;;;;;;;;;;:::i;3829:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3829:388:5;;;;;;;;:::i;20624:1749:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20624:1749:4;;;;;;;;;;;;;:::i;2696:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2696:43:4;-1:-1:-1;;;;;2696:43:4;;:::i;3191:100:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3191:100:5;-1:-1:-1;;;;;3191:100:5;;:::i;876:53:1:-;;;:::i;16275:2915:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;16275:2915:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13415:2854::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;13415:2854:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1301:54:1:-;;;:::i;11305:1227:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11305:1227:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9499:561:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9499:561:4;-1:-1:-1;;;;;9499:561:4;;:::i;3125:106::-;;;:::i;5610:173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5610:173:4;-1:-1:-1;;;;;5610:173:4;;:::i;4008:142::-;;;:::i;1362:51:1:-;;;:::i;1077:54::-;;;:::i;3801:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3801:201:4;-1:-1:-1;;;;;3801:201:4;;:::i;2890:85:5:-;;;:::i;1653:59:1:-;;;:::i;795:117:0:-;;;:::i;1636:494:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:494:2;;;;;;;;;;;;;;;;;;;;;;:::i;4223:130:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4223:130:5;;;;;;;;:::i;25823:475:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25823:475:4;-1:-1:-1;;;;;25823:475:4;;:::i;12311:1097::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12311:1097:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12311:1097:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:1097:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;12311:1097:4;;-1:-1:-1;12311:1097:4;-1:-1:-1;12311:1097:4;:::i;827:42:1:-;;;:::i;5288:316:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5288:316:4;;:::i;779:42:1:-;;;:::i;1420:46::-;;;:::i;3136:749:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3136:749:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;956:50:1:-;;;:::i;1472:59::-;;;:::i;3622:173:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3622:173:4;;;;;;;;;;;;;;;;;1029:42:1;;;:::i;3478:138:4:-;;;:::i;3361:111::-;;;:::i;8466:951::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8466:951:4;-1:-1:-1;;;;;8466:951:4;;:::i;4608:122::-;;;:::i;3575:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3575:248:5;;;;;;;;:::i;3067:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3067:118:5;;;;;;;;;;:::i;6360:637:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6360:637:4;;;;;;;;;;;;;:::i;10066:331::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10066:331:4;;;;;;;;:::i;1598:49:1:-;;;:::i;4156:249:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4156:249:4;-1:-1:-1;;;;;4156:249:4;;:::i;4411:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4411:191:4;-1:-1:-1;;;;;4411:191:4;;:::i;4891:795:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4891:795:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3011:108:4:-;;;:::i;13638:1305:2:-;13904:17;13923:13;14005:21;14029:33;14034:14;14050:11;14029:4;:33::i;:::-;14005:57;;14072:8;14083:43;14088:28;766:6:1;14099:16:2;14088:4;:28::i;:::-;14118:7;14083:4;:43::i;:::-;14072:54;;14136:32;14171:37;14176:14;14192:15;766:6:1;14203:3:2;14192:4;:15::i;:::-;14171:4;:37::i;:::-;14136:72;;14229;14242:27;14271:14;14287:13;14229:12;:72::i;:::-;14218:83;;14312:23;14338:50;14343:15;14360:27;14338:4;:50::i;:::-;14312:76;;14398:18;14419:41;14424:18;14444:15;14419:4;:41::i;:::-;14398:62;;14537:14;14554:37;14559:13;14574:16;14554:4;:37::i;:::-;14537:54;;14601:18;14622:27;14627:9;14638:10;14622:4;:27::i;:::-;14601:48;;14659:29;14691:31;14696:10;14708:13;14691:4;:31::i;:::-;14659:63;;14843:52;14848:24;14874:20;766:6:1;1070:1;14874:4:2;:20::i;14843:52::-;14828:67;-1:-1:-1;;;;;;;;;13638:1305:2;;;;;;;;;;:::o;24216:1601:4:-;24374:17;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;24415:10;;2053:13;24415:10;24407:40;;;;;-1:-1:-1;;;24407:40:4;;;;;;;;;;;;-1:-1:-1;;;24407:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;24465:18:4;;;;;;:8;:18;;;;;:24;;;24457:50;;;;;-1:-1:-1;;;24457:50:4;;;;;;;;;;;;-1:-1:-1;;;24457:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;24548:18:4;;;;;;:8;:18;;;;;:26;;;;;24543:47;;766:6:1;1695:8;;1707:5;1694:18;24543:4:4;:47::i;:::-;24525:14;:65;;24517:95;;;;;-1:-1:-1;;;24517:95:4;;;;;;;;;;;;-1:-1:-1;;;24517:95:4;;;;;;;;;;;;;;;24623:24;24650:8;:18;24659:8;-1:-1:-1;;;;;24650:18:4;-1:-1:-1;;;;;24650:18:4;;;;;;;;;;;;24623:45;;24679:13;24729:353;24783:9;:17;;;24830:9;:16;;;24876:12;;24918;;24960:14;25004:8;;25042:14;;24729:24;:353::i;:::-;24702:380;;-1:-1:-1;24702:380:4;-1:-1:-1;25101:17:4;25093:45;;;;;-1:-1:-1;;;25093:45:4;;;;;;;;;;;;-1:-1:-1;;;25093:45:4;;;;;;;;;;;;;;;25172:15;25156:12;:31;;25148:56;;;;;-1:-1:-1;;;25148:56:4;;;;;;;;;;;;-1:-1:-1;;;25148:56:4;;;;;;;;;;;;;;;25235:55;25240:39;25245:9;:17;;;25264:14;25240:4;:39::i;:::-;25281:8;25235:4;:55::i;:::-;25215:17;;;:75;25301:12;25316:28;25321:12;25301;25316:4;:28::i;:::-;25360:56;;;;;;;;;;;;;;25301:43;;-1:-1:-1;;;;;;25360:56:4;;;25369:10;;-1:-1:-1;;;;;;;;;;;25360:56:4;;;;;;;-1:-1:-1;;;;;25467:32:4;;;;;;:13;:32;;;;;;25462:48;;25501:8;25462:4;:48::i;:::-;-1:-1:-1;;;;;25427:32:4;;;;;;:13;:32;;;;;;;;;:83;;;;25525:45;;;;;;;25427:32;;-1:-1:-1;;;;;;;;;;;25525:45:4;;;;;;;;25581:40;25596:10;25608:12;25581:14;:40::i;:::-;25631:43;25646:27;25651:12;25665:7;25646:4;:27::i;:::-;25631:14;:43::i;:::-;25699:8;;25684:33;;25699:8;;;-1:-1:-1;;;;;25699:8:4;25709:7;25684:14;:33::i;:::-;25727:53;25743:8;25753:10;25765:14;25727:15;:53::i;:::-;-1:-1:-1;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;24216:1601;;-1:-1:-1;;;24216:1601:4:o;2803:81:5:-;2872:5;2865:12;;;;;;;;-1:-1:-1;;2865:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2840:13;;2865:12;;2872:5;;2865:12;;2872:5;2865:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2803:81;:::o;3389:180::-;3474:10;3447:4;3463:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3463:27:5;;;;;;;;;;;:33;;;3511:30;;;;;;;3447:4;;3463:27;;3474:10;;-1:-1:-1;;;;;;;;;;;3511:30:5;;;;;;;-1:-1:-1;3558:4:5;3389:180;;;;;:::o;1245:50:1:-;1286:9;1245:50;:::o;10890:481:4:-;2155:6;;11012:14;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;11050:17:4;;;;;;:8;:17;;;;;:23;;;11042:49;;;;;-1:-1:-1;;;11042:49:4;;;;;;;;;;;;-1:-1:-1;;;11042:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11109:18:4;;;;;;:8;:18;;;;;:24;;;11101:50;;;;;-1:-1:-1;;;11101:50:4;;;;;;;;;;;;-1:-1:-1;;;11101:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11187:17:4;;;11161:23;11187:17;;;:8;:17;;;;;;11241:18;;;;;;;11290:16;;;;;11308:15;;;;;11325:17;;;;11344:16;;;;11241:18;;11276:88;;11290:16;;11308:15;11344:16;11276:13;:88::i;:::-;11269:95;10890:481;-1:-1:-1;;;;;10890:481:4:o;10403:::-;2155:6;;10518:14;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;10556:17:4;;;;;;:8;:17;;;;;:23;;;10548:49;;;;;-1:-1:-1;;;10548:49:4;;;;;;;;;;;;-1:-1:-1;;;10548:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10615:18:4;;;;;;:8;:18;;;;;:24;;;10607:50;;;;;-1:-1:-1;;;10607:50:4;;;;;;;;;;;;-1:-1:-1;;;10607:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10693:17:4;;;10667:23;10693:17;;;:8;:17;;;;;;10747:18;;;;;;;10796:16;;;;;10814:15;;;;;10831:17;;;;10850:16;;;;10868:8;;10782:95;;10814:15;10831:17;10850:16;10782:13;:95::i;3297:86:5:-;3364:12;;3297:86;:::o;1537:54:1:-;1585:6;766;1578:13;;1537:54;:::o;1138:45::-;766:6;1138:45;:::o;6692:1342:2:-;6955:18;6975:13;7248:21;7272:32;7277:13;7292:11;7272:4;:32::i;:::-;7248:56;;7376:8;7387:43;7392:28;766:6:1;7403:16:2;7392:4;:28::i;7387:43::-;7376:54;;7440:26;7469:36;7474:13;7489:15;766:6:1;7500:3:2;7489:4;:15::i;:::-;7469:4;:36::i;:::-;7440:65;;7527;7540:13;7555:21;7578:13;7527:12;:65::i;:::-;7516:76;;7602:22;7627:43;7632:14;7648:21;7627:4;:43::i;:::-;7602:68;;7680:17;7700:39;7705:17;7724:14;7700:4;:39::i;:::-;7680:59;;7817:14;7834:36;7839:12;7853:16;7834:4;:36::i;:::-;7817:53;;7880:18;7901:27;7906:9;7917:10;7901:4;:27::i;:::-;7880:48;;7954:31;7959:13;7974:10;7954:4;:31::i;:::-;7938:47;-1:-1:-1;;;;;;;;6692:1342:2;;;;;;;;;;:::o;4359:458:5:-;4435:4;4459:10;-1:-1:-1;;;;;4459:17:5;;;;:55;;-1:-1:-1;;;;;;4487:15:5;;;;;;:10;:15;;;;;;;;4503:10;4487:27;;;;;;;;4480:34;;;4459:55;4451:64;;;;;;4525:20;4531:3;4536;4541;4525:5;:20::i;:::-;4559:10;-1:-1:-1;;;;;4559:17:5;;;;;;:63;;-1:-1:-1;;;;;;4580:15:5;;;;;;:10;:15;;;;;;;;4596:10;4580:27;;;;;;;;-1:-1:-1;;4580:42:5;;4559:63;4555:235;;;-1:-1:-1;;;;;4673:15:5;;;;;;:10;:15;;;;;;;;4689:10;4673:27;;;;;;;;4668:38;;4702:3;4668:4;:38::i;:::-;-1:-1:-1;;;;;4638:15:5;;;;;;;:10;:15;;;;;;;;4654:10;4638:27;;;;;;;;;;:68;;;4725:54;;;;;;;;;;4654:10;;-1:-1:-1;;;;;;;;;;;4725:54:5;;;;;;;;;4555:235;-1:-1:-1;4806:4:5;4359:458;;;;;:::o;3237:118:4:-;-1:-1:-1;;;;;3331:11:4;3304:4;3331:11;;;:8;:11;;;;;:17;;;;3237:118::o;4876:131::-;2155:6;;4959:7;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4989:11:4;;-1:-1:-1;;;;;4989:11:4;4876:131;:::o;2981:80:5:-;3045:9;;;;2981:80;:::o;5013:268:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5117:10;;2053:13;5117:10;5116:11;5108:20;;;;;;5160:11;;-1:-1:-1;;;;;5160:11:4;5146:10;:25;5138:34;;;;;;917:12:1;5190:18:4;;;5182:27;;;;;;997:9:1;5227:18:4;;;5219:27;;;;;;5256:8;:18;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5013:268::o;7003:1457::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;7143:11;;7129:10;-1:-1:-1;;;;;7143:11:4;;;7129:25;7121:34;;;;;;-1:-1:-1;;;;;7173:15:4;;;;;;:8;:15;;;;;:21;;;7165:30;;;;;;7214:10;;;;7213:11;7205:20;;;;;;766:6:1;7244::4;:20;;7236:29;;;;;;1230:9:1;7283:20:4;;;7275:29;;;;;;1342:13:1;7322:22:4;;;7314:31;;;;;;-1:-1:-1;;;;;7418:15:4;;7401:14;7418:15;;;:8;:15;;;;;:22;;;7454:18;;;7450:275;;;7503:43;7508:12;;7522:23;7527:6;7535:9;7522:4;:23::i;:::-;7503:4;:43::i;:::-;7488:12;:58;;;1286:9:1;-1:-1:-1;7568:32:4;7560:41;;;;;;7450:275;;;7631:9;7622:6;:18;7618:107;;;7671:43;7676:12;;7690:23;7695:9;7706:6;7690:4;:23::i;:::-;7671:4;:43::i;:::-;7656:12;:58;7618:107;-1:-1:-1;;;;;7734:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7856:23;;;;7889:33;;;;7936:20;;;7932:522;;;7972:61;7988:5;7995:10;8007:25;8012:7;8021:10;8007:4;:25::i;:::-;7972:15;:61::i;:::-;7932:522;;;8064:10;8054:7;:20;8050:404;;;8167:26;8196:25;8201:10;8213:7;8196:4;:25::i;:::-;8167:54;;8235:17;8255:37;8260:21;1070:1:1;8255:4:4;:37::i;:::-;8235:57;;8306:77;8322:5;8329:10;8341:41;8346:21;8369:12;8341:4;:41::i;:::-;8306:15;:77::i;:::-;8420:8;;8397:46;;8413:5;;8420:8;;;-1:-1:-1;;;;;8420:8:4;8430:12;8397:15;:46::i;:::-;8050:404;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;;;7003:1457:4:o;22379:1831::-;22529:19;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;22572:10;;2053:13;22572:10;22564:40;;;;;-1:-1:-1;;;22564:40:4;;;;;;;;;;;;-1:-1:-1;;;22564:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;22622:18:4;;;;;;:8;:18;;;;;:24;;;22614:50;;;;;-1:-1:-1;;;22614:50:4;;;;;;;;;;;;-1:-1:-1;;;22614:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;22702:18:4;;22675:24;22702:18;;;:8;:18;;;;;22802:17;;;;22849:16;;;;;22895:12;;22937;;23021:8;;22748:307;;22802:17;22849:16;22895:12;22937;22979;;22748:24;:307::i;:::-;22731:324;;23092:12;23074:14;:30;;23066:56;;;;;-1:-1:-1;;;23066:56:4;;;;;;;;;;;;-1:-1:-1;;;23066:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;23164:18:4;;;;;;:8;:18;;;;;:26;;;;;23159:47;;766:6:1;1695:8;;23159:47:4;23141:14;:65;;23133:95;;;;;-1:-1:-1;;;23133:95:4;;;;;;;;;;;;-1:-1:-1;;;23133:95:4;;;;;;;;;;;;;;;23239:26;23268:188;23306:9;:17;;;23337:9;:16;;;23367:12;;23393;;23419;23445:1;23268:24;:188::i;:::-;23239:217;;23466:13;23482:113;23508:21;23543:14;23571;;23482:12;:113::i;:::-;23466:129;;23626:55;23631:39;23636:9;:17;;;23655:14;23631:4;:39::i;23626:55::-;23606:17;;;:75;23692:12;23707:28;23712:12;23692;23707:4;:28::i;:::-;23751:56;;;;;;;;;;;;;;23692:43;;-1:-1:-1;;;;;;23751:56:4;;;23760:10;;-1:-1:-1;;;;;;;;;;;23751:56:4;;;;;;;-1:-1:-1;;;;;23858:32:4;;;;;;:13;:32;;;;;;23853:48;;23892:8;23853:4;:48::i;:::-;-1:-1:-1;;;;;23818:32:4;;;;;;:13;:32;;;;;;;;;:83;;;;23916:45;;;;;;;23818:32;;-1:-1:-1;;;;;;;;;;;23916:45:4;;;;;;;;23972:40;23987:10;23999:12;23972:14;:40::i;:::-;24022:43;24037:27;24042:12;24056:7;24037:4;:27::i;24022:43::-;24090:8;;24075:33;;24090:8;;;-1:-1:-1;;;;;24090:8:4;24100:7;24075:14;:33::i;:::-;24118:53;24134:8;24144:10;24156:14;24118:15;:53::i;:::-;-1:-1:-1;;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;22379:1831;;-1:-1:-1;;;22379:1831:4:o;5789:200::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5896:10;;2053:13;5896:10;5895:11;5887:20;;;;;;5939:11;;-1:-1:-1;;;;;5939:11:4;5925:10;:25;5917:34;;;;;;5961:11;:21;;;;;-1:-1:-1;;;5961:21:4;-1:-1:-1;;;;5961:21:4;;;;;;;;;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5789:200::o;5995:358::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;6098:11;;6084:10;-1:-1:-1;;;;;6098:11:4;;;6084:25;6076:34;;;;;;6129:10;;;;6128:11;6120:20;;;;;;6158:7;:14;820:1:1;-1:-1:-1;6158:34:4;6150:43;;;;;;6204:10;:17;;-1:-1:-1;;6204:17:4;6217:4;6204:17;;;6231:11;:18;;-1:-1:-1;;;;6231:18:4;-1:-1:-1;;;6231:18:4;;;6260:32;1403:10:1;6260:14:4;:32::i;:::-;6302:44;6317:10;1403::1;6302:14:4;:44::i;:::-;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5995:358::o;4736:134::-;2155:6;;4822:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4849:14:4;;4736:134;:::o;11377:928::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;11514:10;;2053:13;11514:10;11506:40;;;;;-1:-1:-1;;;11506:40:4;;;;;;;;;;;;-1:-1:-1;;;11506:40:4;;;;;;;;;;;;;;;11557:14;11574:13;:11;:13::i;:::-;11557:30;;11597:10;11610:30;11615:13;11630:9;11610:4;:30::i;:::-;11597:43;-1:-1:-1;11658:10:4;11650:38;;;;;-1:-1:-1;;;11650:38:4;;;;;;;;;;;;-1:-1:-1;;;11650:38:4;;;;;;;;;;;;;;;11704:6;11699:510;11720:7;:14;11716:18;;11699:510;;;11755:9;11767:7;11775:1;11767:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11767:10:4;11802:11;;;:8;:11;;;;;;:19;;;11767:10;;-1:-1:-1;11802:19:4;11856:16;11861:5;11802:19;11856:4;:16::i;:::-;11835:37;-1:-1:-1;11894:18:4;11886:46;;;;;-1:-1:-1;;;11886:46:4;;;;;;;;;;;;-1:-1:-1;;;11886:46:4;;;;;;;;;;;;;;;11971:12;;11984:1;11971:15;;;;;;;;;;;;;11954:13;:32;;11946:57;;;;;-1:-1:-1;;;11946:57:4;;;;;;;;;;;;-1:-1:-1;;;11946:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12044:11:4;;;;;;:8;:11;;;;;:19;;;12039:40;;12065:13;12039:4;:40::i;:::-;-1:-1:-1;;;;;12017:11:4;;;;;;:8;:11;;;;;;;;:19;;:62;;;;12098:41;;;;;;;;;;;;;;12017:11;;12107:10;;-1:-1:-1;;;;;;;;;;;12098:41:4;;;;;;;;;12153:45;12169:1;12172:10;12184:13;12153:15;:45::i;:::-;-1:-1:-1;;;11736:3:4;;11699:510;;;;12218:29;12233:13;12218:14;:29::i;:::-;12257:41;12272:10;12284:13;12257:14;:41::i;9040:1159:2:-;9275:18;9309:21;9333:32;9338:13;9353:11;9333:4;:32::i;:::-;9309:56;;9375:18;9396:31;9401:10;9413:13;9396:4;:31::i;:::-;9375:52;;9437:14;9454:31;9459:13;9474:10;9454:4;:31::i;:::-;9437:48;;9554:8;9565:28;766:6:1;9576:16:2;9565:4;:28::i;:::-;9554:39;;9603:17;9623:20;9628:9;9639:3;9623:4;:20::i;:::-;9603:40;;9653:22;9678:34;9683:12;9697:14;9678:4;:34::i;:::-;9653:59;;9722:26;9751:39;9756:17;9775:14;9751:4;:39::i;:::-;9722:68;;10038:8;10049:43;10054:28;766:6:1;10065:16:2;10054:4;:28::i;:::-;10084:7;10049:4;:43::i;:::-;10038:54;;10118:44;10123:21;10146:15;766:6:1;10157:3:2;10146:4;:15::i;10118:44::-;10102:60;9040:1159;-1:-1:-1;;;;;;;;;;;;;;;9040:1159:2:o;19197:1421:4:-;19353:18;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;19396:10;;2053:13;19396:10;19388:40;;;;;-1:-1:-1;;;19388:40:4;;;;;;;;;;;;-1:-1:-1;;;19388:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:17:4;;;;;;:8;:17;;;;;:23;;;19438:49;;;;;-1:-1:-1;;;19438:49:4;;;;;;;;;;;;-1:-1:-1;;;19438:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19527:17:4;;;;;;:8;:17;;;;;:25;;;19522:45;;1646:1:1;766:6;1639:8;;19522:4:4;:45::i;:::-;19505:13;:62;;19497:91;;;;;-1:-1:-1;;;19497:91:4;;;;;;;;;;;;-1:-1:-1;;;19497:91:4;;;;;;;;;;;;;;;19599:23;19625:8;:17;19634:7;-1:-1:-1;;;;;19625:17:4;-1:-1:-1;;;;;19625:17:4;;;;;;;;;;;;19599:43;;19653:13;19704:350;19758:8;:16;;;19804:8;:15;;;19849:12;;19891;;19933:13;19976:8;;20014:14;;19704:24;:350::i;:::-;19676:378;;-1:-1:-1;19676:378:4;-1:-1:-1;20073:33:4;;;;20065:59;;;;;-1:-1:-1;;;20065:59:4;;;;;;;;;;;;-1:-1:-1;;;20065:59:4;;;;;;;;;;;;;;;20154:53;20159:37;20164:8;:16;;;20182:13;20159:4;:37::i;20154:53::-;20135:16;;;:72;20223:54;;;;;;;;;;;;;;-1:-1:-1;;;;;20223:54:4;;;20232:10;;-1:-1:-1;;;;;;;;;;;20223:54:4;;;;;;;;;;-1:-1:-1;;;;;20327:31:4;;;;;;:13;:31;;;;;;20322:47;;20360:8;20322:4;:47::i;:::-;-1:-1:-1;;;;;20288:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;20384:44;;;;;;;20288:31;;-1:-1:-1;;;;;;;;;;;20384:44:4;;;;;;;;20439:29;20454:13;20439:14;:29::i;:::-;20478:41;20493:10;20505:13;20478:14;:41::i;:::-;20529:51;20545:7;20554:10;20566:13;20529:15;:51::i;:::-;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;19197:1421;;-1:-1:-1;;;19197:1421:4:o;3829:388:5:-;3939:10;3896:4;3928:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3928:27:5;;;;;;;;;;3969:14;;;3965:156;;;4010:10;4029:1;3999:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3999:27:5;;;;;;;;;:31;3965:156;;;4091:19;4096:8;4106:3;4091:4;:19::i;:::-;4072:10;4061:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4061:27:5;;;;;;;;;:49;3965:156;4144:10;4161:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4135:54:5;;4161:27;;;;;;;;;;;4135:54;;;;;;;;;4144:10;-1:-1:-1;;;;;;;;;;;4135:54:5;;;;;;;;;;-1:-1:-1;4206:4:5;;3829:388;-1:-1:-1;;;3829:388:5:o;20624:1749:4:-;20774:18;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;20816:10;;2053:13;20816:10;20808:40;;;;;-1:-1:-1;;;20808:40:4;;;;;;;;;;;;-1:-1:-1;;;20808:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;20866:17:4;;;;;;:8;:17;;;;;:23;;;20858:49;;;;;-1:-1:-1;;;20858:49:4;;;;;;;;;;;;-1:-1:-1;;;20858:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;20944:17:4;;20918:23;20944:17;;;:8;:17;;;;;21042:16;;;;21088:15;;;;;21133:12;;21175;;21260:8;;20988:306;;21042:16;21088:15;21133:12;21175;21217:13;;20988:24;:306::i;:::-;20972:322;-1:-1:-1;21313:18:4;21305:46;;;;;-1:-1:-1;;;21305:46:4;;;;;;;;;;;;-1:-1:-1;;;21305:46:4;;;;;;;;;;;;;;;21386:11;21369:13;:28;;21361:53;;;;;-1:-1:-1;;;21361:53:4;;;;;;;;;;;;-1:-1:-1;;;21361:53:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;21455:17:4;;;;;;:8;:17;;;;;:25;;;21450:45;;1646:1:1;766:6;1639:8;;21450:45:4;21433:13;:62;;21425:91;;;;;-1:-1:-1;;;21425:91:4;;;;;;;;;;;;-1:-1:-1;;;21425:91:4;;;;;;;;;;;;;;;21527:25;21555:187;21593:8;:16;;;21623:8;:15;;;21652:12;;21678;;21704:13;21731:1;21555:24;:187::i;:::-;21527:215;;21752:13;21768:111;21794:13;21821:20;21855:14;;21768:12;:111::i;:::-;21752:127;;21909:53;21914:37;21919:8;:16;;;21937:13;21914:4;:37::i;21909:53::-;21890:16;;;:72;21978:54;;;;;;;;;;;;;;-1:-1:-1;;;;;21978:54:4;;;21987:10;;-1:-1:-1;;;;;;;;;;;21978:54:4;;;;;;;;;;-1:-1:-1;;;;;22082:31:4;;;;;;:13;:31;;;;;;22077:47;;22115:8;22077:4;:47::i;:::-;-1:-1:-1;;;;;22043:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;22139:44;;;;;;;22043:31;;-1:-1:-1;;;;;;;;;;;22139:44:4;;;;;;;;22194:29;22209:13;22194:14;:29::i;:::-;22233:41;22248:10;22260:13;22233:14;:41::i;:::-;22284:51;22300:7;22309:10;22321:13;22284:15;:51::i;2696:43::-;;;;;;;;;;;;;:::o;3191:100:5:-;-1:-1:-1;;;;;3270:14:5;3247:4;3270:14;;;;;;;;;;;;3191:100::o;876:53:1:-;924:5;766:6;917:12;;16275:2915:4;1936:39;;;;;;;1966:8;1936:39;;;;;;16502:18;;;;1954:10;;-1:-1:-1;;;;;;1945:7:4;;;;16502:18;;1936:39;;;;;16502:18;1966:8;;16502:18;1936:39;1:33:-1;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;16565:17:4;;2053:13;16565:17;;;:8;:17;;;;;:23;2053:13;16565:23;16557:49;;;;;-1:-1:-1;;;16557:49:4;;;;;;;;;;;;-1:-1:-1;;;16557:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;16624:18:4;;;;;;:8;:18;;;;;:24;;;16616:50;;;;;-1:-1:-1;;;16616:50:4;;;;;;;;;;;;-1:-1:-1;;;16616:50:4;;;;;;;;;;;;;;;16684:11;;-1:-1:-1;;;16684:11:4;;;;16676:43;;;;;-1:-1:-1;;;16676:43:4;;;;;;;;;;;;-1:-1:-1;;;16676:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;16756:26:4;;;16730:23;16756:26;;;:8;:26;;;;;;16819:27;;;;;;;16888:17;;;;;16883:38;;766:6:1;1695:8;;16883:38:4;16865:14;:56;;16857:86;;;;;-1:-1:-1;;;16857:86:4;;;;;;;;;;;;-1:-1:-1;;;16857:86:4;;;;;;;;;;;;;;;16954:20;16977:309;17028:8;:16;;;17082:8;:15;;;17135:9;:17;;;17190:9;:16;;;17244:8;;16977:13;:309::i;:::-;16954:332;;17323:8;17304:15;:27;;17296:59;;;;;-1:-1:-1;;;17296:59:4;;;;;;;;;;;;-1:-1:-1;;;17296:59:4;;;;;;;;;;;;;;;17366:15;17421:418;17481:8;:16;;;17543:8;:15;;;17604:9;:17;;;17667:9;:16;;;17729:14;17789:8;;17421:14;:418::i;:::-;17391:448;;-1:-1:-1;17391:448:4;-1:-1:-1;17857:28:4;;;;17849:53;;;;;-1:-1:-1;;;17849:53:4;;;;;;;;;;;;-1:-1:-1;;;17849:53:4;;;;;;;;;;;;;;;17913:13;17929:81;17962:10;17986:14;;17929:19;:81::i;:::-;17913:97;;18100:53;18105:37;18110:8;:16;;;18128:13;18105:4;:37::i;18100:53::-;18081:8;:16;;:72;;;;18183:39;18188:9;:17;;;18207:14;18183:4;:39::i;:::-;18163:17;;;;:59;;;18297:16;;;18347:15;;;;;18447:16;;;;18497:8;;18250:285;;18163:59;18447:16;18250:13;:285::i;:::-;18233:302;;18571:15;18553:14;:33;;18545:61;;;;;-1:-1:-1;;;18545:61:4;;;;;;;;;;;;-1:-1:-1;;;18545:61:4;;;;;;;;;;;;;;;18642:8;18624:14;:26;;18616:54;;;;;-1:-1:-1;;;18616:54:4;;;;;;;;;;;;-1:-1:-1;;;18616:54:4;;;;;;;;;;;;;;;18707:35;18712:13;18727:14;18707:4;:35::i;:::-;18688:15;:54;;18680:82;;;;;-1:-1:-1;;;18680:82:4;;;;;;;;;;;;-1:-1:-1;;;18680:82:4;;;;;;;;;;;;;;;18778:80;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18778:80:4;;;;;;;;18787:10;;18778:80;;;;;;;;;;-1:-1:-1;;;;;18908:31:4;;;;;;:13;:31;;;;;;18903:47;;18941:8;18903:4;:47::i;:::-;-1:-1:-1;;;;;18869:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;18965:44;;;;;;;18869:31;;-1:-1:-1;;;;;;;;;;;18965:44:4;;;;;;;;19020:51;19036:7;19045:10;19057:13;19020:15;:51::i;:::-;19081:53;19097:8;19107:10;19119:14;19081:15;:53::i;:::-;-1:-1:-1;;;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;16275:2915;;;;-1:-1:-1;16275:2915:4;-1:-1:-1;;;;16275:2915:4:o;13415:2854::-;1936:39;;;;;;;1966:8;1936:39;;;;;;13641:19;;;;1954:10;;-1:-1:-1;;;;;;1945:7:4;;;;13641:19;;1936:39;;;;;13641:19;1966:8;;13641:19;1936:39;1:33:-1;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;13706:17:4;;2053:13;13706:17;;;:8;:17;;;;;:23;2053:13;13706:23;13698:49;;;;;-1:-1:-1;;;13698:49:4;;;;;;;;;;;;-1:-1:-1;;;13698:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13765:18:4;;;;;;:8;:18;;;;;:24;;;13757:50;;;;;-1:-1:-1;;;13757:50:4;;;;;;;;;;;;-1:-1:-1;;;13757:50:4;;;;;;;;;;;;;;;13825:11;;-1:-1:-1;;;13825:11:4;;;;13817:43;;;;;-1:-1:-1;;;13817:43:4;;;;;;;;;;;;-1:-1:-1;;;13817:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13897:26:4;;;13871:23;13897:26;;;:8;:26;;;;;;13960:27;;;;;;;14028:16;;;;14023:36;;1646:1:1;766:6;1639:8;;14023:36:4;14006:13;:53;;13998:82;;;;;-1:-1:-1;;;13998:82:4;;;;;;;;;;;;-1:-1:-1;;;13998:82:4;;;;;;;;;;;;;;;14091:20;14114:309;14165:8;:16;;;14219:8;:15;;;14272:9;:17;;;14327:9;:16;;;14381:8;;14114:13;:309::i;:::-;14091:332;;14460:8;14441:15;:27;;14433:59;;;;;-1:-1:-1;;;14433:59:4;;;;;;;;;;;;-1:-1:-1;;;14433:59:4;;;;;;;;;;;;;;;14503:15;14559:417;14619:8;:16;;;14681:8;:15;;;14742:9;:17;;;14805:9;:16;;;14867:13;14926:8;;14559:14;:417::i;:::-;14528:448;;-1:-1:-1;14528:448:4;-1:-1:-1;14994:30:4;;;;14986:56;;;;;-1:-1:-1;;;14986:56:4;;;;;;;;;;;;-1:-1:-1;;;14986:56:4;;;;;;;;;;;;;;;15053:13;15069:47;15089:10;15101:14;;15069:19;:47::i;:::-;15053:63;;15178:53;15183:37;15188:8;:16;;;15206:13;15183:4;:37::i;15178:53::-;15159:8;:16;;:72;;;;15261:39;15266:9;:17;;;15285:14;15261:4;:39::i;:::-;15241:17;;;;:59;;;15375:16;;;15425:15;;;;;15525:16;;;;15575:8;;15328:285;;15241:59;15525:16;15328:13;:285::i;:::-;15311:302;;15649:15;15631:14;:33;;15623:61;;;;;-1:-1:-1;;;15623:61:4;;;;;;;;;;;;-1:-1:-1;;;15623:61:4;;;;;;;;;;;;;;;15720:8;15702:14;:26;;15694:54;;;;;-1:-1:-1;;;15694:54:4;;;;;;;;;;;;-1:-1:-1;;;15694:54:4;;;;;;;;;;;;;;;15785:35;15790:13;15805:14;15785:4;:35::i;:::-;15766:15;:54;;15758:82;;;;;-1:-1:-1;;;15758:82:4;;;;;;;;;;;;-1:-1:-1;;;15758:82:4;;;;;;;;;;;;;;;15856:80;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15856:80:4;;;;;;;;15865:10;;15856:80;;;;;;;;;;-1:-1:-1;;;;;15986:31:4;;;;;;:13;:31;;;;;;15981:47;;16019:8;15981:4;:47::i;:::-;-1:-1:-1;;;;;15947:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;16043:44;;;;;;;15947:31;;-1:-1:-1;;;;;;;;;;;16043:44:4;;;;;;;;16098:51;16114:7;16123:10;16135:13;16098:15;:51::i;:::-;16159:53;16175:8;16185:10;16197:14;16159:15;:53::i;1301:54:1:-;1349:6;766;1342:13;;11305:1227:2;11541:19;11576:21;11600:33;11605:14;11621:11;11600:4;:33::i;:::-;11576:57;;11738:29;11770:40;11775:12;11789:20;766:6:1;1070:1;11789:4:2;:20::i;11770:40::-;11738:72;;11820:18;11841:42;11846:10;11858:24;11841:4;:42::i;:::-;11820:63;;11893:14;11910:31;11915:13;11930:10;11910:4;:31::i;:::-;11893:48;;12006:18;12027:45;12032:9;12043:28;766:6:1;12054:16:2;12043:4;:28::i;:::-;12027:4;:45::i;:::-;12006:66;;12082:23;12108:36;12113:13;12128:15;12108:4;:36::i;:::-;12082:62;;12155:32;12190:41;12195:15;12212:18;12190:4;:41::i;:::-;12155:76;;12363:8;12374:43;12379:28;766:6:1;12390:16:2;12379:4;:28::i;12374:43::-;12363:54;;12444:50;12449:27;12478:15;766:6:1;12489:3:2;12478:4;:15::i;9499:561:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;9597:15:4;;2053:13;9597:15;;;:8;:15;;;;;:21;2053:13;9597:21;9589:30;;;;;;9649:38;;;-1:-1:-1;;;9649:38:4;;9681:4;9649:38;;;;;;9629:17;;-1:-1:-1;;;;;9649:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9649:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9649:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9649:38:4;-1:-1:-1;;;;;9713:20:4;;9697:13;9713:20;;;:13;9649:38;9713:20;;;;;9649:38;;-1:-1:-1;9960:28:4;9649:38;9713:20;9960:4;:28::i;:::-;-1:-1:-1;;;;;9933:15:4;;;;;;:8;:15;;;;;:23;;;:55;;9925:64;;;;;;10025:28;10030:12;10044:8;10025:4;:28::i;:::-;-1:-1:-1;;;;;9999:15:4;;;;;;;:8;:15;;;;;:23;;:54;;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;9499:561::o;3125:106::-;3214:10;;;;3125:106;:::o;5610:173::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5733:11;;5719:10;-1:-1:-1;;;;;5733:11:4;;;5719:25;5711:34;;;;;;5755:11;:21;;-1:-1:-1;;;;;;5755:21:4;-1:-1:-1;;;;;5755:21:4;;;;;;;;;;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5610:173::o;4008:142::-;2155:6;;4104:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4131:12:4;;4008:142;:::o;1362:51:1:-;1403:10;1362:51;:::o;1077:54::-;1130:1;766:6;1123:8;;3801:201:4;2155:6;;3905:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;3934:15:4;;;;;;:8;:15;;;;;:21;;;3926:30;;;;;;-1:-1:-1;;;;;;3973:15:4;;;;;:8;:15;;;;;:22;;;;3801:201::o;2890:85:5:-;2961:7;2954:14;;;;;;;;-1:-1:-1;;2954:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2929:13;;2954:14;;2961:7;;2954:14;;2961:7;2954:14;;;;;;;;;;;;;;;;;;;;;;;;1653:59:1;1694:18;1653:59;:::o;795:117:0:-;-1:-1:-1;;;795:117:0;:::o;1636:494:2:-;1840:14;1870:10;1883:35;1888:14;1904:13;1883:4;:35::i;:::-;1870:48;;1928:10;1941:37;1946:15;1963:14;1941:4;:37::i;:::-;1928:50;;1988:10;2001:18;2006:5;2013;2001:4;:18::i;:::-;1988:31;;2029:10;2042:31;766:6:1;2053:19:2;766:6:1;2064:7:2;2053:4;:19::i;2042:31::-;2029:44;;2104:18;2109:5;2116;2104:4;:18::i;:::-;2092:30;1636:494;-1:-1:-1;;;;;;;;;;1636:494:2:o;4223:130:5:-;4282:4;4298:27;4304:10;4316:3;4321;4298:5;:27::i;:::-;-1:-1:-1;4342:4:5;4223:130;;;;:::o;25823:475:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;;-1:-1:-1;;2053:13:4;;;;;;;;25959:8;;;-1:-1:-1;;;;;25959:8:4;25945:10;:22;25937:31;;;;;;25984:6;25979:313;26000:7;:14;25996:18;;25979:313;;;26035:9;26047:7;26055:1;26047:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26047:10:4;;;26093:16;;;:13;:16;;;;;;;;26123:20;;;26162:54;;;;;;;26047:10;;-1:-1:-1;26047:10:4;;26162:54;;;;;;;;;;;;;26230:51;26246:1;26249:15;26266:14;26230:15;:51::i;:::-;-1:-1:-1;;26016:3:4;;25979:313;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;25823:475::o;12311:1097::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;12448:10;;2053:13;12448:10;12440:40;;;;;-1:-1:-1;;;12440:40:4;;;;;;;;;;;;-1:-1:-1;;;12440:40:4;;;;;;;;;;;;;;;12491:14;12508:13;:11;:13::i;:::-;12491:30;;12531:12;12546:28;12551:12;1070:1:1;12546:4:4;:28::i;:::-;12531:43;;12584:20;12607:27;12612:12;12626:7;12607:4;:27::i;:::-;12584:50;;12644:10;12657:32;12662:15;12679:9;12657:4;:32::i;:::-;12644:45;-1:-1:-1;12707:10:4;12699:38;;;;;-1:-1:-1;;;12699:38:4;;;;;;;;;;;;-1:-1:-1;;;12699:38:4;;;;;;;;;;;;;;;12748:40;12763:10;12775:12;12748:14;:40::i;:::-;12813:8;;12798:33;;12813:8;;;-1:-1:-1;;;;;12813:8:4;12823:7;12798:14;:33::i;:::-;12841:31;12856:15;12841:14;:31::i;:::-;12888:6;12883:518;12904:7;:14;12900:18;;12883:518;;;12939:9;12951:7;12959:1;12951:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12951:10:4;12986:11;;;:8;:11;;;;;;:19;;;12951:10;;-1:-1:-1;12986:19:4;13041:16;13046:5;12986:19;13041:4;:16::i;:::-;13019:38;-1:-1:-1;13079:19:4;13071:47;;;;;-1:-1:-1;;;13071:47:4;;;;;;;;;;;;-1:-1:-1;;;13071:47:4;;;;;;;;;;;;;;;13158:13;;13172:1;13158:16;;;;;;;;;;;;;13140:14;:34;;13132:60;;;;;-1:-1:-1;;;13132:60:4;;;;;;;;;;;;-1:-1:-1;;;13132:60:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13233:11:4;;;;;;:8;:11;;;;;:19;;;13228:41;;13254:14;13228:4;:41::i;:::-;-1:-1:-1;;;;;13206:11:4;;;;;;:8;:11;;;;;;;;:19;;:63;;;;13288:42;;;;;;;;;;;;;;13206:11;;13297:10;;-1:-1:-1;;;;;;;;;;;13288:42:4;;;;;;;;;13344:46;13360:1;13363:10;13375:14;13344:15;:46::i;:::-;-1:-1:-1;;;12920:3:4;;12883:518;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;;;;;;12311:1097:4:o;827:42:1:-;868:1;827:42;:::o;5288:316:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5404:10;;2053:13;5404:10;5403:11;5395:20;;;;;;5447:11;;-1:-1:-1;;;;;5447:11:4;5433:10;:25;5425:34;;;;;;766:6:1;5477:13:4;:21;;5469:30;;;;;;1123:8:1;5517:39:4;;;5509:48;;;;;;5567:14;:30;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5288:316::o;779:42:1:-;820:1;779:42;:::o;1420:46::-;1461:5;1420:46;:::o;3136:749:2:-;3369:19;3390:15;3421:16;3440:35;3445:13;3460:14;3440:4;:35::i;:::-;3421:54;;3485:15;3503:19;766:6:1;3514:7:2;3503:4;:19::i;:::-;3485:37;;3545:31;3550:13;3565:10;3545:4;:31::i;:::-;3532:44;;3586:6;3595:54;3600:14;3616:32;3621:14;3637:10;3616:4;:32::i;3595:54::-;3586:63;;3659:8;3670:20;3675:1;3678:11;3670:4;:20::i;:::-;3659:31;;3700:8;3711:15;766:6:1;3722:3:2;3711:4;:15::i;:::-;3700:26;;3753;3758:15;3775:3;3753:4;:26::i;:::-;3736:43;;3802:31;3807:13;3822:10;3802:4;:31::i;:::-;3789:44;-1:-1:-1;;;;;;3136:749:2;;;;;;;;;:::o;956:50:1:-;1004:2;766:6;997:9;;1472:59;1513:18;1472:59;:::o;3622:173:4:-;2155:6;;3706:23;;2155:6;;;;;2154:7;2146:16;;;;;;3753:10;;;;3745:19;;;;;;3781:7;3774:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3774:14:4;;;;;;;;;;;;;;;;;;;;;;3622:173;:::o;1029:42:1:-;1070:1;1029:42;:::o;3478:138:4:-;2155:6;;3556:23;;2155:6;;;;;2154:7;2146:16;;;;;3361:111;3451:7;:14;3361:111;:::o;8466:951::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;8581:11;;8567:10;-1:-1:-1;;;;;8581:11:4;;;8567:25;8559:34;;;;;;-1:-1:-1;;;;;8611:15:4;;;;;;:8;:15;;;;;:21;;;8603:30;;;;;;8652:10;;;;8651:11;8643:20;;;;;;-1:-1:-1;;;;;8694:15:4;;8674:17;8694:15;;;:8;:15;;;;;:23;;;;8747:28;8694:23;8674:17;8747:4;:28::i;:::-;8806:12;;-1:-1:-1;;;;;8820:15:4;;;;;;:8;:15;;;;;:22;;;8727:48;;-1:-1:-1;8801:42:4;;:4;:42::i;:::-;8786:12;:57;-1:-1:-1;;;;;8962:15:4;;8949:10;8962:15;;;:8;:15;;;;;:21;;;9005:7;:14;;-1:-1:-1;;9005:18:4;;;:7;:18;;9050:13;;;;;;;;;;;;;;;;9033:7;:14;;-1:-1:-1;;;;;9050:13:4;;;;9041:5;;9033:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;9033:30:4;;;;;-1:-1:-1;;;;;9033:30:4;;;;;;9106:5;9073:8;:24;9082:7;9090:5;9082:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9082:14:4;9073:24;;;;;;;;;;;;9082:14;9073:30;:38;9121:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;9121:13:4;;;;;;;-1:-1:-1;;;;;;9121:13:4;;;;;;;;;9162:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9144:15:4;;;;:8;:15;;;;;;;:131;;;;-1:-1:-1;;9144:131:4;;;;;;;;;-1:-1:-1;9144:131:4;;;;;;;;;;;;;;9286:68;9144:15;9309:10;9321:32;9326:12;9340;9321:4;:32::i;9286:68::-;9387:8;;9364:46;;9380:5;;9387:8;;;-1:-1:-1;;;;;9387:8:4;9397:12;9364:15;:46::i;4608:122::-;2155:6;;4688:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4715:8:4;;4608:122;:::o;3575:248:5:-;3704:10;3642:4;3693:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3693:27:5;;;;;;;;;;3688:38;;3722:3;3688:4;:38::i;:::-;3669:10;3658:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3658:27:5;;;;;;;;;;;;:68;;;3741:54;;;;;;3658:27;;-1:-1:-1;;;;;;;;;;;3741:54:5;;;;;;;;;;-1:-1:-1;3812:4:5;3575:248;;;;:::o;3067:118::-;-1:-1:-1;;;;;3158:15:5;;;3135:4;3158:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3067:118::o;6360:637:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;6563:11;;-1:-1:-1;;;;;6563:11:4;6549:10;:25;6541:34;;;;;;-1:-1:-1;;;;;6594:15:4;;;;;;:8;:15;;;;;:21;;;6593:22;6585:31;;;;;;6635:10;;;;6634:11;6626:20;;;;;;6665:7;:14;868:1:1;-1:-1:-1;6657:42:4;;;;;;6728:193;;;;;;;;6756:4;6728:193;;;6781:7;:14;;6728:193;;;;;;;-1:-1:-1;6728:193:4;;;;;;;;;;;;-1:-1:-1;;;;;6710:15:4;;;;;:8;:15;;;;;;:211;;;;-1:-1:-1;;6710:211:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6931:19:4;;;;;;;-1:-1:-1;;;;;;6931:19:4;;;;;;6960:30;6710:15;6974:7;6983:6;6960;:30::i;:::-;6360:637;;;:::o;10066:331::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;10192:11;;10178:10;-1:-1:-1;;;;;10192:11:4;;;10178:25;10170:34;;;;;;-1:-1:-1;;;;;10223:15:4;;;;;;:8;:15;;;;;:21;;;10222:22;10214:31;;;;;;10267:38;;;-1:-1:-1;;;10267:38:4;;10299:4;10267:38;;;;;;10256:8;;-1:-1:-1;;;;;10267:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;10267:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10267:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10267:38:4;;-1:-1:-1;10323:13:4;;;;10315:22;;;;;;10348:42;10364:5;10371:10;10383:6;10348:15;:42::i;:::-;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;10066:331:4:o;1598:49:1:-;1646:1;766:6;1639:8;;4156:249:4;2155:6;;4258:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;4287:15:4;;;;;;:8;:15;;;;;:21;;;4279:30;;;;;;-1:-1:-1;;;;;4333:15:4;;4319:11;4333:15;;;:8;:15;;;;;:22;;;4385:12;;4372:26;;4333:22;;4372:4;:26::i;:::-;4365:33;4156:249;-1:-1:-1;;;4156:249:4:o;4411:191::-;2155:6;;4504:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;4533:15:4;;;;;;:8;:15;;;;;:21;;;4525:30;;;;;;-1:-1:-1;;;;;;4572:15:4;;;;;:8;:15;;;;;:23;;;;4411:191::o;4891:795:2:-;5125:18;5145:15;5176:16;5195:35;5200:14;5216:13;5195:4;:35::i;:::-;5176:54;;5240:9;5252:37;5257:15;5274:14;5252:4;:37::i;:::-;5240:49;;5299:6;5308:27;5313:15;5330:4;5308;:27::i;:::-;5299:36;;5345:8;5356:20;5361:1;5364:11;5356:4;:20::i;:::-;5345:31;;5392:15;5397:3;766:6:1;5392:4:2;:15::i;:::-;5386:21;;5423:25;5428:14;5444:3;5423:4;:25::i;:::-;5417:31;;5474:19;766:6:1;5485:7:2;5474:4;:19::i;:::-;5458:35;;5519:24;5524:3;5529:13;5519:4;:24::i;:::-;5503:40;;5566:15;5571:3;766:6:1;5566:4:2;:15::i;:::-;5553:28;;5604:31;5609:13;5624:10;5604:4;:31::i;:::-;5591:44;-1:-1:-1;;;;;4891:795:2;;;;;;;;;:::o;3011:108:4:-;3101:11;;-1:-1:-1;;;3101:11:4;;;;;3011:108::o;1856:376:3:-;1925:4;1953:6;1945:31;;;;;-1:-1:-1;;;1945:31:3;;;;;;;;;;;;-1:-1:-1;;;1945:31:3;;;;;;;;;;;;;;;766:6:1;1996:8:3;;2022:6;;;:24;;;766:6:1;2037:1:3;2032:2;:6;;;;;;:14;2022:24;2014:53;;;;;-1:-1:-1;;;2014:53:3;;;;;;;;;;;;-1:-1:-1;;;2014:53:3;;;;;;;;;;;;;;;2114:1;2110:5;;2104:12;;2134:8;;;;2126:37;;;;;-1:-1:-1;;;2126:37:3;;;;;;;;;;;;-1:-1:-1;;;2126:37:3;;;;;;;;;;;;;;;2190:7;2205:1;2200:2;:6;;;;;;;1856:376;-1:-1:-1;;;;;;1856:376:3:o;1128:195::-;1197:4;1218:6;1226:9;1239:14;1248:1;1251;1239:8;:14::i;:::-;1217:36;;;;1272:4;1271:5;1263:35;;;;;-1:-1:-1;;;1263:35:3;;;;;;;;;;;;-1:-1:-1;;;1263:35:3;;;;;;;;;;;;;;;-1:-1:-1;1315:1:3;1128:195;-1:-1:-1;;;1128:195:3:o;1549:301::-;1618:4;1648:5;;;1671:6;;;:21;;;1691:1;1686;1681:2;:6;;;;;;:11;1671:21;1663:50;;;;;-1:-1:-1;;;1663:50:3;;;;;;;;;;;;-1:-1:-1;;;1663:50:3;;;;;;;;;;;;;;;1739:8;1733:15;;1766:8;;;;1758:37;;;;;-1:-1:-1;;;1758:37:3;;;;;;;;;;;;-1:-1:-1;;;1758:37:3;;;;;;;;;;;;;;;1805:7;766:6:1;1815:2:3;:9;;15226:485:2;15350:13;15404:16;15387:13;:33;;15379:61;;;;;-1:-1:-1;;;15379:61:2;;;;;;;;;;;;-1:-1:-1;;;15379:61:2;;;;;;;;;;;;;;;766:6:1;15458:13:2;:21;;15450:53;;;;;-1:-1:-1;;;15450:53:2;;;;;;;;;;;;-1:-1:-1;;;15450:53:2;;;;;;;;;;;;;;;15513:23;15539:37;15544:13;15559:16;15539:4;:37::i;:::-;15513:63;;15597:39;15602:18;15622:13;15597:4;:39::i;:::-;15586:50;;15676:8;15654:18;:30;;15646:58;;;;;-1:-1:-1;;;15646:58:2;;;;;;;;;;;;-1:-1:-1;;;15646:58:2;;;;;;;;;;;;;;2713:534:3;2787:4;1461:5:1;2815:4:3;:21;;2807:55;;;;;-1:-1:-1;;;2807:55:3;;;;;;;;;;;;-1:-1:-1;;;2807:55:3;;;;;;;;;;;;;;;1513:18:1;2880:21:3;;;2872:56;;;;;-1:-1:-1;;;2872:56:3;;;;;;;;;;;;-1:-1:-1;;;2872:56:3;;;;;;;;;;;;;;;2939:10;2953:11;2960:3;2953:6;:11::i;:::-;2939:25;;2974:11;2988:16;2993:3;2998:5;2988:4;:16::i;:::-;2974:30;;3015:13;3031:24;3037:4;3043:11;3048:5;3043:4;:11::i;:::-;3031:5;:24::i;:::-;3015:40;-1:-1:-1;3070:11:3;3066:57;;3104:8;-1:-1:-1;3097:15:3;;-1:-1:-1;;3097:15:3;3066:57;3133:18;3154:40;3165:4;3171:6;1578:13:1;3154:10:3;:40::i;:::-;3133:61;;3211:29;3216:8;3226:13;3211:4;:29::i;:::-;3204:36;2713:534;-1:-1:-1;;;;;;;2713:534:3:o;949:173::-;1018:4;1047:5;;;1070:6;;;;1062:35;;;;;-1:-1:-1;;;1062:35:3;;;;;;;;;;;;-1:-1:-1;;;1062:35:3;;;;;;;;;;;;;;26880:108:4;26962:19;26968:4;26974:6;26962:5;:19::i;:::-;26880:108;;:::o;27198:88::-;27266:13;27272:6;27266:5;:13::i;:::-;27198:88;:::o;26994:104::-;27074:17;27080:2;27084:6;27074:5;:17::i;26683:191::-;26791:34;;;-1:-1:-1;;;26791:34:4;;-1:-1:-1;;;;;26791:34:4;;;;;;;;;;;;;;;26779:9;;26791:22;;;;;:34;;;;;;;;;;;;;;26779:9;26791:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;26791:34:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26791:34:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26791:34:4;;-1:-1:-1;26791:34:4;26835:32;;;;;-1:-1:-1;;;26835:32:4;;;;;;;;;;;;-1:-1:-1;;;26835:32:4;;;;;;;;;;;;;;;26683:191;;;;:::o;2181:244:5:-;-1:-1:-1;;;;;2259:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2259:20:5;2251:29;;;;;;-1:-1:-1;;;;;2311:13:5;;:8;:13;;;;;;;;;;;2306:24;;2326:3;2306:4;:24::i;:::-;-1:-1:-1;;;;;2290:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2361:13;;;;;;;2356:24;;2376:3;2356:4;:24::i;:::-;-1:-1:-1;;;;;2340:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2395:23;;;;;;;2340:13;;2395:23;;;;-1:-1:-1;;;;;;;;;;;2395:23:5;;;;;;;;2181:244;;;:::o;26463:214:4:-;26573:55;;;-1:-1:-1;;;26573:55:4;;-1:-1:-1;;;;;26573:55:4;;;;;;;26614:4;26573:55;;;;;;;;;;;;26561:9;;26573:26;;;;;:55;;;;;;;;;;;;;;26561:9;26573:26;:55;;;5:2:-1;;;;30:1;27;20:12;27104:88:4;27172:13;27178:6;27172:5;:13::i;15717:232:2:-;15815:13;766:6:1;15852:13:2;:21;;15844:53;;;;;-1:-1:-1;;;15844:53:2;;;;;;;;;;;;-1:-1:-1;;;15844:53:2;;;;;;;;;;;;;;;15918:24;15923:3;15928:13;15918:4;:24::i;1329:214:3:-;1402:4;1408;1437:1;1432;:6;1428:109;;-1:-1:-1;;1462:5:3;;;1469;1454:21;;1428:109;-1:-1:-1;;1514:5:3;;;1521:4;1428:109;1329:214;;;;;:::o;832:111::-;895:4;766:6:1;922:7:3;927:1;922:4;:7::i;:::-;:14;;832:111;-1:-1:-1;;832:111:3:o;723:103::-;766:6:1;811:8:3;;;723:103::o;2257:300::-;2327:4;;2360:1;2356;:5;:21;;766:6:1;2356:21:3;;;2369:1;2356:21;2347:30;-1:-1:-1;2398:1:3;2393:6;;;;2388:145;2401:6;;2388:145;;2435:10;2440:1;2443;2435:4;:10::i;:::-;2431:14;-1:-1:-1;2468:1:3;2464;:5;:10;2460:63;;2498:10;2503:1;2506;2498:4;:10::i;:::-;2494:14;;2460:63;2414:1;2409:6;;;;2388:145;;3253:1046;3349:4;3401:3;3349:4;;3437:20;3446:4;766:6:1;3437:8:3;:20::i;:::-;3414:43;;-1:-1:-1;3414:43:3;-1:-1:-1;766:6:1;;3467:9:3;3791:1;3777:495;3802:9;3794:4;:17;3777:495;;3832:9;766:6:1;3844:1:3;:8;3832:20;;3867:6;3875:9;3888:29;3897:1;3900:16;3905:4;766:6:1;3900:4:3;:16::i;:::-;3888:8;:29::i;:::-;3866:51;;;;3938:22;3943:4;3949:10;3954:1;3957;3949:4;:10::i;3938:22::-;3931:29;;3981:16;3986:4;3992;3981;:16::i;:::-;3974:23;-1:-1:-1;4015:9:3;4011:20;;4026:5;;;;;4011:20;4050:4;4046:30;;;4067:9;;;4046:30;4094:4;4090:30;;;4111:9;;;4090:30;4138:8;4134:128;;;4172:15;4177:3;4182:4;4172;:15::i;:::-;4166:21;;4134:128;;;4232:15;4237:3;4242:4;4232;:15::i;:::-;4226:21;;4134:128;-1:-1:-1;;;3813:3:3;;3777:495;;;-1:-1:-1;4289:3:3;;3253:1046;-1:-1:-1;;;;;;;;;3253:1046:3:o;2529:96:5:-;2587:31;2593:4;2607;2614:3;2587:5;:31::i;1912:263::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:39;;;;;;2053:4;2036:8;:23;;;;;;;;;;;2031:34;;2061:3;2031:4;:34::i;:::-;2022:4;2005:8;:23;;;;;;;;;;:60;2095:12;;2090:23;;2109:3;2090:4;:23::i;:::-;2075:12;:38;2128:40;;;;;;;;2160:1;;2145:4;;-1:-1:-1;;;;;;;;;;;2128:40:5;;;;;;;;1912:263;:::o;2431:92::-;2487:29;2501:4;2508:2;2512:3;2487:5;:29::i;1692:214::-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;-1:-1:-1;;;;;;;;;;;1859:40:5;;;;;;;;1692:214;:::o

Swarm Source

bzzr://ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb

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

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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