code: ExpandedPair retrieveNextPair(BitArray row, List<ExpandedPair> previousPairs, int rowNumber)
        throws NotFoundException {
      boolean isOddPattern  = previousPairs.size() % 2 == 0;
      if (startFromEven) {
        isOddPattern = !isOddPattern;
      }
  
      FinderPattern pattern;
  
      boolean keepFinding = true;
      int forcedOffset = -1;
      do {
        this.findNextPair(row, previousPairs, forcedOffset);
        pattern = parseFoundFinderPattern(row, rowNumber, isOddPattern);
        if (pattern == null) {
          forcedOffset = getNextSecondBar(row, this.startEnd[0]);
        } else {
          keepFinding = false;
        }
      } while (keepFinding);
  
      // When stacked symbol is split over multiple rows, there's no way to guess if this pair can be last or not.
      // boolean mayBeLast = checkPairSequence(previousPairs, pattern);
  
      DataCharacter leftChar  = this.decodeDataCharacter(row, pattern, isOddPattern, true);
  
      if (!previousPairs.isEmpty() && previousPairs.get(previousPairs.size() - 1).mustBeLast()) {
        throw NotFoundException.getNotFoundInstance();
      }
  
      DataCharacter rightChar;
      try {
        rightChar = this.decodeDataCharacter(row, pattern, isOddPattern, false);
      } catch (NotFoundException ignored) {
        rightChar = null;
      }
      return new ExpandedPair(leftChar, rightChar, pattern);
    }
docs: not private for testing