Contract 0xeD0892c0034163a2185d1c94783450C36D7214e6

 
Txn Hash Method
Block
From
To
Value
0xd0e48d07a75c3c808dfce7b58103c5fc6d159c7099537af877d3d52b0619ece6Withdraw Rewards123516812021-05-02 0:58:2551 days 18 hrs ago0x84b6a9dcb7f0fdccfcb68c09eef0ca5646ab7f59 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.00121079426
0x14aa3a707eadf5a5eeb9dfc76bd19bf4da3a89dfe679c55e696f9f96ac2e9dfbFinish Stake123191272021-04-27 0:17:4356 days 19 hrs ago0x25d97bbb715ee86e4e418dbbb0bde595288cff61 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.01008185244
0x209dff694545bedff8951d9ab66d0310d587da59d4e99ed159f4d17764e509f7Finish Stake123170662021-04-26 16:29:3357 days 2 hrs ago0xb44cf6954a7f9b097ed97d84e0bac1c1744f89f8 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.01460441553
0xad99aa57a86e5d525957535fb1a2c646376b3d1a8baff7763b9d1e5a0d8e9046Finish Stake121665862021-04-03 12:26:2180 days 6 hrs ago0xbc821f69db0146e2a8b6ed8bfc1e47e4a71e4461 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.0104677100
0x537ccd15f1b285ee0e5f5fa4c78afa871bd55fa106872edf6781f44cdde9da94Finish Stake121455392021-03-31 6:33:2983 days 12 hrs ago0xfca50708dc3048fd5ac48bbb537a0ea17456c2c3 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.014582143137
0xc08a1bf16d45a4f212b7e95abddb3bfb86c95f9a396631a44a597d0d68494dc3Finish Stake121126722021-03-26 5:14:0888 days 14 hrs ago0x1ff163f1044f0159fb76e31129463954d2472a15 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.0158697990
0x608cc8eae46c82cfbb0142602824f074b2f9c655d25b2e4706d48937935a182cFinish Stake120888922021-03-22 13:30:4492 days 5 hrs ago0x2981f55c11fecd4a80479fe502a4eb0071a776a6 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.05850795150
0xc88ec394c4c5d0478fe29825a7501b6682d1016bfc210d5e1e490f1bfb442b93Finish Stake120162032021-03-11 8:31:16103 days 10 hrs ago0x32be1f86bb7eb19f75a325f33f9f3bb5032711fe IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.02073645126
0x3a1687837f7bc4b65b111a37d0af73b8991ea9522960fade35d11fc6b8f3f368Finish Stake119984322021-03-08 14:41:26106 days 4 hrs ago0x2981f55c11fecd4a80479fe502a4eb0071a776a6 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.007043491157
0x3a81e753c5224132713bfaea974ea61a60f337ea462494f3da33ff9b410e0d5fFinish Stake119984292021-03-08 14:40:30106 days 4 hrs ago0x2981f55c11fecd4a80479fe502a4eb0071a776a6 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.006819176152
0x0932a47c462a2e852e2fb2a96bebfb1485880b8d39fa075c07396df321ca07a9Finish Stake119959762021-03-08 5:27:14106 days 13 hrs ago0x8182bde40272ae62539c0dcc64efc54c5fcf4210 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.02212926286
0x321eb5c51d60fdd290d6de97fe1df6d70405320be9058d47209e2f84c63235d1Finish Stake119958852021-03-08 5:06:50106 days 14 hrs ago0xf8695ad71b4edff4bd9dfcbfceedcc73d4c2e6e0 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.01902569486
0x3251355ad04cee6f91d50ae967390e0f6ad6d6743d966038b5d106390cde6727Finish Stake119918372021-03-07 14:14:01107 days 5 hrs ago0x1fd824729c880e9d587a6b2a5d2f18d95d45adae IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.006287112108
0x5806172c33a6cb27ed6e8602124ea87a16b3281604c91a7bcf869c2bd57d3b89Finish Stake119906062021-03-07 9:41:18107 days 9 hrs ago0x9c42155a22fc3720743c923f9177cbf1ef7ff7c2 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.04508522787
0xa5f3db8cde9607680efd3abfc94097c823e0a87128a3025dc603bcef2cfbb3bdFinish Stake119848702021-03-06 12:28:46108 days 6 hrs ago0x34daf5612bbeab05edb080eca2b29e7d7ef859db IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.02438756769
0x82e02b6d9f40f4d9a79f4b69cb1308f5570491c2853d751a5fedcc2c741b203fFinish Stake119834082021-03-06 7:13:16108 days 12 hrs ago0xa6fa214a3628beea799d8c67bb16a0a79fc57cb4 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.03444972567
0xed728760006c8c40013960cacb21a53c5827548902f857fbb72f27560f08013bFinish Stake119810852021-03-05 22:38:26108 days 20 hrs ago0x4f4480bb9fc4893a9149274cfce7b7a58b579f0e IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.03391064698
0x4926495f8ca085f4394a0fce43ecf096b6b5ef9d668f942d3ffbf3672338932fFinish Stake119810442021-03-05 22:28:25108 days 20 hrs ago0x4f4480bb9fc4893a9149274cfce7b7a58b579f0e IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.02790000043793.000001459
0xd3217d78cd7638e51e48f67dac229d33e94f15db21fe67730d874997c1b31925Finish Stake119810332021-03-05 22:24:15108 days 20 hrs ago0x4f4480bb9fc4893a9149274cfce7b7a58b579f0e IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.002812593.75
0x2ef3de8593cd7574e0341ac589197044cc647cfa1dd4473c9feb2612ffff63d5Finish Stake119798612021-03-05 18:08:05109 days 1 hr ago0xa6fa214a3628beea799d8c67bb16a0a79fc57cb4 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.009034354161
0x06fce9784e2fe19a0cf8b1039b455610940a1c08d29d8d2daf3ed5c85d8822d7Finish Stake119791652021-03-05 15:36:35109 days 3 hrs ago0x0f95550a8b0277a95d327a330a83fc7898ee6c95 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.071017652148
0xe50cc1cc050dc7b042f3af1782f86d409c5928829660aa3fd2de10141f5895a1Finish Stake119790492021-03-05 15:09:30109 days 4 hrs ago0x0f95550a8b0277a95d327a330a83fc7898ee6c95 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.00773122115
0xf51103172db095c9adeff8903661bf8ea8c31b8cb04bdcb588137330107c84e8_force Finish St...119774062021-03-05 9:12:13109 days 10 hrs ago0x868209b6945cd7adb3a4c7514d2c68d6969309c4 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.00667884140
0xa97a01f5a948186bea06ac93a7b3ec44457037999a08529a25b102cd2588e2fc_force Finish St...119774062021-03-05 9:12:13109 days 10 hrs ago0x868209b6945cd7adb3a4c7514d2c68d6969309c4 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.00667884140
0x4039a6253e1b83cb5593982f6cb205fe05ee633db8c3bd535f6f113524049f5e_force Finish St...119774062021-03-05 9:12:13109 days 10 hrs ago0x868209b6945cd7adb3a4c7514d2c68d6969309c4 IN  0xed0892c0034163a2185d1c94783450c36d7214e60 Ether0.00667884140
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x1A6BA90fb551df29852F842c17d74eAe0c74141f

Contract Name:
LitionPool

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: LitionPool.sol
pragma solidity >=0.5.12;

import 'Date.sol';

interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

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

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

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

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

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @title   Lition Pool Contract
 * @author  Patricio Mosse
 * @notice  This contract is used for staking LIT (ERC20) tokens to support a validator running in the Lition blockchain network and distribute rewards.
 **/
