ETH Price: $1,955.07 (-1.64%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mass Harvest234908792025-10-02 15:05:11143 days ago1759417511IN
0x51fac321...592203Da4
0 ETH0.000885852.96617382
Mass Harvest223243462025-04-22 11:48:23306 days ago1745322503IN
0x51fac321...592203Da4
0 ETH0.000267470.89886432
Mass Harvest223243412025-04-22 11:47:23306 days ago1745322443IN
0x51fac321...592203Da4
0 ETH0.000247140.91913985
Mass Harvest223243372025-04-22 11:46:35306 days ago1745322395IN
0x51fac321...592203Da4
0 ETH0.00050650.94139139
Mass Harvest223243322025-04-22 11:45:35306 days ago1745322335IN
0x51fac321...592203Da4
0 ETH0.001043940.93174054
Mass Harvest223243282025-04-22 11:44:47306 days ago1745322287IN
0x51fac321...592203Da4
0 ETH0.00024770.92121203
Mass Harvest223243252025-04-22 11:44:11306 days ago1745322251IN
0x51fac321...592203Da4
0 ETH0.0010370.92554569
Mass Harvest223243212025-04-22 11:43:23306 days ago1745322203IN
0x51fac321...592203Da4
0 ETH0.001035650.92434273
Mass Harvest223243132025-04-22 11:41:47306 days ago1745322107IN
0x51fac321...592203Da4
0 ETH0.00099860.8912706
Mass Harvest223243062025-04-22 11:40:23306 days ago1745322023IN
0x51fac321...592203Da4
0 ETH0.000988830.88255524
Mass Harvest223242982025-04-22 11:38:47306 days ago1745321927IN
0x51fac321...592203Da4
0 ETH0.001010830.90219127
Mass Harvest223242882025-04-22 11:36:47306 days ago1745321807IN
0x51fac321...592203Da4
0 ETH0.001002950.89515526
Mass Harvest223242602025-04-22 11:31:11306 days ago1745321471IN
0x51fac321...592203Da4
0 ETH0.000991970.8853545
Mass Harvest223242552025-04-22 11:30:11306 days ago1745321411IN
0x51fac321...592203Da4
0 ETH0.000257490.90035339
Mass Harvest223242502025-04-22 11:29:11306 days ago1745321351IN
0x51fac321...592203Da4
0 ETH0.000243660.90620548
Mass Harvest223242402025-04-22 11:27:11306 days ago1745321231IN
0x51fac321...592203Da4
0 ETH0.000244470.90918839
Mass Harvest223242352025-04-22 11:26:11306 days ago1745321171IN
0x51fac321...592203Da4
0 ETH0.000244240.90835942
Mass Harvest223242292025-04-22 11:24:59306 days ago1745321099IN
0x51fac321...592203Da4
0 ETH0.000323280.9207574
Harvest223242272025-04-22 11:24:35306 days ago1745321075IN
0x51fac321...592203Da4
0 ETH0.00017760.87937571
Mass Harvest214652282024-12-23 12:36:59426 days ago1734957419IN
0x51fac321...592203Da4
0 ETH0.006928717.02835162
Mass Harvest214649952024-12-23 11:49:47426 days ago1734954587IN
0x51fac321...592203Da4
0 ETH0.007297727.40266769
Mass Harvest214649782024-12-23 11:46:23426 days ago1734954383IN
0x51fac321...592203Da4
0 ETH0.007039117.14033926
Mass Harvest214515042024-12-21 14:32:59428 days ago1734791579IN
0x51fac321...592203Da4
0 ETH0.0107140110.86808372
Set Epoch Amount214512632024-12-21 13:44:47428 days ago1734788687IN
0x51fac321...592203Da4
0 ETH0.0003496110.33436807
Mass Harvest214510542024-12-21 13:02:35428 days ago1734786155IN
0x51fac321...592203Da4
0 ETH0.0098623310.00415226
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwappYieldFarm

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2021-07-20
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity 0.8.0;


interface IStaking {
    function getEpochId(uint timestamp) external view returns (uint); // get epoch id
    function getEpochUserBalance(address user, address token, uint128 epoch) external view returns(uint);
    function getEpochPoolSize(address token, uint128 epoch) external view returns (uint);
    function epoch1Start() external view returns (uint);
    function epochDuration() external view returns (uint);
    function hasReferrer(address addr) external view returns(bool);
    function referrals(address addr) external view returns(address);
    function firstReferrerRewardPercentage() external view returns(uint256);
    function secondReferrerRewardPercentage() external view returns(uint256);
    function isStakeFinished(address staker) external view returns (bool);
    function stakeData(address staker) external view returns (uint256 startEpoch, uint256 endEpoch, bool active);
    function stakeEndEpoch(address staker) external view returns (uint128);
    function calcDurationBonusMultiplier(uint128 epochId, address staker) external view returns (uint256);
}

interface Minter {
    function mint(address to, uint256 amount) external;
}

contract SwappYieldFarm {
    // lib
    using SafeMath for uint;
    using SafeMath for uint128;

    // constants
    uint public constant NR_OF_EPOCHS = 60;
    uint256 constant private CALC_MULTIPLIER = 1000000;

    // addreses
    address private _swappAddress = 0x8CB924583681cbFE487A62140a994A49F833c244;
    address private _owner;
    bool private _paused = false;
    // contracts
    IStaking private _staking;
	Minter private _minter;

    uint[] private epochs = new uint[](NR_OF_EPOCHS + 1);
    uint128 public lastInitializedEpoch;
    mapping(address => uint128) public lastEpochIdHarvested;
    uint public epochDuration; // init from staking contract
    uint public epochStart; // init from staking contract

    mapping(uint128 => uint256) public epochAmounts;
    mapping(uint128 => uint256) public epochDurationBonus;
    mapping(address => uint256) public collectedDurationBonus;
    
    modifier onlyStaking() {
        require(msg.sender == address(_staking), "Only staking contract can perfrom this action");
        _;
    }
    
    modifier onlyOwner() {
        require(msg.sender == _owner, "Only owner can perfrom this action");
        _;
    }
    
    modifier whenNotPaused() {
        require(!paused(), "Contract is paused");
        _;
    }

    // events
    event MassHarvest(address indexed user, uint256 epochsHarvested, uint256 totalValue);
    event Harvest(address indexed user, uint128 indexed epochId, uint256 amount);
    event ReferrerRewardCollected(address indexed staker, address indexed referrer, uint256 rewardAmount);
    event Referrer2RewardCollected(address indexed staker, address indexed referrer, address indexed referrer2, uint256 rewardAmount);
    event DurationBonusCollected(address indexed staker, uint128 indexed epochId, uint256 bonusAmount);
    event DurationBonusDistributed(address indexed staker, uint128 indexed epochId, uint256 bonusAmount);
    event DurationBonusLost(address indexed staker, uint128 indexed epochId, uint256 bonusAmount);

    // constructor
    constructor() {
        _staking = IStaking(0x60F4D3e409Ad2Bb6BF5edFBCC85691eE1977cf35);
		_minter = Minter(0xBC1f9993ea5eE2C77909bf43d7a960bB8dA8C9B9);

        epochDuration = _staking.epochDuration();
        epochStart = _staking.epoch1Start();

        _owner = msg.sender;
        
        _initEpochReward();
        _initDurationBonus();
    }

    function setEpochAmount(uint128 epochId, uint256 amount) external onlyOwner {
        require(epochId > 0 && epochId <= NR_OF_EPOCHS, "Minimum epoch number is 1 and Maximum number of epochs is 60");
        require(epochId > _getEpochId(), "Only future epoch can be updated");
        epochAmounts[epochId] = amount;
    }
    
    function setEpochDurationBonus(uint128 epochId, uint256 amount) external onlyOwner {
        require(epochId > 0 && epochId <= NR_OF_EPOCHS, "Minimum epoch number is 1 and Maximum number of epochs is 60");
        require(epochId > _getEpochId(), "Only future epoch can be updated");
        epochDurationBonus[epochId] = amount;
    }

    function getTotalAmountPerEpoch(uint128 epoch) public view returns (uint) {
        return epochAmounts[epoch].mul(10**18);
    }
    
    function getDurationBonusPerEpoch(uint128 epoch) public view returns (uint) {
        return epochDurationBonus[epoch].mul(10**18);
    }
    
    function getCurrentEpochAmount() public view returns (uint) {
        uint128 currentEpoch = _getEpochId();
        if (currentEpoch <= 0 || currentEpoch > NR_OF_EPOCHS) {
            return 0;
        }

        return epochAmounts[currentEpoch];
    }
    
    function getCurrentEpochDurationBonus() public view returns (uint) {
        uint128 currentEpoch = _getEpochId();
        if (currentEpoch <= 0 || currentEpoch > NR_OF_EPOCHS) {
            return 0;
        }

        return epochDurationBonus[currentEpoch];
    }

    function getTotalDistributedAmount() external view returns(uint256) {
        uint256 totalDistributed;
        for (uint128 i = 1; i <= NR_OF_EPOCHS; i++) {
            totalDistributed += epochAmounts[i];
        }
        return totalDistributed;
    } 
    
    function getTotalDurationBonus() external view returns(uint256) {
        uint256 totalBonus;
        for (uint128 i = 1; i <= NR_OF_EPOCHS; i++) {
            totalBonus += epochDurationBonus[i];
        }
        return totalBonus;
    } 

    // public methods
    // public method to harvest all the unharvested epochs until current epoch - 1
    function massHarvest() external whenNotPaused returns (uint){
        uint totalDistributedValue;
        uint epochId = _getEpochId().sub(1); // fails in epoch 0
        // force max number of epochs
        if (epochId > NR_OF_EPOCHS) {
            epochId = NR_OF_EPOCHS;
        }

        for (uint128 i = lastEpochIdHarvested[msg.sender] + 1; i <= epochId; i++) {
            // i = epochId
            // compute distributed Value and do one single transfer at the end
            totalDistributedValue += _harvest(i);
            
            uint256 durationBonus = _calcDurationBonus(i);
            if (durationBonus > 0) {
                collectedDurationBonus[msg.sender] = collectedDurationBonus[msg.sender].add(durationBonus);
                emit DurationBonusCollected(msg.sender, i, durationBonus);
            }
        }

        emit MassHarvest(msg.sender, epochId - lastEpochIdHarvested[msg.sender], totalDistributedValue);

        uint256 totalDurationBonus = 0;
        if (_staking.isStakeFinished(msg.sender) && collectedDurationBonus[msg.sender] > 0) {
            totalDurationBonus = collectedDurationBonus[msg.sender];
            collectedDurationBonus[msg.sender] = 0;
            _minter.mint(msg.sender, totalDurationBonus);
            emit DurationBonusDistributed(msg.sender, _getEpochId(), totalDurationBonus);
        }

        if (totalDistributedValue > 0) {
			_minter.mint(msg.sender, totalDistributedValue);
            //Referrer reward
            distributeReferrerReward(totalDistributedValue.add(totalDurationBonus));
        }

        return totalDistributedValue.add(totalDurationBonus);
    }

    function harvest (uint128 epochId) external whenNotPaused returns (uint){
        // checks for requested epoch
        require (_getEpochId() > epochId, "This epoch is in the future");
        require(epochId <= NR_OF_EPOCHS, "Maximum number of epochs is 60");
        require (lastEpochIdHarvested[msg.sender].add(1) == epochId, "Harvest in order");
        uint userReward = _harvest(epochId);
        
        uint256 durationBonus = _calcDurationBonus(epochId);
        collectedDurationBonus[msg.sender] = collectedDurationBonus[msg.sender].add(_calcDurationBonus(epochId));
        emit DurationBonusCollected(msg.sender, epochId, durationBonus);
        
        uint256 totalDurationBonus = 0;
        if (_staking.isStakeFinished(msg.sender) && collectedDurationBonus[msg.sender] > 0) {
            totalDurationBonus = collectedDurationBonus[msg.sender];
            collectedDurationBonus[msg.sender] = 0;
            _minter.mint(msg.sender, totalDurationBonus);
            emit DurationBonusDistributed(msg.sender, epochId, totalDurationBonus);
        }
        
        if (userReward > 0) {
			_minter.mint(msg.sender, userReward);
            //Referrer reward
            distributeReferrerReward(userReward.add(totalDurationBonus));
        }
        emit Harvest(msg.sender, epochId, userReward);
        return userReward.add(totalDurationBonus);
    }
    
    function distributeReferrerReward(uint256 stakerReward) internal {
        if (_staking.hasReferrer(msg.sender)) {
            address referrer = _staking.referrals(msg.sender);
            uint256 ref1Reward = stakerReward.mul(_staking.firstReferrerRewardPercentage()).div(10000);
            _minter.mint(referrer, ref1Reward);
            emit ReferrerRewardCollected(msg.sender, referrer, ref1Reward);
            
            // second step referrer
            if (_staking.hasReferrer(referrer)) {
                address referrer2 = _staking.referrals(referrer);
                uint256 ref2Reward = stakerReward.mul(_staking.secondReferrerRewardPercentage()).div(10000);
            	_minter.mint(referrer2, ref2Reward);
                emit Referrer2RewardCollected(msg.sender, referrer, referrer2, ref2Reward);
            }
        }
    }

    // views
    // calls to the staking smart contract to retrieve the epoch total pool size
    function getPoolSize(uint128 epochId) external view returns (uint) {
        return _getPoolSize(epochId);
    }

    function getCurrentEpoch() external view returns (uint) {
        return _getEpochId();
    }

    // calls to the staking smart contract to retrieve user balance for an epoch
    function getEpochStake(address userAddress, uint128 epochId) external view returns (uint) {
        return _getUserBalancePerEpoch(userAddress, epochId);
    }

    function userLastEpochIdHarvested() external view returns (uint){
        return lastEpochIdHarvested[msg.sender];
    }
    
    function getUserLastEpochHarvested(address staker) external view returns (uint) {
        return lastEpochIdHarvested[staker];
    }
    
    function estimateDurationBonus (uint128 epochId) public view returns (uint) {
        uint256 poolSize = _getPoolSize(epochId);
        
        // exit if there is no stake on the epoch
        if (poolSize == 0) {
            return 0;
        }
        
        uint256 stakerMultiplier = stakerDurationMultiplier(msg.sender, epochId + 1);

        return getDurationBonusPerEpoch(epochId)
        .mul(_getUserBalancePerEpoch(msg.sender, epochId))
        .div(poolSize).mul(stakerMultiplier).div(CALC_MULTIPLIER);
    }
    
    function stakerDurationMultiplier(address staker, uint128 epochId) public view returns (uint256) {
        (uint256 startEpoch, uint256 endEpoch, bool active) = _staking.stakeData(staker);

        if (epochId > endEpoch || (epochId <= endEpoch && active == false) || epochId < startEpoch) {
            return 0;
        }
        
        uint256 stakerMultiplier = _staking.calcDurationBonusMultiplier(epochId, staker);
        
        return stakerMultiplier;
    }
    
    function reduceDurationBonus(address staker, uint256 reduceMultiplier) public onlyStaking {
        uint256 collected = collectedDurationBonus[staker];
        if (collected > 0) {
            collectedDurationBonus[staker] = collected.mul(reduceMultiplier).div(CALC_MULTIPLIER);
            uint256 bonusLost = collected.sub(collectedDurationBonus[staker]);
            DurationBonusLost(staker, _getEpochId(), bonusLost);
        }
    }
    
    function clearDurationBonus(address staker) public onlyStaking {
        uint256 collected = collectedDurationBonus[staker];
        if (collected > 0) {
            collectedDurationBonus[staker] = 0;
            DurationBonusLost(staker, _getEpochId(), collected);
        }
    }

    // internal methods

    function _initEpoch(uint128 epochId) internal {
        require(lastInitializedEpoch.add(1) == epochId, "Epoch can be init only in order");
        lastInitializedEpoch = epochId;
        // call the staking smart contract to init the epoch
        epochs[epochId] = _getPoolSize(epochId);
    }

    function _harvest (uint128 epochId) internal returns (uint) {
        // try to initialize an epoch. if it can't it fails
        // if it fails either user either a Swapp account will init not init epochs
        if (lastInitializedEpoch < epochId) {
            _initEpoch(epochId);
        }
        // Set user state for last harvested
        lastEpochIdHarvested[msg.sender] = epochId;
        // compute and return user total reward. For optimization reasons the transfer have been moved to an upper layer (i.e. massHarvest needs to do a single transfer)

        // exit if there is no stake on the epoch
        if (epochs[epochId] == 0) {
            return 0;
        }
        
        uint128 endEpoch = _staking.stakeEndEpoch(msg.sender);
        if (epochId >= endEpoch) {
            return 0;
        }
        
        return getTotalAmountPerEpoch(epochId)
        .mul(_getUserBalancePerEpoch(msg.sender, epochId))
        .div(epochs[epochId]);
    }
    

    function _calcDurationBonus(uint128 epochId) internal view returns (uint) {
        // exit if there is no stake on the epoch
        if (epochs[epochId] == 0) {
            return 0;
        }
        
        uint256 stakerMultiplier = stakerDurationMultiplier(msg.sender, epochId + 1);

        return getDurationBonusPerEpoch(epochId)
        .mul(_getUserBalancePerEpoch(msg.sender, epochId))
        .div(epochs[epochId]).mul(stakerMultiplier).div(CALC_MULTIPLIER);
    }

    function _getPoolSize(uint128 epochId) internal view returns (uint) {
        // retrieve token balance
        return _staking.getEpochPoolSize(_swappAddress, epochId);
    }

    function _getUserBalancePerEpoch(address userAddress, uint128 epochId) internal view returns (uint){
        // retrieve token balance per user per epoch
        return _staking.getEpochUserBalance(userAddress, _swappAddress, epochId);
    }

    // compute epoch id from blocktimestamp and epochstart date
    function _getEpochId() internal view returns (uint128 epochId) {
        if (block.timestamp < epochStart) {
            return 0;
        }
        epochId = uint128(block.timestamp.sub(epochStart).div(epochDuration).add(1));
    }
    
    function paused() public view returns (bool) {
        return _paused;
    }
    
    function pause() external onlyOwner {
        _paused = true;
    }
    
    function unpause() external onlyOwner {
        _paused = false;
    }
    
    function _initEpochReward() internal {
        epochAmounts[1] = 5000000;
        epochAmounts[2] = 2000000;
        epochAmounts[3] = 2000000;
        epochAmounts[4] = 2000000;
        epochAmounts[5] = 2000000;
        epochAmounts[6] = 2000000;
        epochAmounts[7] = 1500000;
        epochAmounts[8] = 1500000;
        epochAmounts[9] = 1500000;
        epochAmounts[10] = 1500000;
        epochAmounts[11] = 1500000;
        epochAmounts[12] = 1500000;
        epochAmounts[13] = 500000;
        epochAmounts[14] = 500000;
        epochAmounts[15] = 500000;
        epochAmounts[16] = 500000;
        epochAmounts[17] = 500000;
        epochAmounts[18] = 500000;
        epochAmounts[19] = 500000;
        epochAmounts[20] = 500000;
        epochAmounts[21] = 500000;
        epochAmounts[22] = 500000;
        epochAmounts[23] = 500000;
        epochAmounts[24] = 500000;
        epochAmounts[25] = 400000;
        epochAmounts[26] = 400000;
        epochAmounts[27] = 400000;
        epochAmounts[28] = 400000;
        epochAmounts[29] = 400000;
        epochAmounts[30] = 400000;
        epochAmounts[31] = 400000;
        epochAmounts[32] = 400000;
        epochAmounts[33] = 400000;
        epochAmounts[34] = 400000;
        epochAmounts[35] = 400000;
        epochAmounts[36] = 400000;
        epochAmounts[37] = 250000;
        epochAmounts[38] = 250000;
        epochAmounts[39] = 250000;
        epochAmounts[40] = 250000;
        epochAmounts[41] = 250000;
        epochAmounts[42] = 250000;
        epochAmounts[43] = 250000;
        epochAmounts[44] = 250000;
        epochAmounts[45] = 250000;
        epochAmounts[46] = 250000;
        epochAmounts[47] = 250000;
        epochAmounts[48] = 250000;
        epochAmounts[49] = 250000;
        epochAmounts[50] = 250000;
        epochAmounts[51] = 250000;
        epochAmounts[52] = 250000;
        epochAmounts[53] = 250000;
        epochAmounts[54] = 250000;
        epochAmounts[55] = 250000;
        epochAmounts[56] = 250000;
        epochAmounts[57] = 250000;
        epochAmounts[58] = 250000;
        epochAmounts[59] = 250000;
        epochAmounts[60] = 250000;
    }
    
    function _initDurationBonus() internal {
        epochDurationBonus[1] = 21450;
        epochDurationBonus[2] = 23595;
        epochDurationBonus[3] = 25954;
        epochDurationBonus[4] = 28550;
        epochDurationBonus[5] = 31405;
        epochDurationBonus[6] = 34545;
        epochDurationBonus[7] = 38000;
        epochDurationBonus[8] = 41800;
        epochDurationBonus[9] = 45980;
        epochDurationBonus[10] = 50578;
        epochDurationBonus[11] = 55635;
        epochDurationBonus[12] = 61477;
        epochDurationBonus[13] = 67932;
        epochDurationBonus[14] = 75065;
        epochDurationBonus[15] = 82947;
        epochDurationBonus[16] = 91656;
        epochDurationBonus[17] = 101280;
        epochDurationBonus[18] = 111915;
        epochDurationBonus[19] = 123666;
        epochDurationBonus[20] = 136651;
        epochDurationBonus[21] = 150999;
        epochDurationBonus[22] = 166854;
        epochDurationBonus[23] = 184374;
        epochDurationBonus[24] = 204701;
        epochDurationBonus[25] = 227269;
        epochDurationBonus[26] = 252326;
        epochDurationBonus[27] = 280145;
        epochDurationBonus[28] = 311031;
        epochDurationBonus[29] = 345322;
        epochDurationBonus[30] = 383393;
        epochDurationBonus[31] = 425662;
        epochDurationBonus[32] = 472592;
        epochDurationBonus[33] = 524695;
        epochDurationBonus[34] = 582543;
        epochDurationBonus[35] = 646768;
        epochDurationBonus[36] = 721639;
        epochDurationBonus[37] = 805178;
        epochDurationBonus[38] = 898388;
        epochDurationBonus[39] = 1002387;
        epochDurationBonus[40] = 1118426;
        epochDurationBonus[41] = 1247898;
        epochDurationBonus[42] = 1392358;
        epochDurationBonus[43] = 1553541;
        epochDurationBonus[44] = 1733382;
        epochDurationBonus[45] = 1934043;
        epochDurationBonus[46] = 2157933;
        epochDurationBonus[47] = 2407740;
        epochDurationBonus[48] = 2700403;
        epochDurationBonus[49] = 3028638;
        epochDurationBonus[50] = 3396771;
        epochDurationBonus[51] = 3809651;
        epochDurationBonus[52] = 4272716;
        epochDurationBonus[53] = 4792068;
        epochDurationBonus[54] = 5374546;
        epochDurationBonus[55] = 6027826;
        epochDurationBonus[56] = 6760512;
        epochDurationBonus[57] = 7582256;
        epochDurationBonus[58] = 8503884;
        epochDurationBonus[59] = 9537537;
        epochDurationBonus[60] = 11000000;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint128","name":"epochId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"bonusAmount","type":"uint256"}],"name":"DurationBonusCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint128","name":"epochId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"bonusAmount","type":"uint256"}],"name":"DurationBonusDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint128","name":"epochId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"bonusAmount","type":"uint256"}],"name":"DurationBonusLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint128","name":"epochId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"epochsHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"MassHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"address","name":"referrer2","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"Referrer2RewardCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"ReferrerRewardCollected","type":"event"},{"inputs":[],"name":"NR_OF_EPOCHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"clearDurationBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectedDurationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"epochAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"epochDurationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"epochId","type":"uint128"}],"name":"estimateDurationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochDurationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"epoch","type":"uint128"}],"name":"getDurationBonusPerEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint128","name":"epochId","type":"uint128"}],"name":"getEpochStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"epochId","type":"uint128"}],"name":"getPoolSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"epoch","type":"uint128"}],"name":"getTotalAmountPerEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDistributedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDurationBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getUserLastEpochHarvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"epochId","type":"uint128"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastEpochIdHarvested","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastInitializedEpoch","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"reduceMultiplier","type":"uint256"}],"name":"reduceDurationBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"epochId","type":"uint128"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setEpochAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"epochId","type":"uint128"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setEpochDurationBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint128","name":"epochId","type":"uint128"}],"name":"stakerDurationMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userLastEpochIdHarvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600080546001600160a01b031916738cb924583681cbfe487a62140a994a49f833c2441790556001805460ff60a01b191681556200004590603c9062001426565b6001600160401b038111156200006b57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801562000095578160200160208202803683370190505b508051620000ac91600491602090910190620013a6565b50348015620000ba57600080fd5b50600280546001600160a01b03199081167360f4d3e409ad2bb6bf5edfbcc85691ee1977cf3517918290556003805490911673bc1f9993ea5ee2c77909bf43d7a960bb8da8c9b9179055604080516327f843b560e11b815290516001600160a01b039290921691634ff0876a91600480820192602092909190829003018186803b1580156200014857600080fd5b505afa1580156200015d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018391906200140d565b6007556002546040805163f4a4341d60e01b815290516001600160a01b039092169163f4a4341d91600480820192602092909190829003018186803b158015620001cc57600080fd5b505afa158015620001e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020791906200140d565b600855600180546001600160a01b031916331790556200022662000236565b6200023062000abe565b6200144b565b6009602052624c4b407f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3655621e84807f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38190557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78190557f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9cb8190557f74b05292d1d4b2b48b65261b07099d24244bcb069f138d9a6bfdcf776becac4c8190557fbb6daa0c283751197dfdc76590680f9005e97d6f23870deb1164ab60b28b9f5f556216e3607fae6299332bcd708cd60e3a8defa55de28078a50a4cf2b3de3a546253240ff9e18190557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a8190557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba68190557f502e20e4e219e0c509d693958f17384c185f07a810a5d31c46c2be981e979c258190557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248190557fc7b54da85b38015141aec405fe9a03fa9e057971f48e8d0d8fc78485848a2310556207a1207fdec90e20065e511a0428d28bf1b6b0d715e4b1cb865c1f0580815586cc6ebf9e8190557f14f5f4d78ba809fa1eb5eee80339f56eaa489b7b6b892ddb58602e51e8dad7ef8190557fc6578e0b5f8d37c135f99fcd184697bbb8facaa7556a48605034ca65d4c39fbf8190557fbe671448d730349025d29d2778ce42e0b1bf32e5fba806216bd490316c20b57d8190557fe7636fba95dbff23a0d59c2aaba91ac476df033d3d0194af04c6e0be3aa731688190557fe84bfcbbf6b4a03922a064640cc123c559d873e4452e4de9b4c8ae3d625b15f08190557f20eb389d0739387175ea0af71ea83e439c1e64b1f1d88bc1a63c293936f1ddf98190557f60a5a5a37b4d1dd7d7b24e4897f9467e8debaad1cd5a21b57a3edb667b34643f8190557f1cd9b38a3a53bab494aa1d85adb715d6959eb17b9c356637d3fa91f568fbb49d8190557f31500e3e63276b9e30de61d3b3eba79d113a6ecb97bdb48e6ff3bfbcf39843a08190557f1e54f96c5e2b78f60d79048ee9c858e18221042b03d4c3a1edb674a7958c6dbe8190557f9fa182d41d71a497043a8da03c1b347327908b20231c7ad3a623a2ed42be1e295562061a807f967884e4895c9fc5fcc0d7afd0f0d6557102e822f9f19daef11a1defa828ca978190557f2d13cb1e06f1c209c154bf72388128a0c41c5f78e83fa6fa3a15e7af7ce926728190557f39c1220ceb2b65f0545b9700381d45e66fb4c48160af52f2313cff52e7d1816f8190557f0198fab112c143739d2c64cd1e8f8579226b9625635561ef7f569630690cb0808190557f664326ee2c9cf6e3ccb8f5f75d62b49a2f2f40a7f0634c3c1ccd8b8768761c368190557fba813966250df53e8742361bee196aca3139d68609981c9283b9bd74a15a86e88190557f04e46bb1bb2d8a8e64e23570b4b0c755e74dfd455311952241a58ee59d43ee398190557f0be59b18168b57ec65c0c8e445cffd739914e4617bf4e1f6b492b57dcd4f78d68190557f1158e7856e424bc35a28252f518c89c1af91164333f54fc19b5724835112c6818190557f280fb8a25848fb992f554b4c8d4afc13dff52a3691d85dbf26c3555afd6243528190557f25ac479b898599910fcac5655ef89881608fbe6ebfe7a0189ab76e3e210bec958190557f327f5a96ce8922d13e926b5301182a995f2dad0da1f81621072d6188be90cf40556203d0907f72fe66faf096e1b8c9ecc3b66c7af137c79b7e17c40297754fb1c70cc4869abc8190557ff4b500520e6ff7e2b980c7c3b7ac9e6a58ea5f6006cd6e18c840f4d551c1954d8190557fa12453ef3d78204b880f3cf8b9444bb252df0f872a15667124da9103a917c3578190557fea0e630273a94d99be23398ed1c410c5da33a4cdcdd8ad9bb111ebd4fdb859608190557f44968f9a6894e0fb25d0ef127815b20947a3b2815dbfc740b0a6c9cb84e97b8e8190557fd869c086c774be06215b42086d35d0f07dfce65e7170e9b6e8d61dac4213afb98190557fe9dd5851370bf46ed74acda6738d08de07ed6b960776787b507a16b7046e2b618190557fe359e079b4da2ffe9920a661193eaa7b76a5d1f8c27d7e311309b174b6daab378190557f4bbf9d7d67d44cad879862b09fff9ce23e1a492285d86ba983680d0e160e8e0e8190557f4d775e50194a955bb52445eac0d03a4a17d2be44e085301ef60e2d7b9f7435088190557f12b1458e66613f1665899358e21febd8fd8089b9218351897bc7161398e15c108190557f77bd7588d50fb6c6e45fe979c10da04c86538803d20b7d785d211b3c02e93f788190557f3bcba89c3b628a17a8b32d24f473baeeffa2c378f8ee2a2cba2ab89ce338989c8190557fdd9bf46b68f2858fcbfdd22eaa6d4bc710b50475a2b04df5507e88b47e1571f68190557f422307daaf95d43e597be1b3a1782790e1bd7992493ade8fe3397aba95c8e8ed8190557ffa240842c23bc048b8024af5d69d5c285d6726465ce3e46bce947832ecb4f4458190557fb35e894a1f2a7e94cb955faf01dc56fd2a85923e1b35b952047a2f78d7c8f7658190557f583ee370e5f1f222fb7a7c3471bf9c6f1ccfa879a8ed5036923628694913cb598190557f1e60ba17c907aa02eaa7cc913574ba18af4e9f29a15d6aa569c6c5bf74e006098190557f35cbfc6cecf8f6a20f9ae56f6b797d21d83573be46cd67af485c361e5b9e38898190557ff7f04506ba5e09fa12bd33370ea0fbcf80f22400386e297aa544355ad61f01d48190557fa1c3d575985d08bb9f5b2581f8a369dcb618a96554e510eccf0391de41c2e7878190557f298c611a4738d7efd63c00c7eafbbda10e7ee27ea76d058339982643cd7923e0819055603c6000527fe1caf25864288b409d0a28140b2c266e67d9f71c0a3d4af4ab94381bcd59b47855565b600a6020526153ca7fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc755615c2b7fbff4442b8ed600beeb8e26b1279a0f0d14c6edfaec26d968ee13c86f7d4c2ba8556165627fa856840544dc26124927add067d799967eac11be13e14d82cc281ea46fa3975955616f867fe1eb2b2161a492c07c5a334e48012567cba93ec021043f53c1955516a3c5a84155617aad7ff35035bc2b01d44bd35a1dcdc552315cffb73da35cfd60570b7b777f98036f9f556186f17f10d9dd018e4cae503383c9f804c1c1603ada5856ee7894375d9b97cd8c8b27db556194707f22e39f61d1e4986b4f116cea9067f62cc77d74dff1780ae9c8b5166d1dd288295561a3487f2c1fd36ba11b13b555f58753742999069764391f450ca8727fe8a3eeffe677755561b39c7f825eb4cda6b8b44578c55770496c59e6dc3cf2235f690bcdaf51a61898ceb2845561c5927f3e57c57b03145299956be61386751c5b285d460d484d5c2403a6be086d9d6baa5561d9537fb3569174ca605aeef264a9f01151dace4275a70316034aaf090d8468560f043b5561f0257f80283cfdc74729ecb224822f7a02837fb1d52df7cc3435ae86bb6e025f6e06fa556201095c7fc5c2b17ace4fcac005542a0a50d8932fc28b9d50b7e4925e5b7ce40eede0c44755620125397f95e5396155afd2ec086edc0518f3069d6ba131fb95388521b3342aebbda916f055620144037fcc8dc71342d3ea7c205feea2d040f8f577a07edda8d6b43a4daf11d5e7fd280a55620166087f1063e8e27a46602f2cf5efe54a6f37c939566cc93507d4c402b1ab61967baeed5562018ba07fd1bfa665ff0a0ee81f20833500dfc80ed4b576a9d481e6c7f2cd8243b94238e8556201b52b7f96c94070a261449c888cfb31ddd6716e50d52e263f7a74a5eeb34ee8b4241016556201e3127f2e60ceb69e96fe6481ce9457171ef3f030bf0150171842d8842b77cad9c3b35555620215cb7ff78db0549aead6621ec87aae05d7bab2ff4f1610fb2a5da9b0d8e5ca932cbe205562024dd77f7206804eee71b1705b2ebdc98e703bf07b0f4c0f02e3e11e04bfaa74de5375865562028bc67f1722be5def2cea03a513d20b9ef471eb355d33f3c504747c388749c98f2d4222556202d0367feea57b1f1522820919f93d0e22f8b5016667e54dfef4536f36a0f466802896ba5562031f9d7fdbb9abaa854f4db3eeaa646072c2d97ef4391daac19febcaaf62e35afc2c519b55620377c57f851f73f7125b7d7c14dc287f4bc29ddd916b6a89c6e09d2d4eabc50246e91812556203d9a67f7f1fc346acb2036e5b5f0fbe8156aceadc762d61540488c54e7331f45ffd20c155620446517f3087163455d40c2a16947527f1a86948a5e7ff7de9ba68924df713830e5e615a556204bef77f964ea767231031507a3f70c59b06c72a2054875e2bc2938da2a55d8f6cb774eb55620544ea7f39c12fc4f65c08d2961e20ab9bc18df4acbbdf98829d6cd7060fccb5e8535c7b556205d9a17f579cf2be734d9b04ae69aa2ac47f7d57a73216e05f35a9c951916f461f31449d5562067ebe7f9fa3ace5691e3b518f73bdcdd856471fb5839152e4d4383a70855965313a8d7e55620736107ffcc670724b0ae51983cbcd5c39830fdf68269a01ccb79e2798b86e7d9b68590655620801977fe3b2c1b596cd1a2a6349a15d2d1ab63f6b2cf08deaec81658cafd3b2a14040cb556208e38f7fa17bf40e81c47228a81202ddd9e3fd8f8c7a116130363b3dcc8a73fc1b708900556209de707f47845a7b6c79f491f651455c594ef10509bfe23c275dec7acf5198f7406fa77855620b02e77fa63cf338c2a7068c31396e74339c4eae75536e44463641023b5e7f14e0e5c8a455620c493a7f3f3714773d60e4d6f1eec9d5d17c2275d573bbfa8030a80905858a104027c52055620db5547f021a8d87d128494b881845d9562c47e841efdae534e579374e147feb41e24fdd55620f4b937fcb5acc7692adf0f459f4c747b10745e8691828884412b18207ee39ebd3637fd355621110da7f91f95df47904a90ac8bb634968d07613b2bbf711f934c1d20403c613c66b80b75562130a9a7f3ee3ee1318427566caac79615d067197d3a14aaa4fec1d445dfa761cfeb178b45562153ee67f723bb389013a8e287d60b741d37621880ed52f1363fb356206da160723f34936556217b4857f7c88ef8d7aca0318251f31c899c30b491c6eaeb9e0abc596bf1f7fc86a58b51255621a73067fc5a5152eb6f32112547d035859dfbd1920ac3f2633565d5b32f82ee8f48d8db355621d82db7f914dccb53380563059e9e556af6a690bb3e3d2e8763db4999263479efe191eda556220ed6d7f6c6d62e8a8b03fc99bb6a42c33f29fbb7bc355fb24b55c501263cba498f98982556224bd3c7ff0d06e1c676d19791845afcc57865504b6e1664144ce3e6d246a51a35a30ab6c55622934737f827b43d7b5df5f84fd4b18cce10d024e57edb92595e42f215cd9b8967d5d096255622e369e7f37f8fd616dbeae27e64020341887a523c145a1a4bb5f33edf950c4efb7379b8a556233d4a37f3f84cf6cefe8166d7172cc41f23bd15f2ff6c4676631dd9620c8946b70ea8aed55623a21737f73a117ba966c4ead530419dfd458ce63ae8e8e62f31e7b400021d3a05fa5b732556241324c7ffb30163b28865485300799dca1d6b9d977accbd874c63b0ce1bd7fe215a4c8485562491f047f4b5222d403a972015c1820d959615c913698372f8d411626c0024a5daa5b560f55625202527f55dee7f6292858369e5d0a94c234a9178230c539086694272573f6476e6f7a4455625bfa327fc2a55a2712cad0cb89be7087d2061240d48d4872b84544f6e2827fbe9340562a55626728407f0d66487a4fd51dd587b2804aa978e27509d1f975a58951d636cb4c8aad7c71e1556273b2307f9a6fcacd6a52d97f4e59c88a4aaf9414ac81acbbf335833d33f867d1f399cc1b556281c24c7fa5d50f82a15a819238a33e2a19ad83e1db0d3b8b39935b937d9c5f45cdaa422355629188017f1be71956f5d37e7a5b23d3a6bd9456048e6c8b0f66836c65be223c01c8e0ae2d55603c60005262a7d8c07fe491db451dcdea8a737c3aa1496f3882606839a69ff5f3ac5af330dfbfadf00155565b828054828255906000526020600020908101928215620013e4579160200282015b82811115620013e4578251825591602001919060010190620013c7565b50620013f2929150620013f6565b5090565b5b80821115620013f25760008155600101620013f7565b6000602082840312156200141f578081fd5b5051919050565b600082198211156200144657634e487b7160e01b81526011600452602481fd5b500190565b612184806200145b6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636c5ede1d11610104578063a1c130d4116100a2578063d0143bab11610071578063d0143bab14610370578063db6a48ce14610383578063f7e251f81461038b578063fccfac3d1461039e576101da565b8063a1c130d41461033a578063a43564eb14610342578063b78ac08714610355578063b97dd9e214610368576101da565b8063777b4b45116100de578063777b4b45146103045780638456cb5914610317578063931fa8f91461031f5780639c7ec88114610332576101da565b80636c5ede1d146102be57806373eff2fd146102d157806375f677ca146102f1576101da565b806331ca6b791161017c57806349281b311161014b57806349281b31146102865780634ff0876a146102995780635c975abb146102a157806367087ee3146102b6576101da565b806331ca6b791461024e5780633f4ba83a14610263578063433124511461026b57806344321f6d1461027e576101da565b806322ded4f5116101b857806322ded4f514610218578063290e45441461022b5780632adb336014610233578063302b1a5f1461023b576101da565b806305917ac0146101df57806315e5a1e5146101fd5780631e6c5e8114610205575b600080fd5b6101e76103b1565b6040516101f49190612037565b60405180910390f35b6101e76103b6565b6101e7610213366004611cbe565b6103bc565b6101e7610226366004611cbe565b610427565b6101e7610439565b6101e76107dd565b6101e7610249366004611c09565b610835565b61026161025c366004611cf6565b610847565b005b610261610904565b6101e7610279366004611c41565b61093d565b6101e7610952565b6101e7610294366004611c09565b6109aa565b6101e76109ce565b6102a96109d4565b6040516101f49190611dda565b6101e76109e4565b6101e76102cc366004611cbe565b610a38565b6102e46102df366004611c09565b610a63565b6040516101f49190612001565b6101e76102ff366004611cbe565b610a7e565b610261610312366004611cf6565b610aa9565b610261610b66565b6101e761032d366004611c41565b610ba5565b6102e4610d0f565b6101e7610d1e565b6101e7610350366004611cbe565b610d3a565b6101e7610363366004611cbe565b6110df565b6101e76110f1565b61026161037e366004611c79565b611109565b6101e76111e5565b6101e7610399366004611cbe565b611233565b6102616103ac366004611c09565b61123e565b603c81565b60085481565b6000806103c8836112f7565b9050806103d9576000915050610422565b60006103ea3361032d86600161204e565b905061041d620f42406104178361041186610417610408338c61137f565b6104118c610a38565b9061140a565b90611416565b925050505b919050565b60096020526000908152604090205481565b60006104436109d4565b156104695760405162461bcd60e51b815260040161046090611f9e565b60405180910390fd5b6000806104886001610479611422565b6001600160801b031690611461565b9050603c8111156104975750603c5b336000908152600660205260408120546104bb906001600160801b0316600161204e565b90505b81816001600160801b03161161057c576104d78161146d565b6104e19084612079565b925060006104ee826115f3565b9050801561056957336000908152600b602052604090205461051090826116a6565b336000818152600b6020526040908190209290925590516001600160801b03841691907f3ff464150615c9feed1523d133f419537d8dce4eafb4f3cad6441f1057f7a98b90610560908590612037565b60405180910390a35b5080610574816120e7565b9150506104be565b50336000818152600660205260409020547fb68dafc1da13dc868096d0b87347c831d0bda92d178317eb1dec7f788444485c906105c2906001600160801b0316846120d0565b846040516105d1929190612040565b60405180910390a2600254604051637619800d60e11b81526000916001600160a01b03169063ec33001a9061060a903390600401611d5f565b60206040518083038186803b15801561062257600080fd5b505afa158015610636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065a9190611ca4565b80156106745750336000908152600b602052604090205415155b156107455750336000818152600b6020526040808220805492905560035490516340c10f1960e01b815291926001600160a01b03909116916340c10f19916106c0918590600401611dc1565b600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050506106fa611422565b6001600160801b0316336001600160a01b03167f4c1a02c138bad7a3efdf0e207e5b369762a15144bd1ca3516aa5c70b3b58c10f8360405161073c9190612037565b60405180910390a35b82156107ca576003546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061077d9033908790600401611dc1565b600060405180830381600087803b15801561079757600080fd5b505af11580156107ab573d6000803e3d6000fd5b505050506107ca6107c582856116a690919063ffffffff16565b6116b2565b6107d483826116a6565b93505050505b90565b6000806107e8611422565b90506001600160801b03811615806108095750603c816001600160801b0316115b156108185760009150506107da565b6001600160801b03166000908152600a6020526040902054905090565b600b6020526000908152604090205481565b6001546001600160a01b031633146108715760405162461bcd60e51b815260040161046090611e79565b6000826001600160801b03161180156108945750603c826001600160801b031611155b6108b05760405162461bcd60e51b815260040161046090611e1c565b6108b8611422565b6001600160801b0316826001600160801b0316116108e85760405162461bcd60e51b815260040161046090611f1c565b6001600160801b039091166000908152600a6020526040902055565b6001546001600160a01b0316331461092e5760405162461bcd60e51b815260040161046090611e79565b6001805460ff60a01b19169055565b6000610949838361137f565b90505b92915050565b60008061095d611422565b90506001600160801b038116158061097e5750603c816001600160801b0316115b1561098d5760009150506107da565b6001600160801b0316600090815260096020526040902054905090565b6001600160a01b03166000908152600660205260409020546001600160801b031690565b60075481565b600154600160a01b900460ff1690565b60008060015b603c816001600160801b031611610a32576001600160801b038116600090815260096020526040902054610a1e9083612079565b915080610a2a816120e7565b9150506109ea565b50905090565b6001600160801b0381166000908152600a602052604081205461094c90670de0b6b3a764000061140a565b6006602052600090815260409020546001600160801b031681565b6001600160801b03811660009081526009602052604081205461094c90670de0b6b3a764000061140a565b6001546001600160a01b03163314610ad35760405162461bcd60e51b815260040161046090611e79565b6000826001600160801b0316118015610af65750603c826001600160801b031611155b610b125760405162461bcd60e51b815260040161046090611e1c565b610b1a611422565b6001600160801b0316826001600160801b031611610b4a5760405162461bcd60e51b815260040161046090611f1c565b6001600160801b03909116600090815260096020526040902055565b6001546001600160a01b03163314610b905760405162461bcd60e51b815260040161046090611e79565b6001805460ff60a01b1916600160a01b179055565b60025460405163c691d19160e01b81526000918291829182916001600160a01b039091169063c691d19190610bde908990600401611d5f565b60606040518083038186803b158015610bf657600080fd5b505afa158015610c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e9190611d2b565b92509250925081856001600160801b03161180610c5d575081856001600160801b031611158015610c5d575080155b80610c70575082856001600160801b0316105b15610c81576000935050505061094c565b600254604051631e953b1760e31b81526000916001600160a01b03169063f4a9d8b890610cb49089908b90600401612015565b60206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190611d13565b979650505050505050565b6005546001600160801b031681565b336000908152600660205260409020546001600160801b031690565b6000610d446109d4565b15610d615760405162461bcd60e51b815260040161046090611f9e565b816001600160801b0316610d73611422565b6001600160801b031611610d995760405162461bcd60e51b815260040161046090611fca565b603c826001600160801b03161115610dc35760405162461bcd60e51b815260040161046090611de5565b336000908152600660205260409020546001600160801b0380841691610deb911660016116a6565b14610e085760405162461bcd60e51b815260040161046090611ef2565b6000610e138361146d565b90506000610e20846115f3565b9050610e44610e2e856115f3565b336000908152600b6020526040902054906116a6565b336000818152600b6020526040908190209290925590516001600160801b03861691907f3ff464150615c9feed1523d133f419537d8dce4eafb4f3cad6441f1057f7a98b90610e94908590612037565b60405180910390a3600254604051637619800d60e11b81526000916001600160a01b03169063ec33001a90610ecd903390600401611d5f565b60206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611ca4565b8015610f375750336000908152600b602052604090205415155b156110015750336000818152600b6020526040808220805492905560035490516340c10f1960e01b815291926001600160a01b03909116916340c10f1991610f83918590600401611dc1565b600060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b50505050846001600160801b0316336001600160a01b03167f4c1a02c138bad7a3efdf0e207e5b369762a15144bd1ca3516aa5c70b3b58c10f83604051610ff89190612037565b60405180910390a35b8215611081576003546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906110399033908790600401611dc1565b600060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506110816107c582856116a690919063ffffffff16565b846001600160801b0316336001600160a01b03167f04ad45a69eeed9c390c3a678fed2d4b90bde98e742de9936d5e0915bf3d0ea4e856040516110c49190612037565b60405180910390a36110d683826116a6565b95945050505050565b600a6020526000908152604090205481565b60006110fb611422565b6001600160801b0316905090565b6002546001600160a01b031633146111335760405162461bcd60e51b815260040161046090611f51565b6001600160a01b0382166000908152600b602052604090205480156111e057611163620f4240610417838561140a565b6001600160a01b0384166000908152600b602052604081208290559061118a908390611461565b9050611194611422565b6001600160801b0316846001600160a01b03167f78aca16d6078c9827367a58ab3945e7a7a88db3bce89486c7447eb6c0dc0da1f836040516111d69190612037565b60405180910390a3505b505050565b60008060015b603c816001600160801b031611610a32576001600160801b0381166000908152600a602052604090205461121f9083612079565b91508061122b816120e7565b9150506111eb565b600061094c826112f7565b6002546001600160a01b031633146112685760405162461bcd60e51b815260040161046090611f51565b6001600160a01b0381166000908152600b602052604090205480156112f3576001600160a01b0382166000908152600b60205260408120556112a8611422565b6001600160801b0316826001600160a01b03167f78aca16d6078c9827367a58ab3945e7a7a88db3bce89486c7447eb6c0dc0da1f836040516112ea9190612037565b60405180910390a35b5050565b6002546000805460405163165196bf60e11b815291926001600160a01b0390811692632ca32d7e9261132f9216908690600401611d9f565b60206040518083038186803b15801561134757600080fd5b505afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190611d13565b600254600080546040516308c028dd60e41b815291926001600160a01b0390811692638c028dd0926113ba9288929116908790600401611d73565b60206040518083038186803b1580156113d257600080fd5b505afa1580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109499190611d13565b600061094982846120b1565b60006109498284612091565b6000600854421015611436575060006107da565b61145c60016114566007546104176008544261146190919063ffffffff16565b906116a6565b905090565b600061094982846120d0565b6005546000906001600160801b038084169116101561148f5761148f82611b64565b33600090815260066020526040902080546001600160801b0319166001600160801b0384169081179091556004805490919081106114dd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600014156114f857506000610422565b6002546040516331ed3bf160e21b81526000916001600160a01b03169063c7b4efc490611529903390600401611d5f565b60206040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115799190611cda565b9050806001600160801b0316836001600160801b03161061159e576000915050610422565b6115ec6004846001600160801b0316815481106115cb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546104176115e3338761137f565b61041187610a7e565b9392505050565b60006004826001600160801b03168154811061161f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546000141561163a57506000610422565b600061164b3361032d85600161204e565b90506115ec620f4240610417836104116004886001600160801b03168154811061168557634e487b7160e01b600052603260045260246000fd5b906000526020600020015461041761169d338b61137f565b6104118b610a38565b60006109498284612079565b600254604051630308a59b60e31b81526001600160a01b03909116906318452cd8906116e2903390600401611d5f565b60206040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190611ca4565b15611b6157600254604051639ca423b360e01b81526000916001600160a01b031690639ca423b390611768903390600401611d5f565b60206040518083038186803b15801561178057600080fd5b505afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b89190611c25565b90506000611852612710610417600260009054906101000a90046001600160a01b03166001600160a01b03166375cd903b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190611d13565b869061140a565b6003546040516340c10f1960e01b81529192506001600160a01b0316906340c10f19906118859085908590600401611dc1565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b50505050816001600160a01b0316336001600160a01b03167f1834256d5ddaf7e9aafcd123dca0e155cef83bfc259ce07ba017587c6cdd9abc836040516118fa9190612037565b60405180910390a3600254604051630308a59b60e31b81526001600160a01b03909116906318452cd890611932908590600401611d5f565b60206040518083038186803b15801561194a57600080fd5b505afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190611ca4565b156111e057600254604051639ca423b360e01b81526000916001600160a01b031690639ca423b3906119b8908690600401611d5f565b60206040518083038186803b1580156119d057600080fd5b505afa1580156119e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a089190611c25565b90506000611aa2612710610417600260009054906101000a90046001600160a01b03166001600160a01b03166320f5984d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190611d13565b889061140a565b6003546040516340c10f1960e01b81529192506001600160a01b0316906340c10f1990611ad59085908590600401611dc1565b600060405180830381600087803b158015611aef57600080fd5b505af1158015611b03573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b0316336001600160a01b03167f4514843c0c872aa44ebb71c5e6b05840c7de3261fb32de859afac91fcf0dafb784604051611b549190612037565b60405180910390a4505050505b50565b6005546001600160801b0380831691611b7f911660016116a6565b14611b9c5760405162461bcd60e51b815260040161046090611ebb565b600580546001600160801b0319166001600160801b038316179055611bc0816112f7565b6004826001600160801b031681548110611bea57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015550565b8051801515811461042257600080fd5b600060208284031215611c1a578081fd5b81356115ec81612124565b600060208284031215611c36578081fd5b81516115ec81612124565b60008060408385031215611c53578081fd5b8235611c5e81612124565b91506020830135611c6e81612139565b809150509250929050565b60008060408385031215611c8b578182fd5b8235611c9681612124565b946020939093013593505050565b600060208284031215611cb5578081fd5b61094982611bf9565b600060208284031215611ccf578081fd5b81356115ec81612139565b600060208284031215611ceb578081fd5b81516115ec81612139565b60008060408385031215611d08578182fd5b8235611c9681612139565b600060208284031215611d24578081fd5b5051919050565b600080600060608486031215611d3f578081fd5b8351925060208401519150611d5660408501611bf9565b90509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529190921660208201526001600160801b03909116604082015260600190565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601e908201527f4d6178696d756d206e756d626572206f662065706f6368732069732036300000604082015260600190565b6020808252603c908201527f4d696e696d756d2065706f6368206e756d626572206973203120616e64204d6160408201527f78696d756d206e756d626572206f662065706f63687320697320363000000000606082015260800190565b60208082526022908201527f4f6e6c79206f776e65722063616e2070657266726f6d2074686973206163746960408201526137b760f11b606082015260800190565b6020808252601f908201527f45706f63682063616e20626520696e6974206f6e6c7920696e206f7264657200604082015260600190565b60208082526010908201526f2430b93b32b9ba1034b71037b93232b960811b604082015260600190565b6020808252818101527f4f6e6c79206675747572652065706f63682063616e2062652075706461746564604082015260600190565b6020808252602d908201527f4f6e6c79207374616b696e6720636f6e74726163742063616e2070657266726f60408201526c36903a3434b99030b1ba34b7b760991b606082015260800190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b6020808252601b908201527f546869732065706f636820697320696e20746865206675747572650000000000604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b039290921682526001600160a01b0316602082015260400190565b90815260200190565b918252602082015260400190565b60006001600160801b038083168185168083038211156120705761207061210e565b01949350505050565b6000821982111561208c5761208c61210e565b500190565b6000826120ac57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156120cb576120cb61210e565b500290565b6000828210156120e2576120e261210e565b500390565b60006001600160801b03808316818114156121045761210461210e565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611b6157600080fd5b6001600160801b0381168114611b6157600080fdfea2646970667358221220835848fa0cf11f61af53c7e70b522fd99596de6fcf63dcca9ca1f5ff8d7e9e3164736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636c5ede1d11610104578063a1c130d4116100a2578063d0143bab11610071578063d0143bab14610370578063db6a48ce14610383578063f7e251f81461038b578063fccfac3d1461039e576101da565b8063a1c130d41461033a578063a43564eb14610342578063b78ac08714610355578063b97dd9e214610368576101da565b8063777b4b45116100de578063777b4b45146103045780638456cb5914610317578063931fa8f91461031f5780639c7ec88114610332576101da565b80636c5ede1d146102be57806373eff2fd146102d157806375f677ca146102f1576101da565b806331ca6b791161017c57806349281b311161014b57806349281b31146102865780634ff0876a146102995780635c975abb146102a157806367087ee3146102b6576101da565b806331ca6b791461024e5780633f4ba83a14610263578063433124511461026b57806344321f6d1461027e576101da565b806322ded4f5116101b857806322ded4f514610218578063290e45441461022b5780632adb336014610233578063302b1a5f1461023b576101da565b806305917ac0146101df57806315e5a1e5146101fd5780631e6c5e8114610205575b600080fd5b6101e76103b1565b6040516101f49190612037565b60405180910390f35b6101e76103b6565b6101e7610213366004611cbe565b6103bc565b6101e7610226366004611cbe565b610427565b6101e7610439565b6101e76107dd565b6101e7610249366004611c09565b610835565b61026161025c366004611cf6565b610847565b005b610261610904565b6101e7610279366004611c41565b61093d565b6101e7610952565b6101e7610294366004611c09565b6109aa565b6101e76109ce565b6102a96109d4565b6040516101f49190611dda565b6101e76109e4565b6101e76102cc366004611cbe565b610a38565b6102e46102df366004611c09565b610a63565b6040516101f49190612001565b6101e76102ff366004611cbe565b610a7e565b610261610312366004611cf6565b610aa9565b610261610b66565b6101e761032d366004611c41565b610ba5565b6102e4610d0f565b6101e7610d1e565b6101e7610350366004611cbe565b610d3a565b6101e7610363366004611cbe565b6110df565b6101e76110f1565b61026161037e366004611c79565b611109565b6101e76111e5565b6101e7610399366004611cbe565b611233565b6102616103ac366004611c09565b61123e565b603c81565b60085481565b6000806103c8836112f7565b9050806103d9576000915050610422565b60006103ea3361032d86600161204e565b905061041d620f42406104178361041186610417610408338c61137f565b6104118c610a38565b9061140a565b90611416565b925050505b919050565b60096020526000908152604090205481565b60006104436109d4565b156104695760405162461bcd60e51b815260040161046090611f9e565b60405180910390fd5b6000806104886001610479611422565b6001600160801b031690611461565b9050603c8111156104975750603c5b336000908152600660205260408120546104bb906001600160801b0316600161204e565b90505b81816001600160801b03161161057c576104d78161146d565b6104e19084612079565b925060006104ee826115f3565b9050801561056957336000908152600b602052604090205461051090826116a6565b336000818152600b6020526040908190209290925590516001600160801b03841691907f3ff464150615c9feed1523d133f419537d8dce4eafb4f3cad6441f1057f7a98b90610560908590612037565b60405180910390a35b5080610574816120e7565b9150506104be565b50336000818152600660205260409020547fb68dafc1da13dc868096d0b87347c831d0bda92d178317eb1dec7f788444485c906105c2906001600160801b0316846120d0565b846040516105d1929190612040565b60405180910390a2600254604051637619800d60e11b81526000916001600160a01b03169063ec33001a9061060a903390600401611d5f565b60206040518083038186803b15801561062257600080fd5b505afa158015610636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065a9190611ca4565b80156106745750336000908152600b602052604090205415155b156107455750336000818152600b6020526040808220805492905560035490516340c10f1960e01b815291926001600160a01b03909116916340c10f19916106c0918590600401611dc1565b600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050506106fa611422565b6001600160801b0316336001600160a01b03167f4c1a02c138bad7a3efdf0e207e5b369762a15144bd1ca3516aa5c70b3b58c10f8360405161073c9190612037565b60405180910390a35b82156107ca576003546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061077d9033908790600401611dc1565b600060405180830381600087803b15801561079757600080fd5b505af11580156107ab573d6000803e3d6000fd5b505050506107ca6107c582856116a690919063ffffffff16565b6116b2565b6107d483826116a6565b93505050505b90565b6000806107e8611422565b90506001600160801b03811615806108095750603c816001600160801b0316115b156108185760009150506107da565b6001600160801b03166000908152600a6020526040902054905090565b600b6020526000908152604090205481565b6001546001600160a01b031633146108715760405162461bcd60e51b815260040161046090611e79565b6000826001600160801b03161180156108945750603c826001600160801b031611155b6108b05760405162461bcd60e51b815260040161046090611e1c565b6108b8611422565b6001600160801b0316826001600160801b0316116108e85760405162461bcd60e51b815260040161046090611f1c565b6001600160801b039091166000908152600a6020526040902055565b6001546001600160a01b0316331461092e5760405162461bcd60e51b815260040161046090611e79565b6001805460ff60a01b19169055565b6000610949838361137f565b90505b92915050565b60008061095d611422565b90506001600160801b038116158061097e5750603c816001600160801b0316115b1561098d5760009150506107da565b6001600160801b0316600090815260096020526040902054905090565b6001600160a01b03166000908152600660205260409020546001600160801b031690565b60075481565b600154600160a01b900460ff1690565b60008060015b603c816001600160801b031611610a32576001600160801b038116600090815260096020526040902054610a1e9083612079565b915080610a2a816120e7565b9150506109ea565b50905090565b6001600160801b0381166000908152600a602052604081205461094c90670de0b6b3a764000061140a565b6006602052600090815260409020546001600160801b031681565b6001600160801b03811660009081526009602052604081205461094c90670de0b6b3a764000061140a565b6001546001600160a01b03163314610ad35760405162461bcd60e51b815260040161046090611e79565b6000826001600160801b0316118015610af65750603c826001600160801b031611155b610b125760405162461bcd60e51b815260040161046090611e1c565b610b1a611422565b6001600160801b0316826001600160801b031611610b4a5760405162461bcd60e51b815260040161046090611f1c565b6001600160801b03909116600090815260096020526040902055565b6001546001600160a01b03163314610b905760405162461bcd60e51b815260040161046090611e79565b6001805460ff60a01b1916600160a01b179055565b60025460405163c691d19160e01b81526000918291829182916001600160a01b039091169063c691d19190610bde908990600401611d5f565b60606040518083038186803b158015610bf657600080fd5b505afa158015610c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e9190611d2b565b92509250925081856001600160801b03161180610c5d575081856001600160801b031611158015610c5d575080155b80610c70575082856001600160801b0316105b15610c81576000935050505061094c565b600254604051631e953b1760e31b81526000916001600160a01b03169063f4a9d8b890610cb49089908b90600401612015565b60206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190611d13565b979650505050505050565b6005546001600160801b031681565b336000908152600660205260409020546001600160801b031690565b6000610d446109d4565b15610d615760405162461bcd60e51b815260040161046090611f9e565b816001600160801b0316610d73611422565b6001600160801b031611610d995760405162461bcd60e51b815260040161046090611fca565b603c826001600160801b03161115610dc35760405162461bcd60e51b815260040161046090611de5565b336000908152600660205260409020546001600160801b0380841691610deb911660016116a6565b14610e085760405162461bcd60e51b815260040161046090611ef2565b6000610e138361146d565b90506000610e20846115f3565b9050610e44610e2e856115f3565b336000908152600b6020526040902054906116a6565b336000818152600b6020526040908190209290925590516001600160801b03861691907f3ff464150615c9feed1523d133f419537d8dce4eafb4f3cad6441f1057f7a98b90610e94908590612037565b60405180910390a3600254604051637619800d60e11b81526000916001600160a01b03169063ec33001a90610ecd903390600401611d5f565b60206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611ca4565b8015610f375750336000908152600b602052604090205415155b156110015750336000818152600b6020526040808220805492905560035490516340c10f1960e01b815291926001600160a01b03909116916340c10f1991610f83918590600401611dc1565b600060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b50505050846001600160801b0316336001600160a01b03167f4c1a02c138bad7a3efdf0e207e5b369762a15144bd1ca3516aa5c70b3b58c10f83604051610ff89190612037565b60405180910390a35b8215611081576003546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906110399033908790600401611dc1565b600060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506110816107c582856116a690919063ffffffff16565b846001600160801b0316336001600160a01b03167f04ad45a69eeed9c390c3a678fed2d4b90bde98e742de9936d5e0915bf3d0ea4e856040516110c49190612037565b60405180910390a36110d683826116a6565b95945050505050565b600a6020526000908152604090205481565b60006110fb611422565b6001600160801b0316905090565b6002546001600160a01b031633146111335760405162461bcd60e51b815260040161046090611f51565b6001600160a01b0382166000908152600b602052604090205480156111e057611163620f4240610417838561140a565b6001600160a01b0384166000908152600b602052604081208290559061118a908390611461565b9050611194611422565b6001600160801b0316846001600160a01b03167f78aca16d6078c9827367a58ab3945e7a7a88db3bce89486c7447eb6c0dc0da1f836040516111d69190612037565b60405180910390a3505b505050565b60008060015b603c816001600160801b031611610a32576001600160801b0381166000908152600a602052604090205461121f9083612079565b91508061122b816120e7565b9150506111eb565b600061094c826112f7565b6002546001600160a01b031633146112685760405162461bcd60e51b815260040161046090611f51565b6001600160a01b0381166000908152600b602052604090205480156112f3576001600160a01b0382166000908152600b60205260408120556112a8611422565b6001600160801b0316826001600160a01b03167f78aca16d6078c9827367a58ab3945e7a7a88db3bce89486c7447eb6c0dc0da1f836040516112ea9190612037565b60405180910390a35b5050565b6002546000805460405163165196bf60e11b815291926001600160a01b0390811692632ca32d7e9261132f9216908690600401611d9f565b60206040518083038186803b15801561134757600080fd5b505afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190611d13565b600254600080546040516308c028dd60e41b815291926001600160a01b0390811692638c028dd0926113ba9288929116908790600401611d73565b60206040518083038186803b1580156113d257600080fd5b505afa1580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109499190611d13565b600061094982846120b1565b60006109498284612091565b6000600854421015611436575060006107da565b61145c60016114566007546104176008544261146190919063ffffffff16565b906116a6565b905090565b600061094982846120d0565b6005546000906001600160801b038084169116101561148f5761148f82611b64565b33600090815260066020526040902080546001600160801b0319166001600160801b0384169081179091556004805490919081106114dd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600014156114f857506000610422565b6002546040516331ed3bf160e21b81526000916001600160a01b03169063c7b4efc490611529903390600401611d5f565b60206040518083038186803b15801561154157600080fd5b505afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115799190611cda565b9050806001600160801b0316836001600160801b03161061159e576000915050610422565b6115ec6004846001600160801b0316815481106115cb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546104176115e3338761137f565b61041187610a7e565b9392505050565b60006004826001600160801b03168154811061161f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546000141561163a57506000610422565b600061164b3361032d85600161204e565b90506115ec620f4240610417836104116004886001600160801b03168154811061168557634e487b7160e01b600052603260045260246000fd5b906000526020600020015461041761169d338b61137f565b6104118b610a38565b60006109498284612079565b600254604051630308a59b60e31b81526001600160a01b03909116906318452cd8906116e2903390600401611d5f565b60206040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190611ca4565b15611b6157600254604051639ca423b360e01b81526000916001600160a01b031690639ca423b390611768903390600401611d5f565b60206040518083038186803b15801561178057600080fd5b505afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b89190611c25565b90506000611852612710610417600260009054906101000a90046001600160a01b03166001600160a01b03166375cd903b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190611d13565b869061140a565b6003546040516340c10f1960e01b81529192506001600160a01b0316906340c10f19906118859085908590600401611dc1565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b50505050816001600160a01b0316336001600160a01b03167f1834256d5ddaf7e9aafcd123dca0e155cef83bfc259ce07ba017587c6cdd9abc836040516118fa9190612037565b60405180910390a3600254604051630308a59b60e31b81526001600160a01b03909116906318452cd890611932908590600401611d5f565b60206040518083038186803b15801561194a57600080fd5b505afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190611ca4565b156111e057600254604051639ca423b360e01b81526000916001600160a01b031690639ca423b3906119b8908690600401611d5f565b60206040518083038186803b1580156119d057600080fd5b505afa1580156119e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a089190611c25565b90506000611aa2612710610417600260009054906101000a90046001600160a01b03166001600160a01b03166320f5984d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190611d13565b889061140a565b6003546040516340c10f1960e01b81529192506001600160a01b0316906340c10f1990611ad59085908590600401611dc1565b600060405180830381600087803b158015611aef57600080fd5b505af1158015611b03573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b0316336001600160a01b03167f4514843c0c872aa44ebb71c5e6b05840c7de3261fb32de859afac91fcf0dafb784604051611b549190612037565b60405180910390a4505050505b50565b6005546001600160801b0380831691611b7f911660016116a6565b14611b9c5760405162461bcd60e51b815260040161046090611ebb565b600580546001600160801b0319166001600160801b038316179055611bc0816112f7565b6004826001600160801b031681548110611bea57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015550565b8051801515811461042257600080fd5b600060208284031215611c1a578081fd5b81356115ec81612124565b600060208284031215611c36578081fd5b81516115ec81612124565b60008060408385031215611c53578081fd5b8235611c5e81612124565b91506020830135611c6e81612139565b809150509250929050565b60008060408385031215611c8b578182fd5b8235611c9681612124565b946020939093013593505050565b600060208284031215611cb5578081fd5b61094982611bf9565b600060208284031215611ccf578081fd5b81356115ec81612139565b600060208284031215611ceb578081fd5b81516115ec81612139565b60008060408385031215611d08578182fd5b8235611c9681612139565b600060208284031215611d24578081fd5b5051919050565b600080600060608486031215611d3f578081fd5b8351925060208401519150611d5660408501611bf9565b90509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529190921660208201526001600160801b03909116604082015260600190565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601e908201527f4d6178696d756d206e756d626572206f662065706f6368732069732036300000604082015260600190565b6020808252603c908201527f4d696e696d756d2065706f6368206e756d626572206973203120616e64204d6160408201527f78696d756d206e756d626572206f662065706f63687320697320363000000000606082015260800190565b60208082526022908201527f4f6e6c79206f776e65722063616e2070657266726f6d2074686973206163746960408201526137b760f11b606082015260800190565b6020808252601f908201527f45706f63682063616e20626520696e6974206f6e6c7920696e206f7264657200604082015260600190565b60208082526010908201526f2430b93b32b9ba1034b71037b93232b960811b604082015260600190565b6020808252818101527f4f6e6c79206675747572652065706f63682063616e2062652075706461746564604082015260600190565b6020808252602d908201527f4f6e6c79207374616b696e6720636f6e74726163742063616e2070657266726f60408201526c36903a3434b99030b1ba34b7b760991b606082015260800190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b6020808252601b908201527f546869732065706f636820697320696e20746865206675747572650000000000604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b039290921682526001600160a01b0316602082015260400190565b90815260200190565b918252602082015260400190565b60006001600160801b038083168185168083038211156120705761207061210e565b01949350505050565b6000821982111561208c5761208c61210e565b500190565b6000826120ac57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156120cb576120cb61210e565b500290565b6000828210156120e2576120e261210e565b500390565b60006001600160801b03808316818114156121045761210461210e565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611b6157600080fd5b6001600160801b0381168114611b6157600080fdfea2646970667358221220835848fa0cf11f61af53c7e70b522fd99596de6fcf63dcca9ca1f5ff8d7e9e3164736f6c63430008000033

