Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h	(revision 10997)
@@ -91,5 +91,5 @@
   virtual ~SsrCorr();
   virtual void setCorBase() = 0;
-  virtual void setCorOffset() = 0;
+  virtual void setCorType() = 0;
   virtual void setCoType() = 0;
   virtual void setCbType() = 0;
@@ -120,4 +120,7 @@
   CorOffset COBOFS_PBIAS;
   CorOffset COBOFS_URA;
+  CorOffset COBOFS_PBEXT;
+  CorOffset COBOFS_SATANT;
+  CorOffset COBOFS_REGIONO;
   CorOffset COBOFS_NUM;
 
@@ -324,4 +327,23 @@
   QList<CorBase> corbase;
   QList<unsigned int> satoffset;
+
+  /* corType[sys][kind] -> RTCM/IGS message number, 0 = not defined for that
+     satellite system. Built by setCorType(); replaces per-subclass base+offset
+     arithmetic so GetSSR/Make* can look a message number up (or emit one)
+     without hand-rolled index math. */
+  QList<QList<unsigned int> > corType;
+
+  bool lookupCorType(unsigned int msgNumber, unsigned int &sys, unsigned int &kind) const {
+    for (int s = 0; s < corType.size(); ++s) {
+      for (int k = 0; k < corType[s].size(); ++k) {
+        if (msgNumber && corType[s][k] == msgNumber) {
+          sys = s;
+          kind = k;
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 
 
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp	(revision 10997)
@@ -20,5 +20,5 @@
 SsrCorrIgs::SsrCorrIgs() {
     setCorBase();
-    setCorOffset();
+    setCorType();
     setCoType();
     setCbType();
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h	(revision 10997)
@@ -37,5 +37,5 @@
   }
 
-  void setCorOffset() {
+  void setCorType() {
     COBOFS_ORBIT    = 0; // GPS: IM21
     COBOFS_CLOCK    = 1; // GPS: IM22
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp	(revision 10997)
@@ -20,5 +20,5 @@
   SsrCorrRtcm::SsrCorrRtcm() {
     setCorBase();
-    setCorOffset();
+    setCorType();
     setCoType();
     setCbType();
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h	(revision 10997)
@@ -36,5 +36,5 @@
   };
 
-  void setCorOffset() {
+  void setCorType() {
     COBOFS_ORBIT     = 0;
     COBOFS_CLOCK     = 1;
@@ -99,9 +99,9 @@
     PBTYPE_BASE    = 1265;
     PBTYPE_GPS     = PBTYPE_BASE;
-    PBTYPE_GLONASS = PBTYPE_GPS++;
-    PBTYPE_GALILEO = PBTYPE_GLONASS++;
-    PBTYPE_QZSS    = PBTYPE_GALILEO++;
-    PBTYPE_SBAS    = PBTYPE_QZSS++;
-    PBTYPE_BDS     = PBTYPE_SBAS++;
+    PBTYPE_GLONASS = PBTYPE_BASE + 1;
+    PBTYPE_GALILEO = PBTYPE_BASE + 2;
+    PBTYPE_QZSS    = PBTYPE_BASE + 3;
+    PBTYPE_SBAS    = PBTYPE_BASE + 4;
+    PBTYPE_BDS     = PBTYPE_BASE + 5;
     PBTYPE_AUTO = 0;
   };
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp	(revision 10997)
@@ -20,5 +20,4 @@
 SsrCorrRtcmNew::SsrCorrRtcmNew() {
   setCorBase();
-  setCorOffset();
   setCoType();
   setCbType();
@@ -32,4 +31,5 @@
   setMetaDataType();
   setCodeType();
+  setCorType(); /* must run after the type setters above: it reads their constants */
 
   satoffset << CLOCKORBIT_OFFSETGPS
@@ -45,5 +45,5 @@
 size_t SsrCorrRtcmNew::MakeClockOrbit(const struct ClockOrbit *co, ClockOrbitType type,
     int moremessagesfollow, char *buffer, size_t size) {
-  std::vector< std::vector<unsigned int> > status(CLOCKORBIT_SATNUM, std::vector<unsigned int>(COBOFS_NUM));
+  std::vector< std::vector<unsigned int> > status(CLOCKORBIT_SATNUM, std::vector<unsigned int>(COBOFS_MAXNUM));
   unsigned int i, s;
 
@@ -53,6 +53,6 @@
 
   for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
-    for (i = 0; i < COBOFS_NUM; ++i) {
-      if (co->NumberOfSat[s] && (type == COTYPE_AUTO || type == corbase[s] + i) && (co->Supplied[i] || 
+    for (i = 0; i < COBOFS_MAXNUM; ++i) {
+      if (co->NumberOfSat[s] && (type == COTYPE_AUTO || type == corType[s][i]) && (co->Supplied[i] ||
         (i <= COBOFS_CLOCK &&  co->Supplied[COBOFS_COMBINED]) ||
            (i == COBOFS_COMBINED && co->Supplied[COBOFS_ORBIT] && co->Supplied[COBOFS_CLOCK]))) {
@@ -68,5 +68,5 @@
     if (status[s][COBOFS_ORBIT]) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_ORBIT)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_ORBIT])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -128,5 +128,5 @@
     if (status[s][COBOFS_CLOCK]) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_CLOCK)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_CLOCK])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -169,5 +169,5 @@
 #endif
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_COMBINED)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_COMBINED])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -248,5 +248,5 @@
     if (status[s][COBOFS_HR]) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_HR)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_HR])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -275,5 +275,5 @@
     if (status[s][COBOFS_URA]) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_URA)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_URA])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -311,7 +311,7 @@
 
   for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
