```\nfunction removeMultiple(uint256 LPamount, address[] calldata tokens)\n  external\n  override\n  returns (bool success)\n{\n  // Perform basic validation (no lock check here on purpose)\n  require(tokens.length == 16, "DFP: Bad tokens array length");\n\n  // Calculate fraction of total liquidity to be returned\n  uint256 fraction = (LPamount << 128) / totalSupply();\n\n  // Send the ETH first (use transfer to prevent reentrancy)\n  uint256 dexBalance = address(this).balance;\n  address payable sender = payable(msg.sender);\n  sender.transfer(fraction * dexBalance >> 128);\n\n  // Send the ERC20 tokens\n  address previous;\n  for (uint256 i = 1; i < 16; i++) {\n    address token = tokens[i];\n    require(token > previous, "DFP: Require ordered list");\n    require(\n      listedTokens[token].state > State.Delisting,\n      "DFP: Token not listed"\n    );\n    dexBalance = IERC20(token).balanceOf(address(this));\n    IERC20(token).safeTransfer(msg.sender, fraction * dexBalance >> 128);\n    previous = token;\n  }\n\n  // Burn the LPs\n  _burn(msg.sender, LPamount);\n  emit MultiLiquidityRemoved(msg.sender, LPamount, totalSupply());\n\n  // That's all folks\n  return true;\n}\n```\n