Program: 143455
Project: 143455
Buggy source:
/** 
 * This gets called when rows in the viewport were deleted/inserted/changed.
 * @param relativeFirstRow viewPort relative start index for given operation.
 * @param relativeLastRow viewPort relative end index for given operation (inclusive).
 * @param newDataStartIndex foundset relative first row of new data (that is automatically added to the end of viewPort in case of delete, or just added in case of insert, or just changed for change) index.
 * @param newDataEndIndex foundset relative end row of new data (that is automatically added to the end of viewPort in case of delete, or just added in case of insert, or just changed for change) index.
 * @param operationType can be one of {@link RowData#DELETE},   {@link RowData#INSERT} or {@link RowData#CHANGE}.
 */
public void queueOperation(int relativeFirstRow,int relativeLastRow,final int newDataStartIndex,final int newDataEndIndex,final IFoundSetInternal foundset,int operationType){
  if (!shouldSendWholeViewport()) {
    if (operationType != RowData.CHANGE || ignoreUpdateOnPkHash == null || newDataStartIndex != newDataEndIndex || !foundset.getRecord(newDataStartIndex).getPKHashKey().equals(ignoreUpdateOnPkHash)) {
      boolean changed=(viewPortChanges.size() == 0);
      try {
        IJSONStringWithConversions writtenAsJSON;
        writtenAsJSON=JSONUtils.writeToJSONString(new IToJSONWriter<BaseWebObject>(){
          @Override public boolean writeJSONContent(          JSONWriter w,          String keyInParent,          IToJSONConverter<BaseWebObject> converter,          DataConversion clientDataConversions) throws JSONException {
            rowDataProvider.writeRowData(newDataStartIndex,newDataEndIndex,foundset,w,clientDataConversions);
            return true;
          }
        }
,FullValueToJSONConverter.INSTANCE);
        RowData newOperation=new RowData(writtenAsJSON,relativeFirstRow,relativeLastRow,operationType);
        if (operationType == RowData.CHANGE) {
          while (viewPortChanges.size() > 0 && viewPortChanges.get(viewPortChanges.size() - 1).isMadeIrrelevantBySubsequentRowData(newOperation)) {
            viewPortChanges.remove(viewPortChanges.size() - 1);
          }
        }
        viewPortChanges.add(newOperation);
        if (changed && monitor != null)         monitor.valueChanged();
      }
 catch (      JSONException e) {
        Debug.error(e);
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * This gets called when rows in the viewport were deleted/inserted/changed.
 * @param relativeFirstRow viewPort relative start index for given operation.
 * @param relativeLastRow viewPort relative end index for given operation (inclusive).
 * @param newDataStartIndex foundset relative first row of new data (that is automatically added to the end of viewPort in case of delete, or just added in case of insert, or just changed for change) index.
 * @param newDataEndIndex foundset relative end row of new data (that is automatically added to the end of viewPort in case of delete, or just added in case of insert, or just changed for change) index.
 * @param operationType can be one of {@link RowData#DELETE},   {@link RowData#INSERT} or {@link RowData#CHANGE}.
 */
public void queueOperation(int relativeFirstRow,int relativeLastRow,final int newDataStartIndex,final int newDataEndIndex,final IFoundSetInternal foundset,int operationType){
  if (!shouldSendWholeViewport()) {
    boolean changed=(viewPortChanges.size() == 0);
    try {
      IJSONStringWithConversions writtenAsJSON;
      writtenAsJSON=JSONUtils.writeToJSONString(new IToJSONWriter<BaseWebObject>(){
        @Override public boolean writeJSONContent(        JSONWriter w,        String keyInParent,        IToJSONConverter<BaseWebObject> converter,        DataConversion clientDataConversions) throws JSONException {
          rowDataProvider.writeRowData(newDataStartIndex,newDataEndIndex,foundset,w,clientDataConversions);
          return true;
        }
      }
,FullValueToJSONConverter.INSTANCE);
      RowData newOperation=new RowData(writtenAsJSON,relativeFirstRow,relativeLastRow,operationType);
      if (operationType == RowData.CHANGE) {
        while (viewPortChanges.size() > 0 && viewPortChanges.get(viewPortChanges.size() - 1).isMadeIrrelevantBySubsequentRowData(newOperation)) {
          viewPortChanges.remove(viewPortChanges.size() - 1);
        }
      }
      viewPortChanges.add(newOperation);
      if (changed && monitor != null)       monitor.valueChanged();
    }
 catch (    JSONException e) {
      Debug.error(e);
    }
  }
}