// Path: libraries/core/src/main/java/com/paritytrading/philadelphia/FIXTags.java
// class FIXTags {
// 
//     static final int BeginSeqNo          =   7;
//     static final int BeginString         =   8;
//     static final int BodyLength          =   9;
//     static final int CheckSum            =  10;
//     static final int EndSeqNo            =  16;
//     static final int MsgSeqNum           =  34;
//     static final int MsgType             =  35;
//     static final int NewSeqNo            =  36;
//     static final int PossDupFlag         =  43;
//     static final int RefSeqNum           =  45;
//     static final int SenderCompID        =  49;
//     static final int SendingTime         =  52;
//     static final int TargetCompID        =  56;
//     static final int Text                =  58;
//     static final int TransactTime        =  60;
//     static final int EncryptMethod       =  98;
//     static final int HeartBtInt          = 108;
//     static final int TestReqID           = 112;
//     static final int GapFillFlag         = 123;
//     static final int ResetSeqNumFlag     = 141;
//     static final int SessionRejectReason = 373;
// 
//     static int get(ByteBuffer buffer) {
//         int tag = 0;
// 
//         while (buffer.hasRemaining()) {
//             byte b = buffer.get();
// 
//             if (b == EQUALS)
//                 return tag;
// 
//             tag = 10 * tag + b - '0';
//         }
// 
//         return 0;
//     }
// 
//     static void put(ByteBuffer buffer, int tag) {
//         if (tag < 1 || tag > 99999)
//             tooLargeTag();
// 
//         byte b1 = (byte)('0' + tag % 10);
// 
//         tag /= 10;
// 
//         if (tag != 0) {
//             byte b2 = (byte)('0' + tag % 10);
// 
//             tag /= 10;
// 
//             if (tag != 0) {
//                 byte b3 = (byte)('0' + tag % 10);
// 
//                 tag /= 10;
// 
//                 if (tag != 0) {
//                     byte b4 = (byte)('0' + tag % 10);
// 
//                     tag /= 10;
// 
//                     if (tag != 0) {
//                         byte b5 = (byte)('0' + tag % 10);
// 
//                         buffer.put(b5);
//                     }
// 
//                     buffer.put(b4);
//                 }
// 
//                 buffer.put(b3);
//             }
// 
//             buffer.put(b2);
//         }
// 
//         buffer.put(b1);
//         buffer.put(EQUALS);
//     }
// 
//     private static void tooLargeTag() {
//         throw new IllegalArgumentException("Too large tag");
//     }
// 
// }


import static com.paritytrading.philadelphia.FIXTags.*;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.ReadOnlyBufferException;
import java.util.stream.Stream;

        while (buffer.hasRemaining()) {
            if (count == tags.length)
                tooManyFields();

            int tag = FIXTags.get(buffer);
            if (tag == 0)
                return false;

            tags[count] = tag;

            if (!values[count].get(buffer))
                return false;

            count++;
        }

        return true;
    }

    /**
     * Write this message to a buffer.
     *
     * @param buffer a buffer
     * @throws BufferOverflowException if there are fewer bytes remaining in
     *   the buffer than what this message consists of
     * @throws ReadOnlyBufferException if the buffer is read-only
     */
    public void put(ByteBuffer buffer) {
        for (int i = 0; i < count; i++) {
// Path: libraries/core/src/main/java/com/paritytrading/philadelphia/FIXTags.java
// class FIXTags {
// 
//     static final int BeginSeqNo          =   7;
//     static final int BeginString         =   8;
//     static final int BodyLength          =   9;
//     static final int CheckSum            =  10;
//     static final int EndSeqNo            =  16;
//     static final int MsgSeqNum           =  34;
//     static final int MsgType             =  35;
//     static final int NewSeqNo            =  36;
//     static final int PossDupFlag         =  43;
//     static final int RefSeqNum           =  45;
//     static final int SenderCompID        =  49;
//     static final int SendingTime         =  52;
//     static final int TargetCompID        =  56;
//     static final int Text                =  58;
//     static final int TransactTime        =  60;
//     static final int EncryptMethod       =  98;
//     static final int HeartBtInt          = 108;
//     static final int TestReqID           = 112;
//     static final int GapFillFlag         = 123;
//     static final int ResetSeqNumFlag     = 141;
//     static final int SessionRejectReason = 373;
// 
//     static int get(ByteBuffer buffer) {
//         int tag = 0;
// 
//         while (buffer.hasRemaining()) {
//             byte b = buffer.get();
// 
//             if (b == EQUALS)
//                 return tag;
// 
//             tag = 10 * tag + b - '0';
//         }
// 
//         return 0;
//     }
// 
//     static void put(ByteBuffer buffer, int tag) {
//         if (tag < 1 || tag > 99999)
//             tooLargeTag();
// 
//         byte b1 = (byte)('0' + tag % 10);
// 
//         tag /= 10;
// 
//         if (tag != 0) {
//             byte b2 = (byte)('0' + tag % 10);
// 
//             tag /= 10;
// 
//             if (tag != 0) {
//                 byte b3 = (byte)('0' + tag % 10);
// 
//                 tag /= 10;
// 
//                 if (tag != 0) {
//                     byte b4 = (byte)('0' + tag % 10);
// 
//                     tag /= 10;
// 
//                     if (tag != 0) {
//                         byte b5 = (byte)('0' + tag % 10);
// 
//                         buffer.put(b5);
//                     }
// 
//                     buffer.put(b4);
//                 }
// 
//                 buffer.put(b3);
//             }
// 
//             buffer.put(b2);
//         }
// 
//         buffer.put(b1);
//         buffer.put(EQUALS);
//     }
// 
//     private static void tooLargeTag() {
//         throw new IllegalArgumentException("Too large tag");
//     }
// 
// }


// Path: libraries/core/src/main/java/com/paritytrading/philadelphia/FIXMessage.java
import static com.paritytrading.philadelphia.FIXTags.*;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.nio.ReadOnlyBufferException;
import java.util.stream.Stream;


        while (buffer.hasRemaining()) {
            if (count == tags.length)
                tooManyFields();

            int tag = FIXTags.get(buffer);
            if (tag == 0)
                return false;

            tags[count] = tag;

            if (!values[count].get(buffer))
                return false;

            count++;
        }

        return true;
    }

    /**
     * Write this message to a buffer.
     *
     * @param buffer a buffer
     * @throws BufferOverflowException if there are fewer bytes remaining in
     *   the buffer than what this message consists of
     * @throws ReadOnlyBufferException if the buffer is read-only
     */
    public void put(ByteBuffer buffer) {
        for (int i = 0; i < count; i++) {
            FIXTags.put(buffer, tags[i]);