docs: @Override
    public Map<String, Object> rewrite(boolean showDebugInfo) throws IOException {
      createStats();
      Map<String, Object> response = new HashMap<>();
      for (String statsItem : getStatsItems()) {
        if (statsItem.equals(CodecUtil.STATS_TYPE_SUM)) {
          response.put(statsItem, stats.getSum());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_N)) {
          response.put(statsItem, stats.getN());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_MAX)) {
          response.put(statsItem, stats.getMax());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_MIN)) {
          response.put(statsItem, stats.getMin());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_SUMSQ)) {
          response.put(statsItem, stats.getSumsq());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_SUMOFLOGS)) {
          response.put(statsItem,
              stats.getN() * Math.log(stats.getGeometricMean()));
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_MEAN)) {
          response.put(statsItem, stats.getMean());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_GEOMETRICMEAN)) {
          response.put(statsItem, stats.getGeometricMean());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_STANDARDDEVIATION)) {
          response.put(statsItem, stats.getStandardDeviation());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_VARIANCE)) {
          response.put(statsItem, stats.getVariance());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_POPULATIONVARIANCE)) {
          response.put(statsItem, stats.getPopulationVariance());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_QUADRATICMEAN)) {
          response.put(statsItem, Math.sqrt(stats.getSumsq() / stats.getN()));
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_KURTOSIS)) {
          response.put(statsItem, stats.getKurtosis());
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_MEDIAN)) {
          response.put(statsItem, stats.getPercentile(50));
        } else if (statsItem.equals(CodecUtil.STATS_TYPE_SKEWNESS)) {
          response.put(statsItem, stats.getSkewness());
        } else {
          Matcher m = fpStatsFunctionItems.matcher(statsItem);
          if (m.find()) {
            String function = m.group(2).trim();
            if (function.equals(CodecUtil.STATS_FUNCTION_DISTRIBUTION)) {
              response.put(statsItem, getDistribution(m.group(4)));
            }
          }
        }
      }
      if (errorNumber > 0) {
        Map<String, Object> errorResponse = new HashMap<>();
        for (Entry<String, Integer> entry : getErrorList().entrySet()) {
          errorResponse.put(entry.getKey(), entry.getValue());
        }
        response.put("errorNumber", errorNumber);
        response.put("errorList", errorResponse);
      }
      if (showDebugInfo) {
        response.put("sourceNumber", sourceNumber);
        response.put("stats", "full");
      }
      return response;
    }