successfully parse trhough the model on descriptives-only, correlations-only
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 4 Jul 2020 00:30:17 +0000 (00:30 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 4 Jul 2020 00:30:17 +0000 (00:30 +0000)
dump-float.c
dump-spo2.c
spo-notes

index 718d2a113bb1f593a43487d10469933dd1757f95..7f5b7c880fa385e221542aa725b915f5264fafd4 100644 (file)
@@ -21,7 +21,7 @@ print_float (const uint8_t *b)
 int
 main (void)
 {
-  uint8_t b[] = { 0xc3, 0xe2, 0xb7, 0xc2, 0xb0, 0xe1, 0xb0, 0xfa };
+  uint8_t b[] = { 0, 0, 0, 0, 0, 0, 8, 0x40 };
   int n = sizeof b;
   for (int i = 0; i <= n - 8; i++)
     print_double (b + i);
index 971fbab8eacf1b3390c5c51d6709d45b531396ee..2ed8b7fc24649fc3a0b490f76ff169bd9a9e268f 100644 (file)
@@ -21,6 +21,8 @@ int version;
 
 unsigned int pos;
 
+static int n_dims;
+
 #define XSTR(x) #x
 #define STR(x) XSTR(x)
 #define WHERE __FILE__":" STR(__LINE__)
@@ -465,6 +467,7 @@ parse_heading(const char *name)
   match_u16_assert(0xffff);
   match_u16_assert(0);
   match_string2_assert(name);
+  printf("%#x: %s\n", pos, name);
 }
 
 static void
@@ -502,10 +505,11 @@ put_safe(const char *s)
 
 static void parse_flexible(void);
 
+static int count;
 static void
 parse_DspString(void)
 {
-  printf("%#x: DspString(", pos);
+  printf("%#x: DspString#%d(", pos, count++);
   if (match_byte(2))
     {
       printf("%f, \"", get_double());
@@ -521,6 +525,7 @@ parse_DspString(void)
       put_safe(get_string1());
       printf("\")\n");
     }
+  
 }
 
 static void
@@ -532,10 +537,8 @@ match_DspString(void)
 }
 
 static void
-match_DspSimpleText(void)
-{                               /* 03 80 */
-  match_byte_assert(3);
-  match_byte_assert(0x80);
+parse_DspSimpleText(void)
+{
   match_byte_assert(0);
   if (match_byte(0))
     {
@@ -544,6 +547,15 @@ match_DspSimpleText(void)
         match_byte_assert(0);
       match_zeros_assert(4);
     }
+  /* Followed by DspString or DspNumber. */
+}
+
+static void
+match_DspSimpleText(void)
+{                               /* 03 80 */
+  match_byte_assert(3);
+  match_byte_assert(0x80);
+  parse_DspSimpleText();
 }
 
 static void
@@ -562,12 +574,11 @@ parse_weirdness(void)
 }
 
 static void
-match_NavTreeViewItem(void)
+parse_NavTreeViewItem(void)
 {                               /* 07 80 */
-  match_byte_assert(7);
-  match_byte_assert(0x80);
+  int start_pos = pos;
   match_zeros_assert(1);
-  if (!match_byte(0) && !match_byte(7) && !match_byte(2))
+  if (!match_byte(0) && !match_byte(7) && !match_byte(2) && !match_byte(0xc))
     match_byte_assert(8);
   match_zeros_assert(3);
   pos++;
@@ -630,13 +641,22 @@ match_NavTreeViewItem(void)
         match_zeros_assert(3);
     }
   //fprintf(stderr, "%#x ", pos - 16);
+  hex_dump(stdout, start_pos, pos - start_pos);
+}
+
+static void
+match_NavTreeViewItem(void)
+{
+  match_byte_assert(7);
+  match_byte_assert(0x80);
+  parse_NavTreeViewItem();
 }
 
 static void
 parse_DspNumber(void)
 {
+  printf("%#x: DspNumber#%d(", pos, count++);
   match_byte_assert(1);
-  printf("DspNumber(");
   parse_format();
   match_byte_assert(0x80);
   match_byte(2);
@@ -647,7 +667,8 @@ parse_DspNumber(void)
 static void
 match_DspNumber(void)
 {
-  match_byte_assert(0x2a);
+  if (!match_byte(0x18) && !match_byte(0x19))
+    match_byte_assert(0x2a);
   match_byte_assert(0x80);
   parse_DspNumber();
 }
@@ -656,8 +677,6 @@ static void
 parse_DspCell(void)
 {
   match_byte_assert(0);
-  match_DspSimpleText();
-  parse_flexible();             /* DspString or DspNumber. */
 }
 
 static void
@@ -684,15 +703,78 @@ match_NavLog(void)
 }
 
 static void
