private BinaryReader decompressInodeTable(BinaryReader reader, long endAddress,
			SquashSuperBlock superBlock, TaskMonitor monitor)
			throws IOException, CancelledException {

		ByteArrayOutputStream bos = new ByteArrayOutputStream();

		// Keep track of how many bytes result from decompression
		int totalUncompressedBytes = 0;

		// Continue reading until the end of the section is reached
		while (reader.getPointerIndex() < endAddress) {

			// Check if the user cancelled the load
			monitor.checkCancelled();

			// If processing the inode table, check if the current metadata block contains the root inode
			if ((reader.getPointerIndex() - superBlock.getInodeTableStart()) == superBlock
					.getRootInodeBlockLocation()) {

				// Tell the inode table the root inode location within the uncompressed bytes
				rootInodeOffset = totalUncompressedBytes + superBlock.getRootInodeOffset();
			}

			// Decompress the current metablock
			byte[] bytes =
				SquashUtils.decompressBlock(reader, superBlock.getCompressionType(), monitor);

			// Add bytes to the stream
			bos.write(bytes);
			totalUncompressedBytes += bytes.length;
		}

		// Convert the output stream into a BinaryReader and return
		return SquashUtils.byteArrayToReader(bos.toByteArray());
	}
Decompress the inode table and record the root inode
@param reader The BinaryReader pointed to the start of the section
@param endAddress The address the section ends at
@param superBlock The SuperBlock for the current archive
@param monitor Monitor to allow the user to cancel the load
@return A BinaryReader containing ONLY the uncompressed bytes of the section
@throws IOException Any read operation failure
@throws CancelledException Archive load was cancelled
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/squashfs/SquashInodeTable.java