private List<FSRL> findLibraryOnDisk(String library, List<LibrarySearchPath> searchPaths,
			MessageLog log, TaskMonitor monitor) throws CancelledException {

		List<FSRL> results = new ArrayList<>();

		try {
			for (LibrarySearchPath searchPath : searchPaths) {
				monitor.checkCancelled();
				String fullLibraryPath = joinPaths(searchPath.relativeFsPath(), library);
				GFileSystem fs = searchPath.fsRef().getFilesystem();
				FSRL fsrl = resolveLibraryFile(fs, fullLibraryPath);
				Optional.ofNullable(fsrl).ifPresent(results::add);
			}

			if (results.isEmpty() && new File(library).isAbsolute()) {
				LocalFileSystem localFS = FileSystemService.getInstance().getLocalFS();
				FSRL fsrl = resolveLibraryFile(localFS, library);
				Optional.ofNullable(fsrl).ifPresent(results::add);
			}
		}
		catch (IOException e) {
			log.appendException(e);
		}

		return results;
	}
Find the library in a {@link GFileSystem}, returning a {@link List} of possible candidate 
{@link GFile files}.
<p>
Each search path directory will be searched for the library file in order.
<p>
If the library file specifies a path, it is treated as a relative subdirectory of
each search path directory that is searched, and if not found, the filename part of
the library is used to search just the search path directory.
<p>
If the library specifies an absolute path, its native path is also searched on the local 
filesystem.

@param library The library. This will be either an absolute path, a relative path, or just a 
  filename.
@param searchPaths A {@link List} of {@link LibrarySearchPath}s that will be searched
@param log The log
@param monitor A cancelable task monitor
@return A {@link List} of {@link GFile files} that match the requested library path
@throws CancelledException if the user cancelled the operation
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractLibrarySupportLoader.java