-parse_PMModelItemInfo(void)
-{                               /* 54 80 */
-  match_byte_assert(0);
-  pos += 1;                     /* Counter */
-  match_zeros_assert(7);
-  pos += 3;
-  if (!match_byte(0))
-    match_byte_assert(0xe);
+parse_category(int j)
+{
+  get_u16(); match_byte_assert(0);
+  get_u16(); match_byte_assert(0);
+  match_u32_assert(j);
+  match_u32_assert(0);
+  if (get_u16() == 0xffff)
+    match_u16_assert(0xffff);
+  else
+    match_u16_assert(0x0e74);
   match_byte_assert(0);
+  match_DspSimpleText();
+  match_DspString();
+  match_u32_assert(0);
+}
+
+static void
+parse_dimension(int i)
+{
+  printf ("%#x: dimension %d\n", pos, i);
+  if (i == 0)
+    {
+      match_zeros_assert(5);
+      match_u32_assert(1);
+      get_u16(); match_u16_assert(0x0e74); match_byte_assert(0);
+      match_DspSimpleText();
+      match_DspString();
+
+      int n_categories = get_u32();
+      for (int j = 0; j < n_categories; j++)
+        parse_category(j);
+    }
+  else
+    {
+      match_zeros_assert(6);
+
+      int n_units16 = get_u32();
+      match_u16_assert(1);
+      for (int j = 0; j < n_units16; j++)
+        get_u16();
+
+      match_byte_assert(0);
+
+      int n_units32 = get_u32();
+      match_u16_assert(0);
+      for (int j = 0; j < n_units32; j++)
+        get_u32();
+
+      get_u16(); match_byte_assert(0);
+
+      get_u16(); match_byte_assert(0);
+      get_u16(); match_byte_assert(0);
+      match_u32_assert(0);
+      match_u32_assert(1);
+
+      get_u16(); match_u16_assert(0x0e74); match_byte_assert(0);
+      match_DspSimpleText();
+      match_DspString();
+
+      int n_categories = get_u32();
+      for (int j = 0; j < n_categories; j++)
+        parse_category(j);
+    }
+}
+
+static void
+parse_PMModelItemInfo(void)
+{
+  for (int i = 0; i < n_dims; i++)
+    parse_dimension(i);
+  printf("%#x: end of model\n", pos);
+  exit(0);
 }
 
 static void
@@ -701,8 +783,8 @@ match_PMModelItemInfo(void)
   match_byte_assert(0x54);
   match_byte_assert(0x80);
   parse_PMModelItemInfo();
-  match_DspSimpleText();
-  match_DspString();
+  /* DspSimpleText */
+  /* DspString */
 }
 
 static void
@@ -724,8 +806,7 @@ parse_NavHead(void)
   if (!match_byte(1))
     match_byte_assert(0);
   match_zeros_assert(3);
-  match_DspSimpleText();
-  parse_flexible();
+  /* DspSimpleText */
 }
 
 static void
@@ -807,29 +888,30 @@ static void
 parse_PVPivotView(void)
 {
   match_byte_assert(5);
-  match_zeros_assert(4);
+  printf ("PVPivotView(%d)\n", get_u32());
 }
 
 static void
 parse_NDimensional__DspCell(void)
 {
   match_byte_assert(0);
-  match_u32_assert(1);
+  n_dims = get_u32();
+  printf ("NDimensional__DspCell(n_dims=%d)\n", n_dims);
 }
 
 static void
 parse_IndexedCollection(void)
 {
-  match_byte_assert(0);
-  if (match_byte(0))
+  printf("IndexedCollection");
+  for (size_t i = 0; ; i++)
     {
-      match_zeros_assert(12);
-    }
-  else
-    {
-      get_u32();
+      match_byte_assert(0);
+      printf("%c%d", i ? 'x' : '(', get_u32());
       match_u16_assert(1);
+      if (!match_u16(0x8011))
+        break;
     }
+  printf(")\n");
 }
 
 static void