contract LitionPool {
    using SafeMath for uint256;

    /**************************************************** Events **************************************************************/
    
    event NewStake(address indexed staker, uint256 totalStaked, uint8 lockupPeriod, bool compound);
    event StakerMigrated(address indexed staker);
    event StakeFinishedByUser(address indexed staker, uint256 totalRecovered, uint256 index);
    event StakeRestakedByUser(address indexed staker, uint256 totalStaked, uint8 lockupPeriod, bool compound);
    event StakeEnabledToBeFinished(address indexed staker, uint256 index);
    event StakeRemoved(address indexed staker, uint256 totalRecovered, uint256 index);
    event RewardsAccredited(address indexed staker, uint256 index, uint256 delta, uint256 total);
    event StakeIncreased(address indexed staker, uint256 index, uint256 delta, uint256 total);
    event RewardsWithdrawn(address indexed staker, uint256 index, uint256 total);
    event TransferredToVestingAccount(uint256 total);

    /**************************************************** Vars and structs **************************************************************/
    
    address public owner;
    IERC20 litionToken;
    bool public paused = false;

    struct Stake {
        uint256 createdOn;
        uint256 totalStaked;
        uint8 lockupPeriod;
        bool compound;
        uint256 rewards;
        bool finished;
    }
    
    address[] public stakers;
    mapping (address => Stake[]) public stakeListBySender;

    /**************************************************** Admin **************************************************************/

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    constructor(IERC20 _litionToken) public {
        owner = msg.sender;
        litionToken = _litionToken;
    }

    function _transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "New owner can't be the zero address");
        owner = newOwner;
    }
    
    function _switchPaused() public onlyOwner {
        paused = !paused;
    }

    function() external payable {
        revert();
    }

    /**************************************************** Public Interface for Stakers **************************************************************/

    function createNewStake(uint256 _amount, uint8 _lockupPeriod, bool _compound) public {
        require(!paused, "New stakes are paused");
        require(_isValidLockupPeriod(_lockupPeriod), "The lockup period is invalid");
        require(_amount >= 5000000000000000000000, "You must stake at least 5000 LIT");
        require(IERC20(litionToken).transferFrom(msg.sender, address(this), _amount), "Couldn't take the LIT from the sender");
        
        Stake memory stake = Stake({createdOn: now, 
                                    totalStaked:_amount, 
                                    lockupPeriod:_lockupPeriod, 
                                    compound:_compound, 
                                    rewards:0,
                                    finished:false});
                                    
        _addStakerIfNotExist(msg.sender);
        Stake[] storage stakes = stakeListBySender[msg.sender];
        stakes.push(stake);
        
        emit NewStake(msg.sender, _amount, _lockupPeriod, _compound);
    }
    
    function _migrateStakes(address _staker, 
                            uint256[] memory _created_on_array, 
                            uint256[] memory _amount_array, 
                            uint8[] memory _lockup_period_array, 
                            bool[] memory _compound_array, 
                            uint256[] memory _rewards_array, 
                            bool[] memory _finished_array) public onlyOwner {
                                
        _addStakerIfNotExist(_staker);
        
        for (uint256 index = 0; index < _created_on_array.length; index++) {
            Stake memory stake = Stake({createdOn: _created_on_array[index], 
                                        totalStaked: _amount_array[index], 
                                        lockupPeriod: _lockup_period_array[index], 
                                        compound: _compound_array[index], 
                                        rewards: _rewards_array[index],
                                        finished: _finished_array[index]});
    
            Stake[] storage stakes = stakeListBySender[_staker];
            stakes.push(stake);
        }

        emit StakerMigrated(_staker);
    }
    
    function finishStake(uint256 _index) public {
        require(stakeListBySender[msg.sender].length > _index, "The stake doesn't exist");

        Stake memory stake = stakeListBySender[msg.sender][_index];

        require(stake.finished, "The stake is not finished yet");
        
        uint256 total = _closeStake(msg.sender, _index);
        
        emit StakeFinishedByUser(msg.sender, total, _index);
    }
    
    function restake(uint256 _index) public {
        require(stakeListBySender[msg.sender].length > _index, "The stake doesn't exist");

        Stake storage stake = stakeListBySender[msg.sender][_index];

        require(stake.finished, "The stake is not finished yet");
        
        stake.totalStaked = stake.totalStaked.add(stake.rewards);
        stake.rewards = 0;
        stake.createdOn = now;
        stake.finished = false;

        emit StakeRestakedByUser(msg.sender, stake.totalStaked, stake.lockupPeriod, stake.compound);
    }
    
    function withdrawRewards(uint256 _index) public {
        require(stakeListBySender[msg.sender].length > _index, "The stake doesn't exist");

        Stake storage stake = stakeListBySender[msg.sender][_index];

        require(stake.rewards > 0, "You don't have rewards to withdraw");
        
        uint256 total = stake.rewards;
        stake.rewards = 0;

        require(litionToken.transfer(msg.sender, total));

        emit RewardsWithdrawn(msg.sender, _index, total);
    }

    /**************************************************** Public Interface for Admin **************************************************************/

    function _accredit(address _staker, uint256 _index, uint256 _total) public onlyOwner {
        require(stakeListBySender[_staker].length > _index, "The stake doesn't exist");

        Stake storage stake = stakeListBySender[_staker][_index];
        require(!stake.finished, "The stake is already finished");
        
        if (stake.compound) {
            stake.totalStaked += _total;

            emit StakeIncreased(_staker, _index, _total, stake.totalStaked);
        }
        else {
            stake.rewards += _total;

            emit RewardsAccredited(_staker, _index, _total, stake.rewards);
        }
        
        if (_isLockupPeriodFinished(stake.createdOn, stake.lockupPeriod)) {
            stake.finished = true;
            
            emit StakeEnabledToBeFinished(_staker, _index);
        }
    }
    
    function _accreditMultiple(address _staker, uint256[] memory _totals) public onlyOwner {
        require(stakeListBySender[_staker].length == _totals.length, "Invalid number of stakes");
        
        for (uint256 index = 0; index < _totals.length; index++) {
            Stake storage stake = stakeListBySender[_staker][index];
            require(!stake.finished, "The stake is already finished");
            
            if (stake.compound) {
                stake.totalStaked += _totals[index];
    
                emit StakeIncreased(_staker, index, _totals[index], stake.totalStaked);
            }
            else {
                stake.rewards += _totals[index];
    
                emit RewardsAccredited(_staker, index, _totals[index], stake.rewards);
            }
            
            if (_isLockupPeriodFinished(stake.createdOn, stake.lockupPeriod)) {
                stake.finished = true;
                
                emit StakeEnabledToBeFinished(_staker, index);
            }
        }
    }
    
    function _forceFinishStake(address _staker, uint256 _index) public onlyOwner {
        require(stakeListBySender[_staker].length > _index, "The stake doesn't exist");
        Stake storage stake = stakeListBySender[_staker][_index];
        require(!stake.finished, "The stake is already finished");
        stake.finished = true;
        
        emit StakeEnabledToBeFinished(_staker, _index);
    }

    function _transferLITToVestingAccount(uint256 _total) public onlyOwner {
        require(litionToken.transfer(msg.sender, _total));

        emit TransferredToVestingAccount(_total);
    }
    
    function _extractLitSentByMistake(uint256 amount, address _sendTo) public onlyOwner {
        require(litionToken.transfer(_sendTo, amount));
    }

    function _removeStaker(address _staker, uint256 _index) public onlyOwner {
        require(stakeListBySender[_staker].length > _index, "The stake doesn't exist");
        
        uint256 total = _closeStake(_staker, _index);

        emit StakeRemoved(_staker, total, _index);
    }

    /**************************************************** Pool Information **************************************************************/

    function getTotalInStake() public view returns (uint256) {
        uint256 total = 0;
        for (uint256 i = 0; i < stakers.length; i++) {
            Stake[] memory stakes = stakeListBySender[stakers[i]];
            for (uint256 j = 0; j < stakes.length; j++) {
                if (!stakes[j].finished) {
                    total = total.add(stakes[j].totalStaked);
                }
            }
        }
        return total;
    }
    
    function getTotalStakes() public view returns (uint256) {
        uint256 total = 0;
        for (uint256 i = 0; i < stakers.length; i++) {
            Stake[] memory stakes = stakeListBySender[stakers[i]];
            for (uint256 j = 0; j < stakes.length; j++) {
                if (!stakes[j].finished) {
                    total += 1;
                }
            }
        }
        return total;
    }
    
    function getTotalStakers() public view returns (uint256) {
        return stakers.length;
    }

    function getTotalStakesByStaker(address _staker) external view returns (uint256) {
        return stakeListBySender[_staker].length;
    }
    
    function getStake(address _staker, uint256 _index) external view returns (uint256 createdOn, uint256 totalStaked, uint8 lockupPeriod, bool compound, uint256 rewards, bool finished, uint256 lockupFinishes) {
        require(stakeListBySender[_staker].length > _index, "The stake doesn't exist");
        Stake memory stake = stakeListBySender[_staker][_index];
        createdOn = stake.createdOn;
        totalStaked = stake.totalStaked;
        lockupPeriod = stake.lockupPeriod;
        compound = stake.compound;
        rewards = stake.rewards;
        finished = stake.finished;
        lockupFinishes = getLockupFinishTimestamp(_staker, _index);
    }

    function getLockupFinishTimestamp(address _staker, uint256 _index) public view returns (uint256) {
        require(stakeListBySender[_staker].length > _index, "The stake doesn't exist");
        Stake memory stake = stakeListBySender[_staker][_index];
        return calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
    }

    /**************************************************** Internal Admin - Lockups **************************************************************/

    function calculateFinishTimestamp(uint256 _timestamp, uint8 _lockupPeriod) public pure returns (uint256) {
        uint16 year = Date.getYear(_timestamp);
        uint8 month = Date.getMonth(_timestamp);
        month += _lockupPeriod;
        if (month > 12) {
            year += 1;
            month = month % 12;
        }
        uint8 day = Date.getDay(_timestamp);
        uint256 finishOn = Date.toTimestamp(year, month, day);
        return finishOn;
    }

    /**************************************************** Internal Admin - Stakes and Rewards **************************************************************/

    function _closeStake(address _staker, uint256 _index) internal returns (uint256) {
        uint256 totalStaked = stakeListBySender[_staker][_index].totalStaked;
        uint256 total = totalStaked + stakeListBySender[_staker][_index].rewards;
        
        _removeStakeByIndex(_staker, _index);
        if (stakeListBySender[_staker].length == 0) {
            _removeStakerByValue(_staker);
        }
        
        require(litionToken.transfer(_staker, total));

        return total;
    }
    
    /**************************************************** Internal Admin - Validations **************************************************************/
    
    function _isValidLockupPeriod(uint8 n) internal pure returns (bool) {
        return n == 1 || n == 3 || n == 6 || n == 12;
    }

    function _isLockupPeriodFinished(uint256 _timestamp, uint8 _lockupPeriod) internal view returns (bool) {
        return now > calculateFinishTimestamp(_timestamp, _lockupPeriod);
    }

    /**************************************************** Internal Admin - Arrays **************************************************************/
    
    function _addStakerIfNotExist(address _staker) internal {
        if (stakeListBySender[_staker].length == 0) {
            stakers.push(_staker);
        }
    }

    function _findStaker(address _value) internal view returns(uint) {
        uint i = 0;
        while (stakers[i] != _value) {
            i++;
        }
        return i;
    }

    function _removeStakerByValue(address _value) internal {
        uint i = _findStaker(_value);
        _removeStakerByIndex(i);
    }

    function _removeStakerByIndex(uint _i) internal {
        while (_i<stakers.length-1) {
            stakers[_i] = stakers[_i+1];
            _i++;
        }
        stakers.length--;
    }
    
    function _removeStakeByIndex(address _staker, uint _i) internal {
        Stake[] storage stakes = stakeListBySender[_staker];
        while (_i<stakes.length-1) {
            stakes[_i] = stakes[_i+1];
            _i++;
        }
        stakes.length--;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        require(c >= a);
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b);
        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

