ETH Price: $1,648.28 (+2.69%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Result117247422021-01-25 12:06:511546 days ago1611576411IN
0xcA8A1a8E...14169E7d4
0 ETH0.0192162868.76
Update Result117241392021-01-25 9:52:041546 days ago1611568324IN
0xcA8A1a8E...14169E7d4
0 ETH0.026223685
Update Result117235182021-01-25 7:37:121546 days ago1611560232IN
0xcA8A1a8E...14169E7d4
0 ETH0.0216737773
Update Result117229832021-01-25 5:36:331547 days ago1611552993IN
0xcA8A1a8E...14169E7d4
0 ETH0.0221921272
Update Result117223482021-01-25 3:22:131547 days ago1611544933IN
0xcA8A1a8E...14169E7d4
0 ETH0.03761833122
Update Result117217572021-01-25 1:07:111547 days ago1611536831IN
0xcA8A1a8E...14169E7d4
0 ETH0.03857464130
Update Result117211652021-01-24 22:51:581547 days ago1611528718IN
0xcA8A1a8E...14169E7d4
0 ETH0.0270397987.9
Update Result117205492021-01-24 20:45:221547 days ago1611521122IN
0xcA8A1a8E...14169E7d4
0 ETH0.0306319999.4
Update Result117199292021-01-24 18:21:341547 days ago1611512494IN
0xcA8A1a8E...14169E7d4
0 ETH0.03189213107.5
Update Result117193982021-01-24 16:21:311547 days ago1611505291IN
0xcA8A1a8E...14169E7d4
0 ETH0.03100411110.989
Update Result117187662021-01-24 14:06:351547 days ago1611497195IN
0xcA8A1a8E...14169E7d4
0 ETH0.0156502656
Update Result117181492021-01-24 11:51:361547 days ago1611489096IN
0xcA8A1a8E...14169E7d4
0 ETH0.0164880859
Update Result117175452021-01-24 9:36:381547 days ago1611480998IN
0xcA8A1a8E...14169E7d4
0 ETH0.0186902763
Update Result117170202021-01-24 7:36:171547 days ago1611473777IN
0xcA8A1a8E...14169E7d4
0 ETH0.0183864762
Update Result117165062021-01-24 5:36:301548 days ago1611466590IN
0xcA8A1a8E...14169E7d4
0 ETH0.015708351.00000156
Update Result117159002021-01-24 3:22:131548 days ago1611458533IN
0xcA8A1a8E...14169E7d4
0 ETH0.0160486552.00000145
Update Result117152822021-01-24 1:06:371548 days ago1611450397IN
0xcA8A1a8E...14169E7d4
0 ETH0.0132491143.00000145
Update Result117146612021-01-23 22:51:381548 days ago1611442298IN
0xcA8A1a8E...14169E7d4
0 ETH0.0201210472
Update Result117140452021-01-23 20:37:221548 days ago1611434242IN
0xcA8A1a8E...14169E7d4
0 ETH0.015708251
Update Result117134112021-01-23 18:21:371548 days ago1611426097IN
0xcA8A1a8E...14169E7d4
0 ETH0.0196300463.7
Update Result117128052021-01-23 16:06:371548 days ago1611417997IN
0xcA8A1a8E...14169E7d4
0 ETH0.0190038968
Update Result117122122021-01-23 13:51:381548 days ago1611409898IN
0xcA8A1a8E...14169E7d4
0 ETH0.0187244267.0000016
Update Result117115662021-01-23 11:36:371548 days ago1611401797IN
0xcA8A1a8E...14169E7d4
0 ETH0.0190956262
Update Result117109832021-01-23 9:25:391548 days ago1611393939IN
0xcA8A1a8E...14169E7d4
0 ETH0.0170610261.00000145
Update Result117103782021-01-23 7:06:491548 days ago1611385609IN
0xcA8A1a8E...14169E7d4
0 ETH0.0228447774.2
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapConsecutiveSlotsMedianPRAIUSD

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-26
*/

/**
 *Submitted for verification at Etherscan.io on 2020-10-26
*/

pragma solidity ^0.6.7;

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;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// SPDX-License-Identifier: GPL-3.0-or-later

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
contract BabylonianMath {
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
        // else z = 0
    }
}

// Contract for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
contract FixedPointMath is BabylonianMath {
    // range: [0, 2**112 - 1]
    // resolution: 1 / 2**112
    struct uq112x112 {
        uint224 _x;
    }

    // range: [0, 2**144 - 1]
    // resolution: 1 / 2**112
    struct uq144x112 {
        uint _x;
    }

    uint8 private constant RESOLUTION = 112;
    uint private constant Q112 = uint(1) << RESOLUTION;
    uint private constant Q224 = Q112 << RESOLUTION;

    // encode a uint112 as a UQ112x112
    function encode(uint112 x) internal pure returns (uq112x112 memory) {
        return uq112x112(uint224(x) << RESOLUTION);
    }

    // encodes a uint144 as a UQ144x112
    function encode144(uint144 x) internal pure returns (uq144x112 memory) {
        return uq144x112(uint256(x) << RESOLUTION);
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function divide(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) {
        require(x != 0, 'FixedPoint: DIV_BY_ZERO');
        return uq112x112(self._x / uint224(x));
    }

    // multiply a UQ112x112 by a uint, returning a UQ144x112
    // reverts on overflow
    function multiply(uq112x112 memory self, uint y) internal pure returns (uq144x112 memory) {
        uint z;
        require(y == 0 || (z = uint(self._x) * y) / y == uint(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW");
        return uq144x112(z);
    }

    // returns a UQ112x112 which represents the ratio of the numerator to the denominator
    // equivalent to encode(numerator).divide(denominator)
    function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, "FixedPoint: DIV_BY_ZERO");
        return uq112x112((uint224(numerator) << RESOLUTION) / denominator);
    }

    // decode a UQ112x112 into a uint112 by truncating after the radix point
    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    // decode a UQ144x112 into a uint144 by truncating after the radix point
    function decode144(uq144x112 memory self) internal pure returns (uint144) {
        return uint144(self._x >> RESOLUTION);
    }

    // take the reciprocal of a UQ112x112
    function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) {
        require(self._x != 0, 'FixedPoint: ZERO_RECIPROCAL');
        return uq112x112(uint224(Q224 / self._x));
    }

    // square root of a UQ112x112
    function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) {
        return uq112x112(uint224(super.sqrt(uint256(self._x)) << 56));
    }
}

