Contract 0x7373c42502874c88954bdd6d50b53061f018422e 3

Contract Overview

Mdex: Swap Mining
Balance:
0 HT

HT Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa2d71b2baf63e8d5e33c56047ec4f171b6a14c9a7c25f241319886a8b02151d5Taker Withdraw105807402021-12-04 16:44:124 mins ago0xb4bc377322eed6f604a3db4c83967c2919c3742a IN  Mdex: Swap Mining0 HT0.0007014609142.7777
0x4d3bee7b5f8f4bb4a19d7a849f6c0418c8fdb43a8e6cc433174d87ac301cbbffTaker Withdraw105806312021-12-04 16:38:4510 mins ago0xa9a49e888261a4c155a0e7f54aee69f5fb1a497d IN  Mdex: Swap Mining0 HT0.00062709752.5
0x1f268d1945e5b18a276d75f4f3200770269b8a1fc5714a37c14020e13c440378Taker Withdraw105805692021-12-04 16:35:3913 mins ago0x03fd5dd448820cbea800aefe5b4b352da77c8aa7 IN  Mdex: Swap Mining0 HT0.00062709752.5
0xcd511e46cbc42288306a4f8ca9e29f9f024be221027e5b09866d71ce1761edcdTaker Withdraw105805542021-12-04 16:34:5414 mins ago0x503509b328776ba6407422e2b5f87f90ec94668e IN  Mdex: Swap Mining0 HT0.000631972.5
0x38b03571fddadd9bf34f14f3d20f8817e5890980733fee59f54bbcf28c2f4292Taker Withdraw105805442021-12-04 16:34:2414 mins ago0x1b3f382a1f975ade027fd000d1df279a8c1d1e41 IN  Mdex: Swap Mining0 HT0.0006348285 2.25
0x2b9f893cbaf60a2348c211450d857dfc49aa1cafa1e65e8eb2b36de1dfd08bdeTaker Withdraw105804882021-12-04 16:31:3617 mins ago0x7acbf80ff7b12398ec9ee73191ff6dd3ec523d8b IN  Mdex: Swap Mining0 HT0.00112696112.7
0xa1a1fec4865e6615964aef6ef2d029d118ce215f018c433364c8a3f6e688d0abTaker Withdraw105804532021-12-04 16:29:5119 mins ago0x7acbf80ff7b12398ec9ee73191ff6dd3ec523d8b IN  Mdex: Swap Mining0 HT0.00112696112.7
0xc9d987fd37d079f46fdd94232e5544c5da240752a9bc3a773893e489be2d3d1bTaker Withdraw105804492021-12-04 16:29:3919 mins ago0x6fe49a2b36e6ff528b1504228fb6fc1f2468a973 IN  Mdex: Swap Mining0 HT0.00050653352.7
0xfbf0efff232face9eb13da57e9b26ae30822c2d36aa24698d18e179e968a2ad4Taker Withdraw105804362021-12-04 16:29:0020 mins ago0x7acbf80ff7b12398ec9ee73191ff6dd3ec523d8b IN  Mdex: Swap Mining0 HT0.00112696112.7
0xe638a5ef994eb1b00662bcd4673e917cae44200cffef59c607e9c6901515e6b6Taker Withdraw105803602021-12-04 16:25:1223 mins ago0x03fd5dd448820cbea800aefe5b4b352da77c8aa7 IN  Mdex: Swap Mining0 HT0.00070615252.5
0x17f98f52dbb3ff2708cfffb5427402aadfe1e1533b164bdc9019d13e8223e5dcTaker Withdraw105803542021-12-04 16:24:5424 mins ago0x2741612ba98b84ba6f66d6e916d6deda8510a30a IN  Mdex: Swap Mining0 HT0.0004107752.5
0xd01c599c0960e8afcdc729e771d40ef1cd4433916179d6044197f1a15f38fe97Taker Withdraw105803222021-12-04 16:23:1825 mins ago0x8e8fa575d7629f0f99f8f0ac61cdf9c2331f8b59 IN  Mdex: Swap Mining0 HT0.00101883962.7
0xcf9ec211d83d99ff5d04d1f9399631888f1da0fc49c1e1a9ec940111fd6f0296Taker Withdraw105803052021-12-04 16:22:2726 mins ago0xe36c9f222e9255747bd3cf8400c92728485c92a1 IN  Mdex: Swap Mining0 HT0.000454772.25
0x8b75a160d3a6d4d6c302fd150b8749b3378cfa08f97b54199b187ac20197ba77Taker Withdraw105803022021-12-04 16:22:1826 mins ago0x8e8fa575d7629f0f99f8f0ac61cdf9c2331f8b59 IN  Mdex: Swap Mining0 HT0.00103639772.7
0xb5f0098758a1b622b51cbc72888c88720f8ffca4cfdecb4c8d745a6d5c27bd11Taker Withdraw105802982021-12-04 16:22:0627 mins ago0x8e8fa575d7629f0f99f8f0ac61cdf9c2331f8b59 IN  Mdex: Swap Mining0 HT0.00097048262.7
0x69b79a2cec7ad66687801d2275f780ee5a1bab27d7f444b0908d6200a24c9b31Taker Withdraw105802962021-12-04 16:22:0027 mins ago0xd4561c66d317766a4ac8cb7a53db5fde765fd4cf IN  Mdex: Swap Mining0 HT0.00027383132.7
0x3f36497e2ef18e9c9703fb41121408601c6d3aab1688a09c38f465b4a4d3e008Taker Withdraw105802952021-12-04 16:21:5727 mins ago0x95222e5eef7b4371c0a5ac58d1f74e3c91d01719 IN  Mdex: Swap Mining0 HT0.0004931912.25
0xf1a3693b71f9d653294cfdc1813005b07062039a671121201cb5cef64b2b053cTaker Withdraw105802932021-12-04 16:21:5127 mins ago0xd4561c66d317766a4ac8cb7a53db5fde765fd4cf IN  Mdex: Swap Mining0 HT0.00027383132.7
0x28b49ed17235be727a1ef010770ffc2e5118e5d4c396eb220bd00e5d78531236Taker Withdraw105802902021-12-04 16:21:4227 mins ago0xd4561c66d317766a4ac8cb7a53db5fde765fd4cf IN  Mdex: Swap Mining0 HT0.00027383132.7
0x3a771322c09737ae2d9a2205e3b76466636aa970bb65fb99c36aadc7c7a55304Taker Withdraw105802862021-12-04 16:21:3027 mins ago0xd4561c66d317766a4ac8cb7a53db5fde765fd4cf IN  Mdex: Swap Mining0 HT0.00071647472.7
0xd65f42035307a27033b9d742f26d95edc9c22561807bdc627d00d52982882f75Taker Withdraw105802662021-12-04 16:20:3028 mins ago0xe36c9f222e9255747bd3cf8400c92728485c92a1 IN  Mdex: Swap Mining0 HT0.00049462752.5
0xa8b17cc15e48624527210491657a4b758e575e8d8751141db6382bcc9445b646Taker Withdraw105802212021-12-04 16:18:1530 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  Mdex: Swap Mining0 HT0.0029698710
0x73a796ff95bc1ffb390d46ed120aed39648c285aecdf18dd0dab9020e0eb0a28Taker Withdraw105802042021-12-04 16:17:2431 mins ago0xe36c9f222e9255747bd3cf8400c92728485c92a1 IN  Mdex: Swap Mining0 HT0.00049462752.5
0x441ae7951edf774d6955a77c988b74ea607e9e4d2337aca54f6bd137381703c6Taker Withdraw105801852021-12-04 16:16:2732 mins ago0x332b265b84674ce2c84a865d2b26548cf227a3f1 IN  Mdex: Swap Mining0 HT0.000827182.5
0xc4234a86c515e45b55590088be1d17d4f4b05ee1c660437202a53e061b0f8972Taker Withdraw105801802021-12-04 16:16:1232 mins ago0x03fd5dd448820cbea800aefe5b4b352da77c8aa7 IN  Mdex: Swap Mining0 HT0.00062709752.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapMining

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
*/

