public static Msf parse(ByteProvider byteProvider, PdbReaderOptions pdbOptions,
			TaskMonitor monitor) throws IOException, PdbException, CancelledException {
		Objects.requireNonNull(byteProvider, "byteProvider cannot be null");
		Objects.requireNonNull(pdbOptions, "pdbOptions cannot be null");
		Objects.requireNonNull(monitor, "monitor cannot be null");

		Msf msf;
		if (Msf200.detected(byteProvider)) {
			msf = new Msf200(byteProvider, monitor, pdbOptions);
		}
		else if (Msf700.detected(byteProvider)) {
			msf = new Msf700(byteProvider, monitor, pdbOptions);
		}
		else {
			// Must close the ByteProvider here.  In cases where MSF is created, the MSF takes
			//  responsibility for closing the file.
			byteProvider.close();
			throw new PdbException("MSF format not detected");
		}
		msf.deserialize();
		return msf;
	}
Detects, creates, and returns the appropriate {@link Msf} object found for
the filename given
@param byteProvider the ByteProvider providing bytes for the MSF
@param pdbOptions {@link PdbReaderOptions} used for processing the PDB
@param monitor {@link TaskMonitor} used for checking cancellation
@return derived {@link Msf} object
@throws IOException for file I/O reasons
@throws PdbException if an appropriate object cannot be created
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/msf/MsfParser.java