contract UniswapV2Library {
    // --- Math ---
    function addition(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'UniswapV2Library: add-overflow');
    }
    function subtract(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'UniswapV2Library: sub-underflow');
    }
    function multiply(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'UniswapV2Library: mul-overflow');
    }

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // Modified Uniswap function to work with dapp.tools (CREATE2 throws)
    function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        return IUniswapV2Factory(factory).getPair(tokenA, tokenB);
    }

    // fetches and sorts the reserves for a pair; modified from the initial Uniswap version in order to work with dapp.tools
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IUniswapV2Pair(IUniswapV2Factory(factory).getPair(tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // Given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = multiply(amountA, reserveB) / reserveA;
    }

    // Given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = multiply(amountIn, 997);
        uint numerator = multiply(amountInWithFee, reserveOut);
        uint denominator = addition(multiply(reserveIn, 1000), amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = multiply(multiply(reserveIn, amountOut), 1000);
        uint denominator = multiply(subtract(reserveOut, amountOut), 997);
        amountIn = addition((numerator / denominator), 1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// Contract with helper methods for oracles that are concerned with computing average prices
contract UniswapV2OracleLibrary is FixedPointMath {
    // Helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1]
    function currentBlockTimestamp() internal view returns (uint32) {
        return uint32(block.timestamp % 2 ** 32);
    }

    // Produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices(
        address pair
    ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) {
        blockTimestamp = currentBlockTimestamp();
        price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast();
        price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast();

        // if time has elapsed since the last update on the pair, mock the accumulated price values
        (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves();
        if (blockTimestampLast != blockTimestamp) {
            // subtraction overflow is desired
            uint32 timeElapsed = blockTimestamp - blockTimestampLast;
            // addition overflow is desired
            // counterfactual
            price0Cumulative += uint(fraction(reserve1, reserve0)._x) * timeElapsed;
            // counterfactual
            price1Cumulative += uint(fraction(reserve0, reserve1)._x) * timeElapsed;
        }
    }
}

abstract contract ConverterFeedLike {
    function getResultWithValidity() virtual external view returns (uint256,bool);
    function updateResult(address) virtual external;
}
abstract contract StabilityFeeTreasuryLike {
    function getAllowance(address) virtual external view returns (uint, uint);
    function systemCoin() virtual external view returns (address);
    function pullFunds(address, address, uint) virtual external;
}

contract UniswapConsecutiveSlotsPriceFeedMedianizer is UniswapV2Library, UniswapV2OracleLibrary {
    // --- Auth ---
    mapping (address => uint) public authorizedAccounts;
    /**
     * @notice Add auth to an account
     * @param account Account to add auth to
     */
    function addAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 1;
        emit AddAuthorization(account);
    }
    /**
     * @notice Remove auth from an account
     * @param account Account to remove auth from
     */
    function removeAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 0;
        emit RemoveAuthorization(account);
    }
    /**
    * @notice Checks whether msg.sender can call an authed function
    **/
    modifier isAuthorized {
        require(authorizedAccounts[msg.sender] == 1, "UniswapConsecutiveSlotsPriceFeedMedianizer/account-not-authorized");
        _;
    }

    // --- Observations ---
    struct UniswapObservation {
        uint timestamp;
        uint price0Cumulative;
        uint price1Cumulative;
    }
    struct ConverterFeedObservation {
        uint timestamp;
        uint timeAdjustedPrice;
    }

    // --- Uniswap Vars ---
    // Default amount of targetToken used when calculating the denominationToken output
    uint256              public defaultAmountIn;
    // Token for which the contract calculates the medianPrice for
    address              public targetToken;
    // Pair token from the Uniswap pair
    address              public denominationToken;
    address              public uniswapPair;

    IUniswapV2Factory    public uniswapFactory;

    UniswapObservation[] public uniswapObservations;

    // --- Converter Feed Vars ---
    // Latest converter price accumulator snapshot
    uint256                    public converterPriceCumulative;

    ConverterFeedLike          public converterFeed;
    ConverterFeedObservation[] public converterFeedObservations;

    // --- General Vars ---
    // Symbol - you want to change this every deployment
    bytes32 public symbol = "raiusd";

    uint8   public granularity;
    // When the price feed was last updated
    uint256 public lastUpdateTime;
    // Total number of updates
    uint256 public updates;
    /**
      The ideal amount of time over which the moving average should be computed, e.g. 24 hours.
      In practice it can and most probably will be different than the actual window over which the contract medianizes.
    **/
    uint256 public windowSize;
    // Maximum window size used to determine if the median is 'valid' (close to the real one) or not
    uint256 public maxWindowSize;
    // Stored for gas savings. Equals windowSize / granularity
    uint256 public periodSize;
    // This is the denominator for computing
    uint256 public converterFeedScalingFactor;
    // The last computed median price
    uint256 private medianPrice;
    // Starting reward for the feeReceiver
    uint256 public baseUpdateCallerReward;          // [wad]
    // Max possible reward for the feeReceiver
    uint256 public maxUpdateCallerReward;           // [wad]
    // Max delay taken into consideration when calculating the adjusted reward
    uint256 public maxRewardIncreaseDelay;
    // Rate applied to baseUpdateCallerReward every extra second passed beyond periodSize seconds since the last update call
    uint256 public perSecondCallerRewardIncrease;   // [ray]
    // SF treasury contract
    StabilityFeeTreasuryLike  public treasury;

    // --- Events ---
    event ModifyParameters(bytes32 parameter, address data);
    event ModifyParameters(bytes32 parameter, uint256 data);
    event UpdateResult(uint256 medianPrice, uint256 lastUpdateTime);
    event FailedConverterFeedUpdate(bytes reason);
    event FailedUniswapPairSync(bytes reason);
    event FailRewardCaller(bytes revertReason, address feeReceiver, uint256 amount);
    event RewardCaller(address feeReceiver, uint256 amount);
    event AddAuthorization(address account);
    event RemoveAuthorization(address account);

    constructor(
      address converterFeed_,
      address uniswapFactory_,
      address treasury_,
      uint256 defaultAmountIn_,
      uint256 windowSize_,
      uint256 converterFeedScalingFactor_,
      uint256 baseUpdateCallerReward_,
      uint256 maxUpdateCallerReward_,
      uint256 perSecondCallerRewardIncrease_,
      uint256 maxWindowSize_,
      uint8   granularity_
    ) public {
        require(uniswapFactory_ != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-uniswap-factory");
        require(granularity_ > 1, 'UniswapConsecutiveSlotsPriceFeedMedianizer/null-granularity');
        require(windowSize_ > 0, 'UniswapConsecutiveSlotsPriceFeedMedianizer/null-window-size');
        require(maxWindowSize_ > windowSize_, 'UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-max-window-size');
        require(defaultAmountIn_ > 0, 'UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-default-amount-in');
        require(converterFeedScalingFactor_ > 0, 'UniswapConsecutiveSlotsPriceFeedMedianizer/null-feed-scaling-factor');
        require(
            (periodSize = windowSize_ / granularity_) * granularity_ == windowSize_,
            'UniswapConsecutiveSlotsPriceFeedMedianizer/window-not-evenly-divisible'
        );
        require(maxUpdateCallerReward_ > baseUpdateCallerReward_, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-max-reward");
        require(perSecondCallerRewardIncrease_ >= RAY, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-reward-increase");
        if (address(treasury_) != address(0)) {
          require(StabilityFeeTreasuryLike(treasury_).systemCoin() != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/treasury-coin-not-set");
        }
        authorizedAccounts[msg.sender] = 1;
        converterFeed                  = ConverterFeedLike(converterFeed_);
        treasury                       = StabilityFeeTreasuryLike(treasury_);
        uniswapFactory                 = IUniswapV2Factory(uniswapFactory_);
        defaultAmountIn                = defaultAmountIn_;
        windowSize                     = windowSize_;
        maxWindowSize                  = maxWindowSize_;
        converterFeedScalingFactor     = converterFeedScalingFactor_;
        baseUpdateCallerReward         = baseUpdateCallerReward_;
        maxUpdateCallerReward          = maxUpdateCallerReward_;
        perSecondCallerRewardIncrease  = perSecondCallerRewardIncrease_;
        granularity                    = granularity_;
        maxRewardIncreaseDelay         = uint(-1);
        lastUpdateTime                 = now;
        // Emit events
        emit AddAuthorization(msg.sender);
        emit ModifyParameters(bytes32("treasury"), treasury_);
        emit ModifyParameters(bytes32("converterFeed"), converterFeed_);
        emit ModifyParameters(bytes32("maxWindowSize"), maxWindowSize_);
        emit ModifyParameters(bytes32("baseUpdateCallerReward"), baseUpdateCallerReward);
        emit ModifyParameters(bytes32("maxUpdateCallerReward"), maxUpdateCallerReward);
        emit ModifyParameters(bytes32("perSecondCallerRewardIncrease"), perSecondCallerRewardIncrease);
    }

    // --- Math ---
    uint256 internal constant WAD = 10 ** 18;
    uint256 internal constant RAY = 10 ** 27;
    function minimum(uint x, uint y) internal pure returns (uint z) {
        z = (x <= y) ? x : y;
    }
    function wmultiply(uint x, uint y) internal pure returns (uint z) {
        z = multiply(x, y) / WAD;
    }
    function rmultiply(uint x, uint y) internal pure returns (uint z) {
        z = multiply(x, y) / RAY;
    }
    function rpower(uint x, uint n, uint base) internal pure returns (uint z) {
        assembly {
            switch x case 0 {switch n case 0 {z := base} default {z := 0}}
            default {
                switch mod(n, 2) case 0 { z := base } default { z := x }
                let half := div(base, 2)  // for rounding.
                for { n := div(n, 2) } n { n := div(n,2) } {
                    let xx := mul(x, x)
                    if iszero(eq(div(xx, x), x)) { revert(0,0) }
                    let xxRound := add(xx, half)
                    if lt(xxRound, xx) { revert(0,0) }
                    x := div(xxRound, base)
                    if mod(n,2) {
                        let zx := mul(z, x)
                        if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }
                        let zxRound := add(zx, half)
                        if lt(zxRound, zx) { revert(0,0) }
                        z := div(zxRound, base)
                    }
                }
            }
        }
    }

    // --- Administration ---
    /**
    * @notice Modify the converter feed address
    * @param parameter Name of the parameter to modify
    * @param data New parameter value
    **/
    function modifyParameters(bytes32 parameter, address data) external isAuthorized {
        require(data != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-data");
        if (parameter == "converterFeed") {
          require(data != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-converter-feed");
          converterFeed = ConverterFeedLike(data);
        }
        else if (parameter == "treasury") {
      	  require(StabilityFeeTreasuryLike(data).systemCoin() != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/treasury-coin-not-set");
      	  treasury = StabilityFeeTreasuryLike(data);
      	}
        else if (parameter == "targetToken") {
          require(uniswapPair == address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/pair-already-set");
          targetToken = data;
          if (denominationToken != address(0)) {
            uniswapPair = uniswapFactory.getPair(targetToken, denominationToken);
            require(uniswapPair != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-uniswap-pair");
          }
        }
        else if (parameter == "denominationToken") {
          require(uniswapPair == address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/pair-already-set");
          denominationToken = data;
          if (targetToken != address(0)) {
            uniswapPair = uniswapFactory.getPair(targetToken, denominationToken);
            require(uniswapPair != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-uniswap-pair");
          }
        }
        else revert("UniswapConsecutiveSlotsPriceFeedMedianizer/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }
    function modifyParameters(bytes32 parameter, uint256 data) external isAuthorized {
        if (parameter == "baseUpdateCallerReward") baseUpdateCallerReward = data;
        else if (parameter == "maxUpdateCallerReward") {
          require(data > baseUpdateCallerReward, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-max-reward");
          maxUpdateCallerReward = data;
        }
        else if (parameter == "perSecondCallerRewardIncrease") {
          require(data >= RAY, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-reward-increase");
          perSecondCallerRewardIncrease = data;
        }
        else if (parameter == "maxRewardIncreaseDelay") {
          require(data > 0, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-max-increase-delay");
          maxRewardIncreaseDelay = data;
        }
        else if (parameter == "defaultAmountIn") {
          require(data > 0, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-default-amount-in");
          defaultAmountIn = data;
        }
        else if (parameter == "maxWindowSize") {
          require(data > windowSize, 'UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-max-window-size');
          maxWindowSize = data;
        }
        else revert("UniswapConsecutiveSlotsPriceFeedMedianizer/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }

    // --- General Utils ---
    function either(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := or(x, y)}
    }
    function both(bool x, bool y) private pure returns (bool z) {
        assembly{ z := and(x, y)}
    }
    /**
    * @notice Returns the oldest observations (relative to the current index in the Uniswap/Converter lists)
    **/
    function getFirstObservationsInWindow()
      private view returns (UniswapObservation storage firstUniswapObservation, ConverterFeedObservation storage firstConverterFeedObservation) {
        uint256 earliestObservationIndex = earliestObservationIndex();
        firstUniswapObservation          = uniswapObservations[earliestObservationIndex];
        firstConverterFeedObservation    = converterFeedObservations[earliestObservationIndex];
    }
    /**
      @notice It returns the time passed since the first observation in the window
    **/
    function timeElapsedSinceFirstObservation() public view returns (uint256) {
        if (updates > 1) {
          (
            UniswapObservation storage firstUniswapObservation,
          ) = getFirstObservationsInWindow();
          return subtract(now, firstUniswapObservation.timestamp);
        }
        return 0;
    }
    /**
    * @notice Calculate the median price using the latest observations and the latest Uniswap pair prices
    * @param price0Cumulative Cumulative price for the first token in the pair
    * @param price1Cumulative Cumulative price for the second token in the pair
    **/
    function getMedianPrice(uint256 price0Cumulative, uint256 price1Cumulative) private view returns (uint256) {
        if (updates > 1) {
          (
            UniswapObservation storage firstUniswapObservation,
          ) = getFirstObservationsInWindow();

          uint timeSinceFirst = subtract(now, firstUniswapObservation.timestamp);
          (address token0,)   = sortTokens(targetToken, denominationToken);
          uint256 uniswapAmountOut;

          if (token0 == targetToken) {
              uniswapAmountOut = uniswapComputeAmountOut(
                firstUniswapObservation.price0Cumulative, price0Cumulative, timeSinceFirst, defaultAmountIn
              );
          } else {
              uniswapAmountOut = uniswapComputeAmountOut(
                firstUniswapObservation.price1Cumulative, price1Cumulative, timeSinceFirst, defaultAmountIn
              );
          }

          return converterComputeAmountOut(timeSinceFirst, uniswapAmountOut);
        }

        return medianPrice;
    }
    /**
    * @notice Returns the index of the earliest observation in the window
    **/
    function earliestObservationIndex() public view returns (uint256) {
        if (updates <= granularity) {
          return 0;
        }
        return subtract(updates, uint(granularity));
    }
    /**
    * @notice Get the observation list length
    **/
    function getObservationListLength() public view returns (uint256, uint256) {
        return (uniswapObservations.length, converterFeedObservations.length);
    }

    // --- Treasury Utils ---
    function treasuryAllowance() public view returns (uint256) {
        (uint total, uint perBlock) = treasury.getAllowance(address(this));
        return minimum(total, perBlock);
    }
    function getCallerReward() public view returns (uint256) {
        if (lastUpdateTime == 0) return baseUpdateCallerReward;
        uint256 timeElapsed = subtract(now, lastUpdateTime);
        if (timeElapsed < periodSize) {
            return 0;
        }
        uint256 baseReward   = baseUpdateCallerReward;
        uint256 adjustedTime = subtract(timeElapsed, periodSize);
        if (adjustedTime > 0) {
            adjustedTime = (adjustedTime > maxRewardIncreaseDelay) ? maxRewardIncreaseDelay : adjustedTime;
            baseReward = rmultiply(rpower(perSecondCallerRewardIncrease, adjustedTime, RAY), baseReward);
        }
        uint256 maxReward = minimum(maxUpdateCallerReward, treasuryAllowance() / RAY);
        if (baseReward > maxReward) {
            baseReward = maxReward;
        }
        return baseReward;
    }
    function rewardCaller(address proposedFeeReceiver, uint256 reward) internal {
        if (address(treasury) == proposedFeeReceiver) return;
        if (either(address(treasury) == address(0), reward == 0)) return;
        address finalFeeReceiver = (proposedFeeReceiver == address(0)) ? msg.sender : proposedFeeReceiver;
        try treasury.pullFunds(finalFeeReceiver, treasury.systemCoin(), reward) {
            emit RewardCaller(finalFeeReceiver, reward);
        }
        catch(bytes memory revertReason) {
            emit FailRewardCaller(revertReason, finalFeeReceiver, reward);
        }
    }

    // --- Uniswap Utils ---
    /**
    * @notice Given the Uniswap cumulative prices of the start and end of a period, and the length of the period, compute the average
    *         price in terms of how much amount out is received for the amount in.
    * @param priceCumulativeStart Old snapshot of the cumulative price of a token
    * @param priceCumulativeEnd New snapshot of the cumulative price of a token
    * @param timeElapsed Total time elapsed
    * @param amountIn Amount of target tokens we want to find the price for
    **/
    function uniswapComputeAmountOut(
        uint256 priceCumulativeStart,
        uint256 priceCumulativeEnd,
        uint256 timeElapsed,
        uint256 amountIn
    ) public pure returns (uint256 amountOut) {
        require(priceCumulativeEnd >= priceCumulativeStart, "UniswapConverterBasicAveragePriceFeedMedianizer/invalid-end-cumulative");
        require(timeElapsed > 0, "UniswapConsecutiveSlotsPriceFeedMedianizer/null-time-elapsed");
        // Overflow is desired
        uq112x112 memory priceAverage = uq112x112(
            uint224((priceCumulativeEnd - priceCumulativeStart) / timeElapsed)
        );
        amountOut = decode144(multiply(priceAverage, amountIn));
    }

    // --- Converter Utils ---
    /**
    * @notice Calculate the price of an amount of tokens using the converter price feed as well as the time elapsed between
    *         the latest timestamp and the timestamp of the earliest observation in the window.
    *         Used after the contract determines the amount of Uniswap pair denomination tokens for amountIn target tokens
    * @param timeElapsed Time elapsed between now and the earliest observation in the window.
    * @param amountIn Amount of denomination tokens to calculate the price for
    **/
    function converterComputeAmountOut(
        uint256 timeElapsed,
        uint256 amountIn
    ) public view returns (uint256 amountOut) {
        require(timeElapsed > 0, "UniswapConsecutiveSlotsPriceFeedMedianizer/null-time-elapsed");
        uint256 priceAverage = converterPriceCumulative / timeElapsed;
        amountOut            = multiply(amountIn, priceAverage) / converterFeedScalingFactor;
    }

    // --- Core Logic ---
    /**
    * @notice Update the internal median price
    **/
    function updateResult(address feeReceiver) external {
        require(uniswapPair != address(0), "UniswapConsecutiveSlotsPriceFeedMedianizer/null-uniswap-pair");

        // Get final fee receiver
        address finalFeeReceiver = (feeReceiver == address(0)) ? msg.sender : feeReceiver;

        // Update the converter's median price first
        try converterFeed.updateResult(finalFeeReceiver) {}
        catch (bytes memory converterRevertReason) {
          emit FailedConverterFeedUpdate(converterRevertReason);
        }

        // Get the observation for the current period
        uint256 timeElapsedSinceLatest = (uniswapObservations.length == 0) ?
          subtract(now, lastUpdateTime) : subtract(now, uniswapObservations[uniswapObservations.length - 1].timestamp);
        // We only want to commit updates once per period (i.e. windowSize / granularity)
        if (uniswapObservations.length > 0) {
          require(timeElapsedSinceLatest >= periodSize, "UniswapConsecutiveSlotsPriceFeedMedianizer/not-enough-time-elapsed");
        }

        // Update Uniswap pair
        try IUniswapV2Pair(uniswapPair).sync() {}
        catch (bytes memory uniswapRevertReason) {
          emit FailedUniswapPairSync(uniswapRevertReason);
        }

        // Get caller's reward
        uint256 callerReward = getCallerReward();

        // Get Uniswap cumulative prices
        (uint uniswapPrice0Cumulative, uint uniswapPrice1Cumulative,) = currentCumulativePrices(uniswapPair);

        // Add new observations
        updateObservations(timeElapsedSinceLatest, uniswapPrice0Cumulative, uniswapPrice1Cumulative);

        // Calculate latest medianPrice
        medianPrice    = getMedianPrice(uniswapPrice0Cumulative, uniswapPrice1Cumulative);
        lastUpdateTime = now;
        updates        = addition(updates, 1);

        emit UpdateResult(medianPrice, lastUpdateTime);

        // Reward caller
        rewardCaller(feeReceiver, callerReward);
    }
    /**
    * @notice Push new observation data in the observation arrays
    * @param timeElapsedSinceLatest Time elapsed between now and the earliest observation in the window
    * @param uniswapPrice0Cumulative Latest cumulative price of the first token in a Uniswap pair
    * @param uniswapPrice1Cumulative Latest cumulative price of the second tokens in a Uniswap pair
    **/
    function updateObservations(
      uint256 timeElapsedSinceLatest,
      uint256 uniswapPrice0Cumulative,
      uint256 uniswapPrice1Cumulative
    ) internal {
        // Add converter feed observation
        (uint256 priceFeedValue, bool hasValidValue) = converterFeed.getResultWithValidity();
        require(hasValidValue, "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-converter-price-feed");
        uint256 newTimeAdjustedPrice = multiply(priceFeedValue, timeElapsedSinceLatest);

        // Add converter observation
        converterFeedObservations.push(ConverterFeedObservation(now, newTimeAdjustedPrice));
        // Add Uniswap observation
        uniswapObservations.push(UniswapObservation(now, uniswapPrice0Cumulative, uniswapPrice1Cumulative));

        // Add the new update
        converterPriceCumulative = addition(converterPriceCumulative, newTimeAdjustedPrice);

        // Subtract the earliest update
        if (updates >= granularity) {
          (
            ,
            ConverterFeedObservation storage firstConverterFeedObservation
          ) = getFirstObservationsInWindow();
          converterPriceCumulative = subtract(converterPriceCumulative, firstConverterFeedObservation.timeAdjustedPrice);
        }
    }

    // --- Getters ---
    /**
    * @notice Fetch the latest medianPrice or revert if is is null
    **/
    function read() external view returns (uint256) {
        require(both(both(medianPrice > 0, updates > granularity), timeElapsedSinceFirstObservation() <= maxWindowSize), "UniswapConsecutiveSlotsPriceFeedMedianizer/invalid-price-feed");
        return medianPrice;
    }
    /**
    * @notice Fetch the latest medianPrice and whether it is null or not
    **/
    function getResultWithValidity() external view returns (uint256, bool) {
        return (medianPrice, both(both(medianPrice > 0, updates > granularity), timeElapsedSinceFirstObservation() <= maxWindowSize));
    }
}

contract UniswapConsecutiveSlotsMedianPRAIUSD is UniswapConsecutiveSlotsPriceFeedMedianizer {
    constructor(
      address uniswapFactory_,
      uint256 defaultAmountIn_,
      uint256 windowSize_,
      uint256 converterFeedScalingFactor_,
      uint256 baseUpdateCallerReward_,
      uint256 maxUpdateCallerReward_,
      uint256 perSecondCallerRewardIncrease_,
      uint256 maxWindow_,
      uint8   granularity_
    ) UniswapConsecutiveSlotsPriceFeedMedianizer(
        address(0),
        uniswapFactory_,
        address(0),
        defaultAmountIn_,
        windowSize_,
        converterFeedScalingFactor_,
        baseUpdateCallerReward_,
        maxUpdateCallerReward_,
        perSecondCallerRewardIncrease_,
        maxWindow_,
        granularity_
    ) public {
        symbol = "PRAIUSD";
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"uniswapFactory_","type":"address"},{"internalType":"uint256","name":"defaultAmountIn_","type":"uint256"},{"internalType":"uint256","name":"windowSize_","type":"uint256"},{"internalType":"uint256","name":"converterFeedScalingFactor_","type":"uint256"},{"internalType":"uint256","name":"baseUpdateCallerReward_","type":"uint256"},{"internalType":"uint256","name":"maxUpdateCallerReward_","type":"uint256"},{"internalType":"uint256","name":"perSecondCallerRewardIncrease_","type":"uint256"},{"internalType":"uint256","name":"maxWindow_","type":"uint256"},{"internalType":"uint8","name":"granularity_","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"revertReason","type":"bytes"},{"indexed":false,"internalType":"address","name":"feeReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FailRewardCaller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"FailedConverterFeedUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"FailedUniswapPairSync","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardCaller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"medianPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastUpdateTime","type":"uint256"}],"name":"UpdateResult","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUpdateCallerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeElapsed","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"converterComputeAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converterFeed","outputs":[{"internalType":"contract ConverterFeedLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"converterFeedObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"timeAdjustedPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converterFeedScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converterPriceCumulative","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultAmountIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"denominationToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earliestObservationIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCallerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getObservationListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResultWithValidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRewardIncreaseDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUpdateCallerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWindowSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"perSecondCallerRewardIncrease","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"read","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeElapsedSinceFirstObservation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract StabilityFeeTreasuryLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceCumulativeStart","type":"uint256"},{"internalType":"uint256","name":"priceCumulativeEnd","type":"uint256"},{"internalType":"uint256","name":"timeElapsed","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"uniswapComputeAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniswapObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"price0Cumulative","type":"uint256"},{"internalType":"uint256","name":"price1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeReceiver","type":"address"}],"name":"updateResult","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"windowSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040527f7261697573640000000000000000000000000000000000000000000000000000600a553480156200003557600080fd5b50604051620049fe380380620049fe83398181016040526101208110156200005c57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505060008960008a8a8a8a8a8a8a8a600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141562000152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806200497c603f913960400191505060405180910390fd5b60018160ff1611620001b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806200487e603b913960400191505060405180910390fd5b600087116200020b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018062004843603b913960400191505060405180910390fd5b86821162000265576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180620048016042913960600191505060405180910390fd5b60008811620002c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526044815260200180620048b96044913960600191505060405180910390fd5b600086116200031b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526043815260200180620049bb6043913960600191505060405180910390fd5b868160ff168260ff1689816200032d57fe5b04601081905502146200038c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806200477b6046913960600191505060405180910390fd5b848411620003e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180620048fd603d913960400191505060405180910390fd5b6b033b2e3c9fd0803ce80000008310156200044d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806200493a6042913960600191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146200058e57600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b158015620004e157600080fd5b505afa158015620004f6573d6000803e3d6000fd5b505050506040513d60208110156200050d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614156200058d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526040815260200180620047c16040913960400191505060405180910390fd5b5b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508a600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760018190555086600e8190555081600f819055508560118190555084601381905550836014819055508260168190555080600b60006101000a81548160ff021916908360ff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60158190555042600c819055507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010233604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d17f74726561737572790000000000000000000000000000000000000000000000008a604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a17fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d17f636f6e76657274657246656564000000000000000000000000000000000000008c604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a17fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a7f6d617857696e646f7753697a650000000000000000000000000000000000000083604051808381526020018281526020019250505060405180910390a17fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a7f6261736555706461746543616c6c657252657761726400000000000000000000601354604051808381526020018281526020019250505060405180910390a17fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a7f6d617855706461746543616c6c65725265776172640000000000000000000000601454604051808381526020018281526020019250505060405180910390a17fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a7f7065725365636f6e6443616c6c6572526577617264496e637265617365000000601654604051808381526020018281526020019250505060405180910390a150505050505050505050507f5052414955534400000000000000000000000000000000000000000000000000600a81905550505050505050505050613d268062000a556000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806368a82ef611610130578063b7ae03c0116100b8578063c8f33c911161007c578063c8f33c9114610889578063d4ef1722146108a7578063e4463eb2146108c5578063f6b9fdfb146108e3578063fe4f58901461092d57610227565b8063b7ae03c014610799578063bc3501e2146107b7578063bd9e799d146107d5578063c5cb2dcc14610821578063c816841b1461083f57610227565b806394f3f81d116100ff57806394f3f81d146106b157806395d89b41146106f55780639df055f514610713578063a0685e8414610731578063b19400581461077b57610227565b806368a82ef61461060d57806369dec2761461062b5780638a14117a146106495780638bdb2afa1461066757610227565b80633c3f9125116101b35780634fd0ada8116101825780634fd0ada81461050a578063556f0dc71461053357806357de26a41461055757806361d027b3146105755780636614f010146105bf57610227565b80633c3f91251461046557806341938b021461048a57806343943b6b146104a8578063495df025146104c657610227565b806324ba5884116101fa57806324ba588414610311578063303aa80f14610369578063327107f7146103b95780633425677e1461040357806335b281531461042157610227565b80630ac916381461022c5780630d88ed89146102755780631c1f908c146102d55780632009e568146102f3575b600080fd5b6102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610965565b604051808381526020018281526020019250505060405180910390f35b6102bf6004803603608081101561028b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610996565b6040518082815260200191505060405180910390f35b6102dd610abd565b6040518082815260200191505060405180910390f35b6102fb610ac3565b6040518082815260200191505060405180910390f35b6103536004803603602081101561032757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac9565b6040518082815260200191505060405180910390f35b6103956004803603602081101561037f57600080fd5b8101908080359060200190929190505050610ae1565b60405180848152602001838152602001828152602001935050505060405180910390f35b6103c1610b18565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040b610b3e565b6040518082815260200191505060405180910390f35b6104636004803603602081101561043757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3b565b005b61046d610d7c565b604051808381526020018281526020019250505060405180910390f35b610492610d93565b6040518082815260200191505060405180910390f35b6104b0610d99565b6040518082815260200191505060405180910390f35b610508600480360360208110156104dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d9f565b005b6105126112ea565b60405180838152602001821515151581526020019250505060405180910390f35b61053b611332565b604051808260ff1660ff16815260200191505060405180910390f35b61055f611345565b6040518082815260200191505060405180910390f35b61057d6113de565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61060b600480360360408110156105d557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611404565b005b610615611f98565b6040518082815260200191505060405180910390f35b610633611f9e565b6040518082815260200191505060405180910390f35b610651611fa4565b6040518082815260200191505060405180910390f35b61066f611faa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f3600480360360208110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fd0565b005b6106fd612111565b6040518082815260200191505060405180910390f35b61071b612117565b6040518082815260200191505060405180910390f35b61073961211d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610783612143565b6040518082815260200191505060405180910390f35b6107a1612149565b6040518082815260200191505060405180910390f35b6107bf612220565b6040518082815260200191505060405180910390f35b61080b600480360360408110156107eb57600080fd5b810190808035906020019092919080359060200190929190505050612258565b6040518082815260200191505060405180910390f35b6108296122e0565b6040518082815260200191505060405180910390f35b61084761232a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610891612350565b6040518082815260200191505060405180910390f35b6108af612356565b6040518082815260200191505060405180910390f35b6108cd61235c565b6040518082815260200191505060405180910390f35b6108eb612362565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109636004803603604081101561094357600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b6009818154811061097257fe5b90600052602060002090600202016000915090508060000154908060010154905082565b6000848410156109f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180613c696046913960600191505060405180910390fd5b60008311610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613b4e603c913960400191505060405180910390fd5b610a52613824565b60405180602001604052808588880381610a6857fe5b047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050610a9e610a9982856127bb565b612891565b71ffffffffffffffffffffffffffffffffffff16915050949350505050565b60135481565b60155481565b60006020528060005260406000206000915090505481565b60068181548110610aee57fe5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eb5a662e306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604080518083038186803b158015610be157600080fd5b505afa158015610bf5573d6000803e3d6000fd5b505050506040513d6040811015610c0b57600080fd5b81019080805190602001909291908051906020019092919050505091509150610c3482826128a6565b9250505090565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010281604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600080600680549050600980549050915091509091565b600f5481565b60165481565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e825781610e84565b335b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663495df025826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610f2757600080fd5b505af1925050508015610f38575060015b611010573d8060008114610f68576040519150601f19603f3d011682016040523d82523d6000602084013e610f6d565b606091505b507f321dc066db92f97ab7f8b6f080147cb31cc027a61c0b6c026f055a39009be70f816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fd0578082015181840152602081019050610fb5565b50505050905090810190601f168015610ffd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611011565b5b600080600680549050146110545761104f4260066001600680549050038154811061103857fe5b9060005260206000209060030201600001546128c0565b611061565b61106042600c546128c0565b5b9050600060068054905011156110cd576010548110156110cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613caf6042913960600191505060405180910390fd5b5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561113757600080fd5b505af1925050508015611148575060015b611220573d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b507ff64c46db4bf4aeeff8f4a6001e70e2e8cac802c514905f29bdd5659efc75b8b0816040518080602001828103825283818151815260200191508051906020019080838360005b838110156111e05780820151818401526020810190506111c5565b50505050905090810190601f16801561120d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611221565b5b600061122b612149565b905060008061125b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612943565b509150915061126b848383612b8e565b6112758282612dbb565b60128190555042600c8190555061128f600d546001612ee1565b600d819055507ff85e44c6c3597d176b8d59bfbf500dfdb2badfc8cf91e6d960b16583a5807e48601254600c54604051808381526020018281526020019250505060405180910390a16112e28684612f64565b505050505050565b60008060125461132a611318600060125411600b60009054906101000a900460ff1660ff16600d541161337c565b600f54611323612220565b111561337c565b915091509091565b600b60009054906101000a900460ff1681565b600061138161136f600060125411600b60009054906101000a900460ff1660ff16600d541161337c565b600f5461137a612220565b111561337c565b6113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613c2c603d913960400191505060405180910390fd5b601254905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461149b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613b1a6034913960400191505060405180910390fd5b7f636f6e766572746572466565640000000000000000000000000000000000000082141561161557600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806138e4603e913960400191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611f29565b7f747265617375727900000000000000000000000000000000000000000000000082141561178957600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d60208110156116c557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806138a46040913960400191505060405180910390fd5b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611f28565b7f746172676574546f6b656e000000000000000000000000000000000000000000821415611b2f57600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613869603b913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2a57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a43905600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b5b611f27565b7f64656e6f6d696e6174696f6e546f6b656e000000000000000000000000000000821415611ed557600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613869603b913960400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed057600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a43905600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611dac57600080fd5b505afa158015611dc0573d6000803e3d6000fd5b505050506040513d6020811015611dd657600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b5b611f26565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806139d06044913960600191505060405180910390fd5b5b5b5b7fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d18282604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b600d5481565b60145481565b600e5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612067576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b90381604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600a5481565b60075481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600080600c54141561215f57601354905061221d565b600061216d42600c546128c0565b905060105481101561218357600091505061221d565b600060135490506000612198836010546128c0565b905060008111156121dd5760155481116121b257806121b6565b6015545b90506121da6121d4601654836b033b2e3c9fd0803ce8000000613389565b8361344f565b91505b60006122076014546b033b2e3c9fd0803ce80000006121fa610b3e565b8161220157fe5b046128a6565b905080831115612215578092505b829450505050505b90565b60006001600d541115612250576000612237613478565b5090506122484282600001546128c0565b915050612255565b600090505b90565b60008083116122b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613b4e603c913960400191505060405180910390fd5b600083600754816122bf57fe5b0490506011546122cf84836134c6565b816122d657fe5b0491505092915050565b6000600b60009054906101000a900460ff1660ff16600d54116123065760009050612327565b612324600d54600b60009054906101000a900460ff1660ff166128c0565b90505b90565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b60015481565b60105481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461241f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b7f6261736555706461746543616c6c6572526577617264000000000000000000008214156124535780601381905550612778565b7f6d617855706461746543616c6c657252657761726400000000000000000000008214156124e15760135481116124d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613b8a603d913960400191505060405180910390fd5b80601481905550612777565b7f7065725365636f6e6443616c6c6572526577617264496e63726561736500000082141561257a576b033b2e3c9fd0803ce800000081101561256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613bc76042913960600191505060405180910390fd5b80601681905550612776565b7f6d6178526577617264496e63726561736544656c61790000000000000000000082141561260757600081116125fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180613ad56045913960600191505060405180910390fd5b80601581905550612775565b7f64656661756c74416d6f756e74496e00000000000000000000000000000000008214156126945760008111612688576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526044815260200180613a146044913960600191505060405180910390fd5b80600181905550612774565b7f6d617857696e646f7753697a650000000000000000000000000000000000000082141561272257600e548111612716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806139226042913960600191505060405180910390fd5b80600f81905550612773565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806139d06044913960600191505060405180910390fd5b5b5b5b5b5b7fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a8282604051808381526020018281526020019250505060405180910390a15050565b6127c3613855565b600080831480612824575083600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16838486600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16029250828161282157fe5b04145b612879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c096023913960400191505060405180910390fd5b60405180602001604052808281525091505092915050565b6000607060ff168260000151901c9050919050565b6000818311156128b657816128b8565b825b905092915050565b600082828403915081111561293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f556e697377617056324c6962726172793a207375622d756e646572666c6f770081525060200191505060405180910390fd5b92915050565b600080600061295061355b565b90508373ffffffffffffffffffffffffffffffffffffffff16635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d60208110156129c257600080fd5b810190808051906020019092919050505092508373ffffffffffffffffffffffffffffffffffffffff16635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b8101908080519060200190929190505050915060008060008673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d6060811015612acd57600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092508363ffffffff168163ffffffff1614612b8457600081850390508063ffffffff16612b238486613571565b600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602870196508063ffffffff16612b5b8585613571565b600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160286019550505b5050509193909250565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd0ada86040518163ffffffff1660e01b8152600401604080518083038186803b158015612bf857600080fd5b505afa158015612c0c573d6000803e3d6000fd5b505050506040513d6040811015612c2257600080fd5b8101908080519060200190929190805190602001909291905050509150915080612c97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806139646047913960600191505060405180910390fd5b6000612ca383876134c6565b90506009604051806040016040528042815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600660405180606001604052804281526020018781526020018681525090806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201555050612d6d60075482612ee1565b600781905550600b60009054906101000a900460ff1660ff16600d5410612db3576000612d98613478565b915050612dab60075482600101546128c0565b600781905550505b505050505050565b60006001600d541115612ed5576000612dd2613478565b5090506000612de54283600001546128c0565b90506000612e37600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166136a0565b5090506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eab57612ea484600101548885600154610996565b9050612ec0565b612ebd84600201548785600154610996565b90505b612eca8382612258565b945050505050612edb565b60125490505b92915050565b6000828284019150811015612f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a206164642d6f766572666c6f77000081525060200191505060405180910390fd5b92915050565b8173ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fbf57613378565b61301d600073ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161460008314613817565b1561302757613378565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130625782613064565b335b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663201add9b82601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b15801561310d57600080fd5b505afa158015613121573d6000803e3d6000fd5b505050506040513d602081101561313757600080fd5b8101908080519060200190929190505050856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156131e557600080fd5b505af19250505080156131f6575060015b61330a573d8060008114613226576040519150601f19603f3d011682016040523d82523d6000602084013e61322b565b606091505b507ff7bf1f7447ce563690edb2abe40636178ff64fc766b07bf3e171b16102794a5481838560405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156132c85780820151818401526020810190506132ad565b50505050905090810190601f1680156132f55780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150613376565b7fecceda37d3797234769f9d2cb1d47314680fb79283568bdba3f12876c4c244db8183604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505b5050565b6000818316905092915050565b6000836000811461342f5760028406600081146133a8578592506133ac565b8392505b50600283046002850494505b84156134295785860286878204146133cf57600080fd5b818101818110156133df57600080fd5b8581049750600287061561341c57878502858982041415891515161561340457600080fd5b8381018181101561341457600080fd5b878104965050505b50506002850494506133b8565b50613447565b83600081146134415760009250613445565b8392505b505b509392505050565b60006b033b2e3c9fd0803ce800000061346884846134c6565b8161346f57fe5b04905092915050565b60008060006134856122e0565b90506006818154811061349457fe5b90600052602060002090600302019250600981815481106134b157fe5b90600052602060002090600202019150509091565b6000808214806134e357508282838502925082816134e057fe5b04145b613555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a206d756c2d6f766572666c6f77000081525060200191505060405180910390fd5b92915050565b6000640100000000428161356b57fe5b06905090565b613579613824565b6000826dffffffffffffffffffffffffffff16116135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4669786564506f696e743a204449565f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b6040518060200160405280836dffffffffffffffffffffffffffff16607060ff16866dffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161367657fe5b047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139ab6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613762578284613765565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a205a45524f5f41444452455353000081525060200191505060405180910390fd5b9250929050565b6000818317905092915050565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b604051806020016040528060008152509056fe556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f706169722d616c72656164792d736574556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f74726561737572792d636f696e2d6e6f742d736574556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d636f6e7665727465722d66656564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d77696e646f772d73697a65556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d636f6e7665727465722d70726963652d66656564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6d6f646966792d756e7265636f676e697a65642d706172616d556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d64656661756c742d616d6f756e742d696e556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6163636f756e742d6e6f742d617574686f72697a6564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d756e69737761702d70616972556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d696e6372656173652d64656c6179556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d64617461556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d74696d652d656c6170736564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d726577617264556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d7265776172642d696e6372656173654669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f57556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d70726963652d66656564556e6973776170436f6e7665727465724261736963417665726167655072696365466565644d656469616e697a65722f696e76616c69642d656e642d63756d756c6174697665556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e6f742d656e6f7567682d74696d652d656c6170736564a2646970667358221220cf35ca0a0c3a47166b82775a6cfd0fd3dc340453abe7540b509022e930bdcae864736f6c63430006070033556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f77696e646f772d6e6f742d6576656e6c792d646976697369626c65556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f74726561737572792d636f696e2d6e6f742d736574556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d77696e646f772d73697a65556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d77696e646f772d73697a65556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d6772616e756c6172697479556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d64656661756c742d616d6f756e742d696e556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d726577617264556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d7265776172642d696e637265617365556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d756e69737761702d666163746f7279556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d666565642d7363616c696e672d666163746f720000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000033b57034a98502542e4fba8000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000000c

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c806368a82ef611610130578063b7ae03c0116100b8578063c8f33c911161007c578063c8f33c9114610889578063d4ef1722146108a7578063e4463eb2146108c5578063f6b9fdfb146108e3578063fe4f58901461092d57610227565b8063b7ae03c014610799578063bc3501e2146107b7578063bd9e799d146107d5578063c5cb2dcc14610821578063c816841b1461083f57610227565b806394f3f81d116100ff57806394f3f81d146106b157806395d89b41146106f55780639df055f514610713578063a0685e8414610731578063b19400581461077b57610227565b806368a82ef61461060d57806369dec2761461062b5780638a14117a146106495780638bdb2afa1461066757610227565b80633c3f9125116101b35780634fd0ada8116101825780634fd0ada81461050a578063556f0dc71461053357806357de26a41461055757806361d027b3146105755780636614f010146105bf57610227565b80633c3f91251461046557806341938b021461048a57806343943b6b146104a8578063495df025146104c657610227565b806324ba5884116101fa57806324ba588414610311578063303aa80f14610369578063327107f7146103b95780633425677e1461040357806335b281531461042157610227565b80630ac916381461022c5780630d88ed89146102755780631c1f908c146102d55780632009e568146102f3575b600080fd5b6102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610965565b604051808381526020018281526020019250505060405180910390f35b6102bf6004803603608081101561028b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610996565b6040518082815260200191505060405180910390f35b6102dd610abd565b6040518082815260200191505060405180910390f35b6102fb610ac3565b6040518082815260200191505060405180910390f35b6103536004803603602081101561032757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac9565b6040518082815260200191505060405180910390f35b6103956004803603602081101561037f57600080fd5b8101908080359060200190929190505050610ae1565b60405180848152602001838152602001828152602001935050505060405180910390f35b6103c1610b18565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040b610b3e565b6040518082815260200191505060405180910390f35b6104636004803603602081101561043757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3b565b005b61046d610d7c565b604051808381526020018281526020019250505060405180910390f35b610492610d93565b6040518082815260200191505060405180910390f35b6104b0610d99565b6040518082815260200191505060405180910390f35b610508600480360360208110156104dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d9f565b005b6105126112ea565b60405180838152602001821515151581526020019250505060405180910390f35b61053b611332565b604051808260ff1660ff16815260200191505060405180910390f35b61055f611345565b6040518082815260200191505060405180910390f35b61057d6113de565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61060b600480360360408110156105d557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611404565b005b610615611f98565b6040518082815260200191505060405180910390f35b610633611f9e565b6040518082815260200191505060405180910390f35b610651611fa4565b6040518082815260200191505060405180910390f35b61066f611faa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f3600480360360208110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fd0565b005b6106fd612111565b6040518082815260200191505060405180910390f35b61071b612117565b6040518082815260200191505060405180910390f35b61073961211d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610783612143565b6040518082815260200191505060405180910390f35b6107a1612149565b6040518082815260200191505060405180910390f35b6107bf612220565b6040518082815260200191505060405180910390f35b61080b600480360360408110156107eb57600080fd5b810190808035906020019092919080359060200190929190505050612258565b6040518082815260200191505060405180910390f35b6108296122e0565b6040518082815260200191505060405180910390f35b61084761232a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610891612350565b6040518082815260200191505060405180910390f35b6108af612356565b6040518082815260200191505060405180910390f35b6108cd61235c565b6040518082815260200191505060405180910390f35b6108eb612362565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109636004803603604081101561094357600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b6009818154811061097257fe5b90600052602060002090600202016000915090508060000154908060010154905082565b6000848410156109f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526046815260200180613c696046913960600191505060405180910390fd5b60008311610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613b4e603c913960400191505060405180910390fd5b610a52613824565b60405180602001604052808588880381610a6857fe5b047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050610a9e610a9982856127bb565b612891565b71ffffffffffffffffffffffffffffffffffff16915050949350505050565b60135481565b60155481565b60006020528060005260406000206000915090505481565b60068181548110610aee57fe5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eb5a662e306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604080518083038186803b158015610be157600080fd5b505afa158015610bf5573d6000803e3d6000fd5b505050506040513d6040811015610c0b57600080fd5b81019080805190602001909291908051906020019092919050505091509150610c3482826128a6565b9250505090565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010281604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600080600680549050600980549050915091509091565b600f5481565b60165481565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e825781610e84565b335b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663495df025826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610f2757600080fd5b505af1925050508015610f38575060015b611010573d8060008114610f68576040519150601f19603f3d011682016040523d82523d6000602084013e610f6d565b606091505b507f321dc066db92f97ab7f8b6f080147cb31cc027a61c0b6c026f055a39009be70f816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fd0578082015181840152602081019050610fb5565b50505050905090810190601f168015610ffd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611011565b5b600080600680549050146110545761104f4260066001600680549050038154811061103857fe5b9060005260206000209060030201600001546128c0565b611061565b61106042600c546128c0565b5b9050600060068054905011156110cd576010548110156110cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613caf6042913960600191505060405180910390fd5b5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561113757600080fd5b505af1925050508015611148575060015b611220573d8060008114611178576040519150601f19603f3d011682016040523d82523d6000602084013e61117d565b606091505b507ff64c46db4bf4aeeff8f4a6001e70e2e8cac802c514905f29bdd5659efc75b8b0816040518080602001828103825283818151815260200191508051906020019080838360005b838110156111e05780820151818401526020810190506111c5565b50505050905090810190601f16801561120d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150611221565b5b600061122b612149565b905060008061125b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612943565b509150915061126b848383612b8e565b6112758282612dbb565b60128190555042600c8190555061128f600d546001612ee1565b600d819055507ff85e44c6c3597d176b8d59bfbf500dfdb2badfc8cf91e6d960b16583a5807e48601254600c54604051808381526020018281526020019250505060405180910390a16112e28684612f64565b505050505050565b60008060125461132a611318600060125411600b60009054906101000a900460ff1660ff16600d541161337c565b600f54611323612220565b111561337c565b915091509091565b600b60009054906101000a900460ff1681565b600061138161136f600060125411600b60009054906101000a900460ff1660ff16600d541161337c565b600f5461137a612220565b111561337c565b6113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613c2c603d913960400191505060405180910390fd5b601254905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461149b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180613b1a6034913960400191505060405180910390fd5b7f636f6e766572746572466565640000000000000000000000000000000000000082141561161557600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806138e4603e913960400191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611f29565b7f747265617375727900000000000000000000000000000000000000000000000082141561178957600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d60208110156116c557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806138a46040913960400191505060405180910390fd5b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611f28565b7f746172676574546f6b656e000000000000000000000000000000000000000000821415611b2f57600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613869603b913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b2a57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a43905600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b5b611f27565b7f64656e6f6d696e6174696f6e546f6b656e000000000000000000000000000000821415611ed557600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613869603b913960400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed057600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a43905600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611dac57600080fd5b505afa158015611dc0573d6000803e3d6000fd5b505050506040513d6020811015611dd657600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613a99603c913960400191505060405180910390fd5b5b611f26565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806139d06044913960600191505060405180910390fd5b5b5b5b7fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d18282604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b600d5481565b60145481565b600e5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612067576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b90381604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600a5481565b60075481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600080600c54141561215f57601354905061221d565b600061216d42600c546128c0565b905060105481101561218357600091505061221d565b600060135490506000612198836010546128c0565b905060008111156121dd5760155481116121b257806121b6565b6015545b90506121da6121d4601654836b033b2e3c9fd0803ce8000000613389565b8361344f565b91505b60006122076014546b033b2e3c9fd0803ce80000006121fa610b3e565b8161220157fe5b046128a6565b905080831115612215578092505b829450505050505b90565b60006001600d541115612250576000612237613478565b5090506122484282600001546128c0565b915050612255565b600090505b90565b60008083116122b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613b4e603c913960400191505060405180910390fd5b600083600754816122bf57fe5b0490506011546122cf84836134c6565b816122d657fe5b0491505092915050565b6000600b60009054906101000a900460ff1660ff16600d54116123065760009050612327565b612324600d54600b60009054906101000a900460ff1660ff166128c0565b90505b90565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b60015481565b60105481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461241f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180613a586041913960600191505060405180910390fd5b7f6261736555706461746543616c6c6572526577617264000000000000000000008214156124535780601381905550612778565b7f6d617855706461746543616c6c657252657761726400000000000000000000008214156124e15760135481116124d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613b8a603d913960400191505060405180910390fd5b80601481905550612777565b7f7065725365636f6e6443616c6c6572526577617264496e63726561736500000082141561257a576b033b2e3c9fd0803ce800000081101561256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613bc76042913960600191505060405180910390fd5b80601681905550612776565b7f6d6178526577617264496e63726561736544656c61790000000000000000000082141561260757600081116125fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180613ad56045913960600191505060405180910390fd5b80601581905550612775565b7f64656661756c74416d6f756e74496e00000000000000000000000000000000008214156126945760008111612688576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526044815260200180613a146044913960600191505060405180910390fd5b80600181905550612774565b7f6d617857696e646f7753697a650000000000000000000000000000000000000082141561272257600e548111612716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806139226042913960600191505060405180910390fd5b80600f81905550612773565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806139d06044913960600191505060405180910390fd5b5b5b5b5b5b7fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a8282604051808381526020018281526020019250505060405180910390a15050565b6127c3613855565b600080831480612824575083600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16838486600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16029250828161282157fe5b04145b612879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613c096023913960400191505060405180910390fd5b60405180602001604052808281525091505092915050565b6000607060ff168260000151901c9050919050565b6000818311156128b657816128b8565b825b905092915050565b600082828403915081111561293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f556e697377617056324c6962726172793a207375622d756e646572666c6f770081525060200191505060405180910390fd5b92915050565b600080600061295061355b565b90508373ffffffffffffffffffffffffffffffffffffffff16635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561299857600080fd5b505afa1580156129ac573d6000803e3d6000fd5b505050506040513d60208110156129c257600080fd5b810190808051906020019092919050505092508373ffffffffffffffffffffffffffffffffffffffff16635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b8101908080519060200190929190505050915060008060008673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d6060811015612acd57600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092508363ffffffff168163ffffffff1614612b8457600081850390508063ffffffff16612b238486613571565b600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602870196508063ffffffff16612b5b8585613571565b600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160286019550505b5050509193909250565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd0ada86040518163ffffffff1660e01b8152600401604080518083038186803b158015612bf857600080fd5b505afa158015612c0c573d6000803e3d6000fd5b505050506040513d6040811015612c2257600080fd5b8101908080519060200190929190805190602001909291905050509150915080612c97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806139646047913960600191505060405180910390fd5b6000612ca383876134c6565b90506009604051806040016040528042815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050600660405180606001604052804281526020018781526020018681525090806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201555050612d6d60075482612ee1565b600781905550600b60009054906101000a900460ff1660ff16600d5410612db3576000612d98613478565b915050612dab60075482600101546128c0565b600781905550505b505050505050565b60006001600d541115612ed5576000612dd2613478565b5090506000612de54283600001546128c0565b90506000612e37600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166136a0565b5090506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eab57612ea484600101548885600154610996565b9050612ec0565b612ebd84600201548785600154610996565b90505b612eca8382612258565b945050505050612edb565b60125490505b92915050565b6000828284019150811015612f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a206164642d6f766572666c6f77000081525060200191505060405180910390fd5b92915050565b8173ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fbf57613378565b61301d600073ffffffffffffffffffffffffffffffffffffffff16601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161460008314613817565b1561302757613378565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130625782613064565b335b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663201add9b82601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b15801561310d57600080fd5b505afa158015613121573d6000803e3d6000fd5b505050506040513d602081101561313757600080fd5b8101908080519060200190929190505050856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156131e557600080fd5b505af19250505080156131f6575060015b61330a573d8060008114613226576040519150601f19603f3d011682016040523d82523d6000602084013e61322b565b606091505b507ff7bf1f7447ce563690edb2abe40636178ff64fc766b07bf3e171b16102794a5481838560405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156132c85780820151818401526020810190506132ad565b50505050905090810190601f1680156132f55780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150613376565b7fecceda37d3797234769f9d2cb1d47314680fb79283568bdba3f12876c4c244db8183604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505b5050565b6000818316905092915050565b6000836000811461342f5760028406600081146133a8578592506133ac565b8392505b50600283046002850494505b84156134295785860286878204146133cf57600080fd5b818101818110156133df57600080fd5b8581049750600287061561341c57878502858982041415891515161561340457600080fd5b8381018181101561341457600080fd5b878104965050505b50506002850494506133b8565b50613447565b83600081146134415760009250613445565b8392505b505b509392505050565b60006b033b2e3c9fd0803ce800000061346884846134c6565b8161346f57fe5b04905092915050565b60008060006134856122e0565b90506006818154811061349457fe5b90600052602060002090600302019250600981815481106134b157fe5b90600052602060002090600202019150509091565b6000808214806134e357508282838502925082816134e057fe5b04145b613555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a206d756c2d6f766572666c6f77000081525060200191505060405180910390fd5b92915050565b6000640100000000428161356b57fe5b06905090565b613579613824565b6000826dffffffffffffffffffffffffffff16116135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4669786564506f696e743a204449565f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b6040518060200160405280836dffffffffffffffffffffffffffff16607060ff16866dffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161367657fe5b047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139ab6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613762578284613765565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f556e697377617056324c6962726172793a205a45524f5f41444452455353000081525060200191505060405180910390fd5b9250929050565b6000818317905092915050565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b604051806020016040528060008152509056fe556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f706169722d616c72656164792d736574556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f74726561737572792d636f696e2d6e6f742d736574556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d636f6e7665727465722d66656564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d77696e646f772d73697a65556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d636f6e7665727465722d70726963652d66656564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6d6f646966792d756e7265636f676e697a65642d706172616d556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d64656661756c742d616d6f756e742d696e556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6163636f756e742d6e6f742d617574686f72697a6564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d756e69737761702d70616972556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d696e6372656173652d64656c6179556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d64617461556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e756c6c2d74696d652d656c6170736564556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d6d61782d726577617264556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d7265776172642d696e6372656173654669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f57556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f696e76616c69642d70726963652d66656564556e6973776170436f6e7665727465724261736963417665726167655072696365466565644d656469616e697a65722f696e76616c69642d656e642d63756d756c6174697665556e6973776170436f6e7365637574697665536c6f74735072696365466565644d656469616e697a65722f6e6f742d656e6f7567682d74696d652d656c6170736564a2646970667358221220cf35ca0a0c3a47166b82775a6cfd0fd3dc340453abe7540b509022e930bdcae864736f6c63430006070033

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

0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000033b57034a98502542e4fba8000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000000c

-----Decoded View---------------
Arg [0] : uniswapFactory_ (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [1] : defaultAmountIn_ (uint256): 1000000000000000000
Arg [2] : windowSize_ (uint256): 43200
Arg [3] : converterFeedScalingFactor_ (uint256): 1000000000000000000
Arg [4] : baseUpdateCallerReward_ (uint256): 500000000000000000
Arg [5] : maxUpdateCallerReward_ (uint256): 1000000000000000000
Arg [6] : perSecondCallerRewardIncrease_ (uint256): 1000192559420674483977255848
Arg [7] : maxWindow_ (uint256): 57600
Arg [8] : granularity_ (uint8): 12

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 000000000000000000000000000000000000000000000000000000000000a8c0
Arg [3] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [4] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [5] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [6] : 0000000000000000000000000000000000000000033b57034a98502542e4fba8
Arg [7] : 000000000000000000000000000000000000000000000000000000000000e100
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000c


Deployed Bytecode Sourcemap

37173:841:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37173:841:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;15327:59:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;15327:59:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;30978:698;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30978:698:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16410:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16662;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13459:51;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;13459:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15062:47;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;15062:47:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14824:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28753:186;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13620:156;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;13620:156:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;28551:163;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;16068:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16832:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32769:2016;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;32769:2016:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36951:215;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15523:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36580:273;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16923:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22461:1718;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;22461:1718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15669:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16520:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15934:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15011:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13895:162;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;13895:162:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;15482:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15206:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15273:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16245:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28945:853;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26520:333;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32255:413;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;32255:413:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28281:199;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14963:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15601:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14706:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16167:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14911:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24185:1388;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;24185:1388:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15327:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30978:698::-;31172:17;31232:20;31210:18;:42;;31202:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31360:1;31346:11;:15;31338:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31469:29;;:::i;:::-;31501:101;;;;;;;;31579:11;31555:20;31534:18;:41;31533:57;;;;;;31501:101;;;;;31469:133;;31625:43;31635:32;31644:12;31658:8;31635;:32::i;:::-;31625:9;:43::i;:::-;31613:55;;;;30978:698;;;;;;;:::o;16410:37::-;;;;:::o;16662:::-;;;;:::o;13459:51::-;;;;;;;;;;;;;;;;;:::o;15062:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14824:39::-;;;;;;;;;;;;;:::o;28753:186::-;28803:7;28824:10;28836:13;28853:8;;;;;;;;;;;:21;;;28883:4;28853:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28853:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28853:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;28853:36:0;;;;;;;;;;;;;;;;;;;;;;;;;28823:66;;;;28907:24;28915:5;28922:8;28907:7;:24::i;:::-;28900:31;;;;28753:186;:::o;13620:156::-;14225:1;14191:18;:30;14210:10;14191:30;;;;;;;;;;;;;;;;:35;14183:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13726:1:::1;13696:18;:27:::0;13715:7:::1;13696:27;;;;;;;;;;;;;;;:31;;;;13743:25;13760:7;13743:25;;;;;;;;;;;;;;;;;;;;;;13620:156:::0;:::o;28551:163::-;28608:7;28617;28645:19;:26;;;;28673:25;:32;;;;28637:69;;;;28551:163;;:::o;16068:28::-;;;;:::o;16832:44::-;;;;:::o;32769:2016::-;32863:1;32840:25;;:11;;;;;;;;;;;:25;;;;32832:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32978:24;33029:1;33006:25;;:11;:25;;;33005:54;;33048:11;33005:54;;;33035:10;33005:54;32978:81;;33130:13;;;;;;;;;;;:26;;;33157:16;33130:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33130:44:0;;;;;;;;;;;;;;33126:182;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;33248:48:0;33274:21;33248:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33248:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33187:121;33126:182;;;;33375:30;33439:1;33409:19;:26;;;;:31;33408:155;;33487:76;33496:3;33501:19;33550:1;33521:19;:26;;;;:30;33501:51;;;;;;;;;;;;;;;;;;:61;;;33487:8;:76::i;:::-;33408:155;;;33455:29;33464:3;33469:14;;33455:8;:29::i;:::-;33408:155;33375:188;;33698:1;33669:19;:26;;;;:30;33665:176;;;33748:10;;33722:22;:36;;33714:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33665:176;33904:11;;;;;;;;;;;33889:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33889:34:0;;;;;;;;;;;;;;33885:164;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;33995:42:0;34017:19;33995:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33995:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33936:113;33885:164;;;;34093:20;34116:17;:15;:17::i;:::-;34093:40;;34189:28;34219;34252:36;34276:11;;;;;;;;;;;34252:23;:36::i;:::-;34188:100;;;;;34334:92;34353:22;34377:23;34402;34334:18;:92::i;:::-;34497:64;34512:23;34537;34497:14;:64::i;:::-;34480:11;:81;;;;34589:3;34572:14;:20;;;;34620;34629:7;;34638:1;34620:8;:20::i;:::-;34603:7;:37;;;;34658:41;34671:11;;34684:14;;34658:41;;;;;;;;;;;;;;;;;;;;;;;;34738:39;34751:11;34764:12;34738;:39::i;:::-;32769:2016;;;;;;:::o;36951:215::-;37007:7;37016:4;37041:11;;37054:103;37059:44;37078:1;37064:11;;:15;37091:11;;;;;;;;;;;37081:21;;:7;;:21;37059:4;:44::i;:::-;37143:13;;37105:34;:32;:34::i;:::-;:51;;37054:4;:103::i;:::-;37033:125;;;;36951:215;;:::o;15523:26::-;;;;;;;;;;;;;:::o;36580:273::-;36619:7;36647:103;36652:44;36671:1;36657:11;;:15;36684:11;;;;;;;;;;;36674:21;;:7;;:21;36652:4;:44::i;:::-;36736:13;;36698:34;:32;:34::i;:::-;:51;;36647:4;:103::i;:::-;36639:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36834:11;;36827:18;;36580:273;:::o;16923:41::-;;;;;;;;;;;;;:::o;22461:1718::-;14225:1;14191:18;:30;14210:10;14191:30;;;;;;;;;;;;;;;;:35;14183:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22577:1:::1;22561:18;;:4;:18;;;;22553:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22651:28;:9;:28;22647:1475;;;22718:1;22702:18;;:4;:18;;;;22694:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22834:4;22800:13;;:39;;;;;;;;;;;;;;;;;;22647:1475;;;22870:23;:9;:23;22866:1256;;;22970:1;22915:57;;22940:4;22915:41;;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22915:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22915:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;22915:43:0;;;;;;;;;;;;;;;;:57;;;;22907:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23089:4;23053:8;;:41;;;;;;;;;;;;;;;;;;22866:1256;;;23124:26;:9;:26;23120:1002;;;23196:1;23173:25;;:11;;;;;;;;;;;:25;;;23165:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23289:4;23275:11;;:18;;;;;;;;;;;;;;;;;;23339:1;23310:31;;:17;;;;;;;;;;;:31;;;23306:247;;23372:14;;;;;;;;;;;:22;;;23395:11;;;;;;;;;;;23408:17;;;;;;;;;;;23372:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23372:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23372:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;23372:54:0;;;;;;;;;;;;;;;;23358:11;;:68;;;;;;;;;;;;;;;;;;23472:1;23449:25;;:11;;;;;;;;;;;:25;;;;23441:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23306:247;23120:1002;;;23583:32;:9;:32;23579:543;;;23661:1;23638:25;;:11;;;;;;;;;;;:25;;;23630:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23760:4;23740:17;;:24;;;;;;;;;;;;;;;;;;23804:1;23781:25;;:11;;;;;;;;;;;:25;;;23777:241;;23837:14;;;;;;;;;;;:22;;;23860:11;;;;;;;;;;;23873:17;;;;;;;;;;;23837:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23837:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23837:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;23837:54:0;;;;;;;;;;;;;;;;23823:11;;:68;;;;;;;;;;;;;;;;;;23937:1;23914:25;;:11;;;;;;;;;;;:25;;;;23906:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23777:241;23579:543;;;24044:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23579:543;23120:1002;22866:1256;22647:1475;24138:33;24155:9;24166:4;24138:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;22461:1718:::0;;:::o;15669:22::-;;;;:::o;16520:36::-;;;;:::o;15934:25::-;;;;:::o;15011:42::-;;;;;;;;;;;;;:::o;13895:162::-;14225:1;14191:18;:30;14210:10;14191:30;;;;;;;;;;;;;;;;:35;14183:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14004:1:::1;13974:18:::0;:27:::1;13993:7;13974:27;;;;;;;;;;;;;;;:31;;;;14021:28;14041:7;14021:28;;;;;;;;;;;;;;;;;;;;;;13895:162:::0;:::o;15482:32::-;;;;:::o;15206:58::-;;;;:::o;15273:47::-;;;;;;;;;;;;;:::o;16245:41::-;;;;:::o;28945:853::-;28993:7;29035:1;29017:14;;:19;29013:54;;;29045:22;;29038:29;;;;29013:54;29078:19;29100:29;29109:3;29114:14;;29100:8;:29::i;:::-;29078:51;;29158:10;;29144:11;:24;29140:65;;;29192:1;29185:8;;;;;29140:65;29215:18;29238:22;;29215:45;;29271:20;29294:33;29303:11;29316:10;;29294:8;:33::i;:::-;29271:56;;29357:1;29342:12;:16;29338:250;;;29406:22;;29391:12;:37;29390:79;;29457:12;29390:79;;;29432:22;;29390:79;29375:94;;29497:79;29507:56;29514:29;;29545:12;20846:8;29507:6;:56::i;:::-;29565:10;29497:9;:79::i;:::-;29484:92;;29338:250;29598:17;29618:57;29626:21;;20846:8;29649:19;:17;:19::i;:::-;:25;;;;;;29618:7;:57::i;:::-;29598:77;;29703:9;29690:10;:22;29686:77;;;29742:9;29729:22;;29686:77;29780:10;29773:17;;;;;;28945:853;;:::o;26520:333::-;26585:7;26619:1;26609:7;;:11;26605:222;;;26650:50;26717:30;:28;:30::i;:::-;26635:112;;;26767:48;26776:3;26781:23;:33;;;26767:8;:48::i;:::-;26760:55;;;;;26605:222;26844:1;26837:8;;26520:333;;:::o;32255:413::-;32375:17;32427:1;32413:11;:15;32405:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32504:20;32554:11;32527:24;;:38;;;;;;32504:61;;32634:26;;32599:32;32608:8;32618:12;32599:8;:32::i;:::-;:61;;;;;;32576:84;;32255:413;;;;;:::o;28281:199::-;28338:7;28373:11;;;;;;;;;;;28362:22;;:7;;:22;28358:61;;28406:1;28399:8;;;;28358:61;28436:36;28445:7;;28459:11;;;;;;;;;;;28454:17;;28436:8;:36::i;:::-;28429:43;;28281:199;;:::o;14963:39::-;;;;;;;;;;;;;:::o;15601:29::-;;;;:::o;14706:43::-;;;;:::o;16167:25::-;;;;:::o;14911:45::-;;;;;;;;;;;;;:::o;24185:1388::-;14225:1;14191:18;:30;14210:10;14191:30;;;;;;;;;;;;;;;;:35;14183:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24281:37:::1;:9;:37;24277:1239;;;24345:4;24320:22;:29;;;;24277:1239;;;24369:36;:9;:36;24365:1151;;;24435:22;;24428:4;:29;24420:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24560:4;24536:21;:28;;;;24365:1151;;;24595:44;:9;:44;24591:925;;;20846:8;24662:4;:11;;24654:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24789:4;24757:29;:36;;;;24591:925;;;24824:37;:9;:37;24820:696;;;24891:1;24884:4;:8;24876:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25004:4;24979:22;:29;;;;24820:696;;;25039:30;:9;:30;25035:481;;;25099:1;25092:4;:8;25084:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25204:4;25186:15;:22;;;;25035:481;;;25239:28;:9;:28;25235:281;;;25297:10;;25290:4;:17;25282:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25407:4;25391:13;:20;;;;25235:281;;;25438:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25235:281;25035:481;24820:696;24591:925;24365:1151;24277:1239;25532:33;25549:9;25560:4;25532:33;;;;;;;;;;;;;;;;;;;;;;;;24185:1388:::0;;:::o;5012:258::-;5084:16;;:::i;:::-;5113:6;5143:1;5138;:6;:54;;;;5184:4;:7;;;5179:13;;5174:1;5169;5158:4;:7;;;5153:13;;:17;5149:21;;;5148:27;;;;;;:44;5138:54;5130:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5250:12;;;;;;;;5260:1;5250:12;;;5243:19;;;5012:258;;;;:::o;5974:130::-;6039:7;4169:3;6074:21;;:4;:7;;;:21;;6059:37;;5974:130;;;:::o;20861:103::-;20917:6;20946:1;20941;:6;;20940:16;;20955:1;20940:16;;;20951:1;20940:16;20936:20;;20861:103;;;;:::o;6773:144::-;6830:6;6872:1;6866;6862;:5;6858:9;;;6857:16;;6849:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6773:144;;;;:::o;11847:1036::-;11933:21;11956;11979;12030:23;:21;:23::i;:::-;12013:40;;12098:4;12083:41;;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12083:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12083:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12083:43:0;;;;;;;;;;;;;;;;12064:62;;12171:4;12156:41;;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12156:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12156:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12156:43:0;;;;;;;;;;;;;;;;12137:62;;12314:16;12332;12350:25;12394:4;12379:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12379:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;12379:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12313:100;;;;;;12450:14;12428:36;;:18;:36;;;12424:452;;12529:18;12567;12550:14;:35;12529:56;;12736:11;12696:51;;12701:28;12710:8;12720;12701;:28::i;:::-;:31;;;12696:37;;:51;12676:71;;;;12853:11;12813:51;;12818:28;12827:8;12837;12818;:28::i;:::-;:31;;;12813:37;;:51;12793:71;;;;12424:452;;11847:1036;;;;;;;;:::o;35181:1281::-;35399:22;35423:18;35445:13;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35445:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35445:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35445:37:0;;;;;;;;;;;;;;;;;;;;;;;;;35398:84;;;;35501:13;35493:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35601:28;35632:48;35641:14;35657:22;35632:8;:48::i;:::-;35601:79;;35731:25;35762:51;;;;;;;;35787:3;35762:51;;;;35792:20;35762:51;;;35731:83;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;35731:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35861:19;35886:73;;;;;;;;35905:3;35886:73;;;;35910:23;35886:73;;;;35935:23;35886:73;;;35861:99;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;35861:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36031:56;36040:24;;36066:20;36031:8;:56::i;:::-;36004:24;:83;;;;36156:11;;;;;;;;;;;36145:22;;:7;;:22;36141:314;;36212:62;36290:30;:28;:30::i;:::-;36182:138;;;36360:83;36369:24;;36395:29;:47;;;36360:8;:83::i;:::-;36333:24;:110;;;;36141:314;;35181:1281;;;;;;:::o;27145:1037::-;27243:7;27277:1;27267:7;;:11;27263:881;;;27308:50;27375:30;:28;:30::i;:::-;27293:112;;;27420:19;27442:48;27451:3;27456:23;:33;;;27442:8;:48::i;:::-;27420:70;;27504:14;27525:42;27536:11;;;;;;;;;;;27549:17;;;;;;;;;;;27525:10;:42::i;:::-;27503:64;;;27580:24;27633:11;;;;;;;;;;;27623:21;;:6;:21;;;27619:433;;;27682:150;27724:23;:40;;;27766:16;27784:14;27800:15;;27682:23;:150::i;:::-;27663:169;;27619:433;;;27888:150;27930:23;:40;;;27972:16;27990:14;28006:15;;27888:23;:150::i;:::-;27869:169;;27619:433;28073:59;28099:14;28115:16;28073:25;:59::i;:::-;28066:66;;;;;;;;27263:881;28163:11;;28156:18;;27145:1037;;;;;:::o;6624:143::-;6681:6;6723:1;6717;6713;:5;6709:9;;;6708:16;;6700:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6624:143;;;;:::o;29804:613::-;29916:19;29895:40;;29903:8;;;;;;;;;;;29895:40;;;29891:53;;;29937:7;;29891:53;29958:52;29994:1;29965:31;;29973:8;;;;;;;;;;;29965:31;;;30008:1;29998:6;:11;29958:6;:52::i;:::-;29954:65;;;30012:7;;29954:65;30029:24;30088:1;30057:33;;:19;:33;;;30056:70;;30107:19;30056:70;;;30094:10;30056:70;30029:97;;30141:8;;;;;;;;;;;:18;;;30160:16;30178:8;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30178:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30178:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;30178:21:0;;;;;;;;;;;;;;;;30201:6;30141:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30141:67:0;;;;;;;;;;;;;;30137:273;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;30342:56:0;30359:12;30373:16;30391:6;30342:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30342:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30289:121;30137:273;;;30229:38;30242:16;30260:6;30229:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;30137:273;29804:613;;;;:::o;25722:103::-;25774:6;25815:1;25812;25808:9;25803:14;;25801:17;;;;:::o;21200:1060::-;21266:6;21316:1;21323;21318:53;;;;21426:1;21423;21419:9;21434:1;21429:20;;;;21465:1;21460:6;;21412:56;;21429:20;21443:4;21438:9;;21412:56;;21508:1;21502:4;21498:12;21564:1;21561;21557:9;21552:14;;21546:681;21569:1;21546:681;;;21629:1;21626;21622:9;21678:1;21674;21670:2;21666:10;21663:17;21653:2;;21693:1;21691;21684:11;21653:2;21742:4;21738:2;21734:13;21784:2;21775:7;21772:15;21769:2;;;21799:1;21797;21790:11;21769:2;21843:4;21834:7;21830:18;21825:23;;21879:1;21877;21873:8;21870:2;;;21926:1;21923;21919:9;22002:1;21998;21994:2;21990:10;21987:17;21980:25;21975:1;21968:9;21961:17;21957:49;21954:2;;;22018:1;22016;22009:11;21954:2;22071:4;22067:2;22063:13;22117:2;22108:7;22105:15;22102:2;;;22132:1;22130;22123:11;22102:2;22180:4;22171:7;22167:18;22162:23;;21882:326;;21870:2;21589:638;;21584:1;21582;21578:8;21573:13;;21546:681;;;21393:849;21309:933;;21318:53;21333:1;21340;21335:18;;;;21368:1;21363:6;;21326:44;;21335:18;21348:4;21343:9;;21326:44;;21309:933;;21294:959;;;;;:::o;21085:109::-;21143:6;20846:8;21166:14;21175:1;21178;21166:8;:14::i;:::-;:20;;;;;;21162:24;;21085:109;;;;:::o;25959:453::-;26028:50;26080:62;26155:32;26190:26;:24;:26::i;:::-;26155:61;;26262:19;26282:24;26262:45;;;;;;;;;;;;;;;;;;26227:80;;26353:25;26379:24;26353:51;;;;;;;;;;;;;;;;;;26318:86;;25959:453;;;:::o;6923:157::-;6980:6;7012:1;7007;:6;:30;;;;7036:1;7031;7026;7022;:5;7018:9;;;7017:15;;;;;;:20;7007:30;6999:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6923:157;;;;:::o;11618:123::-;11674:6;11725:7;11707:15;:25;;;;;;11693:40;;11618:123;:::o;5429:246::-;5510:16;;:::i;:::-;5561:1;5547:11;:15;;;5539:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5608:59;;;;;;;;5655:11;5618:48;;4169:3;5619:32;;5627:9;5619:18;;:32;;;;5618:48;;;;;;;;5608:59;;;;;5601:66;;5429:246;;;;:::o;7189:349::-;7264:14;7280;7325:6;7315:16;;:6;:16;;;;7307:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7412:6;7403:15;;:6;:15;;;:53;;7441:6;7449;7403:53;;;7422:6;7430;7403:53;7384:72;;;;;;;;7493:1;7475:20;;:6;:20;;;;7467:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7189:349;;;;;:::o;25611:105::-;25666:6;25706:1;25703;25700:8;25695:13;;25693:16;;;;:::o;37173:841::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://cf35ca0a0c3a47166b82775a6cfd0fd3dc340453abe7540b509022e930bdcae8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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