docs: static List<TaskGroupInformation> getPathSpecifications(String input, String output, Map<String, List<TaskGroupInformation>> _inputs) throws TaskSystemException {
  		// Changed this to an unmodifiable map, just to make sure that it is not modified.
  		Map<String, List<TaskGroupInformation>> inputs = Collections.unmodifiableMap(_inputs);
  
  		// queue roots
  		List<PathInfo> queue = new ArrayList<>();
  		PathInfo.makePaths(inputs.get(input), Collections.emptyList(), Collections.emptyList())
  				.forEachOrdered(v->queue.add(v));
  		
  		while (!queue.isEmpty()) {
  			PathInfo current = queue.remove(0);
  			TaskGroupInformation candidate = current.getConvert();
  			logger.fine("Evaluating " + candidate.getInputType() + " -> " + candidate.getOutputType());
  			if (candidate.getOutputType().getIdentifier().equals(output)) {
  				List<TaskGroupInformation> ret = new ArrayList<>(current.getPath());
  				ret.addAll(current.getEnhance());
  				ret.add(candidate);
  				List<TaskGroupInformation> enhancers = inputs.get(candidate.getOutputType().getIdentifier());
  				if (enhancers!=null) {
  					ret.addAll(PathInfo.getEnhancers(enhancers));
  				}
  				return ret;
  			} else {
  				// add for later evaluation
  				List<TaskGroupInformation> excl = new ArrayList<>(current.getExclude());
  				excl.add(candidate);
  				List<TaskGroupInformation> x = inputs.get(candidate.getOutputType().getIdentifier());
  				if (x!=null) {
  					List<TaskGroupInformation> info = new ArrayList<>(current.getPath());
  					info.addAll(current.getEnhance());
  					info.add(candidate);
  					PathInfo.makePaths(x, info, excl)
  						.forEachOrdered(v->queue.add(v));
  				}
  			}
  		}
  		throw new TaskSystemException("Cannot find path " + input + "->" + output);
  	}