code: func (r PluginRequirements) Merge(other PluginRequirements) PluginRequirements {
  	ret := make(PluginRequirements)
  	for n, c := range r {
  		ret[n] = &PluginConstraints{
  			Versions: Constraints{}.Append(c.Versions),
  			SHA256:   c.SHA256,
  		}
  	}
  	for n, c := range other {
  		if existing, exists := ret[n]; exists {
  			ret[n].Versions = ret[n].Versions.Append(c.Versions)
  
  			if existing.SHA256 != nil {
  				if c.SHA256 != nil && !bytes.Equal(c.SHA256, existing.SHA256) {
  					// If we've been asked to merge two constraints with
  					// different SHA256 hashes then we'll produce a dummy value
  					// that can never match anything. This is a silly edge case
  					// that no reasonable caller should hit.
  					ret[n].SHA256 = []byte(invalidProviderHash)
  				}
  			} else {
  				ret[n].SHA256 = c.SHA256 // might still be nil
  			}
  		} else {
  			ret[n] = &PluginConstraints{
  				Versions: Constraints{}.Append(c.Versions),
  				SHA256:   c.SHA256,
  			}
  		}
  	}
  	return ret
  }
docs: // Merge takes the contents of the receiver and the other given requirements
  // object and merges them together into a single requirements structure
  // that satisfies both sets of requirements.
  //
  // Note that it doesn't make sense to merge two PluginRequirements with
  // differing required plugin SHA256 hashes, since the result will never
  // match any plugin.