code: func concurrentGrab(sources []profileSource, fetch plugin.Fetcher, obj plugin.ObjTool, ui plugin.UI, tr http.RoundTripper) (*profile.Profile, plugin.MappingSources, bool, int, error) {
  	wg := sync.WaitGroup{}
  	wg.Add(len(sources))
  	for i := range sources {
  		go func(s *profileSource) {
  			defer wg.Done()
  			s.p, s.msrc, s.remote, s.err = grabProfile(s.source, s.addr, fetch, obj, ui, tr)
  		}(&sources[i])
  	}
  	wg.Wait()
  
  	var save bool
  	profiles := make([]*profile.Profile, 0, len(sources))
  	msrcs := make([]plugin.MappingSources, 0, len(sources))
  	for i := range sources {
  		s := &sources[i]
  		if err := s.err; err != nil {
  			ui.PrintErr(s.addr + ": " + err.Error())
  			continue
  		}
  		save = save || s.remote
  		profiles = append(profiles, s.p)
  		msrcs = append(msrcs, s.msrc)
  		*s = profileSource{}
  	}
  
  	if len(profiles) == 0 {
  		return nil, nil, false, 0, nil
  	}
  
  	p, msrc, err := combineProfiles(profiles, msrcs)
  	if err != nil {
  		return nil, nil, false, 0, err
  	}
  	return p, msrc, save, len(profiles), nil
  }
docs: // concurrentGrab fetches multiple profiles concurrently