public static Namespace createNamespaceHierarchy(String namespacePath, Namespace rootNamespace,
			Program program, Address address, SourceType source)
			throws InvalidInputException, IllegalArgumentException {
		validate(program, rootNamespace);
		rootNamespace = adjustForNullRootNamespace(rootNamespace, namespacePath, program);
		if (namespacePath == null) {
			return rootNamespace;
		}

		SymbolPath path = new SymbolPath(namespacePath);
		List<String> namespacesList = path.asList();

		SymbolTable symbolTable = program.getSymbolTable();
		Namespace namespace = rootNamespace;
		for (String namespaceName : namespacesList) {
			Namespace ns = getNamespace(program, namespace, namespaceName, address);
			if (ns == null) {
				try {
					ns = symbolTable.createNameSpace(namespace, namespaceName, source);
				}
				catch (DuplicateNameException e) {
					throw new AssertException(
						"Duplicate name exception should not be possible here since we checked first!");
				}
			}
			namespace = ns;
		}

		return namespace;
	}
Takes a namespace path string and creates a namespace hierarchy to
match that string.  This method allows function namespaces in the path
and uses the given address to resolve functions with duplicate names.  When
resolving down the namespace path, a function that matches a name will only
be used if the given address is contained in the body of that function.

<p>The root namespace can be a function.

<p>If an address is passed, then the path can contain a function name provided the
address is in the body of the function; otherwise the names must all be namespaces other
than functions.

@param  namespacePath The namespace name or path string to be parsed
        This value should not include a trailing symbol name, only namespace names
@param  rootNamespace The parent namespace under which the desired
        namespace or path resides.  If this value is null, then the
        global namespace will be used.
@param  program The current program in which the desired namespace
        resides
@param  address the address used to resolve possible functions with duplicate names; may
        be null
@param  source the source of the namespace
@return The namespace that matches the given path.  This can be either an existing
        namespace or a newly created one.
@throws InvalidInputException If a given namespace name is in an
        invalid format and this method attempts to create that
        namespace, or if the namespace string contains the global
        namespace name in a position other than the root.
@throws IllegalArgumentException if specified rootNamespace is not valid for 
        specified program.
@see    <a href="#assumptions">assumptions</a>
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/NamespaceUtils.java