pragma solidity >=0.5.0 <0.7.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

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

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

    function transfer(address to, uint value) external returns (bool);

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

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

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, 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));
    }
}

library SafeMath {
    uint256 constant WAD = 10 ** 18;
    uint256 constant RAY = 10 ** 27;

    function wad() public pure returns (uint256) {
        return WAD;
    }

    function ray() public pure returns (uint256) {
        return RAY;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

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

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function sqrt(uint256 a) internal pure returns (uint256 b) {
        if (a > 3) {
            b = a;
            uint256 x = a / 2 + 1;
            while (x < b) {
                b = x;
                x = (a / x + x) / 2;
            }
        } else if (a != 0) {
            b = 1;
        }
    }

    function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / WAD;
    }

    function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), WAD / 2) / WAD;
    }

    function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b) / RAY;
    }

    function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, b), RAY / 2) / RAY;
    }

    function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, WAD), b);
    }

    function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, WAD), b / 2) / b;
    }

    function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(mul(a, RAY), b);
    }

    function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(mul(a, RAY), b / 2) / b;
    }

    function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = WAD;
        while (n > 0) {
            if (n % 2 != 0) {
                result = wmul(result, x);
            }
            x = wmul(x, x);
            n /= 2;
        }
        return result;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
        uint256 result = RAY;
        while (n > 0) {
            if (n % 2 != 0) {
                result = rmul(result, x);
            }
            x = rmul(x, x);
            n /= 2;
        }
        return result;
    }
}

contract Ownable {
    address private _owner;

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

    function owner() public view returns (address) {
        return _owner;
    }

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }

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

interface IMdexFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function feeToRate() external view returns (uint256);

    function initCodeHash() external view returns (bytes32);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setFeeToRate(uint256) external;

    function setInitCodeHash(bytes32) external;

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

    function pairFor(address tokenA, address tokenB) external view returns (address pair);

    function getReserves(address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

    function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB);

    function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountOut);

    function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external view returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

interface IMdexPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

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

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

    function transfer(address to, uint value) external returns (bool);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;

    function sync() external;

    function price(address token, uint256 baseDecimal) external view returns (uint256);

    function initialize(address, address) external;
}

interface IOracle {
    function update(address tokenA, address tokenB) external;

    function consult(address tokenIn, uint amountIn, address tokenOut) external view returns (uint amountOut);
}

