Contract 0xfb03e11d93632d97a8981158a632dd5986f5e909 4

Contract Overview

Mdex: Heco Pool
Balance:
0 HT

HT Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc95bd86529ea56dbf356100b738ecacd3fa7bf3bad837db330648ef420e99b1aDeposit94884202021-10-27 18:27:0951 secs ago0x5ed98bdf61386efe9287948186e3910d3f9123ef IN  Mdex: Heco Pool0 HT0.000323372252.25
0xc8421052bc6dd7f991922ce80d10a876d7055eb7ed5dfdbe9a891ccaf581043bDeposit94883532021-10-27 18:23:484 mins ago0x5ed98bdf61386efe9287948186e3910d3f9123ef IN  Mdex: Heco Pool0 HT0.0002434862.25
0xb8d8cc9e07a8040cd9a6aa642892ddc2a09a54d9322c29041af2bc8e565025deDeposit94882822021-10-27 18:20:157 mins ago0xbe9028c0f59fbda831d76ef96aa5bb533f0337f3 IN  Mdex: Heco Pool0 HT0.0002819612.25
0xbe8ad672a7a3e33ca9b12d572735f6b0c0ac852ad9111ecdf141eae06fa52261Deposit94882252021-10-27 18:17:2410 mins ago0x2b20b323d3e8f07ac7db888b32490c72a2323750 IN  Mdex: Heco Pool0 HT0.000331638752.25
0x75e55e8741c22ab6e76e1733b78f0e54828a86b744501677b7bdf5a5a1689b5fDeposit94881712021-10-27 18:14:4213 mins ago0x1018ba3c94ce5672cd888e8381e9ec2e1656d114 IN  Mdex: Heco Pool0 HT0.000243486 2.25
0x227ef4325fbf22b662e01736608bfdeb5fb8e5696e2668e140bbb8f7dda9e449Deposit94881582021-10-27 18:14:0313 mins ago0x1018ba3c94ce5672cd888e8381e9ec2e1656d114 IN  Mdex: Heco Pool0 HT0.000243486 2.25
0xf264f8f1b4b59a6ce707bc3f78b79f3ee3fb65a3364d1f3105ba93e1b443ebaaDeposit94881392021-10-27 18:13:0614 mins ago0xf8cdf8b863f4cf43daa9d60c3d1871f59a1d0b48 IN  Mdex: Heco Pool0 HT0.000243486 2.25
0xab8227f05edca6360b09925b27ee60009c76b8c8b53229e3291a9d45504b579aDeposit94879812021-10-27 18:05:1222 mins ago0xc400257cc07446057d28dd27cf796e42ab90b68a IN  Mdex: Heco Pool0 HT0.000243486 2.25
0x78a40c340e69829f88e1b0b1cb079469432a8845944312eb6f902e33a53b3085Deposit94879762021-10-27 18:04:5723 mins ago0x327771c9b05d3e59d6b01046a9e2c66256cacf1d IN  Mdex: Heco Pool0 HT0.000284897252.25
0xe9052b8b82aefbf31a48981895156ce4d922cbb20b147d165deed649e8ab3381Withdraw94879692021-10-27 18:04:3623 mins ago0x4a56d6d8c6e33f23840ed5b920fd4fee6389f624 IN  Mdex: Heco Pool0 HT0.0003460952.25
0xd52743141dc8436a8c5e7f53c23c24d528ce9338f427191f7caf953e52927364Deposit94879522021-10-27 18:03:4524 mins ago0xe7f9fa81845cc3450c09a14c4014eedbbb4abdda IN  Mdex: Heco Pool0 HT0.0002434862.25
0x3c32b68894c5586b412f93e991b2fe9ed13660d5e022bf4b27d5005f8cefefb7Deposit94879442021-10-27 18:03:2124 mins ago0xe7f9fa81845cc3450c09a14c4014eedbbb4abdda IN  Mdex: Heco Pool0 HT0.0002434862.25
0xc25ccea6a29705b4636ac5c5cfbc1f109d1ab7109340c07ff7e1cc9435d62136Deposit94879302021-10-27 18:02:3925 mins ago0x327771c9b05d3e59d6b01046a9e2c66256cacf1d IN  Mdex: Heco Pool0 HT0.0002434862.25
0x406b9dd560e1fc7e122a822c399f129d4d2ca8bf89a2cdee328dcf8702c54871Deposit94879162021-10-27 18:01:5726 mins ago0xebdeb20cae1f097ca0483b2b4b15cffef89b0574 IN  Mdex: Heco Pool0 HT0.000407277 3.25
0x47a053bda6532af67f0ae336b7179ecce7fc1ef01d94cd892991049d431cf048Deposit94877692021-10-27 17:54:3633 mins ago0x5f228ae7be2d8eebb7ff6e3eff0c5816f76ff2fe IN  Mdex: Heco Pool0 HT0.000331611752.25
0xbe59f823d2a2fa90d83aa9a046ab362e7883fc2a48cb4c8a04719f13385c595aWithdraw94877542021-10-27 17:53:5134 mins ago0x5f228ae7be2d8eebb7ff6e3eff0c5816f76ff2fe IN  Mdex: Heco Pool0 HT0.0003075932.25
0x423a0c33eae7bac46f302d288f044d619c58831ae866809a3b731e1cb3d5d466Deposit94877292021-10-27 17:52:3635 mins ago0xeb6b79a6649e6756858869434515693ee925e1a9 IN  Mdex: Heco Pool0 HT0.0002434862.25
0x4cdf13999e49f07527574222a4684f7238c173ca557d57f166afbaf9f64eb78dDeposit94877172021-10-27 17:52:0036 mins ago0xd5a7227b56693a2d55efb55c3ceabaf6e83f713f IN  Mdex: Heco Pool0 HT0.000243486 2.25
0x5aabcad6d869af0c8b94b5993c6281e6c0edabb87bb182ad43ed0d2083ad5610Deposit94876792021-10-27 17:50:0637 mins ago0x698149800d292aec706bca35ec05727673f96e91 IN  Mdex: Heco Pool0 HT0.000243486 2.25
0x4309caffacdfd1a55a84e68bc4364a0f4be566eed90cbdc378f4a2a24232c125Deposit94876682021-10-27 17:49:3338 mins ago0x698149800d292aec706bca35ec05727673f96e91 IN  Mdex: Heco Pool0 HT0.000243486 2.25
0x4ab3391823a853d1963a9eee7d277c89d23f428f30562df0ef4b02a73bf99d69Withdraw94876532021-10-27 17:48:4839 mins ago0x5f228ae7be2d8eebb7ff6e3eff0c5816f76ff2fe IN  Mdex: Heco Pool0 HT0.0003075392.25
0x63144f1315cec454b9a713047ba0985378c18b8f3ed8d3b43694247e900501b1Withdraw94876512021-10-27 17:48:4239 mins ago0x62bea5713a90d147b95d041f38da8150a06d1d6f IN  Mdex: Heco Pool0 HT0.000307622.25
0x3a645057fe92b4c247132197a555d2bb7e552a8c168b039753c85c535451a71fDeposit94876492021-10-27 17:48:3639 mins ago0x698149800d292aec706bca35ec05727673f96e91 IN  Mdex: Heco Pool0 HT0.000281961 2.25
0xea4673c136c07a6c9df1fa39a46df453083ae93cfc70a3f4c970c35fcb06bef4Deposit94876312021-10-27 17:47:4240 mins ago0x40345e663e5ff89fc8f7c6b993895402bd682286 IN  Mdex: Heco Pool0 HT0.00028487025 2.25
0xa97de96a28fca534b3750dcc1da080aa47659b09beb97f434741e718db0d7ec6Deposit94875852021-10-27 17:45:2442 mins ago0x69c12532b20202dafa9b1f11acfe574fb856a697 IN  Mdex: Heco Pool0 HT0.000243486 2.25
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HecoPool

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-02-04
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.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);
}


pragma solidity ^0.6.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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

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

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

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



pragma solidity ^0.6.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 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");
        }
    }
}


pragma solidity ^0.6.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;
    }
}


pragma solidity ^0.6.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.
 */
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 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;
    }
}


