public static int decode(
final DirectBuffer buffer,
int bufferIndex,
final int actingVersion,
final int blockLength,
final List<Token> msgTokens,
final TokenListener listener)
{
final int groupsBeginIndex = findNextOrLimit(msgTokens, 1, msgTokens.size(), Signal.BEGIN_GROUP);
final int varDataSearchStart = groupsBeginIndex != msgTokens.size() ? groupsBeginIndex : 1;
final int varDataBeginIndex = findNextOrLimit(msgTokens, varDataSearchStart, msgTokens.size(), Signal.BEGIN_VAR_DATA);
listener.onBeginMessage(msgTokens.get(0));
decodeFields(buffer, bufferIndex, actingVersion, msgTokens, 0, groupsBeginIndex, listener);
bufferIndex += blockLength;
bufferIndex = decodeGroups(buffer, bufferIndex, actingVersion, msgTokens, groupsBeginIndex, varDataBeginIndex, listener);
bufferIndex = decodeVarData(buffer, bufferIndex, msgTokens, varDataBeginIndex, msgTokens.size(), listener);
listener.onEndMessage(msgTokens.get(msgTokens.size() - 1));
return bufferIndex;
}