ETH Price: $3,328.33 (+0.56%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw119431742021-02-28 2:33:491427 days ago1614479629IN
0x4ae5ecc0...327e73D6B
0 ETH0.0083110177.676651
Withdraw118563872021-02-14 18:15:501441 days ago1613326550IN
0x4ae5ecc0...327e73D6B
0 ETH0.0211794888.00000134
Withdraw117330452021-01-26 18:40:471460 days ago1611686447IN
0x4ae5ecc0...327e73D6B
0 ETH0.0092674465
Partial Reward117008882021-01-21 20:09:501465 days ago1611259790IN
0x4ae5ecc0...327e73D6B
0 ETH0.0035869156
Withdraw116786042021-01-18 10:09:251468 days ago1610964565IN
0x4ae5ecc0...327e73D6B
0 ETH0.0144138187
Withdraw116693992021-01-17 0:06:401469 days ago1610842000IN
0x4ae5ecc0...327e73D6B
0 ETH0.01031768.78
Withdraw116517252021-01-14 6:56:271472 days ago1610607387IN
0x4ae5ecc0...327e73D6B
0 ETH0.0172363779
Unlock116398012021-01-12 11:20:051474 days ago1610450405IN
0x4ae5ecc0...327e73D6B
0 ETH0.0178919871.6
Partial Reward116364232021-01-11 22:40:281475 days ago1610404828IN
0x4ae5ecc0...327e73D6B
0 ETH0.0049896266.6831
Withdraw116122242021-01-08 5:51:171478 days ago1610085077IN
0x4ae5ecc0...327e73D6B
0 ETH0.0097752359
Withdraw116002622021-01-06 9:41:111480 days ago1609926071IN
0x4ae5ecc0...327e73D6B
0 ETH0.0091136569
Withdraw115970242021-01-05 21:36:511481 days ago1609882611IN
0x4ae5ecc0...327e73D6B
0 ETH0.0154084293
Withdraw115962102021-01-05 18:39:131481 days ago1609871953IN
0x4ae5ecc0...327e73D6B
0 ETH0.01685936118
Withdraw115960462021-01-05 18:05:021481 days ago1609869902IN
0x4ae5ecc0...327e73D6B
0 ETH0.01829102110
Withdraw115959602021-01-05 17:47:511481 days ago1609868871IN
0x4ae5ecc0...327e73D6B
0 ETH0.02630729106
Withdraw115959502021-01-05 17:44:551481 days ago1609868695IN
0x4ae5ecc0...327e73D6B
0 ETH0.0125623890
Withdraw115947082021-01-05 13:13:231481 days ago1609852403IN
0x4ae5ecc0...327e73D6B
0 ETH0.0145370569
Partial Reward115915992021-01-05 1:34:571481 days ago1609810497IN
0x4ae5ecc0...327e73D6B
0 ETH0.0098864132
Partial Reward115909912021-01-04 23:24:271482 days ago1609802667IN
0x4ae5ecc0...327e73D6B
0 ETH0.0063481485
Partial Reward115779642021-01-02 23:19:551484 days ago1609629595IN
0x4ae5ecc0...327e73D6B
0 ETH0.0043316758
Partial Reward115779632021-01-02 23:19:431484 days ago1609629583IN
0x4ae5ecc0...327e73D6B
0 ETH0.0043309758
Partial Reward115175602020-12-24 17:07:261493 days ago1608829646IN
0x4ae5ecc0...327e73D6B
0 ETH0.0037377550.00000145
Partial Reward115062832020-12-22 23:40:291494 days ago1608680429IN
0x4ae5ecc0...327e73D6B
0 ETH0.0040367754
Partial Reward115062832020-12-22 23:40:291494 days ago1608680429IN
0x4ae5ecc0...327e73D6B
0 ETH0.0040361254
Partial Reward115044212020-12-22 16:38:191495 days ago1608655099IN
0x4ae5ecc0...327e73D6B
0 ETH0.0062223483
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
111803902020-11-02 22:33:281545 days ago1604356408
0x4ae5ecc0...327e73D6B
4.30725698 ETH
111752512020-11-02 3:35:321545 days ago1604288132
0x4ae5ecc0...327e73D6B
1.91100178 ETH
111682402020-11-01 1:36:351546 days ago1604194595
0x4ae5ecc0...327e73D6B
0.72536266 ETH
111560082020-10-30 4:30:271548 days ago1604032227
0x4ae5ecc0...327e73D6B
0.5887338 ETH
111540062020-10-29 21:04:081549 days ago1604005448
0x4ae5ecc0...327e73D6B
3.81533995 ETH
111299982020-10-26 4:49:541552 days ago1603687794
0x4ae5ecc0...327e73D6B
8.69633437 ETH
111262432020-10-25 14:53:221553 days ago1603637602
0x4ae5ecc0...327e73D6B
9.29957528 ETH
110943672020-10-20 17:30:471558 days ago1603215047
0x4ae5ecc0...327e73D6B
11.09050215 ETH
110730942020-10-17 11:10:511561 days ago1602933051
0x4ae5ecc0...327e73D6B
13.29304829 ETH
110688612020-10-16 19:34:381562 days ago1602876878
0x4ae5ecc0...327e73D6B
0.14538284 ETH
110636482020-10-16 0:21:351562 days ago1602807695
0x4ae5ecc0...327e73D6B
4.80126989 ETH
110635402020-10-15 23:56:241562 days ago1602806184
0x4ae5ecc0...327e73D6B
1.12489896 ETH
110560182020-10-14 20:37:371564 days ago1602707857
0x4ae5ecc0...327e73D6B
17.42634547 ETH
110202012020-10-09 8:36:491569 days ago1602232609
0x4ae5ecc0...327e73D6B
5.36524285 ETH
110201742020-10-09 8:31:021569 days ago1602232262
0x4ae5ecc0...327e73D6B
1.41956071 ETH
110201672020-10-09 8:29:341569 days ago1602232174
0x4ae5ecc0...327e73D6B
5.5466706 ETH
110201672020-10-09 8:29:341569 days ago1602232174
0x4ae5ecc0...327e73D6B
4.12710989 ETH
110200372020-10-09 7:58:021569 days ago1602230282
0x4ae5ecc0...327e73D6B
3.51529014 ETH
110199552020-10-09 7:39:391569 days ago1602229179
0x4ae5ecc0...327e73D6B
8.6778874 ETH
110198832020-10-09 7:23:581569 days ago1602228238
0x4ae5ecc0...327e73D6B
8.33694315 ETH
110198782020-10-09 7:21:441569 days ago1602228104
0x4ae5ecc0...327e73D6B
8.33694315 ETH
110198752020-10-09 7:21:001569 days ago1602228060
0x4ae5ecc0...327e73D6B
8.33694315 ETH
110190682020-10-09 4:15:391569 days ago1602216939
0x4ae5ecc0...327e73D6B
7.84948831 ETH
110189642020-10-09 3:53:051569 days ago1602215585
0x4ae5ecc0...327e73D6B
23.99439436 ETH
110188642020-10-09 3:30:551569 days ago1602214255
0x4ae5ecc0...327e73D6B
1.41070253 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x7767e32A...5df440971
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
LiquidityMining

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-05
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

contract LiquidityMining {

    address private constant UNISWAP_V2_FACTORY = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;

    address private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address private WETH_ADDRESS = IUniswapV2Router(UNISWAP_V2_ROUTER).WETH();

    address[] private TOKENS;

    mapping(uint256 => uint256) private _totalPoolAmount;

    uint256[] private TIME_WINDOWS;

    uint256[] private REWARD_MULTIPLIERS;

    uint256[] private REWARD_DIVIDERS;

    uint256[] private REWARD_SPLIT_TRANCHES;

    address private _doubleProxy;

    address private _mainTokenAddress;

    address private _rewardTokenAddress;

    struct StakeInfo {
        address sender;
        uint256 poolPosition;
        uint256 firstAmount;
        uint256 secondAmount;
        uint256 poolAmount;
        uint256 reward;
        uint256 endBlock;
        uint256[] partialRewardBlockTimes;
        uint256 splittedReward;
    }

    uint256 private _startBlock;
    uint256 private _endBlock;

    mapping(uint256 => mapping(uint256 => StakeInfo)) private _stakeInfo;
    mapping(uint256 => uint256) private _stakeInfoLength;

    event Staked(address indexed sender, uint256 indexed tier, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward, uint256 endBlock, uint256[] partialRewardBlockTimes, uint256 splittedReward);
    event Withdrawn(address sender, address indexed receiver, uint256 indexed tier, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);
    event PartialWithdrawn(address sender, address indexed receiver, uint256 indexed tier, uint256 reward);

    event Unlocked(address indexed receiver, uint256 indexed tier, uint256 position, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);
    event Flushed(address indexed receiver, uint256 indexed tier, uint256 position, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);

    constructor(address mainTokenAddress, address rewardTokenAddress, uint256 startBlock, uint256 endBlock, address doubleProxy, address[] memory tokens, uint256[] memory timeWindows, uint256[] memory rewardMultipliers, uint256[] memory rewardDividers, uint256[] memory rewardSplitTranches) {

        _mainTokenAddress = mainTokenAddress;

        _rewardTokenAddress = rewardTokenAddress;

        _startBlock = startBlock;

        _endBlock = endBlock;

        _doubleProxy = doubleProxy;

        _initArrays(tokens, timeWindows, rewardMultipliers, rewardDividers, rewardSplitTranches);
    }

    function _initArrays(address[] memory tokens, uint256[] memory timeWindows, uint256[] memory rewardMultipliers, uint256[] memory rewardDividers, uint256[] memory rewardSplitTranches) private {

        for(uint256 i = 0; i < tokens.length; i++) {
            TOKENS.push(tokens[i]);
        }

        assert(timeWindows.length == rewardMultipliers.length && rewardMultipliers.length == rewardDividers.length && rewardDividers.length == rewardSplitTranches.length);
        for(uint256 i = 0; i < timeWindows.length; i++) {
            TIME_WINDOWS.push(timeWindows[i]);
        }

        for(uint256 i = 0; i < rewardMultipliers.length; i++) {
            REWARD_MULTIPLIERS.push(rewardMultipliers[i]);
        }

        for(uint256 i = 0; i < rewardDividers.length; i++) {
            REWARD_DIVIDERS.push(rewardDividers[i]);
        }

        for(uint256 i = 0; i < rewardSplitTranches.length; i++) {
            REWARD_SPLIT_TRANCHES.push(rewardSplitTranches[i]);
        }
    }

    function doubleProxy() public view returns(address) {
        return _doubleProxy;
    }

    function tokenAddress() public view returns(address) {
        return _mainTokenAddress;
    }

    function rewardTokenAddress() public view returns(address) {
        return _rewardTokenAddress;
    }

    function tokens() public view returns(address[] memory) {
        return TOKENS;
    }

    function tierData() public view returns(uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory) {
        return (TIME_WINDOWS, REWARD_MULTIPLIERS, REWARD_DIVIDERS, REWARD_SPLIT_TRANCHES);
    }

    function startBlock() public view returns(uint256) {
        return _startBlock;
    }

    function endBlock() public view returns(uint256) {
        return _endBlock;
    }

    function totalPoolAmount(uint256 poolPosition) public view returns(uint256) {
        return _totalPoolAmount[poolPosition];
    }

    function setDoubleProxy(address newDoubleProxy) public {
        require(IMVDFunctionalitiesManager(IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getMVDFunctionalitiesManagerAddress()).isAuthorizedFunctionality(msg.sender), "Unauthorized Action!");
        _doubleProxy = newDoubleProxy;
    }

    function stake(uint256 tier, uint256 poolPosition, uint256 originalFirstAmount, uint256 firstAmountMin, uint256 value, uint256 secondAmountMin) public payable {
        require(block.number >= _startBlock, "Staking is still not available");
        require(block.number < _endBlock, "Staking has reached end block");
        require(poolPosition < TOKENS.length, "Unknown Pool");
        require(tier < TIME_WINDOWS.length, "Unknown tier");

        require(originalFirstAmount > 0, "First amount must be greater than 0");

        uint256 originalSecondAmount = TOKENS[poolPosition] == WETH_ADDRESS ? msg.value : value;
        require(originalSecondAmount > 0, "Second amount must be greater than 0");

        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());

        _transferTokensAndCheckAllowance(_mainTokenAddress, originalFirstAmount);
        _transferTokensAndCheckAllowance(TOKENS[poolPosition], originalSecondAmount);

        address secondToken = TOKENS[poolPosition];

        (uint256 firstAmount, uint256 secondAmount, uint256 poolAmount) = _createPoolToken(originalFirstAmount, firstAmountMin, originalSecondAmount, secondAmountMin, _mainTokenAddress, secondToken);

        _totalPoolAmount[poolPosition] += poolAmount;

        (uint256 minCap,, uint256 remainingToStake) = getStakingInfo(tier);
        require(firstAmount >= minCap, "Amount to stake is less than the current min cap");
        require(firstAmount <= remainingToStake, "Amount to stake must be less than the current remaining one");

        calculateRewardAndAddStakingPosition(tier, poolPosition, firstAmount, secondAmount, poolAmount, proxy);
    }

    function getStakingInfo(uint256 tier) public view returns(uint256 minCap, uint256 hardCap, uint256 remainingToStake) {
        (minCap, hardCap) = getStakingCap(tier);
        remainingToStake = hardCap;
        uint256 length = _stakeInfoLength[tier];
        for(uint256 i = 0; i < length; i++) {
            if(_stakeInfo[tier][i].endBlock > block.number) {
                remainingToStake -= _stakeInfo[tier][i].firstAmount;
            }
        }
    }

    function getStakingCap(uint256 tier) public view returns(uint256, uint256) {
        IStateHolder stateHolder = IStateHolder(IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getStateHolderAddress());
        string memory tierString = _toString(tier);
        string memory addressString = _toLowerCase(_toString(address(this)));
        return (
            stateHolder.getUint256(string(abi.encodePacked("staking.", addressString, ".tiers[", tierString, "].minCap"))),
            stateHolder.getUint256(string(abi.encodePacked("staking.", addressString, ".tiers[", tierString, "].hardCap")))
        );
    }

    function _transferTokensAndCheckAllowance(address tokenAddr, uint256 value) private {
        if(tokenAddr == WETH_ADDRESS) {
            return;
        }
        IERC20 token = IERC20(tokenAddr);
        token.transferFrom(msg.sender, address(this), value);
        if(token.allowance(address(this), UNISWAP_V2_ROUTER) <= value) {
            token.approve(UNISWAP_V2_ROUTER, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        }
    }

    function _createPoolToken(uint256 originalFirstAmount, uint256 firstAmountMin, uint256 originalSecondAmount, uint256 secondAmountMin, address firstToken, address secondToken) private returns(uint256 firstAmount, uint256 secondAmount, uint256 poolAmount) {
        if(secondToken == WETH_ADDRESS) {
            (firstAmount, secondAmount, poolAmount) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidityETH{value: originalSecondAmount}(
                firstToken,
                originalFirstAmount,
                firstAmountMin,
                secondAmountMin,
                address(this),
                block.timestamp + 1000
            );
        } else {
            (firstAmount, secondAmount, poolAmount) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidity(
                firstToken,
                secondToken,
                originalFirstAmount,
                originalSecondAmount,
                firstAmountMin,
                secondAmountMin,
                address(this),
                block.timestamp + 1000
            );
        }
        if(firstAmount < originalFirstAmount) {
            IERC20(firstToken).transfer(msg.sender, originalFirstAmount - firstAmount);
        }
        if(secondAmount < originalSecondAmount) {
            if(secondToken == WETH_ADDRESS) {
                payable(msg.sender).transfer(originalSecondAmount - secondAmount);
            } else {
                IERC20(secondToken).transfer(msg.sender, originalSecondAmount - secondAmount);
            }
        }
    }

    function calculateRewardAndAddStakingPosition(uint256 tier, uint256 poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, IMVDProxy proxy) private {
        uint256 partialRewardSingleBlockTime = TIME_WINDOWS[tier] / REWARD_SPLIT_TRANCHES[tier];
        uint256[] memory partialRewardBlockTimes = new uint256[](REWARD_SPLIT_TRANCHES[tier]);
        if(partialRewardBlockTimes.length > 0) {
            partialRewardBlockTimes[0] = block.number + partialRewardSingleBlockTime;
            for(uint256 i = 1; i < partialRewardBlockTimes.length; i++) {
                partialRewardBlockTimes[i] = partialRewardBlockTimes[i - 1] + partialRewardSingleBlockTime;
            }
        }
        uint256 reward = firstAmount * REWARD_MULTIPLIERS[tier] / REWARD_DIVIDERS[tier];
        StakeInfo memory stakeInfo = StakeInfo(msg.sender, poolPosition, firstAmount, secondAmount, poolAmount, reward, block.number + TIME_WINDOWS[tier], partialRewardBlockTimes, reward / REWARD_SPLIT_TRANCHES[tier]);
        _add(tier, stakeInfo);
        proxy.submit("liquidityMiningTransfer", abi.encode(address(0), 0, reward, _rewardTokenAddress));
        emit Staked(msg.sender, tier, poolPosition, firstAmount, secondAmount, poolAmount, reward, stakeInfo.endBlock, partialRewardBlockTimes, stakeInfo.splittedReward);
    }

    function _add(uint256 tier, StakeInfo memory element) private returns(uint256, uint256) {
        _stakeInfo[tier][_stakeInfoLength[tier]] = element;
        _stakeInfoLength[tier] = _stakeInfoLength[tier] + 1;
        return (element.reward, element.endBlock);
    }

    function _remove(uint256 tier, uint256 i) private {
        if(_stakeInfoLength[tier] <= i) {
            return;
        }
        _stakeInfoLength[tier] = _stakeInfoLength[tier] - 1;
        if(_stakeInfoLength[tier] > i) {
            _stakeInfo[tier][i] = _stakeInfo[tier][_stakeInfoLength[tier]];
        }
        delete _stakeInfo[tier][_stakeInfoLength[tier]];
    }

    function length(uint256 tier) public view returns(uint256) {
        return _stakeInfoLength[tier];
    }

    function stakeInfo(uint256 tier, uint256 position) public view returns(
        address,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256[] memory,
        uint256
    ) {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        return(
            tierStakeInfo.sender,
            tierStakeInfo.poolPosition,
            tierStakeInfo.firstAmount,
            tierStakeInfo.secondAmount,
            tierStakeInfo.poolAmount,
            tierStakeInfo.reward,
            tierStakeInfo.endBlock,
            tierStakeInfo.partialRewardBlockTimes,
            tierStakeInfo.splittedReward
        );
    }

    function partialReward(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        if(block.number >= tierStakeInfo.endBlock) {
            return withdraw(tier, position);
        }
        require(tierStakeInfo.reward > 0, "No more reward for this staking position");
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] > 0 && block.number >= tierStakeInfo.partialRewardBlockTimes[i]) {
                reward += tierStakeInfo.splittedReward;
                tierStakeInfo.partialRewardBlockTimes[i] = 0;
            }
        }
        reward = reward > tierStakeInfo.reward ? tierStakeInfo.reward : reward;
        require(reward > 0, "No reward to redeem");
        IERC20 token = IERC20(_rewardTokenAddress);
        token.transfer(tierStakeInfo.sender, reward);
        tierStakeInfo.reward = tierStakeInfo.reward - reward;
        _stakeInfo[tier][position] = tierStakeInfo;
        emit PartialWithdrawn(msg.sender, tierStakeInfo.sender, tier, reward);
    }

    function withdraw(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(block.number >= tierStakeInfo.endBlock, "Cannot actually withdraw this position");
        IERC20 token = IERC20(_rewardTokenAddress);
        if(tierStakeInfo.reward > 0) {
            token.transfer(tierStakeInfo.sender, tierStakeInfo.reward);
        }
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(tierStakeInfo.sender, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Withdrawn(msg.sender, tierStakeInfo.sender, tier, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward);
        _remove(tier, position);
    }

    function unlock(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(msg.sender == tierStakeInfo.sender, "Unlock can be done only by position owner");
        if(block.number >= tierStakeInfo.endBlock) {
            return withdraw(tier, position);
        }
        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());
        address walletAddress = proxy.getMVDWalletAddress();
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] == 0) {
                reward += tierStakeInfo.splittedReward;
            }
        }
        IERC20 token = IERC20(_rewardTokenAddress);
        if(reward > 0) {
            token.transferFrom(tierStakeInfo.sender, walletAddress, reward);
        }
        token.transfer(walletAddress, tierStakeInfo.reward);
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(tierStakeInfo.sender, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Unlocked(tierStakeInfo.sender, tier, position, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward + reward);
        _remove(tier, position);
    }

    function flushToDFO(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(msg.sender == tierStakeInfo.sender, "Flush can be done only by position owner");
        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());
        address walletAddress = proxy.getMVDWalletAddress();
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] > 0 && block.number >= tierStakeInfo.partialRewardBlockTimes[i]) {
                reward += tierStakeInfo.splittedReward;
                tierStakeInfo.partialRewardBlockTimes[i] = 0;
            }
        }
        reward = reward > tierStakeInfo.reward ? tierStakeInfo.reward : reward;
        IERC20 token = IERC20(_rewardTokenAddress);
        if(reward > 0) {
            token.transfer(tierStakeInfo.sender, reward);
        }
        if(tierStakeInfo.reward - reward > 0) {
            token.transfer(walletAddress, tierStakeInfo.reward - reward);
        }
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(walletAddress, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Flushed(tierStakeInfo.sender, tier, position, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward + reward);
        _remove(tier, position);
    }

    function _toString(uint _i) private pure returns(string memory) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    function _toString(address _addr) private pure returns(string memory) {
        bytes32 value = bytes32(uint256(_addr));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }

    function _toLowerCase(string memory str) private pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }
}

interface IMVDProxy {
    function getStateHolderAddress() external view returns(address);
    function getMVDWalletAddress() external view returns(address);
    function getMVDFunctionalitiesManagerAddress() external view returns(address);
    function submit(string calldata codeName, bytes calldata data) external payable returns(bytes memory returnData);
}

interface IStateHolder {
    function setUint256(string calldata name, uint256 value) external returns(uint256);
    function getUint256(string calldata name) external view returns(uint256);
    function getBool(string calldata varName) external view returns (bool);
    function clear(string calldata varName) external returns(string memory oldDataType, bytes memory oldVal);
}

interface IMVDFunctionalitiesManager {
    function isAuthorizedFunctionality(address functionality) external view returns(bool);
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface IUniswapV2Router {
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IDoubleProxy {
    function proxy() external view returns(address);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"address","name":"doubleProxy","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"timeWindows","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardMultipliers","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardDividers","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardSplitTranches","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolPosition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Flushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"PartialWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolPosition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"partialRewardBlockTimes","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"splittedReward","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolPosition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tier","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolPosition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"doubleProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"flushToDFO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"getStakingCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"minCap","type":"uint256"},{"internalType":"uint256","name":"hardCap","type":"uint256"},{"internalType":"uint256","name":"remainingToStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"partialReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDoubleProxy","type":"address"}],"name":"setDoubleProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"poolPosition","type":"uint256"},{"internalType":"uint256","name":"originalFirstAmount","type":"uint256"},{"internalType":"uint256","name":"firstAmountMin","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"secondAmountMin","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"stakeInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierData","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolPosition","type":"uint256"}],"name":"totalPoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x6080604052600436106101095760003560e01c80639d63848a11610095578063cbd99d0311610064578063cbd99d03146104ed578063dd58d9d514610520578063e9c4aa6a14610563578063f39d3c49146105ab578063fdd56605146105db57610109565b80639d63848a146104195780639d76ea581461047e578063a6b8c16a14610493578063aa8b99d2146104c357610109565b806348cd4cb1116100dc57806348cd4cb1146101c25780634eb9b592146101d7578063590c2a8b146101ec5780635bfadb24146102b15780635de3326c146102e157610109565b8063083c63231461010e578063125f9e3314610135578063167e478114610166578063441a3e7014610190575b600080fd5b34801561011a57600080fd5b50610123610616565b60408051918252519081900360200190f35b34801561014157600080fd5b5061014a61061c565b604080516001600160a01b039092168252519081900360200190f35b34801561017257600080fd5b506101236004803603602081101561018957600080fd5b503561062b565b34801561019c57600080fd5b506101c0600480360360408110156101b357600080fd5b5080359060200135610640565b005b3480156101ce57600080fd5b50610123610a44565b3480156101e357600080fd5b5061014a610a4a565b3480156101f857600080fd5b5061021c6004803603604081101561020f57600080fd5b5080359060200135610a59565b604051808a6001600160a01b0316815260200189815260200188815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561029557818101518382015260200161027d565b505050509050019a505050505050505050505060405180910390f35b3480156102bd57600080fd5b506101c0600480360360408110156102d457600080fd5b5080359060200135610b8c565b3480156102ed57600080fd5b506102f6611187565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561034257818101518382015260200161032a565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610381578181015183820152602001610369565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156103c05781810151838201526020016103a8565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156103ff5781810151838201526020016103e7565b505050509050019850505050505050505060405180910390f35b34801561042557600080fd5b5061042e6112eb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046a578181015183820152602001610452565b505050509050019250505060405180910390f35b34801561048a57600080fd5b5061014a61134d565b34801561049f57600080fd5b506101c0600480360360408110156104b657600080fd5b508035906020013561135c565b3480156104cf57600080fd5b50610123600480360360208110156104e657600080fd5b503561199a565b3480156104f957600080fd5b506101c06004803603602081101561051057600080fd5b50356001600160a01b03166119ac565b34801561052c57600080fd5b5061054a6004803603602081101561054357600080fd5b5035611b72565b6040805192835260208301919091528051918290030190f35b34801561056f57600080fd5b5061058d6004803603602081101561058657600080fd5b503561200c565b60408051938452602084019290925282820152519081900360600190f35b3480156105b757600080fd5b506101c0600480360360408110156105ce57600080fd5b5080359060200135612092565b6101c0600480360360c08110156105f157600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612472565b600b5490565b6009546001600160a01b031690565b6000818152600260205260409020545b919050565b6106486136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561070157602002820191906000526020600020905b8154815260200190600101908083116106ed575b50505091835250506008919091015460209091015280519091506001600160a01b0316610769576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c001514310156107ac5760405162461bcd60e51b81526004018080602001828103825260268152602001806138a56026913960400191505060405180910390fd5b60095460a08201516001600160a01b03909116901561085157806001600160a01b031663a9059cbb83600001518460a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b50505b600854602083015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b039091169291811061088e57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d602081101561090e57600080fd5b5051825160808401516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561096d57600080fd5b505af1158015610981573d6000803e3d6000fd5b505050506040513d602081101561099757600080fd5b50506080808301805160208581018051600090815260028352604080822054835183529181902094909103909355518651838801516060808a0151965160a0808c01518851338152978801949094528688019890985290850152958301959095529151919388936001600160a01b03909116927fec4d7fc8319e44dfa849ab87f565622b9cf848ce9959568c3066615ce9e2ef149281900390910190a4610a3e8484612826565b50505050565b600a5490565b6007546001600160a01b031690565b600080600080600080600060606000610a706136da565b60008c8152600c602090815260408083208e845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610b2957602002820191906000526020600020905b815481526020019060010190808311610b15575b505050505081526020016008820154815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509295985092959850929598565b610b946136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610c4d57602002820191906000526020600020905b815481526020019060010190808311610c39575b50505091835250506008919091015460209091015280519091506001600160a01b0316610cb5576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b03163314610cfd5760405162461bcd60e51b815260040180806020018281038252602981526020018061387c6029913960400191505060405180910390fd5b8060c001514310610d1857610d128383610640565b50611183565b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b158015610dcf57600080fd5b505afa158015610de3573d6000803e3d6000fd5b505050506040513d6020811015610df957600080fd5b505190506000805b8460e0015151811015610e41578460e001518181518110610e1e57fe5b602002602001015160001415610e3957846101000151820191505b600101610e01565b506009546001600160a01b03168115610ede578451604080516323b872dd60e01b81526001600160a01b0392831660048201528583166024820152604481018590529051918316916323b872dd916064808201926020929091908290030181600087803b158015610eb157600080fd5b505af1158015610ec5573d6000803e3d6000fd5b505050506040513d6020811015610edb57600080fd5b50505b806001600160a01b031663a9059cbb848760a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f3957600080fd5b505af1158015610f4d573d6000803e3d6000fd5b505050506040513d6020811015610f6357600080fd5b5050600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b0390911692918110610fa257fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d602081101561102257600080fd5b5051855160808701516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167f7cbd9649881e2e080f1eebfe980ccc4f8c52dcff4cc4b94ba7fd3831a4208aa58989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b50505050505b5050565b6060806060806003600460056006838054806020026020016040519081016040528092919081815260200182805480156111e057602002820191906000526020600020905b8154815260200190600101908083116111cc575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561123257602002820191906000526020600020905b81548152602001906001019080831161121e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561128457602002820191906000526020600020905b815481526020019060010190808311611270575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156112d657602002820191906000526020600020905b8154815260200190600101908083116112c2575b50505050509050935093509350935090919293565b6060600180548060200260200160405190810160405280929190818152602001828054801561134357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611325575b5050505050905090565b6008546001600160a01b031690565b6113646136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561141d57602002820191906000526020600020905b815481526020019060010190808311611409575b50505091835250506008919091015460209091015280519091506001600160a01b0316611485576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b031633146114cd5760405162461bcd60e51b815260040180806020018281038252602881526020018061382c6028913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d60208110156115ae57600080fd5b505190506000805b8460e00151518110156116375760008560e0015182815181106115d557fe5b602002602001015111801561160157508460e0015181815181106115f557fe5b60200260200101514310155b1561162f578461010001518201915060008560e00151828151811061162257fe5b6020026020010181815250505b6001016115b6565b508360a001518111611649578061164f565b8360a001515b6009549091506001600160a01b031681156116ec57806001600160a01b031663a9059cbb8660000151846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bf57600080fd5b505af11580156116d3573d6000803e3d6000fd5b505050506040513d60208110156116e957600080fd5b50505b60a08501518290031561178357806001600160a01b031663a9059cbb84848860a00151036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050506040513d602081101561178057600080fd5b50505b600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b03909116929181106117c057fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561181657600080fd5b505afa15801561182a573d6000803e3d6000fd5b505050506040513d602081101561184057600080fd5b505160808601516040805163a9059cbb60e01b81526001600160a01b038781166004830152602482019390935290519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561189e57600080fd5b505af11580156118b2573d6000803e3d6000fd5b505050506040513d60208110156118c857600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167fcd8847f12db1ff729f1b63807b063a343f7180ebc4045920aa25434447bdd14a8989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b6000908152600d602052604090205490565b600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d6020811015611a9257600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611adc57600080fd5b505afa158015611af0573d6000803e3d6000fd5b505050506040513d6020811015611b0657600080fd5b5051611b50576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6020811015611bef57600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b158015611c3357600080fd5b505afa158015611c47573d6000803e3d6000fd5b505050506040513d6020811015611c5d57600080fd5b505190506060611c6c85612970565b90506060611c81611c7c30612a48565b612bbb565b9050826001600160a01b0316630bb687e3828460405160200180806739ba30b5b4b7339760c11b81525060080183805190602001908083835b60208310611cd95780518252601f199092019160209182019101611cba565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611d345780518252601f199092019160209182019101611d15565b6001836020036101000a038019825116818451168082178552505050505050905001806705d2e6d696e4361760c41b815250600801925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611dc8578181015183820152602001611db0565b50505050905090810190601f168015611df55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611e1257600080fd5b505afa158015611e26573d6000803e3d6000fd5b505050506040513d6020811015611e3c57600080fd5b50516040516739ba30b5b4b7339760c11b602082810191825284516001600160a01b03881693630bb687e39387938993919260280191908501908083835b60208310611e995780518252601f199092019160209182019101611e7a565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611ef45780518252601f199092019160209182019101611ed5565b6001836020036101000a038019825116818451168082178552505050505050905001806805d2e686172644361760bc1b815250600901925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f89578181015183820152602001611f71565b50505050905090810190601f168015611fb65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611fd357600080fd5b505afa158015611fe7573d6000803e3d6000fd5b505050506040513d6020811015611ffd57600080fd5b50519095509350505050915091565b600080600061201a84611b72565b6000868152600d60205260408120549295509093508392505b81811015612089576000868152600c60209081526040808320848452909152902060060154431015612081576000868152600c60209081526040808320848452909152902060020154909203915b600101612033565b50509193909250565b61209a6136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561215357602002820191906000526020600020905b81548152602001906001019080831161213f575b50505091835250506008919091015460209091015280519091506001600160a01b03166121bb576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c0015143106121d057610d128383610640565b60008160a00151116122135760405162461bcd60e51b81526004018080602001828103825260288152602001806138546028913960400191505060405180910390fd5b6000805b8260e00151518110156122985760008360e00151828151811061223657fe5b602002602001015111801561226257508260e00151818151811061225657fe5b60200260200101514310155b15612290578261010001518201915060008360e00151828151811061228357fe5b6020026020010181815250505b600101612217565b508160a0015181116122aa57806122b0565b8160a001515b9050600081116122fd576040805162461bcd60e51b81526020600482015260136024820152724e6f2072657761726420746f2072656465656d60681b604482015290519081900360640190fd5b60095482516040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519190921691829163a9059cbb916044808201926020929091908290030181600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050506040513d602081101561238257600080fd5b505060a08301805183900381526000868152600c60209081526040808320888452825291829020865181546001600160a01b0319166001600160a01b0390911617815581870151600182015591860151600283015560608601516003830155608086015160048301559151600582015560c0850151600682015560e08501518051869361241692600785019291019061372f565b50610100919091015160089091015582516040805133815260208101859052815188936001600160a01b0316927f5777300364834e2d145b85cee28a0d45c4be04f1c7c24116ec72a6b5c839631b928290030190a35050505050565b600a544310156124c9576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e67206973207374696c6c206e6f7420617661696c61626c650000604482015290519081900360640190fd5b600b54431061251f576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e6720686173207265616368656420656e6420626c6f636b000000604482015290519081900360640190fd5b6001548510612564576040805162461bcd60e51b815260206004820152600c60248201526b155b9adb9bdddb88141bdbdb60a21b604482015290519081900360640190fd5b60035486106125a9576040805162461bcd60e51b815260206004820152600c60248201526b2ab735b737bbb7103a34b2b960a11b604482015290519081900360640190fd5b600084116125e85760405162461bcd60e51b81526004018080602001828103825260238152602001806138cb6023913960400191505060405180910390fd5b60008054600180546001600160a01b03909216918890811061260657fe5b6000918252602090912001546001600160a01b0316146126265782612628565b345b9050600081116126695760405162461bcd60e51b815260040180806020018281038252602481526020018061391e6024913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b1580156126ae57600080fd5b505afa1580156126c2573d6000803e3d6000fd5b505050506040513d60208110156126d857600080fd5b50516008549091506126f3906001600160a01b031687612c8d565b61271e6001888154811061270357fe5b6000918252602090912001546001600160a01b031683612c8d565b60006001888154811061272d57fe5b60009182526020822001546008546001600160a01b0391821693508291829161275f918c918c918a918c911689612e56565b60008e81526002602052604081208054830190559295509093509150806127858e61200c565b9250509150818510156127c95760405162461bcd60e51b81526004018080602001828103825260308152602001806138ee6030913960400191505060405180910390fd5b808511156128085760405162461bcd60e51b815260040180806020018281038252603b8152602001806137f1603b913960400191505060405180910390fd5b6128168e8e8787878c61316b565b5050505050505050505050505050565b6000828152600d6020526040902054811061284057611183565b6000828152600d60205260409020805460001901908190558110156128fc576000828152600c60209081526040808320600d83528184205484529091528082208383529120815481546001600160a01b0319166001600160a01b03909116178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560068083015490820155600780830180546128f1928401919061377a565b506008918201549101555b6000828152600c60209081526040808320600d8352818420548452909152812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600681018290559061296260078301826137ba565b600882016000905550505050565b60608161299557506040805180820190915260018152600360fc1b602082015261063b565b8160005b81156129ad57600101600a82049150612999565b60608167ffffffffffffffff811180156129c657600080fd5b506040519080825280601f01601f1916602001820160405280156129f1576020820181803683370190505b50905060001982015b8515612a3f57600a860660300160f81b82828060019003935081518110612a1d57fe5b60200101906001600160f81b031916908160001a905350600a860495506129fa565b50949350505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180368337019050509050600360fc1b81600081518110612aac57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612ad557fe5b60200101906001600160f81b031916908160001a90535060005b6014811015612a3f578260048583600c0160208110612b0a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110612b2a57fe5b602001015160f81c60f81b828260020260020181518110612b4757fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110612b6e57fe5b825191901a600f16908110612b7f57fe5b602001015160f81c60f81b828260020260030181518110612b9c57fe5b60200101906001600160f81b031916908160001a905350600101612aef565b60608160005b8151811015612c8657604160f81b828281518110612bdb57fe5b01602001516001600160f81b03191610801590612c165750605a60f81b828281518110612c0457fe5b01602001516001600160f81b03191611155b612c3a57818181518110612c2657fe5b01602001516001600160f81b031916612c5b565b818181518110612c4657fe5b602001015160f81c60f81b60f81c60200160f81b5b828281518110612c6757fe5b60200101906001600160f81b031916908160001a905350600101612bc1565b5092915050565b6000546001600160a01b0383811691161415612ca857611183565b604080516323b872dd60e01b815233600482015230602482015260448101839052905183916001600160a01b038316916323b872dd916064808201926020929091908290030181600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b505060408051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d6024820152905183916001600160a01b0384169163dd62ed3e91604480820192602092909190829003018186803b158015612d8f57600080fd5b505afa158015612da3573d6000803e3d6000fd5b505050506040513d6020811015612db957600080fd5b505111612e51576040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b158015612e2457600080fd5b505af1158015612e38573d6000803e3d6000fd5b505050506040513d6020811015612e4e57600080fd5b50505b505050565b60008054819081906001600160a01b0385811691161415612f3a576040805163f305d71960e01b81526001600160a01b0387166004820152602481018b9052604481018a9052606481018890523060848201526103e8420160a48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163f305d719918a9160c48082019260609290919082900301818588803b158015612ef457600080fd5b505af1158015612f08573d6000803e3d6000fd5b50505050506040513d6060811015612f1f57600080fd5b5080516020820151604090920151909450909250905061300b565b6040805162e8e33760e81b81526001600160a01b03878116600483015286166024820152604481018b905260648101899052608481018a905260a481018890523060c48201526103e8420160e48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e33700916101048083019260609291908290030181600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d6060811015612ff457600080fd5b508051602082015160409092015190945090925090505b88831015613090576040805163a9059cbb60e01b8152336004820152848b03602482015290516001600160a01b0387169163a9059cbb9160448083019260209291908290030181600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b505050506040513d602081101561308d57600080fd5b50505b8682101561315f576000546001600160a01b03858116911614156130e257604051339083890380156108fc02916000818181858888f193505050501580156130dc573d6000803e3d6000fd5b5061315f565b6040805163a9059cbb60e01b8152336004820152838903602482015290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561313257600080fd5b505af1158015613146573d6000803e3d6000fd5b505050506040513d602081101561315c57600080fd5b50505b96509650969350505050565b60006006878154811061317a57fe5b90600052602060002001546003888154811061319257fe5b9060005260206000200154816131a457fe5b0490506060600688815481106131b657fe5b906000526020600020015467ffffffffffffffff811180156131d757600080fd5b50604051908082528060200260200182016040528015613201578160200160208202803683370190505b5080519091501561326d578143018160008151811061321c57fe5b602090810291909101015260015b815181101561326b578282600183038151811061324357fe5b60200260200101510182828151811061325857fe5b602090810291909101015260010161322a565b505b60006005898154811061327c57fe5b906000526020600020015460048a8154811061329457fe5b90600052602060002001548802816132a857fe5b0490506132b36136da565b604051806101200160405280336001600160a01b031681526020018a815260200189815260200188815260200187815260200183815260200160038c815481106132f957fe5b90600052602060002001544301815260200184815260200160068c8154811061331e57fe5b9060005260206000200154848161333157fe5b04905290506133408a8261360f565b50506009546040805160006020808301829052828401829052606083018790526001600160a01b0394851660808085019190915284518085038201815260a08501808752639e813f1f60e01b905260a48501958652601760e48601527f6c69717569646974794d696e696e675472616e7366657200000000000000000061010486015260c4850191825280516101248601528051968c1696639e813f1f9691959194859461014490930192870191908190849084905b8381101561340e5781810151838201526020016133f6565b50505050905090810190601f16801561343b5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561345b57600080fd5b505af115801561346f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561349857600080fd5b81019080805160405193929190846401000000008211156134b857600080fd5b9083019060208201858111156134cd57600080fd5b82516401000000008111828201881017156134e757600080fd5b82525081516020918201929091019080838360005b838110156135145781810151838201526020016134fc565b50505050905090810190601f1680156135415780820380516001836020036101000a031916815260200191505b5060405250505050888a336001600160a01b03167f904bffde498b5f8b9c482208599445964bca8e5fe0837abba34df545d09aed428b8b8b888860c001518b8a61010001516040518088815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156135ea5781810151838201526020016135d2565b505050509050019850505050505050505060405180910390a450505050505050505050565b6000828152600c60209081526040808320600d83528184205484528252808320845181546001600160a01b0319166001600160a01b03909116178155848301516001820155908401516002820155606084015160038201556080840151600482015560a0840151600582015560c0840151600682015560e0840151805184938693926136a4926007850192919091019061372f565b50610100919091015160089091015550506000918252600d60205260409091208054600101905560a081015160c0909101519091565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001600081525090565b82805482825590600052602060002090810192821561376a579160200282015b8281111561376a57825182559160200191906001019061374f565b506137769291506137db565b5090565b82805482825590600052602060002090810192821561376a5760005260206000209182015b8281111561376a57825482559160010191906001019061379f565b50805460008255906000526020600020908101906137d891906137db565b50565b5b8082111561377657600081556001016137dc56fe416d6f756e7420746f207374616b65206d757374206265206c657373207468616e207468652063757272656e742072656d61696e696e67206f6e65466c7573682063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e65724e6f206d6f72652072657761726420666f722074686973207374616b696e6720706f736974696f6e556e6c6f636b2063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e657243616e6e6f742061637475616c6c79207769746864726177207468697320706f736974696f6e466972737420616d6f756e74206d7573742062652067726561746572207468616e2030416d6f756e7420746f207374616b65206973206c657373207468616e207468652063757272656e74206d696e206361705365636f6e6420616d6f756e74206d7573742062652067726561746572207468616e2030a264697066735822122026a912235e77b97974fbbb034d20e13040d614f71fe7068d99cd5e45fa405efb64736f6c63430007000033

Deployed Bytecode Sourcemap

61:19729:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4580:84;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4056:104;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4056:104:0;;;;;;;;;;;;;;4672:132;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4672:132:0;;:::i;14060:1046::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14060:1046:0;;;;;;;:::i;:::-;;4484:88;;;;;;;;;;;;;:::i;3854:90::-;;;;;;;;;;;;;:::i;12090:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12090:718:0;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;12090:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15114:1611;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15114:1611:0;;;;;;;:::i;4264:212::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4168:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3952:96;;;;;;;;;;;;;:::i;16733:1752::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16733:1752:0;;;;;;;:::i;11975:107::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11975:107:0;;:::i;4812:296::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4812:296:0;-1:-1:-1;;;;;4812:296:0;;:::i;7283:616::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7283:616:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6807:468;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6807:468:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;12816:1236;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12816:1236:0;;;;;;;:::i;5116:1683::-;;;;;;;;;;;;;;;;-1:-1:-1;5116:1683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4580:84::-;4647:9;;4580:84;:::o;4056:104::-;4133:19;;-1:-1:-1;;;;;4133:19:0;4056:104;:::o;4672:132::-;4739:7;4766:30;;;:16;:30;;;;;;4672:132;;;;:::o;14060:1046::-;14128:30;;:::i;:::-;14161:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;14128:59;;;;;;;;;-1:-1:-1;;;;;14128:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14161:26;;14128:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14128:59:0;;;-1:-1:-1;;14128:59:0;;;;;;;;;;;14206:20;;14128:59;;-1:-1:-1;;;;;;14206:34:0;14198:64;;;;;-1:-1:-1;;;14198:64:0;;;;;;;;;;;;-1:-1:-1;;;14198:64:0;;;;;;;;;;;;;;;14297:13;:22;;;14281:12;:38;;14273:89;;;;-1:-1:-1;;;14273:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14395:19;;14429:20;;;;-1:-1:-1;;;;;14395:19:0;;;;14429:24;14426:114;;14470:5;-1:-1:-1;;;;;14470:14:0;;14485:13;:20;;;14507:13;:20;;;14470:58;;;;;;;;;;;;;-1:-1:-1;;;;;14470:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14426:114:0;14611:17;;14637:26;;;;14611:17;14630:34;;141:42;;14565:45;;-1:-1:-1;;;;;14611:17:0;;;;;14630:34;;;;;;;;;;;;;;;;;14565:100;;;-1:-1:-1;;;;;;14565:100:0;;;;;;;-1:-1:-1;;;;;14565:100:0;;;;;;;14630:34;;;;14565:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14565:100:0;14692:20;;14714:24;;;;14677:62;;;-1:-1:-1;;;14677:62:0;;-1:-1:-1;;;;;14677:62:0;;;;;;;;;;;;;;;14565:100;;-1:-1:-1;14677:14:0;;;;;;:62;;;;;14565:100;;14677:62;;;;;;;;14692:20;14677:14;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14844:24:0;;;;;;14677:62;14814:26;;;;;14797:44;;;;:16;:44;;;;;;;14767:26;;14750:44;;;;;;14797:71;;;;14750:118;;;14934:26;14906:20;;14962:25;;;;14989:26;;;;;15017:24;;15043:20;;;;;14884:180;;14894:10;14884:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14934:26;;14928:4;;-1:-1:-1;;;;;14884:180:0;;;;;;;;;;;;;;15075:23;15083:4;15089:8;15075:7;:23::i;:::-;14060:1046;;;;:::o;4484:88::-;4553:11;;4484:88;:::o;3854:90::-;3924:12;;-1:-1:-1;;;;;3924:12:0;3854:90;:::o;12090:718::-;12171:7;12189;12207;12225;12243;12261;12279;12297:16;12324:7;12350:30;;:::i;:::-;12383:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;12350:59;;;;;;;;;-1:-1:-1;;;;;12350:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12383:26;;12350:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12441:13;:20;;;12476:13;:26;;;12517:13;:25;;;12557:13;:26;;;12598:13;:24;;;12637:13;:20;;;12672:13;:22;;;12709:13;:37;;;12761:13;:28;;;12420:380;;;;;;;;;;;;;;;;;;;12090:718;;;;;;;;;;;:::o;15114:1611::-;15180:30;;:::i;:::-;15213:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;15180:59;;;;;;;;;-1:-1:-1;;;;;15180:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15213:26;;15180:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15180:59:0;;;-1:-1:-1;;15180:59:0;;;;;;;;;;;15258:20;;15180:59;;-1:-1:-1;;;;;;15258:34:0;15250:64;;;;;-1:-1:-1;;;15250:64:0;;;;;;;;;;;;-1:-1:-1;;;15250:64:0;;;;;;;;;;;;;;;15347:20;;-1:-1:-1;;;;;15333:34:0;:10;:34;15325:88;;;;-1:-1:-1;;;15325:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15443:13;:22;;;15427:12;:38;15424:101;;15489:24;15498:4;15504:8;15489;:24::i;:::-;15482:31;;;15424:101;15576:12;;15563:34;;;-1:-1:-1;;;15563:34:0;;;;15535:15;;-1:-1:-1;;;;;15576:12:0;;15563:32;;:34;;;;;;;;;;;;;;15576:12;15563:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15563:34:0;15633:27;;;-1:-1:-1;;;15633:27:0;;;;15563:34;;-1:-1:-1;15609:21:0;;-1:-1:-1;;;;;15633:25:0;;;;;:27;;;;;15563:34;;15633:27;;;;;;;:25;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15633:27:0;;-1:-1:-1;15671:14:0;;15700:223;15723:13;:37;;;:44;15719:1;:48;15700:223;;;15792:13;:37;;;15830:1;15792:40;;;;;;;;;;;;;;15836:1;15792:45;15789:123;;;15868:13;:28;;;15858:38;;;;15789:123;15769:3;;15700:223;;;-1:-1:-1;15955:19:0;;-1:-1:-1;;;;;15955:19:0;15989:10;;15986:105;;16035:20;;16016:63;;;-1:-1:-1;;;16016:63:0;;-1:-1:-1;;;;;16016:63:0;;;;;;;;;;;;;;;;;;;;;;:18;;;;;;:63;;;;;;;;;;;;;;;16035:20;16016:18;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15986:105:0;16101:5;-1:-1:-1;;;;;16101:14:0;;16116:13;16131;:20;;;16101:51;;;;;;;;;;;;;-1:-1:-1;;;;;16101:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16224:17:0;;16101:51;16250:26;;;16224:17;16243:34;;141:42;;16178:45;;-1:-1:-1;;;;;16224:17:0;;;;;16243:34;;;;;;;;;;;;;;;;;16178:100;;;-1:-1:-1;;;;;;16178:100:0;;;;;;;-1:-1:-1;;;;;16178:100:0;;;;;;;16243:34;;;;16178:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16178:100:0;16305:20;;16327:24;;;;16290:62;;;-1:-1:-1;;;16290:62:0;;-1:-1:-1;;;;;16290:62:0;;;;;;;;;;;;;;;16178:100;;-1:-1:-1;16290:14:0;;;;;;:62;;;;;16178:100;;16290:62;;;;;;;;16305:20;16290:14;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16457:13;:24;;;16410:16;:44;16427:13;:26;;;16410:44;;;;;;;;;;;;:71;16363:16;:44;16380:13;:26;;;16363:44;;;;;;;;;;;:118;;;;16544:13;:26;;;16528:4;16506:13;:20;;;-1:-1:-1;;;;;16497:186:0;;16534:8;16572:13;:25;;;16599:13;:26;;;16627:13;:24;;;16676:6;16653:13;:20;;;:29;16497:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16694:23;16702:4;16708:8;16694:7;:23::i;:::-;15114:1611;;;;;;;;:::o;4264:212::-;4304:16;4322;4340;4358;4395:12;4409:18;4429:15;4446:21;4387:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4264:212;;;;:::o;4168:88::-;4206:16;4242:6;4235:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4235:13:0;;;;;;;;;;;;;;;;;;;;;;;4168:88;:::o;3952:96::-;4023:17;;-1:-1:-1;;;;;4023:17:0;3952:96;:::o;16733:1752::-;16803:30;;:::i;:::-;16836:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;16803:59;;;;;;;;;-1:-1:-1;;;;;16803:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16836:26;;16803:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16803:59:0;;;-1:-1:-1;;16803:59:0;;;;;;;;;;;16881:20;;16803:59;;-1:-1:-1;;;;;;16881:34:0;16873:64;;;;;-1:-1:-1;;;16873:64:0;;;;;;;;;;;;-1:-1:-1;;;16873:64:0;;;;;;;;;;;;;;;16970:20;;-1:-1:-1;;;;;16956:34:0;:10;:34;16948:87;;;;-1:-1:-1;;;16948:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17087:12;;17074:34;;;-1:-1:-1;;;17074:34:0;;;;17046:15;;-1:-1:-1;;;;;17087:12:0;;17074:32;;:34;;;;;;;;;;;;;;17087:12;17074:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17074:34:0;17144:27;;;-1:-1:-1;;;17144:27:0;;;;17074:34;;-1:-1:-1;17120:21:0;;-1:-1:-1;;;;;17144:25:0;;;;;:27;;;;;17074:34;;17144:27;;;;;;;:25;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17144:27:0;;-1:-1:-1;17182:14:0;;17211:345;17234:13;:37;;;:44;17230:1;:48;17211:345;;;17346:1;17303:13;:37;;;17341:1;17303:40;;;;;;;;;;;;;;:44;:104;;;;;17367:13;:37;;;17405:1;17367:40;;;;;;;;;;;;;;17351:12;:56;;17303:104;17300:245;;;17438:13;:28;;;17428:38;;;;17528:1;17485:13;:37;;;17523:1;17485:40;;;;;;;;;;;;;:44;;;;;17300:245;17280:3;;17211:345;;;;17584:13;:20;;;17575:6;:29;:61;;17630:6;17575:61;;;17607:13;:20;;;17575:61;17669:19;;17566:70;;-1:-1:-1;;;;;;17669:19:0;17703:10;;17700:86;;17730:5;-1:-1:-1;;;;;17730:14:0;;17745:13;:20;;;17767:6;17730:44;;;;;;;;;;;;;-1:-1:-1;;;;;17730:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17700:86:0;17799:20;;;;:29;;;:33;17796:125;;17849:5;-1:-1:-1;;;;;17849:14:0;;17864:13;17902:6;17879:13;:20;;;:29;17849:60;;;;;;;;;;;;;-1:-1:-1;;;;;17849:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17796:125:0;17992:17;;18018:26;;;;17992:17;18011:34;;141:42;;17946:45;;-1:-1:-1;;;;;17992:17:0;;;;;18011:34;;;;;;;;;;;;;;;;;17946:100;;;-1:-1:-1;;;;;;17946:100:0;;;;;;;-1:-1:-1;;;;;17946:100:0;;;;;;;18011:34;;;;17946:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17946:100:0;18088:24;;;;18058:55;;;-1:-1:-1;;;18058:55:0;;-1:-1:-1;;;;;18058:55:0;;;;;;;;;;;;;;;;17946:100;;-1:-1:-1;18058:14:0;;;;;;:55;;;;;17946:100;;18058:55;;;;;;;;-1:-1:-1;18058:14:0;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18218:13;:24;;;18171:16;:44;18188:13;:26;;;18171:44;;;;;;;;;;;;:71;18124:16;:44;18141:13;:26;;;18124:44;;;;;;;;;;;:118;;;;18304:13;:26;;;18288:4;18266:13;:20;;;-1:-1:-1;;;;;18258:185:0;;18294:8;18332:13;:25;;;18359:13;:26;;;18387:13;:24;;;18436:6;18413:13;:20;;;:29;18258:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18454:23;18462:4;18468:8;18454:7;:23::i;11975:107::-;12025:7;12052:22;;;:16;:22;;;;;;;11975:107::o;4812:296::-;4936:12;;;;;;;;;-1:-1:-1;;;;;4936:12:0;-1:-1:-1;;;;;4923:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4923:34:0;4913:83;;;-1:-1:-1;;;4913:83:0;;;;-1:-1:-1;;;;;4913:81:0;;;;;;:83;;;;;4923:34;;4913:83;;;;;;;;:81;:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4913:83:0;4886:149;;;-1:-1:-1;;;4886:149:0;;5024:10;4886:149;;;;;;-1:-1:-1;;;;;4886:137:0;;;;;;:149;;;;;4913:83;;4886:149;;;;;;;;:137;:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4886:149:0;4878:182;;;;;-1:-1:-1;;;4878:182:0;;;;;;;;;;;;-1:-1:-1;;;4878:182:0;;;;;;;;;;;;;;;5071:12;:29;;-1:-1:-1;;;;;;5071:29:0;-1:-1:-1;;;;;5071:29:0;;;;;;;;;;4812:296::o;7283:616::-;7340:7;7349;7369:24;7432:12;;;;;;;;;-1:-1:-1;;;;;7432:12:0;-1:-1:-1;;;;;7419:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7419:34:0;7409:69;;;-1:-1:-1;;;7409:69:0;;;;-1:-1:-1;;;;;7409:67:0;;;;;;:69;;;;;7419:34;;7409:69;;;;;;;;:67;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7409:69:0;;-1:-1:-1;7490:24:0;7517:15;7527:4;7517:9;:15::i;:::-;7490:42;;7543:27;7573:38;7586:24;7604:4;7586:9;:24::i;:::-;7573:12;:38::i;:::-;7543:68;;7644:11;-1:-1:-1;;;;;7644:22:0;;7703:13;7729:10;7674:78;;;;;;-1:-1:-1;;;7674:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7674:78:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7674:78:0;;;;;;;;;;;-1:-1:-1;;;7674:78:0;;;;;;;;;;;;;;;;;-1:-1:-1;7674:78:0;;;;;;;;;;;;;-1:-1:-1;;7674:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7674:78:0;;;;;;;;;;;;;;;;;;;;;7644:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7644:110:0;7799:79;;-1:-1:-1;;;7644:110:0;7799:79;;;;;;;;-1:-1:-1;;;;;7769:22:0;;;;;7828:13;;7854:10;;7799:79;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7799:79:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7799:79:0;;;;;;;;;;;-1:-1:-1;;;7799:79:0;;;;;;;;;;;;;;;;;-1:-1:-1;7799:79:0;;;;;;;;;;;;;-1:-1:-1;;7799:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7799:79:0;;;;;;;;;;;;;;;;;;;;;7769:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7769:111:0;7622:269;;-1:-1:-1;7769:111:0;-1:-1:-1;;;;7283:616:0;;;:::o;6807:468::-;6865:14;6881:15;6898:24;6955:19;6969:4;6955:13;:19::i;:::-;7022:14;7039:22;;;:16;:22;;;;;;6935:39;;-1:-1:-1;6935:39:0;;-1:-1:-1;6935:39:0;;-1:-1:-1;7072:196:0;7095:6;7091:1;:10;7072:196;;;7126:16;;;;:10;:16;;;;;;;;:19;;;;;;;;:28;;;7157:12;-1:-1:-1;7123:134:0;;;7210:16;;;;:10;:16;;;;;;;;:19;;;;;;;;:31;;;7190:51;;;;7123:134;7103:3;;7072:196;;;;6807:468;;;;;;:::o;12816:1236::-;12889:30;;:::i;:::-;12922:16;;;;:10;:16;;;;;;;;:26;;;;;;;;;12889:59;;;;;;;;;-1:-1:-1;;;;;12889:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12922:26;;12889:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12889:59:0;;;-1:-1:-1;;12889:59:0;;;;;;;;;;;12967:20;;12889:59;;-1:-1:-1;;;;;;12967:34:0;12959:64;;;;;-1:-1:-1;;;12959:64:0;;;;;;;;;;;;-1:-1:-1;;;12959:64:0;;;;;;;;;;;;;;;13053:13;:22;;;13037:12;:38;13034:101;;13099:24;13108:4;13114:8;13099;:24::i;13034:101::-;13176:1;13153:13;:20;;;:24;13145:77;;;;-1:-1:-1;;;13145:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13233:14;13266:9;13262:345;13285:13;:37;;;:44;13281:1;:48;13262:345;;;13397:1;13354:13;:37;;;13392:1;13354:40;;;;;;;;;;;;;;:44;:104;;;;;13418:13;:37;;;13456:1;13418:40;;;;;;;;;;;;;;13402:12;:56;;13354:104;13351:245;;;13489:13;:28;;;13479:38;;;;13579:1;13536:13;:37;;;13574:1;13536:40;;;;;;;;;;;;;:44;;;;;13351:245;13331:3;;13262:345;;;;13635:13;:20;;;13626:6;:29;:61;;13681:6;13626:61;;;13658:13;:20;;;13626:61;13617:70;;13715:1;13706:6;:10;13698:42;;;;;-1:-1:-1;;;13698:42:0;;;;;;;;;;;;-1:-1:-1;;;13698:42:0;;;;;;;;;;;;;;;13773:19;;13819:20;;13804:44;;;-1:-1:-1;;;13804:44:0;;-1:-1:-1;;;;;13804:44:0;;;;;;;;;;;;;;;13773:19;;;;;;;13804:14;;:44;;;;;;;;;;;;;;;13751:12;13773:19;13804:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13882:20:0;;;;;:29;;;13859:52;;-1:-1:-1;13922:16:0;;;:10;13804:44;13922:16;;;;;;;:26;;;;;;;;;:42;;;;-1:-1:-1;;;;;;13922:42:0;-1:-1:-1;;;;;13922:42:0;;;;;;;;;;-1:-1:-1;13922:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13882:20;;13922:42;;;;;;;;;;:::i;:::-;-1:-1:-1;13922:42:0;;;;;;;;;;;14009:20;;13980:64;;;13997:10;13980:64;;;;;;;;;;14031:4;;-1:-1:-1;;;;;13980:64:0;;;;;;;;;;12816:1236;;;;;:::o;5116:1683::-;5310:11;;5294:12;:27;;5286:70;;;;;-1:-1:-1;;;5286:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5390:9;;5375:12;:24;5367:66;;;;;-1:-1:-1;;;5367:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5467:6;:13;5452:28;;5444:53;;;;;-1:-1:-1;;;5444:53:0;;;;;;;;;;;;-1:-1:-1;;;5444:53:0;;;;;;;;;;;;;;;5523:12;:19;5516:26;;5508:51;;;;;-1:-1:-1;;;5508:51:0;;;;;;;;;;;;-1:-1:-1;;;5508:51:0;;;;;;;;;;;;;;;5602:1;5580:19;:23;5572:71;;;;-1:-1:-1;;;5572:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5656:28;5711:12;;;5687:20;;-1:-1:-1;;;;;5711:12:0;;;;5694;;5687:20;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5687:20:0;:36;:56;;5738:5;5687:56;;;5726:9;5687:56;5656:87;;5785:1;5762:20;:24;5754:73;;;;-1:-1:-1;;;5754:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:12;;5868:34;;;-1:-1:-1;;;5868:34:0;;;;5840:15;;-1:-1:-1;;;;;5881:12:0;;5868:32;;:34;;;;;;;;;;;;;;5881:12;5868:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5868:34:0;5949:17;;5868:34;;-1:-1:-1;5916:72:0;;-1:-1:-1;;;;;5949:17:0;5968:19;5916:32;:72::i;:::-;5999:76;6032:6;6039:12;6032:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6032:20:0;6054;5999:32;:76::i;:::-;6088:19;6110:6;6117:12;6110:20;;;;;;;;;;;;;;;;;6302:17;;-1:-1:-1;;;;;6110:20:0;;;;-1:-1:-1;6110:20:0;;;;6209:124;;6226:19;;6247:14;;6263:20;;6285:15;;6302:17;6110:20;6209:16;:124::i;:::-;6346:30;;;;:16;:30;;;;;:44;;;;;;6143:190;;-1:-1:-1;6143:190:0;;-1:-1:-1;6143:190:0;-1:-1:-1;6346:30:0;6449:20;6464:4;6449:14;:20::i;:::-;6403:66;;;;;6503:6;6488:11;:21;;6480:82;;;;-1:-1:-1;;;6480:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6596:16;6581:11;:31;;6573:103;;;;-1:-1:-1;;;6573:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6689:102;6726:4;6732:12;6746:11;6759:12;6773:10;6785:5;6689:36;:102::i;:::-;5116:1683;;;;;;;;;;;;;;:::o;11584:383::-;11648:22;;;;:16;:22;;;;;;:27;-1:-1:-1;11645:65:0;;11692:7;;11645:65;11745:22;;;;:16;:22;;;;;;;-1:-1:-1;;11745:26:0;11720:51;;;;11785:26;-1:-1:-1;11782:120:0;;;11850:16;;;;:10;:16;;;;;;;;11867;:22;;;;;;11850:40;;;;;;;;11828:19;;;;;:62;;;;-1:-1:-1;;;;;;11828:62:0;-1:-1:-1;;;;;11828:62:0;;;;;;-1:-1:-1;11828:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11828:62:0;;;;;;;;11782:120;11919:16;;;;:10;:16;;;;;;;;11936;:22;;;;;;11919:40;;;;;;;11912:47;;-1:-1:-1;;;;;;11912:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11919:40;11912:47;;;;11919:16;11912:47;:::i;:::-;;;;;;;;;11584:383;;:::o;18493:467::-;18542:13;18572:7;18568:50;;-1:-1:-1;18596:10:0;;;;;;;;;;;;-1:-1:-1;;;18596:10:0;;;;;;18568:50;18637:2;18628:6;18669:69;18676:6;;18669:69;;18699:5;;18724:2;18719:7;;;;18669:69;;;18748:17;18778:3;18768:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18768:14:0;-1:-1:-1;18748:34:0;-1:-1:-1;;;18802:7:0;;18820:103;18827:7;;18820:103;;18884:2;18879;:7;18874:2;:12;18863:25;;18851:4;18856:3;;;;;;;18851:9;;;;;;;;;;;:37;-1:-1:-1;;;;;18851:37:0;;;;;;;;-1:-1:-1;18909:2:0;18903:8;;;;18820:103;;;-1:-1:-1;18947:4:0;18493:467;-1:-1:-1;;;;18493:467:0:o;18968:493::-;19099:42;;;;;;;;;;;-1:-1:-1;;;19099:42:0;;;;19173:13;;19183:2;19173:13;;;19023;19173;;;;;;-1:-1:-1;;;;;19073:14:0;;;19099:42;19023:13;;19173;;;;;;;;;;-1:-1:-1;19173:13:0;19154:32;;-1:-1:-1;;;19197:3:0;19201:1;19197:6;;;;;;;;;;;:12;-1:-1:-1;;;;;19197:12:0;;;;;;;;;-1:-1:-1;;;19220:3:0;19224:1;19220:6;;;;;;;;;;;:12;-1:-1:-1;;;;;19220:12:0;;;;;;;;;19248:6;19243:182;19264:2;19260:1;:6;19243:182;;;19301:8;19338:1;19321:5;19327:1;19331:2;19327:6;19321:13;;;;;;;;;;-1:-1:-1;;;;;19321:18:0;;;;19315:25;;19310:31;;19301:41;;;;;;;;;;;;;;;;19288:3;19294:1;19296;19294:3;19292:1;:5;19288:10;;;;;;;;;;;:54;-1:-1:-1;;;;;19288:54:0;;;;;;;;;19370:8;19390:5;19396:1;19400:2;19396:6;19390:13;;;;;;;19370:43;;19390:13;;;19406:4;19384:27;;19370:43;;;;;;;;;;;;;;19357:3;19363:1;19365;19363:3;19361:1;:5;19357:10;;;;;;;;;;;:56;-1:-1:-1;;;;;19357:56:0;;;;;;;;-1:-1:-1;19268:3:0;;19243:182;;19469:318;19531:13;19583:3;19603:6;19598:152;19619:4;:11;19615:1;:15;19598:152;;;19673:4;19662:15;;:4;19667:1;19662:7;;;;;;;;;;;;-1:-1:-1;;;;;;19662:7:0;:15;;;;:34;;;19692:4;19681:15;;:4;19686:1;19681:7;;;;;;;;;;;;-1:-1:-1;;;;;;19681:7:0;:15;;19662:34;:76;;19731:4;19736:1;19731:7;;;;;;;;;;;;-1:-1:-1;;;;;;19731:7:0;19662:76;;;19712:4;19717:1;19712:7;;;;;;;;;;;;;;;;19706:14;;19723:4;19706:21;19699:29;;19662:76;19652:4;19657:1;19652:7;;;;;;;;;;;:86;-1:-1:-1;;;;;19652:86:0;;;;;;;;-1:-1:-1;19632:3:0;;19598:152;;;-1:-1:-1;19774:4:0;19469:318;-1:-1:-1;;19469:318:0:o;7907:471::-;8018:12;;-1:-1:-1;;;;;8005:25:0;;;8018:12;;8005:25;8002:63;;;8047:7;;8002:63;8118:52;;;-1:-1:-1;;;8118:52:0;;8137:10;8118:52;;;;8157:4;8118:52;;;;;;;;;;;;8097:9;;-1:-1:-1;;;;;8118:18:0;;;;;:52;;;;;;;;;;;;;;;8075:12;8118:18;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8184:49:0;;;-1:-1:-1;;;8184:49:0;;8208:4;8184:49;;;;237:42;8184:49;;;;;;8237:5;;-1:-1:-1;;;;;8184:15:0;;;;;:49;;;;;8118:52;;8184:49;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8184:49:0;:58;8181:190;;8259:100;;;-1:-1:-1;;;8259:100:0;;237:42;8259:100;;;;-1:-1:-1;;8259:100:0;;;;;;-1:-1:-1;;;;;8259:13:0;;;;;:100;;;;;;;;;;;;;;-1:-1:-1;8259:13:0;:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8181:190:0;7907:471;;;:::o;8386:1564::-;8577:19;8669:12;;8577:19;;;;-1:-1:-1;;;;;8654:27:0;;;8669:12;;8654:27;8651:817;;;8740:302;;;-1:-1:-1;;;8740:302:0;;-1:-1:-1;;;;;8740:302:0;;;;;;;;;;;;;;;;;;;;;;;;8981:4;8740:302;;;;9023:4;9005:15;:22;8740:302;;;;;;237:42;;8740:51;;8799:20;;8740:302;;;;;;;;;;;;;;;8799:20;237:42;8740:302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8740:302:0;;;;;;;;;;;;;-1:-1:-1;8740:302:0;;-1:-1:-1;8740:302:0;-1:-1:-1;8651:817:0;;;9117:339;;;-1:-1:-1;;;9117:339:0;;-1:-1:-1;;;;;9117:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9395:4;9117:339;;;;9437:4;9419:15;:22;9117:339;;;;;;237:42;;9117:48;;:339;;;;;;;;;;;;;;-1:-1:-1;237:42:0;9117:339;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9117:339:0;;;;;;;;;;;;;-1:-1:-1;9117:339:0;;-1:-1:-1;9117:339:0;-1:-1:-1;8651:817:0;9495:19;9481:11;:33;9478:139;;;9531:74;;;-1:-1:-1;;;9531:74:0;;9559:10;9531:74;;;;9571:33;;;9531:74;;;;;;-1:-1:-1;;;;;9531:27:0;;;;;:74;;;;;;;;;;;;;;-1:-1:-1;9531:27:0;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9478:139:0;9645:20;9630:12;:35;9627:316;;;9700:12;;-1:-1:-1;;;;;9685:27:0;;;9700:12;;9685:27;9682:250;;;9733:65;;9741:10;;9762:35;;;9733:65;;;;;;;;;9762:35;9741:10;9733:65;;;;;;;;;;;;;;;;;;;;;9682:250;;;9839:77;;;-1:-1:-1;;;9839:77:0;;9868:10;9839:77;;;;9880:35;;;9839:77;;;;;;-1:-1:-1;;;;;9839:28:0;;;;;:77;;;;;;;;;;;;;;-1:-1:-1;9839:28:0;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9682:250:0;8386:1564;;;;;;;;;;:::o;9958:1339::-;10139:36;10199:21;10221:4;10199:27;;;;;;;;;;;;;;;;10178:12;10191:4;10178:18;;;;;;;;;;;;;;;;:48;;;;;;10139:87;;10237:40;10294:21;10316:4;10294:27;;;;;;;;;;;;;;;;10280:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10280:42:0;-1:-1:-1;10336:30:0;;10237:85;;-1:-1:-1;10336:34:0;10333:337;;10431:28;10416:12;:43;10387:23;10411:1;10387:26;;;;;;;;;;;;;;;;;:72;10490:1;10474:185;10497:23;:30;10493:1;:34;10474:185;;;10615:28;10582:23;10610:1;10606;:5;10582:30;;;;;;;;;;;;;;:61;10553:23;10577:1;10553:26;;;;;;;;;;;;;;;;;:90;10529:3;;10474:185;;;;10333:337;10680:14;10738:15;10754:4;10738:21;;;;;;;;;;;;;;;;10711:18;10730:4;10711:24;;;;;;;;;;;;;;;;10697:11;:38;:62;;;;;;10680:79;;10770:26;;:::i;:::-;10799:180;;;;;;;;10809:10;-1:-1:-1;;;;;10799:180:0;;;;;10821:12;10799:180;;;;10835:11;10799:180;;;;10848:12;10799:180;;;;10862:10;10799:180;;;;10874:6;10799:180;;;;10897:12;10910:4;10897:18;;;;;;;;;;;;;;;;10882:12;:33;10799:180;;;;10917:23;10799:180;;;;10951:21;10973:4;10951:27;;;;;;;;;;;;;;;;10942:6;:36;;;;;;10799:180;;10770:209;-1:-1:-1;10990:21:0;10995:4;10770:209;10990:4;:21::i;:::-;-1:-1:-1;;11096:19:0;;11062:54;;;11081:1;11062:54;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11096:19:0;;;11062:54;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11022:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;;;11062:54;;11022:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11022:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11022:95:0;;;;;;;;;;-1:-1:-1;11022:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11158:12;11152:4;11140:10;-1:-1:-1;;;;;11133:156:0;;11172:11;11185:12;11199:10;11211:6;11219:9;:18;;;11239:23;11264:9;:24;;;11133:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9958:1339;;;;;;;;;;:::o;11305:271::-;11375:7;11404:16;;;:10;:16;;;;;;;;11421;:22;;;;;;11404:40;;;;;;;:50;;;;-1:-1:-1;;;;;;11404:50:0;-1:-1:-1;;;;;11404:50:0;;;;;;;;;;-1:-1:-1;11404:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11375:7;;11404:50;;:40;:50;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11404:50:0;;;;;;;;;;;-1:-1:-1;;11490:22:0;;;;:16;:22;;;;;;;;11515:1;11490:26;11465:51;;11535:14;;;;11551:16;;;;;11535:14;;11305:271::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://26a912235e77b97974fbbb034d20e13040d614f71fe7068d99cd5e45fa405efb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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