'Return a set of artifact names needed to fulfill dependencies.
Search the path dependency tree for all artifacts that can fulfill
dependencies of artifact_name_list.  If multiple artifacts provide a
dependency, they are all included.
Args:
os_name: operating system string
artifact_name_list: list of artifact names to find dependencies for.
existing_artifact_deps: existing dependencies to add to, for recursion,
e.g. set(["WindowsRegistryProfiles", "WindowsEnvironmentVariablePath"])
existing_expansion_deps: existing expansion dependencies to add to, for
recursion, e.g. set(["users.userprofile", "users.homedir"])
Returns:
(artifact_names, expansion_names): a tuple of sets, one with artifact
names, the other expansion names'

def SearchDependencies(self, os_name, artifact_name_list, existing_artifact_deps=None, existing_expansion_deps=None):

    artifact_deps = (existing_artifact_deps or set())
    expansion_deps = (existing_expansion_deps or set())
    artifact_objs = self.GetArtifacts(os_name=os_name, name_list=artifact_name_list)
    artifact_deps = artifact_deps.union([a.name for a in artifact_objs])
    for artifact in artifact_objs:
        expansions = artifact.GetArtifactPathDependencies()
        if expansions:
            expansion_deps = expansion_deps.union(set(expansions))
            new_artifact_names = self.GetArtifactNames(os_name=os_name, provides=expansions)
            missing_artifacts = (new_artifact_names - artifact_deps)
            if missing_artifacts:
                (new_artifacts, new_expansions) = self.SearchDependencies(os_name, new_artifact_names, existing_artifact_deps=artifact_deps, existing_expansion_deps=expansion_deps)
                artifact_deps = artifact_deps.union(new_artifacts)
                expansion_deps = expansion_deps.union(new_expansions)
    return (artifact_deps, expansion_deps)
