code: @VisibleForTesting
      Map<QName, List<String>> getGroups(final String value) {
          final Map<QName, List<String>> res = new HashMap<>();
  
          final StringBuilder buf = new StringBuilder();
          int previousEnd = 0;
          final Matcher m = groupPattern.matcher(value);
          while(m.find()) {
              buf.append(value.subSequence(previousEnd, m.start()));
              final String v = m.group(2);
              if (!v.trim().isEmpty()) {
                  final QName k = QName.valueOf(m.group(1));
                  if (res.containsKey(k)) {
                      final List<String> l = new ArrayList<>(res.get(k));
                      l.addAll(Arrays.asList(v.trim().split("\\s+")));
                      res.put(k, l);
                  } else {
                      res.put(k, Arrays.asList(v.trim().split("\\s+")));
                  }
              }
              previousEnd = m.end();
          }
          buf.append(value.substring(previousEnd));
          if (!buf.toString().trim().isEmpty()) {
              res.put(null, Arrays.asList(buf.toString().trim().split("\\s+")));
          }
          return res;
      }
docs: Parse groups
  
  @param value profiling attribute value
  @return map of groups names to group values, ungrouped values have {@code null} name