Address Details
contract

0x6200F54D73491d56b8d7A975C9ee18EFb4D518Df

Contract Name
AddressLinkedList
Creator
0x56fd3f–9b8d81 at 0x83907a–dca7db
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
21371662
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
AddressLinkedList




Optimization enabled
true
Compiler version
v0.5.17+commit.d19bba13




Optimization runs
10000
Verified at
2023-05-19T18:23:55.291084Z

lib/mento-core/contracts/common/linkedlists/AddressLinkedList.sol

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.5.13;

import "openzeppelin-solidity/contracts/math/SafeMath.sol";

import "./LinkedList.sol";

/**
 * @title Maintains a doubly linked list keyed by address.
 * @dev Following the `next` pointers will lead you to the head, rather than the tail.
 */
library AddressLinkedList {
  using LinkedList for LinkedList.List;
  using SafeMath for uint256;

  function toBytes(address a) public pure returns (bytes32) {
    return bytes32(uint256(a) << 96);
  }

  function toAddress(bytes32 b) public pure returns (address) {
    return address(uint256(b) >> 96);
  }

  /**
   * @notice Inserts an element into a doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to insert.
   * @param previousKey The key of the element that comes before the element to insert.
   * @param nextKey The key of the element that comes after the element to insert.
   */
  function insert(
    LinkedList.List storage list,
    address key,
    address previousKey,
    address nextKey
  ) public {
    list.insert(toBytes(key), toBytes(previousKey), toBytes(nextKey));
  }

  /**
   * @notice Inserts an element at the end of the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to insert.
   */
  function push(LinkedList.List storage list, address key) public {
    list.insert(toBytes(key), bytes32(0), list.tail);
  }

  /**
   * @notice Removes an element from the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to remove.
   */
  function remove(LinkedList.List storage list, address key) public {
    list.remove(toBytes(key));
  }

  /**
   * @notice Updates an element in the list.
   * @param list A storage pointer to the underlying list.
   * @param key The element key.
   * @param previousKey The key of the element that comes before the updated element.
   * @param nextKey The key of the element that comes after the updated element.
   */
  function update(
    LinkedList.List storage list,
    address key,
    address previousKey,
    address nextKey
  ) public {
    list.update(toBytes(key), toBytes(previousKey), toBytes(nextKey));
  }

  /**
   * @notice Returns whether or not a particular key is present in the sorted list.
   * @param list A storage pointer to the underlying list.
   * @param key The element key.
   * @return Whether or not the key is in the sorted list.
   */
  function contains(LinkedList.List storage list, address key) public view returns (bool) {
    return list.elements[toBytes(key)].exists;
  }

  /**
   * @notice Returns the N greatest elements of the list.
   * @param list A storage pointer to the underlying list.
   * @param n The number of elements to return.
   * @return The keys of the greatest elements.
   * @dev Reverts if n is greater than the number of elements in the list.
   */
  function headN(LinkedList.List storage list, uint256 n) public view returns (address[] memory) {
    bytes32[] memory byteKeys = list.headN(n);
    address[] memory keys = new address[](n);
    for (uint256 i = 0; i < n; i = i.add(1)) {
      keys[i] = toAddress(byteKeys[i]);
    }
    return keys;
  }

  /**
   * @notice Gets all element keys from the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @return All element keys from head to tail.
   */
  function getKeys(LinkedList.List storage list) public view returns (address[] memory) {
    return headN(list, list.numElements);
  }
}
        

/lib/mento-core/contracts/common/linkedlists/LinkedList.sol

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.5.13;

import "openzeppelin-solidity/contracts/math/SafeMath.sol";

/**
 * @title Maintains a doubly linked list keyed by bytes32.
 * @dev Following the `next` pointers will lead you to the head, rather than the tail.
 */