-    if (b->NumberOfSat[s] && (type == CBTYPE_AUTO || type == corbase[s] + COBOFS_CBIAS)) {
+    if (b->NumberOfSat[s] && (type == CBTYPE_AUTO || type == corType[s][COBOFS_CBIAS])) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(corbase[s] + COBOFS_CBIAS)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_CBIAS])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -358,7 +358,7 @@
        Extended Satellite Phase Bias Message shall be sent BEFORE the corresponding 
        Satellite Phase Bias Message */
-    if (b->NumberOfSat[s] && (type == PBEXTTYPE_AUTO || type == s + PBEXTTYPE_AUTO)) {
+    if (b->NumberOfSat[s] && (type == PBEXTTYPE_AUTO || type == corType[s][COBOFS_PBEXT])) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(s + PBEXTTYPE_AUTO)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_PBEXT])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -385,7 +385,7 @@
     }
     /* Satellite Phase Bias Message */
-    if (b->NumberOfSat[s] && (type == PBTYPE_AUTO || type == s + PBTYPE_BASE)) {
+    if (b->NumberOfSat[s] && (type == PBTYPE_AUTO || type == corType[s][COBOFS_PBIAS])) {
       INITBLOCK
-      E_RTCM_MESSAGE_NUMBER(s + PBTYPE_BASE)
+      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_PBIAS])
       switch (s) {
         case CLOCKORBIT_SATGPS:
@@ -554,29 +554,35 @@
   }
 