File 1 of 2: Date.sol
pragma solidity >=0.5.12;


library Date {
    struct _Date {
        uint16 year;
        uint8 month;
        uint8 day;
    }

    uint constant DAY_IN_SECONDS = 86400;
    uint constant YEAR_IN_SECONDS = 31536000;
    uint constant LEAP_YEAR_IN_SECONDS = 31622400;

    uint16 constant ORIGIN_YEAR = 1970;

    function isLeapYear(uint16 year) public pure returns (bool) {
        if (year % 4 != 0) {
                return false;
        }
        if (year % 100 != 0) {
                return true;
        }
        if (year % 400 != 0) {
                return false;
        }
        return true;
    }

    function leapYearsBefore(uint year) public pure returns (uint) {
        year -= 1;
        return year / 4 - year / 100 + year / 400;
    }

    function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                return 31;
        }
        else if (month == 4 || month == 6 || month == 9 || month == 11) {
                return 30;
        }
        else if (isLeapYear(year)) {
                return 29;
        }
        else {
                return 28;
        }
    }

    function parseTimestamp(uint timestamp) internal pure returns (_Date memory dt) {
        uint secondsAccountedFor = 0;
        uint buf;
        uint8 i;

        // Year
        dt.year = getYear(timestamp);
        buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
        secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);

        // Month
        uint secondsInMonth;
        for (i = 1; i <= 12; i++) {
                secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                if (secondsInMonth + secondsAccountedFor > timestamp) {
                        dt.month = i;
                        break;
                }
                secondsAccountedFor += secondsInMonth;
        }

        // Day
        for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                        dt.day = i;
                        break;
                }
                secondsAccountedFor += DAY_IN_SECONDS;
        }
    }

    function getYear(uint timestamp) public pure returns (uint16) {
        uint secondsAccountedFor = 0;
        uint16 year;
        uint numLeapYears;

        // Year
        year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
        numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

        while (secondsAccountedFor > timestamp) {
                if (isLeapYear(uint16(year - 1))) {
                        secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                }
                else {
                        secondsAccountedFor -= YEAR_IN_SECONDS;
                }
                year -= 1;
        }
        return year;
    }

    function getMonth(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).month;
    }

    function getDay(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).day;
    }

    function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
        uint16 i;

        // Year
        for (i = ORIGIN_YEAR; i < year; i++) {
                if (isLeapYear(i)) {
                        timestamp += LEAP_YEAR_IN_SECONDS;
                }
                else {
                        timestamp += YEAR_IN_SECONDS;
                }
        }

        // Month
        uint8[12] memory monthDayCounts;
        monthDayCounts[0] = 31;
        if (isLeapYear(year)) {
                monthDayCounts[1] = 29;
        }
        else {
                monthDayCounts[1] = 28;
        }
        monthDayCounts[2] = 31;
        monthDayCounts[3] = 30;
        monthDayCounts[4] = 31;
        monthDayCounts[5] = 30;
        monthDayCounts[6] = 31;
        monthDayCounts[7] = 31;
        monthDayCounts[8] = 30;
        monthDayCounts[9] = 31;
        monthDayCounts[10] = 30;
        monthDayCounts[11] = 31;

        for (i = 1; i < month; i++) {
                timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
        }

        // Day
        timestamp += DAY_IN_SECONDS * (day - 1);

        return timestamp;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_litionToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"indexed":false,"internalType":"bool","name":"compound","type":"bool"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsAccredited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"StakeEnabledToBeFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalRecovered","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"StakeFinishedByUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"StakeIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalRecovered","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"StakeRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"indexed":false,"internalType":"bool","name":"compound","type":"bool"}],"name":"StakeRestakedByUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"}],"name":"StakerMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TransferredToVestingAccount","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"_accredit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256[]","name":"_totals","type":"uint256[]"}],"name":"_accreditMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_sendTo","type":"address"}],"name":"_extractLitSentByMistake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"_forceFinishStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256[]","name":"_created_on_array","type":"uint256[]"},{"internalType":"uint256[]","name":"_amount_array","type":"uint256[]"},{"internalType":"uint8[]","name":"_lockup_period_array","type":"uint8[]"},{"internalType":"bool[]","name":"_compound_array","type":"bool[]"},{"internalType":"uint256[]","name":"_rewards_array","type":"uint256[]"},{"internalType":"bool[]","name":"_finished_array","type":"bool[]"}],"name":"_migrateStakes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"_removeStaker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_switchPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"_transferLITToVestingAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"_transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint8","name":"_lockupPeriod","type":"uint8"}],"name":"calculateFinishTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_lockupPeriod","type":"uint8"},{"internalType":"bool","name":"_compound","type":"bool"}],"name":"createNewStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"finishStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLockupFinishTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getStake","outputs":[{"internalType":"uint256","name":"createdOn","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"internalType":"bool","name":"compound","type":"bool"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"},{"internalType":"uint256","name":"lockupFinishes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalInStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getTotalStakesByStaker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"restake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeListBySender","outputs":[{"internalType":"uint256","name":"createdOn","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"internalType":"bool","name":"compound","type":"bool"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"withdrawRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526001805460ff60a01b1916905534801561001d57600080fd5b506040516129d03803806129d08339818101604052602081101561004057600080fd5b5051600080546001600160a01b03199081163317909155600180546001600160a01b03909316929091169190911790556129518061007f6000396000f3fe60806040526004361061014b5760003560e01c80639750728c116100b6578063cf7cf9bb1161006f578063cf7cf9bb1461055e578063cfd47663146108a6578063d29d44ee1461091b578063e440fd7a1461094e578063fc80106614610987578063fd5e6dd11461099c5761014b565b80639750728c146103e0578063a139ec7f14610413578063a5935a4f14610483578063a82b5b5c146104bc578063b81c3aa5146104f5578063bce1b520146105345761014b565b80635c975abb116101085780635c975abb1461030857806368c33627146103315780636d27ff611461034657806386f91453146103705780638da5cb5b146103855780639342c8f4146103b65761014b565b806308a12e1714610150578063101ddc10146102105780632b7e23e21461024957806331ed0db41461027357806344ca108a1461029a57806356e3712a146102d5575b600080fd5b34801561015c57600080fd5b5061020e6004803603604081101561017357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561019d57600080fd5b8201836020820111156101af57600080fd5b803590602001918460208302840111600160201b831117156101d057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506109c6945050505050565b005b34801561021c57600080fd5b5061020e6004803603604081101561023357600080fd5b506001600160a01b038135169060200135610c8f565b34801561025557600080fd5b5061020e6004803603602081101561026c57600080fd5b5035610de4565b34801561027f57600080fd5b50610288610eba565b60408051918252519081900360200190f35b3480156102a657600080fd5b5061020e600480360360608110156102bd57600080fd5b5080359060ff60208201351690604001351515610ec1565b3480156102e157600080fd5b50610288600480360360208110156102f857600080fd5b50356001600160a01b03166111ad565b34801561031457600080fd5b5061031d6111c8565b604080519115158252519081900360200190f35b34801561033d57600080fd5b506102886111d8565b34801561035257600080fd5b5061020e6004803603602081101561036957600080fd5b5035611302565b34801561037c57600080fd5b5061020e611483565b34801561039157600080fd5b5061039a6114bb565b604080516001600160a01b039092168252519081900360200190f35b3480156103c257600080fd5b5061020e600480360360208110156103d957600080fd5b50356114ca565b3480156103ec57600080fd5b506102886004803603604081101561040357600080fd5b508035906020013560ff16611660565b34801561041f57600080fd5b5061044c6004803603604081101561043657600080fd5b506001600160a01b0381351690602001356118a9565b60408051968752602087019590955260ff9093168585015290151560608501526080840152151560a0830152519081900360c00190f35b34801561048f57600080fd5b5061020e600480360360408110156104a657600080fd5b506001600160a01b038135169060200135611902565b3480156104c857600080fd5b50610288600480360360408110156104df57600080fd5b506001600160a01b0381351690602001356119cf565b34801561050157600080fd5b5061020e6004803603606081101561051857600080fd5b506001600160a01b038135169060208101359060400135611acf565b34801561054057600080fd5b5061020e6004803603602081101561055757600080fd5b5035611d07565b34801561056a57600080fd5b5061020e600480360360e081101561058157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105ab57600080fd5b8201836020820111156105bd57600080fd5b803590602001918460208302840111600160201b831117156105de57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561062d57600080fd5b82018360208201111561063f57600080fd5b803590602001918460208302840111600160201b8311171561066057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106af57600080fd5b8201836020820111156106c157600080fd5b803590602001918460208302840111600160201b831117156106e257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561073157600080fd5b82018360208201111561074357600080fd5b803590602001918460208302840111600160201b8311171561076457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561083557600080fd5b82018360208201111561084757600080fd5b803590602001918460208302840111600160201b8311171561086857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e6c945050505050565b3480156108b257600080fd5b506108df600480360360408110156108c957600080fd5b506001600160a01b038135169060200135612021565b60408051978852602088019690965260ff9094168686015291151560608601526080850152151560a084015260c0830152519081900360e00190f35b34801561092757600080fd5b5061020e6004803603602081101561093e57600080fd5b50356001600160a01b031661214c565b34801561095a57600080fd5b5061020e6004803603604081101561097157600080fd5b50803590602001356001600160a01b03166121ca565b34801561099357600080fd5b50610288612270565b3480156109a857600080fd5b5061039a600480360360208110156109bf57600080fd5b50356123ba565b6000546001600160a01b031633146109dd57600080fd5b80516001600160a01b03831660009081526003602052604090205414610a4a576040805162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f66207374616b65730000000000000000604482015290519081900360640190fd5b60005b8151811015610c8a576001600160a01b0383166000908152600360205260408120805483908110610a7a57fe5b60009182526020909120600590910201600481015490915060ff1615610ae7576040805162461bcd60e51b815260206004820152601d60248201527f546865207374616b6520697320616c72656164792066696e6973686564000000604482015290519081900360640190fd5b6002810154610100900460ff1615610b8b57828281518110610b0557fe5b60200260200101518160010160008282540192505081905550836001600160a01b03167fc6b4665c6f58a573e0ed1610a70948399687c309032cce4c685cb85a3fe689d383858581518110610b5657fe5b6020026020010151846001015460405180848152602001838152602001828152602001935050505060405180910390a2610c19565b828281518110610b9757fe5b60200260200101518160030160008282540192505081905550836001600160a01b03167fc54eb33cddfd5be9ec7a33f63845f5550d7b0bffc8c1415bc79456f2640a64cf83858581518110610be857fe5b6020026020010151846003015460405180848152602001838152602001828152602001935050505060405180910390a25b80546002820154610c2d919060ff166123e1565b15610c815760048101805460ff191660011790556040805183815290516001600160a01b038616917f0985193948def5807b71f9b8f4dbec56c89da0383f673d5ff19cccdeea51d859919081900360200190a25b50600101610a4d565b505050565b6000546001600160a01b03163314610ca657600080fd5b6001600160a01b0382166000908152600360205260409020548110610d00576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600360205260408120805483908110610d2457fe5b60009182526020909120600590910201600481015490915060ff1615610d91576040805162461bcd60e51b815260206004820152601d60248201527f546865207374616b6520697320616c72656164792066696e6973686564000000604482015290519081900360640190fd5b60048101805460ff191660011790556040805183815290516001600160a01b038516917f0985193948def5807b71f9b8f4dbec56c89da0383f673d5ff19cccdeea51d859919081900360200190a2505050565b6000546001600160a01b03163314610dfb57600080fd5b6001546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610e4f57600080fd5b505af1158015610e63573d6000803e3d6000fd5b505050506040513d6020811015610e7957600080fd5b5051610e8457600080fd5b6040805182815290517f78b5a0db62b8f908f7c1c29ed053c5fbdafb603ca84d3de74caeb5f08fdbf73f9181900360200190a150565b6002545b90565b600154600160a01b900460ff1615610f18576040805162461bcd60e51b815260206004820152601560248201527413995dc81cdd185ad95cc8185c99481c185d5cd959605a1b604482015290519081900360640190fd5b610f21826123f6565b610f72576040805162461bcd60e51b815260206004820152601c60248201527f546865206c6f636b757020706572696f6420697320696e76616c696400000000604482015290519081900360640190fd5b69010f0cf064dd59200000831015610fd1576040805162461bcd60e51b815260206004820181905260248201527f596f75206d757374207374616b65206174206c656173742035303030204c4954604482015290519081900360640190fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b50516110925760405162461bcd60e51b81526004018080602001828103825260258152602001806128f86025913960400191505060405180910390fd5b61109a6127a7565b6040518060c001604052804281526020018581526020018460ff1681526020018315158152602001600081526020016000151581525090506110db3361242f565b3360008181526003602081815260408084208054600181810183558287529584902088516005909202019081558784015195810195909555868201516002860180546060808b015115156101000261ff001960ff95861660ff1994851617161790925560808a01519688019690965560a089015160049097018054971515979096169690961790945581518a81529389169284019290925286151583820152519093927f3c5d7aabc89d319fc90fb19bd7a34da854544b0c597e190aa90cab5a88e52d3a928290030190a25050505050565b6001600160a01b031660009081526003602052604090205490565b600154600160a01b900460ff1681565b600080805b6002548110156112fc57606060036000600284815481106111fa57fe5b60009182526020808320909101546001600160a01b031683528281019390935260409182018120805483518186028101860190945280845292939092919084015b828210156112b35760008481526020908190206040805160c081018252600586029092018054835260018082015484860152600282015460ff80821694860194909452610100900483161515606085015260038201546080850152600490910154909116151560a0830152908352909201910161123b565b509293506000925050505b81518110156112f2578181815181106112d357fe5b602002602001015160a001516112ea576001840193505b6001016112be565b50506001016111dd565b50905090565b336000908152600360205260409020548110611353576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b61135b6127a7565b33600090815260036020526040902080548390811061137657fe5b60009182526020918290206040805160c081018252600590930290910180548352600181015493830193909352600283015460ff80821692840192909252610100900481161515606083015260038301546080830152600490920154909116151560a08201819052909150611432576040805162461bcd60e51b815260206004820152601d60248201527f546865207374616b65206973206e6f742066696e697368656420796574000000604482015290519081900360640190fd5b600061143e338461249b565b6040805182815260208101869052815192935033927f63d12d4bf5c527379ee33ecf96fd18c174f4d6da7c8cc72416d6f80a481a0838929181900390910190a2505050565b6000546001600160a01b0316331461149a57600080fd5b6001805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000546001600160a01b031681565b33600090815260036020526040902054811061151b576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b33600090815260036020526040812080548390811061153657fe5b9060005260206000209060050201905060008160030154116115895760405162461bcd60e51b81526004018080602001828103825260228152602001806128d66022913960400191505060405180910390fd5b6003810180546000918290556001546040805163a9059cbb60e01b815233600482015260248101849052905192936001600160a01b039092169263a9059cbb92604480840193602093929083900390910190829087803b1580156115ec57600080fd5b505af1158015611600573d6000803e3d6000fd5b505050506040513d602081101561161657600080fd5b505161162157600080fd5b6040805184815260208101839052815133927ffa73d3ab3a92ed3f2b694757d8e4b2f3c293654b11b9c79111f8971f861b22b2928290030190a2505050565b60008073b83368ff9d693b61895a0401c9019cb2c6727a6b6392d66313856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156116b257600080fd5b505af41580156116c6573d6000803e3d6000fd5b505050506040513d60208110156116dc57600080fd5b5051604080516328c92b4960e21b815260048101879052905191925060009173b83368ff9d693b61895a0401c9019cb2c6727a6b9163a324ad24916024808301926020929190829003018186803b15801561173657600080fd5b505af415801561174a573d6000803e3d6000fd5b505050506040513d602081101561176057600080fd5b505184019050600c60ff8216111561178957600182019150600c8160ff168161178557fe5b0690505b600073b83368ff9d693b61895a0401c9019cb2c6727a6b6365c72840876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156117da57600080fd5b505af41580156117ee573d6000803e3d6000fd5b505050506040513d602081101561180457600080fd5b5051604080516304646cc560e51b815261ffff8616600482015260ff808616602483015283166044820152905191925060009173b83368ff9d693b61895a0401c9019cb2c6727a6b91638c8d98a0916064808301926020929190829003018186803b15801561187257600080fd5b505af4158015611886573d6000803e3d6000fd5b505050506040513d602081101561189c57600080fd5b5051979650505050505050565b600360205281600052604060002081815481106118c257fe5b60009182526020909120600590910201805460018201546002830154600384015460049094015492955090935060ff808216936101009092048116921686565b6000546001600160a01b0316331461191957600080fd5b6001600160a01b0382166000908152600360205260409020548110611973576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b600061197f838361249b565b9050826001600160a01b03167fdcca95406ac9554449be02d88dcdf9c877f96e4c02bdad4bd5cadefc98a20e3d8284604051808381526020018281526020019250505060405180910390a2505050565b6001600160a01b0382166000908152600360205260408120548210611a29576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b611a316127a7565b6001600160a01b0384166000908152600360205260409020805484908110611a5557fe5b60009182526020918290206040805160c08101825260059093029091018054808452600182015494840194909452600281015460ff8082169385018490526101009091048116151560608501526003820154608085015260049091015416151560a0830152909250611ac79190611660565b949350505050565b6000546001600160a01b03163314611ae657600080fd5b6001600160a01b0383166000908152600360205260409020548210611b40576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600360205260408120805484908110611b6457fe5b60009182526020909120600590910201600481015490915060ff1615611bd1576040805162461bcd60e51b815260206004820152601d60248201527f546865207374616b6520697320616c72656164792066696e6973686564000000604482015290519081900360640190fd5b6002810154610100900460ff1615611c4057600181018054830190819055604080518581526020810185905280820192909252516001600160a01b038616917fc6b4665c6f58a573e0ed1610a70948399687c309032cce4c685cb85a3fe689d3919081900360600190a2611c99565b600381018054830190819055604080518581526020810185905280820192909252516001600160a01b038616917fc54eb33cddfd5be9ec7a33f63845f5550d7b0bffc8c1415bc79456f2640a64cf919081900360600190a25b80546002820154611cad919060ff166123e1565b15611d015760048101805460ff191660011790556040805184815290516001600160a01b038616917f0985193948def5807b71f9b8f4dbec56c89da0383f673d5ff19cccdeea51d859919081900360200190a25b50505050565b336000908152600360205260409020548110611d58576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b336000908152600360205260408120805483908110611d7357fe5b60009182526020909120600590910201600481015490915060ff16611ddf576040805162461bcd60e51b815260206004820152601d60248201527f546865207374616b65206973206e6f742066696e697368656420796574000000604482015290519081900360640190fd5b60038101546001820154611df89163ffffffff6125d916565b600182018190556000600383015542825560048201805460ff1916905560028201546040805192835260ff82811660208501526101009092049091161515828201525133917f6f1ac1f85bd90c474623c85858e2fda314d173a836aea77206e40d4527ff9814919081900360600190a25050565b6000546001600160a01b03163314611e8357600080fd5b611e8c8761242f565b60005b8651811015611fe357611ea06127a7565b6040518060c00160405280898481518110611eb757fe5b60200260200101518152602001888481518110611ed057fe5b60200260200101518152602001878481518110611ee957fe5b602002602001015160ff168152602001868481518110611f0557fe5b602002602001015115158152602001858481518110611f2057fe5b60200260200101518152602001848481518110611f3957fe5b60209081029190910181015115159091526001600160a01b038b166000908152600380835260408083208054600181810183559185529385902086516005909502019384559385015183850155840151600283018054606087015115156101000261ff001960ff90941660ff19928316179390931692909217905560808501519183019190915560a090930151600490910180549115159190931617909155919091019050611e8f565b506040516001600160a01b038816907fffa9112d8592752efa8bc4982977ef9e7ed16966cc70e329f99eee231620ee7390600090a250505050505050565b6001600160a01b0382166000908152600360205260408120548190819081908190819081908810612087576040805162461bcd60e51b81526020600482015260176024820152600080516020612893833981519152604482015290519081900360640190fd5b61208f6127a7565b6001600160a01b038a16600090815260036020526040902080548a9081106120b357fe5b60009182526020918290206040805160c081018252600590930290910180548084526001820154948401859052600282015460ff8082169486018590526101009091048116151560608601819052600384015460808701819052600490940154909116151560a08601819052919d50949b50919950929750919550909350905061213d8a8a6119cf565b91505092959891949750929550565b6000546001600160a01b0316331461216357600080fd5b6001600160a01b0381166121a85760405162461bcd60e51b81526004018080602001828103825260238152602001806128b36023913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146121e157600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b038481166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561223757600080fd5b505af115801561224b573d6000803e3d6000fd5b505050506040513d602081101561226157600080fd5b505161226c57600080fd5b5050565b600080805b6002548110156112fc576060600360006002848154811061229257fe5b60009182526020808320909101546001600160a01b031683528281019390935260409182018120805483518186028101860190945280845292939092919084015b8282101561234b5760008481526020908190206040805160c081018252600586029092018054835260018082015484860152600282015460ff80821694860194909452610100900483161515606085015260038201546080850152600490910154909116151560a083015290835290920191016122d3565b509293506000925050505b81518110156123b05781818151811061236b57fe5b602002602001015160a001516123a8576123a582828151811061238a57fe5b602002602001015160200151856125d990919063ffffffff16565b93505b600101612356565b5050600101612275565b600281815481106123c757fe5b6000918252602090912001546001600160a01b0316905081565b60006123ed8383611660565b42119392505050565b60008160ff166001148061240d57508160ff166003145b8061241b57508160ff166006145b8061242957508160ff16600c145b92915050565b6001600160a01b03811660009081526003602052604090205461249857600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0383161790555b50565b6001600160a01b03821660009081526003602052604081208054829190849081106124c257fe5b9060005260206000209060050201600101549050600060036000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061250857fe5b9060005260206000209060050201600301548201905061252885856125e9565b6001600160a01b03851660009081526003602052604090205461254e5761254e856126cc565b6001546040805163a9059cbb60e01b81526001600160a01b038881166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156125a457600080fd5b505af11580156125b8573d6000803e3d6000fd5b505050506040513d60208110156125ce57600080fd5b5051611ac757600080fd5b8181018281101561242957600080fd5b6001600160a01b03821660009081526003602052604090205b8054600019018210156126bc5780826001018154811061261e57fe5b906000526020600020906005020181838154811061263857fe5b6000918252602090912082546005909202019081556001808301548183015560028084018054918401805460ff93841660ff1991821617808355925461ff0019909316610100938490048516151590930292909217905560038086015490850155600494850154949093018054909316931615159290921790559190910190612602565b8054611d018260001983016127e4565b60006126d7826126e2565b905061226c8161271f565b6000805b826001600160a01b0316600282815481106126fd57fe5b6000918252602090912001546001600160a01b031614612429576001016126e6565b60025460001901811015612794576002816001018154811061273d57fe5b600091825260209091200154600280546001600160a01b03909216918390811061276357fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905560010161271f565b600280549061226c906000198301612810565b6040518060c001604052806000815260200160008152602001600060ff168152602001600015158152602001600081526020016000151581525090565b815481835581811115610c8a57600502816005028360005260206000209182019101610c8a9190612834565b815481835581811115610c8a57600083815260209020610c8a918101908301612878565b610ebe91905b808211156128745760008082556001820181905560028201805461ffff19169055600382015560048101805460ff1916905560050161283a565b5090565b610ebe91905b80821115612874576000815560010161287e56fe546865207374616b6520646f65736e27742065786973740000000000000000004e6577206f776e65722063616e277420626520746865207a65726f2061646472657373596f7520646f6e27742068617665207265776172647320746f207769746864726177436f756c646e27742074616b6520746865204c49542066726f6d207468652073656e646572a265627a7a723158202c33bf41b510011d6c741d232e58e68d51f3ed4172ce419f3ea1947e9cee20cc64736f6c63430005110032000000000000000000000000763fa6806e1acf68130d2d0f0df754c93cc546b2

Deployed ByteCode Sourcemap

920:14275:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:8;;;7984:1025;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7984:1025:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;7984:1025:1;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;7984:1025:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;7984:1025:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;7984:1025:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7984:1025:1;;-1:-1:-1;7984:1025:1;;-1:-1:-1;;;;;7984:1025:1:i;:::-;;9019:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9019:401:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9019:401:1;;;;;;;;:::i;9426:188::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9426:188:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9426:188:1;;:::i;11075:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11075:95:1;;;:::i;:::-;;;;;;;;;;;;;;;;3267:1038;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3267:1038:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3267:1038:1;;;;;;;;;;;;;;;;:::i;11176:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11176:138:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11176:138:1;-1:-1:-1;;;;;11176:138:1;;:::i;2154:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2154:26:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;10656:409;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10656:409:1;;;:::i;5534:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5534:414:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5534:414:1;;:::i;2975:75::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2975:75:1;;;:::i;2104:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2104:20:1;;;:::i;:::-;;;;-1:-1:-1;;;;;2104:20:1;;;;;;;;;;;;;;6510:484;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6510:484:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6510:484:1;;:::i;12476:465::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12476:465:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12476:465:1;;;;;;;;;:::i;2402:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2402:53:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2402:53:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9777:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9777:283:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9777:283:1;;;;;;;;:::i;11987:335::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11987:335:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11987:335:1;;;;;;;;:::i;7150:824::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7150:824:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7150:824:1;;;;;;;;;;;;;:::i;5958:542::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5958:542:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5958:542:1;;:::i;4315:1209::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4315:1209:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;4315:1209:1;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;;;;;;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;;;;;;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;;;;;;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;;;;;;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;;;;;;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;4315:1209:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4315:1209:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4315:1209:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4315:1209:1;;-1:-1:-1;4315:1209:1;;-1:-1:-1;;;;;4315:1209:1:i;11324:657::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11324:657:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11324:657:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2789:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2789:176:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2789:176:1;-1:-1:-1;;;;;2789:176:1;;:::i;9624:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9624:147:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9624:147:1;;;;;;-1:-1:-1;;;;;9624:147:1;;:::i;10206:440::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10206:440:1;;;:::i;2372:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2372:24:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2372:24:1;;:::i;7984:1025::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;8126:14;;-1:-1:-1;;;;;8089:26:1;;;;;;:17;:26;;;;;:33;:51;8081:88;;;;;-1:-1:-1;;;8081:88:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:13;8188:815;8220:7;:14;8212:5;:22;8188:815;;;-1:-1:-1;;;;;8281:26:1;;8259:19;8281:26;;;:17;:26;;;;;:33;;8308:5;;8281:33;;;;;;;;;;;;;;;;;;;8337:14;;;;8281:33;;-1:-1:-1;8337:14:1;;8336:15;8328:57;;;;;-1:-1:-1;;;8328:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;8416:14;;;;;;;;;8412:355;;;8471:7;8479:5;8471:14;;;;;;;;;;;;;;8450:5;:17;;;:35;;;;;;;;;;;8528:7;-1:-1:-1;;;;;8513:65:1;;8537:5;8544:7;8552:5;8544:14;;;;;;;;;;;;;;8560:5;:17;;;8513:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8412:355;;;8646:7;8654:5;8646:14;;;;;;;;;;;;;;8629:5;:13;;;:31;;;;;;;;;;;8706:7;-1:-1:-1;;;;;8688:64:1;;8715:5;8722:7;8730:5;8722:14;;;;;;;;;;;;;;8738:5;:13;;;8688:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8412:355;8821:15;;8838:18;;;;8797:60;;8821:15;8838:18;;8797:23;:60::i;:::-;8793:200;;;8877:14;;;:21;;-1:-1:-1;;8877:21:1;8894:4;8877:21;;;8938:40;;;;;;;;-1:-1:-1;;;;;8938:40:1;;;;;;;;;;;;;8793:200;-1:-1:-1;8236:7:1;;8188:815;;;;7984:1025;;:::o;9019:401::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;-1:-1:-1;;;;;9114:26:1;;;;;;:17;:26;;;;;:33;:42;-1:-1:-1;9106:78:1;;;;;-1:-1:-1;;;9106:78:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9106:78:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;9216:26:1;;9194:19;9216:26;;;:17;:26;;;;;:34;;9243:6;;9216:34;;;;;;;;;;;;;;;;;;;9269:14;;;;9216:34;;-1:-1:-1;9269:14:1;;9268:15;9260:57;;;;;-1:-1:-1;;;9260:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;9327:14;;;:21;;-1:-1:-1;;9327:21:1;9344:4;9327:21;;;9372:41;;;;;;;;-1:-1:-1;;;;;9372:41:1;;;;;;;;;;;;;2658:1;9019:401;;:::o;9426:188::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;9515:11;;:40;;;-1:-1:-1;;;9515:40:1;;9536:10;9515:40;;;;;;;;;;;;-1:-1:-1;;;;;9515:11:1;;;;:20;;:40;;;;;;;;;;;;;;;:11;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;9515:40:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9515:40:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9515:40:1;9507:49;;;;;;9572:35;;;;;;;;;;;;;;;;;9426:188;:::o;11075:95::-;11149:7;:14;11075:95;;:::o;3267:1038::-;3371:6;;-1:-1:-1;;;3371:6:1;;;;3370:7;3362:41;;;;;-1:-1:-1;;;3362:41:1;;;;;;;;;;;;-1:-1:-1;;;3362:41:1;;;;;;;;;;;;;;;3421:35;3442:13;3421:20;:35::i;:::-;3413:76;;;;;-1:-1:-1;;;3413:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3518:22;3507:7;:33;;3499:78;;;;;-1:-1:-1;;;3499:78:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3602:11;;3595:68;;;-1:-1:-1;;;3595:68:1;;3628:10;3595:68;;;;3648:4;3595:68;;;;;;;;;;;;-1:-1:-1;;;;;3602:11:1;;;;3595:32;;:68;;;;;;;;;;;;;;;3602:11;;3595:68;;;5:2:-1;;;;30:1;27;20:12;5:2;3595:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3595:68:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3595:68:1;3587:118;;;;-1:-1:-1;;;3587:118:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3724:18;;:::i;:::-;3745:303;;;;;;;;3763:3;3745:303;;;;3817:7;3745:303;;;;3876:13;3745:303;;;;;;3937:9;3745:303;;;;;;3993:1;3745:303;;;;4041:5;3745:303;;;;;3724:324;;4095:32;4116:10;4095:20;:32::i;:::-;4180:10;4137:22;4162:29;;;:17;:29;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;4201:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4201:18:1;;;;-1:-1:-1;;4201:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4243:55;;;;;;;;;;;;;;;;;;;;;;;4162:29;;4180:10;4243:55;;;;;;;;3267:1038;;;;;:::o;11176:138::-;-1:-1:-1;;;;;11274:26:1;11248:7;11274:26;;;:17;:26;;;;;:33;;11176:138::o;2154:26::-;;;-1:-1:-1;;;2154:26:1;;;;;:::o;10656:409::-;10703:7;;;10749:288;10773:7;:14;10769:18;;10749:288;;;10808:21;10832:17;:29;10850:7;10858:1;10850:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10850:10:1;10832:29;;;;;;;;;;;;;;;10808:53;;;;;;;;;;;;;;;;;;;10832:29;;10808:53;10850:10;10808:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10808:53:1;;-1:-1:-1;10880:9:1;;-1:-1:-1;;;10875:152:1;10899:6;:13;10895:1;:17;10875:152;;;10942:6;10949:1;10942:9;;;;;;;;;;;;;;:18;;;10937:76;;10993:1;10984:10;;;;10937:76;10914:3;;10875:152;;;-1:-1:-1;;10789:3:1;;10749:288;;;-1:-1:-1;11053:5:1;-1:-1:-1;10656:409:1;:::o;5534:414::-;5614:10;5596:29;;;;:17;:29;;;;;:36;:45;-1:-1:-1;5588:81:1;;;;;-1:-1:-1;;;5588:81:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5588:81:1;;;;;;;;;;;;;;;5680:18;;:::i;:::-;5719:10;5701:29;;;;:17;:29;;;;;:37;;5731:6;;5701:37;;;;;;;;;;;;;;;5680:58;;;;;;;;5701:37;;;;;;;5680:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5749:56:1;;;;;-1:-1:-1;;;5749:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;5824:13;5840:31;5852:10;5864:6;5840:11;:31::i;:::-;5895:46;;;;;;;;;;;;;;5824:47;;-1:-1:-1;5915:10:1;;5895:46;;;;;;;;;;;5534:414;;;:::o;2975:75::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;3037:6;;;-1:-1:-1;;;;3027:16:1;;-1:-1:-1;;;3037:6:1;;;;;;3036:7;3027:16;;;;;;2975:75::o;2104:20::-;;;-1:-1:-1;;;;;2104:20:1;;:::o;6510:484::-;6594:10;6576:29;;;;:17;:29;;;;;:36;:45;-1:-1:-1;6568:81:1;;;;;-1:-1:-1;;;6568:81:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6568:81:1;;;;;;;;;;;;;;;6700:10;6660:19;6682:29;;;:17;:29;;;;;:37;;6712:6;;6682:37;;;;;;;;;;;;;;;;6660:59;;6754:1;6738:5;:13;;;:17;6730:64;;;;-1:-1:-1;;;6730:64:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:13;;;;;6813;6852:17;;;;-1:-1:-1;6888:11:1;:39;;;-1:-1:-1;;;6888:39:1;;6909:10;6888:39;;;;;;;;;;;;6829:13;;-1:-1:-1;;;;;6888:11:1;;;;:20;;:39;;;;;;;;;;;;;;;;;;:11;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;6888:39:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6888:39:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6888:39:1;6880:48;;;;;;6944:43;;;;;;;;;;;;;;6961:10;;6944:43;;;;;;;;6510:484;;;:::o;12476:465::-;12572:7;12591:11;12605:4;:12;12618:10;12605:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12605:24:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12605:24:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12605:24:1;12653:25;;;-1:-1:-1;;;12653:25:1;;;;;;;;;;12605:24;;-1:-1:-1;12639:11:1;;12653:4;;:13;;:25;;;;;12605:24;;12653:25;;;;;;;:4;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;12653:25:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12653:25:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12653:25:1;12688:22;;;-1:-1:-1;12732:2:1;12724:10;;;;12720:82;;;12758:1;12750:9;;;;12789:2;12781:5;:10;;;;;;;;12773:18;;12720:82;12811:9;12823:4;:11;12835:10;12823:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12823:23:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12823:23:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12823:23:1;12875:34;;;-1:-1:-1;;;12875:34:1;;;;;;;;;;;;;;;;;;;;;;;;;12823:23;;-1:-1:-1;12856:16:1;;12875:4;;:16;;:34;;;;;12823:23;;12875:34;;;;;;;:4;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;12875:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12875:34:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12875:34:1;;12476:465;-1:-1:-1;;;;;;;12476:465:1:o;2402:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2402:53:1;;-1:-1:-1;2402:53:1;;;;;;;;;;;;;;:::o;9777:283::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;-1:-1:-1;;;;;9868:26:1;;;;;;:17;:26;;;;;:33;:42;-1:-1:-1;9860:78:1;;;;;-1:-1:-1;;;9860:78:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9860:78:1;;;;;;;;;;;;;;;9957:13;9973:28;9985:7;9994:6;9973:11;:28::i;:::-;9957:44;;10030:7;-1:-1:-1;;;;;10017:36:1;;10039:5;10046:6;10017:36;;;;;;;;;;;;;;;;;;;;;;;;2658:1;9777:283;;:::o;11987:335::-;-1:-1:-1;;;;;12102:26:1;;12075:7;12102:26;;;:17;:26;;;;;:33;:42;-1:-1:-1;12094:78:1;;;;;-1:-1:-1;;;12094:78:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12094:78:1;;;;;;;;;;;;;;;12182:18;;:::i;:::-;-1:-1:-1;;;;;12203:26:1;;;;;;:17;:26;;;;;:34;;12230:6;;12203:34;;;;;;;;;;;;;;;12182:55;;;;;;;;12203:34;;;;;;;12182:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12254:61:1;;12182:55;12254:24;:61::i;:::-;12247:68;11987:335;-1:-1:-1;;;;11987:335:1:o;7150:824::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;-1:-1:-1;;;;;7253:26:1;;;;;;:17;:26;;;;;:33;:42;-1:-1:-1;7245:78:1;;;;;-1:-1:-1;;;7245:78:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7245:78:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;7356:26:1;;7334:19;7356:26;;;:17;:26;;;;;:34;;7383:6;;7356:34;;;;;;;;;;;;;;;;;;;7409:14;;;;7356:34;;-1:-1:-1;7409:14:1;;7408:15;7400:57;;;;;-1:-1:-1;;;7400:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;7480:14;;;;;;;;;7476:289;;;7510:17;;;:27;;;;;;;;7557:58;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7557:58:1;;;;;;;;;;;;;7476:289;;;7654:13;;;:23;;;;;;;;7697:57;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7697:57:1;;;;;;;;;;;;;7476:289;7811:15;;7828:18;;;;7787:60;;7811:15;7828:18;;7787:23;:60::i;:::-;7783:185;;;7863:14;;;:21;;-1:-1:-1;;7863:21:1;7880:4;7863:21;;;7916:41;;;;;;;;-1:-1:-1;;;;;7916:41:1;;;;;;;;;;;;;7783:185;2658:1;7150:824;;;:::o;5958:542::-;6034:10;6016:29;;;;:17;:29;;;;;:36;:45;-1:-1:-1;6008:81:1;;;;;-1:-1:-1;;;6008:81:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6008:81:1;;;;;;;;;;;;;;;6140:10;6100:19;6122:29;;;:17;:29;;;;;:37;;6152:6;;6122:37;;;;;;;;;;;;;;;;;;;6178:14;;;;6122:37;;-1:-1:-1;6178:14:1;;6170:56;;;;;-1:-1:-1;;;6170:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;6287:13;;;;6265:17;;;;:36;;;:21;:36;:::i;:::-;6245:17;;;:56;;;6327:1;6311:13;;;:17;6356:3;6338:21;;6369:14;;;:22;;-1:-1:-1;;6369:22:1;;;6458:18;;;;6407:86;;;;;;6369:22;6458:18;;;6407:86;;;;6369:22;6478:14;;;;;;6407:86;;;;;;;6427:10;;6407:86;;;;;;;;;;5958:542;;:::o;4315:1209::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;4790:29;4811:7;4790:20;:29::i;:::-;4843:13;4838:641;4870:17;:24;4862:5;:32;4838:641;;;4919:18;;:::i;:::-;4940:426;;;;;;;;4958:17;4976:5;4958:24;;;;;;;;;;;;;;4940:426;;;;5038:13;5052:5;5038:20;;;;;;;;;;;;;;4940:426;;;;5115:20;5136:5;5115:27;;;;;;;;;;;;;;4940:426;;;;;;5195:15;5211:5;5195:22;;;;;;;;;;;;;;4940:426;;;;;;5269:14;5284:5;5269:21;;;;;;;;;;;;;;4940:426;;;;5342:15;5358:5;5342:22;;;;;;;;;;;;;;;;;;;4940:426;;;;;-1:-1:-1;;;;;5410:26:1;;5385:22;5410:26;;;:17;:26;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;5450:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5450:18:1;;;;-1:-1:-1;;5450:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4896:7;;;;;-1:-1:-1;4838:641:1;;;-1:-1:-1;5494:23:1;;-1:-1:-1;;;;;5494:23:1;;;;;;;;4315:1209;;;;;;;:::o;11324:657::-;-1:-1:-1;;;;;11547:26:1;;11398:17;11547:26;;;:17;:26;;;;;:33;11398:17;;;;;;;;;;;;11547:42;-1:-1:-1;11539:78:1;;;;;-1:-1:-1;;;11539:78:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11539:78:1;;;;;;;;;;;;;;;11627:18;;:::i;:::-;-1:-1:-1;;;;;11648:26:1;;;;;;:17;:26;;;;;:34;;11675:6;;11648:34;;;;;;;;;;;;;;;11627:55;;;;;;;;11648:34;;;;;;;11627:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11627:55:1;;-1:-1:-1;11627:55:1;;-1:-1:-1;11627:55:1;;-1:-1:-1;11627:55:1;;-1:-1:-1;11627:55:1;;-1:-1:-1;11627:55:1;-1:-1:-1;11933:41:1;11958:7;11967:6;11933:24;:41::i;:::-;11916:58;;11324:657;;;;;;;;;;;:::o;2789:176::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;-1:-1:-1;;;;;2870:22:1;;2862:70;;;;-1:-1:-1;;;2862:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2942:5;:16;;-1:-1:-1;;;;;;2942:16:1;-1:-1:-1;;;;;2942:16:1;;;;;;;;;;2789:176::o;9624:147::-;2642:5;;-1:-1:-1;;;;;2642:5:1;2628:10;:19;2620:28;;;;;;9726:11;;:37;;;-1:-1:-1;;;9726:37:1;;-1:-1:-1;;;;;9726:37:1;;;;;;;;;;;;;;;:11;;;;;:20;;:37;;;;;;;;;;;;;;:11;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;9726:37:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9726:37:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9726:37:1;9718:46;;;;;;9624:147;;:::o;10206:440::-;10254:7;;;10300:318;10324:7;:14;10320:18;;10300:318;;;10359:21;10383:17;:29;10401:7;10409:1;10401:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10401:10:1;10383:29;;;;;;;;;;;;;;;10359:53;;;;;;;;;;;;;;;;;;;10383:29;;10359:53;10401:10;10359:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10359:53:1;;-1:-1:-1;10431:9:1;;-1:-1:-1;;;10426:182:1;10450:6;:13;10446:1;:17;10426:182;;;10493:6;10500:1;10493:9;;;;;;;;;;;;;;:18;;;10488:106;;10543:32;10553:6;10560:1;10553:9;;;;;;;;;;;;;;:21;;;10543:5;:9;;:32;;;;:::i;:::-;10535:40;;10488:106;10465:3;;10426:182;;;-1:-1:-1;;10340:3:1;;10300:318;;2372:24;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2372:24:1;;-1:-1:-1;2372:24:1;:::o;13904:184::-;14001:4;14030:51;14055:10;14067:13;14030:24;:51::i;:::-;14024:3;:57;;13904:184;-1:-1:-1;;;13904:184:1:o;13769:129::-;13831:4;13854:1;:6;;13859:1;13854:6;:16;;;;13864:1;:6;;13869:1;13864:6;13854:16;:26;;;;13874:1;:6;;13879:1;13874:6;13854:26;:37;;;;13884:1;:7;;13889:2;13884:7;13854:37;13847:44;13769:129;-1:-1:-1;;13769:129:1:o;14245:162::-;-1:-1:-1;;;;;14315:26:1;;;;;;:17;:26;;;;;:33;14311:90;;14369:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;14369:21:1;;;;;;;;-1:-1:-1;;;;;;14369:21:1;-1:-1:-1;;;;;14369:21:1;;;;;14311:90;14245:162;:::o;13106:497::-;-1:-1:-1;;;;;13219:26:1;;13178:7;13219:26;;;:17;:26;;;;;:34;;13178:7;;13219:26;13246:6;;13219:34;;;;;;;;;;;;;;;;:46;;;13197:68;;13275:13;13305:17;:26;13323:7;-1:-1:-1;;;;;13305:26:1;-1:-1:-1;;;;;13305:26:1;;;;;;;;;;;;13332:6;13305:34;;;;;;;;;;;;;;;;;;:42;;;13291:11;:56;13275:72;;13366:36;13386:7;13395:6;13366:19;:36::i;:::-;-1:-1:-1;;;;;13416:26:1;;;;;;:17;:26;;;;;:33;13412:98;;13470:29;13491:7;13470:20;:29::i;:::-;13536:11;;:36;;;-1:-1:-1;;;13536:36:1;;-1:-1:-1;;;;;13536:36:1;;;;;;;;;;;;;;;:11;;;;;:20;;:36;;;;;;;;;;;;;;:11;;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;13536:36:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13536:36:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13536:36:1;13528:45;;;;;15220:138;15303:5;;;15326:6;;;;15318:15;;;;;14932:261;-1:-1:-1;;;;;15031:26:1;;15006:22;15031:26;;;:17;:26;;;;;15067:95;15077:13;;-1:-1:-1;;15077:15:1;15074:18;;15067:95;;;15121:6;15128:2;15131:1;15128:4;15121:12;;;;;;;;;;;;;;;;;;15108:6;15115:2;15108:10;;;;;;;;;;;;;;;;:25;;:10;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15108:25:1;;;;;;;;;-1:-1:-1;;15108:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15147:4;;;;;15067:95;;;15171:15;;;:6;-1:-1:-1;;15171:15:1;;;:::i;14595:133::-;14660:6;14669:19;14681:6;14669:11;:19::i;:::-;14660:28;;14698:23;14719:1;14698:20;:23::i;14413:176::-;14472:4;;14508:57;14529:6;-1:-1:-1;;;;;14515:20:1;:7;14523:1;14515:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14515:10:1;:20;14508:57;;14551:3;;14508:57;;14734:188;14802:7;:14;-1:-1:-1;;14802:16:1;14799:19;;14792:98;;;14848:7;14856:2;14859:1;14856:4;14848:13;;;;;;;;;;;;;;;;;;14834:7;:11;;-1:-1:-1;;;;;14848:13:1;;;;14842:2;;14834:11;;;;;;;;;;;;;;;:27;;-1:-1:-1;;;;;;14834:27:1;-1:-1:-1;;;;;14834:27:1;;;;;;;;;;-1:-1:-1;14875:4:1;14792:98;;;14899:7;:16;;;;;-1:-1:-1;;14899:16:1;;;:::i;920:14275::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;920:14275:1;;;;;;;;;;;;-1:-1:-1;;920:14275:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://2c33bf41b510011d6c741d232e58e68d51f3ed4172ce419f3ea1947e9cee20cc
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.