@Override
    public @NotNull Map<Integer, List<ChangeKind>> map(@NotNull CompressedDetails inputData) {
      HashMap<Integer, List<ChangeKind>> result = new HashMap<>();

      // it's not exactly parents count since it is very convenient to assume that initial commit has one parent
      int parentsCount = inputData.getParents().isEmpty() ? 1 : inputData.getParents().size();
      for (int parentIndex = 0; parentIndex < parentsCount; parentIndex++) {
        try {
          ObjectSet<Int2IntMap.Entry> entries = inputData.getRenamedPaths(parentIndex).int2IntEntrySet();
          if (!entries.isEmpty()) {
            int[] renames = new int[entries.size() * 2];
            int index = 0;
            for (Int2IntMap.Entry entry : entries) {
              renames[index++] = entry.getIntKey();
              renames[index++] = entry.getIntValue();
              getOrCreateChangeKindList(result, entry.getIntKey(), parentsCount).set(parentIndex, ChangeKind.REMOVED);
              getOrCreateChangeKindList(result, entry.getIntValue(), parentsCount).set(parentIndex, ChangeKind.ADDED);
            }

            int commit = myStorage.getCommitIndex(inputData.getId(), inputData.getRoot());
            int parent = myStorage.getCommitIndex(inputData.getParents().get(parentIndex), inputData.getRoot());
            myRenamesMap.put(new int[]{parent, commit}, renames);
          }

          for (Int2ObjectMap.Entry<Change.Type> entry : inputData.getModifiedPaths(parentIndex).int2ObjectEntrySet()) {
            getOrCreateChangeKindList(result, entry.getIntKey(), parentsCount).set(parentIndex, createChangeData(entry.getValue()));
          }
        }
        catch (IOException e) {
          myFatalErrorConsumer.accept(e);
        }
      }

      return result;
    }
@Override
    public @NotNull Map<Integer, List<ChangeKind>> map(@NotNull CompressedDetails inputData)