code: public static <K1, K2, V1 extends K2, V2> ImmutableSetMultimap<K1, V2> composeToSetMultimap(
        final Multimap<K1, V1> first, final Multimap<K2, V2> second) {
      final ImmutableSetMultimap.Builder<K1, V2> result = ImmutableSetMultimap.builder();
      for (K1 k1 : first.keySet()) {
        checkNotNull(k1);
        for (V1 v1 : first.get(k1)) {
          checkNotNull(v1);
          result.putAll(k1, second.get(v1));
        }
      }
      return result.build();
    }
docs: Performs a (non-strict) composition of two multimaps to an {@link ImmutableSetMultimap}. This
  returns a new {@link ImmutableSetMultimap} which will contain an entry {@code (k,v)} if and
  only if there is some {@code i} such that {@code (k, i)} is in {@code first} and {@code (i,v)}
  is in {@code second}.  Neither {@code first} nor {@code second} is permitted to contain null
  keys or values. The output of this method is not a view and will not be updated for changes to
  the input multimaps.
  
  This method will allow {@code first} to contain values not found as keys of {@code second}. If
  you wish to disallow this, see {@link #composeToSetMultimapStrictly(Multimap, Multimap)}.