library LinkedList {
  using SafeMath for uint256;

  struct Element {
    bytes32 previousKey;
    bytes32 nextKey;
    bool exists;
  }

  struct List {
    bytes32 head;
    bytes32 tail;
    uint256 numElements;
    mapping(bytes32 => Element) elements;
  }

  /**
   * @notice Inserts an element into a doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to insert.
   * @param previousKey The key of the element that comes before the element to insert.
   * @param nextKey The key of the element that comes after the element to insert.
   */
  function insert(
    List storage list,
    bytes32 key,
    bytes32 previousKey,
    bytes32 nextKey
  ) internal {
    require(key != bytes32(0), "Key must be defined");
    require(!contains(list, key), "Can't insert an existing element");
    require(previousKey != key && nextKey != key, "Key cannot be the same as previousKey or nextKey");

    Element storage element = list.elements[key];
    element.exists = true;

    if (list.numElements == 0) {
      list.tail = key;
      list.head = key;
    } else {
      require(previousKey != bytes32(0) || nextKey != bytes32(0), "Either previousKey or nextKey must be defined");

      element.previousKey = previousKey;
      element.nextKey = nextKey;

      if (previousKey != bytes32(0)) {
        require(contains(list, previousKey), "If previousKey is defined, it must exist in the list");
        Element storage previousElement = list.elements[previousKey];
        require(previousElement.nextKey == nextKey, "previousKey must be adjacent to nextKey");
        previousElement.nextKey = key;
      } else {
        list.tail = key;
      }

      if (nextKey != bytes32(0)) {
        require(contains(list, nextKey), "If nextKey is defined, it must exist in the list");
        Element storage nextElement = list.elements[nextKey];
        require(nextElement.previousKey == previousKey, "previousKey must be adjacent to nextKey");
        nextElement.previousKey = key;
      } else {
        list.head = key;
      }
    }

    list.numElements = list.numElements.add(1);
  }

  /**
   * @notice Inserts an element at the tail of the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to insert.
   */
  function push(List storage list, bytes32 key) internal {
    insert(list, key, bytes32(0), list.tail);
  }

  /**
   * @notice Removes an element from the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @param key The key of the element to remove.
   */
  function remove(List storage list, bytes32 key) internal {
    Element storage element = list.elements[key];
    require(key != bytes32(0) && contains(list, key), "key not in list");
    if (element.previousKey != bytes32(0)) {
      Element storage previousElement = list.elements[element.previousKey];
      previousElement.nextKey = element.nextKey;
    } else {
      list.tail = element.nextKey;
    }

    if (element.nextKey != bytes32(0)) {
      Element storage nextElement = list.elements[element.nextKey];
      nextElement.previousKey = element.previousKey;
    } else {
      list.head = element.previousKey;
    }

    delete list.elements[key];
    list.numElements = list.numElements.sub(1);
  }

  /**
   * @notice Updates an element in the list.
   * @param list A storage pointer to the underlying list.
   * @param key The element key.
   * @param previousKey The key of the element that comes before the updated element.
   * @param nextKey The key of the element that comes after the updated element.
   */
  function update(
    List storage list,
    bytes32 key,
    bytes32 previousKey,
    bytes32 nextKey
  ) internal {
    require(key != bytes32(0) && key != previousKey && key != nextKey && contains(list, key), "key on in list");
    remove(list, key);
    insert(list, key, previousKey, nextKey);
  }

  /**
   * @notice Returns whether or not a particular key is present in the sorted list.
   * @param list A storage pointer to the underlying list.
   * @param key The element key.
   * @return Whether or not the key is in the sorted list.
   */
  function contains(List storage list, bytes32 key) internal view returns (bool) {
    return list.elements[key].exists;
  }

  /**
   * @notice Returns the keys of the N elements at the head of the list.
   * @param list A storage pointer to the underlying list.
   * @param n The number of elements to return.
   * @return The keys of the N elements at the head of the list.
   * @dev Reverts if n is greater than the number of elements in the list.
   */
  function headN(List storage list, uint256 n) internal view returns (bytes32[] memory) {
    require(n <= list.numElements, "not enough elements");
    bytes32[] memory keys = new bytes32[](n);
    bytes32 key = list.head;
    for (uint256 i = 0; i < n; i = i.add(1)) {
      keys[i] = key;
      key = list.elements[key].previousKey;
    }
    return keys;
  }

  /**
   * @notice Gets all element keys from the doubly linked list.
   * @param list A storage pointer to the underlying list.
   * @return All element keys from head to tail.
   */
  function getKeys(List storage list) internal view returns (bytes32[] memory) {
    return headN(list, list.numElements);
  }
}
          

