Contract 0x3a1138075bd97a33f23a87824b811146fa44288e 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x71d86065fcd655d233f19a8269ef7af168e6637192ba9e7a913875146c0d94e3Approve59014262022-12-07 3:58:4516 hrs 1 min ago0xe48ba23dd2cdd5a6f0956a1211a451da38368c46 IN  Minotaur Money: MINO Token0 CRO0.222565 5,000
0x85a89a9745f09f79a08c0e7a5b29375239e068231f46a11b55f264c59f1ddeeaApprove59013842022-12-07 3:54:4816 hrs 5 mins ago0x1256380d7d89173a558858970d4ebaf25dc4dadb IN  Minotaur Money: MINO Token0 CRO0.12202335447 4,862.069349736
0xfa9c9d60716bc0a52a518c091e1a406d5b49efc1aea6969d0dfe6a382782f269Approve59013832022-12-07 3:54:4216 hrs 5 mins ago0x1256380d7d89173a558858970d4ebaf25dc4dadb IN  Minotaur Money: MINO Token0 CRO0.215375087961 4,862.069394339
0xa3ae321cc1e62fbd2cc9c8da379511137f504f814fb3ee185e1d9574fad59c43Approve59013112022-12-07 3:47:5416 hrs 12 mins ago0x1256380d7d89173a558858970d4ebaf25dc4dadb IN  Minotaur Money: MINO Token0 CRO0.222565 5,000
0x48679ce29e773851db446228f537f1aca6f9cd5f251e4945ea9bff79c87b17c8Approve58646562022-12-04 18:09:183 days 1 hr ago0x26bc65ab3379aa60885d77a5b229172a8cb6fc55 IN  Minotaur Money: MINO Token0 CRO0.1133100835190
0x885630eb009f20b2333c14e3eef1cf9ff8783f5db9cc59790a92a79973f19e2aApprove58646542022-12-04 18:09:073 days 1 hr ago0x26bc65ab3379aa60885d77a5b229172a8cb6fc55 IN  Minotaur Money: MINO Token0 CRO0.1133100835190
0xb2736dcdc70824878b258a121198e9873ccb9346602d5ccacaf24a44db91af79Approve58521792022-12-03 22:33:383 days 21 hrs ago0x0e856982e06ae534c8a67d7fc61cc93f6c2dfd95 IN  Minotaur Money: MINO Token0 CRO0.2154091129370
0x90f2eed2272637374737d754146ffdb1a3f2db3ddac6a9707ee6ebc636534a75Approve58390962022-12-03 1:54:294 days 18 hrs ago0x163c1d3bc3de430d2bedfc64a69c66b0b5bdcb0c IN  Minotaur Money: MINO Token0 CRO0.1133376034760
0xad07a2956f527208def58b2b7fbe858779006275a3c15c50bb87098a8b97bbf7Approve57302192022-11-25 21:30:2711 days 22 hrs ago0xbef56df4f2183f59d90d5869efd330e38dc86105 IN  Minotaur Money: MINO Token0 CRO0.216776952312 4,869.969499089
0x9a6bf8cd9869071d183485c6b2e303959ccecce8711715986f1b49f4dd12738bApprove57302092022-11-25 21:29:3011 days 22 hrs ago0xbef56df4f2183f59d90d5869efd330e38dc86105 IN  Minotaur Money: MINO Token0 CRO0.215725058874 4,869.969949992
0x36ac44864a872db7dcc440e77ea4083c8ee391f8a41771d3f05903b5a6a3dd01Approve56973632022-11-23 17:39:3414 days 2 hrs ago0x25f7143d534416794c0121b580cf2736178c6d02 IN  Minotaur Money: MINO Token0 CRO0.2225650
0x7bd9ae893fd96f6fce77eb2367a7723cb140ac4a17de45ed954f0b63636aab09Approve56474172022-11-20 11:00:4017 days 8 hrs ago0xb31950640eb54c93d380b3c41559ebf2391edc8f IN  Minotaur Money: MINO Token0 CRO0.1135440248120
0xc9736ecec0eb2f82ce3755c0d95d4c21aa984e6ec4214ece1fe00462bfe5d661Approve56474142022-11-20 11:00:2417 days 8 hrs ago0xb31950640eb54c93d380b3c41559ebf2391edc8f IN  Minotaur Money: MINO Token0 CRO0.1135440248120
0x640f0c22db5898bae649d49844085afa7ee0995dc64c4a55a3383b2fb4778a16Approve54442582022-11-07 1:55:3030 days 18 hrs ago0xfb741c0825735ccd9ee2ea664ab7ba2164b1c3d5 IN  Minotaur Money: MINO Token0 CRO0.2172905416940
0x88be7c17be45c7c5bdd52cbe63bb3c625a51ca96f8ea3ef70fe603ad23a8ece5Approve54428882022-11-06 23:45:4030 days 20 hrs ago0x8cb7ac3cb70df558d84a35cda46722b4bbb8bab1 IN  Minotaur Money: MINO Token0 CRO0.217360066959 4,883.069372084
0x5b66b27fb9b36c573b6bd8187060172724cf966561e1de125121b52cf5952372Approve54427462022-11-06 23:32:1330 days 20 hrs ago0x39bafe53d9ad41e44eb440d074aa69b5842f0047 IN  Minotaur Money: MINO Token0 CRO0.113818502751 4,884.075813216
0x6bbd07a47310c8e3209c46e7fe284a56389dbdd209e2dafcd43473b238145763Approve54427282022-11-06 23:30:3030 days 20 hrs ago0x39bafe53d9ad41e44eb440d074aa69b5842f0047 IN  Minotaur Money: MINO Token0 CRO0.113818521879 4,884.076634015
0xea9fba4fbd024a301f06bacd4cc3d41a45c240052496eb7fab0f6fd6e971a794Approve54342632022-11-06 10:06:5731 days 9 hrs ago0x37e345db5895199b11a7d73d609a20d316e7b27b IN  Minotaur Money: MINO Token0 CRO0.218837819845 4,916.267603737
0x48fea95d4332f038e8d06f466696b05fc508f9df69b2dc65c9ddd7c8f74c028cApprove54337912022-11-06 9:22:2631 days 10 hrs ago0x8cbc25564afd6c20148202746d0299e0321467dd IN  Minotaur Money: MINO Token0 CRO0.2162569762360
0x00d77289a1bdfee17f6551a70de9aec72a25807266d581521072e039e9dff2c3Approve54262382022-11-05 21:29:5531 days 22 hrs ago0xe61134fa12e75ff6d6e34b374027a0e414a3fa1a IN  Minotaur Money: MINO Token0 CRO0.2162723714330
0x2d001d222e2a3bc599cf57b01f71b54626e2629a56f67a17f195fe714d5c78f1Approve54235512022-11-05 17:16:1232 days 2 hrs ago0x4438b4da7bcdc70dcd2c045fc11c0d39043d244d IN  Minotaur Money: MINO Token0 CRO0.217399164815 4,883.947718984
0x1f446f898b3a8cd42d5c7b06a1c6ae99be882bcaced3c66e37494def1352e67cApprove54193072022-11-05 10:34:3332 days 9 hrs ago0x97c98d6ab8dbbfe6ba464bd7a849d376da1bb540 IN  Minotaur Money: MINO Token0 CRO0.222565 5,000
0x791ca9577d49f0d6e5f9d314a372b40d090fb109b82b7b4151e7c209cd61366bApprove54089592022-11-04 18:15:5233 days 1 hr ago0xc7f9abe9fd90bd0315b6975eba987296c616d763 IN  Minotaur Money: MINO Token0 CRO0.121731129625 4,883.113226603
0x38a5c57e8ae44678c3fc606423abb93c3ae1399e7d3a3458400125c4d9a16c50Approve54089552022-11-04 18:15:3033 days 1 hr ago0xc7f9abe9fd90bd0315b6975eba987296c616d763 IN  Minotaur Money: MINO Token0 CRO0.113796077596 4,883.113525408
0x6731c36bc6db2acab2261f8b650ea376b36acaad9ebea57f92dfb4b4fa5ed221Approve53989892022-11-04 2:33:0233 days 17 hrs ago0x77a8abe21fc3db7fdef169fe4237ce5436c58842 IN  Minotaur Money: MINO Token0 CRO0.311591 7,000
[ Download CSV Export 

OVERVIEW

A Decentralized Reserve Currency and VC on Cronos Network.

Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MINOERC20Token

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-01-07
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

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

  function _getValues( Set storage set_ ) private view returns ( bytes32[] storage ) {
    return set_._values;
  }

  // TODO needs insert function that maintains order.
  // TODO needs NatSpec documentation comment.
  /**
   * Inserts new value by moving existing value at provided index to end 
   * of array and setting provided value at provided index
   */
  function _insert(Set storage set_, uint256 index_, bytes32 valueToInsert_ ) private returns ( bool ) {
    require(  set_._values.length > index_ );
    require( !_contains( set_, valueToInsert_ ), "Remove value you wish to insert if you wish to reorder array." );
    bytes32 existingValue_ = _at( set_, index_ );
    set_._values[index_] = valueToInsert_;
    return _add( set_, existingValue_);
  } 

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

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

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

  function getValues( Bytes4Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;
    for( uint256 iteration_ = 0; _length( set_._inner ) > iteration_; iteration_++ ) {
      bytes4Array_[iteration_] = bytes4( _at( set_._inner, iteration_ ) );
    }
    return bytes4Array_;
  }

  function insert( Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

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

  function getValues( Bytes32Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;

      for( uint256 iteration_ = 0; _length( set_._inner ) >= iteration_; iteration_++ ){
        bytes4Array_[iteration_] = bytes4( at( set_, iteration_ ) );
      }

      return bytes4Array_;
  }

  function insert( Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

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

  /**
   * TODO Might require explicit conversion of bytes32[] to address[].
   *  Might require iteration.
   */
  function getValues( AddressSet storage set_ ) internal view returns ( address[] memory ) {

    address[] memory addressArray;

    for( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ){
      addressArray[iteration_] = at( set_, iteration_ );
    }

    return addressArray;
  }

  function insert(AddressSet storage set_, uint256 index_, address valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, bytes32(uint256(valueToInsert_)) );
  }


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

    struct UInt256Set {
        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(UInt256Set 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(UInt256Set 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(UInt256Set 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(UInt256Set 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(UInt256Set storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

library SafeMath {

    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) {

        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) {
        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 sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns ( uint256 percentAmount_ ) {
        return div( mul( total_, percentage_ ), 1000 );
    }

    function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) {
        return sub( total_, div( mul( total_, percentageToSub_ ), 1000 ) );
    }

    function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns ( uint256 percent_ ) {
        return div( mul(part_, 100) , total_ );
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }

    function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) {
        return sqrrt( mul( multiplier_, payment_ ) );
    }

  function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) {
      return mul( multiplier_, supply_ );
  }
}

abstract contract ERC20 is IERC20 {

  using SafeMath for uint256;

  // TODO comment actual hash value.
  bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
  // Present in ERC777
  mapping (address => uint256) internal _balances;

  // Present in ERC777
  mapping (address => mapping (address => uint256)) internal _allowances;

  // Present in ERC777
  uint256 internal _totalSupply;

  // Present in ERC777
  string internal _name;
    
  // Present in ERC777
  string internal _symbol;
    
  // Present in ERC777
  uint8 internal _decimals;

  constructor (string memory name_, string memory symbol_, uint8 decimals_) {
    _name = name_;
    _symbol = symbol_;
    _decimals = decimals_;
  }

  function name() public view returns (string memory) {
    return _name;
  }

  function symbol() public view returns (string memory) {
    return _symbol;
  }

  function decimals() public view returns (uint8) {
    return _decimals;
  }

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

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

  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender]
          .sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender]
          .sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
      require(sender != address(0), "ERC20: transfer from the zero address");
      require(recipient != address(0), "ERC20: transfer to the zero address");

      _beforeTokenTransfer(sender, recipient, amount);

      _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
      _balances[recipient] = _balances[recipient].add(amount);
      emit Transfer(sender, recipient, amount);
    }

    function _mint(address account_, uint256 amount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, amount_);
        _totalSupply = _totalSupply.add(amount_);
        _balances[account_] = _balances[account_].add(amount_);
        emit Transfer(address( this ), account_, amount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IERC2612Permit {

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

    function nonces(address owner) external view returns (uint256);
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
            keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

interface IOwnable {
  function owner() external view returns (address);

  function renounceOwnership() external;
  
  function transferOwnership( address newOwner_ ) external;
}

contract Ownable is IOwnable {
    
  address internal _owner;

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

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

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

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

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

  function transferOwnership( address newOwner_ ) public virtual override onlyOwner() {
    require( newOwner_ != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred( _owner, newOwner_ );
    _owner = newOwner_;
  }
}

contract VaultOwned is Ownable {
    
  address internal _vault;

  function setVault( address vault_ ) external onlyOwner() returns ( bool ) {
    _vault = vault_;

    return true;
  }

  function vault() public view returns (address) {
    return _vault;
  }

  modifier onlyVault() {
    require( _vault == msg.sender, "VaultOwned: caller is not the Vault" );
    _;
  }

}

contract MINOERC20Token is ERC20Permit, VaultOwned {

    using SafeMath for uint256;

    mapping(address => bool) public taxFromMap;
    mapping(address => bool) public taxToMap;

    // Max transfer tax rate: 25.00%.
    uint256 public constant MAXIMUM_TRANSFER_TAX_RATE = 2500;

    // Transfer tax rate in basis points. (default 6.66%)
    uint256 public transferTaxRate = 666;

    // Staking address for rewards, defaults to burning tokens, but will be set to
    // the read staking address momentarily after this contracts deploy step.
    address public stakingAddress = 0x000000000000000000000000000000000000dEaD;
  
    address public immutable addLiquidityHelper;

    event TransferFeeChanged( uint256 txnFee );
    event UpdateFeeMaps( address indexed _contract, bool fromTaxed, bool toTaxed );
    event SetStakingAddress( address stakingAddress );
    event OperatorTransferred( address indexed previousOperator, address indexed newOperator );
  
    // The operator can only update the transfer tax rate
    address public operator;

    modifier onlyOperator() {
        require(operator == msg.sender, "!operator");
        _;
    }

    constructor( address _addLiquidityHelper ) ERC20("MINO", "MINO", 9) {
      require( _addLiquidityHelper != address(0), "addLiquidityHelper address can't be address(0)" );
      addLiquidityHelper = _addLiquidityHelper;

      operator = msg.sender;
    }

    function mint(address account_, uint256 amount_) external onlyVault() {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) public virtual {
        _burn(msg.sender, amount);
    }
     
    function burnFrom(address account_, uint256 amount_) public virtual {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) public virtual {
        uint256 decreasedAllowance_ =
            allowance(account_, msg.sender).sub(
                amount_,
                "ERC20: burn amount exceeds allowance"
            );

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }

    /// @dev overrides transfer function to meet tokenomics of DARKSIDE
    function _transfer( address sender, address recipient, uint256 amount ) internal virtual override {
        bool toFromAddLiquidityHelper = (sender == addLiquidityHelper || recipient == addLiquidityHelper);

        if ( !( taxFromMap[ sender ] || taxToMap[ recipient ] ) ||
            recipient == stakingAddress ||
            toFromAddLiquidityHelper ||
            transferTaxRate == 0
            ) {
            super._transfer( sender, recipient, amount );
        } else {
            // default tax is 6.66% of every taxed transfer
            uint256 taxAmount = ( amount.mul( transferTaxRate ) ) / 10000;

            // default 93.34% of transfer sent to recipient
            uint256 sendAmount = amount.sub( taxAmount );

            assert( amount == sendAmount.add( taxAmount ) );

            super._transfer( sender, stakingAddress, taxAmount );
            super._transfer( sender, recipient, sendAmount );
            amount = sendAmount;
        }
    }

    /**
     * @dev Update the transfer tax rate.
     * Can only be called by the current operator.
     */
    function updateTransferTaxRate( uint256 _transferTaxRate ) external onlyOperator {
        require( _transferTaxRate  <= MAXIMUM_TRANSFER_TAX_RATE,
            "!valid" );
        transferTaxRate = _transferTaxRate;

        emit TransferFeeChanged( transferTaxRate );
    }

    /**
     * @dev Update the excludeFromMap
     * Can only be called by the current operator.
     */
    function updateFeeMaps( address _contract, bool fromTaxed, bool toTaxed ) external onlyOperator {
        taxFromMap[_contract] = fromTaxed;
        taxToMap[_contract] = toTaxed;

        emit UpdateFeeMaps( _contract, fromTaxed, toTaxed );
    }

    /**
     * @dev Update the mino staking address.
     * Can only be called by the current operator.
     */
    function updateMinoStakingAddress( address _stakingAddress ) external onlyOperator {
        require( _stakingAddress != address(0) && _stakingAddress != 0x000000000000000000000000000000000000dEaD, "!!0");
        require( stakingAddress == 0x000000000000000000000000000000000000dEaD, "!unset");

        stakingAddress = _stakingAddress;

        emit SetStakingAddress( stakingAddress );
    }

    /**
     * @dev Transfers operator of the contract to a new account (`newOperator`).
     * Can only be called by the current operator.
     */
    function transferOperator( address newOperator ) external onlyOperator {
        require( newOperator != address(0), "!!0" );

        emit OperatorTransferred( operator, newOperator );

        operator = newOperator;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_addLiquidityHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakingAddress","type":"address"}],"name":"SetStakingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"txnFee","type":"uint256"}],"name":"TransferFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"fromTaxed","type":"bool"},{"indexed":false,"internalType":"bool","name":"toTaxed","type":"bool"}],"name":"UpdateFeeMaps","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addLiquidityHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxFromMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxToMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"fromTaxed","type":"bool"},{"internalType":"bool","name":"toTaxed","type":"bool"}],"name":"updateFeeMaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"updateMinoStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTaxRate","type":"uint256"}],"name":"updateTransferTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405261029a600c5561dead600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005a57600080fd5b506040516200387538038062003875833981810160405260208110156200008057600080fd5b81019080805190602001909291905050506040518060400160405280600481526020017f4d494e4f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d494e4f00000000000000000000000000000000000000000000000000000000815250600982600390805190602001906200011792919062000495565b5081600490805190602001906200013092919062000495565b5080600560006101000a81548160ff021916908360ff16021790555050505060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f62000185620003ef60201b60201c565b805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001208330604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050604051602081830303815290604052805190602001206007819055505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018062003847602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200054b565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156200048b5780601f106200045f576101008083540402835291602001916200048b565b820191906000526020600020905b8154815290600101906020018083116200046d57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620004cd576000855562000519565b82601f10620004e857805160ff191683800117855562000519565b8280016001018555821562000519579182015b8281111562000518578251825591602001919060010190620004fb565b5b5090506200052891906200052c565b5090565b5b80821115620005475760008160009055506001016200052d565b5090565b60805160601c6132d4620005736000398061154c52806125bd528061261252506132d46000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635bf43a9711610125578063a22b35ce116100ad578063d505accf1161007c578063d505accf14610a75578063d7b4be2414610b0e578063dd62ed3e14610b42578063f2fde38b14610bba578063fbfa77cf14610bfe57610211565b8063a22b35ce14610941578063a457c2d71461098f578063a9059cbb146109f3578063b65d08b014610a5757610211565b806379cc6790116100f457806379cc6790146107a05780637ecebe00146107ee5780638da5cb5b1461084657806392b9cb021461087a57806395d89b41146108be57610211565b80635bf43a97146106b05780636817031b146106e457806370a082311461073e578063715018a61461079657610211565b806329605e77116101a85780633950935111610177578063395093511461056e57806340c10f19146105d257806342966c6814610620578063570ca7351461064e57806358615c1b1461068257610211565b806329605e77146104cd57806330adf81f14610511578063313ce5671461052f5780633644e5151461055057610211565b8063177611ec116101e4578063177611ec146103b357806318160ddd1461040d5780631ad9339a1461042b57806323b872dd1461044957610211565b806306a95a801461021657806306fdde0314610270578063095ea7b3146102f35780630c86911d14610357575b600080fd5b6102586004803603602081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c32565b60405180821515815260200191505060405180910390f35b610278610c52565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102b857808201518184015260208101905061029d565b50505050905090810190601f1680156102e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033f6004803603604081101561030957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b6103b16004803603606081101561036d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050610d0b565b005b6103f5600480360360208110156103c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610edb565b60405180821515815260200191505060405180910390f35b610415610efb565b6040518082815260200191505060405180910390f35b610433610f05565b6040518082815260200191505060405180910390f35b6104b56004803603606081101561045f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f0b565b60405180821515815260200191505060405180910390f35b61050f600480360360208110156104e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fd6565b005b6105196111fc565b6040518082815260200191505060405180910390f35b610537611223565b604051808260ff16815260200191505060405180910390f35b61055861123a565b6040518082815260200191505060405180910390f35b6105ba6004803603604081101561058457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611240565b60405180821515815260200191505060405180910390f35b61061e600480360360408110156105e857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112e5565b005b61064c6004803603602081101561063657600080fd5b8101908080359060200190929190505050611399565b005b6106566113a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ae6004803603602081101561069857600080fd5b81019080803590602001909291905050506113cc565b005b6106b861154a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610726600480360360208110156106fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061156e565b60405180821515815260200191505060405180910390f35b6107806004803603602081101561075457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061167d565b6040518082815260200191505060405180910390f35b61079e6116c5565b005b6107ec600480360360408110156107b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611849565b005b6108306004803603602081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611857565b6040518082815260200191505060405180910390f35b61084e6118a7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108bc6004803603602081101561089057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118d1565b005b6108c6611be9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109065780820151818401526020810190506108eb565b50505050905090810190601f1680156109335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098d6004803603604081101561095757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c8b565b005b6109db600480360360408110156109a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cdf565b60405180821515815260200191505060405180910390f35b610a3f60048036036040811015610a0957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d9e565b60405180821515815260200191505060405180910390f35b610a5f611db5565b6040518082815260200191505060405180910390f35b610b0c600480360360e0811015610a8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611dbb565b005b610b166120e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ba460048036036040811015610b5857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612108565b6040518082815260200191505060405180910390f35b610bfc60048036036020811015610bd057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218f565b005b610c06612398565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600b6020528060005260406000206000915054906101000a900460ff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cea5780601f10610cbf57610100808354040283529160200191610cea565b820191906000526020600020905b815481529060010190602001808311610ccd57829003601f168201915b5050505050905090565b6000610d013384846123c2565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167faa0229b7a89a7cbbb65fa3bb420871ace27f9b9cdb4847f6f8a14c54f1a6d7e7838360405180831515815260200182151581526020019250505060405180910390a2505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6109c481565b6000610f188484846125b9565b610fcb8433610fc6856040518060600160405280602881526020016131a160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6123c2565b600190509392505050565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611099576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260038152602001807f212130000000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b6000600560009054906101000a900460ff16905090565b60075481565b60006112db33846112d685600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6123c2565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806131c96023913960400191505060405180910390fd5b6113958282612968565b5050565b6113a33382612b2d565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6109c4811115611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f2176616c6964000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600c819055507f0496ed1e61eb69727f9659a8e859288db4758ffb1f744d1c1424634f90a257f4600c546040518082815260200191505060405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611633576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118538282611c8b565b5050565b60006118a0600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf1565b9050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f216f70657261746f72000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156119ff575061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611a71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260038152602001807f212130000000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f21756e736574000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd6912e103d1553f15e77ffc98e99da32c9ce0d21d8be27cbb38437b1afe30928600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c815780601f10611c5657610100808354040283529160200191611c81565b820191906000526020600020905b815481529060010190602001808311611c6457829003601f168201915b5050505050905090565b6000611cc3826040518060600160405280602481526020016131ec60249139611cb48633612108565b6128209092919063ffffffff16565b9050611cd08333836123c2565b611cda8383612b2d565b505050565b6000611d943384611d8f8560405180606001604052806025815260200161327a60259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6123c2565b6001905092915050565b6000611dab3384846125b9565b6001905092915050565b600c5481565b83421115611e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5065726d69743a206578706972656420646561646c696e65000000000000000081525060200191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888611ea1600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf1565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019650505050505050604051602081830303815290604052805190602001209050600061190160075483604051602001808461ffff1660f01b81526002018381526020018281526020019350505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611fbb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561202f57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061315f6021913960400191505060405180910390fd5b6120cb600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cff565b6120d68a8a8a6123c2565b50505050505050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130f16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612448576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132566024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806131176022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061266057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b9050600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806127035750600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b158061275c5750600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806127645750805b8061277157506000600c54145b1561278657612781848484612d15565b61281a565b60006127106127a0600c5485612fd690919063ffffffff16565b816127a757fe5b04905060006127bf828561305c90919063ffffffff16565b90506127d482826128e090919063ffffffff16565b84146127dc57fe5b61280986600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612d15565b612814868683612d15565b80935050505b50505050565b60008383111582906128cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612892578082015181840152602081019050612877565b50505050905090810190601f1680156128bf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082840190508381101561295e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612a163083836130a6565b612a2b816002546128e090919063ffffffff16565b600281905550612a82816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806132106021913960400191505060405180910390fd5b612bbf826000836130a6565b612c2a816040518060600160405280602281526020016130cf602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c818160025461305c90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806132316025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806130ac6023913960400191505060405180910390fd5b612e2c8383836130a6565b612e9781604051806060016040528060268152602001613139602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128209092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f2a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128e090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415612fe95760009050613056565b6000828402905082848281612ffa57fe5b0414613051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131806021913960400191505060405180910390fd5b809150505b92915050565b600061309e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612820565b905092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655a65726f537761705065726d69743a20496e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655661756c744f776e65643a2063616c6c6572206973206e6f7420746865205661756c7445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203aa2ffc9539b780084b68c5f9df4093065f8d43487a7101e43201a560002c91b64736f6c634300070500336164644c697175696469747948656c70657220616464726573732063616e277420626520616464726573732830290000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953

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

0000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953

-----Decoded View---------------
Arg [0] : _addLiquidityHelper (address): 0x7a5a4ac0088e71b2585eedced53011d627e43953

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a5a4ac0088e71b2585eedced53011d627e43953


Deployed ByteCode Sourcemap

28064:4934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28208:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20358:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21168:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31827:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28159:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20611:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28296:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21343:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32765:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25050:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20528:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25167:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21680:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29522:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29643:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29115:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31430:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28713:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27736:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20711:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27250:151;;;:::i;:::-;;29745:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26464:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27047:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32203:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20441:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29868:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21902:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20838:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28420:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25686:770;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28628:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21009:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27407:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27864:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28208:40;;;;;;;;;;;;;;;;;;;;;;:::o;20358:77::-;20395:13;20424:5;20417:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20358:77;:::o;21168:167::-;21251:4;21268:37;21277:10;21289:7;21298:6;21268:8;:37::i;:::-;21323:4;21316:11;;21168:167;;;;:::o;31827:252::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31958:9:::1;31934:10;:21;31945:9;31934:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;32000:7;31978:8;:19;31987:9;31978:19;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32040:9;32025:46;;;32051:9;32062:7;32025:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;31827:252:::0;;;:::o;28159:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;20611:94::-;20664:7;20687:12;;20680:19;;20611:94;:::o;28296:56::-;28348:4;28296:56;:::o;21343:329::-;21449:4;21466:36;21476:6;21484:9;21495:6;21466:9;:36::i;:::-;21513:129;21522:6;21530:10;21542:99;21590:6;21542:99;;;;;;;;;;;;;;;;;:11;:19;21554:6;21542:19;;;;;;;;;;;;;;;:31;21562:10;21542:31;;;;;;;;;;;;;;;;:47;;:99;;;;;:::i;:::-;21513:8;:129::i;:::-;21660:4;21653:11;;21343:329;;;;;:::o;32765:230::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32879:1:::1;32856:25;;:11;:25;;;;32847:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32939:11;32908:44;;32929:8;;;;;;;;;;;32908:44;;;;;;;;;;;;32976:11;32965:8;;:22;;;;;;;;;;;;;;;;;;32765:230:::0;:::o;25050:108::-;25092:66;25050:108;;;:::o;20528:77::-;20569:5;20590:9;;;;;;;;;;;20583:16;;20528:77;:::o;25167:31::-;;;;:::o;21680:214::-;21768:4;21785:79;21794:10;21806:7;21815:48;21852:10;21815:11;:23;21827:10;21815:23;;;;;;;;;;;;;;;:32;21839:7;21815:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;21785:8;:79::i;:::-;21882:4;21875:11;;21680:214;;;;:::o;29522:113::-;27990:10;27980:20;;:6;;;;;;;;;;;:20;;;27971:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29603:24:::1;29609:8;29619:7;29603:5;:24::i;:::-;29522:113:::0;;:::o;29643:89::-;29699:25;29705:10;29717:6;29699:5;:25::i;:::-;29643:89;:::o;29115:23::-;;;;;;;;;;;;;:::o;31430:280::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28348:4:::1;31531:16;:46;;31522:80;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31631:16;31613:15;:34;;;;31665:37;31685:15;;31665:37;;;;;;;;;;;;;;;;;;31430:280:::0;:::o;28713:43::-;;;:::o;27736:122::-;27803:4;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27826:6:::1;27817;;:15;;;;;;;;;;;;;;;;;;27848:4;27841:11;;27736:122:::0;;;:::o;20711:121::-;20785:7;20808:9;:18;20818:7;20808:18;;;;;;;;;;;;;;;;20801:25;;20711:121;;;:::o;27250:151::-;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27365:1:::1;27327:42;;27349:6;;;;;;;;;;;27327:42;;;;;;;;;;;;27393:1;27376:6;;:19;;;;;;;;;;;;;;;;;;27250:151::o:0;29745:115::-;29824:28;29834:8;29844:7;29824:9;:28::i;:::-;29745:115;;:::o;26464:120::-;26525:7;26552:24;:7;:14;26560:5;26552:14;;;;;;;;;;;;;;;:22;:24::i;:::-;26545:31;;26464:120;;;:::o;27047:82::-;27094:7;27117:6;;;;;;;;;;;27110:13;;27047:82;:::o;32203:402::-;29202:10;29190:22;;:8;;;;;;;;;;;:22;;;29182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32333:1:::1;32306:29;;:15;:29;;;;:94;;;;;32358:42;32339:61;;:15;:61;;;;32306:94;32297:111;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32446:42;32428:60;;:14;;;;;;;;;;;:60;;;32419:80;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32529:15;32512:14;;:32;;;;;;;;;;;;;;;;;;32562:35;32581:14;;;;;;;;;;;32562:35;;;;;;;;;;;;;;;;;;;;32203:402:::0;:::o;20441:81::-;20480:13;20509:7;20502:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20441:81;:::o;29868:363::-;29948:27;29991:133;30045:7;29991:133;;;;;;;;;;;;;;;;;:31;30001:8;30011:10;29991:9;:31::i;:::-;:35;;:133;;;;;:::i;:::-;29948:176;;30137:51;30146:8;30156:10;30168:19;30137:8;:51::i;:::-;30199:24;30205:8;30215:7;30199:5;:24::i;:::-;29868:363;;;:::o;21902:277::-;21995:4;22012:137;22021:10;22033:7;22042:106;22091:15;22042:106;;;;;;;;;;;;;;;;;:11;:23;22054:10;22042:23;;;;;;;;;;;;;;;:32;22066:7;22042:32;;;;;;;;;;;;;;;;:48;;:106;;;;;:::i;:::-;22012:8;:137::i;:::-;22167:4;22160:11;;21902:277;;;;:::o;20838:163::-;20924:4;20937:40;20947:10;20959:9;20970:6;20937:9;:40::i;:::-;20991:4;20984:11;;20838:163;;;;:::o;28420:36::-;;;;:::o;25686:770::-;25931:8;25912:15;:27;;25904:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25981:18;25092:66;26036:15;;26053:5;26060:7;26069:6;26077:24;:7;:14;26085:5;26077:14;;;;;;;;;;;;;;;:22;:24::i;:::-;26103:8;26025:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26015:98;;;;;;25981:132;;26126:13;26176:6;26185:16;;26203:10;26152:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26142:73;;;;;;26126:89;;26228:14;26245:25;26255:5;26262:1;26265;26268;26245:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26228:42;;26307:1;26289:20;;:6;:20;;;;:39;;;;;26323:5;26313:15;;:6;:15;;;26289:39;26281:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26379:26;:7;:14;26387:5;26379:14;;;;;;;;;;;;;;;:24;:26::i;:::-;26416:32;26425:5;26432:7;26441:6;26416:8;:32::i;:::-;25686:770;;;;;;;;;;:::o;28628:74::-;;;;;;;;;;;;;:::o;21009:151::-;21098:7;21125:11;:18;21137:5;21125:18;;;;;;;;;;;;;;;:27;21144:7;21125:27;;;;;;;;;;;;;;;;21118:34;;21009:151;;;;:::o;27407:250::-;27182:10;27172:20;;:6;;;;;;;;;;;:20;;;27163:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27528:1:::1;27507:23;;:9;:23;;;;27498:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27615:9;27585:41;;27607:6;;;;;;;;;;;27585:41;;;;;;;;;;;;27642:9;27633:6;;:18;;;;;;;;;;;;;;;;;;27407:250:::0;:::o;27864:73::-;27902:7;27925:6;;;;;;;;;;;27918:13;;27864:73;:::o;23551:346::-;23670:1;23653:19;;:5;:19;;;;23645:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23751:1;23732:21;;:7;:21;;;;23724:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23835:6;23805:11;:18;23817:5;23805:18;;;;;;;;;;;;;;;:27;23824:7;23805:27;;;;;;;;;;;;;;;:36;;;;23873:7;23857:32;;23866:5;23857:32;;;23882:6;23857:32;;;;;;;;;;;;;;;;;;23551:346;;;:::o;30312:997::-;30421:29;30464:18;30454:28;;:6;:28;;;:63;;;;30499:18;30486:31;;:9;:31;;;30454:63;30421:97;;30539:10;:20;30551:6;30539:20;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;30563:8;:21;30573:9;30563:21;;;;;;;;;;;;;;;;;;;;;;;;;30539:45;30536:50;:94;;;;30616:14;;;;;;;;;;;30603:27;;:9;:27;;;30536:94;:135;;;;30647:24;30536:135;:172;;;;30707:1;30688:15;;:20;30536:172;30531:771;;;30739:44;30756:6;30764:9;30775:6;30739:15;:44::i;:::-;30531:771;;;30877:17;30933:5;30899:29;30911:15;;30899:6;:10;;:29;;;;:::i;:::-;30897:41;;;;;;30877:61;;31016:18;31037:23;31049:9;31037:6;:10;;:23;;;;:::i;:::-;31016:44;;31095:27;31111:9;31095:10;:14;;:27;;;;:::i;:::-;31085:6;:37;31077:47;;;;31141:52;31158:6;31166:14;;;;;;;;;;;31182:9;31141:15;:52::i;:::-;31208:48;31225:6;31233:9;31244:10;31208:15;:48::i;:::-;31280:10;31271:19;;30531:771;;;30312:997;;;;:::o;16968:192::-;17054:7;17087:1;17082;:6;;17090:12;17074:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17114:9;17130:1;17126;:5;17114:17;;17151:1;17144:8;;;16968:192;;;;;:::o;16635:181::-;16693:7;16713:9;16729:1;16725;:5;16713:17;;16754:1;16749;:6;;16741:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16807:1;16800:8;;;16635:181;;;;:::o;22722:395::-;22828:1;22808:22;;:8;:22;;;;22800:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22877:56;22907:4;22915:8;22925:7;22877:20;:56::i;:::-;22959:25;22976:7;22959:12;;:16;;:25;;;;:::i;:::-;22944:12;:40;;;;23017:32;23041:7;23017:9;:19;23027:8;23017:19;;;;;;;;;;;;;;;;:23;;:32;;;;:::i;:::-;22995:9;:19;23005:8;22995:19;;;;;;;;;;;;;;;:54;;;;23091:8;23065:44;;23083:4;23065:44;;;23101:7;23065:44;;;;;;;;;;;;;;;;;;22722:395;;:::o;23125:418::-;23228:1;23209:21;;:7;:21;;;;23201:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23281:49;23302:7;23319:1;23323:6;23281:20;:49::i;:::-;23364:68;23387:6;23364:68;;;;;;;;;;;;;;;;;:9;:18;23374:7;23364:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;23343:9;:18;23353:7;23343:18;;;;;;;;;;;;;;;:89;;;;23458:24;23475:6;23458:12;;:16;;:24;;;;:::i;:::-;23443:12;:39;;;;23524:1;23498:37;;23507:7;23498:37;;;23528:6;23498:37;;;;;;;;;;;;;;;;;;23125:418;;:::o;24136:114::-;24201:7;24228;:14;;;24221:21;;24136:114;;;:::o;24258:91::-;24340:1;24322:7;:14;;;:19;;;;;;;;;;;24258:91;:::o;22187:527::-;22309:1;22291:20;;:6;:20;;;;22283:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22391:1;22370:23;;:9;:23;;;;22362:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22444:47;22465:6;22473:9;22484:6;22444:20;:47::i;:::-;22522:71;22544:6;22522:71;;;;;;;;;;;;;;;;;:9;:17;22532:6;22522:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22502:9;:17;22512:6;22502:17;;;;;;;;;;;;;;;:91;;;;22625:32;22650:6;22625:9;:20;22635:9;22625:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22602:9;:20;22612:9;22602:20;;;;;;;;;;;;;;;:55;;;;22688:9;22671:35;;22680:6;22671:35;;;22699:6;22671:35;;;;;;;;;;;;;;;;;;22187:527;;;:::o;17168:252::-;17226:7;17257:1;17252;:6;17248:47;;;17282:1;17275:8;;;;17248:47;17307:9;17323:1;17319;:5;17307:17;;17352:1;17347;17343;:5;;;;;;:10;17335:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17411:1;17404:8;;;17168:252;;;;;:::o;16824:136::-;16882:7;16909:43;16913:1;16916;16909:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;16902:50;;16824:136;;;;:::o;23903:97::-;;;;:::o

Swarm Source

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