public NARCContents readNARC(String subpath) throws IOException {
		Map<String, byte[]> frames = readNitroFrames(subpath);
		if (!frames.containsKey("FATB") || !frames.containsKey("FNTB")
				|| !frames.containsKey("FIMG")) {
			System.err.println("Not a valid narc file");
			return null;
		}
		// File contents
		NARCContents narc = new NARCContents();
		byte[] fatbframe = frames.get("FATB");
		byte[] fimgframe = frames.get("FIMG");
		int fileCount = readLong(fatbframe, 0);
		for (int i = 0; i < fileCount; i++) {
			int startOffset = readLong(fatbframe, 4 + i * 8);
			int endOffset = readLong(fatbframe, 8 + i * 8);
			int length = (endOffset - startOffset);
			byte[] thisFile = new byte[length];
			try {
				System.arraycopy(fimgframe, startOffset, thisFile, 0, length);
			} catch (ArrayIndexOutOfBoundsException ex) {
				System.out.printf(
						"AIOBEX: start %d length %d size of frame %d\n",
						startOffset, length, fimgframe.length);
			}
			narc.files.add(thisFile);
		}
		// Filenames?
		byte[] fntbframe = frames.get("FNTB");
		int unk1 = readLong(fntbframe, 0);
		if (unk1 == 8) {
			// Filenames exist
			narc.hasFilenames = true;
			int offset = 8;
			for (int i = 0; i < fileCount; i++) {
				int fnLength = (fntbframe[offset] & 0xFF);
				offset++;
				byte[] filenameBA = new byte[fnLength];
				System.arraycopy(fntbframe, offset, filenameBA, 0, fnLength);
				String filename = new String(filenameBA, "US-ASCII");
				narc.filenames.add(filename);
			}
		} else {
			narc.hasFilenames = false;
			for (int i = 0; i < fileCount; i++) {
				narc.filenames.add(null);
			}
		}
		return narc;
	}