/lib/mento-core/lib/openzeppelin-contracts/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    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;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
          

Contract ABI

[{"type":"function","stateMutability":"pure","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"toAddress","inputs":[{"type":"bytes32","name":"b","internalType":"bytes32"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"toBytes","inputs":[{"type":"address","name":"a","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x610d64610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100ad5760003560e01c8063593b79fe11610080578063b2f8fe9611610065578063b2f8fe961461029d578063e2c0c56a146102f5578063fe3c7a8e1461033b576100ad565b8063593b79fe146101e5578063b1cfea431461022a576100ad565b806307debf7c146100b257806326afac491461010c578063341f662314610152578063542424fb14610198575b600080fd5b8180156100be57600080fd5b5061010a600480360360808110156100d557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013582169160609091013516610358565b005b81801561011857600080fd5b5061010a6004803603604081101561012f57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661038b565b61016f6004803603602081101561016857600080fd5b50356103b1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101d1600480360360408110156101ae57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166103b7565b604080519115158252519081900360200190f35b610218600480360360208110156101fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103e6565b60408051918252519081900360200190f35b61024d6004803603604081101561024057600080fd5b508035906020013561040e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610289578181015183820152602001610271565b505050509050019250505060405180910390f35b8180156102a957600080fd5b5061010a600480360360808110156102c057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135821691606090910135166104cb565b81801561030157600080fd5b5061010a6004803603604081101561031857600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166104f8565b61024d6004803603602081101561035157600080fd5b5035610511565b610385610364846103e6565b61036d846103e6565b610376846103e6565b8792919063ffffffff61052716565b50505050565b6103ad610397826103e6565b600184015484919060009063ffffffff61052716565b5050565b60601c90565b60008260030160006103c8846103e6565b815260208101919091526040016000206002015460ff169392505050565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b606080610421848463ffffffff61084116565b905060608360405190808252806020026020018201604052801561044f578160200160208202803883390190505b50905060005b848110156104c25761047983828151811061046c57fe5b60200260200101516103b1565b82828151811061048557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104bb81600163ffffffff61092916565b9050610455565b50949350505050565b6103856104d7846103e6565b6104e0846103e6565b6104e9846103e6565b8792919063ffffffff61098a16565b6103ad610504826103e6565b839063ffffffff610a1d16565b606061052182836002015461040e565b92915050565b82610579576040805162461bcd60e51b815260206004820152601360248201527f4b6579206d75737420626520646566696e656400000000000000000000000000604482015290519081900360640190fd5b6105838484610b57565b156105d5576040805162461bcd60e51b815260206004820181905260248201527f43616e277420696e7365727420616e206578697374696e6720656c656d656e74604482015290519081900360640190fd5b8282141580156105e55750828114155b6106205760405162461bcd60e51b8152600401808060200182810382526030815260200180610c486030913960400191505060405180910390fd5b60008381526003850160205260409020600280820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055850154610674576001850184905583855561081c565b8215158061068157508115155b6106bc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610d03602d913960400191505060405180910390fd5b82815560018101829055821561076e576106d68584610b57565b6107115760405162461bcd60e51b8152600401808060200182810382526034815260200180610c9f6034913960400191505060405180910390fd5b60008381526003860160205260409020600181015483146107635760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b600101849055610776565b600185018490555b8115610818576107868583610b57565b6107c15760405162461bcd60e51b8152600401808060200182810382526030815260200180610cd36030913960400191505060405180910390fd5b60008281526003860160205260409020805484146108105760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b84905561081c565b8385555b600285015461083290600163ffffffff61092916565b85600201819055505050505050565b6060826002015482111561089c576040805162461bcd60e51b815260206004820152601360248201527f6e6f7420656e6f75676820656c656d656e747300000000000000000000000000604482015290519081900360640190fd5b6060826040519080825280602002602001820160405280156108c8578160200160208202803883390190505b50845490915060005b8481101561091f57818382815181106108e657fe5b60209081029190910181019190915260009283526003870190526040909120549061091881600163ffffffff61092916565b90506108d1565b5090949350505050565b600082820183811015610983576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b82158015906109995750818314155b80156109a55750808314155b80156109b657506109b68484610b57565b610a07576040805162461bcd60e51b815260206004820152600e60248201527f6b6579206f6e20696e206c697374000000000000000000000000000000000000604482015290519081900360640190fd5b610a118484610a1d565b61038584848484610527565b600081815260038301602052604090208115801590610a415750610a418383610b57565b610a92576040805162461bcd60e51b815260206004820152600f60248201527f6b6579206e6f7420696e206c6973740000000000000000000000000000000000604482015290519081900360640190fd5b805415610ab957805460009081526003840160205260409020600180830154910155610ac4565b600180820154908401555b600181015415610aec5760018101546000908152600384016020526040902081549055610af1565b805483555b60008281526003840160205260408120818155600180820192909255600290810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055840154610b4a9163ffffffff610b7316565b8360020181905550505050565b6000908152600391909101602052604090206002015460ff1690565b600061098383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115610c3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c04578181015183820152602001610bec565b50505050905090810190601f168015610c315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4b65792063616e6e6f74206265207468652073616d652061732070726576696f75734b6579206f72206e6578744b657970726576696f75734b6579206d7573742062652061646a6163656e7420746f206e6578744b657949662070726576696f75734b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744966206e6578744b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744569746865722070726576696f75734b6579206f72206e6578744b6579206d75737420626520646566696e6564a265627a7a723158203c48e487e19884f42a685d91c8d2e29f9dc4c7f9752f583e426a2e2ccd702c9264736f6c63430005110032

Deployed ByteCode

0x736200f54d73491d56b8d7a975c9ee18efb4d518df30146080604052600436106100ad5760003560e01c8063593b79fe11610080578063b2f8fe9611610065578063b2f8fe961461029d578063e2c0c56a146102f5578063fe3c7a8e1461033b576100ad565b8063593b79fe146101e5578063b1cfea431461022a576100ad565b806307debf7c146100b257806326afac491461010c578063341f662314610152578063542424fb14610198575b600080fd5b8180156100be57600080fd5b5061010a600480360360808110156100d557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013582169160609091013516610358565b005b81801561011857600080fd5b5061010a6004803603604081101561012f57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661038b565b61016f6004803603602081101561016857600080fd5b50356103b1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101d1600480360360408110156101ae57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166103b7565b604080519115158252519081900360200190f35b610218600480360360208110156101fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103e6565b60408051918252519081900360200190f35b61024d6004803603604081101561024057600080fd5b508035906020013561040e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610289578181015183820152602001610271565b505050509050019250505060405180910390f35b8180156102a957600080fd5b5061010a600480360360808110156102c057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135821691606090910135166104cb565b81801561030157600080fd5b5061010a6004803603604081101561031857600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166104f8565b61024d6004803603602081101561035157600080fd5b5035610511565b610385610364846103e6565b61036d846103e6565b610376846103e6565b8792919063ffffffff61052716565b50505050565b6103ad610397826103e6565b600184015484919060009063ffffffff61052716565b5050565b60601c90565b60008260030160006103c8846103e6565b815260208101919091526040016000206002015460ff169392505050565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b606080610421848463ffffffff61084116565b905060608360405190808252806020026020018201604052801561044f578160200160208202803883390190505b50905060005b848110156104c25761047983828151811061046c57fe5b60200260200101516103b1565b82828151811061048557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104bb81600163ffffffff61092916565b9050610455565b50949350505050565b6103856104d7846103e6565b6104e0846103e6565b6104e9846103e6565b8792919063ffffffff61098a16565b6103ad610504826103e6565b839063ffffffff610a1d16565b606061052182836002015461040e565b92915050565b82610579576040805162461bcd60e51b815260206004820152601360248201527f4b6579206d75737420626520646566696e656400000000000000000000000000604482015290519081900360640190fd5b6105838484610b57565b156105d5576040805162461bcd60e51b815260206004820181905260248201527f43616e277420696e7365727420616e206578697374696e6720656c656d656e74604482015290519081900360640190fd5b8282141580156105e55750828114155b6106205760405162461bcd60e51b8152600401808060200182810382526030815260200180610c486030913960400191505060405180910390fd5b60008381526003850160205260409020600280820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055850154610674576001850184905583855561081c565b8215158061068157508115155b6106bc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610d03602d913960400191505060405180910390fd5b82815560018101829055821561076e576106d68584610b57565b6107115760405162461bcd60e51b8152600401808060200182810382526034815260200180610c9f6034913960400191505060405180910390fd5b60008381526003860160205260409020600181015483146107635760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b600101849055610776565b600185018490555b8115610818576107868583610b57565b6107c15760405162461bcd60e51b8152600401808060200182810382526030815260200180610cd36030913960400191505060405180910390fd5b60008281526003860160205260409020805484146108105760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b84905561081c565b8385555b600285015461083290600163ffffffff61092916565b85600201819055505050505050565b6060826002015482111561089c576040805162461bcd60e51b815260206004820152601360248201527f6e6f7420656e6f75676820656c656d656e747300000000000000000000000000604482015290519081900360640190fd5b6060826040519080825280602002602001820160405280156108c8578160200160208202803883390190505b50845490915060005b8481101561091f57818382815181106108e657fe5b60209081029190910181019190915260009283526003870190526040909120549061091881600163ffffffff61092916565b90506108d1565b5090949350505050565b600082820183811015610983576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b82158015906109995750818314155b80156109a55750808314155b80156109b657506109b68484610b57565b610a07576040805162461bcd60e51b815260206004820152600e60248201527f6b6579206f6e20696e206c697374000000000000000000000000000000000000604482015290519081900360640190fd5b610a118484610a1d565b61038584848484610527565b600081815260038301602052604090208115801590610a415750610a418383610b57565b610a92576040805162461bcd60e51b815260206004820152600f60248201527f6b6579206e6f7420696e206c6973740000000000000000000000000000000000604482015290519081900360640190fd5b805415610ab957805460009081526003840160205260409020600180830154910155610ac4565b600180820154908401555b600181015415610aec5760018101546000908152600384016020526040902081549055610af1565b805483555b60008281526003840160205260408120818155600180820192909255600290810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055840154610b4a9163ffffffff610b7316565b8360020181905550505050565b6000908152600391909101602052604090206002015460ff1690565b600061098383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115610c3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c04578181015183820152602001610bec565b50505050905090810190601f168015610c315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4b65792063616e6e6f74206265207468652073616d652061732070726576696f75734b6579206f72206e6578744b657970726576696f75734b6579206d7573742062652061646a6163656e7420746f206e6578744b657949662070726576696f75734b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744966206e6578744b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744569746865722070726576696f75734b6579206f72206e6578744b6579206d75737420626520646566696e6564a265627a7a723158203c48e487e19884f42a685d91c8d2e29f9dc4c7f9752f583e426a2e2ccd702c9264736f6c63430005110032

External libraries

AddressLinkedList : 0x6200f54d73491d56b8d7a975c9ee18efb4d518df  
AddressSortedLinkedListWithMedian : 0xed477a99035d0c1e11369f1d7a4e587893cc002b