Contract 0x01DCDB0272CFf6702Ee7b41Fe0e2e76597EAF12D 1

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1bd7c9c3103a5526839badf9dc6bfe4faf5a1540fbe1db40bfaea11aaf3e9d4cTransfer Ownersh...87428242021-06-30 8:18:5584 days 16 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000154675
0x28f81b96dfada6224cb8b34ae4cf4f629a8e93100ede5ab0d428cbe89db68ecfSet Aggregators81427792021-06-09 9:08:59105 days 15 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000736865
0x844254339ed61462be68d5bbb10ad0616cadc6ec8bdf450507e6d4f49c45f551Add Config81427452021-06-09 9:07:17105 days 15 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.00080157
0xbdf3c17e2264034813fb3265dadee64758527734f8c204ae82080592c02e7da6Change Kaptain78845242021-05-31 9:19:38114 days 15 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000154385
0xe1cad4eaefb39a6b5de74b9fbe271bc13aa60c5577e6bbae619d85b909b253daPost Prices78844632021-05-31 9:16:35114 days 15 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000603085
0x0109ad5f3212c3cf2a1f5f439607fe920aa8dac28762e0ef9f7c12bb9e893ed8Post Mcd Price78844502021-05-31 9:15:56114 days 15 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000322775
0xf76cb9666c7c5159cdc1adfdb1738df67d432e3fa4af1fe44447f45987067546Set Aggregators78766402021-05-31 2:44:12114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.001238835
0x98cca44eb0a7c2c0f764b6dd3e4cecd72b58820858e5d53cd63bac8e71646844Add Config78766272021-05-31 2:43:33114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.00080157
0x1452950f24b3145399b9b48c7c83e4f431d01e3b7c44a4e4b2ea041b1f771cbdAdd Config78766212021-05-31 2:43:15114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000801665
0xe161c234643241929bbb2bded9c97940e368f6de5265395554c44f8cc37ef457Remove Config By...78765982021-05-31 2:42:06114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.00040781
0xc939a7c378938902106d4ed507d403a4d73370556d8060e6acb7ab720540ed67Remove Config By...78765782021-05-31 2:41:06114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.00046746
0x7596ed1c54a4fefa3c52c6d6d5efb9b3e9d68f517c31157a36f9f2ba02fd333dPost Prices78757512021-05-31 1:59:45114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.000656155
0xa929254bdb29fe5971001447cb95c163c2fc35719a15c9474f519dc2a425c287Set Aggregators78757442021-05-31 1:59:24114 days 22 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  0x01dcdb0272cff6702ee7b41fe0e2e76597eaf12d0 BNB0.002774075
0xf1ecba1a13b7c9d5c85c52d8c8e32756bb82f06a739f2fddb1b2e371354a019c0x6080604078756302021-05-31 1:53:42114 days 23 hrs ago0xdb098785a082e21b505670b2ebfe5bf2f6a701dd IN  Contract Creation0 BNB0.01809651
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KineOracleV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 8: KineOracleV2.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "./PriceConfig.sol";
import "./IUniswapV2Pair.sol";

/// @title Kine Protocol Oracle V2
/// @author Kine Technology
contract KineOracleV2 is PriceConfig {
    /// @notice The latest mcd update time
    uint public mcdLastUpdatedAt;

    /// @notice The scale constant
    uint public constant priceScale = 1e36;

    /// @notice The kaptain address allowed to operate oracle prices
    address public kaptain;

    /// @notice The symbol hash of the string "MCD"
    bytes32 public constant mcdHash = keccak256(abi.encodePacked("MCD"));

    /// @notice The kaptain prices mapped by symbol hash
    mapping(bytes32 => uint) public prices;

    /// @notice Kaptain post price event
    event PriceUpdated(string symbol, uint price);

    /// @notice The event emitted when Kaptain is updated
    event KaptainUpdated(address fromAddress, address toAddress);

    /// @notice Only kaptain can update kaptain price and mcd price
    modifier onlyKaptain(){
        require(kaptain == _msgSender(), "caller is not Kaptain");
        _;
    }

    constructor(address kaptain_, KTokenConfig[] memory configs) public {
        kaptain = kaptain_;
        for (uint i = 0; i < configs.length; i++) {
            KTokenConfig memory config = configs[i];
            _pushConfig(config);
        }
    }

    /*********************************************************************************************
     * Price controller needs
     * gup = getUnderlyingPrice                          Pr * 1e36
     * Pr = realPricePerToken                 gup  =  ---------------
     * Ub = baseUnit                                        Ub
     *********************************************************************************************/
    /**
     * @notice Get the underlying price of a kToken
     * @param kToken The kToken address for price retrieval
     * @return Price denominated in USD
     */
    function getUnderlyingPrice(address kToken) public view returns (uint){
        KTokenConfig memory config = getKConfigByKToken(kToken);
        uint price;
        if (config.priceSource == PriceSource.CHAINLINK) {
            price = _calcPrice(_getChainlinkPrice(config), config);
        }else if (config.priceSource == PriceSource.KAPTAIN) {
            price = _calcPrice(_getKaptainPrice(config), config);
        }else if (config.priceSource == PriceSource.LP){
            price = _calcLpPrice(config);
        }else{
            revert("invalid price source");
        }

        require(price != 0, "invalid price 0");

        return price;
    }

    /**
     * @notice Get the underlying price with a token symbol
     * @param symbol The token symbol for price retrieval
     * @return Price denominated in USD
     */
    function getUnderlyingPriceBySymbol(string memory symbol) external view returns (uint){
        KTokenConfig memory config = getKConfigBySymbolHash(keccak256(abi.encodePacked(symbol)));
        return getUnderlyingPrice(config.kToken);
    }

    /*********************************************************************************************
     * gup = getUnderlyingPrice
     * Ps = priceFromPriceSource                                  Ps * 1e36
     * Up = priceUnit                                   gup  =  -------------
     * Ub = baseUnit                                                 PM
     * PM = Up * Ub
     *********************************************************************************************/
    /**
     * @notice Calculate the price to fit the price Kine controller needs
     * @param price The price from price source such as chainlink
     * @param config The kToken configuration
     * @return Price denominated in USD
     */
    function _calcPrice(uint price, KTokenConfig memory config) internal pure returns (uint){
        return price.mul(priceScale).div(config.priceMantissa);
    }

    /*********************************************************************************************
     *  Pl = lpPrice
     *  p0 = token0_PriceFromPriceSource
     *  p1 = token1_PriceFromPriceSource
     *  r0 = reserve0                                 2 * sqrt(p0 * r0) * sqrt(p1 * r1) * 1e36
     *  r1 = reserve1                          Pl = --------------------------------------------
     *  PM0 = Token0_PriceMantissa                         totalSupply * sqrt(PM0 * PM1)
     *  PM1 = Token1_PriceMantissa
     *  totalSupply = LP totalSupply
     *  PriceMantissa = priceUnit * baseUnit
     *********************************************************************************************/
    function _calcLpPrice(KTokenConfig memory config) internal view returns (uint){
        uint numerator;
        uint denominator;
        KTokenConfig memory config0;
        KTokenConfig memory config1;

        {
            address token0 = IUniswapV2Pair(config.underlying).token0();
            address token1 = IUniswapV2Pair(config.underlying).token1();
            config0 = getKConfigByUnderlying(token0);
            config1 = getKConfigByUnderlying(token1);
        }

        {
            (uint r0, uint r1, ) = IUniswapV2Pair(config.underlying).getReserves();
            numerator = (_getSourcePrice(config0).mul(r0).sqrt())
                            .mul(_getSourcePrice(config1).mul(r1).sqrt())
                            .mul(2).mul(priceScale);
        }

        {
            uint totalSupply = IUniswapV2Pair(config.underlying).totalSupply();
            uint pmMultiplier = config0.priceMantissa.mul(config1.priceMantissa);
            denominator = totalSupply.mul(pmMultiplier.sqrt());
        }

        return numerator.div(denominator);
    }

    function _getSourcePrice(KTokenConfig memory config) internal view returns (uint){
        if (config.priceSource == PriceSource.CHAINLINK) {
            return _getChainlinkPrice(config);
        }
        if (config.priceSource == PriceSource.KAPTAIN) {
            return _getKaptainPrice(config);
        }

        revert("invalid config");
    }

    function _getChainlinkPrice(KTokenConfig memory config) internal view returns (uint){
        // Check aggregator address
        AggregatorV3Interface agg = aggregators[config.symbolHash];
        require(address(agg) != address(0), "aggregator address not found");
        (, int price, , ,) = agg.latestRoundData();
        return uint(price);
    }

    function _getKaptainPrice(KTokenConfig memory config) internal view returns (uint){
        return prices[config.symbolHash];
    }

    /// @notice Only Kaptain allowed to operate prices
    function postPrices(string[] calldata symbolArray, uint[] calldata priceArray) external onlyKaptain {
        require(symbolArray.length == priceArray.length, "length mismatch");
        // iterate and set
        for (uint i = 0; i < symbolArray.length; i++) {
            KTokenConfig memory config = getKConfigBySymbolHash(keccak256(abi.encodePacked(symbolArray[i])));
            require(config.priceSource == PriceSource.KAPTAIN, "can only post kaptain price");
            require(config.symbolHash != mcdHash, "cannot post mcd price here");
            require(priceArray[i] != 0, "price cannot be 0");
            prices[config.symbolHash] = priceArray[i];
        }
    }

    /// @notice Kaptain call to set the latest mcd price
    function postMcdPrice(uint mcdPrice) external onlyKaptain {
        require(mcdPrice != 0, "MCD price cannot be 0");
        mcdLastUpdatedAt = block.timestamp;
        prices[mcdHash] = mcdPrice;
        emit PriceUpdated("MCD", mcdPrice);
    }

    function changeKaptain(address kaptain_) external onlyOwner {
        require(kaptain != kaptain_, "same kaptain");
        address oldKaptain = kaptain;
        kaptain = kaptain_;
        emit KaptainUpdated(oldKaptain, kaptain);
    }

    function addConfig(address kToken_, address underlying_, bytes32 symbolHash_, uint baseUnit_, uint priceUnit_,
        PriceSource priceSource_) external onlyOwner {
        KTokenConfig memory config = KTokenConfig({
        kToken : kToken_,
        underlying : underlying_,
        symbolHash : symbolHash_,
        baseUnit : baseUnit_,
        priceUnit : priceUnit_,
        priceMantissa: baseUnit_.mul(priceUnit_),
        priceSource : priceSource_
        });

        _pushConfig(config);
    }

    function removeConfigByKToken(address kToken) external onlyOwner {
        KTokenConfig memory configToDelete = _deleteConfigByKToken(kToken);
        // remove all token related information
        delete prices[configToDelete.symbolHash];
    }
}


