Contract 0x973cab76c35bb1da47e044a63546c69a8ac1143c 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1675659b6879167668d6415f7ea6be5f36899c6b71191f653f75f65a8cbcba790x608060401895702021-07-31 13:15:40421 days 13 hrs ago0x7081685ff3ff16fb6c0df08ac93bdb7299eeefc9 IN  Create: ERC20MineV30 ETH0.02320675431 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0d25f6ac9c4045e350892fb8af6362ad9ab65edd24724aea3edae9f6b9284a6b197730812022-08-09 5:04:5647 days 21 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xfe7e5ff5ae529a8aa590395f013200b510cc6f8e6349e20383f946bf5d22942a147656902022-06-16 4:49:15101 days 21 hrs ago 0x2ede6cb298c1988913a3e2749bda1f54a68b545e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xfe7e5ff5ae529a8aa590395f013200b510cc6f8e6349e20383f946bf5d22942a147656902022-06-16 4:49:15101 days 21 hrs ago 0x2ede6cb298c1988913a3e2749bda1f54a68b545e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xfe7e5ff5ae529a8aa590395f013200b510cc6f8e6349e20383f946bf5d22942a147656902022-06-16 4:49:15101 days 21 hrs ago 0x2ede6cb298c1988913a3e2749bda1f54a68b545e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x6881a8b469b8f37748af10c351f3289fe35e0caa4cf6058bd1ff26d3d576b280105735512022-04-26 10:26:49152 days 16 hrs ago 0xad9f9194c68bd83250a534a7da574687e1f102ff 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x2cc6c6db246896875322e4e8d92753afafb7b37fde87b3d411cfe39ad8de67b8105735382022-04-26 10:26:49152 days 16 hrs ago 0xad9f9194c68bd83250a534a7da574687e1f102ff 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xce532b6868613b24620a13c63cdc8ca74c12802028d679a55d0d2802dc50c41985106072022-03-24 17:06:07185 days 9 hrs ago 0xc74ff56b8400ee7d68204854d3f6da536cf71a22 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xedc776a9dcdff928d09c7b5312dea4b1032123be67a510c1e793a340406baeeb77561162022-03-11 20:45:27198 days 6 hrs ago 0x6f9bb7e454f5b3eb2310343f0e99269dc2bb8a1d 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xc619ac767e155e783c467022145375c34e9c3fd29b38f4b73533dc1768f55cc377558602022-03-11 20:41:32198 days 6 hrs ago 0x6f9bb7e454f5b3eb2310343f0e99269dc2bb8a1d 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x4858c1b2b2623ab1febb8e7e3c66ea81563ef5eb2055495772a15ddcdda6890164140252022-02-19 23:00:21218 days 3 hrs ago 0x949666ee5d1be779801e4a02e90f1a2d9cb1835b 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x0cfe2cef56d116f0f2cd242d7997ef94f935f4150ba61b380d05eade1d5c74fb63880962022-02-19 14:34:10218 days 12 hrs ago 0x3544fa4f39a5d6586de28ef029f885551e9884b4 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xd8de9786c89f50c6aee535cd1a47ed3941c8868281b2283bc0aa6c74a41ae2ad63880382022-02-19 14:33:18218 days 12 hrs ago 0x3544fa4f39a5d6586de28ef029f885551e9884b4 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x6447edeccd453bd80f33d41247d8ccfee5c085c7ffa441bfa44742bfb2565b7062371952022-02-17 10:19:51220 days 16 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x57761566e278416dd1b6f29fd96d55bb9a1140f91d2f8a6a7e1fcbc9d74cadfc62146522022-02-17 2:09:51221 days 37 mins ago 0x3544fa4f39a5d6586de28ef029f885551e9884b4 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x48a9b1d2b7f2574c04e496dc4d6e40810c525f0f5de6c4f9d7bdb1964938993761122412022-02-15 14:50:20222 days 11 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x9c636ac1453173394e97337b978543ef8f68b99c6460868b100994564ea1a22a61122102022-02-15 14:48:57222 days 11 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x18f6fb2c7bee36260d76c0505cc2698a53f4fe3ed14428d1816a55ffe2fceb6761118352022-02-15 14:43:50222 days 12 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x944727185a840a8e1f2d38723f1d65f8adfd5fa75e3bd9af4e067c9796b33e1661009102022-02-15 10:59:15222 days 15 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x5041b6e41d5d492b21fc81030380b05985b99ac8ce415c7a0d112693822ad7d761008802022-02-15 10:57:56222 days 15 hrs ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x036fbf3d0fac70bf2f172b06e4e497a67c3b1aad4b443db6138614cdad192f5e60748352022-02-15 1:43:33223 days 1 hr ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xa0fce9b0c5454642e4ec3e643d9b3fbb57e6724a07fa890e39c04c35b25bfbc160739282022-02-15 1:29:31223 days 1 hr ago 0x9a74b169798be874ef1c23b4092e5689969ef45e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xa0fce9b0c5454642e4ec3e643d9b3fbb57e6724a07fa890e39c04c35b25bfbc160739282022-02-15 1:29:31223 days 1 hr ago 0x9a74b169798be874ef1c23b4092e5689969ef45e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0xa0fce9b0c5454642e4ec3e643d9b3fbb57e6724a07fa890e39c04c35b25bfbc160739282022-02-15 1:29:31223 days 1 hr ago 0x9a74b169798be874ef1c23b4092e5689969ef45e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x483636fc2d198533b8a25e7ebfec96fc454ae2b9340d235979d503f00b10836c60737452022-02-15 1:23:06223 days 1 hr ago 0xc5acd4551a406819f96d96da0bc676086bf329dc 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x46243dbaaf7436dd47a08ba38cf53ebe30f360eb67b4d1e71a37df0cffe5995d60734152022-02-15 1:16:38223 days 1 hr ago 0x9a74b169798be874ef1c23b4092e5689969ef45e 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20MineV3

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2021-08-30
*/

// File: contracts/intf/IERC20.sol

// This is a file copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

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

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

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// File: contracts/lib/SafeMath.sol

/**
 * @title SafeMath
 * @author DODO Breeder
 *
 * @notice Math operations with safety checks that revert on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MUL_ERROR");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "DIVIDING_ERROR");
        return a / b;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SUB_ERROR");
        return a - b;
    }

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

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = x / 2 + 1;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

// File: contracts/lib/SafeERC20.sol


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/lib/ReentrancyGuard.sol

/**
 * @title ReentrancyGuard
 * @author DODO Breeder
 *
 * @notice Protect functions from Reentrancy Attack
 */
contract ReentrancyGuard {
    // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations
    // zero-state of _ENTERED_ is false
    bool private _ENTERED_;

    modifier preventReentrant() {
        require(!_ENTERED_, "REENTRANT");
        _ENTERED_ = true;
        _;
        _ENTERED_ = false;
    }
}

// File: contracts/lib/DecimalMath.sol