-  for (s = CLOCKORBIT_SATNUM; s-- > 0;) {
-    if (type == PBTYPE_BASE + s) {
-      if (!pb)
-        return GCOBR_NOPHASEBIASPARAMETER;
-      pb->messageType = type;
-      switch (s) {
-        case CLOCKORBIT_SATGPS:
-        case CLOCKORBIT_SATGALILEO:
-        case CLOCKORBIT_SATQZSS:
-        case CLOCKORBIT_SATSBAS:
-        case CLOCKORBIT_SATBDS:
-          D_GPS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
-          break;
-        case CLOCKORBIT_SATGLONASS:
-          D_GLONASS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
-          break;
-      }
-      D_SSR_UPDATE_INTERVAL(pb->UpdateInterval)
-      D_MULTIPLE_MESSAGE_INDICATOR(mmi)
-      D_SSR_IOD(pb->SSRIOD)
-      D_SSR_PROVIDER_ID(pb->SSRProviderID)
-      D_SSR_SOLUTION_ID(pb->SSRSolutionID)
-      D_YAW_INFO_INDICATOR(pb->SatelliteYawInformationIndicator)
-      D_EXTENDED_PHASE_BIAS_ID(pb->ExtendedPhaseBiasPropertyID)
-      D_NO_OF_SATELLITES(nums)
+  {
+    unsigned int kind;
+    if (!lookupCorType(type, s, kind))
+      return GCOBR_UNKNOWNTYPE;
+
+    /* COBOFS_* are per-instance (set in setCorType()), not compile-time
+       constants, so this has to be an if/else-if chain rather than a switch. */
+    if (kind == COBOFS_PBIAS) {
+          if (!pb)
+            return GCOBR_NOPHASEBIASPARAMETER;
+          pb->messageType = type;
+          switch (s) {
+            case CLOCKORBIT_SATGPS:
+            case CLOCKORBIT_SATGALILEO:
+            case CLOCKORBIT_SATQZSS:
+            case CLOCKORBIT_SATSBAS:
+            case CLOCKORBIT_SATBDS:
+              D_GPS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
+              break;
+            case CLOCKORBIT_SATGLONASS:
+              D_GLONASS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
+              break;
+          }
+          D_SSR_UPDATE_INTERVAL(pb->UpdateInterval)
+          D_MULTIPLE_MESSAGE_INDICATOR(mmi)
+          D_SSR_IOD(pb->SSRIOD)
+          D_SSR_PROVIDER_ID(pb->SSRProviderID)
+          D_SSR_SOLUTION_ID(pb->SSRSolutionID)
+          D_YAW_INFO_INDICATOR(pb->SatelliteYawInformationIndicator)
+          D_EXTENDED_PHASE_BIAS_ID(pb->ExtendedPhaseBiasPropertyID)
+          D_NO_OF_SATELLITES(nums)
 #ifdef BNC_DEBUG_SSR
           fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d dispInd %d mwInd %d\n",
@@ -585,18 +591,18 @@
 				  pb->DispersiveBiasConsistencyIndicator, pb->MWConsistencyIndicator);
 #endif
-      for (i = 0; i < nums; ++i) {
-        D_GPS_SATELLITE_ID(id)
-        for (pos = satoffset[s];
-            pos < satoffset[s] + pb->NumberOfSat[s] && pb->Sat[pos].ID != id;
-            ++pos)
-          ;
-        if (pos >= satoffset[s + 1])
-          return GCOBR_DATAMISMATCH;
-        else if (pos == pb->NumberOfSat[s] + satoffset[s])
-          ++pb->NumberOfSat[s];
-        pb->Sat[pos].ID = id;
-        D_NO_OF_BIASES(pb->Sat[pos].NumberOfPhaseBiases)
-        D_YAW_ANGLE(pb->Sat[pos].YawAngle)
-        D_YAW_RATE(pb->Sat[pos].YawRate)
+          for (i = 0; i < nums; ++i) {
+            D_GPS_SATELLITE_ID(id)
+            for (pos = satoffset[s];
+                pos < satoffset[s] + pb->NumberOfSat[s] && pb->Sat[pos].ID != id;
+                ++pos)
+              ;
+            if (pos >= satoffset[s + 1])
+              return GCOBR_DATAMISMATCH;
+            else if (pos == pb->NumberOfSat[s] + satoffset[s])
+              ++pb->NumberOfSat[s];
+            pb->Sat[pos].ID = id;
+            D_NO_OF_BIASES(pb->Sat[pos].NumberOfPhaseBiases)
+            D_YAW_ANGLE(pb->Sat[pos].YawAngle)
+            D_YAW_RATE(pb->Sat[pos].YawRate)
 #ifdef BNC_DEBUG_SSR
             fprintf(stderr, "id %2d #%d y %10.6f yr %10.6f ",
@@ -604,33 +610,25 @@
 					pb->Sat[pos].YawAngle/MPI, pb->Sat[pos].YawRate/MPI);
 #endif
-        for (j = 0; j < pb->Sat[pos].NumberOfPhaseBiases; ++j) {
-          D_GNSS_SIGNAL_IDENTIFIER(pb->Sat[pos].Biases[j].Type)
-          D_INTEGER_INDICATOR(pb->Sat[pos].Biases[j].IntegerIndicator)
-         // D_WIDE_LANE_INDICATOR(pb->Sat[pos].Biases[j].WidelaneGroupIndicator)
-          D_DISCONTINUITY_COUNTER(pb->Sat[pos].Biases[j].DiscontinuityCounter)
-          D_PHASE_BIAS_CORRECTION(pb->Sat[pos].Biases[j].Bias)
-#ifdef BNC_DEBUG_SSR
-            fprintf(stderr, "t%02d int %d /*wl %d*/ disc %d b %8.4f ",
-                    pb->Sat[pos].Biases[j].Type,
-					pb->Sat[pos].Biases[j].IntegerIndicator,
-					//pb->Sat[pos].Biases[j].WidelaneGroupIndicator,
-					pb->Sat[pos].Biases[j].DiscontinuityCounter,
-					pb->Sat[pos].Biases[j].Bias);
-#endif
-        }
+            for (j = 0; j < pb->Sat[pos].NumberOfPhaseBiases; ++j) {
+              D_GNSS_SIGNAL_IDENTIFIER(pb->Sat[pos].Biases[j].Type)
+              D_INTEGER_INDICATOR(pb->Sat[pos].Biases[j].IntegerIndicator)
+             // D_WIDE_LANE_INDICATOR(pb->Sat[pos].Biases[j].WidelaneGroupIndicator)
+              D_DISCONTINUITY_COUNTER(pb->Sat[pos].Biases[j].DiscontinuityCounter)
+              D_PHASE_BIAS_CORRECTION(pb->Sat[pos].Biases[j].Bias)
+#ifdef BNC_DEBUG_SSR
+              fprintf(stderr, "t%02d int %d /*wl %d*/ disc %d b %8.4f ",
+                      pb->Sat[pos].Biases[j].Type,
+					  pb->Sat[pos].Biases[j].IntegerIndicator,
+					  //pb->Sat[pos].Biases[j].WidelaneGroupIndicator,
+					  pb->Sat[pos].Biases[j].DiscontinuityCounter,
+					  pb->Sat[pos].Biases[j].Bias);
+#endif
+            }
 #ifdef BNC_DEBUG_SSR
             fprintf(stderr, "\n");
 #endif
-      }
-#ifdef BNC_DEBUG_SSR
-      for(type = 0; type < (unsigned int)size && (unsigned char)buffer[type] != 0xD3; ++type)
-      numbits += 8;
-      fprintf(stderr, "numbits left %d\n",numbits);
-#endif
-      return mmi ? GCOBR_MESSAGEFOLLOWS : GCOBR_OK;
-    }
-    else if (type >= corbase[s]) {
-      unsigned int corrOffset = type - corbase[s];
-      if      (corrOffset == COBOFS_ORBIT) {
+          }
+    }
+    else if (kind == COBOFS_ORBIT) {
           if (!co)
             return GCOBR_NOCLOCKORBITPARAMETER;
@@ -708,6 +706,6 @@
 #endif
           }
-      }
-      else if (corrOffset == COBOFS_CLOCK) {
+    }
+    else if (kind == COBOFS_CLOCK) {
           if (!co)
             return GCOBR_NOCLOCKORBITPARAMETER;
@@ -758,6 +756,6 @@
 #endif
           }
-      }
-      else if (corrOffset == COBOFS_COMBINED) {
+    }
+    else if (kind == COBOFS_COMBINED) {
           if (!co)
             return GCOBR_NOCLOCKORBITPARAMETER;
@@ -839,6 +837,6 @@
 #endif
           }
-      }
-      else if (corrOffset == COBOFS_URA) {
+    }
+    else if (kind == COBOFS_URA) {
           if (!co)
             return GCOBR_NOCLOCKORBITPARAMETER;
@@ -885,6 +883,6 @@
 #endif
           }
