private List<String> readChunkInReverse(long startByte) throws IOException {

		if (raf == null || startByte == 1) {
			return Collections.<String> emptyList();
		}

		// Store the end position of the read (where we'll actually start reading from).
		long endPos = startByte;

		// And now tell the reverser where to start.
		reverser.setFilePos(endPos);

		// Create a new chunk to represent the next set of lines we'll be reading.
		Chunk chunk = new Chunk();

		List<String> lines = new ArrayList<>();
		List<Pair> filePositions = new ArrayList<>();

		for (int i = model.NUM_LINES - 1; i >= 0; i--) {

			long end = raf.getFilePointer();
			String line = reverser.readLine();

			if (line == null) {
				break;
			}

			lines.add(line);
			if (raf.getFilePointer() > 0) {
				filePositions.add(new Pair(raf.getFilePointer(), end-1));
			}
			else {
				filePositions.add(new Pair(0, end-1));
			}
		}

		Collections.reverse(filePositions);
		for (int i = 0; i < lines.size(); i++) {
			chunk.rowToFilePositionMap.put(i, filePositions.get(i));
		}

		// If we have a valid chunk, store some metadata and add it to the model.
		addChunkToModel(chunk, lines, raf.getFilePointer(), endPos-1, true);

		// The lines have been read-in in reverse order, so we have to flip them before 
		// returning.
		Collections.reverse(lines);
		return lines;
	}
Reads in a chunk from the current file pointer location, backwards.

@param startByte the start byte from which to read
@return the lines of text read
@throws IOException
Ghidra/Framework/Project/src/main/java/ghidra/framework/main/logviewer/model/ChunkReader.java