/**
 * @title DecimalMath
 * @author DODO Breeder
 *
 * @notice Functions for fixed point number with 18 decimals
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 internal constant ONE = 10**18;
    uint256 internal constant ONE2 = 10**36;

    function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d) / (10**18);
    }

    function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d).divCeil(10**18);
    }

    function divFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).div(d);
    }

    function divCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).divCeil(d);
    }

    function reciprocalFloor(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).div(target);
    }

    function reciprocalCeil(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).divCeil(target);
    }
}

// File: contracts/lib/InitializableOwnable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;
    bool internal _INITIALIZED_;

    // ============ Events ============

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

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

    // ============ Modifiers ============

    modifier notInitialized() {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function initOwner(address newOwner) public notInitialized {
        _INITIALIZED_ = true;
        _OWNER_ = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() public {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/lib/Ownable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract Ownable {
    address public _OWNER_;
    address public _NEW_OWNER_;

    // ============ Events ============

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

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

    // ============ Modifiers ============

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    constructor() internal {
        _OWNER_ = msg.sender;
        emit OwnershipTransferred(address(0), _OWNER_);
    }

    function transferOwnership(address newOwner) external virtual onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() external {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/DODOToken/DODOMineV3/RewardVault.sol


interface IRewardVault {
    function reward(address to, uint256 amount) external;
    function withdrawLeftOver(address to, uint256 amount) external; 
    function syncValue() external;
    function _TOTAL_REWARD_() external view returns(uint256);
}

contract RewardVault is Ownable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    uint256 public _REWARD_RESERVE_;
    uint256 public _TOTAL_REWARD_;
    address public _REWARD_TOKEN_;

    // ============ Event =============
    event DepositReward(uint256 totalReward, uint256 inputReward, uint256 rewardReserve);

    constructor(address _rewardToken) public {
        _REWARD_TOKEN_ = _rewardToken;
    }

    function reward(address to, uint256 amount) external onlyOwner {
        require(_REWARD_RESERVE_ >= amount, "VAULT_NOT_ENOUGH");
        _REWARD_RESERVE_ = _REWARD_RESERVE_.sub(amount);
        IERC20(_REWARD_TOKEN_).safeTransfer(to, amount);
    }

    function withdrawLeftOver(address to,uint256 amount) external onlyOwner {
        require(_REWARD_RESERVE_ >= amount, "VAULT_NOT_ENOUGH");
        _REWARD_RESERVE_ = _REWARD_RESERVE_.sub(amount);
        IERC20(_REWARD_TOKEN_).safeTransfer(to, amount);
    }

    function syncValue() external {
        uint256 rewardBalance = IERC20(_REWARD_TOKEN_).balanceOf(address(this));
        uint256 rewardInput = rewardBalance.sub(_REWARD_RESERVE_);

        _TOTAL_REWARD_ = _TOTAL_REWARD_.add(rewardInput);
        _REWARD_RESERVE_ = rewardBalance;

        emit DepositReward(_TOTAL_REWARD_, rewardInput, _REWARD_RESERVE_);
    }
}

// File: contracts/DODOToken/DODOMineV3/BaseMine.sol



contract BaseMine is InitializableOwnable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    // ============ Storage ============

    struct RewardTokenInfo {
        address rewardToken;
        uint256 startBlock;
        uint256 endBlock;
        address rewardVault;
        uint256 rewardPerBlock;
        uint256 accRewardPerShare;
        uint256 lastRewardBlock;
        uint256 workThroughReward;
        uint256 lastFlagBlock;
        mapping(address => uint256) userRewardPerSharePaid;
        mapping(address => uint256) userRewards;
    }

    RewardTokenInfo[] public rewardTokenInfos;

    uint256 internal _totalSupply;
    mapping(address => uint256) internal _balances;

    // ============ Event =============

    event Claim(uint256 indexed i, address indexed user, uint256 reward);
    event UpdateReward(uint256 indexed i, uint256 rewardPerBlock);
    event UpdateEndBlock(uint256 indexed i, uint256 endBlock);
    event NewRewardToken(uint256 indexed i, address rewardToken);
    event RemoveRewardToken(address rewardToken);
    event WithdrawLeftOver(address owner, uint256 i);

    // ============ View  ============

    function getPendingReward(address user, uint256 i) public view returns (uint256) {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        uint256 accRewardPerShare = rt.accRewardPerShare;
        if (rt.lastRewardBlock != block.number) {
            accRewardPerShare = _getAccRewardPerShare(i);
        }
        return
            DecimalMath.mulFloor(
                balanceOf(user), 
                accRewardPerShare.sub(rt.userRewardPerSharePaid[user])
            ).add(rt.userRewards[user]);
    }

    function getPendingRewardByToken(address user, address rewardToken) external view returns (uint256) {
        return getPendingReward(user, getIdByRewardToken(rewardToken));
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address user) public view returns (uint256) {
        return _balances[user];
    }

    function getRewardTokenById(uint256 i) external view returns (address) {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        return rt.rewardToken;
    }

    function getIdByRewardToken(address rewardToken) public view returns(uint256) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                return i;
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    function getRewardNum() external view returns(uint256) {
        return rewardTokenInfos.length;
    }

    function getVaultByRewardToken(address rewardToken) public view returns(address) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                return rewardTokenInfos[i].rewardVault;
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    function getVaultDebtByRewardToken(address rewardToken) public view returns(uint256) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                uint256 totalDepositReward = IRewardVault(rewardTokenInfos[i].rewardVault)._TOTAL_REWARD_();
                uint256 gap = rewardTokenInfos[i].endBlock.sub(rewardTokenInfos[i].lastFlagBlock);
                uint256 totalReward = rewardTokenInfos[i].workThroughReward.add(gap.mul(rewardTokenInfos[i].rewardPerBlock));
                if(totalDepositReward >= totalReward) {
                    return 0;
                }else {
                    return totalReward.sub(totalDepositReward);
                }
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    // ============ Claim ============

    function claimReward(uint256 i) public {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(msg.sender, i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        uint256 reward = rt.userRewards[msg.sender];
        if (reward > 0) {
            rt.userRewards[msg.sender] = 0;
            IRewardVault(rt.rewardVault).reward(msg.sender, reward);
            emit Claim(i, msg.sender, reward);
        }
    }

    function claimAllRewards() external {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            claimReward(i);
        }
    }

    // =============== Ownable  ================

    function addRewardToken(
        address rewardToken,
        uint256 rewardPerBlock,
        uint256 startBlock,
        uint256 endBlock
    ) external onlyOwner {
        require(rewardToken != address(0), "DODOMineV3: TOKEN_INVALID");
        require(startBlock > block.number, "DODOMineV3: START_BLOCK_INVALID");
        require(endBlock > startBlock, "DODOMineV3: DURATION_INVALID");

        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            require(
                rewardToken != rewardTokenInfos[i].rewardToken,
                "DODOMineV3: TOKEN_ALREADY_ADDED"
            );
        }

        RewardTokenInfo storage rt = rewardTokenInfos.push();
        rt.rewardToken = rewardToken;
        rt.startBlock = startBlock;
        rt.lastFlagBlock = startBlock;
        rt.endBlock = endBlock;
        rt.rewardPerBlock = rewardPerBlock;
        rt.rewardVault = address(new RewardVault(rewardToken));

        uint256 rewardAmount = rewardPerBlock.mul(endBlock.sub(startBlock));
        IERC20(rewardToken).safeTransfer(rt.rewardVault, rewardAmount);
        RewardVault(rt.rewardVault).syncValue();

        emit NewRewardToken(len, rewardToken);
    }

    function setEndBlock(uint256 i, uint256 newEndBlock)
        external
        onlyOwner
    {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(address(0), i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];


        uint256 totalDepositReward = RewardVault(rt.rewardVault)._TOTAL_REWARD_();
        uint256 gap = newEndBlock.sub(rt.lastFlagBlock);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(rt.rewardPerBlock));
        require(totalDepositReward >= totalReward, "DODOMineV3: REWARD_NOT_ENOUGH");

        require(block.number < newEndBlock, "DODOMineV3: END_BLOCK_INVALID");
        require(block.number > rt.startBlock, "DODOMineV3: NOT_START");
        require(block.number < rt.endBlock, "DODOMineV3: ALREADY_CLOSE");

        rt.endBlock = newEndBlock;
        emit UpdateEndBlock(i, newEndBlock);
    }

    function setReward(uint256 i, uint256 newRewardPerBlock)
        external
        onlyOwner
    {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(address(0), i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        
        require(block.number < rt.endBlock, "DODOMineV3: ALREADY_CLOSE");
        
        rt.workThroughReward = rt.workThroughReward.add((block.number.sub(rt.lastFlagBlock)).mul(rt.rewardPerBlock));
        rt.rewardPerBlock = newRewardPerBlock;
        rt.lastFlagBlock = block.number;

        uint256 totalDepositReward = RewardVault(rt.rewardVault)._TOTAL_REWARD_();
        uint256 gap = rt.endBlock.sub(block.number);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(newRewardPerBlock));
        require(totalDepositReward >= totalReward, "DODOMineV3: REWARD_NOT_ENOUGH");

        emit UpdateReward(i, newRewardPerBlock);
    }

    function withdrawLeftOver(uint256 i, uint256 amount) external onlyOwner {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        require(block.number > rt.endBlock, "DODOMineV3: MINING_NOT_FINISHED");
        
        uint256 gap = rt.endBlock.sub(rt.lastFlagBlock);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(rt.rewardPerBlock));
        uint256 totalDepositReward = IRewardVault(rt.rewardVault)._TOTAL_REWARD_();
        require(amount <= totalDepositReward.sub(totalReward), "DODOMineV3: NOT_ENOUGH");

        IRewardVault(rt.rewardVault).withdrawLeftOver(msg.sender,amount);

        emit WithdrawLeftOver(msg.sender, i);
    }


    function directTransferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "DODOMineV3: ZERO_ADDRESS");
        emit OwnershipTransferred(_OWNER_, newOwner);
        _OWNER_ = newOwner;
    }

    // ============ Internal  ============

    function _updateReward(address user, uint256 i) internal {
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        if (rt.lastRewardBlock != block.number){
            rt.accRewardPerShare = _getAccRewardPerShare(i);
            rt.lastRewardBlock = block.number;
        }
        if (user != address(0)) {
            rt.userRewards[user] = getPendingReward(user, i);
            rt.userRewardPerSharePaid[user] = rt.accRewardPerShare;
        }
    }

    function _updateAllReward(address user) internal {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            _updateReward(user, i);
        }
    }

    function _getUnrewardBlockNum(uint256 i) internal view returns (uint256) {
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        if (block.number < rt.startBlock || rt.lastRewardBlock > rt.endBlock) {
            return 0;
        }
        uint256 start = rt.lastRewardBlock < rt.startBlock ? rt.startBlock : rt.lastRewardBlock;
        uint256 end = rt.endBlock < block.number ? rt.endBlock : block.number;
        return end.sub(start);
    }

    function _getAccRewardPerShare(uint256 i) internal view returns (uint256) {
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        if (totalSupply() == 0) {
            return rt.accRewardPerShare;
        }
        return
            rt.accRewardPerShare.add(
                DecimalMath.divFloor(_getUnrewardBlockNum(i).mul(rt.rewardPerBlock), totalSupply())
            );
    }

}

// File: contracts/DODOToken/DODOMineV3/ERC20MineV3.sol



contract ERC20MineV3 is ReentrancyGuard, BaseMine {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    // ============ Storage ============

    address public _TOKEN_;

    function init(address owner, address token) external {
        super.initOwner(owner);
        _TOKEN_ = token;
    }

    // ============ Event  ============

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);

    // ============ Deposit && Withdraw && Exit ============

    function deposit(uint256 amount) external preventReentrant {
        require(amount > 0, "DODOMineV3: CANNOT_DEPOSIT_ZERO");

        _updateAllReward(msg.sender);

        uint256 erc20OriginBalance = IERC20(_TOKEN_).balanceOf(address(this));
        IERC20(_TOKEN_).safeTransferFrom(msg.sender, address(this), amount);
        uint256 actualStakeAmount = IERC20(_TOKEN_).balanceOf(address(this)).sub(erc20OriginBalance);
        
        _totalSupply = _totalSupply.add(actualStakeAmount);
        _balances[msg.sender] = _balances[msg.sender].add(actualStakeAmount);

        emit Deposit(msg.sender, actualStakeAmount);
    }

    function withdraw(uint256 amount) external preventReentrant {
        require(amount > 0, "DODOMineV3: CANNOT_WITHDRAW_ZERO");

        _updateAllReward(msg.sender);
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        IERC20(_TOKEN_).safeTransfer(msg.sender, amount);

        emit Withdraw(msg.sender, amount);
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"}],"name":"NewRewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"}],"name":"RemoveRewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"UpdateEndBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"UpdateReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"i","type":"uint256"}],"name":"WithdrawLeftOver","type":"event"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"directTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getIdByRewardToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getPendingRewardByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getRewardTokenById","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getVaultByRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getVaultDebtByRewardToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokenInfos","outputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"address","name":"rewardVault","type":"address"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"workThroughReward","type":"uint256"},{"internalType":"uint256","name":"lastFlagBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"setEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLeftOver","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061303f806100206000396000f3fe60806040523480156200001157600080fd5b5060043610620001b35760003560e01c806392e3200b11620000f3578063b6b55f2511620000a5578063d895fff1116200007b578063d895fff11462000397578063e513eb1514620003ae578063f09a401614620003c5578063f2fde38b14620003dc57620001b3565b8063b6b55f251462000352578063bdbf26571462000369578063bdd37dc6146200038057620001b3565b806392e3200b14620002d5578063999ffd9714620002df578063a2a54bee14620002f6578063a47bd496146200030d578063a7c3e4e51462000324578063ae169a50146200033b57620001b3565b80631c00a0de116200016b5780635ae9a54911620001415780635ae9a5491462000293578063697d86a2146200029d57806370a0823114620002b45780638456db1514620002cb57620001b3565b80631c00a0de14620002445780632e1a7d4d14620002725780634e71e0c8146200028957620001b3565b8062b68f0814620001b85780630b83a72714620001e75780630d00929714620001f357806316048bc4146200020a57806318160ddd14620002235780631abbeb54146200022d575b600080fd5b620001cf620001c936600462002064565b620003f3565b604051620001de919062002736565b60405180910390f35b620001f16200040e565b005b620001f16200020436600462002046565b62000435565b62000214620004a6565b604051620001de9190620021c3565b620001cf620004ba565b620001f16200023e36600462002165565b620004c0565b6200025b6200025536600462002133565b620006ff565b604051620001de9998979695949392919062002214565b620001f16200028336600462002133565b62000765565b620001f16200087b565b620001cf6200091d565b62000214620002ae36600462002133565b62000923565b620001cf620002c536600462002046565b620009f1565b6200021462000a0c565b6200021462000a1b565b620001cf620002f03660046200209d565b62000a2a565b620001cf6200030736600462002046565b62000b0d565b620001f16200031e36600462002165565b62000b7f565b620001f162000335366004620020ca565b62000d91565b620001f16200034c36600462002133565b620010d2565b620001f16200036336600462002133565b62001204565b620001cf6200037a36600462002046565b62001441565b620001f16200039136600462002046565b62001625565b620001f1620003a836600462002165565b620016e6565b62000214620003bf36600462002046565b62001947565b620001f1620003d636600462002064565b620019ca565b620001f1620003ed36600462002046565b620019f8565b60006200040583620002f08462000b0d565b90505b92915050565b60025460005b8181101562000431576200042881620010d2565b60010162000414565b5050565b600154600160a01b900460ff16156200046b5760405162461bcd60e51b8152600401620004629062002517565b60405180910390fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60005461010090046001600160a01b031681565b60035490565b60005461010090046001600160a01b03163314620004f25760405162461bcd60e51b81526004016200046290620025af565b6002548210620005165760405162461bcd60e51b81526004016200046290620026dc565b6200052360008362001a8a565b6000600283815481106200053357fe5b90600052602060002090600b0201905060008160030160009054906101000a90046001600160a01b03166001600160a01b031663d7502ef46040518163ffffffff1660e01b815260040160206040518083038186803b1580156200059657600080fd5b505afa158015620005ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d191906200214c565b90506000620005ee83600801548562001b1f90919063ffffffff16565b90506000620006216200060f85600401548462001b4a90919063ffffffff16565b60078601549063ffffffff62001b8a16565b905080831015620006465760405162461bcd60e51b81526004016200046290620025f5565b844310620006685760405162461bcd60e51b81526004016200046290620023e8565b836001015443116200068e5760405162461bcd60e51b81526004016200046290620026ad565b83600201544310620006b45760405162461bcd60e51b81526004016200046290620024e0565b848460020181905550857f7283eac7a9c64d862e3560a616651ea06b57add3efe966190156d8862c10efd486604051620006ef919062002736565b60405180910390a2505050505050565b600281815481106200070d57fe5b60009182526020909120600b90910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b0397881699509597949690931694919390929189565b60005460ff16156200078b5760405162461bcd60e51b81526004016200046290620022fc565b6000805460ff1916600117905580620007b85760405162461bcd60e51b81526004016200046290620023b3565b620007c33362001bb2565b600354620007d8908263ffffffff62001b1f16565b60035533600090815260046020526040902054620007fd908263ffffffff62001b1f16565b336000818152600460205260409020919091556005546200082b916001600160a01b03909116908362001bd6565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648260405162000866919062002736565b60405180910390a2506000805460ff19169055565b6001546001600160a01b03163314620008a85760405162461bcd60e51b815260040162000462906200229e565b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b60025490565b60025460009082106200094a5760405162461bcd60e51b81526004016200046290620026dc565b6200095462001fc2565b600283815481106200096257fe5b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b039081168085526001830154958501959095526002820154928401929092526003810154909116606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260080154610100909101529150505b919050565b6001600160a01b031660009081526004602052604090205490565b6001546001600160a01b031681565b6005546001600160a01b031681565b600254600090821062000a515760405162461bcd60e51b81526004016200046290620026dc565b60006002838154811062000a6157fe5b90600052602060002090600b020190506000816005015490504382600601541462000a945762000a918462001c30565b90505b6001600160a01b0385166000908152600a8301602052604090205462000b049062000af762000ac388620009f1565b6001600160a01b038916600090815260098701602052604090205462000af190869063ffffffff62001b1f16565b62001d32565b9063ffffffff62001b8a16565b95945050505050565b600254600090815b8181101562000b64576002818154811062000b2c57fe5b60009182526020909120600b90910201546001600160a01b038581169116141562000b5b579150620009ec9050565b60010162000b15565b5060405162461bcd60e51b8152600401620004629062002456565b60005461010090046001600160a01b0316331462000bb15760405162461bcd60e51b81526004016200046290620025af565b600254821062000bd55760405162461bcd60e51b81526004016200046290620026dc565b62000be260008362001a8a565b60006002838154811062000bf257fe5b90600052602060002090600b020190508060020154431062000c285760405162461bcd60e51b81526004016200046290620024e0565b62000c6d62000c5b826004015462000c4e84600801544362001b1f90919063ffffffff16565b9063ffffffff62001b4a16565b60078301549063ffffffff62001b8a16565b600782015560048082018390554360088301556003820154604080516335d40bbd60e21b815290516000936001600160a01b039093169263d7502ef492808201926020929091829003018186803b15801562000cc857600080fd5b505afa15801562000cdd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d0391906200214c565b9050600062000d2043846002015462001b1f90919063ffffffff16565b9050600062000d3a6200060f838763ffffffff62001b4a16565b90508083101562000d5f5760405162461bcd60e51b81526004016200046290620025f5565b857fbcabeac7f89430597dc942c3264f28fd08010c3b2e19ecf95c6e690f9820b2a486604051620006ef919062002736565b60005461010090046001600160a01b0316331462000dc35760405162461bcd60e51b81526004016200046290620025af565b6001600160a01b03841662000dec5760405162461bcd60e51b815260040162000462906200241f565b43821162000e0e5760405162461bcd60e51b8152600401620004629062002578565b81811162000e305760405162461bcd60e51b815260040162000462906200231f565b60025460005b8181101562000e95576002818154811062000e4d57fe5b60009182526020909120600b90910201546001600160a01b038781169116141562000e8c5760405162461bcd60e51b81526004016200046290620022c5565b60010162000e36565b5060028054600181018255600091909152600b027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b0388166001600160a01b03199091161781557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82018590557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad682018590557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082018490557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909101859055604051869062000f909062002020565b62000f9c9190620021c3565b604051809103906000f08015801562000fb9573d6000803e3d6000fd5b506003820180546001600160a01b0319166001600160a01b0392909216919091179055600062000ffc62000fee858762001b1f565b879063ffffffff62001b4a16565b600383015490915062001023906001600160a01b0389811691168363ffffffff62001bd616565b8160030160009054906101000a90046001600160a01b03166001600160a01b031663ca1896ab6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200107657600080fd5b505af11580156200108b573d6000803e3d6000fd5b50505050827ff164ae823f4542cc5c8fce1671fabc0d21159bf75d4fc92d697be0f1e748852688604051620010c19190620021c3565b60405180910390a250505050505050565b6002548110620010f65760405162461bcd60e51b81526004016200046290620026dc565b62001102338262001a8a565b6000600282815481106200111257fe5b60009182526020808320338452600a600b9093020191820190526040909120549091508015620011ff57336000818152600a8401602052604080822091909155600384015490516310b3879160e11b81526001600160a01b03909116916321670f22916200118691908590600401620021d7565b600060405180830381600087803b158015620011a157600080fd5b505af1158015620011b6573d6000803e3d6000fd5b50505050336001600160a01b0316837f3ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f30383604051620011f6919062002736565b60405180910390a35b505050565b60005460ff16156200122a5760405162461bcd60e51b81526004016200046290620022fc565b6000805460ff1916600117905580620012575760405162461bcd60e51b8152600401620004629062002267565b620012623362001bb2565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a082319062001295903090600401620021c3565b60206040518083038186803b158015620012ae57600080fd5b505afa158015620012c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012e991906200214c565b6005549091506200130c906001600160a01b031633308563ffffffff62001d5f16565b6005546040516370a0823160e01b8152600091620013a79184916001600160a01b0316906370a082319062001346903090600401620021c3565b60206040518083038186803b1580156200135f57600080fd5b505afa15801562001374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200139a91906200214c565b9063ffffffff62001b1f16565b600354909150620013bf908263ffffffff62001b8a16565b60035533600090815260046020526040902054620013e4908263ffffffff62001b8a16565b33600081815260046020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906200142a90849062002736565b60405180910390a250506000805460ff1916905550565b600254600090815b8181101562000b6457600281815481106200146057fe5b60009182526020909120600b90910201546001600160a01b03858116911614156200161c576000600282815481106200149557fe5b60009182526020918290206003600b909202010154604080516335d40bbd60e21b815290516001600160a01b039092169263d7502ef492600480840193829003018186803b158015620014e757600080fd5b505afa158015620014fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200152291906200214c565b9050600062001579600284815481106200153857fe5b90600052602060002090600b020160080154600285815481106200155857fe5b90600052602060002090600b02016002015462001b1f90919063ffffffff16565b90506000620015e4620015b5600286815481106200159357fe5b90600052602060002090600b0201600401548462001b4a90919063ffffffff16565b60028681548110620015c357fe5b90600052602060002090600b02016007015462001b8a90919063ffffffff16565b9050808310620015fd57600095505050505050620009ec565b6200160f818463ffffffff62001b1f16565b95505050505050620009ec565b60010162001449565b60005461010090046001600160a01b03163314620016575760405162461bcd60e51b81526004016200046290620025af565b6001600160a01b038116620016805760405162461bcd60e51b815260040162000462906200262c565b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60005461010090046001600160a01b03163314620017185760405162461bcd60e51b81526004016200046290620025af565b60025482106200173c5760405162461bcd60e51b81526004016200046290620026dc565b6000600283815481106200174c57fe5b90600052602060002090600b0201905080600201544311620017825760405162461bcd60e51b8152600401620004629062002541565b6000620017a18260080154836002015462001b1f90919063ffffffff16565b90506000620017d4620017c284600401548462001b4a90919063ffffffff16565b60078501549063ffffffff62001b8a16565b905060008360030160009054906101000a90046001600160a01b03166001600160a01b031663d7502ef46040518163ffffffff1660e01b815260040160206040518083038186803b1580156200182957600080fd5b505afa1580156200183e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200186491906200214c565b905062001878818363ffffffff62001b1f16565b8511156200189a5760405162461bcd60e51b815260040162000462906200248d565b6003840154604051633550d7eb60e11b81526001600160a01b0390911690636aa1afd690620018d09033908990600401620021d7565b600060405180830381600087803b158015620018eb57600080fd5b505af115801562001900573d6000803e3d6000fd5b505050507f6b769350ff403947f8ca4f54b35b9747d58b4b2676c957c460c1d5e4ba64342e338760405162001937929190620021d7565b60405180910390a1505050505050565b600254600090815b8181101562000b6457600281815481106200196657fe5b60009182526020909120600b90910201546001600160a01b0385811691161415620019c157600281815481106200199957fe5b600091825260209091206003600b9092020101546001600160a01b03169250620009ec915050565b6001016200194f565b620019d58262000435565b600580546001600160a01b0319166001600160a01b039290921691909117905550565b60005461010090046001600160a01b0316331462001a2a5760405162461bcd60e51b81526004016200046290620025af565b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006002828154811062001a9a57fe5b90600052602060002090600b020190504381600601541462001acd5762001ac18262001c30565b60058201554360068201555b6001600160a01b03831615620011ff5762001ae9838362000a2a565b6001600160a01b0384166000908152600a8301602090815260408083209390935560058401546009850190915291902055505050565b60008282111562001b445760405162461bcd60e51b81526004016200046290620024bd565b50900390565b60008262001b5b5750600062000408565b8282028284828162001b6957fe5b0414620004055760405162461bcd60e51b8152600401620004629062002713565b600082820183811015620004055760405162461bcd60e51b81526004016200046290620025d2565b60025460005b81811015620011ff5762001bcd838262001a8a565b60010162001bb8565b620011ff8363a9059cbb60e01b848460405160240162001bf8929190620021d7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001d89565b600062001c3c62001fc2565b6002838154811062001c4a57fe5b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b0390811684526001820154948401949094526002810154918301919091526003810154909216606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600890910154610100820152905062001cdc620004ba565b62001ced5760a001519050620009ec565b62001d2b62001d1962001d09836080015162000c4e8762001e4d565b62001d13620004ba565b62001f66565b60a08301519063ffffffff62001b8a16565b9392505050565b6000670de0b6b3a764000062001d4f848463ffffffff62001b4a16565b8162001d5757fe5b049392505050565b62001d83846323b872dd60e01b85858560405160240162001bf893929190620021f0565b50505050565b60006060836001600160a01b03168360405162001da7919062002187565b6000604051808303816000865af19150503d806000811462001de6576040519150601f19603f3d011682016040523d82523d6000602084013e62001deb565b606091505b50915091508162001e105760405162461bcd60e51b8152600401620004629062002356565b80511562001d83578080602001905181019062001e2e919062002111565b62001d835760405162461bcd60e51b8152600401620004629062002663565b600062001e5962001fc2565b6002838154811062001e6757fe5b60009182526020918290206040805161012081018252600b90930290910180546001600160a01b03908116845260018201549484018590526002820154928401929092526003810154909116606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260080154610100820152915043108062001f01575080604001518160c00151115b1562001f12576000915050620009ec565b600081602001518260c001511062001f2f578160c0015162001f35565b81602001515b905060004383604001511062001f4c574362001f52565b82604001515b905062000b04818363ffffffff62001b1f16565b6000620004058262001f8785670de0b6b3a764000063ffffffff62001b4a16565b9063ffffffff62001f9416565b600080821162001fb85760405162461bcd60e51b815260040162000462906200238b565b81838162001d5757fe5b60405180610120016040528060006001600160a01b03168152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b6108ca806200274083390190565b80356001600160a01b03811681146200040857600080fd5b60006020828403121562002058578081fd5b6200040583836200202e565b6000806040838503121562002077578081fd5b6200208384846200202e565b91506200209484602085016200202e565b90509250929050565b60008060408385031215620020b0578182fd5b620020bc84846200202e565b946020939093013593505050565b60008060008060808587031215620020e0578182fd5b84356001600160a01b0381168114620020f7578283fd5b966020860135965060408601359560600135945092505050565b60006020828403121562002123578081fd5b8151801515811462000405578182fd5b60006020828403121562002145578081fd5b5035919050565b6000602082840312156200215e578081fd5b5051919050565b6000806040838503121562002178578182fd5b50508035926020909101359150565b60008251815b81811015620021a957602081860181015185830152016200218d565b81811115620021b85782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03998a16815260208101989098526040880196909652939096166060860152608085019190915260a084015260c083019390935260e08201929092526101008101919091526101200190565b6020808252601f908201527f444f444f4d696e6556333a2043414e4e4f545f4445504f5349545f5a45524f00604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252601f908201527f444f444f4d696e6556333a20544f4b454e5f414c52454144595f414444454400604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601c908201527f444f444f4d696e6556333a204455524154494f4e5f494e56414c494400000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b6020808252818101527f444f444f4d696e6556333a2043414e4e4f545f57495448445241575f5a45524f604082015260600190565b6020808252601d908201527f444f444f4d696e6556333a20454e445f424c4f434b5f494e56414c4944000000604082015260600190565b60208082526019908201527f444f444f4d696e6556333a20544f4b454e5f494e56414c494400000000000000604082015260600190565b6020808252601b908201527f444f444f4d696e6556333a20544f4b454e5f4e4f545f464f554e440000000000604082015260600190565b6020808252601690820152750889e889e9ad2dccaac6674409c9ea8be8a9c9eaa8e960531b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526019908201527f444f444f4d696e6556333a20414c52454144595f434c4f534500000000000000604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601f908201527f444f444f4d696e6556333a204d494e494e475f4e4f545f46494e495348454400604082015260600190565b6020808252601f908201527f444f444f4d696e6556333a2053544152545f424c4f434b5f494e56414c494400604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252601d908201527f444f444f4d696e6556333a205245574152445f4e4f545f454e4f554748000000604082015260600190565b60208082526018908201527f444f444f4d696e6556333a205a45524f5f414444524553530000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601590820152741113d113d35a5b99558cce881393d517d4d5105495605a1b604082015260600190565b6020808252601f908201527f444f444f4d696e6556333a205245574152445f49445f4e4f545f464f554e4400604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b9081526020019056fe608060405234801561001057600080fd5b506040516108ca3803806108ca83398101604081905261002f9161009d565b600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600480546001600160a01b0319166001600160a01b03929092169190911790556100cb565b6000602082840312156100ae578081fd5b81516001600160a01b03811681146100c4578182fd5b9392505050565b6107f0806100da6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806375c5ea111161006657806375c5ea11146100f35780638456db15146100fb578063ca1896ab14610103578063d7502ef41461010b578063f2fde38b146101135761009e565b806316048bc4146100a357806321670f22146100c15780634e71e0c8146100d6578063586235b4146100de5780636aa1afd6146100c1575b600080fd5b6100ab610126565b6040516100b89190610635565b60405180910390f35b6100d46100cf36600461059a565b610135565b005b6100d46101c1565b6100e661024f565b6040516100b8919061079b565b6100ab610255565b6100ab610264565b6100d4610273565b6100e661036c565b6100d461012136600461057f565b610372565b6000546001600160a01b031681565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906106e1565b60405180910390fd5b80600254101561018a5760405162461bcd60e51b815260040161015f90610771565b60025461019d908263ffffffff6103f716565b6002556004546101bd906001600160a01b0316838363ffffffff61042416565b5050565b6001546001600160a01b031633146101eb5760405162461bcd60e51b815260040161015f90610662565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60025481565b6004546001600160a01b031681565b6001546001600160a01b031681565b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a08231916102a591309101610635565b60206040518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f591906105e4565b9050600061030e600254836103f790919063ffffffff16565b600354909150610324908263ffffffff61047f16565b600381905560028390556040517fed9a567f42e0ef8986598c5257db7be662f4eaae3892286b03c5ba3a1ddf399b9161036091849086906107a4565b60405180910390a15050565b60035481565b6000546001600160a01b0316331461039c5760405162461bcd60e51b815260040161015f906106e1565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000828211156104195760405162461bcd60e51b815260040161015f906106be565b508082035b92915050565b61047a8363a9059cbb60e01b8484604051602401610443929190610649565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526104ab565b505050565b6000828201838110156104a45760405162461bcd60e51b815260040161015f90610704565b9392505050565b60006060836001600160a01b0316836040516104c791906105fc565b6000604051808303816000865af19150503d8060008114610504576040519150601f19603f3d011682016040523d82523d6000602084013e610509565b606091505b50915091508161052b5760405162461bcd60e51b815260040161015f90610689565b805115610562578080602001905181019061054691906105c4565b6105625760405162461bcd60e51b815260040161015f90610727565b50505050565b80356001600160a01b038116811461041e57600080fd5b600060208284031215610590578081fd5b6104a48383610568565b600080604083850312156105ac578081fd5b6105b68484610568565b946020939093013593505050565b6000602082840312156105d5578081fd5b815180151581146104a4578182fd5b6000602082840312156105f5578081fd5b5051919050565b60008251815b8181101561061c5760208186018101518583015201610602565b8181111561062a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526010908201526f0ac82aa98a8be9c9ea8be8a9c9eaa8e960831b604082015260600190565b90815260200190565b928352602083019190915260408201526060019056fea2646970667358221220563330dae9cd6a67fef13fc3a8baa1707ddfba578cf3c6d5f8ab36552654a18d64736f6c63430006090033a2646970667358221220d3041a7ac26b1d3878eca05e9e73f9da8b2c92bce994ce1e671920162c07731764736f6c63430006090033

Deployed ByteCode Sourcemap

24089:1605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15091:181;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18026:177;;;:::i;:::-;;9794:127;;;;;;;;;:::i;9161:22::-;;;:::i;:::-;;;;;;;;15280:91;;;:::i;19512:913::-;;;;;;;;;:::i;13867:41::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25293:398;;;;;;;;;:::i;10100:228::-;;;:::i;16111:104::-;;;:::i;15491:249::-;;;;;;;;;:::i;15379:104::-;;;;;;;;;:::i;9190:26::-;;;:::i;24258:22::-;;;:::i;14475:608::-;;;;;;;;;:::i;15748:355::-;;;;;;;;;:::i;20433:954::-;;;;;;;;;:::i;18263:1241::-;;;;;;;;;:::i;17538:480::-;;;;;;;;;:::i;24643:642::-;;;;;;;;;:::i;16619:869::-;;;;;;;;;:::i;22172:232::-;;;;;;;;;:::i;21395:767::-;;;;;;;;;:::i;16223:388::-;;;;;;;;;:::i;24289:120::-;;;;;;;;;:::i;9929:163::-;;;;;;;;;:::i;15091:181::-;15182:7;15209:55;15226:4;15232:31;15251:11;15232:18;:31::i;15209:55::-;15202:62;;15091:181;;;;;:::o;18026:177::-;18087:16;:23;18073:11;18121:75;18145:3;18141:1;:7;18121:75;;;18170:14;18182:1;18170:11;:14::i;:::-;18150:3;;18121:75;;;;18026:177;:::o;9794:127::-;9583:13;;-1:-1:-1;;;9583:13:0;;;;9582:14;9574:43;;;;-1:-1:-1;;;9574:43:0;;;;;;;;;;;;;;;;;9880:4:::1;9864:20:::0;;-1:-1:-1;;;;9864:20:0::1;-1:-1:-1::0;;;9864:20:0::1;::::0;;;9895:18;;-1:-1:-1;;;;;9895:18:0;;::::1;9864:20;9895:18;-1:-1:-1::0;;;;;;9895:18:0;;::::1;::::0;;;::::1;::::0;;9794:127::o;9161:22::-;;;;;;-1:-1:-1;;;;;9161:22:0;;:::o;15280:91::-;15351:12;;15280:91;:::o;19512:913::-;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;19630:16:::1;:23:::0;19626:27;::::1;19618:71;;;;-1:-1:-1::0;;;19618:71:0::1;;;;;;;;;19700:28;19722:1;19726;19700:13;:28::i;:::-;19739:26;19768:16;19785:1;19768:19;;;;;;;;;;;;;;;;;;19739:48;;19802:26;19843:2;:14;;;;;;;;;;-1:-1:-1::0;;;;;19843:14:0::1;-1:-1:-1::0;;;;;19831:42:0::1;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19802:73;;19886:11;19900:33;19916:2;:16;;;19900:11;:15;;:33;;;;:::i;:::-;19886:47;;19944:19;19966:52;19991:26;19999:2;:17;;;19991:3;:7;;:26;;;;:::i;:::-;19966:20;::::0;::::1;::::0;;:52:::1;:24;:52;:::i;:::-;19944:74;;20059:11;20037:18;:33;;20029:75;;;;-1:-1:-1::0;;;20029:75:0::1;;;;;;;;;20140:11;20125:12;:26;20117:68;;;;-1:-1:-1::0;;;20117:68:0::1;;;;;;;;;20219:2;:13;;;20204:12;:28;20196:62;;;;-1:-1:-1::0;;;20196:62:0::1;;;;;;;;;20292:2;:11;;;20277:12;:26;20269:64;;;;-1:-1:-1::0;;;20269:64:0::1;;;;;;;;;20360:11;20346:2;:11;;:25;;;;20402:1;20387:30;20405:11;20387:30;;;;;;;;;;;;;;;9731:1;;;;19512:913:::0;;:::o;13867:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13867:41:0;;;;-1:-1:-1;13867:41:0;;;;;;;;;;;;;;:::o;25293:398::-;7730:9;;;;7729:10;7721:32;;;;-1:-1:-1;;;7721:32:0;;;;;;;;;7764:9;:16;;-1:-1:-1;;7764:16:0;7776:4;7764:16;;;25372:10;25364:55:::1;;;;-1:-1:-1::0;;;25364:55:0::1;;;;;;;;;25432:28;25449:10;25432:16;:28::i;:::-;25486:12;::::0;:24:::1;::::0;25503:6;25486:24:::1;:16;:24;:::i;:::-;25471:12;:39:::0;25555:10:::1;25545:21;::::0;;;:9:::1;:21;::::0;;;;;:33:::1;::::0;25571:6;25545:33:::1;:25;:33;:::i;:::-;25531:10;25521:21;::::0;;;:9:::1;:21;::::0;;;;:57;;;;25596:7:::1;::::0;25589:48:::1;::::0;-1:-1:-1;;;;;25596:7:0;;::::1;::::0;25630:6;25589:28:::1;:48::i;:::-;25664:10;-1:-1:-1::0;;;;;25655:28:0::1;;25676:6;25655:28;;;;;;;;;;;;;;;-1:-1:-1::0;7815:5:0;7803:17;;-1:-1:-1;;7803:17:0;;;25293:398::o;10100:228::-;10166:11;;-1:-1:-1;;;;;10166:11:0;10152:10;:25;10144:51;;;;-1:-1:-1;;;10144:51:0;;;;;;;;;10241:11;;;10232:7;;10211:42;;-1:-1:-1;;;;;10241:11:0;;;;;10232:7;;;;;;;10211:42;;;10274:11;;;;10264:21;;-1:-1:-1;;;;;;10264:21:0;10274:11;-1:-1:-1;;;;;10274:11:0;;10264:21;;;;-1:-1:-1;;;;;;10296:24:0;;;10100:228::o;16111:104::-;16184:16;:23;16111:104;:::o;15491:249::-;15583:16;:23;15553:7;;15581:25;;15573:69;;;;-1:-1:-1;;;15573:69:0;;;;;;;;;15653:25;;:::i;:::-;15681:16;15698:1;15681:19;;;;;;;;;;;;;;;;;15653:47;;;;;;;;15681:19;;;;;;;15653:47;;-1:-1:-1;;;;;15653:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15491:249:0;;;;:::o;15379:104::-;-1:-1:-1;;;;;15460:15:0;15433:7;15460:15;;;:9;:15;;;;;;;15379:104::o;9190:26::-;;;-1:-1:-1;;;;;9190:26:0;;:::o;24258:22::-;;;-1:-1:-1;;;;;24258:22:0;;:::o;14475:608::-;14577:16;:23;14547:7;;14575:25;;14567:69;;;;-1:-1:-1;;;14567:69:0;;;;;;;;;14647:26;14676:16;14693:1;14676:19;;;;;;;;;;;;;;;;;;14647:48;;14706:25;14734:2;:20;;;14706:48;;14791:12;14769:2;:18;;;:34;14765:111;;14840:24;14862:1;14840:21;:24::i;:::-;14820:44;;14765:111;-1:-1:-1;;;;;15054:20:0;;;;;;:14;;;:20;;;;;;14906:169;;:143;14945:15;15069:4;14945:9;:15::i;:::-;-1:-1:-1;;;;;15002:31:0;;;;;;:25;;;:31;;;;;;14980:54;;:17;;:54;:21;:54;:::i;:::-;14906:20;:143::i;:::-;:147;:169;:147;:169;:::i;:::-;14886:189;14475:608;-1:-1:-1;;;;;14475:608:0:o;15748:355::-;15851:16;:23;15817:7;;;15885:155;15909:3;15905:1;:7;15885:155;;;15953:16;15970:1;15953:19;;;;;;;;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;15938:46:0;;;15953:31;;15938:46;15934:95;;;16012:1;-1:-1:-1;16005:8:0;;-1:-1:-1;16005:8:0;15934:95;15914:3;;15885:155;;;-1:-1:-1;16050:45:0;;-1:-1:-1;;;16050:45:0;;;;;;;;20433:954;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;20555:16:::1;:23:::0;20551:27;::::1;20543:71;;;;-1:-1:-1::0;;;20543:71:0::1;;;;;;;;;20625:28;20647:1;20651;20625:13;:28::i;:::-;20664:26;20693:16;20710:1;20693:19;;;;;;;;;;;;;;;;;;20664:48;;20756:2;:11;;;20741:12;:26;20733:64;;;;-1:-1:-1::0;;;20733:64:0::1;;;;;;;;;20841:85;20866:59;20907:2;:17;;;20867:34;20884:2;:16;;;20867:12;:16;;:34;;;;:::i;:::-;20866:40:::0;:59:::1;:40;:59;:::i;:::-;20841:20;::::0;::::1;::::0;;:85:::1;:24;:85;:::i;:::-;20818:20;::::0;::::1;:108:::0;20937:17:::1;::::0;;::::1;:37:::0;;;21004:12:::1;20985:16;::::0;::::1;:31:::0;-1:-1:-1;21070:14:0;::::1;::::0;21058:44:::1;::::0;;-1:-1:-1;;;21058:44:0;;;;-1:-1:-1;;;;;;;21070:14:0;;::::1;::::0;21058:42:::1;::::0;:44;;::::1;::::0;::::1;::::0;;;;;;;;21070:14;21058:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21029:73;;21113:11;21127:29;21143:12;21127:2;:11;;;:15;;:29;;;;:::i;:::-;21113:43:::0;-1:-1:-1;21167:19:0::1;21189:52;21214:26;21113:43:::0;21222:17;21214:26:::1;:7;:26;:::i;21189:52::-;21167:74;;21282:11;21260:18;:33;;21252:75;;;;-1:-1:-1::0;;;21252:75:0::1;;;;;;;;;21358:1;21345:34;21361:17;21345:34;;;;;;;18263:1241:::0;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;-1:-1:-1;;;;;18451:25:0;::::1;18443:63;;;;-1:-1:-1::0;;;18443:63:0::1;;;;;;;;;18538:12;18525:10;:25;18517:69;;;;-1:-1:-1::0;;;18517:69:0::1;;;;;;;;;18616:10;18605:8;:21;18597:62;;;;-1:-1:-1::0;;;18597:62:0::1;;;;;;;;;18686:16;:23:::0;18672:11:::1;18720:200;18744:3;18740:1;:7;18720:200;;;18810:16;18827:1;18810:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:31:::0;-1:-1:-1;;;;;18795:46:0;;::::1;18810:31:::0;::::1;18795:46;;18769:139;;;;-1:-1:-1::0;;;18769:139:0::1;;;;;;;;;18749:3;;18720:200;;;-1:-1:-1::0;18961:16:0::1;:23:::0;;::::1;::::0;::::1;::::0;;18932:26:::1;18961:23:::0;;;;::::1;;::::0;;::::1;18995:28:::0;;-1:-1:-1;;;;;18995:28:0;::::1;-1:-1:-1::0;;;;;;18995:28:0;;::::1;;::::0;;19034:13;;;:26;;;19071:16;;;:29;;;19111:11;;;:22;;;19144:17;;;;:34;;;19214:28:::1;::::0;19012:11;;19214:28:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;19189:14:0::1;::::0;::::1;:54:::0;;-1:-1:-1;;;;;;19189:54:0::1;-1:-1:-1::0;;;;;19189:54:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;19279:44:0::1;19298:24;:8:::0;19311:10;19298:12:::1;:24::i;:::-;19279:14:::0;;:44:::1;:18;:44;:::i;:::-;19367:14;::::0;::::1;::::0;19256:67;;-1:-1:-1;19334:62:0::1;::::0;-1:-1:-1;;;;;19334:32:0;;::::1;::::0;19367:14:::1;19256:67:::0;19334:62:::1;:32;:62;:::i;:::-;19419:2;:14;;;;;;;;;;-1:-1:-1::0;;;;;19419:14:0::1;-1:-1:-1::0;;;;;19407:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19479:3;19464:32;19484:11;19464:32;;;;;;;;;;;;;;;9731:1;;;18263:1241:::0;;;;:::o;17538:480::-;17598:16;:23;17596:25;;17588:69;;;;-1:-1:-1;;;17588:69:0;;;;;;;;;17668:28;17682:10;17694:1;17668:13;:28::i;:::-;17707:26;17736:16;17753:1;17736:19;;;;;;;;;;;;;;;;17798:10;17783:26;;:14;17736:19;;;;;17783:14;;;:26;;;;;;;17736:19;;-1:-1:-1;17824:10:0;;17820:191;;17866:10;17880:1;17851:26;;;:14;;;:26;;;;;;:30;;;;17909:14;;;;17896:55;;-1:-1:-1;;;17896:55:0;;-1:-1:-1;;;;;17909:14:0;;;;17896:35;;:55;;17866:10;17944:6;;17896:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17980:10;-1:-1:-1;;;;;17971:28:0;17977:1;17971:28;17992:6;17971:28;;;;;;;;;;;;;;;17820:191;17538:480;;;:::o;24643:642::-;7730:9;;;;7729:10;7721:32;;;;-1:-1:-1;;;7721:32:0;;;;;;;;;7764:9;:16;;-1:-1:-1;;7764:16:0;7776:4;7764:16;;;24721:10;24713:54:::1;;;;-1:-1:-1::0;;;24713:54:0::1;;;;;;;;;24780:28;24797:10;24780:16;:28::i;:::-;24857:7;::::0;24850:40:::1;::::0;-1:-1:-1;;;24850:40:0;;24821:26:::1;::::0;-1:-1:-1;;;;;24857:7:0::1;::::0;24850:25:::1;::::0;:40:::1;::::0;24884:4:::1;::::0;24850:40:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24908:7;::::0;24821:69;;-1:-1:-1;24901:67:0::1;::::0;-1:-1:-1;;;;;24908:7:0::1;24934:10;24954:4;24961:6:::0;24901:67:::1;:32;:67;:::i;:::-;25014:7;::::0;25007:40:::1;::::0;-1:-1:-1;;;25007:40:0;;24979:25:::1;::::0;25007:64:::1;::::0;25052:18;;-1:-1:-1;;;;;25014:7:0::1;::::0;25007:25:::1;::::0;:40:::1;::::0;25041:4:::1;::::0;25007:40:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44:::0;:64:::1;:44;:64;:::i;:::-;25107:12;::::0;24979:92;;-1:-1:-1;25107:35:0::1;::::0;24979:92;25107:35:::1;:16;:35;:::i;:::-;25092:12;:50:::0;25187:10:::1;25177:21;::::0;;;:9:::1;:21;::::0;;;;;:44:::1;::::0;25203:17;25177:44:::1;:25;:44;:::i;:::-;25163:10;25153:21;::::0;;;:9:::1;:21;::::0;;;;;;:68;;;;25239:38;;::::1;::::0;::::1;::::0;25259:17;;25239:38:::1;;;;;;;;;;-1:-1:-1::0;;7815:5:0;7803:17;;-1:-1:-1;;7803:17:0;;;-1:-1:-1;24643:642:0:o;16619:869::-;16729:16;:23;16695:7;;;16763:662;16787:3;16783:1;:7;16763:662;;;16831:16;16848:1;16831:19;;;;;;;;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;16816:46:0;;;16831:31;;16816:46;16812:602;;;16883:26;16925:16;16942:1;16925:19;;;;;;;;;;;;;;;;;:31;:19;;;;;:31;;16912:62;;;-1:-1:-1;;;16912:62:0;;;;-1:-1:-1;;;;;16925:31:0;;;;16912:60;;:62;;;;;;;;;;16925:31;16912:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16883:91;;16993:11;17007:67;17040:16;17057:1;17040:19;;;;;;;;;;;;;;;;;;:33;;;17007:16;17024:1;17007:19;;;;;;;;;;;;;;;;;;:28;;;:32;;:67;;;;:::i;:::-;16993:81;;17093:19;17115:86;17157:43;17165:16;17182:1;17165:19;;;;;;;;;;;;;;;;;;:34;;;17157:3;:7;;:43;;;;:::i;:::-;17115:16;17132:1;17115:19;;;;;;;;;;;;;;;;;;:37;;;:41;;:86;;;;:::i;:::-;17093:108;;17245:11;17223:18;:33;17220:179;;17288:1;17281:8;;;;;;;;;17220:179;17344:35;:11;17360:18;17344:35;:15;:35;:::i;:::-;17337:42;;;;;;;;;16812:602;16792:3;;16763:662;;22172:232;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;-1:-1:-1;;;;;22261:22:0;::::1;22253:59;;;;-1:-1:-1::0;;;22253:59:0::1;;;;;;;;;22349:7;::::0;;22328:39:::1;::::0;-1:-1:-1;;;;;22328:39:0;;::::1;::::0;22349:7:::1;::::0;;::::1;;::::0;22328:39:::1;::::0;::::1;22378:7;:18:::0;;-1:-1:-1;;;;;22378:18:0;;::::1;;;-1:-1:-1::0;;;;;;22378:18:0;;::::1;::::0;;;::::1;::::0;;22172:232::o;21395:767::-;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;21490:16:::1;:23:::0;21486:27;::::1;21478:71;;;;-1:-1:-1::0;;;21478:71:0::1;;;;;;;;;21570:26;21599:16;21616:1;21599:19;;;;;;;;;;;;;;;;;;21570:48;;21652:2;:11;;;21637:12;:26;21629:70;;;;-1:-1:-1::0;;;21629:70:0::1;;;;;;;;;21720:11;21734:33;21750:2;:16;;;21734:2;:11;;;:15;;:33;;;;:::i;:::-;21720:47;;21778:19;21800:52;21825:26;21833:2;:17;;;21825:3;:7;;:26;;;;:::i;:::-;21800:20;::::0;::::1;::::0;;:52:::1;:24;:52;:::i;:::-;21778:74;;21863:26;21905:2;:14;;;;;;;;;;-1:-1:-1::0;;;;;21905:14:0::1;-1:-1:-1::0;;;;;21892:43:0::1;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21863:74:::0;-1:-1:-1;21966:35:0::1;21863:74:::0;21989:11;21966:35:::1;:22;:35;:::i;:::-;21956:6;:45;;21948:80;;;;-1:-1:-1::0;;;21948:80:0::1;;;;;;;;;22054:14;::::0;::::1;::::0;22041:64:::1;::::0;-1:-1:-1;;;22041:64:0;;-1:-1:-1;;;;;22054:14:0;;::::1;::::0;22041:45:::1;::::0;:64:::1;::::0;22087:10:::1;::::0;22098:6;;22041:64:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22123:31;22140:10;22152:1;22123:31;;;;;;;;;;;;;;;;9731:1;;;;21395:767:::0;;:::o;16223:388::-;16329:16;:23;16295:7;;;16363:185;16387:3;16383:1;:7;16363:185;;;16431:16;16448:1;16431:19;;;;;;;;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;16416:46:0;;;16431:31;;16416:46;16412:125;;;16490:16;16507:1;16490:19;;;;;;;;;;;;;;;;:31;:19;;;;;:31;;-1:-1:-1;;;;;16490:31:0;;-1:-1:-1;16483:38:0;;-1:-1:-1;;16483:38:0;16412:125;16392:3;;16363:185;;24289:120;24353:22;24369:5;24353:15;:22::i;:::-;24386:7;:15;;-1:-1:-1;;;;;;24386:15:0;-1:-1:-1;;;;;24386:15:0;;;;;;;;;;-1:-1:-1;24289:120:0:o;9929:163::-;9699:7;;;;;-1:-1:-1;;;;;9699:7:0;9685:10;:21;9677:43;;;;-1:-1:-1;;;9677:43:0;;;;;;;;;10033:7:::1;::::0;;10007:44:::1;::::0;-1:-1:-1;;;;;10007:44:0;;::::1;::::0;10033:7:::1;::::0;;::::1;;::::0;10007:44:::1;::::0;::::1;10062:11;:22:::0;;-1:-1:-1;;;;;;10062:22:0::1;-1:-1:-1::0;;;;;10062:22:0;;;::::1;::::0;;;::::1;::::0;;9929:163::o;22458:473::-;22526:26;22555:16;22572:1;22555:19;;;;;;;;;;;;;;;;;;22526:48;;22611:12;22589:2;:18;;;:34;22585:161;;22662:24;22684:1;22662:21;:24::i;:::-;22639:20;;;:47;22722:12;22701:18;;;:33;22585:161;-1:-1:-1;;;;;22760:18:0;;;22756:168;;22818:25;22835:4;22841:1;22818:16;:25::i;:::-;-1:-1:-1;;;;;22795:20:0;;;;;;:14;;;:20;;;;;;;;:48;;;;22892:20;;;;22858:25;;;:31;;;;;;:54;22458:473;;;:::o;3573:137::-;3631:7;3664:1;3659;:6;;3651:28;;;;-1:-1:-1;;;3651:28:0;;;;;;;;;-1:-1:-1;3697:5:0;;;3573:137::o;2894:226::-;2952:7;2976:6;2972:47;;-1:-1:-1;3006:1:0;2999:8;;2972:47;3043:5;;;3047:1;3043;:5;:1;3067:5;;;;;:10;3059:32;;;;-1:-1:-1;;;3059:32:0;;;;;;;;3718:161;3776:7;3808:5;;;3832:6;;;;3824:28;;;;-1:-1:-1;;;3824:28:0;;;;;;;;22939:198;23013:16;:23;22999:11;23047:83;23071:3;23067:1;:7;23047:83;;;23096:22;23110:4;23116:1;23096:13;:22::i;:::-;23076:3;;23047:83;;4667:211;4784:86;4804:5;4834:23;;;4859:2;4863:5;4811:58;;;;;;;;;;;;;;-1:-1:-1;;4811:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4811:58:0;-1:-1:-1;;;;;;4811:58:0;;;;;;;;;;4784:19;:86::i;23617:400::-;23682:7;23702:25;;:::i;:::-;23730:16;23747:1;23730:19;;;;;;;;;;;;;;;;;23702:47;;;;;;;;23730:19;;;;;;;23702:47;;-1:-1:-1;;;;;23702:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23764:13:0;:11;:13::i;:::-;23760:78;;23806:20;;;;-1:-1:-1;23799:27:0;;23760:78;23868:141;23911:83;23932:46;23960:2;:17;;;23932:23;23953:1;23932:20;:23::i;:46::-;23980:13;:11;:13::i;:::-;23911:20;:83::i;:::-;23868:20;;;;;:141;:24;:141;:::i;:::-;23848:161;23617:400;-1:-1:-1;;;23617:400:0:o;8156:127::-;8224:7;8268:6;8251:13;:6;8262:1;8251:13;:10;:13;:::i;:::-;:24;;;;;;;8156:127;-1:-1:-1;;;8156:127:0:o;4886:285::-;5030:133;5064:5;5107:27;;;5136:4;5142:2;5146:5;5084:68;;;;;;;;;;;5030:133;4886:285;;;;:::o;6240:1046::-;6900:12;6914:23;6949:5;-1:-1:-1;;;;;6941:19:0;6961:4;6941:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6899:67;;;;6985:7;6977:52;;;;-1:-1:-1;;;6977:52:0;;;;;;;;;7046:17;;:21;7042:237;;7201:10;7190:30;;;;;;;;;;;;;;7182:85;;;;-1:-1:-1;;;7182:85:0;;;;;;;;23145:464;23209:7;23229:25;;:::i;:::-;23257:16;23274:1;23257:19;;;;;;;;;;;;;;;;;23229:47;;;;;;;;23257:19;;;;;;;23229:47;;-1:-1:-1;;;;;23229:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23291:12:0;:28;;:64;;;23344:2;:11;;;23323:2;:18;;;:32;23291:64;23287:105;;;23379:1;23372:8;;;;;23287:105;23402:13;23439:2;:13;;;23418:2;:18;;;:34;:71;;23471:2;:18;;;23418:71;;;23455:2;:13;;;23418:71;23402:87;;23500:11;23528:12;23514:2;:11;;;:26;:55;;23557:12;23514:55;;;23543:2;:11;;;23514:55;23500:69;-1:-1:-1;23587:14:0;23500:69;23595:5;23587:14;:7;:14;:::i;8430:128::-;8498:7;8525:25;8548:1;8525:18;:6;8536;8525:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;3128:141::-;3186:7;3218:1;3214;:5;3206:32;;;;-1:-1:-1;;;3206:32:0;;;;;;;;;3260:1;3256;:5;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;26702:54;;27562:35;;27552:2;;27611:1;;27601:12;555:241;;659:2;647:9;638:7;634:23;630:32;627:2;;;-1:-1;;665:12;627:2;727:53;772:7;748:22;727:53;;803:366;;;924:2;912:9;903:7;899:23;895:32;892:2;;;-1:-1;;930:12;892:2;992:53;1037:7;1013:22;992:53;;;982:63;;1100:53;1145:7;1082:2;1125:9;1121:22;1100:53;;;1090:63;;886:283;;;;;;1176:366;;;1297:2;1285:9;1276:7;1272:23;1268:32;1265:2;;;-1:-1;;1303:12;1265:2;1365:53;1410:7;1386:22;1365:53;;;1355:63;1455:2;1494:22;;;;344:20;;-1:-1;;;1259:283;1549:617;;;;;1704:3;1692:9;1683:7;1679:23;1675:33;1672:2;;;-1:-1;;1711:12;1672:2;72:20;;-1:-1;;;;;26702:54;;27562:35;;27552:2;;-1:-1;;27601:12;27552:2;1763:63;1863:2;1902:22;;344:20;;-1:-1;1971:2;2010:22;;344:20;;2079:2;2118:22;344:20;;-1:-1;1666:500;-1:-1;;;1666:500;2173:257;;2285:2;2273:9;2264:7;2260:23;2256:32;2253:2;;;-1:-1;;2291:12;2253:2;223:6;217:13;27708:5;26614:13;26607:21;27686:5;27683:32;27673:2;;-1:-1;;27719:12;2437:241;;2541:2;2529:9;2520:7;2516:23;2512:32;2509:2;;;-1:-1;;2547:12;2509:2;-1:-1;344:20;;2503:175;-1:-1;2503:175;2685:263;;2800:2;2788:9;2779:7;2775:23;2771:32;2768:2;;;-1:-1;;2806:12;2768:2;-1:-1;492:13;;2762:186;-1:-1;2762:186;2955:366;;;3076:2;3064:9;3055:7;3051:23;3047:32;3044:2;;;-1:-1;;3082:12;3044:2;-1:-1;;344:20;;;3234:2;3273:22;;;344:20;;-1:-1;3038:283;12416:271;;3757:5;26084:12;-1:-1;27299:101;27313:6;27310:1;27307:13;27299:101;;;3901:4;27380:11;;;;;27374:18;27361:11;;;27354:39;27328:10;27299:101;;;27415:6;27412:1;27409:13;27406:2;;;-1:-1;27471:6;27466:3;27462:16;27455:27;27406:2;-1:-1;3932:16;;;;;12550:137;-1:-1;;12550:137;12694:222;-1:-1;;;;;26702:54;;;;3548:37;;12821:2;12806:18;;12792:124;12923:349;-1:-1;;;;;26702:54;;;;3407:58;;13258:2;13243:18;;12367:37;13086:2;13071:18;;13057:215;13279:444;-1:-1;;;;;26702:54;;;3548:37;;26702:54;;;;13626:2;13611:18;;3548:37;13709:2;13694:18;;12367:37;;;;13462:2;13447:18;;13433:290;14070:1116;-1:-1;;;;;26702:54;;;3548:37;;14586:2;14571:18;;12367:37;;;;14669:2;14654:18;;12367:37;;;;26702:54;;;;14752:2;14737:18;;3548:37;14835:3;14820:19;;12367:37;;;;26713:42;14904:19;;12367:37;15003:3;14988:19;;12367:37;;;;15087:3;15072:19;;12367:37;;;;15171:3;15156:19;;12367:37;;;;14421:3;14406:19;;14392:794;15193:416;15393:2;15407:47;;;4185:2;15378:18;;;26382:19;4221:33;26422:14;;;4201:54;4274:12;;;15364:245;15616:416;15816:2;15830:47;;;4525:2;15801:18;;;26382:19;-1:-1;;;26422:14;;;4541:36;4596:12;;;15787:245;16039:416;16239:2;16253:47;;;4847:2;16224:18;;;26382:19;4883:33;26422:14;;;4863:54;4936:12;;;16210:245;16462:416;16662:2;16676:47;;;5187:1;16647:18;;;26382:19;-1:-1;;;26422:14;;;5202:32;5253:12;;;16633:245;16885:416;17085:2;17099:47;;;5504:2;17070:18;;;26382:19;5540:30;26422:14;;;5520:51;5590:12;;;17056:245;17308:416;17508:2;17522:47;;;17493:18;;;26382:19;5877:34;26422:14;;;5857:55;5931:12;;;17479:245;17731:416;17931:2;17945:47;;;6182:2;17916:18;;;26382:19;-1:-1;;;26422:14;;;6198:37;6254:12;;;17902:245;18154:416;18354:2;18368:47;;;18339:18;;;26382:19;6541:34;26422:14;;;6521:55;6595:12;;;18325:245;18577:416;18777:2;18791:47;;;6846:2;18762:18;;;26382:19;6882:31;26422:14;;;6862:52;6933:12;;;18748:245;19000:416;19200:2;19214:47;;;7184:2;19185:18;;;26382:19;7220:27;26422:14;;;7200:48;7267:12;;;19171:245;19423:416;19623:2;19637:47;;;7518:2;19608:18;;;26382:19;7554:29;26422:14;;;7534:50;7603:12;;;19594:245;19846:416;20046:2;20060:47;;;7854:2;20031:18;;;26382:19;-1:-1;;;26422:14;;;7870:45;7934:12;;;20017:245;20269:416;20469:2;20483:47;;;8185:1;20454:18;;;26382:19;-1:-1;;;26422:14;;;8200:32;8251:12;;;20440:245;20692:416;20892:2;20906:47;;;8502:2;20877:18;;;26382:19;8538:27;26422:14;;;8518:48;8585:12;;;20863:245;21115:416;21315:2;21329:47;;;8836:2;21300:18;;;26382:19;-1:-1;;;26422:14;;;8852:39;8910:12;;;21286:245;21538:416;21738:2;21752:47;;;9161:2;21723:18;;;26382:19;9197:33;26422:14;;;9177:54;9250:12;;;21709:245;21961:416;22161:2;22175:47;;;9501:2;22146:18;;;26382:19;9537:33;26422:14;;;9517:54;9590:12;;;22132:245;22384:416;22584:2;22598:47;;;9841:1;22569:18;;;26382:19;-1:-1;;;26422:14;;;9856:32;9907:12;;;22555:245;22807:416;23007:2;23021:47;;;10158:1;22992:18;;;26382:19;-1:-1;;;26422:14;;;10173:32;10224:12;;;22978:245;23230:416;23430:2;23444:47;;;10475:2;23415:18;;;26382:19;10511:31;26422:14;;;10491:52;10562:12;;;23401:245;23653:416;23853:2;23867:47;;;10813:2;23838:18;;;26382:19;10849:26;26422:14;;;10829:47;10895:12;;;23824:245;24076:416;24276:2;24290:47;;;11146:2;24261:18;;;26382:19;11182:34;26422:14;;;11162:55;-1:-1;;;11237:12;;;11230:34;11283:12;;;24247:245;24499:416;24699:2;24713:47;;;11534:2;24684:18;;;26382:19;-1:-1;;;26422:14;;;11550:44;11613:12;;;24670:245;24922:416;25122:2;25136:47;;;11864:2;25107:18;;;26382:19;11900:33;26422:14;;;11880:54;11953:12;;;25093:245;25345:416;25545:2;25559:47;;;12204:1;25530:18;;;26382:19;-1:-1;;;26422:14;;;12219:32;12270:12;;;25516:245;25768:222;12367:37;;;25895:2;25880:18;;25866:124

Metadata Hash

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