contract SwapMining is Ownable {
    using SafeMath for uint256;
    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet private _whitelist;

    // MDX tokens created per block
    uint256 public mdxPerBlock;
    // The block number when MDX mining starts.
    uint256 public startBlock;
    // How many blocks are halved
    uint256 public halvingPeriod = 5256000;
    // Total allocation points
    uint256 public totalAllocPoint = 0;
    IOracle public oracle;
    // router address
    address public router;
    // factory address
    IMdexFactory public factory;
    // mdx token address
    IMdx public mdx;
    // Calculate price based on HUSD
    address public targetToken;
    // pair corresponding pid
    mapping(address => uint256) public pairOfPid;

    constructor(
        IMdx _mdx,
        IMdexFactory _factory,
        IOracle _oracle,
        address _router,
        address _targetToken,
        uint256 _mdxPerBlock,
        uint256 _startBlock
    ) public {
        mdx = _mdx;
        factory = _factory;
        oracle = _oracle;
        router = _router;
        targetToken = _targetToken;
        mdxPerBlock = _mdxPerBlock;
        startBlock = _startBlock;
    }

    struct UserInfo {
        uint256 quantity;       // How many LP tokens the user has provided
        uint256 blockNumber;    // Last transaction block
    }

    struct PoolInfo {
        address pair;           // Trading pairs that can be mined
        uint256 quantity;       // Current amount of LPs
        uint256 totalQuantity;  // All quantity
        uint256 allocPoint;     // How many allocation points assigned to this pool
        uint256 allocMdxAmount; // How many MDXs
        uint256 lastRewardBlock;// Last transaction block
    }

    PoolInfo[] public poolInfo;
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;


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


    function addPair(uint256 _allocPoint, address _pair, bool _withUpdate) public onlyOwner {
        require(_pair != address(0), "_pair is the zero address");
        if (_withUpdate) {
            massMintPools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
        pair : _pair,
        quantity : 0,
        totalQuantity : 0,
        allocPoint : _allocPoint,
        allocMdxAmount : 0,
        lastRewardBlock : lastRewardBlock
        }));
        pairOfPid[_pair] = poolLength() - 1;
    }

    // Update the allocPoint of the pool
    function setPair(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massMintPools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

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

    // Only tokens in the whitelist can be mined MDX
    function addWhitelist(address _addToken) public onlyOwner returns (bool) {
        require(_addToken != address(0), "SwapMining: token is the zero address");
        return EnumerableSet.add(_whitelist, _addToken);
    }

    function delWhitelist(address _delToken) public onlyOwner returns (bool) {
        require(_delToken != address(0), "SwapMining: token is the zero address");
        return EnumerableSet.remove(_whitelist, _delToken);
    }

    function getWhitelistLength() public view returns (uint256) {
        return EnumerableSet.length(_whitelist);
    }

    function isWhitelist(address _token) public view returns (bool) {
        return EnumerableSet.contains(_whitelist, _token);
    }

    function getWhitelist(uint256 _index) public view returns (address){
        require(_index <= getWhitelistLength() - 1, "SwapMining: index out of bounds");
        return EnumerableSet.at(_whitelist, _index);
    }

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

    function setRouter(address newRouter) public onlyOwner {
        require(newRouter != address(0), "SwapMining: new router is the zero address");
        router = newRouter;
    }

    function setOracle(IOracle _oracle) public onlyOwner {
        require(address(_oracle) != address(0), "SwapMining: new oracle is the zero address");
        oracle = _oracle;
    }

    // At what phase
    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 phase() public view returns (uint256) {
        return phase(block.number);
    }

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

    function reward() public view returns (uint256) {
        return reward(block.number);
    }

    // Rewards for the current block
    function getMdxReward(uint256 _lastRewardBlock) public view returns (uint256) {
        require(_lastRewardBlock <= block.number, "SwapMining: must little than the current block number");
        uint256 blockReward = 0;
        uint256 n = phase(_lastRewardBlock);
        uint256 m = phase(block.number);
        // If it crosses the cycle
        while (n < m) {
            n++;
            // Get the last block of the previous cycle
            uint256 r = n.mul(halvingPeriod).add(startBlock);
            // Get rewards from previous periods
            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 all pools Called when updating allocPoint and setting new blocks
    function massMintPools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            mint(pid);
        }
    }

    function mint(uint256 _pid) public returns (bool) {
        PoolInfo storage pool = poolInfo[_pid];
        if (block.number <= pool.lastRewardBlock) {
            return false;
        }
        uint256 blockReward = getMdxReward(pool.lastRewardBlock);
        if (blockReward <= 0) {
            return false;
        }
        // Calculate the rewards obtained by the pool based on the allocPoint
        uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
        mdx.mint(address(this), mdxReward);
        // Increase the number of tokens in the current pool
        pool.allocMdxAmount = pool.allocMdxAmount.add(mdxReward);
        pool.lastRewardBlock = block.number;
        return true;
    }

    // swapMining only router
    function swap(address account, address input, address output, uint256 amount) public onlyRouter returns (bool) {
        require(account != address(0), "SwapMining: taker swap account is the zero address");
        require(input != address(0), "SwapMining: taker swap input is the zero address");
        require(output != address(0), "SwapMining: taker swap output is the zero address");

        if (poolLength() <= 0) {
            return false;
        }

        if (!isWhitelist(input) || !isWhitelist(output)) {
            return false;
        }

        address pair = IMdexFactory(factory).pairFor(input, output);

        PoolInfo storage pool = poolInfo[pairOfPid[pair]];
        // If it does not exist or the allocPoint is 0 then return
        if (pool.pair != pair || pool.allocPoint <= 0) {
            return false;
        }

        uint256 quantity = getQuantity(output, amount, targetToken);
        if (quantity <= 0) {
            return false;
        }

        mint(pairOfPid[pair]);

        pool.quantity = pool.quantity.add(quantity);
        pool.totalQuantity = pool.totalQuantity.add(quantity);
        UserInfo storage user = userInfo[pairOfPid[pair]][account];
        user.quantity = user.quantity.add(quantity);
        user.blockNumber = block.number;
        return true;
    }

    // The user withdraws all the transaction rewards of the pool
    function takerWithdraw() public {
        uint256 userSub;
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            PoolInfo storage pool = poolInfo[pid];
            UserInfo storage user = userInfo[pid][msg.sender];
            if (user.quantity > 0) {
                mint(pid);
                // The reward held by the user in this pool
                uint256 userReward = pool.allocMdxAmount.mul(user.quantity).div(pool.quantity);
                pool.quantity = pool.quantity.sub(user.quantity);
                pool.allocMdxAmount = pool.allocMdxAmount.sub(userReward);
                user.quantity = 0;
                user.blockNumber = block.number;
                userSub = userSub.add(userReward);
            }
        }
        if (userSub <= 0) {
            return;
        }
        mdx.transfer(msg.sender, userSub);
    }

    // Get rewards from users in the current pool
    function getUserReward(uint256 _pid) public view returns (uint256, uint256){
        require(_pid <= poolInfo.length - 1, "SwapMining: Not find this pool");
        uint256 userSub;
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][msg.sender];
        if (user.quantity > 0) {
            uint256 blockReward = getMdxReward(pool.lastRewardBlock);
            uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
            userSub = userSub.add((pool.allocMdxAmount.add(mdxReward)).mul(user.quantity).div(pool.quantity));
        }
        //Mdx available to users, User transaction amount
        return (userSub, user.quantity);
    }

    // Get details of the pool
    function getPoolInfo(uint256 _pid) public view returns (address, address, uint256, uint256, uint256, uint256){
        require(_pid <= poolInfo.length - 1, "SwapMining: Not find this pool");
        PoolInfo memory pool = poolInfo[_pid];
        address token0 = IMdexPair(pool.pair).token0();
        address token1 = IMdexPair(pool.pair).token1();
        uint256 mdxAmount = pool.allocMdxAmount;
        uint256 blockReward = getMdxReward(pool.lastRewardBlock);
        uint256 mdxReward = blockReward.mul(pool.allocPoint).div(totalAllocPoint);
        mdxAmount = mdxAmount.add(mdxReward);
        //token0,token1,Pool remaining reward,Total /Current transaction volume of the pool
        return (token0, token1, mdxAmount, pool.totalQuantity, pool.quantity, pool.allocPoint);
    }

    modifier onlyRouter() {
        require(msg.sender == router, "SwapMining: caller is not the router");
        _;
    }

    function getQuantity(address outputToken, uint256 outputAmount, address anchorToken) public view returns (uint256) {
        uint256 quantity = 0;
        if (outputToken == anchorToken) {
            quantity = outputAmount;
        } else if (IMdexFactory(factory).getPair(outputToken, anchorToken) != address(0)) {
            quantity = IOracle(oracle).consult(outputToken, outputAmount, anchorToken);
        } else {
            uint256 length = getWhitelistLength();
            for (uint256 index = 0; index < length; index++) {
                address intermediate = getWhitelist(index);
                if (IMdexFactory(factory).getPair(outputToken, intermediate) != address(0) && IMdexFactory(factory).getPair(intermediate, anchorToken) != address(0)) {
                    uint256 interQuantity = IOracle(oracle).consult(outputToken, outputAmount, intermediate);
                    quantity = IOracle(oracle).consult(intermediate, interQuantity, anchorToken);
                    break;
                }
            }
        }
        return quantity;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IMdx","name":"_mdx","type":"address"},{"internalType":"contract IMdexFactory","name":"_factory","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_targetToken","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addToken","type":"address"}],"name":"addWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delToken","type":"address"}],"name":"delWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IMdexFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastRewardBlock","type":"uint256"}],"name":"getMdxReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outputAmount","type":"uint256"},{"internalType":"address","name":"anchorToken","type":"address"}],"name":"getQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistLength","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":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massMintPools","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":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairOfPid","outputs":[{"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":[],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"totalQuantity","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"allocMdxAmount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","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":[],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"input","type":"address"},{"internalType":"address","name":"output","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405262503340600555600060065534801561001c57600080fd5b5060405161273b38038061273b833981810160405260e081101561003f57600080fd5b50805160208201516040808401516060850151608086015160a087015160c090970151600080546001600160a01b031916331780825595519798969794969395929491926001600160a01b0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600a80546001600160a01b03199081166001600160a01b03998a1617909155600980548216978916979097179096556007805487169588169590951790945560088054861693871693909317909255600b8054909416941693909317909155600391909155600455612612806101296000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806396db752a1161013b578063b5ec5c99116100b8578063e377fe351161007c578063e377fe3514610658578063f2fde38b14610675578063f80f5dd51461069b578063f887ea40146106c1578063f9d181f9146106c957610248565b8063b5ec5c99146105df578063b872dd0e146105fc578063c0d7865514610604578063c45a01551461062a578063c683630d1461063257610248565b8063a13202e9116100ff578063a13202e914610540578063a7ef67f614610548578063a9678a181461057e578063a9fb763c146105ba578063b1c9fe6e146105d757610248565b806396db752a146104bb57806397ecfaab146104d85780639f4ece2e146104fe5780639fb08cb714610506578063a0712d681461052357610248565b806348cd4cb1116101c95780637adbf9731161018d5780637adbf973146104385780637dc0d1d01461045e5780638da5cb5b146104665780638fa39a881461046e57806393f1a40b1461047657610248565b806348cd4cb1146103fb5780635672ab55146104035780635a3e251f1461040b578063715018a614610413578063791ba3741461041b57610248565b8063190cf6c911610210578063190cf6c91461030c578063228cb733146103395780632f380b35146103415780632f54bf6e1461039d578063327107f7146103d757610248565b80630495de501461024d578063081e3eda14610285578063135f8aa71461028d5780631526fe27146102aa57806317caf6f114610304575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b03166106fd565b60408051918252519081900360200190f35b61027361070f565b610273600480360360208110156102a357600080fd5b5035610715565b6102c7600480360360208110156102c057600080fd5b503561077c565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102736107c9565b6103376004803603606081101561032257600080fd5b508035906020810135906040013515156107cf565b005b610273610896565b61035e6004803603602081101561035757600080fd5b50356108a6565b604080516001600160a01b039788168152959096166020860152848601939093526060840191909152608083015260a082015290519081900360c00190f35b6103c3600480360360208110156103b357600080fd5b50356001600160a01b0316610ac8565b604080519115158252519081900360200190f35b6103df610adc565b604080516001600160a01b039092168252519081900360200190f35b610273610aeb565b6103df610af1565b610273610b00565b610337610b06565b6103376004803603602081101561043157600080fd5b5035610b98565b6103376004803603602081101561044e57600080fd5b50356001600160a01b0316610bed565b6103df610c9c565b6103df610cab565b610273610cba565b6104a26004803603604081101561048c57600080fd5b50803590602001356001600160a01b0316610cc0565b6040805192835260208301919091528051918290030190f35b6103df600480360360208110156104d157600080fd5b5035610ce4565b6103c3600480360360208110156104ee57600080fd5b50356001600160a01b0316610d56565b610337610df0565b6104a26004803603602081101561051c57600080fd5b5035610e14565b6103c36004803603602081101561053957600080fd5b5035610fb4565b6102736110da565b6102736004803603606081101561055e57600080fd5b506001600160a01b038135811691602081013591604090910135166110e6565b6103c36004803603608081101561059457600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356114a9565b610273600480360360208110156105d057600080fd5b50356117d2565b6102736117ff565b610337600480360360208110156105f557600080fd5b503561180a565b610337611857565b6103376004803603602081101561061a57600080fd5b50356001600160a01b03166119ca565b6103df611a79565b6103c36004803603602081101561064857600080fd5b50356001600160a01b0316611a88565b6102736004803603602081101561066e57600080fd5b5035611a95565b6103376004803603602081101561068b57600080fd5b50356001600160a01b0316611b8b565b6103c3600480360360208110156106b157600080fd5b50356001600160a01b0316611bdf565b6103df611c79565b610337600480360360608110156106df57600080fd5b508035906001600160a01b0360208201351690604001351515611c88565b600c6020526000908152604090205481565b600d5490565b60006005546000141561072a57506000610777565b6004548211156107735761076c600554610760600161075460045487611edc90919063ffffffff16565b9063ffffffff611edc16565b9063ffffffff611f1e16565b9050610777565b5060005b919050565b600d818154811061078957fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b60065481565b6107d833610ac8565b610817576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b801561082557610825610df0565b6108688261085c600d868154811061083957fe5b906000526020600020906006020160030154600654611edc90919063ffffffff16565b9063ffffffff611f6016565b60068190555081600d848154811061087c57fe5b906000526020600020906006020160030181905550505050565b60006108a1436117d2565b905090565b6000806000806000806001600d805490500387111561090c576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b610914612395565b600d888154811061092157fe5b600091825260208083206040805160c081018252600690940290910180546001600160a01b031680855260018201548585015260028201548584015260038201546060860152600480830154608087015260059092015460a08601528251630dfe168160e01b8152925194965093630dfe16819383830193909290829003018186803b1580156109b057600080fd5b505afa1580156109c4573d6000803e3d6000fd5b505050506040513d60208110156109da57600080fd5b505182516040805163d21220a760e01b815290519293506000926001600160a01b039092169163d21220a791600480820192602092909190829003018186803b158015610a2657600080fd5b505afa158015610a3a573d6000803e3d6000fd5b505050506040513d6020811015610a5057600080fd5b5051608084015160a085015191925090600090610a6c90611a95565b90506000610a8d600654610760886060015185611fba90919063ffffffff16565b9050610a9f838263ffffffff611f6016565b60408701516020880151606090980151969f959e50909c509a5094985092965090945050505050565b6000546001600160a01b0390811691161490565b600b546001600160a01b031681565b60045481565b600a546001600160a01b031681565b60055481565b610b0f33610ac8565b610b4e576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610ba133610ac8565b610be0576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b610be8610df0565b600355565b610bf633610ac8565b610c35576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b6001600160a01b038116610c7a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124ec602a913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6000546001600160a01b031690565b60035481565b600e6020908152600092835260408084209091529082529020805460019091015482565b60006001610cf06110da565b03821115610d45576040805162461bcd60e51b815260206004820152601f60248201527f537761704d696e696e673a20696e646578206f7574206f6620626f756e647300604482015290519081900360640190fd5b610d50600183612013565b92915050565b6000610d6133610ac8565b610da0576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b6001600160a01b038216610de55760405162461bcd60e51b81526004018080602001828103825260258152602001806124966025913960400191505060405180910390fd5b610d5060018361201f565b600d5460005b81811015610e1057610e0781610fb4565b50600101610df6565b5050565b600d54600090819060001901831115610e74576040805162461bcd60e51b815260206004820152601e60248201527f537761704d696e696e673a204e6f742066696e64207468697320706f6f6c0000604482015290519081900360640190fd5b6000610e7e612395565b600d8581548110610e8b57fe5b60009182526020918290206040805160c081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460a08201529050610ef36123d4565b506000858152600e60209081526040808320338452825291829020825180840190935280548084526001909101549183019190915215610fa7576000610f3c8360a00151611a95565b90506000610f5d600654610760866060015185611fba90919063ffffffff16565b9050610fa2610f9585602001516107608660000151610f89868a60800151611f6090919063ffffffff16565b9063ffffffff611fba16565b869063ffffffff611f6016565b945050505b5191935090915050915091565b600080600d8381548110610fc457fe5b9060005260206000209060060201905080600501544311610fe9576000915050610777565b6000610ff88260050154611a95565b90506000811161100d57600092505050610777565b600061102c600654610760856003015485611fba90919063ffffffff16565b600a54604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050506040513d60208110156110ad57600080fd5b505060048301546110c4908263ffffffff611f6016565b6004840155505043600590910155506001919050565b60006108a16001612034565b6000806001600160a01b0385811690841614156111045750826114a1565b6009546040805163e6a4390560e01b81526001600160a01b038881166004830152868116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d602081101561118657600080fd5b50516001600160a01b0316146112255760075460408051632321bc7960e21b81526001600160a01b03888116600483015260248201889052868116604483015291519190921691638c86f1e4916064808301926020929190829003018186803b1580156111f257600080fd5b505afa158015611206573d6000803e3d6000fd5b505050506040513d602081101561121c57600080fd5b505190506114a1565b600061122f6110da565b905060005b8181101561149e57600061124782610ce4565b6009546040805163e6a4390560e01b81526001600160a01b038c8116600483015284811660248301529151939450600093919092169163e6a43905916044808301926020929190829003018186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b50516001600160a01b03161480159061137057506009546040805163e6a4390560e01b81526001600160a01b038481166004830152898116602483015291516000939092169163e6a4390591604480820192602092909190829003018186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d602081101561136257600080fd5b50516001600160a01b031614155b156114955760075460408051632321bc7960e21b81526001600160a01b038b81166004830152602482018b9052848116604483015291516000939290921691638c86f1e491606480820192602092909190829003018186803b1580156113d557600080fd5b505afa1580156113e9573d6000803e3d6000fd5b505050506040513d60208110156113ff57600080fd5b505160075460408051632321bc7960e21b81526001600160a01b038681166004830152602482018590528b811660448301529151939450911691638c86f1e491606480820192602092909190829003018186803b15801561145f57600080fd5b505afa158015611473573d6000803e3d6000fd5b505050506040513d602081101561148957600080fd5b5051945061149e915050565b50600101611234565b50505b949350505050565b6008546000906001600160a01b031633146114f55760405162461bcd60e51b81526004018080602001828103825260248152602001806125166024913960400191505060405180910390fd5b6001600160a01b03851661153a5760405162461bcd60e51b815260040180806020018281038252603281526020018061257b6032913960400191505060405180910390fd5b6001600160a01b03841661157f5760405162461bcd60e51b81526004018080602001828103825260308152602001806125ad6030913960400191505060405180910390fd5b6001600160a01b0383166115c45760405162461bcd60e51b81526004018080602001828103825260318152602001806124bb6031913960400191505060405180910390fd5b60006115ce61070f565b116115db575060006114a1565b6115e484611a88565b15806115f657506115f483611a88565b155b15611603575060006114a1565b600954604080516396ed28f960e01b81526001600160a01b0387811660048301528681166024830152915160009392909216916396ed28f991604480820192602092909190829003018186803b15801561165c57600080fd5b505afa158015611670573d6000803e3d6000fd5b505050506040513d602081101561168657600080fd5b50516001600160a01b0381166000908152600c6020526040812054600d8054939450919281106116b257fe5b6000918252602090912060069091020180549091506001600160a01b0383811691161415806116e357506003810154155b156116f3576000925050506114a1565b600b5460009061170f90879087906001600160a01b03166110e6565b90506000811161172557600093505050506114a1565b6001600160a01b0383166000908152600c602052604090205461174790610fb4565b50600182015461175d908263ffffffff611f6016565b60018301556002820154611777908263ffffffff611f6016565b60028301556001600160a01b038084166000908152600c60209081526040808320548352600e8252808320938c1683529290522080546117bd908363ffffffff611f6016565b81554360019182015598975050505050505050565b6000806117de83610715565b90506117f88160020a600354611f1e90919063ffffffff16565b9392505050565b60006108a143610715565b61181333610ac8565b611852576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b600555565b600d54600090815b81811015611935576000600d828154811061187657fe5b60009182526020808320858452600e8252604080852033865290925292208054600690920290920192501561192b576118ae83610fb4565b5060006118d4836001015461076084600001548660040154611fba90919063ffffffff16565b825460018501549192506118ee919063ffffffff611edc16565b60018401556004830154611908908263ffffffff611edc16565b600484015560008255436001830155611927868263ffffffff611f6016565b9550505b505060010161185f565b50600082116119455750506119c8565b600a546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561199957600080fd5b505af11580156119ad573d6000803e3d6000fd5b505050506040513d60208110156119c357600080fd5b505050505b565b6119d333610ac8565b611a12576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b6001600160a01b038116611a575760405162461bcd60e51b815260040180806020018281038252602a815260200180612411602a913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031681565b6000610d5060018361203f565b600043821115611ad65760405162461bcd60e51b81526004018080602001828103825260358152602001806124616035913960400191505060405180910390fd5b600080611ae284610715565b90506000611aef43610715565b90505b80821015611b5657600454600554600190930192600091611b1e9161085c90869063ffffffff611fba16565b9050611b4c611b3f611b2f836117d2565b610f89848a63ffffffff611edc16565b859063ffffffff611f6016565b9095509250611af2565b611b82611b75611b65436117d2565b610f89438963ffffffff611edc16565b849063ffffffff611f6016565b95945050505050565b611b9433610ac8565b611bd3576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b611bdc81612054565b50565b6000611bea33610ac8565b611c29576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b6001600160a01b038216611c6e5760405162461bcd60e51b81526004018080602001828103825260258152602001806124966025913960400191505060405180910390fd5b610d506001836120f4565b6008546001600160a01b031681565b611c9133610ac8565b611cd0576040805162461bcd60e51b8152602060048201819052602482015260008051602061255b833981519152604482015290519081900360640190fd5b6001600160a01b038216611d2b576040805162461bcd60e51b815260206004820152601960248201527f5f7061697220697320746865207a65726f206164647265737300000000000000604482015290519081900360640190fd5b8015611d3957611d39610df0565b60006004544311611d4c57600454611d4e565b435b600654909150611d64908563ffffffff611f6016565b60069081556040805160c0810182526001600160a01b038681168252600060208301818152938301818152606084018a81526080850183815260a08601898152600d8054600180820183559190965296517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59590990294850180546001600160a01b031916999096169890981790945594517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb6830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb782015592517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb8840155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb983015591517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba90910155611eb961070f565b6001600160a01b039094166000908152600c602052604090209303909255505050565b60006117f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612109565b60006117f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121a0565b6000828201838110156117f8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611fc957506000610d50565b82820282848281611fd657fe5b04146117f85760405162461bcd60e51b815260040180806020018281038252602181526020018061253a6021913960400191505060405180910390fd5b60006117f88383612205565b60006117f8836001600160a01b038416612269565b6000610d508261232f565b60006117f8836001600160a01b038416612333565b6001600160a01b0381166120995760405162461bcd60e51b815260040180806020018281038252602681526020018061243b6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006117f8836001600160a01b03841661234b565b600081848411156121985760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561215d578181015183820152602001612145565b50505050905090810190601f16801561218a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836121ef5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561215d578181015183820152602001612145565b5060008385816121fb57fe5b0495945050505050565b815460009082106122475760405162461bcd60e51b81526004018080602001828103825260228152602001806123ef6022913960400191505060405180910390fd5b82600001828154811061225657fe5b9060005260206000200154905092915050565b60008181526001830160205260408120548015612325578354600019808301919081019060009087908390811061229c57fe5b90600052602060002001549050808760000184815481106122b957fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806122e957fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610d50565b6000915050610d50565b5490565b60009081526001919091016020526040902054151590565b60006123578383612333565b61238d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d50565b506000610d50565b6040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180604001604052806000815260200160008152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473537761704d696e696e673a206e657720726f7574657220697320746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373537761704d696e696e673a206d757374206c6974746c65207468616e207468652063757272656e7420626c6f636b206e756d626572537761704d696e696e673a20746f6b656e20697320746865207a65726f2061646472657373537761704d696e696e673a2074616b65722073776170206f757470757420697320746865207a65726f2061646472657373537761704d696e696e673a206e6577206f7261636c6520697320746865207a65726f2061646472657373537761704d696e696e673a2063616c6c6572206973206e6f742074686520726f75746572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572537761704d696e696e673a2074616b65722073776170206163636f756e7420697320746865207a65726f2061646472657373537761704d696e696e673a2074616b6572207377617020696e70757420697320746865207a65726f2061646472657373a26469706673582212201bddcb4e8995d7560789df298809d64baa488c718eb56e3e130294315e38d95864736f6c6343000606003300000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c000000000000000000000000b0b670fc1f7724119963018db0bfa86adb22d9410000000000000000000000007b4b0d9cd226017ea3875d49196ea63a6ea8c278000000000000000000000000ed7d5f38c79115ca12fe6c0041abb22f0a06c300000000000000000000000000a71edc38d189767582c38a3145b5873052c3e47a0000000000000000000000000000000000000000000000022b1c8c1227a000000000000000000000000000000000000000000000000000000000000000152e0e

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

00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c000000000000000000000000b0b670fc1f7724119963018db0bfa86adb22d9410000000000000000000000007b4b0d9cd226017ea3875d49196ea63a6ea8c278000000000000000000000000ed7d5f38c79115ca12fe6c0041abb22f0a06c300000000000000000000000000a71edc38d189767582c38a3145b5873052c3e47a0000000000000000000000000000000000000000000000022b1c8c1227a000000000000000000000000000000000000000000000000000000000000000152e0e

-----Decoded View---------------
Arg [0] : _mdx (address): 0x25d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [1] : _factory (address): 0xb0b670fc1f7724119963018db0bfa86adb22d941
Arg [2] : _oracle (address): 0x7b4b0d9cd226017ea3875d49196ea63a6ea8c278
Arg [3] : _router (address): 0xed7d5f38c79115ca12fe6c0041abb22f0a06c300
Arg [4] : _targetToken (address): 0xa71edc38d189767582c38a3145b5873052c3e47a
Arg [5] : _mdxPerBlock (uint256): 40000000000000000000
Arg [6] : _startBlock (uint256): 1388046

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [1] : 000000000000000000000000b0b670fc1f7724119963018db0bfa86adb22d941
Arg [2] : 0000000000000000000000007b4b0d9cd226017ea3875d49196ea63a6ea8c278
Arg [3] : 000000000000000000000000ed7d5f38c79115ca12fe6c0041abb22f0a06c300
Arg [4] : 000000000000000000000000a71edc38d189767582c38a3145b5873052c3e47a
Arg [5] : 0000000000000000000000000000000000000000000000022b1c8c1227a00000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000152e0e


Deployed ByteCode Sourcemap

19870:12572:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19870:12572:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;20639:44:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20639:44:0;-1:-1:-1;;;;;20639:44:0;;:::i;:::-;;;;;;;;;;;;;;;;21820:93;;;:::i;24663:291::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24663:291:0;;:::i;21712:26::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21712:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;21712:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20311:34;;;:::i;22632:306::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22632:306:0;;;;;;;;;;;;;;:::i;:::-;;25237:94;;;:::i;30411:798::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30411:798:0;;:::i;:::-;;;;-1:-1:-1;;;;;30411:798:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14433:104;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14433:104:0;-1:-1:-1;;;;;14433:104:0;;:::i;:::-;;;;;;;;;;;;;;;;;;20575:26;;;:::i;:::-;;;;-1:-1:-1;;;;;20575:26:0;;;;;;;;;;;;;;20167:25;;;:::i;20515:15::-;;;:::i;20234:38::-;;;:::i;14545:140::-;;;:::i;22999:134::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22999:134:0;;:::i;24449:184::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24449:184:0;-1:-1:-1;;;;;24449:184:0;;:::i;20352:21::-;;;:::i;14346:79::-;;;:::i;20085:26::-;;;:::i;21745:64::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21745:64:0;;;;;;-1:-1:-1;;;;;21745:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23926:218;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23926:218:0;;:::i;23426:226::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23426:226:0;-1:-1:-1;;;;;23426:226:0;;:::i;26296:172::-;;;:::i;29656:715::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29656:715:0;;:::i;26476:741::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26476:741:0;;:::i;23660:118::-;;;:::i;31347:1090::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;31347:1090:0;;;;;;;;;;;;;;;;;:::i;27256:1351::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27256:1351:0;;;;;;;;;;;;;;;;;;;;;;:::i;25062:167::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25062:167:0;;:::i;24962:92::-;;;:::i;24152:100::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24152:100:0;;:::i;28682:915::-;;;:::i;24260:181::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24260:181:0;-1:-1:-1;;;;;24260:181:0;;:::i;20455:27::-;;;:::i;23786:132::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23786:132:0;-1:-1:-1;;;;;23786:132:0;;:::i;25377:831::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25377:831:0;;:::i;14930:109::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14930:109:0;-1:-1:-1;;;;;14930:109:0;;:::i;23195:223::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23195:223:0;-1:-1:-1;;;;;23195:223:0;;:::i;20403:21::-;;;:::i;21923:659::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21923:659:0;;;-1:-1:-1;;;;;21923:659:0;;;;;;;;;;;;:::i;20639:44::-;;;;;;;;;;;;;:::o;21820:93::-;21890:8;:15;21820:93;:::o;24663:291::-;24720:7;24744:13;;24761:1;24744:18;24740:59;;;-1:-1:-1;24786:1:0;24779:8;;24740:59;24827:10;;24813:11;:24;24809:119;;;24861:55;24902:13;;24862:34;24894:1;24862:27;24878:10;;24862:11;:15;;:27;;;;:::i;:::-;:31;:34;:31;:34;:::i;:::-;24861:40;:55;:40;:55;:::i;:::-;24854:62;;;;24809:119;-1:-1:-1;24945:1:0;24663:291;;;;:::o;21712:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21712:26:0;;;;-1:-1:-1;21712:26:0;;;;;:::o;20311:34::-;;;;:::o;22632:306::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;22734:11:::1;22730:59;;;22762:15;:13;:15::i;:::-;22817:63;22868:11;22817:46;22837:8;22846:4;22837:14;;;;;;;;;;;;;;;;;;:25;;;22817:15;;:19;;:46;;;;:::i;:::-;:50:::0;:63:::1;:50;:63;:::i;:::-;22799:15;:81;;;;22919:11;22891:8;22900:4;22891:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;22632:306:::0;;;:::o;25237:94::-;25276:7;25303:20;25310:12;25303:6;:20::i;:::-;25296:27;;25237:94;:::o;30411:798::-;30467:7;30476;30485;30494;30503;30512;30565:1;30547:8;:15;;;;:19;30539:4;:27;;30531:70;;;;;-1:-1:-1;;;30531:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30612:20;;:::i;:::-;30635:8;30644:4;30635:14;;;;;;;;;;;;;;;;30612:37;;;;;;;;30635:14;;;;;;;30612:37;;-1:-1:-1;;;;;30612:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30677:29;;-1:-1:-1;;;30677:29:0;;;;30612:37;;-1:-1:-1;30612:37:0;30677:27;;:29;;;;30635:14;;30677:29;;;;;;30612:37;30677:29;;;2:2:-1;;;;27:1;24;17:12;2:2;30677:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30677:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30677:29:0;30744:9;;30734:29;;;-1:-1:-1;;;30734:29:0;;;;30677;;-1:-1:-1;30717:14:0;;-1:-1:-1;;;;;30734:27:0;;;;;;:29;;;;;30677;;30734;;;;;;;;:27;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;30734:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30734:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30734:29:0;30794:19;;;;30859:20;;;;30734:29;;-1:-1:-1;30794:19:0;30774:17;;30846:34;;:12;:34::i;:::-;30824:56;;30891:17;30911:53;30948:15;;30911:32;30927:4;:15;;;30911:11;:15;;:32;;;;:::i;:53::-;30891:73;-1:-1:-1;30987:24:0;:9;30891:73;30987:24;:13;:24;:::i;:::-;31150:18;;;;31170:13;;;;31185:15;;;;;31123:6;;31131;;-1:-1:-1;30975:36:0;;-1:-1:-1;31150:18:0;-1:-1:-1;31170:13:0;;-1:-1:-1;31185:15:0;;-1:-1:-1;30411:798:0;;-1:-1:-1;;;;;30411:798:0:o;14433:104::-;14488:4;14523:6;-1:-1:-1;;;;;14523:6:0;;;14512:17;;;;14433:104::o;20575:26::-;;;-1:-1:-1;;;;;20575:26:0;;:::o;20167:25::-;;;;:::o;20515:15::-;;;-1:-1:-1;;;;;20515:15:0;;:::o;20234:38::-;;;;:::o;14545:140::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;14644:1:::1;14628:6:::0;;14607:40:::1;::::0;-1:-1:-1;;;;;14628:6:0;;::::1;::::0;14607:40:::1;::::0;14644:1;;14607:40:::1;14675:1;14658:19:::0;;-1:-1:-1;;;;;;14658:19:0::1;::::0;;14545:140::o;22999:134::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;23073:15:::1;:13;:15::i;:::-;23099:11;:26:::0;22999:134::o;24449:184::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24521:30:0;::::1;24513:85;;;;-1:-1:-1::0;;;24513:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24609:6;:16:::0;;-1:-1:-1;;;;;;24609:16:0::1;-1:-1:-1::0;;;;;24609:16:0;;;::::1;::::0;;;::::1;::::0;;24449:184::o;20352:21::-;;;-1:-1:-1;;;;;20352:21:0;;:::o;14346:79::-;14384:7;14411:6;-1:-1:-1;;;;;14411:6:0;14346:79;:::o;20085:26::-;;;;:::o;21745:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23926:218::-;23985:7;24045:1;24022:20;:18;:20::i;:::-;:24;24012:6;:34;;24004:78;;;;;-1:-1:-1;;;24004:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24100:36;24117:10;24129:6;24100:16;:36::i;:::-;24093:43;23926:218;-1:-1:-1;;23926:218:0:o;23426:226::-;23493:4;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23518:23:0;::::1;23510:73;;;;-1:-1:-1::0;;;23510:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23601:43;23622:10;23634:9;23601:20;:43::i;26296:172::-:0;26356:8;:15;26339:14;26382:79;26410:6;26404:3;:12;26382:79;;;26440:9;26445:3;26440:4;:9::i;:::-;-1:-1:-1;26418:5:0;;26382:79;;;;26296:172;:::o;29656:715::-;29758:8;:15;29714:7;;;;-1:-1:-1;;29758:19:0;29750:27;;;29742:70;;;;;-1:-1:-1;;;29742:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29823:15;29849:20;;:::i;:::-;29872:8;29881:4;29872:14;;;;;;;;;;;;;;;;;29849:37;;;;;;;;29872:14;;;;;;;29849:37;;-1:-1:-1;;;;;29849:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29897:20:0;;:::i;:::-;-1:-1:-1;29920:14:0;;;;:8;:14;;;;;;;;29935:10;29920:26;;;;;;;;29897:49;;;;;;;;;;;;;;;;;;;;;;;;;29961:17;29957:306;;29995:19;30017:34;30030:4;:20;;;30017:12;:34::i;:::-;29995:56;;30066:17;30086:53;30123:15;;30086:32;30102:4;:15;;;30086:11;:15;;:32;;;;:::i;:53::-;30066:73;;30164:87;30176:74;30236:4;:13;;;30176:55;30217:4;:13;;;30177:34;30201:9;30177:4;:19;;;:23;;:34;;;;:::i;:::-;30176:40;:55;:40;:55;:::i;:74::-;30164:7;;:87;:11;:87;:::i;:::-;30154:97;;29957:306;;;30349:13;30340:7;;-1:-1:-1;30349:13:0;;-1:-1:-1;;29656:715:0;;;:::o;26476:741::-;26520:4;26537:21;26561:8;26570:4;26561:14;;;;;;;;;;;;;;;;;;26537:38;;26606:4;:20;;;26590:12;:36;26586:81;;26650:5;26643:12;;;;;26586:81;26677:19;26699:34;26712:4;:20;;;26699:12;:34::i;:::-;26677:56;;26763:1;26748:11;:16;26744:61;;26788:5;26781:12;;;;;;26744:61;26894:17;26914:53;26951:15;;26914:32;26930:4;:15;;;26914:11;:15;;:32;;;;:::i;:53::-;26978:3;;:34;;;-1:-1:-1;;;26978:34:0;;26995:4;26978:34;;;;;;;;;;;;26894:73;;-1:-1:-1;;;;;;26978:3:0;;;;:8;;:34;;;;;;;;;;;;;;;:3;;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;26978:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26978:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;27107:19:0;;;;:34;;27131:9;27107:34;:23;:34;:::i;:::-;27085:19;;;:56;-1:-1:-1;;27175:12:0;27152:20;;;;:35;-1:-1:-1;27205:4:0;26476:741;;;:::o;23660:118::-;23711:7;23738:32;23759:10;23738:20;:32::i;31347:1090::-;31453:7;;-1:-1:-1;;;;;31508:26:0;;;;;;;31504:900;;;-1:-1:-1;31562:12:0;31504:900;;;31609:7;;31596:55;;;-1:-1:-1;;;31596:55:0;;-1:-1:-1;;;;;31596:55:0;;;;;;;;;;;;;;;;31663:1;;31609:7;;;;31596:29;;:55;;;;;;;;;;;;;;;31609:7;31596:55;;;2:2:-1;;;;27:1;24;17:12;2:2;31596:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31596:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31596:55:0;-1:-1:-1;;;;;31596:69:0;;31592:812;;31701:6;;31693:63;;;-1:-1:-1;;;31693:63:0;;-1:-1:-1;;;;;31693:63:0;;;;;;;;;;;;;;;;;;;;;;31701:6;;;;;31693:23;;:63;;;;;;;;;;;;;;31701:6;31693:63;;;2:2:-1;;;;27:1;24;17:12;2:2;31693:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31693:63:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31693:63:0;;-1:-1:-1;31592:812:0;;;31789:14;31806:20;:18;:20::i;:::-;31789:37;-1:-1:-1;31846:13:0;31841:552;31873:6;31865:5;:14;31841:552;;;31909:20;31932:19;31945:5;31932:12;:19::i;:::-;31987:7;;31974:56;;;-1:-1:-1;;;31974:56:0;;-1:-1:-1;;;;;31974:56:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31987:7:0;;;;;31974:29;;:56;;;;;;;;;;;;;;31987:7;31974:56;;;2:2:-1;;;;27:1;24;17:12;2:2;31974:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31974:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31974:56:0;-1:-1:-1;;;;;31974:70:0;;;;;:144;;-1:-1:-1;32061:7:0;;32048:56;;;-1:-1:-1;;;32048:56:0;;-1:-1:-1;;;;;32048:56:0;;;;;;;;;;;;;;;;32116:1;;32061:7;;;;32048:29;;:56;;;;;;;;;;;;;;;32061:7;32048:56;;;2:2:-1;;;;27:1;24;17:12;2:2;32048:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32048:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32048:56:0;-1:-1:-1;;;;;32048:70:0;;;31974:144;31970:408;;;32175:6;;32167:64;;;-1:-1:-1;;;32167:64:0;;-1:-1:-1;;;;;32167:64:0;;;;;;;;;;;;;;;;;;;;;;32143:21;;32175:6;;;;;32167:23;;:64;;;;;;;;;;;;;;;32175:6;32167:64;;;2:2:-1;;;;27:1;24;17:12;2:2;32167:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32167:64:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32167:64:0;32273:6;;32265:65;;;-1:-1:-1;;;32265:65:0;;-1:-1:-1;;;;;32265:65:0;;;;;;;;;;;;;;;;;;;;;;32167:64;;-1:-1:-1;32273:6:0;;;32265:23;;:65;;;;;32167:64;;32265:65;;;;;;;;32273:6;32265:65;;;2:2:-1;;;;27:1;24;17:12;2:2;32265:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32265:65:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32265:65:0;;-1:-1:-1;32353:5:0;;-1:-1:-1;;32353:5:0;31970:408;-1:-1:-1;31881:7:0;;31841:552;;;;31592:812;;32421:8;31347:1090;-1:-1:-1;;;;31347:1090:0:o;27256:1351::-;31272:6;;27361:4;;-1:-1:-1;;;;;31272:6:0;31258:10;:20;31250:69;;;;-1:-1:-1;;;31250:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27386:21:0;::::1;27378:84;;;;-1:-1:-1::0;;;27378:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27481:19:0;::::1;27473:80;;;;-1:-1:-1::0;;;27473:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27572:20:0;::::1;27564:82;;;;-1:-1:-1::0;;;27564:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27679:1;27663:12;:10;:12::i;:::-;:17;27659:62;;-1:-1:-1::0;27704:5:0::1;27697:12;;27659:62;27738:18;27750:5;27738:11;:18::i;:::-;27737:19;:43;;;;27761:19;27773:6;27761:11;:19::i;:::-;27760:20;27737:43;27733:88;;;-1:-1:-1::0;27804:5:0::1;27797:12;;27733:88;27861:7;::::0;27848:44:::1;::::0;;-1:-1:-1;;;27848:44:0;;-1:-1:-1;;;;;27848:44:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;27833:12:::1;::::0;27861:7;;;::::1;::::0;27848:29:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;27861:7;27848:44;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;27848:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27848:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27848:44:0;-1:-1:-1;;;;;27938:15:0;::::1;27905:21;27938:15:::0;;;:9:::1;27848:44;27938:15:::0;;;;;27929:8:::1;:25:::0;;27848:44;;-1:-1:-1;27905:21:0;;27929:25;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;28037:9:::0;;27929:25;;-1:-1:-1;;;;;;28037:17:0;;::::1;:9:::0;::::1;:17;;::::0;:41:::1;;-1:-1:-1::0;28058:15:0::1;::::0;::::1;::::0;:20;28037:41:::1;28033:86;;;28102:5;28095:12;;;;;;28033:86;28178:11;::::0;28131:16:::1;::::0;28150:40:::1;::::0;28162:6;;28170;;-1:-1:-1;;;;;28178:11:0::1;28150;:40::i;:::-;28131:59;;28217:1;28205:8;:13;28201:58;;28242:5;28235:12;;;;;;;28201:58;-1:-1:-1::0;;;;;28276:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;28271:21:::1;::::0;:4:::1;:21::i;:::-;-1:-1:-1::0;28321:13:0::1;::::0;::::1;::::0;:27:::1;::::0;28339:8;28321:27:::1;:17;:27;:::i;:::-;28305:13;::::0;::::1;:43:::0;28380:18:::1;::::0;::::1;::::0;:32:::1;::::0;28403:8;28380:32:::1;:22;:32;:::i;:::-;28359:18;::::0;::::1;:53:::0;-1:-1:-1;;;;;28456:15:0;;::::1;28423:21;28456:15:::0;;;:9:::1;:15;::::0;;;;;;;;28447:25;;:8:::1;:25:::0;;;;;:34;;::::1;::::0;;;;;;28508:13;;:27:::1;::::0;28526:8;28508:27:::1;:17;:27;:::i;:::-;28492:43:::0;;28565:12:::1;28546:16;::::0;;::::1;:31:::0;:16;27256:1351;-1:-1:-1;;;;;;;;27256:1351:0:o;25062:167::-;25120:7;25140:14;25157:18;25163:11;25157:5;:18::i;:::-;25140:35;;25193:28;25214:6;25209:1;:11;25193;;:15;;:28;;;;:::i;:::-;25186:35;25062:167;-1:-1:-1;;;25062:167:0:o;24962:92::-;25000:7;25027:19;25033:12;25027:5;:19::i;24152:100::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;24222:13:::1;:22:::0;24152:100::o;28682:915::-;28768:8;:15;28725;;;28794:691;28822:6;28816:3;:12;28794:691;;;28852:21;28876:8;28885:3;28876:13;;;;;;;;;;;;;;;;28928;;;:8;:13;;;;;;28942:10;28928:25;;;;;;;28972:13;;28876;;;;;;;;-1:-1:-1;28972:17:0;28968:506;;29010:9;29015:3;29010:4;:9::i;:::-;;29099:18;29120:57;29163:4;:13;;;29120:38;29144:4;:13;;;29120:4;:19;;;:23;;:38;;;;:::i;:57::-;29230:13;;29212;;;;29099:78;;-1:-1:-1;29212:32:0;;:13;:32;:17;:32;:::i;:::-;29196:13;;;:48;29285:19;;;;:35;;29309:10;29285:35;:23;:35;:::i;:::-;29263:19;;;:57;29355:1;29339:17;;29394:12;29375:16;;;:31;29435:23;:7;29447:10;29435:23;:11;:23;:::i;:::-;29425:33;;28968:506;;-1:-1:-1;;28830:5:0;;28794:691;;;;29510:1;29499:7;:12;29495:51;;29528:7;;;;29495:51;29556:3;;:33;;;-1:-1:-1;;;29556:33:0;;29569:10;29556:33;;;;;;;;;;;;-1:-1:-1;;;;;29556:3:0;;;;:12;;:33;;;;;;;;;;;;;;;:3;;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;29556:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29556:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;28682:915:0;:::o;24260:181::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24334:23:0;::::1;24326:78;;;;-1:-1:-1::0;;;24326:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24415:6;:18:::0;;-1:-1:-1;;;;;;24415:18:0::1;-1:-1:-1::0;;;;;24415:18:0;;;::::1;::::0;;;::::1;::::0;;24260:181::o;20455:27::-;;;-1:-1:-1;;;;;20455:27:0;;:::o;23786:132::-;23844:4;23868:42;23891:10;23903:6;23868:22;:42::i;25377:831::-;25446:7;25494:12;25474:16;:32;;25466:98;;;;-1:-1:-1;;;25466:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25575:19;;25621:23;25627:16;25621:5;:23::i;:::-;25609:35;;25655:9;25667:19;25673:12;25667:5;:19::i;:::-;25655:31;;25733:335;25744:1;25740;:5;25733:335;;;25874:10;;25855:13;;25762:3;;;;;25837:9;;25849:36;;:20;;25762:3;;25849:20;:5;:20;:::i;:36::-;25837:48;;25964:57;25980:40;26010:9;26017:1;26010:6;:9::i;:::-;25981:23;:1;25987:16;25981:23;:5;:23;:::i;25980:40::-;25964:11;;:57;:15;:57;:::i;:::-;26055:1;;-1:-1:-1;25950:71:0;-1:-1:-1;25733:335:0;;;26092:79;26108:62;26149:20;26156:12;26149:6;:20::i;:::-;26109:34;:12;26126:16;26109:34;:16;:34;:::i;26108:62::-;26092:11;;:79;:15;:79;:::i;:::-;26078:93;25377:831;-1:-1:-1;;;;;25377:831:0:o;14930:109::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;15003:28:::1;15022:8;15003:18;:28::i;:::-;14930:109:::0;:::o;23195:223::-;23262:4;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23287:23:0;::::1;23279:73;;;;-1:-1:-1::0;;;23279:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23370:40;23388:10;23400:9;23370:17;:40::i;20403:21::-:0;;;-1:-1:-1;;;;;20403:21:0;;:::o;21923:659::-;15089:19;15097:10;15089:7;:19::i;:::-;15081:64;;;;;-1:-1:-1;;;15081:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15081:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22030:19:0;::::1;22022:57;;;::::0;;-1:-1:-1;;;22022:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22094:11;22090:59;;;22122:15;:13;:15::i;:::-;22159:23;22200:10;;22185:12;:25;:53;;22228:10;;22185:53;;;22213:12;22185:53;22267:15;::::0;22159:79;;-1:-1:-1;22267:32:0::1;::::0;22287:11;22267:32:::1;:19;:32;:::i;:::-;22249:15;:50:::0;;;22324:203:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22324:203:0;;::::1;::::0;;-1:-1:-1;22324:203:0::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;22310:8:::1;27:10:-1::0;;39:1:::1;23:18:::0;;::::1;45:23:::0;;22310:218:0;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;22310:218:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22558:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;22539:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;22558;::::1;22539:35:::0;;;-1:-1:-1;;;21923:659:0:o;10344:136::-;10402:7;10429:43;10433:1;10436;10429:43;;;;;;;;;;;;;;;;;:3;:43::i;11167:132::-;11225:7;11252:39;11256:1;11259;11252:39;;;;;;;;;;;;;;;;;:3;:39::i;10155:181::-;10213:7;10245:5;;;10269:6;;;;10261:46;;;;;-1:-1:-1;;;10261:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10688:471;10746:7;10991:6;10987:47;;-1:-1:-1;11021:1:0;11014:8;;10987:47;11058:5;;;11062:1;11058;:5;:1;11082:5;;;;;:10;11074:56;;;;-1:-1:-1;;;11074:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:149;8190:7;8233:22;8237:3;8249:5;8233:3;:22::i;7166:149::-;7239:4;7263:44;7271:3;-1:-1:-1;;;;;7291:14:0;;7263:7;:44::i;7645:117::-;7708:7;7735:19;7743:3;7735:7;:19::i;7401:158::-;7481:4;7505:46;7515:3;-1:-1:-1;;;;;7535:14:0;;7505:9;:46::i;14693:229::-;-1:-1:-1;;;;;14767:22:0;;14759:73;;;;-1:-1:-1;;;14759:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14869:6;;;14848:38;;-1:-1:-1;;;;;14848:38:0;;;;14869:6;;;14848:38;;;14897:6;:17;;-1:-1:-1;;;;;;14897:17:0;-1:-1:-1;;;;;14897:17:0;;;;;;;;;;14693:229::o;6847:143::-;6917:4;6941:41;6946:3;-1:-1:-1;;;;;6966:14:0;;6941:4;:41::i;10488:192::-;10574:7;10610:12;10602:6;;;;10594:29;;;;-1:-1:-1;;;10594: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;10594:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10646:5:0;;;10488:192::o;11307:345::-;11393:7;11495:12;11488:5;11480:28;;;;-1:-1:-1;;;11480:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11480:28:0;;11519:9;11535:1;11531;:5;;;;;;;11307:345;-1:-1:-1;;;;;11307:345:0:o;4789:204::-;4884:18;;4856:7;;4884:26;-1:-1:-1;4876:73:0;;;;-1:-1:-1;;;4876:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4967:3;:11;;4979:5;4967:18;;;;;;;;;;;;;;;;4960:25;;4789:204;;;;:::o;2469:1556::-;2535:4;2674:19;;;:12;;;:19;;;;;;2710:15;;2706:1312;;3144:18;;-1:-1:-1;;3095:14:0;;;;3144:22;;;;3071:21;;3144:3;;:22;;3431;;;;;;;;;;;;;;3411:42;;3577:9;3548:3;:11;;3560:13;3548:26;;;;;;;;;;;;;;;;;;;:38;;;;3654:23;;;3696:1;3654:12;;;:23;;;;;;3680:17;;;3654:43;;3819:17;;3654:3;;3819:17;;;;;;;;;;;;;;;;;;;;;;3914:3;:12;;:19;3927:5;3914:19;;;;;;;;;;;3907:26;;;3957:4;3950:11;;;;;;;;2706:1312;4001:5;3994:12;;;;;4326:109;4409:18;;4326:109::o;4111:129::-;4184:4;4208:19;;;:12;;;;;:19;;;;;;:24;;;4111:129::o;1879:414::-;1942:4;1964:21;1974:3;1979:5;1964:9;:21::i;:::-;1959:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;2002:11:0;:23;;;;;;;;;;;;;2185:18;;2163:19;;;:12;;;:19;;;;;;:40;;;;2218:11;;1959:327;-1:-1:-1;2269:5:0;2262:12;;19870:12572;;;;;;;;;;-1:-1:-1;;;;;19870:12572:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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