Contract 0x158db9f05683015c64bd580a22e32d66cac1cb9d

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xbbe6c2fe268e2e7db490c2c21b1a47d4798511452a1893ca5d8eff4489957c7bClaim83111502021-09-16 21:21:1214 hrs 58 mins ago0x8730cc58c234932d9aff458a5153f980a831eac9 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.0001838745
0x2c741c1840c13188f907fbdb1003217b723f8d8674884647151794cb216ab843Claim67833442021-07-25 20:09:5553 days 16 hrs ago0xe80497e27c05c64c6d8244c8a396ec76199b4e86 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.000205758
0xf73fe75efd7e64097434191943b560ec73524480f42e83a87e68ecece6be3bc5Pause66938892021-07-22 17:37:0356 days 18 hrs ago0x786e9a87617bcc3369e0fc6f32e9f34aee78c3a7 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.000073512
0xcc186854281ecc952d59de4aa4684c8136f8d5f6121fdad7737639b4dd961e93Execute Round66929552021-07-22 16:50:2156 days 19 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x3eae511feb7dc7ec211e4e3af9d7183e9ca35d11cc5778fb4d9ac6ee1d1b33e2Execute Round66927552021-07-22 16:40:2156 days 19 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0xb0cd19672530012517085f00be65a12ba143cfb5a94ef37fb469c7bfb274b86aExecute Round66925562021-07-22 16:30:2456 days 19 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x67c482944b10ced0497d660e60f7c9ff30be082fa9518ffe1d167863bed21280Execute Round66923552021-07-22 16:20:2156 days 19 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0xabf87f2aae34c0641df875cf0d8a7038a67770cf177cecc308538e8fe1a47e50Execute Round66921552021-07-22 16:10:2156 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x84253db12b6d92de83bf42645742fb592ed12a120d9349bbd99f6ae4e88a5f34Execute Round66919572021-07-22 16:00:2756 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x6bdc4a649ea4fe775a09e915030e17d37f203b4122081c35d0bc8f9bd4f5bf81Execute Round66917552021-07-22 15:50:2156 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x7f199bfe7309484e0ec83a8f11fff316e6346e4e13fde6b7b6ef33001cafadafExecute Round66915552021-07-22 15:40:2156 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x5e89330b99f38157681bc025b184fa5b64f16bfb958486c92071944d8319a064Execute Round66913562021-07-22 15:30:2456 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x4d579122dcc9b32333fe75986c8a950923f65c981d72daf0005b8247101ec215Execute Round66911542021-07-22 15:20:1856 days 20 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0xa0fe0cfe6cc0cc060b951e1f61e8a70ce4ba98c3b58109fe9ef49fe20424726bExecute Round66909552021-07-22 15:10:2156 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x05a862b7d2b3deba756c470a4d72eb9421f012213e7fadb93dbc77d0f9bdca26Execute Round66907562021-07-22 15:00:2456 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x8702f40eefa48dc721bb30cec45d4ad6c7e019514f66d43bece4516daa9eda8bExecute Round66905552021-07-22 14:50:2156 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x6e55f2e6d46a3753c8c457d6a2606e3ba0e0421aa928ed1d12448cc78f68f0d5Execute Round66903552021-07-22 14:40:2156 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0xb0dffaba55bed7df0e15a5b2b3a212f24ceca72056cf4050a2c51eee9f258071Execute Round66901562021-07-22 14:30:2456 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x2c9f98aae6e210921ea9ab13d567b222c5016d2913b3f62f80f99a779a750418Execute Round66899542021-07-22 14:20:1856 days 21 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00049781475
0x95bf44ff16d60d28a7de344cddf93b265626819760567353322500693d0c59ccExecute Round66897552021-07-22 14:10:2156 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0xc7e0aa9ebb91e6a7f27692e4643688fdefe9728a1b777ee984b565c05a975777Execute Round66895572021-07-22 14:00:2756 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x2156abb326a9c2a383e6d81acfe2174c81f06c52a93781d3bdca94aeacf32a2bExecute Round66893552021-07-22 13:50:2156 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x61da389e5e1f92e937b012e921f3777cea3e94b121d85a501162cd14b82f09f3Execute Round66891552021-07-22 13:40:2156 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x3340b41fa2ceec8d36f7ed22246e6403c50e9e5e7dce606fe51e28224607c98eExecute Round66889562021-07-22 13:30:2456 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
0x34b41f265b778bd315ca019d7dc7348d2ea18103946309bc8e9b355aafe739d0Execute Round66887542021-07-22 13:20:1856 days 22 hrs ago0x7f5e1b7e1f7fcccf473d2adf4d87eb23faba1930 IN  0x158db9f05683015c64bd580a22e32d66cac1cb9d0 HT0.00050150025
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PricePrediction

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-06-13
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-05-28
*/

/**
 *Submitted for verification at BscScan.com on 2021-04-28
*/

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/utils/Pausable.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


pragma solidity >=0.6.0 <0.8.0;