-      }
-      else if (corrOffset == COBOFS_HR) {
+    }
+    else if (kind == COBOFS_HR) {
           if (!co)
             return GCOBR_NOCLOCKORBITPARAMETER;
@@ -931,6 +929,6 @@
 #endif
           }
-      }
-      else if (corrOffset == COBOFS_CBIAS) {
+    }
+    else if (kind == COBOFS_CBIAS) {
           if (!b)
             return GCOBR_NOCODEBIASPARAMETER;
@@ -987,17 +985,18 @@
 #endif
           }
-      }
-      else {
-          continue;
-      }
-#ifdef BNC_DEBUG_SSR
-      for(type = 0; type < (unsigned int)size && (unsigned char)buffer[type] != 0xD3; ++type)
-      numbits += 8;
-      fprintf(stderr, "numbits left %d\n",numbits);
-#endif
-      return mmi ? GCOBR_MESSAGEFOLLOWS : GCOBR_OK;
-    }
-  }
-  return GCOBR_UNKNOWNTYPE;
+    }
+    else {
+      /* COBOFS_PBEXT / COBOFS_SATANT / COBOFS_REGIONO: message numbers are
+         recognized (see setCorType()) but decoding is not implemented yet */
+      return GCOBR_UNKNOWNTYPE;
+    }
+
+#ifdef BNC_DEBUG_SSR
+    for(type = 0; type < (unsigned int)size && (unsigned char)buffer[type] != 0xD3; ++type)
+    numbits += 8;
+    fprintf(stderr, "numbits left %d\n",numbits);
+#endif
+    return mmi ? GCOBR_MESSAGEFOLLOWS : GCOBR_OK;
+  }
 }
 
Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h	(revision 10996)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h	(revision 10997)
@@ -27,13 +27,5 @@
     COBBASE_QZSS    =   64;
     COBBASE_NUM     =    5;