File 2 of 8: AggregatorV3Interface.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.6.12;

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);
    function description() external view returns (string memory);
    function version() external view returns (uint256);

    // getRoundData and latestRoundData should both raise "No data present"
    // if they do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function getRoundData(uint80 _roundId) external view returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    );

    function latestRoundData() external view returns (
        uint80 roundId,
        int256 answer,
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    );
}

File 3 of 8: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 8: IERC20.sol
//SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 5 of 8: IUniswapV2Pair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.6.12;

// Ref: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/interfaces/IUniswapV2Pair.sol
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
    external
    view
    returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

File 6 of 8: KineMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library KineMath{
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint a, uint b) internal pure returns (uint) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b <= a, errorMessage);
        uint c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint a, uint b) internal pure returns (uint) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint a, uint b) internal pure returns (uint) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint a, uint b) internal pure returns (uint) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b != 0, errorMessage);
        return a % b;
    }

    // implementation from https://github.com/Uniswap/uniswap-lib/commit/99f3f28770640ba1bb1ff460ac7c5292fb8291a0
    // original implementation: https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint x) pure internal returns (uint) {
        if (x == 0) return 0;
        uint xx = x;
        uint r = 1;

        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }

        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint r1 = x / r;
        return (r < r1 ? r : r1);
    }
}

File 7 of 8: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 8 of 8: PriceConfig.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "./Ownable.sol";
import "./AggregatorV3Interface.sol";
import "./KineMath.sol";
import "./IERC20.sol";