/**
 * @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);

    /**
     * @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);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol


pragma solidity >=0.6.0 <0.8.0;
/**
 * @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 IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
 library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
 
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "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/interfaces/AggregatorV3Interface.sol

pragma solidity >=0.6.0;

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);

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

    function version() external view returns (uint256);

    // getRoundData and latestRoundData should both raise "No data present"
    // if they do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function getRoundData(uint80 _roundId)
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

// File: contracts/BnbPricePrediction.sol

pragma solidity 0.6.12;

contract PricePrediction is Ownable, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    struct Round {
        uint256 epoch;
        uint256 startBlock;
        uint256 lockBlock;
        uint256 endBlock;
        int256 lockPrice;
        int256 closePrice;
        uint256 totalAmount;
        uint256 bullAmount;
        uint256 bearAmount;
        uint256 rewardBaseCalAmount;
        uint256 rewardAmount;
        bool oracleCalled;
    }

    enum Position {Bull, Bear}

    struct BetInfo {
        Position position;
        uint256 amount;
        bool claimed; // default false
    }

    mapping(uint256 => Round) public rounds;
    mapping(uint256 => mapping(address => BetInfo)) public ledger;
    mapping(address => uint256[]) public userRounds;
      // The TOKEN to buy lottery
    IERC20 public NutToken;
    uint256 public currentEpoch;
    uint256 public intervalBlocks;
    uint256 public bufferBlocks;
    address public adminAddress;
    address public operatorAddress;
    uint256 public treasuryAmount;
    AggregatorV3Interface internal oracle;
    uint256 public oracleLatestRoundId;

    uint256 public constant TOTAL_RATE = 100; // 100%
    uint256 public rewardRate = 90; // 90%
    uint256 public treasuryRate = 10; // 10%
    uint256 public minBetAmount;
    uint256 public oracleUpdateAllowance; // seconds

    bool public genesisStartOnce = false;
    bool public genesisLockOnce = false;

    event StartRound(uint256 indexed epoch, uint256 blockNumber);
    event LockRound(uint256 indexed epoch, uint256 blockNumber, int256 price);
    event EndRound(uint256 indexed epoch, uint256 blockNumber, int256 price);
    event BetBull(address indexed sender, uint256 indexed currentEpoch, uint256 amount);
    event BetBear(address indexed sender, uint256 indexed currentEpoch, uint256 amount);
    event Claim(address indexed sender, uint256 indexed currentEpoch, uint256 amount);
    event ClaimTreasury(uint256 amount);
    event RatesUpdated(uint256 indexed epoch, uint256 rewardRate, uint256 treasuryRate);
    event MinBetAmountUpdated(uint256 indexed epoch, uint256 minBetAmount);
    event RewardsCalculated(
        uint256 indexed epoch,
        uint256 rewardBaseCalAmount,
        uint256 rewardAmount,
        uint256 treasuryAmount
    );
    event Pause(uint256 epoch);
    event Unpause(uint256 epoch);

    constructor(
        AggregatorV3Interface _oracle,
        IERC20 _NutToken,
        address _adminAddress,
        address _operatorAddress,
        uint256 _intervalBlocks,
        uint256 _bufferBlocks,
        uint256 _minBetAmount,
        uint256 _oracleUpdateAllowance
    ) public {
        oracle = _oracle;
        NutToken = _NutToken;
        adminAddress = _adminAddress;
        operatorAddress = _operatorAddress;
        intervalBlocks = _intervalBlocks;
        bufferBlocks = _bufferBlocks;
        minBetAmount = _minBetAmount;
        oracleUpdateAllowance = _oracleUpdateAllowance;
    }

    modifier onlyAdmin() {
        require(msg.sender == adminAddress, "admin: wut?");
        _;
    }

    modifier onlyOperator() {
        require(msg.sender == operatorAddress, "operator: wut?");
        _;
    }

    modifier onlyAdminOrOperator() {
        require(msg.sender == adminAddress || msg.sender == operatorAddress, "admin | operator: wut?");
        _;
    }

    modifier notContract() {
        require(!_isContract(msg.sender), "contract not allowed");
        require(msg.sender == tx.origin, "proxy contract not allowed");
        _;
    }

    /**
     * @dev set admin address
     * callable by owner
     */
    function setAdmin(address _adminAddress) external onlyOwner {
        require(_adminAddress != address(0), "Cannot be zero address");
        adminAddress = _adminAddress;
    }

    /**
     * @dev set operator address
     * callable by admin
     */
    function setOperator(address _operatorAddress) external onlyAdmin {
        require(_operatorAddress != address(0), "Cannot be zero address");
        operatorAddress = _operatorAddress;
    }

    /**
     * @dev set interval blocks
     * callable by admin
     */
    function setIntervalBlocks(uint256 _intervalBlocks) external onlyAdmin {
        intervalBlocks = _intervalBlocks;
    }

    /**
     * @dev set buffer blocks
     * callable by admin
     */
    function setBufferBlocks(uint256 _bufferBlocks) external onlyAdmin {
        require(_bufferBlocks <= intervalBlocks, "Cannot be more than intervalBlocks");
        bufferBlocks = _bufferBlocks;
    }

    /**
     * @dev set Oracle address
     * callable by admin
     */
    function setOracle(address _oracle) external onlyAdmin {
        require(_oracle != address(0), "Cannot be zero address");
        oracle = AggregatorV3Interface(_oracle);
    }

    /**
     * @dev set oracle update allowance
     * callable by admin
     */
    function setOracleUpdateAllowance(uint256 _oracleUpdateAllowance) external onlyAdmin {
        oracleUpdateAllowance = _oracleUpdateAllowance;
    }

    /**
     * @dev set reward rate
     * callable by admin
     */
    function setRewardRate(uint256 _rewardRate) external onlyAdmin {
        require(_rewardRate <= TOTAL_RATE, "rewardRate cannot be more than 100%");
        rewardRate = _rewardRate;
        treasuryRate = TOTAL_RATE.sub(_rewardRate);

        emit RatesUpdated(currentEpoch, rewardRate, treasuryRate);
    }

    /**
     * @dev set treasury rate
     * callable by admin
     */
    function setTreasuryRate(uint256 _treasuryRate) external onlyAdmin {
        require(_treasuryRate <= TOTAL_RATE, "treasuryRate cannot be more than 100%");
        rewardRate = TOTAL_RATE.sub(_treasuryRate);
        treasuryRate = _treasuryRate;

        emit RatesUpdated(currentEpoch, rewardRate, treasuryRate);
    }

    /**
     * @dev set minBetAmount
     * callable by admin
     */
    function setMinBetAmount(uint256 _minBetAmount) external onlyAdmin {
        minBetAmount = _minBetAmount;

        emit MinBetAmountUpdated(currentEpoch, minBetAmount);
    }

    /**
     * @dev Start genesis round
     */
    function genesisStartRound() external onlyOperator whenNotPaused {
        require(!genesisStartOnce, "Can only run genesisStartRound once");

        currentEpoch = currentEpoch + 1;
        _startRound(currentEpoch);
        genesisStartOnce = true;
    }

    /**
     * @dev Lock genesis round
     */
    function genesisLockRound() external onlyOperator whenNotPaused {
        
        require(genesisStartOnce, "Can only run after genesisStartRound is triggered");
        require(!genesisLockOnce, "Can only run genesisLockRound once");
        require(
            block.number <= rounds[currentEpoch].lockBlock.add(bufferBlocks),
            "Can only lock round within bufferBlocks"
        );

        int256 currentPrice = _getPriceFromOracle();
        _safeLockRound(currentEpoch, currentPrice);

        currentEpoch = currentEpoch + 1;
        _startRound(currentEpoch);
        genesisLockOnce = true;
    }

    /**
     * @dev Start the next round n, lock price for round n-1, end round n-2
     */
    function executeRound() external onlyOperator whenNotPaused {
        require(
            genesisStartOnce && genesisLockOnce,
            "Can only run after genesisStartRound and genesisLockRound is triggered"
        );

        int256 currentPrice = _getPriceFromOracle();
        // CurrentEpoch refers to previous round (n-1)
        _safeLockRound(currentEpoch, currentPrice);
        _safeEndRound(currentEpoch - 1, currentPrice);
        _calculateRewards(currentEpoch - 1);

        // Increment currentEpoch to current round (n)
        currentEpoch = currentEpoch + 1;
        _safeStartRound(currentEpoch);
    }

    /**
     * @dev Bet bear position
     */
    function betBear(uint256 amount) external whenNotPaused notContract {
        require(_bettable(currentEpoch), "Round not bettable");
        require(amount >= minBetAmount, "Bet amount must be greater than minBetAmount");
        require(ledger[currentEpoch][msg.sender].amount == 0, "Can only bet once per round");

        // Update round data
        Round storage round = rounds[currentEpoch];
        round.totalAmount = round.totalAmount.add(amount);
        round.bearAmount = round.bearAmount.add(amount);

        // Update user data
        BetInfo storage betInfo = ledger[currentEpoch][msg.sender];
        betInfo.position = Position.Bear;
        betInfo.amount = amount;
        userRounds[msg.sender].push(currentEpoch);
        
        NutToken.safeTransferFrom(address(msg.sender), address(this), amount);
        emit BetBear(msg.sender, currentEpoch, amount);
    }

    /**
     * @dev Bet bull position
     */
    function betBull(uint256 amount) external whenNotPaused notContract {
        require(_bettable(currentEpoch), "Round not bettable");
        require(amount >= minBetAmount, "Bet amount must be greater than minBetAmount");
        require(ledger[currentEpoch][msg.sender].amount == 0, "Can only bet once per round");

        // Update round data
        Round storage round = rounds[currentEpoch];
        round.totalAmount = round.totalAmount.add(amount);
        round.bullAmount = round.bullAmount.add(amount);

        // Update user data
        BetInfo storage betInfo = ledger[currentEpoch][msg.sender];
        betInfo.position = Position.Bull;
        betInfo.amount = amount;
        userRounds[msg.sender].push(currentEpoch);
        NutToken.safeTransferFrom(address(msg.sender), address(this), amount);
        emit BetBull(msg.sender, currentEpoch, amount);
    }

    /**
     * @dev Claim reward
     */
    function claim(uint256 epoch) external notContract {
        require(rounds[epoch].startBlock != 0, "Round has not started");
        require(block.number > rounds[epoch].endBlock, "Round has not ended");
        require(!ledger[epoch][msg.sender].claimed, "Rewards claimed");

        uint256 reward;
        // Round valid, claim rewards
        if (rounds[epoch].oracleCalled) {
            require(claimable(epoch, msg.sender), "Not eligible for claim");
            Round memory round = rounds[epoch];
            reward = ledger[epoch][msg.sender].amount.mul(round.rewardAmount).div(round.rewardBaseCalAmount);
        }
        // Round invalid, refund bet amount
        else {
            require(refundable(epoch, msg.sender), "Not eligible for refund");
            reward = ledger[epoch][msg.sender].amount;
        }

        BetInfo storage betInfo = ledger[epoch][msg.sender];
        betInfo.claimed = true;
        
        NutToken.safeTransfer(address(msg.sender), reward);

        emit Claim(msg.sender, epoch, reward);
    }

    /**
     * @dev Claim all rewards in treasury
     * callable by admin
     */
    function claimTreasury() external onlyAdmin {
        uint256 currentTreasuryAmount = treasuryAmount;
        treasuryAmount = 0;
        NutToken.safeTransfer(adminAddress, currentTreasuryAmount);
        emit ClaimTreasury(currentTreasuryAmount);
    }

    /**
     * @dev Return round epochs that a user has participated
     */
    function getUserRounds(
        address user,
        uint256 cursor,
        uint256 size
    ) external view returns (uint256[] memory, uint256) {
        uint256 length = size;
        if (length > userRounds[user].length - cursor) {
            length = userRounds[user].length - cursor;
        }

        uint256[] memory values = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            values[i] = userRounds[user][cursor + i];
        }

        return (values, cursor + length);
    }

    /**
     * @dev called by the admin to pause, triggers stopped state
     */
    function pause() public onlyAdminOrOperator whenNotPaused {
        _pause();

        emit Pause(currentEpoch);
    }

    /**
     * @dev called by the admin to unpause, returns to normal state
     * Reset genesis state. Once paused, the rounds would need to be kickstarted by genesis
     */
    function unpause() public onlyAdmin whenPaused {
        genesisStartOnce = false;
        genesisLockOnce = false;
        _unpause();

        emit Unpause(currentEpoch);
    }

    /**
     * @dev Get the claimable stats of specific epoch and user account
     */
    function claimable(uint256 epoch, address user) public view returns (bool) {
        BetInfo memory betInfo = ledger[epoch][user];
        Round memory round = rounds[epoch];
        if (round.lockPrice == round.closePrice) {
            return false;
        }
        return
            round.oracleCalled &&
            ((round.closePrice > round.lockPrice && betInfo.position == Position.Bull) ||
                (round.closePrice < round.lockPrice && betInfo.position == Position.Bear));
    }

    /**
     * @dev Get the refundable stats of specific epoch and user account
     */
    function refundable(uint256 epoch, address user) public view returns (bool) {
        BetInfo memory betInfo = ledger[epoch][user];
        Round memory round = rounds[epoch];
        return !round.oracleCalled && block.number > round.endBlock.add(bufferBlocks) && betInfo.amount != 0;
    }

    /**
     * @dev Start round
     * Previous round n-2 must end
     */
    function _safeStartRound(uint256 epoch) internal {
        require(genesisStartOnce, "Can only run after genesisStartRound is triggered");
        require(rounds[epoch - 2].endBlock != 0, "Can only start round after round n-2 has ended");
        require(block.number >= rounds[epoch - 2].endBlock, "Can only start new round after round n-2 endBlock");
        _startRound(epoch);
    }

    function _startRound(uint256 epoch) internal {
        Round storage round = rounds[epoch];
        round.startBlock = block.number;
        round.lockBlock = block.number.add(intervalBlocks);
        round.endBlock = block.number.add(intervalBlocks * 2);
        round.epoch = epoch;
        round.totalAmount = 0;

        emit StartRound(epoch, block.number);
    }

    /**
     * @dev Lock round
     */
    function _safeLockRound(uint256 epoch, int256 price) internal {
        require(rounds[epoch].startBlock != 0, "Can only lock round after round has started");
        require(block.number >= rounds[epoch].lockBlock, "Can only lock round after lockBlock");
        require(block.number <= rounds[epoch].lockBlock.add(bufferBlocks), "Can only lock round within bufferBlocks");
        _lockRound(epoch, price);
    }

    function _lockRound(uint256 epoch, int256 price) internal {
        Round storage round = rounds[epoch];
        round.lockPrice = price;

        emit LockRound(epoch, block.number, round.lockPrice);
    }

    /**
     * @dev End round
     */
    function _safeEndRound(uint256 epoch, int256 price) internal {
        require(rounds[epoch].lockBlock != 0, "Can only end round after round has locked");
        require(block.number >= rounds[epoch].endBlock, "Can only end round after endBlock");
        require(block.number <= rounds[epoch].endBlock.add(bufferBlocks), "Can only end round within bufferBlocks");
        _endRound(epoch, price);
    }

    function _endRound(uint256 epoch, int256 price) internal {
        Round storage round = rounds[epoch];
        round.closePrice = price;
        round.oracleCalled = true;

        emit EndRound(epoch, block.number, round.closePrice);
    }

    /**
     * @dev Calculate rewards for round
     */
    function _calculateRewards(uint256 epoch) internal {
        require(rewardRate.add(treasuryRate) == TOTAL_RATE, "rewardRate and treasuryRate must add up to TOTAL_RATE");
        require(rounds[epoch].rewardBaseCalAmount == 0 && rounds[epoch].rewardAmount == 0, "Rewards calculated");
        Round storage round = rounds[epoch];
        uint256 rewardBaseCalAmount;
        uint256 rewardAmount;
        uint256 treasuryAmt;
        // Bull wins
        if (round.closePrice > round.lockPrice) {
            rewardBaseCalAmount = round.bullAmount;
            rewardAmount = round.totalAmount.mul(rewardRate).div(TOTAL_RATE);
            treasuryAmt = round.totalAmount.mul(treasuryRate).div(TOTAL_RATE);
        }
        // Bear wins
        else if (round.closePrice < round.lockPrice) {
            rewardBaseCalAmount = round.bearAmount;
            rewardAmount = round.totalAmount.mul(rewardRate).div(TOTAL_RATE);
            treasuryAmt = round.totalAmount.mul(treasuryRate).div(TOTAL_RATE);
        }
        // House wins
        else {
            rewardBaseCalAmount = 0;
            rewardAmount = 0;
            treasuryAmt = round.totalAmount;
        }
        round.rewardBaseCalAmount = rewardBaseCalAmount;
        round.rewardAmount = rewardAmount;

        // Add to treasury
        treasuryAmount = treasuryAmount.add(treasuryAmt);

        emit RewardsCalculated(epoch, rewardBaseCalAmount, rewardAmount, treasuryAmt);
    }

    /**
     * @dev Get latest recorded price from oracle
     * If it falls below allowed buffer or has not updated, it would be invalid
     */
    function _getPriceFromOracle() internal returns (int256) {
        uint256 leastAllowedTimestamp = block.timestamp.add(oracleUpdateAllowance);
        (uint80 roundId, int256 price, , uint256 timestamp, ) = oracle.latestRoundData();
        require(timestamp <= leastAllowedTimestamp, "Oracle update exceeded max timestamp allowance");
        require(roundId > oracleLatestRoundId, "Oracle update roundId must be larger than oracleLatestRoundId");
        oracleLatestRoundId = uint256(roundId);
        return price;
    }

    function _safeTransferBNB(address to, uint256 value) internal {
        (bool success, ) = to.call{gas: 23000, value: value}("");
        require(success, "TransferHelper: BNB_TRANSFER_FAILED");
    }

    function _isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }

    /**
     * @dev Determine if a round is valid for receiving bets
     * Round must have started and locked
     * Current block must be within startBlock and endBlock
     */
    function _bettable(uint256 epoch) internal view returns (bool) {
        return
            rounds[epoch].startBlock != 0 &&
            rounds[epoch].lockBlock != 0 &&
            block.number > rounds[epoch].startBlock &&
            block.number < rounds[epoch].lockBlock;
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract AggregatorV3Interface","name":"_oracle","type":"address"},{"internalType":"contract IERC20","name":"_NutToken","type":"address"},{"internalType":"address","name":"_adminAddress","type":"address"},{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"uint256","name":"_intervalBlocks","type":"uint256"},{"internalType":"uint256","name":"_bufferBlocks","type":"uint256"},{"internalType":"uint256","name":"_minBetAmount","type":"uint256"},{"internalType":"uint256","name":"_oracleUpdateAllowance","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"currentEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetBear","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"currentEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetBull","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"currentEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"int256","name":"price","type":"int256"}],"name":"EndRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"int256","name":"price","type":"int256"}],"name":"LockRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBetAmount","type":"uint256"}],"name":"MinBetAmountUpdated","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":"uint256","name":"epoch","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryRate","type":"uint256"}],"name":"RatesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardBaseCalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryAmount","type":"uint256"}],"name":"RewardsCalculated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"StartRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NutToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"betBear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"betBull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bufferBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisLockOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisLockRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisStartOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisStartRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"cursor","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getUserRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"intervalBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"ledger","outputs":[{"internalType":"enum PricePrediction.Position","name":"position","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleLatestRoundId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleUpdateAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"refundable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"lockBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"int256","name":"lockPrice","type":"int256"},{"internalType":"int256","name":"closePrice","type":"int256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"bullAmount","type":"uint256"},{"internalType":"uint256","name":"bearAmount","type":"uint256"},{"internalType":"uint256","name":"rewardBaseCalAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"bool","name":"oracleCalled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bufferBlocks","type":"uint256"}],"name":"setBufferBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_intervalBlocks","type":"uint256"}],"name":"setIntervalBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oracleUpdateAllowance","type":"uint256"}],"name":"setOracleUpdateAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardRate","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryRate","type":"uint256"}],"name":"setTreasuryRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052605a600d55600a600e556011805461ffff191690553480156200002657600080fd5b50604051620037a2380380620037a283398181016040526101008110156200004d57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e09097015195969495939492939192909160006200008c6200014f565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19169055600b80546001600160a01b03998a166001600160a01b03199182161790915560048054988a1698821698909817909755600880549689169688169690961790955560098054949097169390951692909217909455600693909355600792909255600f5560105562000153565b3390565b61363f80620001636000396000f3fe608060405234801561001057600080fd5b50600436106102685760003560e01c80638456cb5911610151578063cf2f5039116100c3578063e4b7251611610087578063e4b72516146106ac578063ec324703146106b4578063f2fde38b146106bc578063f7fdec28146106e2578063fa968eea146106ea578063fc6f9468146106f257610268565b8063cf2f503914610636578063d0bf9c5414610653578063d9d55eac14610670578063da5642cd14610678578063dd1f75961461068057610268565b80639e447fc6116101155780639e447fc614610585578063a067455b146105a2578063a0c7f71c146105bf578063aa6b873a146105eb578063b29c299b14610608578063b3ab15fb1461061057610268565b80638456cb59146104625780638c65c81f1461046a5780638da5cb5b146104e8578063951fd600146104f05780639780a7521461057d57610268565b80635c975abb116101ea5780637285c58b116101ae5780637285c58b1461039b57806376671808146103f85780637adbf973146104005780637b0a47ee146104265780637b3205f51461042e5780637bf412541461043657610268565b80635c975abb1461034057806360554011146103485780636c18859314610350578063704b6c021461036d578063715018a61461039357610268565b8063368acb0911610231578063368acb09146102ee578063379607f5146102f65780633f4ba83a14610313578063452fd75a1461031b57806357fb096f1461032357610268565b80623bdc741461026d5780630f74174f1461027757806310c0ee6414610293578063127effb2146102b05780631ec9f34b146102d4575b600080fd5b6102756106fa565b005b61027f6107a3565b604080519115158252519081900360200190f35b610275600480360360208110156102a957600080fd5b50356107b1565b6102b8610844565b604080516001600160a01b039092168252519081900360200190f35b6102dc610853565b60408051918252519081900360200190f35b6102dc610859565b6102756004803603602081101561030c57600080fd5b503561085f565b610275610c56565b610275610d3d565b6102756004803603602081101561033957600080fd5b5035610e3f565b61027f61110f565b6102dc61111f565b6102756004803603602081101561036657600080fd5b5035611125565b6102756004803603602081101561038357600080fd5b50356001600160a01b03166111b0565b61027561129a565b6103c7600480360360408110156103b157600080fd5b50803590602001356001600160a01b0316611358565b604051808460018111156103d757fe5b81526020018381526020018215158152602001935050505060405180910390f35b6102dc611387565b6102756004803603602081101561041657600080fd5b50356001600160a01b031661138d565b6102dc611450565b610275611456565b61027f6004803603604081101561044c57600080fd5b50803590602001356001600160a01b0316611593565b6102756116df565b6104876004803603602081101561048057600080fd5b50356117d8565b604080519c8d5260208d019b909b528b8b019990995260608b019790975260808a019590955260a089019390935260c088019190915260e0870152610100860152610120850152610140840152151561016083015251908190036101800190f35b6102b861183b565b6105226004803603606081101561050657600080fd5b506001600160a01b03813516906020810135906040013561184a565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015610568578181015183820152602001610550565b50505050905001935050505060405180910390f35b6102dc61193d565b6102756004803603602081101561059b57600080fd5b5035611943565b610275600480360360208110156105b857600080fd5b5035611a2a565b61027f600480360360408110156105d557600080fd5b50803590602001356001600160a01b0316611a7c565b6102756004803603602081101561060157600080fd5b5035611c0a565b6102dc611edd565b6102756004803603602081101561062657600080fd5b50356001600160a01b0316611ee2565b6102756004803603602081101561064c57600080fd5b5035611fa5565b6102756004803603602081101561066957600080fd5b5035611ff7565b6102756120dc565b6102b861229e565b6102dc6004803603604081101561069657600080fd5b506001600160a01b0381351690602001356122ad565b6102dc6122db565b6102dc6122e1565b610275600480360360208110156106d257600080fd5b50356001600160a01b03166122e7565b61027f6123fb565b6102dc612404565b6102b861240a565b6008546001600160a01b03163314610747576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600a8054600090915560085460045461076d916001600160a01b03918216911683612419565b6040805182815290517f609175abb7f12481e4f200d1ef4fc834e6caac3d9eadba42d664352f6d0932ca9181900360200190a150565b601154610100900460ff1681565b6008546001600160a01b031633146107fe576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60065481111561083f5760405162461bcd60e51b81526004018080602001828103825260228152602001806132636022913960400191505060405180910390fd5b600755565b6009546001600160a01b031681565b60065481565b600a5481565b61086833612470565b156108b1576040805162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015290519081900360640190fd5b333214610902576040805162461bcd60e51b815260206004820152601a6024820152791c1c9bde1e4818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b6000818152600160208190526040909120015461095e576040805162461bcd60e51b8152602060048201526015602482015274149bdd5b99081a185cc81b9bdd081cdd185c9d1959605a1b604482015290519081900360640190fd5b60008181526001602052604090206003015443116109b9576040805162461bcd60e51b8152602060048201526013602482015272149bdd5b99081a185cc81b9bdd08195b991959606a1b604482015290519081900360640190fd5b6000818152600260208181526040808420338552909152909120015460ff1615610a1c576040805162461bcd60e51b815260206004820152600f60248201526e14995dd85c991cc818db185a5b5959608a1b604482015290519081900360640190fd5b6000818152600160205260408120600b015460ff1615610b5f57610a408233611a7c565b610a8a576040805162461bcd60e51b81526020600482015260166024820152754e6f7420656c696769626c6520666f7220636c61696d60501b604482015290519081900360640190fd5b610a926131dd565b506000828152600160208181526040808420815161018081018352815481528185015481850152600280830154828501526003830154606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015461010083015260098301546101208301819052600a8401546101408401819052600b9094015460ff16151561016084015289885290855283872033885290945291909420909201549192610b5792610b5191612476565b906124d6565b915050610bd9565b610b698233611593565b610bba576040805162461bcd60e51b815260206004820152601760248201527f4e6f7420656c696769626c6520666f7220726566756e64000000000000000000604482015290519081900360640190fd5b5060008181526002602090815260408083203384529091529020600101545b6000828152600260208181526040808420338086529252909220908101805460ff191660011790556004549091610c1a916001600160a01b03169084612419565b604080518381529051849133917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79181900360200190a3505050565b6008546001600160a01b03163314610ca3576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b610cab61110f565b610cf3576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6011805461ffff19169055610d0661253d565b60055460408051918252517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab79181900360200190a1565b6009546001600160a01b03163314610d8d576040805162461bcd60e51b815260206004820152600e60248201526d6f70657261746f723a207775743f60901b604482015290519081900360640190fd5b610d9561110f565b15610dda576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60115460ff1615610e1c5760405162461bcd60e51b815260040180806020018281038252602381526020018061348c6023913960400191505060405180910390fd5b6005805460010190819055610e30906125e0565b6011805460ff19166001179055565b610e4761110f565b15610e8c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b610e9533612470565b15610ede576040805162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015290519081900360640190fd5b333214610f2f576040805162461bcd60e51b815260206004820152601a6024820152791c1c9bde1e4818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b610f3a600554612667565b610f80576040805162461bcd60e51b8152602060048201526012602482015271526f756e64206e6f74206265747461626c6560701b604482015290519081900360640190fd5b600f54811015610fc15760405162461bcd60e51b815260040180806020018281038252602c8152602001806133ba602c913960400191505060405180910390fd5b600554600090815260026020908152604080832033845290915290206001015415611033576040805162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015290519081900360640190fd5b6005546000908152600160205260409020600681015461105390836126d3565b6006820155600781015461106790836126d3565b600782015560058054600090815260026020908152604080832033808552908352818420805460ff191681556001808201899055600385529285209554865493840187559585529290932001929092556004546110d1916001600160a01b0390911690308661272d565b60055460408051858152905133917f438122d8cff518d18388099a5181f0d17a12b4f1b55faedf6e4a6acee0060c12919081900360200190a3505050565b600054600160a01b900460ff1690565b60105481565b6008546001600160a01b03163314611172576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600f8190556005546040805183815290517f82480e97991520549ac4b5d0e1d97edb3bfac2666202923b6903d2a953dc76089181900360200190a250565b6111b861278d565b6001600160a01b03166111c961183b565b6001600160a01b031614611224576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116611278576040805162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6112a261278d565b6001600160a01b03166112b361183b565b6001600160a01b03161461130e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002602081815260009384526040808520909152918352912080546001820154919092015460ff928316921683565b60055481565b6008546001600160a01b031633146113da576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03811661142e576040805162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b6009546001600160a01b031633146114a6576040805162461bcd60e51b815260206004820152600e60248201526d6f70657261746f723a207775743f60901b604482015290519081900360640190fd5b6114ae61110f565b156114f3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60115460ff16801561150c5750601154610100900460ff165b6115475760405162461bcd60e51b81526004018080602001828103825260468152602001806134d26046913960600191505060405180910390fd5b6000611551612791565b905061155f600554826128e1565b61156e600160055403826129e9565b61157c600160055403612aec565b600580546001019081905561159090612cd0565b50565b600061159d613240565b60008481526002602090815260408083206001600160a01b0387168452909152908190208151606081019092528054829060ff1660018111156115dc57fe5b60018111156115e757fe5b81526001820154602082015260029091015460ff161515604090910152905061160e6131dd565b506000848152600160208181526040928390208351610180810185528154815292810154918301919091526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b9091015460ff1615801561016083018190526116c5575060075460608201516116c2916126d3565b43115b80156116d45750602082015115155b925050505b92915050565b6008546001600160a01b031633148061170257506009546001600160a01b031633145b61174c576040805162461bcd60e51b815260206004820152601660248201527561646d696e207c206f70657261746f723a207775743f60501b604482015290519081900360640190fd5b61175461110f565b15611799576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6117a1612dc1565b60055460408051918252517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d9181900360200190a1565b600160208190526000918252604090912080549181015460028201546003830154600484015460058501546006860154600787015460088801546009890154600a8a0154600b909a01549899979896979596949593949293919290919060ff168c565b6000546001600160a01b031690565b6001600160a01b03831660009081526003602052604081205460609190839085900381111561189157506001600160a01b0385166000908152600360205260409020548490035b60608167ffffffffffffffff811180156118aa57600080fd5b506040519080825280602002602001820160405280156118d4578160200160208202803683370190505b50905060005b82811015611932576001600160a01b0388166000908152600360205260409020805488830190811061190857fe5b906000526020600020015482828151811061191f57fe5b60209081029190910101526001016118da565b509694019450505050565b60075481565b6008546001600160a01b03163314611990576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60648111156119d05760405162461bcd60e51b81526004018080602001828103825260238152602001806135186023913960400191505060405180910390fd5b600d8190556119e0606482612e4a565b600e819055600554600d54604080519182526020820193909352825191927f023010bc68e7f4c0be9887f513c570c7a0f5f511b9716abccd42bf3b8943532b92918290030190a250565b6008546001600160a01b03163314611a77576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600655565b6000611a86613240565b60008481526002602090815260408083206001600160a01b0387168452909152908190208151606081019092528054829060ff166001811115611ac557fe5b6001811115611ad057fe5b81526001820154602082015260029091015460ff1615156040909101529050611af76131dd565b5060008481526001602081815260409283902083516101808101855281548152928101549183019190915260028101549282019290925260038201546060820152600482015460808201819052600583015460a08301819052600684015460c0840152600784015460e084015260088401546101008401526009840154610120840152600a840154610140840152600b9093015460ff16151561016083015290911415611ba9576000925050506116d9565b80610160015180156116d4575080608001518160a00151138015611bd95750600082516001811115611bd757fe5b145b806116d4575080608001518160a001511280156116d45750600182516001811115611c0057fe5b1495945050505050565b611c1261110f565b15611c57576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b611c6033612470565b15611ca9576040805162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015290519081900360640190fd5b333214611cfa576040805162461bcd60e51b815260206004820152601a6024820152791c1c9bde1e4818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b611d05600554612667565b611d4b576040805162461bcd60e51b8152602060048201526012602482015271526f756e64206e6f74206265747461626c6560701b604482015290519081900360640190fd5b600f54811015611d8c5760405162461bcd60e51b815260040180806020018281038252602c8152602001806133ba602c913960400191505060405180910390fd5b600554600090815260026020908152604080832033845290915290206001015415611dfe576040805162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015290519081900360640190fd5b60055460009081526001602052604090206006810154611e1e90836126d3565b60068201556008810154611e3290836126d3565b600882015560058054600090815260026020908152604080832033808552908352818420805460ff19166001908117825580820189905560038552928520955486549384018755958552929093200192909255600454611e9f916001600160a01b0390911690308661272d565b60055460408051858152905133917f0d8c1fe3e67ab767116a81f122b83c2557a8c2564019cb7c4f83de1aeb1f1f0d919081900360200190a3505050565b606481565b6008546001600160a01b03163314611f2f576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b038116611f83576040805162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314611ff2576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601055565b6008546001600160a01b03163314612044576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60648111156120845760405162461bcd60e51b81526004018080602001828103825260258152602001806135866025913960400191505060405180910390fd5b61208f606482612e4a565b600d819055600e8290556005546040805192835260208301849052805191927f023010bc68e7f4c0be9887f513c570c7a0f5f511b9716abccd42bf3b8943532b929081900390910190a250565b6009546001600160a01b0316331461212c576040805162461bcd60e51b815260206004820152600e60248201526d6f70657261746f723a207775743f60901b604482015290519081900360640190fd5b61213461110f565b15612179576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60115460ff166121ba5760405162461bcd60e51b81526004018080602001828103825260318152602001806132b06031913960400191505060405180910390fd5b601154610100900460ff16156122015760405162461bcd60e51b81526004018080602001828103825260228152602001806133986022913960400191505060405180910390fd5b600754600554600090815260016020526040902060020154612222916126d3565b4311156122605760405162461bcd60e51b81526004018080602001828103825260278152602001806133e66027913960400191505060405180910390fd5b600061226a612791565b9050612278600554826128e1565b600580546001019081905561228c906125e0565b506011805461ff001916610100179055565b6004546001600160a01b031681565b600360205281600052604060002081815481106122c657fe5b90600052602060002001600091509150505481565b600e5481565b600c5481565b6122ef61278d565b6001600160a01b031661230061183b565b6001600160a01b03161461235b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123a05760405162461bcd60e51b81526004018080602001828103825260268152602001806132e16026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115460ff1681565b600f5481565b6008546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261246b908490612ea7565b505050565b3b151590565b600082612485575060006116d9565b8282028284828161249257fe5b04146124cf5760405162461bcd60e51b81526004018080602001828103825260218152602001806134426021913960400191505060405180910390fd5b9392505050565b600080821161252c576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161253557fe5b049392505050565b61254561110f565b61258d576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125c361278d565b604080516001600160a01b039092168252519081900360200190a1565b6000818152600160208190526040909120439181018290556006549091612606916126d3565b60028083019190915560065461261e914391026126d3565b60038201558181556000600682015560408051438152905183917f0e5543feb86a4cd302f2b88b26c42be2d1673013a34e1f98bd6d524dd3b4ab41919081900360200190a25050565b60008181526001602081905260408220015415801590612697575060008281526001602052604090206002015415155b80156126b457506000828152600160208190526040909120015443115b80156116d9575050600090815260016020526040902060020154431090565b6000828201838110156124cf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612787908590612ea7565b50505050565b3390565b6000806127a9601054426126d390919063ffffffff16565b90506000806000600b60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d60a081101561282857600080fd5b508051602082015160609092015190945090925090508381111561287d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806135dc602e913960400191505060405180910390fd5b600c548369ffffffffffffffffffff16116128c95760405162461bcd60e51b815260040180806020018281038252603d815260200180613335603d913960400191505060405180910390fd5b5069ffffffffffffffffffff909116600c5591505090565b6000828152600160208190526040909120015461292f5760405162461bcd60e51b815260040180806020018281038252602b815260200180613285602b913960400191505060405180910390fd5b60008281526001602052604090206002015443101561297f5760405162461bcd60e51b81526004018080602001828103825260238152602001806134af6023913960400191505060405180910390fd5b60075460008381526001602052604090206002015461299d916126d3565b4311156129db5760405162461bcd60e51b81526004018080602001828103825260278152602001806133e66027913960400191505060405180910390fd5b6129e58282612f58565b5050565b600082815260016020526040902060020154612a365760405162461bcd60e51b81526004018080602001828103825260298152602001806134636029913960400191505060405180910390fd5b600082815260016020526040902060030154431015612a865760405162461bcd60e51b815260040180806020018281038252602181526020018061353b6021913960400191505060405180910390fd5b600754600083815260016020526040902060030154612aa4916126d3565b431115612ae25760405162461bcd60e51b81526004018080602001828103825260268152602001806133726026913960400191505060405180910390fd5b6129e58282612fb2565b6064612b05600e54600d546126d390919063ffffffff16565b14612b415760405162461bcd60e51b815260040180806020018281038252603581526020018061340d6035913960400191505060405180910390fd5b600081815260016020526040902060090154158015612b6f57506000818152600160205260409020600a0154155b612bb5576040805162461bcd60e51b815260206004820152601260248201527114995dd85c991cc818d85b18dd5b185d195960721b604482015290519081900360640190fd5b600081815260016020526040812060048101546005820154919291829182911315612c265783600701549250612bff6064610b51600d54876006015461247690919063ffffffff16565b9150612c1f6064610b51600e54876006015461247690919063ffffffff16565b9050612c69565b836004015484600501541215612c5b5783600801549250612bff6064610b51600d54876006015461247690919063ffffffff16565b505050600681015460009081905b60098401839055600a80850183905554612c8390826126d3565b600a556040805184815260208101849052808201839052905186917f6dfdfcb09c8804d0058826cd2539f1acfbe3cb887c9be03d928035bce0f1a58d919081900360600190a25050505050565b60115460ff16612d115760405162461bcd60e51b81526004018080602001828103825260318152602001806132b06031913960400191505060405180910390fd5b6001198101600090815260016020526040902060030154612d635760405162461bcd60e51b815260040180806020018281038252602e815260200180613307602e913960400191505060405180910390fd5b6001198101600090815260016020526040902060030154431015612db85760405162461bcd60e51b81526004018080602001828103825260318152602001806135ab6031913960400191505060405180910390fd5b611590816125e0565b612dc961110f565b15612e0e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c361278d565b600082821115612ea1576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6060612efc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301b9092919063ffffffff16565b80519091501561246b57808060200190516020811015612f1b57600080fd5b505161246b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061355c602a913960400191505060405180910390fd5b6000828152600160209081526040918290206004810184905582514381529182018490528251909285927f482e76a65b448a42deef26e99e58fb20c85e26f075defff8df6aa80459b39006929081900390910190a2505050565b60008281526001602081815260409283902060058101859055600b8101805460ff191690931790925582514381529081018490528251919285927fb6ff1fe915db84788cbbbc017f0d2bef9485fad9fd0bd8ce9340fde0d8410dd89281900390910190a2505050565b606061302a8484600085613032565b949350505050565b606061303d85612470565b61308e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106130cd5780518252601f1990920191602091820191016130ae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461312f576040519150601f19603f3d011682016040523d82523d6000602084013e613134565b606091505b5091509150811561314857915061302a9050565b8051156131585780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156131a257818101518382015260200161318a565b50505050905090810190601f1680156131cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60405180610180016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b604080516060810190915280600081526000602082018190526040909101529056fe43616e6e6f74206265206d6f7265207468616e20696e74657276616c426c6f636b7343616e206f6e6c79206c6f636b20726f756e6420616674657220726f756e6420686173207374617274656443616e206f6e6c792072756e2061667465722067656e657369735374617274526f756e64206973207472696767657265644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e206f6e6c7920737461727420726f756e6420616674657220726f756e64206e2d322068617320656e6465644f7261636c652075706461746520726f756e644964206d757374206265206c6172676572207468616e206f7261636c654c6174657374526f756e64496443616e206f6e6c7920656e6420726f756e642077697468696e20627566666572426c6f636b7343616e206f6e6c792072756e2067656e657369734c6f636b526f756e64206f6e636542657420616d6f756e74206d7573742062652067726561746572207468616e206d696e426574416d6f756e7443616e206f6e6c79206c6f636b20726f756e642077697468696e20627566666572426c6f636b737265776172645261746520616e6420747265617375727952617465206d7573742061646420757020746f20544f54414c5f52415445536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c7920656e6420726f756e6420616674657220726f756e6420686173206c6f636b656443616e206f6e6c792072756e2067656e657369735374617274526f756e64206f6e636543616e206f6e6c79206c6f636b20726f756e64206166746572206c6f636b426c6f636b43616e206f6e6c792072756e2061667465722067656e657369735374617274526f756e6420616e642067656e657369734c6f636b526f756e6420697320747269676765726564726577617264526174652063616e6e6f74206265206d6f7265207468616e203130302543616e206f6e6c7920656e6420726f756e6420616674657220656e64426c6f636b5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565647472656173757279526174652063616e6e6f74206265206d6f7265207468616e203130302543616e206f6e6c79207374617274206e657720726f756e6420616674657220726f756e64206e2d3220656e64426c6f636b4f7261636c6520757064617465206578636565646564206d61782074696d657374616d7020616c6c6f77616e6365a2646970667358221220ca84f27ada20b09ce1b93bab262620706fff1c7d46e3c2352207470d3ef6685464736f6c634300060c0033000000000000000000000000f54ca186d6a66986ae8c80ada664557dc68e81c90000000000000000000000004f0a338dfa1c9369f62109c9022042e1f0ae479b000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a7000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a700000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000012c

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

000000000000000000000000f54ca186d6a66986ae8c80ada664557dc68e81c90000000000000000000000004f0a338dfa1c9369f62109c9022042e1f0ae479b000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a7000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a700000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000012c

-----Decoded View---------------
Arg [0] : _oracle (address): 0xf54ca186d6a66986ae8c80ada664557dc68e81c9
Arg [1] : _NutToken (address): 0x4f0a338dfa1c9369f62109c9022042e1f0ae479b
Arg [2] : _adminAddress (address): 0x786e9a87617bcc3369e0fc6f32e9f34aee78c3a7
Arg [3] : _operatorAddress (address): 0x786e9a87617bcc3369e0fc6f32e9f34aee78c3a7
Arg [4] : _intervalBlocks (uint256): 1000
Arg [5] : _bufferBlocks (uint256): 80
Arg [6] : _minBetAmount (uint256): 1000000000000000
Arg [7] : _oracleUpdateAllowance (uint256): 300

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000f54ca186d6a66986ae8c80ada664557dc68e81c9
Arg [1] : 0000000000000000000000004f0a338dfa1c9369f62109c9022042e1f0ae479b
Arg [2] : 000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a7
Arg [3] : 000000000000000000000000786e9a87617bcc3369e0fc6f32e9f34aee78c3a7
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [6] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000012c


Deployed ByteCode Sourcemap

26805:19018:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37962:259;;;:::i;:::-;;28269:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;31303:203;;;;;;;;;;;;;;;;-1:-1:-1;31303:203:0;;:::i;27831:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;27831:30:0;;;;;;;;;;;;;;27727:29;;;:::i;:::-;;;;;;;;;;;;;;;;27868;;;:::i;36797:1070::-;;;;;;;;;;;;;;;;-1:-1:-1;36797:1070:0;;:::i;39246:184::-;;;:::i;33135:263::-;;;:::i;35850:895::-;;;;;;;;;;;;;;;;-1:-1:-1;35850:895:0;;:::i;12117:86::-;;;:::i;28170:36::-;;;:::i;32897:179::-;;;;;;;;;;;;;;;;-1:-1:-1;32897:179:0;;:::i;30552:180::-;;;;;;;;;;;;;;;;-1:-1:-1;30552:180:0;-1:-1:-1;;;;;30552:180:0;;:::i;10481:148::-;;;:::i;27507:61::-;;;;;;;;;;;;;;;;-1:-1:-1;27507:61:0;;;;;;-1:-1:-1;;;;;27507:61:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27693:27;;;:::i;31590:180::-;;;;;;;;;;;;;;;;-1:-1:-1;31590:180:0;-1:-1:-1;;;;;31590:180:0;;:::i;28046:30::-;;;:::i;34190:641::-;;;:::i;40135:295::-;;;;;;;;;;;;;;;;-1:-1:-1;40135:295:0;;;;;;-1:-1:-1;;;;;40135:295:0;;:::i;38936:122::-;;;:::i;27461:39::-;;;;;;;;;;;;;;;;-1:-1:-1;27461:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9830:87;;;:::i;38309:535::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38309:535:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27763:27;;;:::i;32094:313::-;;;;;;;;;;;;;;;;-1:-1:-1;32094:313:0;;:::i;31098:122::-;;;;;;;;;;;;;;;;-1:-1:-1;31098:122:0;;:::i;39528:508::-;;;;;;;;;;;;;;;;-1:-1:-1;39528:508:0;;;;;;-1:-1:-1;;;;;39528:508:0;;:::i;34888:905::-;;;;;;;;;;;;;;;;-1:-1:-1;34888:905:0;;:::i;27991:40::-;;;:::i;30818:195::-;;;;;;;;;;;;;;;;-1:-1:-1;30818:195:0;-1:-1:-1;;;;;30818:195:0;;:::i;31863:150::-;;;;;;;;;;;;;;;;-1:-1:-1;31863:150:0;;:::i;32490:325::-;;;;;;;;;;;;;;;;-1:-1:-1;32490:325:0;;:::i;33456:631::-;;;:::i;27664:22::-;;;:::i;27575:47::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27575:47:0;;;;;;;;:::i;28090:32::-;;;:::i;27948:34::-;;;:::i;10784:244::-;;;;;;;;;;;;;;;;-1:-1:-1;10784:244:0;-1:-1:-1;;;;;10784:244:0;;:::i;28226:36::-;;;:::i;28136:27::-;;;:::i;27797:::-;;;:::i;37962:259::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;38049:14:::1;::::0;;38017:29:::1;38074:18:::0;;;38125:12:::1;::::0;38103:8:::1;::::0;:58:::1;::::0;-1:-1:-1;;;;;38103:8:0;;::::1;::::0;38125:12:::1;38049:14:::0;38103:21:::1;:58::i;:::-;38177:36;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;29985:1;37962:259::o:0;28269:35::-;;;;;;;;;:::o;31303:203::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;31406:14:::1;;31389:13;:31;;31381:78;;;;-1:-1:-1::0;;;31381:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31470:12;:28:::0;31303:203::o;27831:30::-;;;-1:-1:-1;;;;;27831:30:0;;:::o;27727:29::-;;;;:::o;27868:::-;;;;:::o;36797:1070::-;30328:23;30340:10;30328:11;:23::i;:::-;30327:24;30319:57;;;;;-1:-1:-1;;;30319:57:0;;;;;;;;;;;;-1:-1:-1;;;30319:57:0;;;;;;;;;;;;;;;30395:10;30409:9;30395:23;30387:62;;;;;-1:-1:-1;;;30387:62:0;;;;;;;;;;;;-1:-1:-1;;;30387:62:0;;;;;;;;;;;;;;;36867:13:::1;::::0;;;:6:::1;:13;::::0;;;;;;;:24:::1;::::0;36859:63:::1;;;::::0;;-1:-1:-1;;;36859:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36859:63:0;;;;;;;;;;;;;::::1;;36956:13;::::0;;;:6:::1;:13;::::0;;;;:22:::1;;::::0;36941:12:::1;:37;36933:69;;;::::0;;-1:-1:-1;;;36933:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36933:69:0;;;;;;;;;;;;;::::1;;37022:13;::::0;;;:6:::1;:13;::::0;;;;;;;37036:10:::1;37022:25:::0;;;;;;;;:33:::1;::::0;::::1;;37021:34;37013:62;;;::::0;;-1:-1:-1;;;37013:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37013:62:0;;;;;;;;;;;;;::::1;;37088:14;37156:13:::0;;;:6:::1;:13;::::0;;;;:26:::1;;::::0;::::1;;37152:490;;;37207:28;37217:5;37224:10;37207:9;:28::i;:::-;37199:63;;;::::0;;-1:-1:-1;;;37199:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37199:63:0;;;;;;;;;;;;;::::1;;37277:18;;:::i;:::-;-1:-1:-1::0;37298:13:0::1;::::0;;;:6:::1;:13;::::0;;;;;;;37277:34;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;37335:13;;;;;;;;;37349:10:::1;37335:25:::0;;;;;;;;;:32;;::::1;::::0;37277:34;;37335:87:::1;::::0;:56:::1;::::0;:36:::1;:56::i;:::-;:60:::0;::::1;:87::i;:::-;37326:96;;37152:490;;;;37517:29;37528:5;37535:10;37517;:29::i;:::-;37509:65;;;::::0;;-1:-1:-1;;;37509:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;37598:13:0::1;::::0;;;:6:::1;:13;::::0;;;;;;;37612:10:::1;37598:25:::0;;;;;;;:32:::1;;::::0;37152:490:::1;37654:23;37680:13:::0;;;:6:::1;:13;::::0;;;;;;;37694:10:::1;37680:25:::0;;;;;;;;37716:15;;::::1;:22:::0;;-1:-1:-1;;37716:22:0::1;37734:4;37716:22;::::0;;37759:8:::1;::::0;37680:25;;37759:50:::1;::::0;-1:-1:-1;;;;;37759:8:0::1;::::0;37802:6;37759:21:::1;:50::i;:::-;37827:32;::::0;;;;;;;37845:5;;37833:10:::1;::::0;37827:32:::1;::::0;;;;::::1;::::0;;::::1;30460:1;;36797:1070:::0;:::o;39246:184::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;12720:8:::1;:6;:8::i;:::-;12712:41;;;::::0;;-1:-1:-1;;;12712:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12712:41:0;;;;;;;;;;;;;::::1;;39304:16:::2;:24:::0;;-1:-1:-1;;39339:23:0;;;39373:10:::2;:8;:10::i;:::-;39409:12;::::0;39401:21:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;39246:184::o:0;33135:263::-;30059:15;;-1:-1:-1;;;;;30059:15:0;30045:10;:29;30037:56;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;;;;12443:8:::1;:6;:8::i;:::-;12442:9;12434:38;;;::::0;;-1:-1:-1;;;12434:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;::::1;;33220:16:::2;::::0;::::2;;33219:17;33211:65;;;;-1:-1:-1::0;;;33211:65:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33304:12;::::0;;33319:1:::2;33304:16;33289:31:::0;;;;33331:25:::2;::::0;:11:::2;:25::i;:::-;33367:16;:23:::0;;-1:-1:-1;;33367:23:0::2;33386:4;33367:23;::::0;;33135:263::o;35850:895::-;12443:8;:6;:8::i;:::-;12442:9;12434:38;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;;;30328:23:::1;30340:10;30328:11;:23::i;:::-;30327:24;30319:57;;;::::0;;-1:-1:-1;;;30319:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30319:57:0;;;;;;;;;;;;;::::1;;30395:10;30409:9;30395:23;30387:62;;;::::0;;-1:-1:-1;;;30387:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30387:62:0;;;;;;;;;;;;;::::1;;35937:23:::2;35947:12;;35937:9;:23::i;:::-;35929:54;;;::::0;;-1:-1:-1;;;35929:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35929:54:0;;;;;;;;;;;;;::::2;;36012:12;;36002:6;:22;;35994:79;;;;-1:-1:-1::0;;;35994:79:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36099:12;::::0;36092:20:::2;::::0;;;:6:::2;:20;::::0;;;;;;;36113:10:::2;36092:32:::0;;;;;;;:39:::2;;::::0;:44;36084:84:::2;;;::::0;;-1:-1:-1;;;36084:84:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;36240:12;::::0;36211:19:::2;36233:20:::0;;;:6:::2;:20;::::0;;;;36284:17:::2;::::0;::::2;::::0;:29:::2;::::0;36306:6;36284:21:::2;:29::i;:::-;36264:17;::::0;::::2;:49:::0;36343:16:::2;::::0;::::2;::::0;:28:::2;::::0;36364:6;36343:20:::2;:28::i;:::-;36324:16;::::0;::::2;:47:::0;36446:12:::2;::::0;;36413:23:::2;36439:20:::0;;;:6:::2;:20;::::0;;;;;;;36460:10:::2;36439:32:::0;;;;;;;;;36482;;-1:-1:-1;;36482:32:0::2;::::0;;;36525:14;;::::2;:23:::0;;;36559:10:::2;:22:::0;;;;;36587:12;;36559:41;;;;::::2;::::0;;;;;;;;;::::2;::::0;;;;36611:8:::2;::::0;:69:::2;::::0;-1:-1:-1;;;;;36611:8:0;;::::2;::::0;36666:4:::2;36525:23:::0;36611:25:::2;:69::i;:::-;36716:12;::::0;36696:41:::2;::::0;;;;;;;36704:10:::2;::::0;36696:41:::2;::::0;;;;;::::2;::::0;;::::2;30460:1;;35850:895:::0;:::o;12117:86::-;12164:4;12188:7;-1:-1:-1;;;12188:7:0;;;;;12117:86::o;28170:36::-;;;;:::o;32897:179::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;32975:12:::1;:28:::0;;;33041:12:::1;::::0;33021:47:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;32897:179:::0;:::o;30552:180::-;10061:12;:10;:12::i;:::-;-1:-1:-1;;;;;10050:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10050:23:0;;10042:68;;;;;-1:-1:-1;;;10042:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30631:27:0;::::1;30623:62;;;::::0;;-1:-1:-1;;;30623:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30623:62:0;;;;;;;;;;;;;::::1;;30696:12;:28:::0;;-1:-1:-1;;;;;;30696:28:0::1;-1:-1:-1::0;;;;;30696:28:0;;;::::1;::::0;;;::::1;::::0;;30552:180::o;10481:148::-;10061:12;:10;:12::i;:::-;-1:-1:-1;;;;;10050:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10050:23:0;;10042:68;;;;;-1:-1:-1;;;10042:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10588:1:::1;10572:6:::0;;10551:40:::1;::::0;-1:-1:-1;;;;;10572:6:0;;::::1;::::0;10551:40:::1;::::0;10588:1;;10551:40:::1;10619:1;10602:19:::0;;-1:-1:-1;;;;;;10602:19:0::1;::::0;;10481:148::o;27507:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27693:27::-;;;;:::o;31590:180::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31664:21:0;::::1;31656:56;;;::::0;;-1:-1:-1;;;31656:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31656:56:0;;;;;;;;;;;;;::::1;;31723:6;:39:::0;;-1:-1:-1;;;;;;31723:39:0::1;-1:-1:-1::0;;;;;31723:39:0;;;::::1;::::0;;;::::1;::::0;;31590:180::o;28046:30::-;;;;:::o;34190:641::-;30059:15;;-1:-1:-1;;;;;30059:15:0;30045:10;:29;30037:56;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;;;;12443:8:::1;:6;:8::i;:::-;12442:9;12434:38;;;::::0;;-1:-1:-1;;;12434:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;::::1;;34283:16:::2;::::0;::::2;;:35:::0;::::2;;;-1:-1:-1::0;34303:15:0::2;::::0;::::2;::::0;::::2;;;34283:35;34261:155;;;;-1:-1:-1::0;;;34261:155:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34429:19;34451:21;:19;:21::i;:::-;34429:43;;34539:42;34554:12;;34568;34539:14;:42::i;:::-;34592:45;34621:1;34606:12;;:16;34624:12;34592:13;:45::i;:::-;34648:35;34681:1;34666:12;;:16;34648:17;:35::i;:::-;34767:12;::::0;;34782:1:::2;34767:16;34752:31:::0;;;;34794:29:::2;::::0;:15:::2;:29::i;:::-;12483:1;34190:641::o:0;40135:295::-;40205:4;40222:22;;:::i;:::-;40247:13;;;;:6;:13;;;;;;;;-1:-1:-1;;;;;40247:19:0;;;;;;;;;;;40222:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40277:18:0;;:::i;:::-;-1:-1:-1;40298:13:0;;;;:6;:13;;;;;;;;;40277:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40329:70;;-1:-1:-1;40386:12:0;;40367:14;;;;:32;;:18;:32::i;:::-;40352:12;:47;40329:70;:93;;;;-1:-1:-1;40403:14:0;;;;:19;;40329:93;40322:100;;;;40135:295;;;;;:::o;38936:122::-;30185:12;;-1:-1:-1;;;;;30185:12:0;30171:10;:26;;:59;;-1:-1:-1;30215:15:0;;-1:-1:-1;;;;;30215:15:0;30201:10;:29;30171:59;30163:94;;;;;-1:-1:-1;;;30163:94:0;;;;;;;;;;;;-1:-1:-1;;;30163:94:0;;;;;;;;;;;;;;;12443:8:::1;:6;:8::i;:::-;12442:9;12434:38;;;::::0;;-1:-1:-1;;;12434:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;::::1;;39005:8:::2;:6;:8::i;:::-;39037:12;::::0;39031:19:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;38936:122::o:0;27461:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9830:87::-;9876:7;9903:6;-1:-1:-1;;;;;9903:6:0;9830:87;:::o;38309:535::-;-1:-1:-1;;;;;38516:16:0;;38451:7;38516:16;;;:10;:16;;;;;:23;38433:16;;38451:7;38488:4;;38516:32;;;38507:41;;38503:115;;;-1:-1:-1;;;;;;38574:16:0;;;;;;:10;:16;;;;;:23;:32;;;38503:115;38630:23;38670:6;38656:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38656:21:0;;38630:47;;38693:9;38688:104;38712:6;38708:1;:10;38688:104;;;-1:-1:-1;;;;;38752:16:0;;;;;;:10;:16;;;;;:28;;38769:10;;;;38752:28;;;;;;;;;;;;;;38740:6;38747:1;38740:9;;;;;;;;;;;;;;;;;:40;38720:3;;38688:104;;;-1:-1:-1;38812:6:0;38820:15;;;-1:-1:-1;;;;38309:535:0:o;27763:27::-;;;;:::o;32094:313::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;28028:3:::1;32176:11;:25;;32168:73;;;;-1:-1:-1::0;;;32168:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32252:10;:24:::0;;;32302:27:::1;28028:3;32265:11:::0;32302:14:::1;:27::i;:::-;32287:12;:42:::0;;;32360:12:::1;::::0;32374:10:::1;::::0;32347:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;32360:12;;32347:52:::1;::::0;;;;;;;::::1;32094:313:::0;:::o;31098:122::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;31180:14:::1;:32:::0;31098:122::o;39528:508::-;39597:4;39614:22;;:::i;:::-;39639:13;;;;:6;:13;;;;;;;;-1:-1:-1;;;;;39639:19:0;;;;;;;;;;;39614:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39669:18:0;;:::i;:::-;-1:-1:-1;39690:13:0;;;;:6;:13;;;;;;;;;39669:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39718:35;39714:80;;;39777:5;39770:12;;;;;;39714:80;39824:5;:18;;;:204;;;;;39880:5;:15;;;39861:5;:16;;;:34;:71;;;;-1:-1:-1;39919:13:0;39899:16;;:33;;;;;;;;;39861:71;39860:167;;;;39974:5;:15;;;39955:5;:16;;;:34;:71;;;;-1:-1:-1;40013:13:0;39993:16;;:33;;;;;;;;;;39528:508;-1:-1:-1;;;;;39528:508:0:o;34888:905::-;12443:8;:6;:8::i;:::-;12442:9;12434:38;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;;;30328:23:::1;30340:10;30328:11;:23::i;:::-;30327:24;30319:57;;;::::0;;-1:-1:-1;;;30319:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30319:57:0;;;;;;;;;;;;;::::1;;30395:10;30409:9;30395:23;30387:62;;;::::0;;-1:-1:-1;;;30387:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30387:62:0;;;;;;;;;;;;;::::1;;34975:23:::2;34985:12;;34975:9;:23::i;:::-;34967:54;;;::::0;;-1:-1:-1;;;34967:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34967:54:0;;;;;;;;;;;;;::::2;;35050:12;;35040:6;:22;;35032:79;;;;-1:-1:-1::0;;;35032:79:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35137:12;::::0;35130:20:::2;::::0;;;:6:::2;:20;::::0;;;;;;;35151:10:::2;35130:32:::0;;;;;;;:39:::2;;::::0;:44;35122:84:::2;;;::::0;;-1:-1:-1;;;35122:84:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;35278:12;::::0;35249:19:::2;35271:20:::0;;;:6:::2;:20;::::0;;;;35322:17:::2;::::0;::::2;::::0;:29:::2;::::0;35344:6;35322:21:::2;:29::i;:::-;35302:17;::::0;::::2;:49:::0;35381:16:::2;::::0;::::2;::::0;:28:::2;::::0;35402:6;35381:20:::2;:28::i;:::-;35362:16;::::0;::::2;:47:::0;35484:12:::2;::::0;;35451:23:::2;35477:20:::0;;;:6:::2;:20;::::0;;;;;;;35498:10:::2;35477:32:::0;;;;;;;;;35520;;-1:-1:-1;;35520:32:0::2;35539:13;35520:32:::0;;::::2;::::0;;35563:14;;::::2;:23:::0;;;35597:10:::2;:22:::0;;;;;35625:12;;35597:41;;;;::::2;::::0;;;;;;;;;::::2;::::0;;;;35659:8:::2;::::0;:69:::2;::::0;-1:-1:-1;;;;;35659:8:0;;::::2;::::0;35714:4:::2;35563:23:::0;35659:25:::2;:69::i;:::-;35764:12;::::0;35744:41:::2;::::0;;;;;;;35752:10:::2;::::0;35744:41:::2;::::0;;;;;::::2;::::0;;::::2;30460:1;;34888:905:::0;:::o;27991:40::-;28028:3;27991:40;:::o;30818:195::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30903:30:0;::::1;30895:65;;;::::0;;-1:-1:-1;;;30895:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30895:65:0;;;;;;;;;;;;;::::1;;30971:15;:34:::0;;-1:-1:-1;;;;;;30971:34:0::1;-1:-1:-1::0;;;;;30971:34:0;;;::::1;::::0;;;::::1;::::0;;30818:195::o;31863:150::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;31959:21:::1;:46:::0;31863:150::o;32490:325::-;29946:12;;-1:-1:-1;;;;;29946:12:0;29932:10;:26;29924:50;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;-1:-1:-1;;;29924:50:0;;;;;;;;;;;;;;;28028:3:::1;32576:13;:27;;32568:77;;;;-1:-1:-1::0;;;32568:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32669:29;28028:3;32684:13:::0;32669:14:::1;:29::i;:::-;32656:10;:42:::0;;;32709:12:::1;:28:::0;;;32768:12:::1;::::0;32755:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;32768:12;;32755:52:::1;::::0;;;;;;;;;::::1;32490:325:::0;:::o;33456:631::-;30059:15;;-1:-1:-1;;;;;30059:15:0;30045:10;:29;30037:56;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;-1:-1:-1;;;30037:56:0;;;;;;;;;;;;;;;12443:8:::1;:6;:8::i;:::-;12442:9;12434:38;;;::::0;;-1:-1:-1;;;12434:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;::::1;;33549:16:::2;::::0;::::2;;33541:78;;;;-1:-1:-1::0;;;33541:78:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33639:15;::::0;::::2;::::0;::::2;;;33638:16;33630:63;;;;-1:-1:-1::0;;;33630:63:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33777:12;::::0;33749::::2;::::0;33742:20:::2;::::0;;;:6:::2;:20;::::0;;;;:30:::2;;::::0;:48:::2;::::0;:34:::2;:48::i;:::-;33726:12;:64;;33704:153;;;;-1:-1:-1::0;;;33704:153:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33870:19;33892:21;:19;:21::i;:::-;33870:43;;33924:42;33939:12;;33953;33924:14;:42::i;:::-;33994:12;::::0;;34009:1:::2;33994:16;33979:31:::0;;;;34021:25:::2;::::0;:11:::2;:25::i;:::-;-1:-1:-1::0;34057:15:0::2;:22:::0;;-1:-1:-1;;34057:22:0::2;;;::::0;;33456:631::o;27664:22::-;;;-1:-1:-1;;;;;27664:22:0;;:::o;27575:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28090:32::-;;;;:::o;27948:34::-;;;;:::o;10784:244::-;10061:12;:10;:12::i;:::-;-1:-1:-1;;;;;10050:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;10050:23:0;;10042:68;;;;;-1:-1:-1;;;10042:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10873:22:0;::::1;10865:73;;;;-1:-1:-1::0;;;10865:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10975:6;::::0;;10954:38:::1;::::0;-1:-1:-1;;;;;10954:38:0;;::::1;::::0;10975:6;::::1;::::0;10954:38:::1;::::0;::::1;11003:6;:17:::0;;-1:-1:-1;;;;;;11003:17:0::1;-1:-1:-1::0;;;;;11003:17:0;;;::::1;::::0;;;::::1;::::0;;10784:244::o;28226:36::-;;;;;;:::o;28136:27::-;;;;:::o;27797:::-;;;-1:-1:-1;;;;;27797:27:0;;:::o;22605:177::-;22715:58;;;-1:-1:-1;;;;;22715:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22715:58:0;-1:-1:-1;;;22715:58:0;;;22688:86;;22708:5;;22688:19;:86::i;:::-;22605:177;;;:::o;45150:191::-;45280:17;45325:8;;;45150:191::o;3848:220::-;3906:7;3930:6;3926:20;;-1:-1:-1;3945:1:0;3938:8;;3926:20;3969:5;;;3973:1;3969;:5;:1;3993:5;;;;;:10;3985:56;;;;-1:-1:-1;;;3985:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4059:1;3848:220;-1:-1:-1;;;3848:220:0:o;4546:153::-;4604:7;4636:1;4632;:5;4624:44;;;;;-1:-1:-1;;;4624:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4690:1;4686;:5;;;;;;;4546:153;-1:-1:-1;;;4546:153:0:o;13176:120::-;12720:8;:6;:8::i;:::-;12712:41;;;;;-1:-1:-1;;;12712:41:0;;;;;;;;;;;;-1:-1:-1;;;12712:41:0;;;;;;;;;;;;;;;13245:5:::1;13235:15:::0;;-1:-1:-1;;;;13235:15:0::1;::::0;;13266:22:::1;13275:12;:10;:12::i;:::-;13266:22;::::0;;-1:-1:-1;;;;;13266:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;13176:120::o:0;40916:377::-;40972:19;40994:13;;;:6;:13;;;;;;;;41037:12;41018:16;;;:31;;;41095:14;;40994:13;;41078:32;;:16;:32::i;:::-;41060:15;;;;:50;;;;41155:14;;41138:36;;:12;;41155:18;41138:16;:36::i;:::-;41121:14;;;:53;41185:19;;;:11;41215:17;;;:21;41254:31;;;41272:12;41254:31;;;;41199:5;;41254:31;;;;;;;;;;40916:377;;:::o;45533:287::-;45590:4;45627:13;;;:6;:13;;;;;;;:24;;:29;;;;:74;;-1:-1:-1;45673:13:0;;;;:6;:13;;;;;:23;;;:28;;45627:74;:130;;;;-1:-1:-1;45733:13:0;;;;:6;:13;;;;;;;;:24;;45718:12;:39;45627:130;:185;;;;-1:-1:-1;;45789:13:0;;;;:6;:13;;;;;:23;;;45774:12;:38;;45533:287::o;2969:179::-;3027:7;3059:5;;;3083:6;;;;3075:46;;;;;-1:-1:-1;;;3075:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:205;22918:68;;;-1:-1:-1;;;;;22918:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22918:68:0;-1:-1:-1;;;22918:68:0;;;22891:96;;22911:5;;22891:19;:96::i;:::-;22790:205;;;;:::o;8370:106::-;8458:10;8370:106;:::o;44400:531::-;44449:6;44468:29;44500:42;44520:21;;44500:15;:19;;:42;;;;:::i;:::-;44468:74;;44554:14;44570:12;44586:17;44609:6;;;;;;;;;-1:-1:-1;;;;;44609:6:0;-1:-1:-1;;;;;44609:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44609:24:0;;;;;;;;;;;;;-1:-1:-1;44609:24:0;;-1:-1:-1;44609:24:0;-1:-1:-1;44652:34:0;;;;44644:93;;;;-1:-1:-1;;;44644:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44766:19;;44756:7;:29;;;44748:103;;;;-1:-1:-1;;;44748:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44884:16:0;;;;44862:19;:38;44918:5;-1:-1:-1;;44400:531:0;:::o;41343:419::-;41424:13;;;;:6;:13;;;;;;;;:24;;41416:85;;;;-1:-1:-1;;;41416:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41536:13;;;;:6;:13;;;;;:23;;;41520:12;:39;;41512:87;;;;-1:-1:-1;;;41512:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41662:12;;41634:13;;;;:6;:13;;;;;:23;;;:41;;:27;:41::i;:::-;41618:12;:57;;41610:109;;;;-1:-1:-1;;;41610:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41730:24;41741:5;41748;41730:10;:24::i;:::-;41343:419;;:::o;42030:409::-;42110:13;;;;:6;:13;;;;;:23;;;42102:82;;;;-1:-1:-1;;;42102:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42219:13;;;;:6;:13;;;;;:22;;;42203:12;:38;;42195:84;;;;-1:-1:-1;;;42195:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42341:12;;42314:13;;;;:6;:13;;;;;:22;;;:40;;:26;:40::i;:::-;42298:12;:56;;42290:107;;;;-1:-1:-1;;;42290:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42408:23;42418:5;42425;42408:9;:23::i;42761:1481::-;28028:3;42831:28;42846:12;;42831:10;;:14;;:28;;;;:::i;:::-;:42;42823:108;;;;-1:-1:-1;;;42823:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42950:13;;;;:6;:13;;;;;:33;;;:38;:73;;;;-1:-1:-1;42992:13:0;;;;:6;:13;;;;;:26;;;:31;42950:73;42942:104;;;;;-1:-1:-1;;;42942:104:0;;;;;;;;;;;;-1:-1:-1;;;42942:104:0;;;;;;;;;;;;;;;43057:19;43079:13;;;:6;:13;;;;;43247:15;;;;43228:16;;;;43079:13;;43057:19;;;;;43228:34;43224:730;;;43301:5;:16;;;43279:38;;43347:49;28028:3;43347:33;43369:10;;43347:5;:17;;;:21;;:33;;;;:::i;:49::-;43332:64;;43425:51;28028:3;43425:35;43447:12;;43425:5;:17;;;:21;;:35;;;;:::i;:51::-;43411:65;;43224:730;;;43548:5;:15;;;43529:5;:16;;;:34;43525:429;;;43602:5;:16;;;43580:38;;43648:49;28028:3;43648:33;43670:10;;43648:5;:17;;;:21;;:33;;;;:::i;43525:429::-;-1:-1:-1;;;43925:17:0;;;;43864:1;;;;43525:429;43964:25;;;:47;;;44022:18;;;;:33;;;44113:14;:31;;44132:11;44113:18;:31::i;:::-;44096:14;:48;44162:72;;;;;;;;;;;;;;;;;;;;44180:5;;44162:72;;;;;;;;;;42761:1481;;;;;:::o;40517:391::-;40585:16;;;;40577:78;;;;-1:-1:-1;;;40577:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40681:9:0;;40674:17;;;;:6;:17;;;;;:26;;;40666:90;;;;-1:-1:-1;;;40666:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40798:9:0;;40791:17;;;;:6;:17;;;;;:26;;;40775:12;:42;;40767:104;;;;-1:-1:-1;;;40767:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40882:18;40894:5;40882:11;:18::i;12917:118::-;12443:8;:6;:8::i;:::-;12442:9;12434:38;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;-1:-1:-1;;;12434:38:0;;;;;;;;;;;;;;;12977:7:::1;:14:::0;;-1:-1:-1;;;;12977:14:0::1;-1:-1:-1::0;;;12977:14:0::1;::::0;;13007:20:::1;13014:12;:10;:12::i;3431:158::-:0;3489:7;3522:1;3517;:6;;3509:49;;;;;-1:-1:-1;;;3509:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3576:5:0;;;3431:158::o;24910:761::-;25334:23;25360:69;25388:4;25360:69;;;;;;;;;;;;;;;;;25368:5;-1:-1:-1;;;;;25360:27:0;;;:69;;;;;:::i;:::-;25444:17;;25334:95;;-1:-1:-1;25444:21:0;25440:224;;25586:10;25575:30;;;;;;;;;;;;;;;-1:-1:-1;25575:30:0;25567:85;;;;-1:-1:-1;;;25567:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41770:211;41839:19;41861:13;;;:6;:13;;;;;;;;;41885:15;;;:23;;;41926:47;;41943:12;41926:47;;;;;;;;;;41861:13;;41868:5;;41926:47;;;;;;;;;;;41770:211;;;:::o;42447:247::-;42515:19;42537:13;;;:6;:13;;;;;;;;;42561:16;;;:24;;;42596:18;;;:25;;-1:-1:-1;;42596:25:0;;;;;;;42639:47;;42655:12;42639:47;;;;;;;;;;42537:13;;42544:5;;42639:47;;;;;;;;;;42447:247;;;:::o;20146:196::-;20249:12;20281:53;20304:6;20312:4;20318:1;20321:12;20281:22;:53::i;:::-;20274:60;20146:196;-1:-1:-1;;;;20146:196:0:o;21523:979::-;21653:12;21686:18;21697:6;21686:10;:18::i;:::-;21678:60;;;;;-1:-1:-1;;;21678:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21812:12;21826:23;21853:6;-1:-1:-1;;;;;21853:11:0;21873:8;21884:4;21853:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21853:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21811:78;;;;21904:7;21900:595;;;21935:10;-1:-1:-1;21928:17:0;;-1:-1:-1;21928:17:0;21900:595;22049:17;;:21;22045:439;;22312:10;22306:17;22373:15;22360:10;22356:2;22352:19;22345:44;22260:148;22455:12;22448:20;;-1:-1:-1;;;22448:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://ca84f27ada20b09ce1b93bab262620706fff1c7d46e3c2352207470d3ef66854
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading