public boolean parse() throws IOException {
		boolean success = true;
	
		// #GUID
		CliStreamHeader header = streamHeaderMap.get(CliStreamGuid.getName());
		if (header != null) {
			guidStream = new CliStreamGuid(header, getFileOffset() + header.getOffset(),
				getRva() + header.getOffset(), reader);
			header.setStream(guidStream);
			success &= guidStream.parse();
		}

		// #US
		header = streamHeaderMap.get(CliStreamUserStrings.getName());
		if (header != null) {
			userStringsStream = new CliStreamUserStrings(header,
				getFileOffset() + header.getOffset(), getRva() + header.getOffset(), reader);
			header.setStream(userStringsStream);
			success &= userStringsStream.parse();
		}

		// #Strings
		header = streamHeaderMap.get(CliStreamStrings.getName());
		if (header != null) {
			stringsStream = new CliStreamStrings(header, getFileOffset() + header.getOffset(),
				getRva() + header.getOffset(), reader);
			header.setStream(stringsStream);
			success &= stringsStream.parse();
		}

		// #Blob
		header = streamHeaderMap.get(CliStreamBlob.getName());
		if (header != null) {
			blobStream = new CliStreamBlob(header,
				getFileOffset() + header.getOffset(), getRva() + header.getOffset(), reader);
			header.setStream(blobStream);
			success &= blobStream.parse();
		}

		// #~ (must be done last)
		header = streamHeaderMap.get(CliStreamMetadata.getName());
		if (header != null) {
			metadataStream = new CliStreamMetadata(header, guidStream, userStringsStream,
				stringsStream, blobStream, getFileOffset() + header.getOffset(),
				getRva() + header.getOffset(), reader);
			header.setStream(metadataStream);
			success &= metadataStream.parse();
		}

		return success;
	}
Constructs a new CLI Metadata Root datatype. Matches ISO 23271 II.24.2.

@param reader A binary reader set to start reading at the start of this header.
@param rva The RVA of this header.
@throws IOException if there is a problem reading the header.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/CliMetadataRoot.java