@@ -883,6 +965,22 @@ parse_PVCellStyle(void)
   match_zeros_assert(2);
 }
 
+static void
+skip_item(const char *name)
+{
+  int start_pos = pos;
+  printf("%#x: skipping %s bytes...", pos, name);
+  while (data[pos + 1] != 0x80
+         && !(data[pos] == 0xff && data[pos + 1] == 0xff
+              && data[pos + 2] == 0 && data[pos + 3] == 0))
+    {
+      assert(pos < n);
+      pos++;
+    }
+  printf("until %#x:", pos);
+  hex_dump(stdout, start_pos, pos - start_pos);
+}
+
 static void
 parse_flexible(void)
 {
@@ -891,14 +989,34 @@ parse_flexible(void)
     {
       match_u16_assert(0);
       char *heading = get_string2();
-      if (!strcmp(heading, "DspCell"))
+      printf("%#x: %s\n", pos, heading);
+      if (!strcmp(heading, "NavRoot"))
+        {
+          match_byte_assert(2);
+          match_zeros_assert(32);
+        }
+      else if (!strcmp(heading, "NavPivot"))
+        {
+          hex_dump(stdout, pos, 021);
+          pos += 0x21;
+        }
+      else if (!strcmp(heading, "DspCell"))
         parse_DspCell();
+      else if (!strcmp(heading, "DspSimpleText"))
+        parse_DspSimpleText();
       else if (!strcmp(heading, "DspNumber"))
         parse_DspNumber();
       else if (!strcmp(heading, "DspString"))
         parse_DspString();
       else if (!strcmp(heading, "NavHead"))
         parse_NavHead();
+      else if (!strcmp(heading, "NavTreeViewItem"))
+        {
+          if (0)
+            parse_NavTreeViewItem();
+          else
+            skip_item(heading);
+        }
       else if (!strcmp(heading, "IndexedCollection"))
         parse_IndexedCollection();
       else if (!strcmp(heading, "NavOleItem"))
@@ -929,6 +1047,8 @@ parse_flexible(void)
         parse_PVSeparatorStyle();
       else if (!strcmp(heading, "PVCellStyle"))
         parse_PVCellStyle();
+      else if (!strcmp(heading, "PVTextStyle"))
+        exit(0);
       else
         {
           fprintf(stderr, "don't know %s at offset 0x%x: ", heading, start);
@@ -938,7 +1058,7 @@ parse_flexible(void)
     }
   else if (data[pos + 1] == 0x80)
     {
-      if (data[pos] == 0x2a && data[pos + 1] == 0x80)
+      if ((data[pos] == 0x2a || data[pos] == 0x18 || data[pos] == 0x19) && data[pos + 1] == 0x80)
         match_DspNumber();
       else if (data[pos] == 0x27 && data[pos + 1] == 0x80)
         match_DspCell();
@@ -953,8 +1073,10 @@ parse_flexible(void)
         {
           /* 3c 80 */
           /* 39 80 */
+          printf("%#x: %02x %02x ", pos, data[pos], data[pos + 1]);
           pos += 2;
           parse_format();
+          printf ("\n");
 /*      match_byte_assert(0x01);
         match_byte_assert(0x02);
         match_byte_assert(0x0d); */
@@ -966,7 +1088,7 @@ parse_flexible(void)
           if (match_byte(2))
             {
               printf ("15 80(%f", get_double());
-              printf (" %s)\n", get_string1());
+              printf (" \"%s\")\n", get_string1());
               if (match_byte(1))
                 {
                   match_byte_assert(0);
@@ -987,8 +1109,6 @@ parse_flexible(void)
               match_byte_assert(0);
               if (match_u32(0xc))
                 match_u16_assert(1);
-              else
-                match_zeros_assert(13);
             }
         }
       else if (data[pos] == 0x9 && data[pos + 1] == 0x80)
@@ -999,10 +1119,21 @@ parse_flexible(void)
         match_NavOleItem();
       else if (data[pos] == 0x11 || data[pos] == 0x13)
         {
+          int type = data[pos];
           pos += 2;
           match_byte_assert(0);
-          if (match_u32(0xc) || match_u32(0xd))
-            match_u16_assert(1);
+          if (data[pos] != 0)
+            {
+              int x = get_u32();
+              int y = get_u16();
+              if (y == 0)
+                {
+                  int index = get_u32();
+                  printf("%02x 80(footnote %d)\n", type, index);
+                }
+              else
+                printf("%02x 80(%d %d)\n", type, x, y);
+            }
           else
             match_zeros_assert(13);
         }
@@ -1058,8 +1189,11 @@ parse_flexible(void)
                data[pos] == 0x3e ||
                data[pos] == 0x46)
         {
+          printf ("%#x: %02x %02x(%02x %02x %02x)\n",
+                  pos, data[pos], data[pos + 1],
+                  data[pos + 2], data[pos + 3], data[pos + 4]);
           pos += 2;
-          parse_format();
+          pos += 3;
         }
       else
         {
@@ -1129,15 +1263,20 @@ parse_flexible(void)
         }
     }
 #endif
-  else //if (match_u16(2) || match_u16(3) || match_u16(4) || match_u16(5) || match_u16(6) || match_u16(7) || match_u16(8) || match_u16(9))
+  else if (match_u16(1))
     {
-      while (data[pos + 1] != 0x80
-             && (data[pos] != 0xff || data[pos + 1] != 0xff))
-        {
-          assert(pos < n);
-          pos++;
-        }
+      int start_pos = pos;
+      char *title = get_string1();
+      printf("%#x: title(\"%s\", ", start_pos, title);
+      match_u32_assert(0);
+      char *id = get_string1();
+      printf("\"%s\")\n", id);
+      match_byte_assert(0);
+      match_u32_assert(3);
+      match_u16_assert(1);
     }
+  else //if (match_u16(2) || match_u16(3) || match_u16(4) || match_u16(5) || match_u16(6) || match_u16(7) || match_u16(8) || match_u16(9))
+    skip_item("unknown");
 #if 0
   else if (match_byte(7) || match_byte(4) || match_byte(5) || match_byte(6) || match_byte(8) || match_byte(9) || match_byte(0xb) || match_byte(0xc) || match_byte(0x15) || match_byte(0x16) || match_byte(0x17) || match_byte(0x18) || match_byte(0x1e)  || match_byte(0x1a))
     {
@@ -1268,7 +1407,7 @@ main(int argc, char *argv[])
     data[n + i] = i % 2 ? 0xaa : 0x55;
   close(fd);
 
-  setvbuf (stdout, NULL, _IOLBF, 0);
+  setvbuf (stdout, NULL, _IONBF, 0);
 
   match_byte_assert(4);
   match_u32_assert(0);
@@ -1276,6 +1415,18 @@ main(int argc, char *argv[])
   match_u32_assert(1);
   match_byte_assert(0x63);
 
+  for (;;)
+    {
+      if (data[pos] == 0)
+        {
+          //printf("zero\n");
+          pos++;
+        }
+      else
+        parse_flexible();
+    }
+  exit(0);
+
   parse_heading("NavRoot");
   match_byte_assert(2);
   match_zeros_assert(32);
@@ -1343,7 +1494,10 @@ main(int argc, char *argv[])
   for (;;)
     {
       if (data[pos] == 0)
-        pos++;
+        {
+          //printf("zero\n");
+          pos++;
+        }
       else
         parse_flexible();
     }
@@ -1427,7 +1581,10 @@ main(int argc, char *argv[])
   while (data[pos] != 1)
     {
       if (data[pos] == 0)
-        pos++;
+        {
+          printf("zero\n");
+          pos++;
+        }
       else
         parse_flexible();
     }
index 95b212e0522d2e5e923bf25fa6f4dff1199d30b3..b14c001cc8a5eeac98f764ce35e6070bcf023287 100644 (file)
--- a/spo-notes
+++ b/spo-notes
@@ -204,7 +204,7 @@ NavTitle  02 00 00 00 00 00 00 00 00 18 00 00 00 03 .. .. .. 00 04 00 00 .. .. f
 80 02 <double>
 80 01 02 28 05 00 01 <len1> <string>
 80 01 02 28 05 00 01 ff <len2> <string>
-80 01 03 28 05 80 02 <double> 
+80 01 03 28 05 80 02 <double>
 
 80 00 03
 80 00 00 00 00 00 00 00 00 00 00 ..
@@ -255,7 +255,7 @@ ZMAW_zaj3.dump
 ----------------------------------------------------------------------
 
 rec:PMModelItemInfo 00
- .. .. .. .. .. .. .. .. .. .. .. .. cell F40.2 "Contents"                           07 .. .. .. 55 80 .. 57 80 .. 
+ .. .. .. .. .. .. .. .. .. .. .. .. cell F40.2 "Contents"                           07 .. .. .. 55 80 .. 57 80 ..
  00 .. .. .. .. .. .. .. 07 .. 74 0e cell F40.2   "Output Created"                   .. .. .. .. 55 80 .. 57 80 ..
  01 .. .. .. .. .. .. .. 08 .. 74 0e cell F40.2   "Comments"                         .. .. .. .. 55 80 .. 57 80 ..
  .. .. .. .. .. .. .. .. .. .. .. .. cell F40.2   "Input"                            06 .. .. .. 55 80 .. 57 80 ..
@@ -264,7 +264,7 @@ rec:PMModelItemInfo 00
  04 .. .. .. .. .. .. .. 0e .. 74 0e cell F40.2     "Filter"                         .. .. .. .. 55 80 .. 57 80 ..
  05 .. .. .. .. .. .. .. 11 .. 74 0e cell F40.2     "Weight"                         .. .. .. .. 55 80 .. 57 80 ..
  06 .. .. .. .. .. .. .. 12 .. 74 0e cell F40.2     "Split File"                     .. .. .. .. 55 80 .. 57 80 ..
- 07 .. .. .. .. .. .. .. 13 .. 74 0e cell F40.2     "N of Rows in Working Data File" .. .. .. .. 55 80 .. 57 80 .. 
+ 07 .. .. .. .. .. .. .. 13 .. 74 0e cell F40.2     "N of Rows in Working Data File" .. .. .. .. 55 80 .. 57 80 ..
  .. .. .. .. .. .. .. .. .. .. .. .. cell F40.2   "Missing Value Handling"           02 .. .. .. 55 80 .. 57 80 ..
  08 .. .. .. .. .. .. .. .. .. .. .. cell F40.2     "Definition of Missing"          .. .. .. .. 55 80 .. 57 80 ..
  09 .. .. .. .. .. .. .. .. .. .. .. cell F40.2     "Cases Used"                     .. .. .. .. 55 80 .. 57 80 ..
@@ -727,7 +727,7 @@ When the top-level "Output" node is selected for save:
 (This is a valid spot for the file to contain 00000000 then eof)
 
 02ee   ffff 0000 "NavLog"
-02fa   02 i0*2 i24 
+02fa   02 i0*2 i24
 0307   (i0 | i-40) (i691 | i987) (2-3 digit negative int) i1
 0317   i0
 0318   03 80 00*10
@@ -1068,7 +1068,7 @@ Just past "Cluster", using boot/Contents as exemplary:
 
 Notes
 Output Created         16-JAN-2008 02:45:55
-Comments                
+Comments
 Input  Data    \\Ugly\amead\consulting\center\Dell\Exams\RE\analyses\Blended15\pilotdata-2008-01-15.csv
        Active Dataset  raw1
        Filter  <none>
@@ -1077,6 +1077,519 @@ Input   Data    \\Ugly\amead\consulting\center\Dell\Exams\RE\analyses\Blended15\pilot
        N of Rows in Working Data File  366
 Missing Value Handling Definition of Missing   User-defined missing values are treated as missing.
        Cases Used      Statistics are based on all cases with valid data.
-Syntax         FREQUENCIES\r  VARIABLES=exam_id exam_name restarts\r  /ORDER=  ANALYSIS .\r
+Syntax         FREQUENCIES\r  VARIABLES=exam_id exam_name restarts\r  /ORDER=  ANALYSIS .
 Resources      Elapsed Time    0:00:00.02
        Processor Time  0:00:00.03
+
+NavRoot appears to be a container node in the tree
+(not necessarily the actual root of the tree though).
+
+descriptives-only.spo
+ffff 0000  "DspNumber"
+01
+F40.5 80 02 257.0 "257"
+11 80 00 01 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00
+
+18 80
+01
+F40.5 80 02 1.0 "1"
+11 80 00 01 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00
+
+18 80
+01
+F40.5 80 02 3.0 "3"
+11 80 00 01 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00
+
+18 80
+01
+F40.2 80 02 1.13 "1.13"
+11 80 00 01 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+
+01
+F40.3 80 02 .383 ".383"
+11 80 00 02 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+
+01
+F40.3 80 02 2.986 "2.986"
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+
+01
+F40.3 80 02 .152 ".152"
+11 80 00 02 00 00 00 01 00
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+
+01
+F40.3 80 02 8.794 "8.794"
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+
+01
+F40.3 80 02 .303 ".303"
+11 80 00 07 00 00 00 01 00
+11 80 00 01 00 00 00 01 00
+
+15 80 00
+03 80 00 00 00 00 00 00 00 00 00 00 18 80
+01
+F40.5 80 02
+
+descriptives-only.spo:
+ffff 0000 "PMModelItemInfo"
+
+-- DIMENSION 1 --
+00
+00 00 00 00
+
+01 00 00 00
+13 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 "Stat Type" i2     # <- number of children
+
+13 84 00
+15 84 00
+00 00 00 00
+00 00 00 00
+14 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Statistic" i0
+
+13 84 00
+15 84 00
+01 00 00 00
+00 00 00 00
+17 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Std. Error" i0
+
+-- DIMENSION 2 --
+
+00 00
+
+00 00 00 00
+i2    # <-- number of 2-byte units below
+01 00
+19 04, 1d 04
+
+00
+
+i2    # <-- number of 4-byte units below
+00 00
+i0, i1
+
+11 84 00
+
+13 84 00
+15 84 00
+00 00 00 00
+01 00 00 00
+15 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Statistics" i7
+
+13 84 00
+15 84 00
+00 00 00 00
+00 00 00 00
+10 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "N" i0
+
+13 84 00
+15 84 00
+01 00 00 00
+00 00 00 00
+0e 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Minimum" i0
+
+13 84 00
+15 84 00
+02 00 00 00
+00 00 00 00
+0c 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Maximum" i0
+
+13 84 00
+15 84 00
+03 00 00 00
+00 00 00 00
+0d 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Mean" i0
+
+13 84 00
+15 84 00
+04 00 00 00
+00 00 00 00
+16 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Std. Deviation" i0
+
+13 84 00
+15 84 00
+05 00 00 00
+00 00 00 00
+12 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Skewness" i0
+
+13 84 00
+15 84 00
+06 00 00 00
+00 00 00 00
+0b 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Kurtosis" i0
+
+-- DIMENSION 3 --
+
+00 00 00 00 00 00
+i7       # <- number of 2-byte units below
+01 00
+26 04, 2a 04, 2e 04, 32 04, 36 04, 3a 04, 3e 04
+
+00
+
+i7       # <- number of 4-byte units below
+00 00
+i0, i1, i2, i3, i4, i5, i6
+
+11 84 00
+
+13 84 00
+15 84 00
+00 00 00 00
+01 00 00 00
+1a 07 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Variables" i30
+
+13 84 00
+15 84 00
+00 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "Race" i0
+
+13 84 00
+15
+
+
+
+IndexedCollection: correlations-only (8x19x3)
+00 08 00 00 00 01 00 11 80
+00 13 00 00 00 01 00 11 80
+00 03 00 00 00 01 00
+descriptives-only (30x7x1)
+00 1e 00 00 00 01 00 11 80
+00 07 00 00 00 01 00 11 80
+00 01 00 00 00 01 00
+
+correlations-only.spo:
+ffff 0000 "PMModelItemInfo"
+
+-- DIMENSION 1 --
+00
+00 00 00 00
+
+01 00 00 00
+91 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Statistics" i3
+
+1b 86 00
+1d 86 00
+00 00 00 00
+00 00 00 00
+98 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Pearson Correlation" i0
+
+1b 86 00
+1d 86 00
+01 00 00 00
+00 00 00 00
+99 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Sig. (2-tailed)" i0
+
+1b 86 00
+1d 86 00
+02 00 00 00
+00 00 00 00
+94 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "N" i0
+
+-- DIMENSION 2 --
+
+00 00
+
+00 00 00 00
+i3     # <-- number of 2-byte units below
+01 00
+21 06, 25 06, 29 06
+00
+
+i3     # <-- number of 4-byte units below
+00 00
+i0, i1, i2
+
+19 86 00
+
+1b 86 00
+1d 86 00
+00 00 00 00
+01 00 00 00
+90 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Variables" i19
+
+1b 86 00
+1d 86 00
+00 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "OC" i0
+
+1b 86 00
+1d 86 00
+01 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "MA" i0
+
+1b 86 00
+1d 86 00
+02 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "SPL" i0
+
+1b 86 00
+1d 86 00
+03 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "EX" i0
+
+1b 86 00
+1d 86 00
+04 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "A" i0
+
+1b 86 00
+1d 86 00
+05 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "TM" i0
+
+1b 86 00
+1d 86 00
+06 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "IND" i0
+
+1b 86 00
+1d 86 00
+07 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "SC" i0
+
+1b 86 00
+1d 86 00
+08 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 "DOMINANT" i0
+
+1b 86 00
+1d 86 00
+09 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "PARTICIPATIVE" i0
+
+1b 86 00
+1d 86 00
+0a 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "AFFABLE" i0
+
+1b 86 00
+1d 86 00
+0b 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "DUTIFUL" i0
+
+1b 86 00
+1d 86 00
+0c 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "ORDERLY" i0
+
+1b 86 00
+1d 86 00
+0d 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "COMPETENT" i0
+
+1b 86 00
+1d 86 00
+0e 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "AGGRESSIVE" i0
+
+1b 86 00
+1d 86 00
+0f 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "DISTRUSTFUL" i0
+
+1b 86 00
+1d 86 00
+10 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "ARTISTIC" i0
+
+1b 86 00
+1d 86 00
+11 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "VISIONARY" i0
+
+1b 86 00
+1d 86 00
+12 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "CALM" i0
+
+-- DIMENSION 3 --
+
+00 00
+
+00 00 00 00
+i19     # <- number of 2-byte units below
+01 00
+32 06, 36 06, 3a 06, 3e 06, 42 06, 46 06, 4a 06, 4e 06, 52 06, 56 06, 5a 06, 5e 06, 62 06, 66 06, 6a 06, 6e 06, 72 06, 76 06, 7a 06 
+
+00
+
+i19    # <- number of 4-byte units below
+00 00
+i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18
+
+19 86 00
+
+1b 86 00
+1d 86 00
+00 00 00 00
+01 00 00 00
+95 1a 74 0e 00
+03 80 00 00 00 00 00 00 00 00 00 00
+05 80 01 F40.2 00 01 "Variables" i8
+
+1b 86 00
+1d 86 00
+00 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "Quick learner" i0
+
+1b 86 00
+1d 86 00
+01 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "Work ethic" i0
+
+1b 86 00
+1d 86 00
+02 00 00 00
+00 00 00 00
+ff ff ff ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01 F40.2 00 01 "Team-orientation"
+00 00 00 00 1b 86
+00 1d 86 00 03 00 00 00 00 00 00 00 ff ff ff ff
+00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01
+F40.2 00 01 "Confidence/Resilience"
+00 00 00 00 1b
+86 00 1d 86 00 04 00 00 00 00 00 00 00 ff ff ff
+ff 00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80
+01 F40.2 00 01 "Initiative"
+00 00 00 00 1b 86 00 1d 86 00 05 00 00 00 00
+00 00 00 ff ff ff ff 00
+03 80 00 00 00 00 00 10
+00 00 00 00
+05 80 01 F40.2 00 01 "Conscientious"
+00 00 00 00 1b 86
+00 1d 86 00 06 00 00 00 00 00 00 00 ff ff ff ff
+00
+03 80 00 00 00 00 00 10 00 00 00 00
+05 80 01
+F40.2 00 01 "Perseverance"
+00 00 00 00 1b 86 00 1d 86 00 07 00 00 00
+00 00 00 00 ff ff ff ff 00
+03 80 00 00 00 00 00
+10 00 00 00 00
+05 80 01 F40.2 00 01 "Overall"
+00 00 00 00 00 00 00 00 00 00 08
+00 00 00 01 00 83 06 87 06 8b 06 8f 06 93 06 97
+06 9b 06 9f 06 00 08 00 00 00 00 00 00 00 00 00
+01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
+05 00 00 00 06 00 00 00 07 00 00 00 00 02 00 00
+00 01 00