* and we try to consume p1 changes as soon as we see first p1's range
*/
int s1TotalLines = s1To - s1From, s1ConsumedLines = 0, s1Start = s1From;
for (Iterator<IntTuple> it = mergeRanges.iterator(); it.hasNext();) {
IntTuple mergeRange = it.next();
final int rangeOrigin = mergeRange.at(0);
final int rangeStart = mergeRange.at(1);
final int rangeLen = mergeRange.at(2);
final boolean lastRange = it.hasNext();
final int s1LinesLeft = s1TotalLines - s1ConsumedLines;
// how many lines we may report as changed (don't use more than in range unless it's the very last range)
final int s1LinesToBorrow = lastRange ? s1LinesLeft : Math.min(s1LinesLeft, rangeLen);
if (s1LinesToBorrow > 0) {