pragma solidity ^0.6.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {// Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1;
            // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

interface IMdx is IERC20 {
    function mint(address to, uint256 amount) external returns (bool);
}

interface IMasterChefHeco {
    function pending(uint256 pid, address user) external view returns (uint256);

    function deposit(uint256 pid, uint256 amount) external;

    function withdraw(uint256 pid, uint256 amount) external;

    function emergencyWithdraw(uint256 pid) external;
}

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

    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet private _multLP;

    // Info of each user.
    struct UserInfo {
        uint256 amount;     // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt.
        uint256 multLpRewardDebt; //multLp Reward debt.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. MDXs to distribute per block.
        uint256 lastRewardBlock;  // Last block number that MDXs distribution occurs.
        uint256 accMdxPerShare; // Accumulated MDXs per share, times 1e12.
        uint256 accMultLpPerShare; //Accumulated multLp per share
        uint256 totalAmount;    // Total amount of current pool deposit.
    }

    // The MDX Token!
    IMdx public mdx;
    // MDX tokens created per block.
    uint256 public mdxPerBlock;
    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    // Corresponding to the pid of the multLP pool
    mapping(uint256 => uint256) public poolCorrespond;
    // pid corresponding address
    mapping(address => uint256) public LpOfPid;
    // Control mining
    bool public paused = false;
    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;
    // The block number when MDX mining starts.
    uint256 public startBlock;
    // multLP MasterChef
    address public multLpChef;
    // multLP Token
    address public multLpToken;
    // How many blocks are halved
    uint256 public halvingPeriod = 5256000;

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

    constructor(
        IMdx _mdx,
        uint256 _mdxPerBlock,
        uint256 _startBlock
    ) public {
        mdx = _mdx;
        mdxPerBlock = _mdxPerBlock;
        startBlock = _startBlock;
    }

    function setHalvingPeriod(uint256 _block) public onlyOwner {
        halvingPeriod = _block;
    }

    // Set the number of mdx produced by each block
    function setMdxPerBlock(uint256 _newPerBlock) public onlyOwner {
        massUpdatePools();
        mdxPerBlock = _newPerBlock;
    }

    function poolLength() public view returns (uint256) {
        return poolInfo.length;
    }

    function addMultLP(address _addLP) public onlyOwner returns (bool) {
        require(_addLP != address(0), "LP is the zero address");
        IERC20(_addLP).approve(multLpChef, uint256(- 1));
        return EnumerableSet.add(_multLP, _addLP);
    }

    function isMultLP(address _LP) public view returns (bool) {
        return EnumerableSet.contains(_multLP, _LP);
    }

    function getMultLPLength() public view returns (uint256) {
        return EnumerableSet.length(_multLP);
    }

    function getMultLPAddress(uint256 _pid) public view returns (address){
        require(_pid <= getMultLPLength() - 1, "not find this multLP");
        return EnumerableSet.at(_multLP, _pid);
    }

    function setPause() public onlyOwner {
        paused = !paused;
    }

    function setMultLP(address _multLpToken, address _multLpChef) public onlyOwner {
        require(_multLpToken != address(0) && _multLpChef != address(0), "is the zero address");
        multLpToken = _multLpToken;
        multLpChef = _multLpChef;
    }

    function replaceMultLP(address _multLpToken, address _multLpChef) public onlyOwner {
        require(_multLpToken != address(0) && _multLpChef != address(0), "is the zero address");
        require(paused == true, "No mining suspension");
        multLpToken = _multLpToken;
        multLpChef = _multLpChef;
        uint256 length = getMultLPLength();
        while (length > 0) {
            address dAddress = EnumerableSet.at(_multLP, 0);
            uint256 pid = LpOfPid[dAddress];
            IMasterChefHeco(multLpChef).emergencyWithdraw(poolCorrespond[pid]);
            EnumerableSet.remove(_multLP, dAddress);
            length--;
        }
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
        require(address(_lpToken) != address(0), "_lpToken is the zero address");
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
        lpToken : _lpToken,
        allocPoint : _allocPoint,
        lastRewardBlock : lastRewardBlock,
        accMdxPerShare : 0,
        accMultLpPerShare : 0,
        totalAmount : 0
        }));
        LpOfPid[address(_lpToken)] = poolLength() - 1;
    }

    // Update the given pool's MDX allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    // The current pool corresponds to the pid of the multLP pool
    function setPoolCorr(uint256 _pid, uint256 _sid) public onlyOwner {
        require(_pid <= poolLength() - 1, "not find this pool");
        poolCorrespond[_pid] = _sid;
    }

    function phase(uint256 blockNumber) public view returns (uint256) {
        if (halvingPeriod == 0) {
            return 0;
        }
        if (blockNumber > startBlock) {
            return (blockNumber.sub(startBlock).sub(1)).div(halvingPeriod);
        }
        return 0;
    }

    function reward(uint256 blockNumber) public view returns (uint256) {
        uint256 _phase = phase(blockNumber);
        return mdxPerBlock.div(2 ** _phase);
    }

    function getMdxBlockReward(uint256 _lastRewardBlock) public view returns (uint256) {
        uint256 blockReward = 0;
        uint256 n = phase(_lastRewardBlock);
        uint256 m = phase(block.number);
        while (n < m) {
            n++;
            uint256 r = n.mul(halvingPeriod).add(startBlock);
            blockReward = blockReward.add((r.sub(_lastRewardBlock)).mul(reward(r)));
            _lastRewardBlock = r;
        }
        blockReward = blockReward.add((block.number.sub(_lastRewardBlock)).mul(reward(block.number)));
        return blockReward;
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply;
        if (isMultLP(address(pool.lpToken))) {
            if (pool.totalAmount == 0) {
                pool.lastRewardBlock = block.number;
                return;
            }
            lpSupply = pool.totalAmount;
        } else {
            lpSupply = pool.lpToken.balanceOf(address(this));
            if (lpSupply == 0) {
                pool.lastRewardBlock = block.number;
                return;
            }
        }
        uint256 blockReward = getMdxBlockReward(pool.lastRewardBlock);
        if (blockReward <= 0) {
            return;
        }
        uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
        bool minRet = mdx.mint(address(this), mdxReward);
        if (minRet) {
            pool.accMdxPerShare = pool.accMdxPerShare.add(mdxReward.mul(1e12).div(lpSupply));
        }
        pool.lastRewardBlock = block.number;
    }

    // View function to see pending MDXs on frontend.
    function pending(uint256 _pid, address _user) external view returns (uint256, uint256){
        PoolInfo storage pool = poolInfo[_pid];
        if (isMultLP(address(pool.lpToken))) {
            (uint256 mdxAmount, uint256 tokenAmount) = pendingMdxAndToken(_pid, _user);
            return (mdxAmount, tokenAmount);
        } else {
            uint256 mdxAmount = pendingMdx(_pid, _user);
            return (mdxAmount, 0);
        }
    }

    function pendingMdxAndToken(uint256 _pid, address _user) private view returns (uint256, uint256){
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accMdxPerShare = pool.accMdxPerShare;
        uint256 accMultLpPerShare = pool.accMultLpPerShare;
        if (user.amount > 0) {
            uint256 TokenPending = IMasterChefHeco(multLpChef).pending(poolCorrespond[_pid], address(this));
            accMultLpPerShare = accMultLpPerShare.add(TokenPending.mul(1e12).div(pool.totalAmount));
            uint256 userPending = user.amount.mul(accMultLpPerShare).div(1e12).sub(user.multLpRewardDebt);
            if (block.number > pool.lastRewardBlock) {
                uint256 blockReward = getMdxBlockReward(pool.lastRewardBlock);
                uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
                accMdxPerShare = accMdxPerShare.add(mdxReward.mul(1e12).div(pool.totalAmount));
                return (user.amount.mul(accMdxPerShare).div(1e12).sub(user.rewardDebt), userPending);
            }
            if (block.number == pool.lastRewardBlock) {
                return (user.amount.mul(accMdxPerShare).div(1e12).sub(user.rewardDebt), userPending);
            }
        }
        return (0, 0);
    }

    function pendingMdx(uint256 _pid, address _user) private view returns (uint256){
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accMdxPerShare = pool.accMdxPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (user.amount > 0) {
            if (block.number > pool.lastRewardBlock) {
                uint256 blockReward = getMdxBlockReward(pool.lastRewardBlock);
                uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
                accMdxPerShare = accMdxPerShare.add(mdxReward.mul(1e12).div(lpSupply));
                return user.amount.mul(accMdxPerShare).div(1e12).sub(user.rewardDebt);
            }
            if (block.number == pool.lastRewardBlock) {
                return user.amount.mul(accMdxPerShare).div(1e12).sub(user.rewardDebt);
            }
        }
        return 0;
    }

    // Deposit LP tokens to HecoPool for MDX allocation.
    function deposit(uint256 _pid, uint256 _amount) public notPause {
        PoolInfo storage pool = poolInfo[_pid];
        if (isMultLP(address(pool.lpToken))) {
            depositMdxAndToken(_pid, _amount, msg.sender);
        } else {
            depositMdx(_pid, _amount, msg.sender);
        }
    }

    function depositMdxAndToken(uint256 _pid, uint256 _amount, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pendingAmount = user.amount.mul(pool.accMdxPerShare).div(1e12).sub(user.rewardDebt);
            if (pendingAmount > 0) {
                safeMdxTransfer(_user, pendingAmount);
            }
            uint256 beforeToken = IERC20(multLpToken).balanceOf(address(this));
            IMasterChefHeco(multLpChef).deposit(poolCorrespond[_pid], 0);
            uint256 afterToken = IERC20(multLpToken).balanceOf(address(this));
            pool.accMultLpPerShare = pool.accMultLpPerShare.add(afterToken.sub(beforeToken).mul(1e12).div(pool.totalAmount));
            uint256 tokenPending = user.amount.mul(pool.accMultLpPerShare).div(1e12).sub(user.multLpRewardDebt);
            if (tokenPending > 0) {
                IERC20(multLpToken).safeTransfer(_user, tokenPending);
            }
        }
        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(_user, address(this), _amount);
            if (pool.totalAmount == 0) {
                IMasterChefHeco(multLpChef).deposit(poolCorrespond[_pid], _amount);
                user.amount = user.amount.add(_amount);
                pool.totalAmount = pool.totalAmount.add(_amount);
            } else {
                uint256 beforeToken = IERC20(multLpToken).balanceOf(address(this));
                IMasterChefHeco(multLpChef).deposit(poolCorrespond[_pid], _amount);
                uint256 afterToken = IERC20(multLpToken).balanceOf(address(this));
                pool.accMultLpPerShare = pool.accMultLpPerShare.add(afterToken.sub(beforeToken).mul(1e12).div(pool.totalAmount));
                user.amount = user.amount.add(_amount);
                pool.totalAmount = pool.totalAmount.add(_amount);
            }
        }
        user.rewardDebt = user.amount.mul(pool.accMdxPerShare).div(1e12);
        user.multLpRewardDebt = user.amount.mul(pool.accMultLpPerShare).div(1e12);
        emit Deposit(_user, _pid, _amount);
    }

    function depositMdx(uint256 _pid, uint256 _amount, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pendingAmount = user.amount.mul(pool.accMdxPerShare).div(1e12).sub(user.rewardDebt);
            if (pendingAmount > 0) {
                safeMdxTransfer(_user, pendingAmount);
            }
        }
        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(_user, address(this), _amount);
            user.amount = user.amount.add(_amount);
            pool.totalAmount = pool.totalAmount.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accMdxPerShare).div(1e12);
        emit Deposit(_user, _pid, _amount);
    }

    // Withdraw LP tokens from HecoPool.
    function withdraw(uint256 _pid, uint256 _amount) public notPause {
        PoolInfo storage pool = poolInfo[_pid];
        if (isMultLP(address(pool.lpToken))) {
            withdrawMdxAndToken(_pid, _amount, msg.sender);
        } else {
            withdrawMdx(_pid, _amount, msg.sender);
        }
    }

    function withdrawMdxAndToken(uint256 _pid, uint256 _amount, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        require(user.amount >= _amount, "withdrawMdxAndToken: not good");
        updatePool(_pid);
        uint256 pendingAmount = user.amount.mul(pool.accMdxPerShare).div(1e12).sub(user.rewardDebt);
        if (pendingAmount > 0) {
            safeMdxTransfer(_user, pendingAmount);
        }
        if (_amount > 0) {
            uint256 beforeToken = IERC20(multLpToken).balanceOf(address(this));
            IMasterChefHeco(multLpChef).withdraw(poolCorrespond[_pid], _amount);
            uint256 afterToken = IERC20(multLpToken).balanceOf(address(this));
            pool.accMultLpPerShare = pool.accMultLpPerShare.add(afterToken.sub(beforeToken).mul(1e12).div(pool.totalAmount));
            uint256 tokenPending = user.amount.mul(pool.accMultLpPerShare).div(1e12).sub(user.multLpRewardDebt);
            if (tokenPending > 0) {
                IERC20(multLpToken).safeTransfer(_user, tokenPending);
            }
            user.amount = user.amount.sub(_amount);
            pool.totalAmount = pool.totalAmount.sub(_amount);
            pool.lpToken.safeTransfer(_user, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accMdxPerShare).div(1e12);
        user.multLpRewardDebt = user.amount.mul(pool.accMultLpPerShare).div(1e12);
        emit Withdraw(_user, _pid, _amount);
    }

    function withdrawMdx(uint256 _pid, uint256 _amount, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        require(user.amount >= _amount, "withdrawMdx: not good");
        updatePool(_pid);
        uint256 pendingAmount = user.amount.mul(pool.accMdxPerShare).div(1e12).sub(user.rewardDebt);
        if (pendingAmount > 0) {
            safeMdxTransfer(_user, pendingAmount);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.totalAmount = pool.totalAmount.sub(_amount);
            pool.lpToken.safeTransfer(_user, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accMdxPerShare).div(1e12);
        emit Withdraw(_user, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public notPause {
        PoolInfo storage pool = poolInfo[_pid];
        if (isMultLP(address(pool.lpToken))) {
            emergencyWithdrawMdxAndToken(_pid, msg.sender);
        } else {
            emergencyWithdrawMdx(_pid, msg.sender);
        }
    }

    function emergencyWithdrawMdxAndToken(uint256 _pid, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 amount = user.amount;
        uint256 beforeToken = IERC20(multLpToken).balanceOf(address(this));
        IMasterChefHeco(multLpChef).withdraw(poolCorrespond[_pid], amount);
        uint256 afterToken = IERC20(multLpToken).balanceOf(address(this));
        pool.accMultLpPerShare = pool.accMultLpPerShare.add(afterToken.sub(beforeToken).mul(1e12).div(pool.totalAmount));
        user.amount = 0;
        user.rewardDebt = 0;
        pool.lpToken.safeTransfer(_user, amount);
        pool.totalAmount = pool.totalAmount.sub(amount);
        emit EmergencyWithdraw(_user, _pid, amount);
    }

    function emergencyWithdrawMdx(uint256 _pid, address _user) private {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.lpToken.safeTransfer(_user, amount);
        pool.totalAmount = pool.totalAmount.sub(amount);
        emit EmergencyWithdraw(_user, _pid, amount);
    }

    // Safe MDX transfer function, just in case if rounding error causes pool to not have enough MDXs.
    function safeMdxTransfer(address _to, uint256 _amount) internal {
        uint256 mdxBal = mdx.balanceOf(address(this));
        if (_amount > mdxBal) {
            mdx.transfer(_to, mdxBal);
        } else {
            mdx.transfer(_to, _amount);
        }
    }

    modifier notPause() {
        require(paused == false, "Mining has been suspended");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IMdx","name":"_mdx","type":"address"},{"internalType":"uint256","name":"_mdxPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LpOfPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addLP","type":"address"}],"name":"addMultLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastRewardBlock","type":"uint256"}],"name":"getMdxBlockReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getMultLPAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultLPLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halvingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_LP","type":"address"}],"name":"isMultLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mdx","outputs":[{"internalType":"contract IMdx","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdxPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multLpChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multLpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolCorrespond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMdxPerShare","type":"uint256"},{"internalType":"uint256","name":"accMultLpPerShare","type":"uint256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multLpToken","type":"address"},{"internalType":"address","name":"_multLpChef","type":"address"}],"name":"replaceMultLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setHalvingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPerBlock","type":"uint256"}],"name":"setMdxPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multLpToken","type":"address"},{"internalType":"address","name":"_multLpChef","type":"address"}],"name":"setMultLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_sid","type":"uint256"}],"name":"setPoolCorr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"multLpRewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526009805460ff191690556000600a5562503340600e553480156200002757600080fd5b506040516200370e3803806200370e833981810160405260608110156200004d57600080fd5b50805160208201516040909201519091906000620000736001600160e01b03620000ea16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600380546001600160a01b0319166001600160a01b039490941693909317909255600455600b55620000ee565b3390565b61361080620000fe6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063715018a611610130578063b337d32c116100b8578063e2bbb1581161007c578063e2bbb158146105c6578063e4c75c27146105e9578063e6ab8d481461062e578063e715e23414610636578063f2fde38b1461066457610227565b8063b337d32c14610559578063b5ec5c991461057c578063cb4502c414610599578063d431b1ac146105b6578063dfc7b95b146105be57610227565b80638fa39a88116100ff5780638fa39a881461049657806393f1a40b1461049e578063a9fb763c146104e8578063aaae43cc14610505578063b0c7044b1461053357610227565b8063715018a614610443578063791ba3741461044b5780637fe6f5ac146104685780638da5cb5b1461048e57610227565b806351eb05a6116101b35780635a3e251f116101825780635a3e251f146103f85780635c975abb14610400578063630b5ba11461040857806364482f7914610410578063705bbc011461043b57610227565b806351eb05a61461037c5780635312ea8e146103995780635672ab55146103b657806356c5867d146103be57610227565b80631b15b579116101fa5780631b15b579146102c55780631eaaa045146102e25780634315490714610318578063441a3e701461035157806348cd4cb11461037457610227565b8063081e3eda1461022c578063135f8aa7146102465780631526fe271461026357806317caf6f1146102bd575b600080fd5b61023461068a565b60408051918252519081900360200190f35b6102346004803603602081101561025c57600080fd5b5035610690565b6102806004803603602081101561027957600080fd5b50356106f7565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610234610744565b610234600480360360208110156102db57600080fd5b503561074a565b610316600480360360608110156102f857600080fd5b508035906001600160a01b0360208201351690604001351515610818565b005b6103356004803603602081101561032e57600080fd5b5035610a7c565b604080516001600160a01b039092168252519081900360200190f35b6103166004803603604081101561036757600080fd5b5080359060200135610ae5565b610234610b94565b6103166004803603602081101561039257600080fd5b5035610b9a565b610316600480360360208110156103af57600080fd5b5035610da3565b610335610e4f565b6103e4600480360360208110156103d457600080fd5b50356001600160a01b0316610e5e565b604080519115158252519081900360200190f35b610234610f9b565b6103e4610fa1565b610316610faa565b6103166004803603606081101561042657600080fd5b50803590602081013590604001351515610fc9565b610335611094565b6103166110a3565b6103166004803603602081101561046157600080fd5b5035611145565b6103e46004803603602081101561047e57600080fd5b50356001600160a01b03166111aa565b6103356111b7565b6102346111c6565b6104ca600480360360408110156104b457600080fd5b50803590602001356001600160a01b03166111cc565b60408051938452602084019290925282820152519081900360600190f35b610234600480360360208110156104fe57600080fd5b50356111f8565b6103166004803603604081101561051b57600080fd5b506001600160a01b0381358116916020013516611225565b6102346004803603602081101561054957600080fd5b50356001600160a01b0316611425565b6103166004803603604081101561056f57600080fd5b5080359060200135611437565b6103166004803603602081101561059257600080fd5b50356114f5565b610234600480360360208110156105af57600080fd5b5035611552565b610316611564565b6103356115d0565b610316600480360360408110156105dc57600080fd5b50803590602001356115df565b610615600480360360408110156105ff57600080fd5b50803590602001356001600160a01b0316611684565b6040805192835260208301919091528051918290030190f35b6102346116fe565b6103166004803603604081101561064c57600080fd5b506001600160a01b038135811691602001351661170f565b6103166004803603602081101561067a57600080fd5b50356001600160a01b03166117fc565b60055490565b6000600e54600014156106a5575060006106f2565b600b548211156106ee576106e7600e546106db60016106cf600b54876118f490919063ffffffff16565b9063ffffffff6118f416565b9063ffffffff61193616565b90506106f2565b5060005b919050565b6005818154811061070457fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b600a5481565b6000808061075784610690565b9050600061076443610690565b90505b808210156107e357600b54600e5460019093019260009161079f9161079390869063ffffffff61197816565b9063ffffffff6119d116565b90506107d96107cc6107b0836111f8565b6107c0848a63ffffffff6118f416565b9063ffffffff61197816565b859063ffffffff6119d116565b9095509250610767565b61080f6108026107f2436111f8565b6107c0438963ffffffff6118f416565b849063ffffffff6119d116565b95945050505050565b610820611a2b565b6000546001600160a01b03908116911614610870576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6001600160a01b0382166108cb576040805162461bcd60e51b815260206004820152601c60248201527f5f6c70546f6b656e20697320746865207a65726f206164647265737300000000604482015290519081900360640190fd5b80156108d9576108d9610faa565b6000600b5443116108ec57600b546108ee565b435b600a54909150610904908563ffffffff6119d116565b600a556040805160c0810182526001600160a01b038581168252602082018781529282018481526000606084018181526080850182815260a0860183815260058054600180820183559190955296517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0600690950294850180546001600160a01b031916919097161790955595517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db183015591517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db382015592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db4840155517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db590920191909155610a5961068a565b6001600160a01b0390941660009081526008602052604090209303909255505050565b60006001610a886116fe565b03821115610ad4576040805162461bcd60e51b815260206004820152601460248201527306e6f742066696e642074686973206d756c744c560641b604482015290519081900360640190fd5b610adf600183611a2f565b92915050565b60095460ff1615610b39576040805162461bcd60e51b8152602060048201526019602482015278135a5b9a5b99c81a185cc81899595b881cdd5cdc195b991959603a1b604482015290519081900360640190fd5b600060058381548110610b4857fe5b600091825260209091206006909102018054909150610b6f906001600160a01b03166111aa565b15610b8457610b7f838333611a3b565b610b8f565b610b8f838333611dfd565b505050565b600b5481565b600060058281548110610ba957fe5b9060005260206000209060060201905080600201544311610bca5750610da0565b8054600090610be1906001600160a01b03166111aa565b15610c07576005820154610bfc575043600290910155610da0565b506005810154610c91565b8154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c5157600080fd5b505afa158015610c65573d6000803e3d6000fd5b505050506040513d6020811015610c7b57600080fd5b5051905080610c91575043600290910155610da0565b6000610ca0836002015461074a565b905060008111610cb257505050610da0565b6000610cd1600a546106db86600101548561197890919063ffffffff16565b600354604080516340c10f1960e01b81523060048201526024810184905290519293506000926001600160a01b03909216916340c10f199160448082019260209290919082900301818787803b158015610d2a57600080fd5b505af1158015610d3e573d6000803e3d6000fd5b505050506040513d6020811015610d5457600080fd5b505190508015610d9157610d8b610d7a856106db8564e8d4a5100063ffffffff61197816565b60038701549063ffffffff6119d116565b60038601555b43856002018190555050505050505b50565b60095460ff1615610df7576040805162461bcd60e51b8152602060048201526019602482015278135a5b9a5b99c81a185cc81899595b881cdd5cdc195b991959603a1b604482015290519081900360640190fd5b600060058281548110610e0657fe5b600091825260209091206006909102018054909150610e2d906001600160a01b03166111aa565b15610e4157610e3c8233611f94565b610e4b565b610e4b82336121ed565b5050565b6003546001600160a01b031681565b6000610e68611a2b565b6000546001600160a01b03908116911614610eb8576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6001600160a01b038216610f0c576040805162461bcd60e51b81526020600482015260166024820152754c5020697320746865207a65726f206164647265737360501b604482015290519081900360640190fd5b600c546040805163095ea7b360e01b81526001600160a01b039283166004820152600019602482015290519184169163095ea7b3916044808201926020929091908290030181600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050506040513d6020811015610f8d57600080fd5b50610adf90506001836122af565b600e5481565b60095460ff1681565b60055460005b81811015610e4b57610fc181610b9a565b600101610fb0565b610fd1611a2b565b6000546001600160a01b03908116911614611021576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b801561102f5761102f610faa565b611066826107936005868154811061104357fe5b906000526020600020906006020160010154600a546118f490919063ffffffff16565b600a81905550816005848154811061107a57fe5b906000526020600020906006020160010181905550505050565b600d546001600160a01b031681565b6110ab611a2b565b6000546001600160a01b039081169116146110fb576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61114d611a2b565b6000546001600160a01b0390811691161461119d576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6111a5610faa565b600455565b6000610adf6001836122c4565b6000546001600160a01b031690565b60045481565b600660209081526000928352604080842090915290825290208054600182015460029092015490919083565b60008061120483610690565b905061121e8160020a60045461193690919063ffffffff16565b9392505050565b61122d611a2b565b6000546001600160a01b0390811691161461127d576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6001600160a01b0382161580159061129d57506001600160a01b03811615155b6112e4576040805162461bcd60e51b8152602060048201526013602482015272697320746865207a65726f206164647265737360681b604482015290519081900360640190fd5b60095460ff161515600114611337576040805162461bcd60e51b815260206004820152601460248201527327379036b4b734b7339039bab9b832b739b4b7b760611b604482015290519081900360640190fd5b600d80546001600160a01b038085166001600160a01b031992831617909255600c80549284169290911691909117905560006113716116fe565b90505b8015610b8f57600061138860016000611a2f565b6001600160a01b03808216600090815260086020908152604080832054600c548185526007909352818420548251632989754760e11b815260048101919091529151959650949190931692635312ea8e92602480830193919282900301818387803b1580156113f657600080fd5b505af115801561140a573d6000803e3d6000fd5b505050506114196001836122d9565b50505060001901611374565b60086020526000908152604090205481565b61143f611a2b565b6000546001600160a01b0390811691161461148f576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b600161149961068a565b038211156114e3576040805162461bcd60e51b81526020600482015260126024820152711b9bdd08199a5b99081d1a1a5cc81c1bdbdb60721b604482015290519081900360640190fd5b60009182526007602052604090912055565b6114fd611a2b565b6000546001600160a01b0390811691161461154d576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b600e55565b60076020526000908152604090205481565b61156c611a2b565b6000546001600160a01b039081169116146115bc576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6009805460ff19811660ff90911615179055565b600c546001600160a01b031681565b60095460ff1615611633576040805162461bcd60e51b8152602060048201526019602482015278135a5b9a5b99c81a185cc81899595b881cdd5cdc195b991959603a1b604482015290519081900360640190fd5b60006005838154811061164257fe5b600091825260209091206006909102018054909150611669906001600160a01b03166111aa565b1561167957610b7f8383336122ee565b610b8f8383336128b0565b60008060006005858154811061169657fe5b6000918252602090912060069091020180549091506116bd906001600160a01b03166111aa565b156116dd576000806116cf8787612a01565b90955093506116f792505050565b60006116e98686612c44565b9350600092506116f7915050565b9250929050565b600061170a6001612de0565b905090565b611717611a2b565b6000546001600160a01b03908116911614611767576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6001600160a01b0382161580159061178757506001600160a01b03811615155b6117ce576040805162461bcd60e51b8152602060048201526013602482015272697320746865207a65726f206164647265737360681b604482015290519081900360640190fd5b600d80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b611804611a2b565b6000546001600160a01b03908116911614611854576040805162461bcd60e51b81526020600482018190526024820152600080516020613591833981519152604482015290519081900360640190fd5b6001600160a01b0381166118995760405162461bcd60e51b815260040180806020018281038252602681526020018061354a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061121e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612deb565b600061121e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e82565b60008261198757506000610adf565b8282028284828161199457fe5b041461121e5760405162461bcd60e51b81526004018080602001828103825260218152602001806135706021913960400191505060405180910390fd5b60008282018381101561121e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b600061121e8383612ee7565b600060058481548110611a4a57fe5b60009182526020808320878452600680835260408086206001600160a01b0389168752909352919093208054929091029092019250841115611ad3576040805162461bcd60e51b815260206004820152601d60248201527f77697468647261774d6478416e64546f6b656e3a206e6f7420676f6f64000000604482015290519081900360640190fd5b611adc85610b9a565b6000611b0a82600101546106cf64e8d4a510006106db8760030154876000015461197890919063ffffffff16565b90508015611b1c57611b1c8482612f4b565b8415611d6957600d54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b6d57600080fd5b505afa158015611b81573d6000803e3d6000fd5b505050506040513d6020811015611b9757600080fd5b5051600c54600089815260076020526040808220548151630441a3e760e41b81526004810191909152602481018b905290519394506001600160a01b039092169263441a3e7092604480820193929182900301818387803b158015611bfb57600080fd5b505af1158015611c0f573d6000803e3d6000fd5b5050600d54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015611c6057600080fd5b505afa158015611c74573d6000803e3d6000fd5b505050506040513d6020811015611c8a57600080fd5b50516005860154909150611cc690611cb5906106db64e8d4a510006107c0868863ffffffff6118f416565b60048701549063ffffffff6119d116565b6004860181905560028501548554600092611cf692916106cf9164e8d4a51000916106db9163ffffffff61197816565b90508015611d1b57600d54611d1b906001600160a01b0316888363ffffffff6130db16565b8454611d2d908963ffffffff6118f416565b85556005860154611d44908963ffffffff6118f416565b60058701558554611d65906001600160a01b0316888a63ffffffff6130db16565b5050505b60038301548254611d8a9164e8d4a51000916106db9163ffffffff61197816565b600183015560048301548254611db09164e8d4a51000916106db9163ffffffff61197816565b600283015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b600060058481548110611e0c57fe5b60009182526020808320878452600680835260408086206001600160a01b0389168752909352919093208054929091029092019250841115611e8d576040805162461bcd60e51b81526020600482015260156024820152741dda5d1a191c985dd3591e0e881b9bdd0819dbdbd9605a1b604482015290519081900360640190fd5b611e9685610b9a565b6000611ec482600101546106cf64e8d4a510006106db8760030154876000015461197890919063ffffffff16565b90508015611ed657611ed68482612f4b565b8415611f26578154611eee908663ffffffff6118f416565b82556005830154611f05908663ffffffff6118f416565b60058401558254611f26906001600160a01b0316858763ffffffff6130db16565b60038301548254611f479164e8d4a51000916106db9163ffffffff61197816565b600183015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b600060058381548110611fa357fe5b60009182526020808320868452600680835260408086206001600160a01b03808a1688529085528187208054600d5484516370a0823160e01b8152306004820152945195909802909501985096939593949316926370a0823192602480840193829003018186803b15801561201757600080fd5b505afa15801561202b573d6000803e3d6000fd5b505050506040513d602081101561204157600080fd5b5051600c54600088815260076020526040808220548151630441a3e760e41b815260048101919091526024810187905290519394506001600160a01b039092169263441a3e7092604480820193929182900301818387803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b5050600d54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b15801561210a57600080fd5b505afa15801561211e573d6000803e3d6000fd5b505050506040513d602081101561213457600080fd5b5051600586015490915061215f90611cb5906106db64e8d4a510006107c0868863ffffffff6118f416565b600486015560008085556001850155845461218a906001600160a01b0316878563ffffffff6130db16565b600585015461219f908463ffffffff6118f416565b600586015560408051848152905188916001600160a01b038916917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050505050565b6000600583815481106121fc57fe5b60009182526020808320868452600680835260408086206001600160a01b03808a1688529452852080548682556001820196909655930201805490945091929161224e9116858363ffffffff6130db16565b6005830154612263908263ffffffff6118f416565b600584015560408051828152905186916001600160a01b038716917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a35050505050565b600061121e836001600160a01b03841661312d565b600061121e836001600160a01b038416613177565b600061121e836001600160a01b03841661318f565b6000600584815481106122fd57fe5b60009182526020808320878452600680835260408086206001600160a01b0389168752909352919093209102909101915061233785610b9a565b80541561256b57600061236c82600101546106cf64e8d4a510006106db8760030154876000015461197890919063ffffffff16565b9050801561237e5761237e8482612f4b565b600d54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123c957600080fd5b505afa1580156123dd573d6000803e3d6000fd5b505050506040513d60208110156123f357600080fd5b5051600c54600089815260076020526040808220548151631c57762b60e31b815260048101919091526024810183905290519394506001600160a01b039092169263e2bbb15892604480820193929182900301818387803b15801561245757600080fd5b505af115801561246b573d6000803e3d6000fd5b5050600d54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156124bc57600080fd5b505afa1580156124d0573d6000803e3d6000fd5b505050506040513d60208110156124e657600080fd5b5051600586015490915061251190611cb5906106db64e8d4a510006107c0868863ffffffff6118f416565b600486018190556002850154855460009261254192916106cf9164e8d4a51000916106db9163ffffffff61197816565b9050801561256657600d54612566906001600160a01b0316888363ffffffff6130db16565b505050505b831561281d57815461258e906001600160a01b031684308763ffffffff61325516565b600582015461264357600c54600086815260076020526040808220548151631c57762b60e31b815260048101919091526024810188905290516001600160a01b039093169263e2bbb1589260448084019391929182900301818387803b1580156125f757600080fd5b505af115801561260b573d6000803e3d6000fd5b50508254612622925090508563ffffffff6119d116565b81556005820154612639908563ffffffff6119d116565b600583015561281d565b600d54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561268e57600080fd5b505afa1580156126a2573d6000803e3d6000fd5b505050506040513d60208110156126b857600080fd5b5051600c54600088815260076020526040808220548151631c57762b60e31b81526004810191909152602481018a905290519394506001600160a01b039092169263e2bbb15892604480820193929182900301818387803b15801561271c57600080fd5b505af1158015612730573d6000803e3d6000fd5b5050600d54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b15801561278157600080fd5b505afa158015612795573d6000803e3d6000fd5b505050506040513d60208110156127ab57600080fd5b505160058501549091506127e7906127d6906106db64e8d4a510006107c0868863ffffffff6118f416565b60048601549063ffffffff6119d116565b600485015582546127fe908763ffffffff6119d116565b83556005840154612815908763ffffffff6119d116565b600585015550505b6003820154815461283e9164e8d4a51000916106db9163ffffffff61197816565b6001820155600482015481546128649164e8d4a51000916106db9163ffffffff61197816565b600282015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b6000600584815481106128bf57fe5b60009182526020808320878452600680835260408086206001600160a01b038916875290935291909320910290910191506128f985610b9a565b80541561294257600061292e82600101546106cf64e8d4a510006106db8760030154876000015461197890919063ffffffff16565b90508015612940576129408482612f4b565b505b8315612994578154612965906001600160a01b031684308763ffffffff61325516565b8054612977908563ffffffff6119d116565b8155600582015461298e908563ffffffff6119d116565b60058301555b600382015481546129b59164e8d4a51000916106db9163ffffffff61197816565b600182015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b600080600060058581548110612a1357fe5b60009182526020808320888452600680835260408086206001600160a01b038b168752909352919093209102909101600381015460048201548354929450909115612c3457600c54600089815260076020908152604080832054815163e4c75c2760e01b81526004810191909152306024820152905192936001600160a01b03169263e4c75c2792604480840193919291829003018186803b158015612ab857600080fd5b505afa158015612acc573d6000803e3d6000fd5b505050506040513d6020811015612ae257600080fd5b50516005860154909150612b1690612b09906106db8464e8d4a5100063ffffffff61197816565b839063ffffffff6119d116565b91506000612b4285600201546106cf64e8d4a510006106db878a6000015461197890919063ffffffff16565b90508560020154431115612bee576000612b5f876002015461074a565b90506000612b80600a546106db8a600101548561197890919063ffffffff16565b9050612bb2612ba589600501546106db64e8d4a510008561197890919063ffffffff16565b879063ffffffff6119d116565b9550612bdc87600101546106cf64e8d4a510006106db8a8c6000015461197890919063ffffffff16565b839950995050505050505050506116f7565b8560020154431415612c3157612c2285600101546106cf64e8d4a510006106db888a6000015461197890919063ffffffff16565b975095506116f7945050505050565b50505b5060009788975095505050505050565b60008060058481548110612c5457fe5b60009182526020808320878452600680835260408086206001600160a01b03808b16885290855281872060039390960290930191820154825482516370a0823160e01b815230600482015292519398509596909590949316926370a0823192602480840193829003018186803b158015612ccd57600080fd5b505afa158015612ce1573d6000803e3d6000fd5b505050506040513d6020811015612cf757600080fd5b5051835490915015612dd3578360020154431115612d94576000612d1e856002015461074a565b90506000612d3f600a546106db88600101548561197890919063ffffffff16565b9050612d5d6107cc846106db8464e8d4a5100063ffffffff61197816565b9350612d8785600101546106cf64e8d4a510006106db888a6000015461197890919063ffffffff16565b9650505050505050610adf565b8360020154431415612dd357612dc883600101546106cf64e8d4a510006106db86886000015461197890919063ffffffff16565b945050505050610adf565b5060009695505050505050565b6000610adf826132b5565b60008184841115612e7a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e3f578181015183820152602001612e27565b50505050905090810190601f168015612e6c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612ed15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e3f578181015183820152602001612e27565b506000838581612edd57fe5b0495945050505050565b81546000908210612f295760405162461bcd60e51b81526004018080602001828103825260228152602001806135286022913960400191505060405180910390fd5b826000018281548110612f3857fe5b9060005260206000200154905092915050565b600354604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b5051905080821115613054576003546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561302257600080fd5b505af1158015613036573d6000803e3d6000fd5b505050506040513d602081101561304c57600080fd5b50610b8f9050565b6003546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156130aa57600080fd5b505af11580156130be573d6000803e3d6000fd5b505050506040513d60208110156130d457600080fd5b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b8f9084906132b9565b60006131398383613177565b61316f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610adf565b506000610adf565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561324b57835460001980830191908101906000908790839081106131c257fe5b90600052602060002001549050808760000184815481106131df57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061320f57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610adf565b6000915050610adf565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526132af9085906132b9565b50505050565b5490565b606061330e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661336a9092919063ffffffff16565b805190915015610b8f5780806020019051602081101561332d57600080fd5b5051610b8f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806135b1602a913960400191505060405180910390fd5b60606133798484600085613381565b949350505050565b606061338c856134ee565b6133dd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061341c5780518252601f1990920191602091820191016133fd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461347e576040519150601f19603f3d011682016040523d82523d6000602084013e613483565b606091505b509150915081156134975791506133799050565b8051156134a75780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612e3f578181015183820152602001612e27565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061337957505015159291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220105d7d5d0436b690e8034d1dc63d2995521faae76bc8f25260135ca6de1adcf064736f6c6343000606003300000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000022b1c8c1227a000000000000000000000000000000000000000000000000000000000000000152e0e

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

00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000022b1c8c1227a000000000000000000000000000000000000000000000000000000000000000152e0e

-----Decoded View---------------
Arg [0] : _mdx (address): 0x25d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [1] : _mdxPerBlock (uint256): 40000000000000000000
Arg [2] : _startBlock (uint256): 1388046

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [1] : 0000000000000000000000000000000000000000000000022b1c8c1227a00000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000152e0e


Deployed ByteCode Sourcemap

29562:19640:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29562:19640:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;32272:93:0;;;:::i;:::-;;;;;;;;;;;;;;;;35630:291;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35630:291:0;;:::i;30697:26::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30697:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;30697:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31185:34;;;:::i;36104:584::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36104:584:0;;:::i;34273:697::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34273:697:0;;;-1:-1:-1;;;;;34273:697:0;;;;;;;;;;;;:::i;:::-;;32881:199;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32881:199:0;;:::i;:::-;;;;-1:-1:-1;;;;;32881:199:0;;;;;;;;;;;;;;44412:313;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44412:313:0;;;;;;;:::i;31275:25::-;;;:::i;37027:1111::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37027:1111:0;;:::i;47146:305::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47146:305:0;;:::i;30577:15::-;;;:::i;32373:252::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32373:252:0;-1:-1:-1;;;;;32373:252:0;;:::i;:::-;;;;;;;;;;;;;;;;;;31454:38;;;:::i;31064:26::-;;;:::i;36771:180::-;;;:::i;35065:304::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35065:304:0;;;;;;;;;;;;;;:::i;31386:26::-;;;:::i;20563:148::-;;;:::i;32128:136::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32128:136:0;;:::i;32633:120::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32633:120:0;-1:-1:-1;;;;;32633:120:0;;:::i;19921:79::-;;;:::i;30637:26::-;;;:::i;30779:64::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30779:64:0;;;;;;-1:-1:-1;;;;;30779:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;35929:167;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35929:167:0;;:::i;33433:671::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;33433:671:0;;;;;;;;;;:::i;30992:42::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30992:42:0;-1:-1:-1;;;;;30992:42:0;;:::i;35444:178::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35444:178:0;;;;;;;:::i;31967:100::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31967:100:0;;:::i;30902:49::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30902:49:0;;:::i;33088:72::-;;;:::i;31333:25::-;;;:::i;41018:310::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41018:310:0;;;;;;;:::i;38201:449::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38201:449:0;;;;;;-1:-1:-1;;;;;38201:449:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32761:112;;;:::i;33168:257::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;33168:257:0;;;;;;;;;;:::i;20866:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20866:244:0;-1:-1:-1;;;;;20866:244:0;;:::i;32272:93::-;32342:8;:15;32272:93;:::o;35630:291::-;35687:7;35711:13;;35728:1;35711:18;35707:59;;;-1:-1:-1;35753:1:0;35746:8;;35707:59;35794:10;;35780:11;:24;35776:119;;;35828:55;35869:13;;35829:34;35861:1;35829:27;35845:10;;35829:11;:15;;:27;;;;:::i;:::-;:31;:34;:31;:34;:::i;:::-;35828:40;:55;:40;:55;:::i;:::-;35821:62;;;;35776:119;-1:-1:-1;35912:1:0;35630:291;;;;:::o;30697:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30697:26:0;;;;-1:-1:-1;30697:26:0;;;;;:::o;31185:34::-;;;;:::o;36104:584::-;36178:7;;;36244:23;36250:16;36244:5;:23::i;:::-;36232:35;;36278:9;36290:19;36296:12;36290:5;:19::i;:::-;36278:31;;36320:228;36331:1;36327;:5;36320:228;;;36404:10;;36385:13;;36349:3;;;;;36367:9;;36379:36;;:20;;36349:3;;36379:20;:5;:20;:::i;:::-;:24;:36;:24;:36;:::i;:::-;36367:48;;36444:57;36460:40;36490:9;36497:1;36490:6;:9::i;:::-;36461:23;:1;36467:16;36461:23;:5;:23;:::i;:::-;36460:29;:40;:29;:40;:::i;:::-;36444:11;;:57;:15;:57;:::i;:::-;36535:1;;-1:-1:-1;36430:71:0;-1:-1:-1;36320:228:0;;;36572:79;36588:62;36629:20;36636:12;36629:6;:20::i;:::-;36589:34;:12;36606:16;36589:34;:16;:34;:::i;36588:62::-;36572:11;;:79;:15;:79;:::i;:::-;36558:93;36104:584;-1:-1:-1;;;;;36104:584:0:o;34273:697::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34378:31:0;::::1;34370:72;;;::::0;;-1:-1:-1;;;34370:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34457:11;34453:61;;;34485:17;:15;:17::i;:::-;34524:23;34565:10;;34550:12;:25;:53;;34593:10;;34550:53;;;34578:12;34550:53;34632:15;::::0;34524:79;;-1:-1:-1;34632:32:0::1;::::0;34652:11;34632:32:::1;:19;:32;:::i;:::-;34614:15;:50:::0;34689:216:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34689:216:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;34689:216:0;;;;;;;;;;;;;;;;;;34675:8:::1;27:10:-1::0;;39:1:::1;23:18:::0;;::::1;45:23:::0;;34675:231:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;34675:231:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34946:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;34917:26:0;;::::1;;::::0;;;:7:::1;:26;::::0;;;;34946:16;::::1;34917:45:::0;;;-1:-1:-1;;;34273:697:0:o;32881:199::-;32942:7;32997:1;32977:17;:15;:17::i;:::-;:21;32969:4;:29;;32961:62;;;;;-1:-1:-1;;;32961:62:0;;;;;;;;;;;;-1:-1:-1;;;32961:62:0;;;;;;;;;;;;;;;33041:31;33058:7;33067:4;33041:16;:31::i;:::-;33034:38;32881:199;-1:-1:-1;;32881:199:0:o;44412:313::-;49134:6;;;;:15;49126:53;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;;;;44488:21:::1;44512:8;44521:4;44512:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;44558:12:::0;;44512:14;;-1:-1:-1;44541:31:0::1;::::0;-1:-1:-1;;;;;44558:12:0::1;44541:8;:31::i;:::-;44537:181;;;44589:46;44609:4;44615:7;44624:10;44589:19;:46::i;:::-;44537:181;;;44668:38;44680:4;44686:7;44695:10;44668:11;:38::i;:::-;49190:1;44412:313:::0;;:::o;31275:25::-;;;;:::o;37027:1111::-;37079:21;37103:8;37112:4;37103:14;;;;;;;;;;;;;;;;;;37079:38;;37148:4;:20;;;37132:12;:36;37128:75;;37185:7;;;37128:75;37261:12;;37213:16;;37244:31;;-1:-1:-1;;;;;37261:12:0;37244:8;:31::i;:::-;37240:436;;;37296:16;;;;37292:122;;-1:-1:-1;37361:12:0;37338:20;;;;:35;37392:7;;37292:122;-1:-1:-1;37439:16:0;;;;37240:436;;;37499:12;;:37;;;-1:-1:-1;;;37499:37:0;;37530:4;37499:37;;;;;;-1:-1:-1;;;;;37499:12:0;;;;:22;;:37;;;;;;;;;;;;;;;:12;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;37499:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37499:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37499:37:0;;-1:-1:-1;37555:13:0;37551:114;;-1:-1:-1;37612:12:0;37589:20;;;;:35;37643:7;;37551:114;37686:19;37708:39;37726:4;:20;;;37708:17;:39::i;:::-;37686:61;;37777:1;37762:11;:16;37758:55;;37795:7;;;;;37758:55;37823:17;37843:53;37880:15;;37843:32;37859:4;:15;;;37843:11;:15;;:32;;;;:::i;:53::-;37921:3;;:34;;;-1:-1:-1;;;37921:34:0;;37938:4;37921:34;;;;;;;;;;;;37823:73;;-1:-1:-1;37907:11:0;;-1:-1:-1;;;;;37921:3:0;;;;:8;;:34;;;;;;;;;;;;;;;37907:11;37921:3;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;37921:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37921:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37921:34:0;;-1:-1:-1;37966:119:0;;;;38015:58;38039:33;38063:8;38039:19;:9;38053:4;38039:19;:13;:19;:::i;:33::-;38015:19;;;;;:58;:23;:58;:::i;:::-;37993:19;;;:80;37966:119;38118:12;38095:4;:20;;:35;;;;37027:1111;;;;;;;:::o;47146:305::-;49134:6;;;;:15;49126:53;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;;;;47214:21:::1;47238:8;47247:4;47238:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;47284:12:::0;;47238:14;;-1:-1:-1;47267:31:0::1;::::0;-1:-1:-1;;;;;47284:12:0::1;47267:8;:31::i;:::-;47263:181;;;47315:46;47344:4;47350:10;47315:28;:46::i;:::-;47263:181;;;47394:38;47415:4;47421:10;47394:20;:38::i;:::-;49190:1;47146:305:::0;:::o;30577:15::-;;;-1:-1:-1;;;;;30577:15:0;;:::o;32373:252::-;32434:4;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32459:20:0;::::1;32451:55;;;::::0;;-1:-1:-1;;;32451:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32451:55:0;;;;;;;;;;;;;::::1;;32540:10;::::0;32517:48:::1;::::0;;-1:-1:-1;;;32517:48:0;;-1:-1:-1;;;;;32540:10:0;;::::1;32517:48;::::0;::::1;::::0;-1:-1:-1;;32517:48:0;;;;;;:22;;::::1;::::0;::::1;::::0;:48;;;;;::::1;::::0;;;;;;;;;32540:10:::1;32517:22:::0;:48;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32517:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32517:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32583:34:0::1;::::0;-1:-1:-1;32601:7:0::1;32610:6:::0;32583:17:::1;:34::i;31454:38::-:0;;;;:::o;31064:26::-;;;;;;:::o;36771:180::-;36833:8;:15;36816:14;36859:85;36887:6;36881:3;:12;36859:85;;;36917:15;36928:3;36917:10;:15::i;:::-;36895:5;;36859:85;;35065:304;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;35163:11:::1;35159:61;;;35191:17;:15;:17::i;:::-;35248:63;35299:11;35248:46;35268:8;35277:4;35268:14;;;;;;;;;;;;;;;;;;:25;;;35248:15;;:19;;:46;;;;:::i;:63::-;35230:15;:81;;;;35350:11;35322:8;35331:4;35322:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;35065:304:::0;;;:::o;31386:26::-;;;-1:-1:-1;;;;;31386:26:0;;:::o;20563:148::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;20670:1:::1;20654:6:::0;;20633:40:::1;::::0;-1:-1:-1;;;;;20654:6:0;;::::1;::::0;20633:40:::1;::::0;20670:1;;20633:40:::1;20701:1;20684:19:::0;;-1:-1:-1;;;;;;20684:19:0::1;::::0;;20563:148::o;32128:136::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;32202:17:::1;:15;:17::i;:::-;32230:11;:26:::0;32128:136::o;32633:120::-;32685:4;32709:36;32732:7;32741:3;32709:22;:36::i;19921:79::-;19959:7;19986:6;-1:-1:-1;;;;;19986:6:0;19921:79;:::o;30637:26::-;;;;:::o;30779:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35929:167::-;35987:7;36007:14;36024:18;36030:11;36024:5;:18::i;:::-;36007:35;;36060:28;36081:6;36076:1;:11;36060;;:15;;:28;;;;:::i;:::-;36053:35;35929:167;-1:-1:-1;;;35929:167:0:o;33433:671::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33535:26:0;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;33565:25:0;::::1;::::0;::::1;33535:55;33527:87;;;::::0;;-1:-1:-1;;;33527:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33527:87:0;;;;;;;;;;;;;::::1;;33633:6;::::0;::::1;;:14;;:6:::0;:14:::1;33625:47;;;::::0;;-1:-1:-1;;;33625:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33625:47:0;;;;;;;;;;;;;::::1;;33683:11;:26:::0;;-1:-1:-1;;;;;33683:26:0;;::::1;-1:-1:-1::0;;;;;;33683:26:0;;::::1;;::::0;;;33720:10:::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;33683:11:::1;33772:17;:15;:17::i;:::-;33755:34;;33800:297;33807:10:::0;;33800:297:::1;;33834:16;33853:28;33870:7;33879:1;33853:16;:28::i;:::-;-1:-1:-1::0;;;;;33910:17:0;;::::1;33896:11;33910:17:::0;;;:7:::1;:17;::::0;;;;;;;;33958:10:::1;::::0;33988:19;;;:14:::1;:19:::0;;;;;;;33942:66;;-1:-1:-1;;;33942:66:0;;::::1;::::0;::::1;::::0;;;;;;33834:47;;-1:-1:-1;33910:17:0;33958:10;;;::::1;::::0;33942:45:::1;::::0;:66;;;;;33896:11;;33942:66;;;;;33896:11;33958:10;33942:66;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33942:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33942:66:0;;;;34023:39;34044:7;34053:8;34023:20;:39::i;:::-;-1:-1:-1::0;;;;;34077:8:0;33800:297:::1;;30992:42:::0;;;;;;;;;;;;;:::o;35444:178::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;35552:1:::1;35537:12;:10;:12::i;:::-;:16;35529:4;:24;;35521:55;;;::::0;;-1:-1:-1;;;35521:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35521:55:0;;;;;;;;;;;;;::::1;;35587:20;::::0;;;:14:::1;:20;::::0;;;;;:27;35444:178::o;31967:100::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;32037:13:::1;:22:::0;31967:100::o;30902:49::-;;;;;;;;;;;;;:::o;33088:72::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;33146:6:::1;::::0;;-1:-1:-1;;33136:16:0;::::1;33146:6;::::0;;::::1;33145:7;33136:16;::::0;;33088:72::o;31333:25::-;;;-1:-1:-1;;;;;31333:25:0;;:::o;41018:310::-;49134:6;;;;:15;49126:53;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;-1:-1:-1;;;49126:53:0;;;;;;;;;;;;;;;41093:21:::1;41117:8;41126:4;41117:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;41163:12:::0;;41117:14;;-1:-1:-1;41146:31:0::1;::::0;-1:-1:-1;;;;;41163:12:0::1;41146:8;:31::i;:::-;41142:179;;;41194:45;41213:4;41219:7;41228:10;41194:18;:45::i;41142:179::-;41272:37;41283:4;41289:7;41298:10;41272;:37::i;38201:449::-:0;38270:7;38279;38298:21;38322:8;38331:4;38322:14;;;;;;;;;;;;;;;;;;;;;38368:12;;38322:14;;-1:-1:-1;38351:31:0;;-1:-1:-1;;;;;38368:12:0;38351:8;:31::i;:::-;38347:296;;;38400:17;38419:19;38442:31;38461:4;38467:5;38442:18;:31::i;:::-;38399:74;;-1:-1:-1;38399:74:0;-1:-1:-1;38488:31:0;;-1:-1:-1;;;38488:31:0;38347:296;38552:17;38572:23;38583:4;38589:5;38572:10;:23::i;:::-;38552:43;-1:-1:-1;38629:1:0;;-1:-1:-1;38610:21:0;;-1:-1:-1;;38610:21:0;38201:449;;;;;;:::o;32761:112::-;32809:7;32836:29;32857:7;32836:20;:29::i;:::-;32829:36;;32761:112;:::o;33168:257::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33266:26:0;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;;;;;;33296:25:0;::::1;::::0;::::1;33266:55;33258:87;;;::::0;;-1:-1:-1;;;33258:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33258:87:0;;;;;;;;;;;;;::::1;;33356:11;:26:::0;;-1:-1:-1;;;;;33356:26:0;;::::1;-1:-1:-1::0;;;;;;33356:26:0;;::::1;;::::0;;;33393:10:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;33168:257::o;20866:244::-;20143:12;:10;:12::i;:::-;20133:6;;-1:-1:-1;;;;;20133:6:0;;;:22;;;20125:67;;;;;-1:-1:-1;;;20125:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20125:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20955:22:0;::::1;20947:73;;;;-1:-1:-1::0;;;20947:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21057:6;::::0;;21036:38:::1;::::0;-1:-1:-1;;;;;21036:38:0;;::::1;::::0;21057:6;::::1;::::0;21036:38:::1;::::0;::::1;21085:6;:17:::0;;-1:-1:-1;;;;;;21085:17:0::1;-1:-1:-1::0;;;;;21085:17:0;;;::::1;::::0;;;::::1;::::0;;20866:244::o;4106:136::-;4164:7;4191:43;4195:1;4198;4191:43;;;;;;;;;;;;;;;;;:3;:43::i;5943:132::-;6001:7;6028:39;6032:1;6035;6028:39;;;;;;;;;;;;;;;;;:3;:39::i;4996:471::-;5054:7;5299:6;5295:47;;-1:-1:-1;5329:1:0;5322:8;;5295:47;5366:5;;;5370:1;5366;:5;:1;5390:5;;;;;:10;5382:56;;;;-1:-1:-1;;;5382:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3642:181;3700:7;3732:5;;;3756:6;;;;3748:46;;;;;-1:-1:-1;;;3748:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18521:106;18609:10;18521:106;:::o;27384:149::-;27458:7;27501:22;27505:3;27517:5;27501:3;:22::i;44733:1521::-;44827:21;44851:8;44860:4;44851:14;;;;;;;;;;;;;;;;44900;;;44851;44900;;;;;;;-1:-1:-1;;;;;44900:21:0;;;;;;;;;;;44940:11;;44851:14;;;;;;;;-1:-1:-1;;;44940:22:0;44932:64;;;;;-1:-1:-1;;;44932:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45007:16;45018:4;45007:10;:16::i;:::-;45034:21;45058:67;45109:4;:15;;;45058:46;45099:4;45058:36;45074:4;:19;;;45058:4;:11;;;:15;;:36;;;;:::i;:67::-;45034:91;-1:-1:-1;45140:17:0;;45136:87;;45174:37;45190:5;45197:13;45174:15;:37::i;:::-;45237:11;;45233:809;;45294:11;;45287:44;;;-1:-1:-1;;;45287:44:0;;45325:4;45287:44;;;;;;45265:19;;-1:-1:-1;;;;;45294:11:0;;45287:29;;:44;;;;;;;;;;;;;;45294:11;45287:44;;;2:2:-1;;;;27:1;24;17:12;2:2;45287:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45287:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45287:44:0;45362:10;;;45383:20;;;:14;45287:44;45383:20;;;;;;45346:67;;-1:-1:-1;;;45346:67:0;;;;;;;;;;;;;;;;;45287:44;;-1:-1:-1;;;;;;45362:10:0;;;;45346:36;;:67;;;;;45362:10;45346:67;;;;;;45362:10;;45346:67;;;2:2:-1;;;;27:1;24;17:12;2:2;45346:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45456:11:0;;45449:44;;;-1:-1:-1;;;45449:44:0;;45487:4;45449:44;;;;;;45428:18;;-1:-1:-1;;;;;;45456:11:0;;;;-1:-1:-1;45449:29:0;;:44;;;;;;;;;;;;;;45456:11;45449:44;;;2:2:-1;;;;27:1;24;17:12;2:2;45449:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45449:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45449:44:0;45602:16;;;;45449:44;;-1:-1:-1;45533:87:0;;45560:59;;:37;45592:4;45560:27;45449:44;45575:11;45560:27;:14;:27;:::i;:59::-;45533:22;;;;;:87;:26;:87;:::i;:::-;45508:22;;;:112;;;45712:21;;;;45658:11;;45635:20;;45658:76;;45712:21;45658:49;;45702:4;;45658:39;;;:15;:39;:::i;:76::-;45635:99;-1:-1:-1;45753:16:0;;45749:110;;45797:11;;45790:53;;-1:-1:-1;;;;;45797:11:0;45823:5;45830:12;45790:53;:32;:53;:::i;:::-;45887:11;;:24;;45903:7;45887:24;:15;:24;:::i;:::-;45873:38;;45945:16;;;;:29;;45966:7;45945:29;:20;:29;:::i;:::-;45926:16;;;:48;45989:12;;:41;;-1:-1:-1;;;;;45989:12:0;46015:5;46022:7;45989:41;:25;:41;:::i;:::-;45233:809;;;;46086:19;;;;46070:11;;:46;;46111:4;;46070:36;;;:15;:36;:::i;:46::-;46052:15;;;:64;46167:22;;;;46151:11;;:49;;46195:4;;46151:39;;;:15;:39;:::i;:49::-;46127:21;;;:73;46216:30;;;;;;;;46232:4;;-1:-1:-1;;;;;46216:30:0;;;;;;;;;;;;44733:1521;;;;;;:::o;46262:813::-;46348:21;46372:8;46381:4;46372:14;;;;;;;;;;;;;;;;46421;;;46372;46421;;;;;;;-1:-1:-1;;;;;46421:21:0;;;;;;;;;;;46461:11;;46372:14;;;;;;;;-1:-1:-1;;;46461:22:0;46453:56;;;;;-1:-1:-1;;;46453:56:0;;;;;;;;;;;;-1:-1:-1;;;46453:56:0;;;;;;;;;;;;;;;46520:16;46531:4;46520:10;:16::i;:::-;46547:21;46571:67;46622:4;:15;;;46571:46;46612:4;46571:36;46587:4;:19;;;46571:4;:11;;;:15;;:36;;;;:::i;:67::-;46547:91;-1:-1:-1;46653:17:0;;46649:87;;46687:37;46703:5;46710:13;46687:15;:37::i;:::-;46750:11;;46746:201;;46792:11;;:24;;46808:7;46792:24;:15;:24;:::i;:::-;46778:38;;46850:16;;;;:29;;46871:7;46850:29;:20;:29;:::i;:::-;46831:16;;;:48;46894:12;;:41;;-1:-1:-1;;;;;46894:12:0;46920:5;46927:7;46894:41;:25;:41;:::i;:::-;46991:19;;;;46975:11;;:46;;47016:4;;46975:36;;;:15;:36;:::i;:46::-;46957:15;;;:64;47037:30;;;;;;;;47053:4;;-1:-1:-1;;;;;47037:30:0;;;;;;;;;;;;46262:813;;;;;;:::o;47459:799::-;47545:21;47569:8;47578:4;47569:14;;;;;;;;;;;;;;;;47618;;;47569;47618;;;;;;;-1:-1:-1;;;;;47618:21:0;;;;;;;;;;;47667:11;;47718;;47711:44;;-1:-1:-1;;;47711:44:0;;47749:4;47711:44;;;;;;47569:14;;;;;;;;-1:-1:-1;47618:21:0;47667:11;;47569:14;;47718:11;;;47711:29;;:44;;;;;;;;;;47718:11;47711:44;;;2:2:-1;;;;27:1;24;17:12;2:2;47711:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47711:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47711:44:0;47782:10;;;47803:20;;;:14;47711:44;47803:20;;;;;;47766:66;;-1:-1:-1;;;47766:66:0;;;;;;;;;;;;;;;;;47711:44;;-1:-1:-1;;;;;;47782:10:0;;;;47766:36;;:66;;;;;47782:10;47766:66;;;;;;47782:10;;47766:66;;;2:2:-1;;;;27:1;24;17:12;2:2;47766:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;47871:11:0;;47864:44;;;-1:-1:-1;;;47864:44:0;;47902:4;47864:44;;;;;;47843:18;;-1:-1:-1;;;;;;47871:11:0;;;;-1:-1:-1;47864:29:0;;:44;;;;;;;;;;;;;;47871:11;47864:44;;;2:2:-1;;;;27:1;24;17:12;2:2;47864:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47864:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47864:44:0;48013:16;;;;47864:44;;-1:-1:-1;47944:87:0;;47971:59;;:37;48003:4;47971:27;47864:44;47986:11;47971:27;:14;:27;:::i;47944:87::-;47919:22;;;:112;48056:1;48042:15;;;48068;;;:19;48098:12;;:40;;-1:-1:-1;;;;;48098:12:0;48124:5;48131:6;48098:40;:25;:40;:::i;:::-;48168:16;;;;:28;;48189:6;48168:28;:20;:28;:::i;:::-;48149:16;;;:47;48212:38;;;;;;;;48237:4;;-1:-1:-1;;;;;48212:38:0;;;;;;;;;;;;47459:799;;;;;;;:::o;48266:438::-;48344:21;48368:8;48377:4;48368:14;;;;;;;;;;;;;;;;48417;;;48368;48417;;;;;;;-1:-1:-1;;;;;48417:21:0;;;;;;;;;48466:11;;48488:15;;;-1:-1:-1;48514:15:0;;:19;;;;48368:14;;;48544:12;;48368:14;;-1:-1:-1;48417:21:0;;48466:11;48544:40;;:12;48432:5;48466:11;48544:40;:25;:40;:::i;:::-;48614:16;;;;:28;;48635:6;48614:28;:20;:28;:::i;:::-;48595:16;;;:47;48658:38;;;;;;;;48683:4;;-1:-1:-1;;;;;48658:38:0;;;;;;;;;;;;48266:438;;;;;:::o;26115:143::-;26185:4;26209:41;26214:3;-1:-1:-1;;;;;26234:14:0;;26209:4;:41::i;26669:158::-;26749:4;26773:46;26783:3;-1:-1:-1;;;;;26803:14:0;;26773:9;:46::i;26434:149::-;26507:4;26531:44;26539:3;-1:-1:-1;;;;;26559:14:0;;26531:7;:44::i;41336:2196::-;41429:21;41453:8;41462:4;41453:14;;;;;;;;;;;;;;;;41502;;;41453;41502;;;;;;;-1:-1:-1;;;;;41502:21:0;;;;;;;;;;;41453:14;;;;;;-1:-1:-1;41534:16:0;41511:4;41534:10;:16::i;:::-;41565:11;;:15;41561:849;;41597:21;41621:67;41672:4;:15;;;41621:46;41662:4;41621:36;41637:4;:19;;;41621:4;:11;;;:15;;:36;;;;:::i;:67::-;41597:91;-1:-1:-1;41707:17:0;;41703:95;;41745:37;41761:5;41768:13;41745:15;:37::i;:::-;41841:11;;41834:44;;;-1:-1:-1;;;41834:44:0;;41872:4;41834:44;;;;;;41812:19;;-1:-1:-1;;;;;41841:11:0;;41834:29;;:44;;;;;;;;;;;;;;41841:11;41834:44;;;2:2:-1;;;;27:1;24;17:12;2:2;41834:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41834:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41834:44:0;41909:10;;;41929:20;;;:14;41834:44;41929:20;;;;;;41893:60;;-1:-1:-1;;;41893:60:0;;;;;;;;;;;;;;;;;41834:44;;-1:-1:-1;;;;;;41909:10:0;;;;41893:35;;:60;;;;;41909:10;41893:60;;;;;;41909:10;;41893:60;;;2:2:-1;;;;27:1;24;17:12;2:2;41893:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41996:11:0;;41989:44;;;-1:-1:-1;;;41989:44:0;;42027:4;41989:44;;;;;;41968:18;;-1:-1:-1;;;;;;41996:11:0;;;;-1:-1:-1;41989:29:0;;:44;;;;;;;;;;;;;;41996:11;41989:44;;;2:2:-1;;;;27:1;24;17:12;2:2;41989:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41989:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41989:44:0;42142:16;;;;41989:44;;-1:-1:-1;42073:87:0;;42100:59;;:37;42132:4;42100:27;41989:44;42115:11;42100:27;:14;:27;:::i;42073:87::-;42048:22;;;:112;;;42252:21;;;;42198:11;;42175:20;;42198:76;;42252:21;42198:49;;42242:4;;42198:39;;;:15;:39;:::i;:76::-;42175:99;-1:-1:-1;42293:16:0;;42289:110;;42337:11;;42330:53;;-1:-1:-1;;;;;42337:11:0;42363:5;42370:12;42330:53;:32;:53;:::i;:::-;41561:849;;;;;42424:11;;42420:901;;42452:12;;:60;;-1:-1:-1;;;;;42452:12:0;42482:5;42497:4;42504:7;42452:60;:29;:60;:::i;:::-;42531:16;;;;42527:783;;42589:10;;;42609:20;;;:14;:20;;;;;;;42573:66;;-1:-1:-1;;;42573:66:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42589:10:0;;;;42573:35;;:66;;;;;42589:10;;42573:66;;;;;;42589:10;;42573:66;;;2:2:-1;;;;27:1;24;17:12;2:2;42573:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42672:11:0;;:24;;-1:-1:-1;42672:11:0;-1:-1:-1;42688:7:0;42672:24;:15;:24;:::i;:::-;42658:38;;42734:16;;;;:29;;42755:7;42734:29;:20;:29;:::i;:::-;42715:16;;;:48;42527:783;;;42833:11;;42826:44;;;-1:-1:-1;;;42826:44:0;;42864:4;42826:44;;;;;;42804:19;;-1:-1:-1;;;;;42833:11:0;;42826:29;;:44;;;;;;;;;;;;;;42833:11;42826:44;;;2:2:-1;;;;27:1;24;17:12;2:2;42826:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42826:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42826:44:0;42905:10;;;42925:20;;;:14;42826:44;42925:20;;;;;;42889:66;;-1:-1:-1;;;42889:66:0;;;;;;;;;;;;;;;;;42826:44;;-1:-1:-1;;;;;;42905:10:0;;;;42889:35;;:66;;;;;42905:10;42889:66;;;;;;42905:10;;42889:66;;;2:2:-1;;;;27:1;24;17:12;2:2;42889:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43002:11:0;;42995:44;;;-1:-1:-1;;;42995:44:0;;43033:4;42995:44;;;;;;42974:18;;-1:-1:-1;;;;;;43002:11:0;;;;-1:-1:-1;42995:29:0;;:44;;;;;;;;;;;;;;43002:11;42995:44;;;2:2:-1;;;;27:1;24;17:12;2:2;42995:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42995:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42995:44:0;43152:16;;;;42995:44;;-1:-1:-1;43083:87:0;;43110:59;;:37;43142:4;43110:27;42995:44;43125:11;43110:27;:14;:27;:::i;:59::-;43083:22;;;;;:87;:26;:87;:::i;:::-;43058:22;;;:112;43203:11;;:24;;43219:7;43203:24;:15;:24;:::i;:::-;43189:38;;43265:16;;;;:29;;43286:7;43265:29;:20;:29;:::i;:::-;43246:16;;;:48;-1:-1:-1;;42527:783:0;43365:19;;;;43349:11;;:46;;43390:4;;43349:36;;;:15;:36;:::i;:46::-;43331:15;;;:64;43446:22;;;;43430:11;;:49;;43474:4;;43430:39;;;:15;:39;:::i;:49::-;43406:21;;;:73;43495:29;;;;;;;;43510:4;;-1:-1:-1;;;;;43495:29:0;;;;;;;;;;;;41336:2196;;;;;:::o;43540:822::-;43625:21;43649:8;43658:4;43649:14;;;;;;;;;;;;;;;;43698;;;43649;43698;;;;;;;-1:-1:-1;;;;;43698:21:0;;;;;;;;;;;43649:14;;;;;;-1:-1:-1;43730:16:0;43707:4;43730:10;:16::i;:::-;43761:11;;:15;43757:248;;43793:21;43817:67;43868:4;:15;;;43817:46;43858:4;43817:36;43833:4;:19;;;43817:4;:11;;;:15;;:36;;;;:::i;:67::-;43793:91;-1:-1:-1;43903:17:0;;43899:95;;43941:37;43957:5;43964:13;43941:15;:37::i;:::-;43757:248;;44019:11;;44015:220;;44047:12;;:60;;-1:-1:-1;;;;;44047:12:0;44077:5;44092:4;44099:7;44047:60;:29;:60;:::i;:::-;44136:11;;:24;;44152:7;44136:24;:15;:24;:::i;:::-;44122:38;;44194:16;;;;:29;;44215:7;44194:29;:20;:29;:::i;:::-;44175:16;;;:48;44015:220;44279:19;;;;44263:11;;:46;;44304:4;;44263:36;;;:15;:36;:::i;:46::-;44245:15;;;:64;44325:29;;;;;;;;44340:4;;-1:-1:-1;;;;;44325:29:0;;;;;;;;;;;;43540:822;;;;;:::o;38658:1330::-;38737:7;38746;38765:21;38789:8;38798:4;38789:14;;;;;;;;;;;;;;;;38838;;;38789;38838;;;;;;;-1:-1:-1;;;;;38838:21:0;;;;;;;;;;;38789:14;;;;;38895:19;;;;38953:22;;;;38990:11;;38789:14;;-1:-1:-1;38895:19:0;;38990:15;38986:971;;39061:10;;39022:20;39081;;;:14;:20;;;;;;;;;39045:72;;-1:-1:-1;;;39045:72:0;;;;;;;;;39111:4;39045:72;;;;;;39022:20;;-1:-1:-1;;;;;39061:10:0;;39045:35;;:72;;;;;39081:20;;39045:72;;;;;;39061:10;39045:72;;;2:2:-1;;;;27:1;24;17:12;2:2;39045:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39045:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39045:72:0;39201:16;;;;39045:72;;-1:-1:-1;39152:67:0;;39174:44;;:22;39045:72;39191:4;39174:22;:16;:22;:::i;:44::-;39152:17;;:67;:21;:67;:::i;:::-;39132:87;;39234:19;39256:71;39305:4;:21;;;39256:44;39295:4;39256:34;39272:17;39256:4;:11;;;:15;;:34;;;;:::i;:71::-;39234:93;;39361:4;:20;;;39346:12;:35;39342:429;;;39402:19;39424:39;39442:4;:20;;;39424:17;:39::i;:::-;39402:61;;39482:17;39502:53;39539:15;;39502:32;39518:4;:15;;;39502:11;:15;;:32;;;;:::i;:53::-;39482:73;;39591:61;39610:41;39634:4;:16;;;39610:19;39624:4;39610:9;:13;;:19;;;;:::i;:41::-;39591:14;;:61;:18;:61;:::i;:::-;39574:78;;39679:62;39725:4;:15;;;39679:41;39715:4;39679:31;39695:14;39679:4;:11;;;:15;;:31;;;;:::i;:62::-;39743:11;39671:84;;;;;;;;;;;;;;39342:429;39805:4;:20;;;39789:12;:36;39785:161;;;39854:62;39900:4;:15;;;39854:41;39890:4;39854:31;39870:14;39854:4;:11;;;:15;;:31;;;;:::i;:62::-;39846:84;-1:-1:-1;39918:11:0;-1:-1:-1;39846:84:0;;-1:-1:-1;;;;;39846:84:0;39785:161;38986:971;;;-1:-1:-1;39975:1:0;;;;-1:-1:-1;38658:1330:0;-1:-1:-1;;;;;;38658:1330:0:o;39996:956::-;40067:7;40086:21;40110:8;40119:4;40110:14;;;;;;;;;;;;;;;;40159;;;40110;40159;;;;;;;-1:-1:-1;;;;;40159:21:0;;;;;;;;;;;40216:19;40110:14;;;;;;;40216:19;;;;40265:12;;:37;;-1:-1:-1;;;40265:37:0;;40296:4;40265:37;;;;;;40110:14;;-1:-1:-1;40159:21:0;;40216:19;;40110:14;;40265:12;;;:22;;:37;;;;;;;;;;:12;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;40265:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40265:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40265:37:0;40317:11;;40265:37;;-1:-1:-1;40317:15:0;40313:613;;40368:4;:20;;;40353:12;:35;40349:406;;;40409:19;40431:39;40449:4;:20;;;40431:17;:39::i;:::-;40409:61;;40489:17;40509:53;40546:15;;40509:32;40525:4;:15;;;40509:11;:15;;:32;;;;:::i;:53::-;40489:73;-1:-1:-1;40598:53:0;40617:33;40641:8;40617:19;40489:73;40631:4;40617:19;:13;:19;:::i;40598:53::-;40581:70;;40677:62;40723:4;:15;;;40677:41;40713:4;40677:31;40693:14;40677:4;:11;;;:15;;:31;;;;:::i;:62::-;40670:69;;;;;;;;;;40349:406;40789:4;:20;;;40773:12;:36;40769:146;;;40837:62;40883:4;:15;;;40837:41;40873:4;40837:31;40853:14;40837:4;:11;;;:15;;:31;;;;:::i;:62::-;40830:69;;;;;;;;40769:146;-1:-1:-1;40943:1:0;;39996:956;-1:-1:-1;;;;;;39996:956:0:o;26913:117::-;26976:7;27003:19;27011:3;27003:7;:19::i;4545:192::-;4631:7;4667:12;4659:6;;;;4651:29;;;;-1:-1:-1;;;4651:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4651:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4703:5:0;;;4545:192::o;6571:278::-;6657:7;6692:12;6685:5;6677:28;;;;-1:-1:-1;;;6677:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6677:28:0;;6716:9;6732:1;6728;:5;;;;;;;6571:278;-1:-1:-1;;;;;6571:278:0:o;25657:204::-;25752:18;;25724:7;;25752:26;-1:-1:-1;25744:73:0;;;;-1:-1:-1;;;25744:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25835:3;:11;;25847:5;25835:18;;;;;;;;;;;;;;;;25828:25;;25657:204;;;;:::o;48816:271::-;48908:3;;:28;;;-1:-1:-1;;;48908:28:0;;48930:4;48908:28;;;;;;48891:14;;-1:-1:-1;;;;;48908:3:0;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;2:2:-1;;;;27:1;24;17:12;2:2;48908:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48908:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48908:28:0;;-1:-1:-1;48951:16:0;;;48947:133;;;48984:3;;:25;;;-1:-1:-1;;;48984:25:0;;-1:-1:-1;;;;;48984:25:0;;;;;;;;;;;;;;;:3;;;;;:12;;:25;;;;;;;;;;;;;;:3;;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;48984:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48984:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48947:133:0;;-1:-1:-1;48947:133:0;;49042:3;;:26;;;-1:-1:-1;;;49042:26:0;;-1:-1:-1;;;;;49042:26:0;;;;;;;;;;;;;;;:3;;;;;:12;;:26;;;;;;;;;;;;;;:3;;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;49042:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49042:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;48816:271:0;;;:::o;14877:177::-;14987:58;;;-1:-1:-1;;;;;14987:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14987:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14960:86:0;;14980:5;;14960:19;:86::i;22747:414::-;22810:4;22832:21;22842:3;22847:5;22832:9;:21::i;:::-;22827:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;22870:11:0;:23;;;;;;;;;;;;;23053:18;;23031:19;;;:12;;;:19;;;;;;:40;;;;23086:11;;22827:327;-1:-1:-1;23137:5:0;23130:12;;24979:129;25052:4;25076:19;;;:12;;;;;:19;;;;;;:24;;;24979:129::o;23337:1556::-;23403:4;23542:19;;;:12;;;:19;;;;;;23578:15;;23574:1312;;24012:18;;-1:-1:-1;;23963:14:0;;;;24012:22;;;;23939:21;;24012:3;;:22;;24299;;;;;;;;;;;;;;24279:42;;24445:9;24416:3;:11;;24428:13;24416:26;;;;;;;;;;;;;;;;;;;:38;;;;24522:23;;;24564:1;24522:12;;;:23;;;;;;24548:17;;;24522:43;;24687:17;;24522:3;;24687:17;;;;;;;;;;;;;;;;;;;;;;24782:3;:12;;:19;24795:5;24782:19;;;;;;;;;;;24775:26;;;24825:4;24818:11;;;;;;;;23574:1312;24869:5;24862:12;;;;;15062:205;15190:68;;;-1:-1:-1;;;;;15190:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15190:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;15163:96:0;;15183:5;;15163:19;:96::i;:::-;15062:205;;;;:::o;25194:109::-;25277:18;;25194:109::o;17182:760::-;17606:23;17632:69;17660:4;17632:69;;;;;;;;;;;;;;;;;17640:5;-1:-1:-1;;;;;17632:27:0;;;:69;;;;;:::i;:::-;17716:17;;17606:95;;-1:-1:-1;17716:21:0;17712:223;;17857:10;17846:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17846:30:0;17838:85;;;;-1:-1:-1;;;17838:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11925:196;12028:12;12060:53;12083:6;12091:4;12097:1;12100:12;12060:22;:53::i;:::-;12053:60;11925:196;-1:-1:-1;;;;11925:196:0:o;13302:978::-;13432:12;13465:18;13476:6;13465:10;:18::i;:::-;13457:60;;;;;-1:-1:-1;;;13457:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13591:12;13605:23;13632:6;-1:-1:-1;;;;;13632:11:0;13652:8;13662:4;13632:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13632:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13590:77:0;;;;13682:7;13678:595;;;13713:10;-1:-1:-1;13706:17:0;;-1:-1:-1;13706:17:0;13678:595;13827:17;;:21;13823:439;;14090:10;14084:17;14151:15;14138:10;14134:2;14130:19;14123:44;14038:148;14226:20;;-1:-1:-1;;;14226:20:0;;;;;;;;;;;;;;;;;14233:12;;14226:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8812:617:0;8872:4;9339:20;;9183:66;9378:23;;;;;;:42;;-1:-1:-1;;9405:15:0;;;9370:51;-1:-1:-1;;8812:617:0:o

Swarm Source

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