Deployed Bytecode Sourcemap

8200:18896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8326:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8895:22;;;:::i;17667:537::-;;;;;;:::i;:::-;;:::i;8956:47::-;;;;;;:::i;:::-;;:::i;12834:1686::-;;;:::i;11918:273::-;;;:::i;9070:57::-;;;;;;:::i;:::-;;:::i;11005:339::-;;;;;;:::i;:::-;;:::i;:::-;;22224:72;;;:::i;17218:161::-;;;;;;:::i;:::-;;:::i;11646:260::-;;;:::i;17521:134::-;;;;;;:::i;:::-;;:::i;8833:25::-;;;:::i;22053:78::-;;;:::i;:::-;;;;;;;:::i;12199:261::-;;;:::i;11495:139::-;;;;;;:::i;:::-;;:::i;8771:55::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11352:131::-;;;;;;:::i;:::-;;:::i;10667:326::-;;;;;;:::i;:::-;;:::i;22143:69::-;;;:::i;18216:480::-;;;;;;:::i;:::-;;:::i;8729:35::-;;;:::i;17387:122::-;;;:::i;14528:1401::-;;;;;;:::i;:::-;;:::i;9010:53::-;;;;;;:::i;:::-;;:::i;17033:95::-;;;:::i;18708:446::-;;;;;;:::i;:::-;;:::i;12473:245::-;;;:::i;16911:114::-;;;;;;:::i;:::-;;:::i;19166:288::-;;;;;;:::i;:::-;;:::i;8326:38::-;8362:2;8326:38;:::o;8895:22::-;;;;:::o;17667:537::-;17737:4;17754:16;17773:21;17786:7;17773:12;:21::i;:::-;17754:40;-1:-1:-1;17870:13:0;17866:54;;17907:1;17900:8;;;;;17866:54;17940:24;17967:49;17992:10;18004:11;:7;18014:1;18004:11;:::i;17967:49::-;17940:76;;18036:160;8414:7;18036:139;18158:16;18036:117;18144:8;18036:93;18084:44;18108:10;18120:7;18084:23;:44::i;:::-;18036:33;18061:7;18036:24;:33::i;:::-;:47;;:93::i;:::-;:107;;:117::i;:160::-;18029:167;;;;17667:537;;;;:::o;8956:47::-;;;;;;;;;;;;;:::o;12834:1686::-;12889:4;9471:8;:6;:8::i;:::-;9470:9;9462:40;;;;-1:-1:-1;;;9462:40:0;;;;;;;:::i;:::-;;;;;;;;;12905:26:::1;12942:12:::0;12957:20:::1;12975:1;12957:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;12957:17:0::1;::::0;::::1;:20::i;:::-;12942:35;;8362:2;13051:7;:22;13047:77;;;-1:-1:-1::0;8362:2:0::1;13047:77;13174:10;13141:9;13153:32:::0;;;:20:::1;:32;::::0;;;;;:36:::1;::::0;-1:-1:-1;;;;;13153:32:0::1;::::0;:36:::1;:::i;:::-;13141:48;;13136:557;13196:7;13191:1;-1:-1:-1::0;;;;;13191:12:0::1;;13136:557;;13358:11;13367:1;13358:8;:11::i;:::-;13333:36;::::0;;::::1;:::i;:::-;;;13398:21;13422;13441:1;13422:18;:21::i;:::-;13398:45:::0;-1:-1:-1;13462:17:0;;13458:224:::1;;13560:10;13537:34;::::0;;;:22:::1;:34;::::0;;;;;:53:::1;::::0;13576:13;13537:38:::1;:53::i;:::-;13523:10;13500:34;::::0;;;:22:::1;:34;::::0;;;;;;:90;;;;13614:52;;-1:-1:-1;;;;;13614:52:0;::::1;::::0;13523:10;13614:52:::1;::::0;::::1;::::0;13652:13;;13614:52:::1;:::i;:::-;;;;;;;;13458:224;-1:-1:-1::0;13205:3:0;::::1;::::0;::::1;:::i;:::-;;;;13136:557;;;-1:-1:-1::0;13722:10:0::1;13744:32;::::0;;;:20:::1;:32;::::0;;;;;13710:90:::1;::::0;13734:42:::1;::::0;-1:-1:-1;;;;;13744:32:0::1;13734:7:::0;:42:::1;:::i;:::-;13778:21;13710:90;;;;;;;:::i;:::-;;;;;;;;13858:8;::::0;:36:::1;::::0;-1:-1:-1;;;13858:36:0;;13813:26:::1;::::0;-1:-1:-1;;;;;13858:8:0::1;::::0;:24:::1;::::0;:36:::1;::::0;13883:10:::1;::::0;13858:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;;;-1:-1:-1::0;13921:10:0::1;13935:1;13898:34:::0;;;:22:::1;:34;::::0;;;;;:38;;13858:78:::1;13854:369;;;-1:-1:-1::0;13997:10:0::1;13974:34;::::0;;;:22:::1;:34;::::0;;;;;;;14023:38;;;14076:7:::1;::::0;:44;;-1:-1:-1;;;14076:44:0;;13974:34;;-1:-1:-1;;;;;14076:7:0;;::::1;::::0;:12:::1;::::0;:44:::1;::::0;13974:34;;14076:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14177:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;14140:71:0::1;14165:10;-1:-1:-1::0;;;;;14140:71:0::1;;14192:18;14140:71;;;;;;:::i;:::-;;;;;;;;13854:369;14239:25:::0;;14235:213:::1;;14272:7;::::0;:47:::1;::::0;-1:-1:-1;;;14272:47:0;;-1:-1:-1;;;;;14272:7:0;;::::1;::::0;:12:::1;::::0;:47:::1;::::0;14285:10:::1;::::0;14297:21;;14272:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14365:71;14390:45;14416:18;14390:21;:25;;:45;;;;:::i;:::-;14365:24;:71::i;:::-;14467:45;:21:::0;14493:18;14467:25:::1;:45::i;:::-;14460:52;;;;;9513:1;12834:1686:::0;:::o;11918:273::-;11979:4;11996:20;12019:13;:11;:13::i;:::-;11996:36;-1:-1:-1;;;;;;12047:17:0;;;;:48;;;8362:2;12068:12;-1:-1:-1;;;;;12068:27:0;;12047:48;12043:89;;;12119:1;12112:8;;;;;12043:89;-1:-1:-1;;;;;12151:32:0;;;;;:18;:32;;;;;;;-1:-1:-1;11918:273:0;:::o;9070:57::-;;;;;;;;;;;;;:::o;11005:339::-;9349:6;;-1:-1:-1;;;;;9349:6:0;9335:10;:20;9327:67;;;;-1:-1:-1;;;9327:67:0;;;;;;;:::i;:::-;11117:1:::1;11107:7;-1:-1:-1::0;;;;;11107:11:0::1;;:38;;;;;8362:2;11122:7;-1:-1:-1::0;;;;;11122:23:0::1;;;11107:38;11099:111;;;;-1:-1:-1::0;;;11099:111:0::1;;;;;;;:::i;:::-;11239:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;11229:23:0::1;:7;-1:-1:-1::0;;;;;11229:23:0::1;;11221:68;;;;-1:-1:-1::0;;;11221:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11300:27:0;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:36;11005:339::o;22224:72::-;9349:6;;-1:-1:-1;;;;;9349:6:0;9335:10;:20;9327:67;;;;-1:-1:-1;;;9327:67:0;;;;;;;:::i;:::-;22273:7:::1;:15:::0;;-1:-1:-1;;;;22273:15:0::1;::::0;;22224:72::o;17218:161::-;17302:4;17326:45;17350:11;17363:7;17326:23;:45::i;:::-;17319:52;;17218:161;;;;;:::o;11646:260::-;11700:4;11717:20;11740:13;:11;:13::i;:::-;11717:36;-1:-1:-1;;;;;;11768:17:0;;;;:48;;;8362:2;11789:12;-1:-1:-1;;;;;11789:27:0;;11768:48;11764:89;;;11840:1;11833:8;;;;;11764:89;-1:-1:-1;;;;;11872:26:0;;;;;:12;:26;;;;;;;-1:-1:-1;11646:260:0;:::o;17521:134::-;-1:-1:-1;;;;;17619:28:0;17595:4;17619:28;;;:20;:28;;;;;;-1:-1:-1;;;;;17619:28:0;;17521:134::o;8833:25::-;;;;:::o;22053:78::-;22116:7;;-1:-1:-1;;;22116:7:0;;;;;22053:78::o;12199:261::-;12258:7;;12330:1;12313:106;8362:2;12333:1;-1:-1:-1;;;;;12333:17:0;;12313:106;;-1:-1:-1;;;;;12392:15:0;;;;;;:12;:15;;;;;;12372:35;;;;:::i;:::-;;-1:-1:-1;12352:3:0;;;;:::i;:::-;;;;12313:106;;;-1:-1:-1;12436:16:0;-1:-1:-1;12199:261:0;:::o;11495:139::-;-1:-1:-1;;;;;11589:25:0;;11565:4;11589:25;;;:18;:25;;;;;;:37;;11619:6;11589:29;:37::i;8771:55::-;;;;;;;;;;;;-1:-1:-1;;;;;8771:55:0;;:::o;11352:131::-;-1:-1:-1;;;;;11444:19:0;;11420:4;11444:19;;;:12;:19;;;;;;:31;;11468:6;11444:23;:31::i;10667:326::-;9349:6;;-1:-1:-1;;;;;9349:6:0;9335:10;:20;9327:67;;;;-1:-1:-1;;;9327:67:0;;;;;;;:::i;:::-;10772:1:::1;10762:7;-1:-1:-1::0;;;;;10762:11:0::1;;:38;;;;;8362:2;10777:7;-1:-1:-1::0;;;;;10777:23:0::1;;;10762:38;10754:111;;;;-1:-1:-1::0;;;10754:111:0::1;;;;;;;:::i;:::-;10894:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;10884:23:0::1;:7;-1:-1:-1::0;;;;;10884:23:0::1;;10876:68;;;;-1:-1:-1::0;;;10876:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10955:21:0;;::::1;;::::0;;;:12:::1;:21;::::0;;;;:30;10667:326::o;22143:69::-;9349:6;;-1:-1:-1;;;;;9349:6:0;9335:10;:20;9327:67;;;;-1:-1:-1;;;9327:67:0;;;;;;;:::i;:::-;22200:4:::1;22190:14:::0;;-1:-1:-1;;;;22190:14:0::1;-1:-1:-1::0;;;22190:14:0::1;::::0;;22143:69::o;18216:480::-;18378:8;;:26;;-1:-1:-1;;;18378:26:0;;18304:7;;;;;;;;-1:-1:-1;;;;;18378:8:0;;;;:18;;:26;;18397:6;;18378:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18324:80;;;;;;18431:8;18421:7;-1:-1:-1;;;;;18421:18:0;;:62;;;;18455:8;18444:7;-1:-1:-1;;;;;18444:19:0;;;:38;;;;-1:-1:-1;18467:15:0;;18444:38;18421:86;;;;18497:10;18487:7;-1:-1:-1;;;;;18487:20:0;;18421:86;18417:127;;;18531:1;18524:8;;;;;;;18417:127;18591:8;;:53;;-1:-1:-1;;;18591:53:0;;18564:24;;-1:-1:-1;;;;;18591:8:0;;:36;;:53;;18628:7;;18637:6;;18591:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18564:80;18216:480;-1:-1:-1;;;;;;;18216:480:0:o;8729:35::-;;;-1:-1:-1;;;;;8729:35:0;;:::o;17387:122::-;17490:10;17446:4;17469:32;;;:20;:32;;;;;;-1:-1:-1;;;;;17469:32:0;17387:122;:::o;14528:1401::-;14595:4;9471:8;:6;:8::i;:::-;9470:9;9462:40;;;;-1:-1:-1;;;9462:40:0;;;;;;;:::i;:::-;14675:7:::1;-1:-1:-1::0;;;;;14659:23:0::1;:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;14659:23:0::1;;14650:64;;;;-1:-1:-1::0;;;14650:64:0::1;;;;;;;:::i;:::-;8362:2;14733:7;-1:-1:-1::0;;;;;14733:23:0::1;;;14725:66;;;;-1:-1:-1::0;;;14725:66:0::1;;;;;;;:::i;:::-;14832:10;14811:32;::::0;;;:20:::1;:32;::::0;;;;;-1:-1:-1;;;;;14811:50:0;;::::1;::::0;:39:::1;::::0;:32:::1;14848:1;14811:36;:39::i;:::-;:50;14802:80;;;;-1:-1:-1::0;;;14802:80:0::1;;;;;;;:::i;:::-;14893:15;14911:17;14920:7;14911:8;:17::i;:::-;14893:35;;14949:21;14973:27;14992:7;14973:18;:27::i;:::-;14949:51;;15048:67;15087:27;15106:7;15087:18;:27::i;:::-;15071:10;15048:34;::::0;;;:22:::1;:34;::::0;;;;;;:38:::1;:67::i;:::-;15034:10;15011:34;::::0;;;:22:::1;:34;::::0;;;;;;:104;;;;15131:58;;-1:-1:-1;;;;;15131:58:0;::::1;::::0;15034:10;15131:58:::1;::::0;::::1;::::0;15175:13;;15131:58:::1;:::i;:::-;;;;;;;;15255:8;::::0;:36:::1;::::0;-1:-1:-1;;;15255:36:0;;15210:26:::1;::::0;-1:-1:-1;;;;;15255:8:0::1;::::0;:24:::1;::::0;:36:::1;::::0;15280:10:::1;::::0;15255:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;;;-1:-1:-1::0;15318:10:0::1;15332:1;15295:34:::0;;;:22:::1;:34;::::0;;;;;:38;;15255:78:::1;15251:363;;;-1:-1:-1::0;15394:10:0::1;15371:34;::::0;;;:22:::1;:34;::::0;;;;;;;15420:38;;;15473:7:::1;::::0;:44;;-1:-1:-1;;;15473:44:0;;15371:34;;-1:-1:-1;;;;;15473:7:0;;::::1;::::0;:12:::1;::::0;:44:::1;::::0;15371:34;;15473:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15574:7;-1:-1:-1::0;;;;;15537:65:0::1;15562:10;-1:-1:-1::0;;;;;15537:65:0::1;;15583:18;15537:65;;;;;;:::i;:::-;;;;;;;;15251:363;15638:14:::0;;15634:180:::1;;15660:7;::::0;:36:::1;::::0;-1:-1:-1;;;15660:36:0;;-1:-1:-1;;;;;15660:7:0;;::::1;::::0;:12:::1;::::0;:36:::1;::::0;15673:10:::1;::::0;15685;;15660:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15742:60;15767:34;15782:18;15767:10;:14;;:34;;;;:::i;15742:60::-;15849:7;-1:-1:-1::0;;;;;15829:40:0::1;15837:10;-1:-1:-1::0;;;;;15829:40:0::1;;15858:10;15829:40;;;;;;:::i;:::-;;;;;;;;15887:34;:10:::0;15902:18;15887:14:::1;:34::i;:::-;15880:41:::0;14528:1401;-1:-1:-1;;;;;14528:1401:0:o;9010:53::-;;;;;;;;;;;;;:::o;17033:95::-;17083:4;17107:13;:11;:13::i;:::-;-1:-1:-1;;;;;17100:20:0;;;17033:95;:::o;18708:446::-;9204:8;;-1:-1:-1;;;;;9204:8:0;9182:10;:31;9174:89;;;;-1:-1:-1;;;9174:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18829:30:0;::::1;18809:17;18829:30:::0;;;:22:::1;:30;::::0;;;;;18874:13;;18870:277:::1;;18937:52;8414:7;18937:31;:9:::0;18951:16;18937:13:::1;:31::i;:52::-;-1:-1:-1::0;;;;;18904:30:0;::::1;;::::0;;;:22:::1;:30;::::0;;;;:85;;;:30;19024:45:::1;::::0;:9;;:13:::1;:45::i;:::-;19004:65;;19110:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;19084:51:0::1;19102:6;-1:-1:-1::0;;;;;19084:51:0::1;;19125:9;19084:51;;;;;;:::i;:::-;;;;;;;;18870:277;;9274:1;18708:446:::0;;:::o;12473:245::-;12528:7;;12594:1;12577:106;8362:2;12597:1;-1:-1:-1;;;;;12597:17:0;;12577:106;;-1:-1:-1;;;;;12650:21:0;;;;;;:18;:21;;;;;;12636:35;;;;:::i;:::-;;-1:-1:-1;12616:3:0;;;;:::i;:::-;;;;12577:106;;16911:114;16972:4;16996:21;17009:7;16996:12;:21::i;19166:288::-;9204:8;;-1:-1:-1;;;;;9204:8:0;9182:10;:31;9174:89;;;;-1:-1:-1;;;9174:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19260:30:0;::::1;19240:17;19260:30:::0;;;:22:::1;:30;::::0;;;;;19305:13;;19301:146:::1;;-1:-1:-1::0;;;;;19335:30:0;::::1;19368:1;19335:30:::0;;;:22:::1;:30;::::0;;;;:34;19410:13:::1;:11;:13::i;:::-;-1:-1:-1::0;;;;;19384:51:0::1;19402:6;-1:-1:-1::0;;;;;19384:51:0::1;;19425:9;19384:51;;;;;;:::i;:::-;;;;;;;;19301:146;9274:1;19166:288:::0;:::o;21301:178::-;21422:8;;21363:4;21448:13;;21422:49;;-1:-1:-1;;;21422:49:0;;21363:4;;-1:-1:-1;;;;;21422:8:0;;;;:25;;:49;;21448:13;;21463:7;;21422:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21487:244::-;21658:8;;21581:4;21700:13;;21658:65;;-1:-1:-1;;;21658:65:0;;21581:4;;-1:-1:-1;;;;;21658:8:0;;;;:28;;:65;;21687:11;;21700:13;;;21715:7;;21658:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3561:98::-;3619:7;3646:5;3650:1;3646;:5;:::i;3960:98::-;4018:7;4045:5;4049:1;4045;:5;:::i;21804:237::-;21850:15;21900:10;;21882:15;:28;21878:69;;;-1:-1:-1;21934:1:0;21927:8;;21878:69;21975:57;22030:1;21975:50;22011:13;;21975:31;21995:10;;21975:15;:19;;:31;;;;:::i;:50::-;:54;;:57::i;:::-;21957:76;;21804:237;:::o;3204:98::-;3262:7;3289:5;3293:1;3289;:5;:::i;19797:994::-;20018:20;;19851:4;;-1:-1:-1;;;;;20018:30:0;;;:20;;:30;20014:82;;;20065:19;20076:7;20065:10;:19::i;:::-;20173:10;20152:32;;;;:20;:32;;;;;:42;;-1:-1:-1;;;;;;20152:42:0;-1:-1:-1;;;;;20152:42:0;;;;;;;;20433:6;:15;;:6;;20152:42;20433:15;;;;-1:-1:-1;;;20433:15:0;;;;;;;;;;;;;;;;;20452:1;20433:20;20429:61;;;-1:-1:-1;20477:1:0;20470:8;;20429:61;20529:8;;:34;;-1:-1:-1;;;20529:34:0;;20510:16;;-1:-1:-1;;;;;20529:8:0;;:22;;:34;;20552:10;;20529:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20510:53;;20589:8;-1:-1:-1;;;;;20578:19:0;:7;-1:-1:-1;;;;;20578:19:0;;20574:60;;20621:1;20614:8;;;;;20574:60;20661:122;20767:6;20774:7;-1:-1:-1;;;;;20767:15:0;;;;;;;-1:-1:-1;;;20767:15:0;;;;;;;;;;;;;;;;;20661:91;20707:44;20731:10;20743:7;20707:23;:44::i;:::-;20661:31;20684:7;20661:22;:31::i;:122::-;20654:129;19797:994;-1:-1:-1;;;19797:994:0:o;20805:488::-;20873:4;20945:6;20952:7;-1:-1:-1;;;;;20945:15:0;;;;;;;-1:-1:-1;;;20945:15:0;;;;;;;;;;;;;;;;;20964:1;20945:20;20941:61;;;-1:-1:-1;20989:1:0;20982:8;;20941:61;21022:24;21049:49;21074:10;21086:11;:7;21096:1;21086:11;:::i;21049:49::-;21022:76;;21118:167;8414:7;21118:146;21247:16;21118:124;21226:6;21233:7;-1:-1:-1;;;;;21226:15:0;;;;;;;-1:-1:-1;;;21226:15:0;;;;;;;;;;;;;;;;;21118:93;21166:44;21190:10;21202:7;21166:23;:44::i;:::-;21118:33;21143:7;21118:24;:33::i;2823:98::-;2881:7;2908:5;2912:1;2908;:5;:::i;15941:866::-;16021:8;;:32;;-1:-1:-1;;;16021:32:0;;-1:-1:-1;;;;;16021:8:0;;;;:20;;:32;;16042:10;;16021:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16017:783;;;16089:8;;:30;;-1:-1:-1;;;16089:30:0;;16070:16;;-1:-1:-1;;;;;16089:8:0;;:18;;:30;;16108:10;;16089:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16070:49;;16134:18;16155:69;16218:5;16155:58;16172:8;;;;;;;;;-1:-1:-1;;;;;16172:8:0;-1:-1:-1;;;;;16172:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16155:12;;:16;:58::i;:69::-;16239:7;;:34;;-1:-1:-1;;;16239:34:0;;16134:90;;-1:-1:-1;;;;;;16239:7:0;;:12;;:34;;16252:8;;16134:90;;16239:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16329:8;-1:-1:-1;;;;;16293:57:0;16317:10;-1:-1:-1;;;;;16293:57:0;;16339:10;16293:57;;;;;;:::i;:::-;;;;;;;;16420:8;;:30;;-1:-1:-1;;;16420:30:0;;-1:-1:-1;;;;;16420:8:0;;;;:20;;:30;;16441:8;;16420:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16416:373;;;16491:8;;:28;;-1:-1:-1;;;16491:28:0;;16471:17;;-1:-1:-1;;;;;16491:8:0;;:18;;:28;;16510:8;;16491:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16471:48;;16538:18;16559:70;16623:5;16559:59;16576:8;;;;;;;;;-1:-1:-1;;;;;16576:8:0;-1:-1:-1;;;;;16576:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16559:12;;:16;:59::i;:70::-;16645:7;;:35;;-1:-1:-1;;;16645:35:0;;16538:91;;-1:-1:-1;;;;;;16645:7:0;;:12;;:35;;16658:9;;16538:91;;16645:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16751:9;-1:-1:-1;;;;;16704:69:0;16741:8;-1:-1:-1;;;;;16704:69:0;16729:10;-1:-1:-1;;;;;16704:69:0;;16762:10;16704:69;;;;;;:::i;:::-;;;;;;;;16416:373;;16017:783;;;15941:866;:::o;19489:300::-;19554:20;;-1:-1:-1;;;;;19554:38:0;;;;:27;;:20;19579:1;19554:24;:27::i;:::-;:38;19546:82;;;;-1:-1:-1;;;19546:82:0;;;;;;;:::i;:::-;19639:20;:30;;-1:-1:-1;;;;;;19639:30:0;-1:-1:-1;;;;;19639:30:0;;;;;19760:21;19639:30;19760:12;:21::i;:::-;19742:6;19749:7;-1:-1:-1;;;;;19742:15:0;;;;;;;-1:-1:-1;;;19742:15:0;;;;;;;;;;;;;;;;;;:39;-1:-1:-1;19489:300:0:o;14:166:1:-;92:13;;141;;134:21;124:32;;114:2;;170:1;167;160:12;185:259;;297:2;285:9;276:7;272:23;268:32;265:2;;;318:6;310;303:22;265:2;362:9;349:23;381:33;408:5;381:33;:::i;449:263::-;;572:2;560:9;551:7;547:23;543:32;540:2;;;593:6;585;578:22;540:2;630:9;624:16;649:33;676:5;649:33;:::i;717:402::-;;;846:2;834:9;825:7;821:23;817:32;814:2;;;867:6;859;852:22;814:2;911:9;898:23;930:33;957:5;930:33;:::i;:::-;982:5;-1:-1:-1;1039:2:1;1024:18;;1011:32;1052:35;1011:32;1052:35;:::i;:::-;1106:7;1096:17;;;804:315;;;;;:::o;1124:327::-;;;1253:2;1241:9;1232:7;1228:23;1224:32;1221:2;;;1274:6;1266;1259:22;1221:2;1318:9;1305:23;1337:33;1364:5;1337:33;:::i;:::-;1389:5;1441:2;1426:18;;;;1413:32;;-1:-1:-1;;;1211:240:1:o;1456:214::-;;1576:2;1564:9;1555:7;1551:23;1547:32;1544:2;;;1597:6;1589;1582:22;1544:2;1625:39;1654:9;1625:39;:::i;1675:259::-;;1787:2;1775:9;1766:7;1762:23;1758:32;1755:2;;;1808:6;1800;1793:22;1755:2;1852:9;1839:23;1871:33;1898:5;1871:33;:::i;1939:263::-;;2062:2;2050:9;2041:7;2037:23;2033:32;2030:2;;;2083:6;2075;2068:22;2030:2;2120:9;2114:16;2139:33;2166:5;2139:33;:::i;2207:327::-;;;2336:2;2324:9;2315:7;2311:23;2307:32;2304:2;;;2357:6;2349;2342:22;2304:2;2401:9;2388:23;2420:33;2447:5;2420:33;:::i;2539:194::-;;2662:2;2650:9;2641:7;2637:23;2633:32;2630:2;;;2683:6;2675;2668:22;2630:2;-1:-1:-1;2711:16:1;;2620:113;-1:-1:-1;2620:113:1:o;2738:336::-;;;;2892:2;2880:9;2871:7;2867:23;2863:32;2860:2;;;2913:6;2905;2898:22;2860:2;2947:9;2941:16;2931:26;;2997:2;2986:9;2982:18;2976:25;2966:35;;3020:48;3064:2;3053:9;3049:18;3020:48;:::i;:::-;3010:58;;2850:224;;;;;:::o;3079:203::-;-1:-1:-1;;;;;3243:32:1;;;;3225:51;;3213:2;3198:18;;3180:102::o;3287:416::-;-1:-1:-1;;;;;3545:15:1;;;3527:34;;3597:15;;;;3592:2;3577:18;;3570:43;-1:-1:-1;;;;;3649:47:1;;;3644:2;3629:18;;3622:75;3477:2;3462:18;;3444:259::o;3708:315::-;-1:-1:-1;;;;;3900:32:1;;;;3882:51;;-1:-1:-1;;;;;3969:47:1;3964:2;3949:18;;3942:75;3870:2;3855:18;;3837:186::o;4028:274::-;-1:-1:-1;;;;;4220:32:1;;;;4202:51;;4284:2;4269:18;;4262:34;4190:2;4175:18;;4157:145::o;4307:187::-;4472:14;;4465:22;4447:41;;4435:2;4420:18;;4402:92::o;4499:354::-;4701:2;4683:21;;;4740:2;4720:18;;;4713:30;4779:32;4774:2;4759:18;;4752:60;4844:2;4829:18;;4673:180::o;4858:424::-;5060:2;5042:21;;;5099:2;5079:18;;;5072:30;5138:34;5133:2;5118:18;;5111:62;5209:30;5204:2;5189:18;;5182:58;5272:3;5257:19;;5032:250::o;5287:398::-;5489:2;5471:21;;;5528:2;5508:18;;;5501:30;5567:34;5562:2;5547:18;;5540:62;-1:-1:-1;;;5633:2:1;5618:18;;5611:32;5675:3;5660:19;;5461:224::o;5690:355::-;5892:2;5874:21;;;5931:2;5911:18;;;5904:30;5970:33;5965:2;5950:18;;5943:61;6036:2;6021:18;;5864:181::o;6050:340::-;6252:2;6234:21;;;6291:2;6271:18;;;6264:30;-1:-1:-1;;;6325:2:1;6310:18;;6303:46;6381:2;6366:18;;6224:166::o;6395:356::-;6597:2;6579:21;;;6616:18;;;6609:30;6675:34;6670:2;6655:18;;6648:62;6742:2;6727:18;;6569:182::o;6756:409::-;6958:2;6940:21;;;6997:2;6977:18;;;6970:30;7036:34;7031:2;7016:18;;7009:62;-1:-1:-1;;;7102:2:1;7087:18;;7080:43;7155:3;7140:19;;6930:235::o;7170:342::-;7372:2;7354:21;;;7411:2;7391:18;;;7384:30;-1:-1:-1;;;7445:2:1;7430:18;;7423:48;7503:2;7488:18;;7344:168::o;7517:351::-;7719:2;7701:21;;;7758:2;7738:18;;;7731:30;7797:29;7792:2;7777:18;;7770:57;7859:2;7844:18;;7691:177::o;7873:218::-;-1:-1:-1;;;;;8037:47:1;;;;8019:66;;8007:2;7992:18;;7974:117::o;8096:315::-;-1:-1:-1;;;;;8288:47:1;;;;8270:66;;-1:-1:-1;;;;;8372:32:1;8367:2;8352:18;;8345:60;8258:2;8243:18;;8225:186::o;8416:177::-;8562:25;;;8550:2;8535:18;;8517:76::o;8598:248::-;8772:25;;;8828:2;8813:18;;8806:34;8760:2;8745:18;;8727:119::o;8851:253::-;;-1:-1:-1;;;;;8980:2:1;8977:1;8973:10;9010:2;9007:1;9003:10;9041:3;9037:2;9033:12;9028:3;9025:21;9022:2;;;9049:18;;:::i;:::-;9085:13;;8899:205;-1:-1:-1;;;;8899:205:1:o;9109:128::-;;9180:1;9176:6;9173:1;9170:13;9167:2;;;9186:18;;:::i;:::-;-1:-1:-1;9222:9:1;;9157:80::o;9242:217::-;;9308:1;9298:2;;-1:-1:-1;;;9333:31:1;;9387:4;9384:1;9377:15;9415:4;9340:1;9405:15;9298:2;-1:-1:-1;9444:9:1;;9288:171::o;9464:168::-;;9570:1;9566;9562:6;9558:14;9555:1;9552:21;9547:1;9540:9;9533:17;9529:45;9526:2;;;9577:18;;:::i;:::-;-1:-1:-1;9617:9:1;;9516:116::o;9637:125::-;;9705:1;9702;9699:8;9696:2;;;9710:18;;:::i;:::-;-1:-1:-1;9747:9:1;;9686:76::o;9767:226::-;;-1:-1:-1;;;;;9903:2:1;9896:5;9892:14;9930:2;9921:7;9918:15;9915:2;;;9936:18;;:::i;:::-;9985:1;9972:15;;9814:179;-1:-1:-1;;;9814:179:1:o;9998:127::-;10059:10;10054:3;10050:20;10047:1;10040:31;10090:4;10087:1;10080:15;10114:4;10111:1;10104:15;10130:133;-1:-1:-1;;;;;10207:31:1;;10197:42;;10187:2;;10253:1;10250;10243:12;10268:148;-1:-1:-1;;;;;10349:5:1;10345:46;10338:5;10335:57;10325:2;;10406:1;10403;10396:12

Swarm Source

ipfs://835848fa0cf11f61af53c7e70b522fd99596de6fcf63dcca9ca1f5ff8d7e9e31

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.