code: private void initialiseInverseBWT() {
          final int bwtStartPointer = this.bwtStartPointer;
          final byte[] bwtBlock  = this.bwtBlock;
          final int[] bwtMergedPointers = new int[bwtBlockLength];
          final int[] characterBase = new int[256];
  
          if (bwtStartPointer < 0 || bwtStartPointer >= bwtBlockLength) {
              throw new DecompressionException("start pointer invalid");
          }
  
          // Cumulative character counts
          System.arraycopy(bwtByteCounts, 0, characterBase, 1, 255);
          for (int i = 2; i <= 255; i++) {
              characterBase[i] += characterBase[i - 1];
          }
  
          // Merged-Array Inverse Burrows-Wheeler Transform
          // Combining the output characters and forward pointers into a single array here, where we
          // have already read both of the corresponding values, cuts down on memory accesses in the
          // final walk through the array
          for (int i = 0; i < bwtBlockLength; i++) {
              int value = bwtBlock[i] & 0xff;
              bwtMergedPointers[characterBase[value]++] = (i << 8) + value;
          }
  
          this.bwtMergedPointers = bwtMergedPointers;
          bwtCurrentMergedPointer = bwtMergedPointers[bwtStartPointer];
      }
docs: Set up the Inverse Burrows-Wheeler Transform merged pointer array.