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
- 27367880
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
0x610d64610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100ad5760003560e01c8063593b79fe11610080578063b2f8fe9611610065578063b2f8fe961461029d578063e2c0c56a146102f5578063fe3c7a8e1461033b576100ad565b8063593b79fe146101e5578063b1cfea431461022a576100ad565b806307debf7c146100b257806326afac491461010c578063341f662314610152578063542424fb14610198575b600080fd5b8180156100be57600080fd5b5061010a600480360360808110156100d557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013582169160609091013516610358565b005b81801561011857600080fd5b5061010a6004803603604081101561012f57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661038b565b61016f6004803603602081101561016857600080fd5b50356103b1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101d1600480360360408110156101ae57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166103b7565b604080519115158252519081900360200190f35b610218600480360360208110156101fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103e6565b60408051918252519081900360200190f35b61024d6004803603604081101561024057600080fd5b508035906020013561040e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610289578181015183820152602001610271565b505050509050019250505060405180910390f35b8180156102a957600080fd5b5061010a600480360360808110156102c057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135821691606090910135166104cb565b81801561030157600080fd5b5061010a6004803603604081101561031857600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166104f8565b61024d6004803603602081101561035157600080fd5b5035610511565b610385610364846103e6565b61036d846103e6565b610376846103e6565b8792919063ffffffff61052716565b50505050565b6103ad610397826103e6565b600184015484919060009063ffffffff61052716565b5050565b60601c90565b60008260030160006103c8846103e6565b815260208101919091526040016000206002015460ff169392505050565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b606080610421848463ffffffff61084116565b905060608360405190808252806020026020018201604052801561044f578160200160208202803883390190505b50905060005b848110156104c25761047983828151811061046c57fe5b60200260200101516103b1565b82828151811061048557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104bb81600163ffffffff61092916565b9050610455565b50949350505050565b6103856104d7846103e6565b6104e0846103e6565b6104e9846103e6565b8792919063ffffffff61098a16565b6103ad610504826103e6565b839063ffffffff610a1d16565b606061052182836002015461040e565b92915050565b82610579576040805162461bcd60e51b815260206004820152601360248201527f4b6579206d75737420626520646566696e656400000000000000000000000000604482015290519081900360640190fd5b6105838484610b57565b156105d5576040805162461bcd60e51b815260206004820181905260248201527f43616e277420696e7365727420616e206578697374696e6720656c656d656e74604482015290519081900360640190fd5b8282141580156105e55750828114155b6106205760405162461bcd60e51b8152600401808060200182810382526030815260200180610c486030913960400191505060405180910390fd5b60008381526003850160205260409020600280820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055850154610674576001850184905583855561081c565b8215158061068157508115155b6106bc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610d03602d913960400191505060405180910390fd5b82815560018101829055821561076e576106d68584610b57565b6107115760405162461bcd60e51b8152600401808060200182810382526034815260200180610c9f6034913960400191505060405180910390fd5b60008381526003860160205260409020600181015483146107635760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b600101849055610776565b600185018490555b8115610818576107868583610b57565b6107c15760405162461bcd60e51b8152600401808060200182810382526030815260200180610cd36030913960400191505060405180910390fd5b60008281526003860160205260409020805484146108105760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b84905561081c565b8385555b600285015461083290600163ffffffff61092916565b85600201819055505050505050565b6060826002015482111561089c576040805162461bcd60e51b815260206004820152601360248201527f6e6f7420656e6f75676820656c656d656e747300000000000000000000000000604482015290519081900360640190fd5b6060826040519080825280602002602001820160405280156108c8578160200160208202803883390190505b50845490915060005b8481101561091f57818382815181106108e657fe5b60209081029190910181019190915260009283526003870190526040909120549061091881600163ffffffff61092916565b90506108d1565b5090949350505050565b600082820183811015610983576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b82158015906109995750818314155b80156109a55750808314155b80156109b657506109b68484610b57565b610a07576040805162461bcd60e51b815260206004820152600e60248201527f6b6579206f6e20696e206c697374000000000000000000000000000000000000604482015290519081900360640190fd5b610a118484610a1d565b61038584848484610527565b600081815260038301602052604090208115801590610a415750610a418383610b57565b610a92576040805162461bcd60e51b815260206004820152600f60248201527f6b6579206e6f7420696e206c6973740000000000000000000000000000000000604482015290519081900360640190fd5b805415610ab957805460009081526003840160205260409020600180830154910155610ac4565b600180820154908401555b600181015415610aec5760018101546000908152600384016020526040902081549055610af1565b805483555b60008281526003840160205260408120818155600180820192909255600290810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055840154610b4a9163ffffffff610b7316565b8360020181905550505050565b6000908152600391909101602052604090206002015460ff1690565b600061098383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115610c3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c04578181015183820152602001610bec565b50505050905090810190601f168015610c315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4b65792063616e6e6f74206265207468652073616d652061732070726576696f75734b6579206f72206e6578744b657970726576696f75734b6579206d7573742062652061646a6163656e7420746f206e6578744b657949662070726576696f75734b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744966206e6578744b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744569746865722070726576696f75734b6579206f72206e6578744b6579206d75737420626520646566696e6564a265627a7a723158203c48e487e19884f42a685d91c8d2e29f9dc4c7f9752f583e426a2e2ccd702c9264736f6c63430005110032
Deployed ByteCode
0x736200f54d73491d56b8d7a975c9ee18efb4d518df30146080604052600436106100ad5760003560e01c8063593b79fe11610080578063b2f8fe9611610065578063b2f8fe961461029d578063e2c0c56a146102f5578063fe3c7a8e1461033b576100ad565b8063593b79fe146101e5578063b1cfea431461022a576100ad565b806307debf7c146100b257806326afac491461010c578063341f662314610152578063542424fb14610198575b600080fd5b8180156100be57600080fd5b5061010a600480360360808110156100d557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013582169160609091013516610358565b005b81801561011857600080fd5b5061010a6004803603604081101561012f57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661038b565b61016f6004803603602081101561016857600080fd5b50356103b1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101d1600480360360408110156101ae57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166103b7565b604080519115158252519081900360200190f35b610218600480360360208110156101fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103e6565b60408051918252519081900360200190f35b61024d6004803603604081101561024057600080fd5b508035906020013561040e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610289578181015183820152602001610271565b505050509050019250505060405180910390f35b8180156102a957600080fd5b5061010a600480360360808110156102c057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135821691606090910135166104cb565b81801561030157600080fd5b5061010a6004803603604081101561031857600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166104f8565b61024d6004803603602081101561035157600080fd5b5035610511565b610385610364846103e6565b61036d846103e6565b610376846103e6565b8792919063ffffffff61052716565b50505050565b6103ad610397826103e6565b600184015484919060009063ffffffff61052716565b5050565b60601c90565b60008260030160006103c8846103e6565b815260208101919091526040016000206002015460ff169392505050565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b606080610421848463ffffffff61084116565b905060608360405190808252806020026020018201604052801561044f578160200160208202803883390190505b50905060005b848110156104c25761047983828151811061046c57fe5b60200260200101516103b1565b82828151811061048557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526104bb81600163ffffffff61092916565b9050610455565b50949350505050565b6103856104d7846103e6565b6104e0846103e6565b6104e9846103e6565b8792919063ffffffff61098a16565b6103ad610504826103e6565b839063ffffffff610a1d16565b606061052182836002015461040e565b92915050565b82610579576040805162461bcd60e51b815260206004820152601360248201527f4b6579206d75737420626520646566696e656400000000000000000000000000604482015290519081900360640190fd5b6105838484610b57565b156105d5576040805162461bcd60e51b815260206004820181905260248201527f43616e277420696e7365727420616e206578697374696e6720656c656d656e74604482015290519081900360640190fd5b8282141580156105e55750828114155b6106205760405162461bcd60e51b8152600401808060200182810382526030815260200180610c486030913960400191505060405180910390fd5b60008381526003850160205260409020600280820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055850154610674576001850184905583855561081c565b8215158061068157508115155b6106bc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610d03602d913960400191505060405180910390fd5b82815560018101829055821561076e576106d68584610b57565b6107115760405162461bcd60e51b8152600401808060200182810382526034815260200180610c9f6034913960400191505060405180910390fd5b60008381526003860160205260409020600181015483146107635760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b600101849055610776565b600185018490555b8115610818576107868583610b57565b6107c15760405162461bcd60e51b8152600401808060200182810382526030815260200180610cd36030913960400191505060405180910390fd5b60008281526003860160205260409020805484146108105760405162461bcd60e51b8152600401808060200182810382526027815260200180610c786027913960400191505060405180910390fd5b84905561081c565b8385555b600285015461083290600163ffffffff61092916565b85600201819055505050505050565b6060826002015482111561089c576040805162461bcd60e51b815260206004820152601360248201527f6e6f7420656e6f75676820656c656d656e747300000000000000000000000000604482015290519081900360640190fd5b6060826040519080825280602002602001820160405280156108c8578160200160208202803883390190505b50845490915060005b8481101561091f57818382815181106108e657fe5b60209081029190910181019190915260009283526003870190526040909120549061091881600163ffffffff61092916565b90506108d1565b5090949350505050565b600082820183811015610983576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b82158015906109995750818314155b80156109a55750808314155b80156109b657506109b68484610b57565b610a07576040805162461bcd60e51b815260206004820152600e60248201527f6b6579206f6e20696e206c697374000000000000000000000000000000000000604482015290519081900360640190fd5b610a118484610a1d565b61038584848484610527565b600081815260038301602052604090208115801590610a415750610a418383610b57565b610a92576040805162461bcd60e51b815260206004820152600f60248201527f6b6579206e6f7420696e206c6973740000000000000000000000000000000000604482015290519081900360640190fd5b805415610ab957805460009081526003840160205260409020600180830154910155610ac4565b600180820154908401555b600181015415610aec5760018101546000908152600384016020526040902081549055610af1565b805483555b60008281526003840160205260408120818155600180820192909255600290810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055840154610b4a9163ffffffff610b7316565b8360020181905550505050565b6000908152600391909101602052604090206002015460ff1690565b600061098383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060008184841115610c3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c04578181015183820152602001610bec565b50505050905090810190601f168015610c315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4b65792063616e6e6f74206265207468652073616d652061732070726576696f75734b6579206f72206e6578744b657970726576696f75734b6579206d7573742062652061646a6163656e7420746f206e6578744b657949662070726576696f75734b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744966206e6578744b657920697320646566696e65642c206974206d75737420657869737420696e20746865206c6973744569746865722070726576696f75734b6579206f72206e6578744b6579206d75737420626520646566696e6564a265627a7a723158203c48e487e19884f42a685d91c8d2e29f9dc4c7f9752f583e426a2e2ccd702c9264736f6c63430005110032
External libraries
AddressLinkedList : 0x6200f54d73491d56b8d7a975c9ee18efb4d518df
AddressSortedLinkedListWithMedian : 0xed477a99035d0c1e11369f1d7a4e587893cc002b