-    corbase
-        << COBBASE_GPS
-        << COBBASE_GLONASS
-        << COBBASE_GALILEO
-        << COBBASE_BDS
-        << COBBASE_QZSS;
-  };
-
-  void setCorOffset() { };
+  };
 
   void setCoType() {
@@ -221,4 +213,61 @@
   }
 
+  /* Builds corType[sys][kind] from the COTYPE_, CBTYPE_, PBTYPE_, PBEXTTYPE_,
+     SATANTTYPE_ and REGIONOTYPE_ constants computed above, so GetSSR/Make can
+     look up or emit a message number with a single table access instead of
+     base+offset arithmetic. Must run after setCoType/setCbType/setPbType/
+     setPbExtType/setSatAntType/setRegIonoType have filled those constants -
+     see the call order in the constructor.
+     GPS, GLONASS, GALILEO, QZSS and BDS are supported; SBAS has no new-RTCM-SSR
+     messages defined, so its row is left all-zero (0 = undefined). GRID, Tropo,
+     Metadata and VTEC are single global message numbers, not per-system, so
+     they are handled directly against their BASE constant instead of via this
+     table (VTEC already is, at the top of GetSSR). */
+  void setCorType() {
+    COBOFS_ORBIT    = 0;
+    COBOFS_CLOCK    = 1;
+    COBOFS_COMBINED = 2;
+    COBOFS_HR       = 3;
+    COBOFS_CBIAS    = 4;
+    COBOFS_PBIAS    = 5;
+    COBOFS_URA      = 6;
+    COBOFS_PBEXT    = 7;
+    COBOFS_SATANT   = 8;
+    COBOFS_REGIONO  = 9;
+    COBOFS_NUM      = 10;
+
+    corType.clear();
+    for (int s = 0; s < CLOCKORBIT_SATNUM; ++s) {
+      corType << QList<unsigned int>();
+      for (unsigned int k = 0; k < COBOFS_NUM; ++k) {
+        corType[s] << 0;
+      }
+    }
+
+    struct SysRow {
+      int sys;
+      unsigned int orbit, clock, combined, hr, cbias, ura, pbias, pbext, satant, regiono;
+    };
+    const SysRow rows[] = {
+      { CLOCKORBIT_SATGPS,     COTYPE_GPSORBIT,     COTYPE_GPSCLOCK,     COTYPE_GPSCOMBINED,     COTYPE_GPSHR,     CBTYPE_GPS,     COTYPE_GPSURA,     PBTYPE_GPS,     PBEXTTYPE_GPS,     SATANTTYPE_GPS,     REGIONOTYPE_GPS },
+      { CLOCKORBIT_SATGLONASS, COTYPE_GLONASSORBIT, COTYPE_GLONASSCLOCK, COTYPE_GLONASSCOMBINED, COTYPE_GLONASSHR, CBTYPE_GLONASS, COTYPE_GLONASSURA, PBTYPE_GLONASS, PBEXTTYPE_GLONASS, SATANTTYPE_GLONASS, REGIONOTYPE_GLONASS },
+      { CLOCKORBIT_SATGALILEO, COTYPE_GALILEOORBIT, COTYPE_GALILEOCLOCK, COTYPE_GALILEOCOMBINED, COTYPE_GALILEOHR, CBTYPE_GALILEO, COTYPE_GALILEOURA, PBTYPE_GALILEO, PBEXTTYPE_GALILEO, SATANTTYPE_GALILEO, REGIONOTYPE_GALILEO },
+      { CLOCKORBIT_SATQZSS,    COTYPE_QZSSORBIT,    COTYPE_QZSSCLOCK,    COTYPE_QZSSCOMBINED,    COTYPE_QZSSHR,    CBTYPE_QZSS,    COTYPE_QZSSURA,    PBTYPE_QZSS,    PBEXTTYPE_QZSS,    SATANTTYPE_QZSS,    REGIONOTYPE_QZSS },
+      { CLOCKORBIT_SATBDS,     COTYPE_BDSORBIT,     COTYPE_BDSCLOCK,     COTYPE_BDSCOMBINED,     COTYPE_BDSHR,     CBTYPE_BDS,     COTYPE_BDSURA,     PBTYPE_BDS,     PBEXTTYPE_BDS,     SATANTTYPE_BDS,     REGIONOTYPE_BDS },
+    };
+    for (const SysRow &row : rows) {
+      corType[row.sys][COBOFS_ORBIT]    = row.orbit;
+      corType[row.sys][COBOFS_CLOCK]    = row.clock;
+      corType[row.sys][COBOFS_COMBINED] = row.combined;
+      corType[row.sys][COBOFS_HR]       = row.hr;
+      corType[row.sys][COBOFS_CBIAS]    = row.cbias;
+      corType[row.sys][COBOFS_URA]      = row.ura;
+      corType[row.sys][COBOFS_PBIAS]    = row.pbias;
+      corType[row.sys][COBOFS_PBEXT]    = row.pbext;
+      corType[row.sys][COBOFS_SATANT]   = row.satant;
+      corType[row.sys][COBOFS_REGIONO]  = row.regiono;
+    }
+  }
+
   std::string       codeTypeToRnxType(char system, CodeType type);
   SsrCorr::CodeType rnxTypeToCodeType(char system, std::string type);