contract PriceConfig is Ownable {
    using KineMath for uint;

    enum PriceSource {
        CHAINLINK, // Price from chainlink, priceUnit is aggregator decimals, baseUnit depends on underlying
        KAPTAIN,   // Price posted by kaptain
        LP         // LP baseUnit is 1e18, priceUnit is 1e18
    }

    struct KTokenConfig {
        address kToken;
        address underlying;
        bytes32 symbolHash;
        uint baseUnit;      // baseUnit: underlying decimal
        uint priceUnit;     // priceUnit: price decimal
        uint priceMantissa; // priceMantissa = priceUnit * baseUnit
        PriceSource priceSource;
    }

    // Chainlink aggregator map, bytes32 => AggregatorV3Interface
    mapping(bytes32 => AggregatorV3Interface) public aggregators;

    KTokenConfig[] public kTokenConfigs;

    /// @notice New chainlink aggregator
    event AggregatorUpdated(string symbol, address source);

    /// @notice Configuration added event
    event TokenConfigAdded(address kToken, address underlying, bytes32 symbolHash,
        uint baseUnit, uint priceUnit, uint PriceMantissa, PriceSource priceSource);

    /// @notice Configuration removed event
    event TokenConfigRemoved(address kToken, address underlying, bytes32 symbolHash,
        uint baseUnit, uint priceUnit, uint PriceMantissa, PriceSource priceSource);

    function _pushConfig(KTokenConfig memory config) internal {
        require(config.priceMantissa == config.baseUnit.mul(config.priceUnit), "invalid priceMantissa");

        // check baseUnit
        IERC20 underlying = IERC20(config.underlying);
        uint tokenDecimals = uint(underlying.decimals());
        require(10**tokenDecimals == config.baseUnit, "mismatched baseUnit");

        kTokenConfigs.push(config);
        emit TokenConfigAdded(config.kToken, config.underlying, config.symbolHash,
            config.baseUnit, config.priceUnit, config.priceMantissa, config.priceSource);
    }

    // @dev must be called after you add chainlink sourced config
    function setAggregators(string[] calldata symbols, address[] calldata sources) public onlyOwner {
        require(symbols.length == sources.length, "mismatched input");
        for (uint i = 0; i < symbols.length; i++) {
            KTokenConfig memory config = getKConfigBySymbolHash(keccak256(abi.encodePacked(symbols[i])));
            AggregatorV3Interface agg = AggregatorV3Interface(sources[i]);
            aggregators[config.symbolHash] = agg;
            uint priceDecimals = uint(agg.decimals());
            require(10**priceDecimals == config.priceUnit, "mismatched priceUnit");
            emit AggregatorUpdated(symbols[i], sources[i]);
        }
    }

    function _deleteConfigByKToken(address kToken) internal returns(KTokenConfig memory){
        uint index = getKConfigIndexByKToken(kToken);
        KTokenConfig memory configToDelete = kTokenConfigs[index];
        kTokenConfigs[index] = kTokenConfigs[kTokenConfigs.length - 1];

        // If chainlink price source, remove its aggregator
        if (configToDelete.priceSource == PriceSource.CHAINLINK) {
            delete aggregators[configToDelete.symbolHash];
        }
        kTokenConfigs.pop();

        emit TokenConfigRemoved(configToDelete.kToken, configToDelete.underlying,
            configToDelete.symbolHash, configToDelete.baseUnit, configToDelete.priceUnit,
            configToDelete.priceMantissa, configToDelete.priceSource);

        return configToDelete;
    }

    function getKConfigIndexByKToken(address kToken) public view returns (uint){
        for (uint i = 0; i < kTokenConfigs.length; i++) {
            KTokenConfig memory config = kTokenConfigs[i];
            if (config.kToken == kToken) {
                return i;
            }
        }
        return uint(-1);
    }

    function getKConfigIndexByUnderlying(address underlying) public view returns (uint){
        for (uint i = 0; i < kTokenConfigs.length; i++) {
            KTokenConfig memory config = kTokenConfigs[i];
            if (config.underlying == underlying) {
                return i;
            }
        }
        return uint(-1);
    }

    function getKConfigIndexBySymbolHash(bytes32 symbolHash) public view returns (uint){
        for (uint i = 0; i < kTokenConfigs.length; i++) {
            KTokenConfig memory config = kTokenConfigs[i];
            if (config.symbolHash == symbolHash) {
                return i;
            }
        }
        return uint(-1);
    }

    // if not found should revert
    function getKConfigByKToken(address kToken) public view returns (KTokenConfig memory) {
        uint index = getKConfigIndexByKToken(kToken);
        if (index != uint(-1)) {
            return kTokenConfigs[index];
        }
        revert("token config not found");
    }

    function getKConfigBySymbolHash(bytes32 symbolHash) public view returns (KTokenConfig memory) {
        uint index = getKConfigIndexBySymbolHash(symbolHash);
        if (index != uint(-1)) {
            return kTokenConfigs[index];
        }
        revert("token config not found");
    }

    function getKConfigBySymbol(string memory symbol) external view returns (KTokenConfig memory) {
        return getKConfigBySymbolHash(keccak256(abi.encodePacked(symbol)));
    }

    function getKConfigByUnderlying(address underlying) public view returns (KTokenConfig memory) {
        uint index = getKConfigIndexByUnderlying(underlying);
        if (index != uint(-1)) {
            return kTokenConfigs[index];
        }
        revert("token config not found");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"kaptain_","type":"address"},{"components":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"internalType":"struct PriceConfig.KTokenConfig[]","name":"configs","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"source","type":"address"}],"name":"AggregatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"}],"name":"KaptainUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"kToken","type":"address"},{"indexed":false,"internalType":"address","name":"underlying","type":"address"},{"indexed":false,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"baseUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PriceMantissa","type":"uint256"},{"indexed":false,"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"name":"TokenConfigAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"kToken","type":"address"},{"indexed":false,"internalType":"address","name":"underlying","type":"address"},{"indexed":false,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"baseUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceUnit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PriceMantissa","type":"uint256"},{"indexed":false,"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"name":"TokenConfigRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"kToken_","type":"address"},{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"bytes32","name":"symbolHash_","type":"bytes32"},{"internalType":"uint256","name":"baseUnit_","type":"uint256"},{"internalType":"uint256","name":"priceUnit_","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource_","type":"uint8"}],"name":"addConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"aggregators","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"kaptain_","type":"address"}],"name":"changeKaptain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"kToken","type":"address"}],"name":"getKConfigByKToken","outputs":[{"components":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"internalType":"struct PriceConfig.KTokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getKConfigBySymbol","outputs":[{"components":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"internalType":"struct PriceConfig.KTokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"getKConfigBySymbolHash","outputs":[{"components":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"internalType":"struct PriceConfig.KTokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getKConfigByUnderlying","outputs":[{"components":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"internalType":"struct PriceConfig.KTokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"kToken","type":"address"}],"name":"getKConfigIndexByKToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"getKConfigIndexBySymbolHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getKConfigIndexByUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"kToken","type":"address"}],"name":"getUnderlyingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getUnderlyingPriceBySymbol","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"kTokenConfigs","outputs":[{"internalType":"address","name":"kToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"uint256","name":"priceUnit","type":"uint256"},{"internalType":"uint256","name":"priceMantissa","type":"uint256"},{"internalType":"enum PriceConfig.PriceSource","name":"priceSource","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kaptain","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcdHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcdLastUpdatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mcdPrice","type":"uint256"}],"name":"postMcdPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbolArray","type":"string[]"},{"internalType":"uint256[]","name":"priceArray","type":"uint256[]"}],"name":"postPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"kToken","type":"address"}],"name":"removeConfigByKToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"address[]","name":"sources","type":"address[]"}],"name":"setAggregators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002c7e38038062002c7e8339810160408190526200003491620004f6565b600062000040620000f7565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600480546001600160a01b0319166001600160a01b03841617905560005b8151811015620000ee57620000bc6200041c565b828281518110620000c957fe5b60200260200101519050620000e481620000fb60201b60201c565b50600101620000a8565b5050506200073e565b3390565b6200011d81608001518260600151620003d360201b6200105b1790919060201c565b8160a00151146200014b5760405162461bcd60e51b815260040162000142906200062f565b60405180910390fd5b6000816020015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200019057600080fd5b505afa158015620001a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001cb9190620005bb565b60ff169050826060015181600a0a14620001f95760405162461bcd60e51b81526004016200014290620006a7565b60028054600181810183556000839052855160079092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039485166001600160a01b031991821617825560208901517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180549190961691161790935560408701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082015560608701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad182015560808701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad282015560a08701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad382015560c08701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad4909101805488959293919260ff19909116919084908111156200036c57fe5b021790555050835160208501516040808701516060880151608089015160a08a015160c08b015194517f64fdaae2ed2352d97046ce7576fb46bdbabc03ad7485286c641355b77ad606e59850620003c697969590620005de565b60405180910390a1505050565b600082620003e45750600062000416565b82820282848281620003f257fe5b0414620004135760405162461bcd60e51b8152600401620001429062000666565b90505b92915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b80516001600160a01b03811681146200041657600080fd5b600060e0828403121562000480578081fd5b6200048c60e0620006de565b90506200049a838362000456565b8152620004ab836020840162000456565b602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160038110620004eb57600080fd5b60c082015292915050565b6000806040838503121562000509578182fd5b8251620005168162000725565b602084810151919350906001600160401b0381111562000534578283fd5b8401601f8101861362000545578283fd5b80516200055c620005568262000705565b620006de565b8181528381019083850160e0808502860187018b10156200057b578788fd5b8795505b84861015620005ab57620005948b836200046e565b84526001959095019492860192908101906200057f565b5096999098509650505050505050565b600060208284031215620005cd578081fd5b815160ff8116811462000413578182fd5b6001600160a01b0388811682528716602082015260408101869052606081018590526080810184905260a0810183905260e08101600383106200061d57fe5b8260c083015298975050505050505050565b60208082526015908201527f696e76616c69642070726963654d616e74697373610000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526013908201527f6d69736d6174636865642062617365556e697400000000000000000000000000604082015260600190565b6040518181016001600160401b0381118282101715620006fd57600080fd5b604052919050565b60006001600160401b038211156200071b578081fd5b5060209081020190565b6001600160a01b03811681146200073b57600080fd5b50565b612530806200074e6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80639b233733116100de578063db3b3db111610097578063e8b7c5d211610071578063e8b7c5d214610315578063f2fde38b14610328578063f3f9868b1461033b578063fc57d4df1461034357610173565b8063db3b3db1146102dc578063e130ae62146102ef578063e898a8021461030257610173565b80639b23373314610280578063a0fbddaf14610293578063a5ede0781461029b578063a81796bf146102a3578063bb045821146102b6578063c509ab43146102c957610173565b806360846bc61161013057806360846bc614610217578063676334b31461022a5780637103353e1461023d578063715018a61461025d57806372d29112146102655780638da5cb5b1461027857610173565b80630951c9c3146101785780631cf92e1e146101a157806321632a23146101b657806325f5682a146101cb578063579f1450146101f15780635a31ee4514610204575b600080fd5b61018b610186366004611d7b565b610356565b60405161019891906123df565b60405180910390f35b6101a9610395565b6040516101989190611fa1565b6101c96101c4366004611cfa565b61039b565b005b6101de6101d9366004611d63565b6105b5565b6040516101989796959493929190611f53565b6101a96101ff366004611d7b565b610611565b6101c9610212366004611c59565b610645565b6101a9610225366004611d63565b610709565b6101c9610238366004611c59565b61071b565b61025061024b366004611d63565b610779565b6040516101989190611f25565b6101c9610794565b6101a9610273366004611c59565b610813565b610250610900565b6101c961028e366004611d63565b61090f565b6101a96109de565b6102506109f1565b6101c96102b1366004611c91565b610a00565b6101a96102c4366004611c59565b610ab2565b61018b6102d7366004611c59565b610b95565b61018b6102ea366004611c59565b610c6f565b6101c96102fd366004611cfa565b610c82565b6101a9610310366004611d63565b610dd8565b61018b610323366004611d63565b610ea9565b6101c9610336366004611c59565b610ebc565b6101a9610f72565b6101a9610351366004611c59565b610f9a565b61035e611bbc565b61038d826040516020016103729190611efa565b60405160208183030381529060405280519060200120610ea9565b90505b919050565b60035481565b6103a361109e565b6000546001600160a01b039081169116146103d95760405162461bcd60e51b81526004016103d090612244565b60405180910390fd5b8281146103f85760405162461bcd60e51b81526004016103d0906121a2565b60005b838110156105ae5761040b611bbc565b61043d86868481811061041a57fe5b905060200281019061042c9190612441565b604051602001610372929190611eea565b9050600084848481811061044d57fe5b90506020020160208101906104629190611c59565b60408381015160009081526001602090815282822080546001600160a01b0319166001600160a01b038616908117909155835163313ce56760e01b815293519495509193919263313ce5679260048083019392829003018186803b1580156104c957600080fd5b505afa1580156104dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105019190611ec9565b60ff169050826080015181600a0a1461052c5760405162461bcd60e51b81526004016103d09061232c565b7f74b011dd1d87f5c95503daa2492d016f51e4b3c6a2fe5df050a971898948b66c88888681811061055957fe5b905060200281019061056b9190612441565b88888881811061057757fe5b905060200201602081019061058c9190611c59565b60405161059b93929190611faa565b60405180910390a15050506001016103fb565b5050505050565b600281815481106105c257fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b039586169750949093169491939092919060ff1687565b600061061b611bbc565b61062f836040516020016103729190611efa565b905061063e8160000151610f9a565b9392505050565b61064d61109e565b6000546001600160a01b0390811691161461067a5760405162461bcd60e51b81526004016103d090612244565b6004546001600160a01b03828116911614156106a85760405162461bcd60e51b81526004016103d090612151565b600480546001600160a01b038381166001600160a01b031983161792839055604051918116927f98d4ce1aa09e8bff977cd04baf72bd5c08dc277486f183b7eda48e532c715222926106fd9285921690611f39565b60405180910390a15050565b60056020526000908152604090205481565b61072361109e565b6000546001600160a01b039081169116146107505760405162461bcd60e51b81526004016103d090612244565b610758611bbc565b610761826110a2565b60409081015160009081526005602052908120555050565b6001602052600090815260409020546001600160a01b031681565b61079c61109e565b6000546001600160a01b039081169116146107c95760405162461bcd60e51b81526004016103d090612244565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000805b6002548110156108f657610829611bbc565b6002828154811061083657fe5b60009182526020918290206040805160e081018252600790930290910180546001600160a01b03908116845260018201541693830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a0830152600683015491929160c084019160ff909116908111156108b657fe5b60028111156108c157fe5b815250509050836001600160a01b031681600001516001600160a01b031614156108ed57509050610390565b50600101610817565b5060001992915050565b6000546001600160a01b031690565b61091761109e565b6004546001600160a01b039081169116146109445760405162461bcd60e51b81526004016103d09061235a565b806109615760405162461bcd60e51b81526004016103d0906122b0565b42600381905550806005600060405160200161097c90611f16565b604051602081830303815290604052805190602001208152602001908152602001600020819055507f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f4816040516109d39190612307565b60405180910390a150565b6ec097ce7bc90715b34b9f100000000081565b6004546001600160a01b031681565b610a0861109e565b6000546001600160a01b03908116911614610a355760405162461bcd60e51b81526004016103d090612244565b610a3d611bbc565b6040518060e00160405280886001600160a01b03168152602001876001600160a01b03168152602001868152602001858152602001848152602001610a8b858761105b90919063ffffffff16565b8152602001836002811115610a9c57fe5b90529050610aa981611331565b50505050505050565b6000805b6002548110156108f657610ac8611bbc565b60028281548110610ad557fe5b60009182526020918290206040805160e081018252600790930290910180546001600160a01b03908116845260018201541693830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a0830152600683015491929160c084019160ff90911690811115610b5557fe5b6002811115610b6057fe5b815250509050836001600160a01b031681602001516001600160a01b03161415610b8c57509050610390565b50600101610ab6565b610b9d611bbc565b6000610ba883610813565b90506000198114610c575760028181548110610bc057fe5b60009182526020918290206040805160e081018252600790930290910180546001600160a01b03908116845260018201541693830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a0830152600683015491929160c084019160ff90911690811115610c4057fe5b6002811115610c4b57fe5b81525050915050610390565b60405162461bcd60e51b81526004016103d0906120ea565b610c77611bbc565b6000610ba883610ab2565b610c8a61109e565b6004546001600160a01b03908116911614610cb75760405162461bcd60e51b81526004016103d09061235a565b828114610cd65760405162461bcd60e51b81526004016103d09061201e565b60005b838110156105ae57610ce9611bbc565b610cf886868481811061041a57fe5b905060018160c001516002811115610d0c57fe5b14610d295760405162461bcd60e51b81526004016103d09061211a565b604051602001610d3890611f16565b6040516020818303038152906040528051906020012081604001511415610d715760405162461bcd60e51b81526004016103d0906121cc565b838383818110610d7d57fe5b9050602002013560001415610da45760405162461bcd60e51b81526004016103d090612177565b838383818110610db057fe5b6040938401516000908152600560209081529490209302919091013590915550600101610cd9565b6000805b6002548110156108f657610dee611bbc565b60028281548110610dfb57fe5b60009182526020918290206040805160e081018252600790930290910180546001600160a01b03908116845260018201541693830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a0830152600683015491929160c084019160ff90911690811115610e7b57fe5b6002811115610e8657fe5b8152505090508381604001511415610ea057509050610390565b50600101610ddc565b610eb1611bbc565b6000610ba883610dd8565b610ec461109e565b6000546001600160a01b03908116911614610ef15760405162461bcd60e51b81526004016103d090612244565b6001600160a01b038116610f175760405162461bcd60e51b81526004016103d090612047565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604051602001610f8190611f16565b6040516020818303038152906040528051906020012081565b6000610fa4611bbc565b610fad83610b95565b90506000808260c001516002811115610fc257fe5b1415610fe157610fda610fd4836115e4565b8361169e565b905061103e565b60018260c001516002811115610ff357fe5b141561100557610fda610fd4836116c9565b60028260c00151600281111561101757fe5b141561102657610fda826116de565b60405162461bcd60e51b81526004016103d0906120bc565b8061063e5760405162461bcd60e51b81526004016103d0906123b6565b60008261106a57506000611098565b8282028284828161107757fe5b04146110955760405162461bcd60e51b81526004016103d090612203565b90505b92915050565b3390565b6110aa611bbc565b60006110b583610813565b90506110bf611bbc565b600282815481106110cc57fe5b60009182526020918290206040805160e081018252600790930290910180546001600160a01b03908116845260018201541693830193909352600280840154918301919091526003830154606083015260048301546080830152600583015460a0830152600683015491929160c084019160ff9091169081111561114c57fe5b600281111561115757fe5b9052506002805491925090600019810190811061117057fe5b90600052602060002090600702016002838154811061118b57fe5b60009182526020909120825460079092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180549093169416939093179055600280840154818301556003808501549083015560048085015490830155600580850154908301556006808501549083018054939460ff90921693909260ff199091169190849081111561121f57fe5b02179055506000915061122f9050565b8160c00151600281111561123f57fe5b141561126557604080820151600090815260016020522080546001600160a01b03191690555b600280548061127057fe5b6000828152602080822060076000199094019384020180546001600160a01b03199081168255600182018054909116905560028101839055600381018390556004810183905560058101929092556006909101805460ff1916905591558151908201516040808401516060850151608086015160a087015160c088015194517f0d4daed3ad08e9b5b6db7ad1ee5a0882a45ded7ca7115ea73d49b7d302617e1097611322979096909594939291611f53565b60405180910390a19392505050565b608081015160608201516113449161105b565b8160a00151146113665760405162461bcd60e51b81526004016103d09061208d565b6000816020015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113aa57600080fd5b505afa1580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e29190611ec9565b60ff169050826060015181600a0a1461140d5760405162461bcd60e51b81526004016103d090612389565b60028054600181810183556000839052855160079092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039485166001600160a01b031991821617825560208901517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf840180549190961691161790935560408701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082015560608701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad182015560808701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad282015560a08701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad382015560c08701517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad4909101805488959293919260ff199091169190849081111561157f57fe5b021790555050835160208501516040808701516060880151608089015160a08a015160c08b015194517f64fdaae2ed2352d97046ce7576fb46bdbabc03ad7485286c641355b77ad606e598506115d797969590611f53565b60405180910390a1505050565b60408082015160009081526001602052908120546001600160a01b03168061161e5760405162461bcd60e51b81526004016103d090612279565b6000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561165957600080fd5b505afa15801561166d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116919190611e78565b5091979650505050505050565b60a0810151600090611095906116c3856ec097ce7bc90715b34b9f100000000061105b565b9061199b565b60409081015160009081526005602052205490565b60008060006116eb611bbc565b6116f3611bbc565b600086602001516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561173257600080fd5b505afa158015611746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176a9190611c75565b9050600087602001516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190611c75565b90506117ee82610c6f565b93506117f981610c6f565b9250505060008087602001516001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561183d57600080fd5b505afa158015611851573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118759190611e0c565b506001600160701b031691506001600160701b031691506118d26ec097ce7bc90715b34b9f10000000006118b760026118b76118c26118bd876118b78b6119dd565b9061105b565b611a3f565b6118b76118bd896118b78d6119dd565b95505050600086602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190611e60565b9050600061196c8360a001518560a0015161105b90919063ffffffff16565b905061198161197a82611a3f565b839061105b565b945061199191508590508461199b565b9695505050505050565b600061109583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b85565b6000808260c0015160028111156119f057fe5b1415611a06576119ff826115e4565b9050610390565b60018260c001516002811115611a1857fe5b1415611a27576119ff826116c9565b60405162461bcd60e51b81526004016103d0906122df565b600081611a4e57506000610390565b816001600160801b8210611a675760809190911c9060401b5b680100000000000000008210611a825760409190911c9060201b5b6401000000008210611a995760209190911c9060101b5b620100008210611aae5760109190911c9060081b5b6101008210611ac25760089190911c9060041b5b60108210611ad55760049190911c9060021b5b60088210611ae15760011b5b6001818581611aec57fe5b048201901c90506001818581611afe57fe5b048201901c90506001818581611b1057fe5b048201901c90506001818581611b2257fe5b048201901c90506001818581611b3457fe5b048201901c90506001818581611b4657fe5b048201901c90506001818581611b5857fe5b048201901c90506000818581611b6a57fe5b049050808210611b7a5780611b7c565b815b95945050505050565b60008183611ba65760405162461bcd60e51b81526004016103d09190611feb565b506000838581611bb257fe5b0495945050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b60008083601f840112611c07578182fd5b50813567ffffffffffffffff811115611c1e578182fd5b6020830191508360208083028501011115611c3857600080fd5b9250929050565b805169ffffffffffffffffffff8116811461109857600080fd5b600060208284031215611c6a578081fd5b8135611095816124cd565b600060208284031215611c86578081fd5b8151611095816124cd565b60008060008060008060c08789031215611ca9578182fd5b8635611cb4816124cd565b95506020870135611cc4816124cd565b945060408701359350606087013592506080870135915060a087013560038110611cec578182fd5b809150509295509295509295565b60008060008060408587031215611d0f578384fd5b843567ffffffffffffffff80821115611d26578586fd5b611d3288838901611bf6565b90965094506020870135915080821115611d4a578384fd5b50611d5787828801611bf6565b95989497509550505050565b600060208284031215611d74578081fd5b5035919050565b600060208284031215611d8c578081fd5b813567ffffffffffffffff80821115611da3578283fd5b818401915084601f830112611db6578283fd5b813581811115611dc4578384fd5b604051601f8201601f191681016020018381118282101715611de4578586fd5b604052818152838201602001871015611dfb578485fd5b611991826020830160208701612491565b600080600060608486031215611e20578283fd5b8351611e2b816124e5565b6020850151909350611e3c816124e5565b604085015190925063ffffffff81168114611e55578182fd5b809150509250925092565b600060208284031215611e71578081fd5b5051919050565b600080600080600060a08688031215611e8f578283fd5b611e998787611c3f565b9450602086015193506040860151925060608601519150611ebd8760808801611c3f565b90509295509295909350565b600060208284031215611eda578081fd5b815160ff81168114611095578182fd5b6000828483379101908152919050565b60008251611f0c81846020870161249d565b9190910192915050565b621350d160ea1b815260030190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0388811682528716602082015260408101869052606081018590526080810184905260a0810183905260e08101611f9083612486565b60c083015298975050505050505050565b90815260200190565b6000604082528360408301528385606084013760608483018101919091526001600160a01b03929092166020820152601f909201601f191690910101919050565b600060208252825180602084015261200a81604085016020870161249d565b601f01601f19169190910160400192915050565b6020808252600f908201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b602080825260159082015274696e76616c69642070726963654d616e746973736160581b604082015260600190565b602080825260149082015273696e76616c696420707269636520736f7572636560601b604082015260600190565b6020808252601690820152751d1bdad95b8818dbdb999a59c81b9bdd08199bdd5b9960521b604082015260600190565b6020808252601b908201527f63616e206f6e6c7920706f7374206b61707461696e2070726963650000000000604082015260600190565b6020808252600c908201526b39b0b6b29035b0b83a30b4b760a11b604082015260600190565b602080825260119082015270070726963652063616e6e6f74206265203607c1b604082015260600190565b60208082526010908201526f1b5a5cdb585d18da1959081a5b9c1d5d60821b604082015260600190565b6020808252601a908201527f63616e6e6f7420706f7374206d63642070726963652068657265000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f61676772656761746f722061646472657373206e6f7420666f756e6400000000604082015260600190565b60208082526015908201527404d43442070726963652063616e6e6f74206265203605c1b604082015260600190565b6020808252600e908201526d696e76616c696420636f6e66696760901b604082015260600190565b6040808252600390820152621350d160ea1b6060820152602081019190915260800190565b6020808252601490820152731b5a5cdb585d18da1959081c1c9a58d9555b9a5d60621b604082015260600190565b60208082526015908201527431b0b63632b91034b9903737ba1025b0b83a30b4b760591b604082015260600190565b6020808252601390820152721b5a5cdb585d18da19590818985cd9555b9a5d606a1b604082015260600190565b6020808252600f908201526e0696e76616c6964207072696365203608c1b604082015260600190565b600060e08201905060018060a01b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015261243660c0840151612486565b60c083015292915050565b6000808335601e19843603018112612457578283fd5b83018035915067ffffffffffffffff821115612471578283fd5b602001915036819003821315611c3857600080fd5b806003811061039057fe5b82818337506000910152565b60005b838110156124b85781810151838201526020016124a0565b838111156124c7576000848401525b50505050565b6001600160a01b03811681146124e257600080fd5b50565b6001600160701b03811681146124e257600080fdfea26469706673582212209ace2fa33f44f86fc8184b26520f1f3e8d2f3cfa79791509b6aaac58403aff7a64736f6c634300060c0033000000000000000000000000db098785a082e21b505670b2ebfe5bf2f6a701dd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000004f1ab95b798084e44d512b8b0fed3ef9331779860000000000000000000000004f1ab95b798084e44d512b8b0fed3ef933177986b4e390f51b7b166e80aa2bd4ca6a7efd11d137edbc0329a84b39d48eaf9f084c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ad58bea532f8fe7b7d485230000cd3757d8ae948000000000000000000000000bfa9df9ed8805e657d0feab5d186c6a567752d7feb48ef9150b594762681c5b8a89019528e4a6af2dc81fe0a4cc42c194c8cbda10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ea4c9c6249a05b6abd4aede99a185b03948909e90000000000000000000000009e8e622e0ba0dee491fbc42d1bb12ab947e2d03be7dd417ce0d2c9663d253c6661ea04b9315c5630aac8b872e96a5225abd507d10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000670076f14fb7bc9735af1bc9a1d1ad5266f54fa00000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a8502fd810df171d327e080fb39c734c79b57c20000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9ce98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b055000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b0550000000000000000000000008ff795a6f4d97e7887c79bea79aba5cc76444adfc157673705e9a7d6253fb36c51e0b2c9193b9b560fd6d145bd19ecdf6b3a873b0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8c7b7709dd106e70133474bdf05d9d5a87c871f0000000000000000000000001d2f0da169ceb9fc7b3144628db156f3f6c60dbeaeb724422620edb430dcaf22aeeff2e9388a578c02754cd08699652fb76035c70000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a58e822de1517aae7114714fb354ee853cd357800000000000000000000000004338665cbb7b2485a8855a139b75d5e34ab0db94fdd18b7aa4e2107a72f3310e2403b9bd7ace4a9f01431002607b3b01430ce75d0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab4000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab45d9079ae37aaddb178a8043ea872a326b9a242a4e27cbce4194642203cafea860000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001

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

000000000000000000000000db098785a082e21b505670b2ebfe5bf2f6a701dd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000004f1ab95b798084e44d512b8b0fed3ef9331779860000000000000000000000004f1ab95b798084e44d512b8b0fed3ef933177986b4e390f51b7b166e80aa2bd4ca6a7efd11d137edbc0329a84b39d48eaf9f084c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ad58bea532f8fe7b7d485230000cd3757d8ae948000000000000000000000000bfa9df9ed8805e657d0feab5d186c6a567752d7feb48ef9150b594762681c5b8a89019528e4a6af2dc81fe0a4cc42c194c8cbda10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ea4c9c6249a05b6abd4aede99a185b03948909e90000000000000000000000009e8e622e0ba0dee491fbc42d1bb12ab947e2d03be7dd417ce0d2c9663d253c6661ea04b9315c5630aac8b872e96a5225abd507d10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000670076f14fb7bc9735af1bc9a1d1ad5266f54fa00000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a8502fd810df171d327e080fb39c734c79b57c20000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9ce98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b055000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b0550000000000000000000000008ff795a6f4d97e7887c79bea79aba5cc76444adfc157673705e9a7d6253fb36c51e0b2c9193b9b560fd6d145bd19ecdf6b3a873b0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8c7b7709dd106e70133474bdf05d9d5a87c871f0000000000000000000000001d2f0da169ceb9fc7b3144628db156f3f6c60dbeaeb724422620edb430dcaf22aeeff2e9388a578c02754cd08699652fb76035c70000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a58e822de1517aae7114714fb354ee853cd357800000000000000000000000004338665cbb7b2485a8855a139b75d5e34ab0db94fdd18b7aa4e2107a72f3310e2403b9bd7ace4a9f01431002607b3b01430ce75d0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab4000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab45d9079ae37aaddb178a8043ea872a326b9a242a4e27cbce4194642203cafea860000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : kaptain_ (address): 0xdb098785a082e21b505670b2ebfe5bf2f6a701dd
Arg [1] : configs (tuple[]): System.Object,System.Object,System.Object,System.Object,System.Object,System.Object,System.Object,System.Object,System.Object,System.Object

-----Encoded View---------------
73 Constructor Arguments found :
Arg [0] : 000000000000000000000000db098785a082e21b505670b2ebfe5bf2f6a701dd
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 0000000000000000000000004f1ab95b798084e44d512b8b0fed3ef933177986
Arg [4] : 0000000000000000000000004f1ab95b798084e44d512b8b0fed3ef933177986
Arg [5] : b4e390f51b7b166e80aa2bd4ca6a7efd11d137edbc0329a84b39d48eaf9f084c
Arg [6] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [7] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [8] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000ad58bea532f8fe7b7d485230000cd3757d8ae948
Arg [11] : 000000000000000000000000bfa9df9ed8805e657d0feab5d186c6a567752d7f
Arg [12] : eb48ef9150b594762681c5b8a89019528e4a6af2dc81fe0a4cc42c194c8cbda1
Arg [13] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [14] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [15] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 000000000000000000000000ea4c9c6249a05b6abd4aede99a185b03948909e9
Arg [18] : 0000000000000000000000009e8e622e0ba0dee491fbc42d1bb12ab947e2d03b
Arg [19] : e7dd417ce0d2c9663d253c6661ea04b9315c5630aac8b872e96a5225abd507d1
Arg [20] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [21] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [22] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [24] : 000000000000000000000000670076f14fb7bc9735af1bc9a1d1ad5266f54fa0
Arg [25] : 0000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8
Arg [26] : aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff4
Arg [27] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [28] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [29] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [31] : 0000000000000000000000003a8502fd810df171d327e080fb39c734c79b57c2
Arg [32] : 0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c
Arg [33] : e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [34] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [35] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [36] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 0000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b055
Arg [39] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [40] : 3ed03c38e59dc60c7b69c2a4bf68f9214acd953252b5a90e8f5f59583e9bc3ae
Arg [41] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [42] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [43] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [45] : 0000000000000000000000005fbe4eb536dadbcee54d5b55ed6559e29c60b055
Arg [46] : 0000000000000000000000008ff795a6f4d97e7887c79bea79aba5cc76444adf
Arg [47] : c157673705e9a7d6253fb36c51e0b2c9193b9b560fd6d145bd19ecdf6b3a873b
Arg [48] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [49] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [50] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 000000000000000000000000f8c7b7709dd106e70133474bdf05d9d5a87c871f
Arg [53] : 0000000000000000000000001d2f0da169ceb9fc7b3144628db156f3f6c60dbe
Arg [54] : aeb724422620edb430dcaf22aeeff2e9388a578c02754cd08699652fb76035c7
Arg [55] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [56] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [57] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [59] : 000000000000000000000000a58e822de1517aae7114714fb354ee853cd35780
Arg [60] : 0000000000000000000000004338665cbb7b2485a8855a139b75d5e34ab0db94
Arg [61] : fdd18b7aa4e2107a72f3310e2403b9bd7ace4a9f01431002607b3b01430ce75d
Arg [62] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [63] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [64] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [66] : 000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab4
Arg [67] : 000000000000000000000000d819d96f9d28ea85c1dd78e66d7241134e8d4ab4
Arg [68] : 5d9079ae37aaddb178a8043ea872a326b9a242a4e27cbce4194642203cafea86
Arg [69] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [70] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [71] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed ByteCode Sourcemap

223:8434:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5301:177:7;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;309:28:5;;;:::i;:::-;;;;;;;:::i;2228:666:7:-;;;;;;:::i;:::-;;:::i;:::-;;988:35;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;2842:241:5:-;;;;;;:::i;:::-;;:::i;7654:237::-;;;;;;:::i;:::-;;:::i;706:38::-;;;;;;:::i;:::-;;:::i;8409:246::-;;;;;;:::i;:::-;;:::i;921:60:7:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1701:145:6:-;;;:::i;3692:317:7:-;;;;;;:::i;:::-;;:::i;1078:77:6:-;;;:::i;7402:246:5:-;;;;;;:::i;:::-;;:::i;379:38::-;;;:::i;493:22::-;;;:::i;7897:506::-;;;;;;:::i;:::-;;:::i;4015:333:7:-;;;;;;:::i;:::-;;:::i;4727:273::-;;;;;;:::i;:::-;;:::i;5484:289::-;;;;;;:::i;:::-;;:::i;6659:680:5:-;;;;;;:::i;:::-;;:::i;4354:333:7:-;;;;;;:::i;:::-;;:::i;5006:289::-;;;;;;:::i;:::-;;:::i;1995:240:6:-;;;;;;:::i;:::-;;:::i;574:68:5:-;;;:::i;2004:658::-;;;;;;:::i;:::-;;:::i;5301:177:7:-;5374:19;;:::i;:::-;5412:59;5462:6;5445:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;5435:35;;;;;;5412:22;:59::i;:::-;5405:66;;5301:177;;;;:::o;309:28:5:-;;;;:::o;2228:666:7:-;1292:12:6;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;;;;;;;;;2342:32:7;;::::1;2334:61;;;;-1:-1:-1::0;;;2334:61:7::1;;;;;;;:::i;:::-;2410:6;2405:483;2422:18:::0;;::::1;2405:483;;;2461:26;;:::i;:::-;2490:63;2540:7;;2548:1;2540:10;;;;;;;;;;;;;;;;;;:::i;:::-;2523:28;;;;;;;;;:::i;2490:63::-;2461:92;;2567:25;2617:7;;2625:1;2617:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;2654:17;::::0;;::::1;::::0;2642:30:::1;::::0;;;:11:::1;:30;::::0;;;;;;:36;;-1:-1:-1;;;;;;2642:36:7::1;-1:-1:-1::0;;;;;2642:36:7;::::1;::::0;;::::1;::::0;;;2718:14;;-1:-1:-1;;;2718:14:7;;;;2642:36;;-1:-1:-1;2642:30:7;;:36;;2718:12:::1;::::0;:14:::1;::::0;;::::1;::::0;2642:30;2718:14;;;;;2642:36;2718:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2713:20;;2692:41;;2776:6;:16;;;2759:13;2755:2;:17;:37;2747:70;;;;-1:-1:-1::0;;;2747:70:7::1;;;;;;;:::i;:::-;2836:41;2854:7;;2862:1;2854:10;;;;;;;;;;;;;;;;;;:::i;:::-;2866:7;;2874:1;2866:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;2836:41;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;2442:3:7::1;;2405:483;;;;2228:666:::0;;;;:::o;988:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;988:35:7;;;;-1:-1:-1;988:35:7;;;;;;;;;;;;;;:::o;2842:241:5:-;2923:4;2938:26;;:::i;:::-;2967:59;3017:6;3000:24;;;;;;;;:::i;2967:59::-;2938:88;;3043:33;3062:6;:13;;;3043:18;:33::i;:::-;3036:40;2842:241;-1:-1:-1;;;2842:241:5:o;7654:237::-;1292:12:6;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;7732:7:5::1;::::0;-1:-1:-1;;;;;7732:19:5;;::::1;:7:::0;::::1;:19;;7724:44;;;;-1:-1:-1::0;;;7724:44:5::1;;;;;;;:::i;:::-;7799:7;::::0;;-1:-1:-1;;;;;7816:18:5;;::::1;-1:-1:-1::0;;;;;;7816:18:5;::::1;;::::0;;;;7849:35:::1;::::0;7799:7;;::::1;::::0;7849:35:::1;::::0;::::1;::::0;7799:7;;7876::::1;::::0;7849:35:::1;:::i;:::-;;;;;;;;1351:1:6;7654:237:5::0;:::o;706:38::-;;;;;;;;;;;;;:::o;8409:246::-;1292:12:6;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;8484:34:5::1;;:::i;:::-;8521:29;8543:6;8521:21;:29::i;:::-;8622:25;::::0;;::::1;::::0;8615:33:::1;::::0;;;:6:::1;:33;::::0;;;;8608:40;-1:-1:-1;;8409:246:5:o;921:60:7:-;;;;;;;;;;;;-1:-1:-1;;;;;921:60:7;;:::o;1701:145:6:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;1807:1:::1;1791:6:::0;;1770:40:::1;::::0;-1:-1:-1;;;;;1791:6:6;;::::1;::::0;1770:40:::1;::::0;1807:1;;1770:40:::1;1837:1;1820:19:::0;;-1:-1:-1;;;;;;1820:19:6::1;::::0;;1701:145::o;3692:317:7:-;3762:4;;3777:201;3798:13;:20;3794:24;;3777:201;;;3839:26;;:::i;:::-;3868:13;3882:1;3868:16;;;;;;;;;;;;;;;;;3839:45;;;;;;;;3868:16;;;;;;;3839:45;;-1:-1:-1;;;;;3839:45:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3868:16;3839:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3919:6;-1:-1:-1;;;;;3902:23:7;:6;:13;;;-1:-1:-1;;;;;3902:23:7;;3898:70;;;-1:-1:-1;3952:1:7;-1:-1:-1;3945:8:7;;3898:70;-1:-1:-1;3820:3:7;;3777:201;;;-1:-1:-1;;;3999:2:7;3692:317;-1:-1:-1;;3692:317:7:o;1078:77:6:-;1116:7;1142:6;-1:-1:-1;;;;;1142:6:6;1078:77;:::o;7402:246:5:-;1088:12;:10;:12::i;:::-;1077:7;;-1:-1:-1;;;;;1077:7:5;;;:23;;;1069:57;;;;-1:-1:-1;;;1069:57:5;;;;;;;:::i;:::-;7478:13;7470:47:::1;;;;-1:-1:-1::0;;;7470:47:5::1;;;;;;;:::i;:::-;7546:15;7527:16;:34;;;;7589:8;7571:6;:15;618:23;;;;;;;:::i;:::-;;;;;;;;;;;;;608:34;;;;;;7571:15;;;;;;;;;;;:26;;;;7612:29;7632:8;7612:29;;;;;;:::i;:::-;;;;;;;;7402:246:::0;:::o;379:38::-;413:4;379:38;:::o;493:22::-;;;-1:-1:-1;;;;;493:22:5;;:::o;7897:506::-;1292:12:6;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;8071:26:5::1;;:::i;:::-;8100:266;;;;;;;;8132:7;-1:-1:-1::0;;;;;8100:266:5::1;;;;;8162:11;-1:-1:-1::0;;;;;8100:266:5::1;;;;;8196:11;8100:266;;;;8228:9;8100:266;;;;8259:10;8100:266;;;;8294:25;8308:10;8294:9;:13;;:25;;;;:::i;:::-;8100:266;;;;8343:12;8100:266;;;;;;;;::::0;;8071:295;-1:-1:-1;8377:19:5::1;8071:295:::0;8377:11:::1;:19::i;:::-;1351:1:6;7897:506:5::0;;;;;;:::o;4015:333:7:-;4093:4;;4108:209;4129:13;:20;4125:24;;4108:209;;;4170:26;;:::i;:::-;4199:13;4213:1;4199:16;;;;;;;;;;;;;;;;;4170:45;;;;;;;;4199:16;;;;;;;4170:45;;-1:-1:-1;;;;;4170:45:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4199:16;4170:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4254:10;-1:-1:-1;;;;;4233:31:7;:6;:17;;;-1:-1:-1;;;;;4233:31:7;;4229:78;;;-1:-1:-1;4291:1:7;-1:-1:-1;4284:8:7;;4229:78;-1:-1:-1;4151:3:7;;4108:209;;4727:273;4792:19;;:::i;:::-;4823:10;4836:31;4860:6;4836:23;:31::i;:::-;4823:44;;-1:-1:-1;;4881:5:7;:17;4877:75;;4921:13;4935:5;4921:20;;;;;;;;;;;;;;;;;4914:27;;;;;;;;4921:20;;;;;;;4914:27;;-1:-1:-1;;;;;4914:27:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4921:20;4914:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4877:75;4961:32;;-1:-1:-1;;;4961:32:7;;;;;;;:::i;5484:289::-;5557:19;;:::i;:::-;5588:10;5601:39;5629:10;5601:27;:39::i;6659:680:5:-;1088:12;:10;:12::i;:::-;1077:7;;-1:-1:-1;;;;;1077:7:5;;;:23;;;1069:57;;;;-1:-1:-1;;;1069:57:5;;;;;;;:::i;:::-;6777:39;;::::1;6769:67;;;;-1:-1:-1::0;;;6769:67:5::1;;;;;;;:::i;:::-;6878:6;6873:460;6890:22:::0;;::::1;6873:460;;;6933:26;;:::i;:::-;6962:67;7012:11;;7024:1;7012:14;;;;;;6962:67;6933:96:::0;-1:-1:-1;7073:19:5::1;7051:6;:18;;;:41;;;;;;;;;7043:81;;;;-1:-1:-1::0;;;7043:81:5::1;;;;;;;:::i;:::-;618:23;;;;;;;:::i;:::-;;;;;;;;;;;;;608:34;;;;;;7146:6;:17;;;:28;;7138:67;;;;-1:-1:-1::0;;;7138:67:5::1;;;;;;;:::i;:::-;7227:10;;7238:1;7227:13;;;;;;;;;;;;;7244:1;7227:18;;7219:48;;;;-1:-1:-1::0;;;7219:48:5::1;;;;;;;:::i;:::-;7309:10;;7320:1;7309:13;;;;;;;7288:17;::::0;;::::1;::::0;7281:25:::1;::::0;;;:6:::1;7309:13;7281:25:::0;;;;;;7309:13;::::1;::::0;;;::::1;;7281:41:::0;;;-1:-1:-1;6914:3:5::1;;6873:460;;4354:333:7::0;4432:4;;4447:209;4468:13;:20;4464:24;;4447:209;;;4509:26;;:::i;:::-;4538:13;4552:1;4538:16;;;;;;;;;;;;;;;;;4509:45;;;;;;;;4538:16;;;;;;;4509:45;;-1:-1:-1;;;;;4509:45:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4538:16;4509:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:10;4572:6;:17;;;:31;4568:78;;;-1:-1:-1;4630:1:7;-1:-1:-1;4623:8:7;;4568:78;-1:-1:-1;4490:3:7;;4447:209;;5006:289;5079:19;;:::i;:::-;5110:10;5123:39;5151:10;5123:27;:39::i;1995:240:6:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:6;;;:22;;;1274:67;;;;-1:-1:-1;;;1274:67:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;2083:22:6;::::1;2075:73;;;;-1:-1:-1::0;;;2075:73:6::1;;;;;;;:::i;:::-;2184:6;::::0;;2163:38:::1;::::0;-1:-1:-1;;;;;2163:38:6;;::::1;::::0;2184:6;::::1;::::0;2163:38:::1;::::0;::::1;2211:6;:17:::0;;-1:-1:-1;;;;;;2211:17:6::1;-1:-1:-1::0;;;;;2211:17:6;;;::::1;::::0;;;::::1;::::0;;1995:240::o;574:68:5:-;618:23;;;;;;;:::i;:::-;;;;;;;;;;;;;608:34;;;;;;574:68;:::o;2004:658::-;2069:4;2084:26;;:::i;:::-;2113;2132:6;2113:18;:26::i;:::-;2084:55;-1:-1:-1;2149:10:5;;2173:6;:18;;;:43;;;;;;;;;2169:415;;;2240:46;2251:26;2270:6;2251:18;:26::i;:::-;2279:6;2240:10;:46::i;:::-;2232:54;;2169:415;;;2328:19;2306:6;:18;;;:41;;;;;;;;;2302:282;;;2371:44;2382:24;2399:6;2382:16;:24::i;2302:282::-;2457:14;2435:6;:18;;;:36;;;;;;;;;2431:153;;;2494:20;2507:6;2494:12;:20::i;2431:153::-;2543:30;;-1:-1:-1;;;2543:30:5;;;;;;;:::i;2431:153::-;2602:10;2594:38;;;;-1:-1:-1;;;2594:38:5;;;;;;;:::i;2644:447:4:-;2696:4;2934:6;2930:45;;-1:-1:-1;2963:1:4;2956:8;;2930:45;2994:5;;;2998:1;2994;:5;:1;3017:5;;;;;:10;3009:56;;;;-1:-1:-1;;;3009:56:4;;;;;;;:::i;:::-;3083:1;-1:-1:-1;2644:447:4;;;;;:::o;598:104:1:-;685:10;598:104;:::o;2900:786:7:-;2964:19;;:::i;:::-;2994:10;3007:31;3031:6;3007:23;:31::i;:::-;2994:44;;3048:34;;:::i;:::-;3085:13;3099:5;3085:20;;;;;;;;;;;;;;;;;3048:57;;;;;;;;3085:20;;;;;;;3048:57;;-1:-1:-1;;;;;3048:57:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3085:20;3048:57;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3138:13:7;3152:20;;3048:57;;-1:-1:-1;3138:13:7;-1:-1:-1;;3152:24:7;;;3138:39;;;;;;;;;;;;;;;;3115:13;3129:5;3115:20;;;;;;;;;;;;;;;;:62;;:20;;;;;:62;;-1:-1:-1;;;;;;3115:62:7;;;-1:-1:-1;;;;;3115:62:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;:62;;;;;;;-1:-1:-1;;3115:62:7;;;;;;;;;;;;;;;;;;-1:-1:-1;3282:21:7;;-1:-1:-1;3252:51:7;;-1:-1:-1;3252:51:7;;:14;:26;;;:51;;;;;;;;;3248:127;;;3338:25;;;;;3326:38;;;;:11;:38;;;3319:45;;-1:-1:-1;;;;;;3319:45:7;;;3248:127;3384:13;:19;;;;;;;;;;;;;;;;-1:-1:-1;;3384:19:7;;;;;;;;;-1:-1:-1;;;;;;3384:19:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3384:19:7;;;;;3438:21;;3461:25;;;;3500;;;;;3527:23;;;;3552:24;;;;3590:28;;;;3620:26;;;;3419:228;;;;;;3438:21;;3461:25;;3500;3527:23;3552:24;3590:28;3419:228;:::i;:::-;;;;;;;;3665:14;2900:786;-1:-1:-1;;;2900:786:7:o;1558:598::-;1678:16;;;;1658:15;;;;:37;;:19;:37::i;:::-;1634:6;:20;;;:61;1626:95;;;;-1:-1:-1;;;1626:95:7;;;;;;;:::i;:::-;1758:17;1785:6;:17;;;1758:45;;1813:18;1839:10;-1:-1:-1;;;;;1839:19:7;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1834:27;;1813:48;;1900:6;:15;;;1883:13;1879:2;:17;:36;1871:68;;;;-1:-1:-1;;;1871:68:7;;;;;;;:::i;:::-;1950:13;:26;;;;;;;;-1:-1:-1;1950:26:7;;;;;;;;;;;;;;-1:-1:-1;;;;;1950:26:7;;;-1:-1:-1;;;;;;1950:26:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1969:6;;1950:26;;;;-1:-1:-1;;1950:26:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;2008:13:7;;2023:17;;;;2042;;;;;2073:15;;;;2090:16;;;;2108:20;;;;2130:18;;;;1991:158;;;;-1:-1:-1;1991:158:7;;2008:13;2023:17;2130:18;1991:158;:::i;:::-;;;;;;;;1558:598;;;:::o;6109:352:5:-;6279:17;;;;;6188:4;6267:30;;;:11;:30;;;;;;-1:-1:-1;;;;;6267:30:5;6315:26;6307:67;;;;-1:-1:-1;;;6307:67:5;;;;;;;:::i;:::-;6387:9;6405:3;-1:-1:-1;;;;;6405:19:5;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6384:42:5;;6109:352;-1:-1:-1;;;;;;;6109:352:5:o;3808:159::-;3939:20;;;;3891:4;;3913:47;;:21;:5;413:4;3913:9;:21::i;:::-;:25;;:47::i;6467:131::-;6573:17;;;;;6544:4;6566:25;;;:6;:25;;;;;6467:131::o;4673:1073::-;4746:4;4761:14;4785:16;4811:27;;:::i;:::-;4848;;:::i;:::-;4900:14;4932:6;:17;;;-1:-1:-1;;;;;4917:40:5;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4900:59;;4973:14;5005:6;:17;;;-1:-1:-1;;;;;4990:40:5;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4973:59;;5056:30;5079:6;5056:22;:30::i;:::-;5046:40;;5110:30;5133:6;5110:22;:30::i;:::-;5100:40;;4673:1073;;5176:7;5185;5213:6;:17;;;-1:-1:-1;;;;;5198:45:5;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5175:70;-1:-1:-1;;;;;5175:70:5;;;-1:-1:-1;;;;;5175:70:5;;;5271:167;413:4;5271:151;5420:1;5271:115;5346:39;:32;5375:2;5346:24;5362:7;5346:15;:24::i;:::-;:28;;:32::i;:::-;:37;:39::i;:::-;5272;:32;5301:2;5272:24;5288:7;5272:15;:24::i;5271:167::-;5259:179;;4673:1073;;5473:16;5507:6;:17;;;-1:-1:-1;;;;;5492:45:5;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5473:66;;5553:17;5573:48;5599:7;:21;;;5573:7;:21;;;:25;;:48;;;;:::i;:::-;5553:68;;5649:36;5665:19;:12;:17;:19::i;:::-;5649:11;;:15;:36::i;:::-;5635:50;-1:-1:-1;5713:26:5;;-1:-1:-1;5713:9:5;;-1:-1:-1;5635:50:5;5713:13;:26::i;:::-;5706:33;4673:1073;-1:-1:-1;;;;;;4673:1073:5:o;4231:121:4:-;4283:4;4306:39;4310:1;4313;4306:39;;;;;;;;;;;;;;;;;:3;:39::i;5752:351:5:-;5828:4;;5847:6;:18;;;:43;;;;;;;;;5843:107;;;5913:26;5932:6;5913:18;:26::i;:::-;5906:33;;;;5843:107;5985:19;5963:6;:18;;;:41;;;;;;;;;5959:103;;;6027:24;6044:6;6027:16;:24::i;5959:103::-;6072:24;;-1:-1:-1;;;6072:24:5;;;;;;;:::i;6580:1032:4:-;6625:4;6645:6;6641:20;;-1:-1:-1;6660:1:4;6653:8;;6641:20;6681:1;6701;-1:-1:-1;;;6717:41:4;;6713:104;;6781:3;6774:10;;;;;6804:2;6798:8;6713:104;6836:19;6830:2;:25;6826:87;;6878:2;6871:9;;;;;6900:2;6894:8;6826:87;6932:11;6926:2;:17;6922:79;;6966:2;6959:9;;;;;6988:2;6982:8;6922:79;7020:7;7014:2;:13;7010:74;;7050:2;7043:9;;;;;7072:1;7066:7;7010:74;7103:5;7097:2;:11;7093:71;;7131:1;7124:8;;;;;7152:1;7146:7;7093:71;7183:4;7177:2;:10;7173:70;;7210:1;7203:8;;;;;7231:1;7225:7;7173:70;7262:3;7256:2;:9;7252:47;;7287:1;7281:7;7252:47;7328:1;7322;7318;:5;;;;;;7314:1;:9;7313:16;;7309:20;;7358:1;7352;7348;:5;;;;;;7344:1;:9;7343:16;;7339:20;;7388:1;7382;7378;:5;;;;;;7374:1;:9;7373:16;;7369:20;;7418:1;7412;7408;:5;;;;;;7404:1;:9;7403:16;;7399:20;;7448:1;7442;7438;:5;;;;;;7434:1;:9;7433:16;;7429:20;;7478:1;7472;7468;:5;;;;;;7464:1;:9;7463:16;;7459:20;;7508:1;7502;7498;:5;;;;;;7494:1;:9;7493:16;;7489:20;;7556:7;7570:1;7566;:5;;;;;;7556:15;;7593:2;7589:1;:6;:15;;7602:2;7589:15;;;7598:1;7589:15;7581:24;6580:1032;-1:-1:-1;;;;;6580:1032:4:o;4827:326::-;4907:4;5004:12;4997:5;4989:28;;;;-1:-1:-1;;;4989:28:4;;;;;;;;:::i;:::-;;5027:6;5040:1;5036;:5;;;;;;;4827:326;-1:-1:-1;;;;;4827:326:4:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;301:352::-;;;431:3;424:4;416:6;412:17;408:27;398:2;;-1:-1;;439:12;398:2;-1:-1;469:20;;509:18;498:30;;495:2;;;-1:-1;;531:12;495:2;575:4;567:6;563:17;551:29;;626:3;575:4;;610:6;606:17;567:6;592:32;;589:41;586:2;;;643:1;;633:12;586:2;391:262;;;;;:::o;2882:132::-;2959:13;;35173:22;35162:34;;37365;;37355:2;;37413:1;;37403:12;3158:241;;3262:2;3250:9;3241:7;3237:23;3233:32;3230:2;;;-1:-1;;3268:12;3230:2;85:6;72:20;97:33;124:5;97:33;:::i;3406:263::-;;3521:2;3509:9;3500:7;3496:23;3492:32;3489:2;;;-1:-1;;3527:12;3489:2;226:6;220:13;238:33;265:5;238:33;:::i;3676:901::-;;;;;;;3881:3;3869:9;3860:7;3856:23;3852:33;3849:2;;;-1:-1;;3888:12;3849:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3940:63;-1:-1;4040:2;4079:22;;72:20;97:33;72:20;97:33;:::i;:::-;4048:63;-1:-1;4148:2;4187:22;;1495:20;;-1:-1;4256:2;4295:22;;2532:20;;-1:-1;4364:3;4404:22;;2532:20;;-1:-1;4473:3;4529:22;;1648:20;36663:1;36653:12;;36643:2;;-1:-1;;36669:12;36643:2;4482:79;;;;3843:734;;;;;;;;:::o;4584:702::-;;;;;4787:2;4775:9;4766:7;4762:23;4758:32;4755:2;;;-1:-1;;4793:12;4755:2;4851:17;4838:31;4889:18;;4881:6;4878:30;4875:2;;;-1:-1;;4911:12;4875:2;4949:92;5033:7;5024:6;5013:9;5009:22;4949:92;:::i;:::-;4931:110;;-1:-1;4931:110;-1:-1;5106:2;5091:18;;5078:32;;-1:-1;5119:30;;;5116:2;;;-1:-1;;5152:12;5116:2;;5190:80;5262:7;5253:6;5242:9;5238:22;5190:80;:::i;:::-;4749:537;;;;-1:-1;5172:98;-1:-1;;;;4749:537::o;6002:241::-;;6106:2;6094:9;6085:7;6081:23;6077:32;6074:2;;;-1:-1;;6112:12;6074:2;-1:-1;1495:20;;6068:175;-1:-1;6068:175::o;6250:347::-;;6364:2;6352:9;6343:7;6339:23;6335:32;6332:2;;;-1:-1;;6370:12;6332:2;6428:17;6415:31;6466:18;;6458:6;6455:30;6452:2;;;-1:-1;;6488:12;6452:2;6564:6;6553:9;6549:22;;;1976:3;1969:4;1961:6;1957:17;1953:27;1943:2;;-1:-1;;1984:12;1943:2;2031:6;2018:20;6466:18;33547:6;33544:30;33541:2;;;-1:-1;;33577:12;33541:2;33210;33204:9;33650;33631:17;;-1:-1;;33627:33;33236:17;;6364:2;33236:17;33296:34;;;33332:22;;;33293:62;33290:2;;;-1:-1;;33358:12;33290:2;33210;33377:22;2124:21;;;2224:16;;;6364:2;2224:16;2221:25;-1:-1;2218:2;;;-1:-1;;2249:12;2218:2;2269:41;2303:6;6364:2;2200:5;2196:16;6364:2;2166:6;2162:17;2269:41;:::i;6604:533::-;;;;6752:2;6740:9;6731:7;6727:23;6723:32;6720:2;;;-1:-1;;6758:12;6720:2;2408:6;2402:13;2420:33;2447:5;2420:33;:::i;:::-;6921:2;6971:22;;2402:13;6810:74;;-1:-1;2420:33;2402:13;2420:33;:::i;:::-;7040:2;7089:22;;2820:13;6929:74;;-1:-1;34990:10;34979:22;;37123:34;;37113:2;;-1:-1;;37161:12;37113:2;7048:73;;;;6714:423;;;;;:::o;7392:263::-;;7507:2;7495:9;7486:7;7482:23;7478:32;7475:2;;;-1:-1;;7513:12;7475:2;-1:-1;2680:13;;7469:186;-1:-1;7469:186::o;7662:803::-;;;;;;7842:3;7830:9;7821:7;7817:23;7813:33;7810:2;;;-1:-1;;7849:12;7810:2;7911:63;7966:7;7942:22;7911:63;:::i;:::-;7901:73;;8011:2;8064:9;8060:22;1811:13;8019:73;;8129:2;8183:9;8179:22;2680:13;8137:74;;8248:2;8302:9;8298:22;2680:13;8256:74;;8386:63;8441:7;8367:3;8421:9;8417:22;8386:63;:::i;:::-;8376:73;;7804:661;;;;;;;;:::o;8472:259::-;;8585:2;8573:9;8564:7;8560:23;8556:32;8553:2;;;-1:-1;;8591:12;8553:2;3103:6;3097:13;35084:4;37270:5;35073:16;37247:5;37244:33;37234:2;;-1:-1;;37281:12;19737:295;;35762:6;35757:3;35752;35739:30;35800:16;;35793:27;;;35800:16;19883:149;-1:-1;19883:149::o;20039:275::-;;10895:5;33828:12;11007:52;11052:6;11047:3;11040:4;11033:5;11029:16;11007:52;:::i;:::-;11071:16;;;;;20175:139;-1:-1;;20175:139::o;20321:381::-;-1:-1;;;16737:26;;16722:1;16782:11;;20510:192::o;20709:222::-;-1:-1;;;;;34773:54;;;;8799:37;;20836:2;20821:18;;20807:124::o;20938:333::-;-1:-1;;;;;34773:54;;;8799:37;;34773:54;;21257:2;21242:18;;8799:37;21093:2;21078:18;;21064:207::o;21278:920::-;-1:-1;;;;;34773:54;;;8799:37;;34773:54;;21752:2;21737:18;;8799:37;21835:2;21820:18;;9029:37;;;21918:2;21903:18;;9029:37;;;22001:3;21986:19;;9029:37;;;34784:42;22070:19;;9029:37;;;21587:3;21572:19;;35628:40;9519:5;35628:40;:::i;:::-;22183:3;22172:9;22168:19;9462:64;21558:640;;;;;;;;;;:::o;22205:222::-;9029:37;;;22332:2;22317:18;;22303:124::o;22719:441::-;;22904:2;22925:17;22918:47;33985:6;22904:2;22893:9;22889:18;33973:19;35762:6;35757:3;34013:14;22893:9;34013:14;35739:30;34013:14;35800:16;;;;;35793:27;;;;-1:-1;;;;;34773:54;;;;34022:4;23131:18;;8799:37;33650:9;36179:14;;;-1:-1;;36175:28;9979:39;;;;;;-1:-1;22875:285::o;23167:310::-;;23314:2;23335:17;23328:47;10523:5;33828:12;33985:6;23314:2;23303:9;23299:18;33973:19;10617:52;10662:6;34013:14;23303:9;34013:14;23314:2;10643:5;10639:16;10617:52;:::i;:::-;33650:9;36179:14;-1:-1;;36175:28;10681:39;;;;34013:14;10681:39;;23285:192;-1:-1;;23285:192::o;23484:416::-;23684:2;23698:47;;;11324:2;23669:18;;;33973:19;-1:-1;;;34013:14;;;11340:38;11397:12;;;23655:245::o;23907:416::-;24107:2;24121:47;;;11648:2;24092:18;;;33973:19;11684:34;34013:14;;;11664:55;-1:-1;;;11739:12;;;11732:30;11781:12;;;24078:245::o;24330:416::-;24530:2;24544:47;;;12032:2;24515:18;;;33973:19;-1:-1;;;34013:14;;;12048:44;12111:12;;;24501:245::o;24753:416::-;24953:2;24967:47;;;12362:2;24938:18;;;33973:19;-1:-1;;;34013:14;;;12378:43;12440:12;;;24924:245::o;25176:416::-;25376:2;25390:47;;;12691:2;25361:18;;;33973:19;-1:-1;;;34013:14;;;12707:45;12771:12;;;25347:245::o;25599:416::-;25799:2;25813:47;;;13022:2;25784:18;;;33973:19;13058:29;34013:14;;;13038:50;13107:12;;;25770:245::o;26022:416::-;26222:2;26236:47;;;13358:2;26207:18;;;33973:19;-1:-1;;;34013:14;;;13374:35;13428:12;;;26193:245::o;26445:416::-;26645:2;26659:47;;;13679:2;26630:18;;;33973:19;-1:-1;;;34013:14;;;13695:40;13754:12;;;26616:245::o;26868:416::-;27068:2;27082:47;;;14005:2;27053:18;;;33973:19;-1:-1;;;34013:14;;;14021:39;14079:12;;;27039:245::o;27291:416::-;27491:2;27505:47;;;14330:2;27476:18;;;33973:19;14366:28;34013:14;;;14346:49;14414:12;;;27462:245::o;27714:416::-;27914:2;27928:47;;;14665:2;27899:18;;;33973:19;14701:34;34013:14;;;14681:55;-1:-1;;;14756:12;;;14749:25;14793:12;;;27885:245::o;28137:416::-;28337:2;28351:47;;;28322:18;;;33973:19;15080:34;34013:14;;;15060:55;15134:12;;;28308:245::o;28560:416::-;28760:2;28774:47;;;15385:2;28745:18;;;33973:19;15421:30;34013:14;;;15401:51;15471:12;;;28731:245::o;28983:416::-;29183:2;29197:47;;;15722:2;29168:18;;;33973:19;-1:-1;;;34013:14;;;15738:44;15801:12;;;29154:245::o;29406:416::-;29606:2;29620:47;;;16052:2;29591:18;;;33973:19;-1:-1;;;34013:14;;;16068:37;16124:12;;;29577:245::o;29829:527::-;30057:2;30071:47;;;16375:1;30042:18;;;33973:19;-1:-1;;;34013:14;;;16390:26;34022:4;30327:18;;9029:37;;;;16435:12;;;30028:328::o;30363:416::-;30563:2;30577:47;;;17032:2;30548:18;;;33973:19;-1:-1;;;34013:14;;;17048:43;17110:12;;;30534:245::o;30786:416::-;30986:2;31000:47;;;17361:2;30971:18;;;33973:19;-1:-1;;;34013:14;;;17377:44;17440:12;;;30957:245::o;31209:416::-;31409:2;31423:47;;;17691:2;31394:18;;;33973:19;-1:-1;;;34013:14;;;17707:42;17768:12;;;31380:245::o;31632:416::-;31832:2;31846:47;;;18019:2;31817:18;;;33973:19;-1:-1;;;34013:14;;;18035:38;18092:12;;;31803:245::o;32055:343::-;;32242:3;32231:9;32227:19;32219:27;;509:18;;34784:42;;;;18418:16;18412:23;34773:54;8806:3;8799:37;34784:42;18589:4;18582:5;18578:16;18572:23;34773:54;18589:4;18653:3;18649:14;8799:37;;18749:4;18742:5;18738:16;18732:23;18749:4;18813:3;18809:14;9029:37;18907:4;18900:5;18896:16;18890:23;18907:4;18971:3;18967:14;9029:37;19066:4;19059:5;19055:16;19049:23;19066:4;19130:3;19126:14;9029:37;19229:4;19222:5;19218:16;19212:23;19229:4;19293:3;19289:14;9029:37;35628:40;19390:4;19383:5;19379:16;19373:23;35628:40;:::i;:::-;19390:4;19468:3;19464:14;9462:64;32213:185;;;;:::o;32634:507::-;;;32770:11;32757:25;32821:48;;32845:8;32829:14;32825:29;32821:48;32801:18;32797:73;32787:2;;-1:-1;;32874:12;32787:2;32901:33;;32955:18;;;-1:-1;32993:18;32982:30;;32979:2;;;-1:-1;;33015:12;32979:2;32860:4;33043:13;;-1:-1;32829:14;33075:38;;;33065:49;;33062:2;;;33127:1;;33117:12;34372:138;34439:16;36301:1;36291:12;;36281:2;;36307:9;35681:145;35762:6;35757:3;35752;35739:30;-1:-1;35818:1;35800:16;;35793:27;35732:94::o;35835:268::-;35900:1;35907:101;35921:6;35918:1;35915:13;35907:101;;;35988:11;;;35982:18;35969:11;;;35962:39;35943:2;35936:10;35907:101;;;36023:6;36020:1;36017:13;36014:2;;;35900:1;36079:6;36074:3;36070:16;36063:27;36014:2;;35884:219;;;:::o;36330:117::-;-1:-1;;;;;34773:54;;36389:35;;36379:2;;36438:1;;36428:12;36379:2;36373:74;:::o;36817:117::-;-1:-1;;;;;36904:5;34657:42;36879:5;36876:35;36866:2;;36925:1;;36915:12

Swarm Source

ipfs://9ace2fa33f44f86fc8184b26520f1f3e8d2f3cfa79791509b6aaac58403aff7a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.