docs: public static int decode(
          final DirectBuffer buffer,
          final int offset,
          final int actingVersion,
          final int blockLength,
          final List<Token> msgTokens,
          final TokenListener listener)
      {
          listener.onBeginMessage(msgTokens.get(0));
  
          int i = offset;
          final int numTokens = msgTokens.size();
          final int tokenIdx = decodeFields(buffer, i, actingVersion, msgTokens, 1, numTokens, listener);
          i += blockLength;
  
          final long packedValues = decodeGroups(
              buffer, i, actingVersion, msgTokens, tokenIdx, numTokens, listener);
  
          i = decodeData(
              buffer,
              bufferOffset(packedValues),
              msgTokens,
              tokenIndex(packedValues),
              numTokens,
              actingVersion,
              listener);
  
          listener.onEndMessage(msgTokens.get(numTokens - 1));
  
          return i;
      }