From b8b31c4e696f0f06b337935e39ee374e0305c39d Mon Sep 17 00:00:00 2001 From: Tsuki Date: Wed, 24 Dec 2025 02:07:44 +0800 Subject: [PATCH] sync --- gen/src/fr/btable.rs | 185 ++++++------------ gen/src/fr/dtable.rs | 179 ++++++------------ gen/src/fr/mod.rs | 57 ++++-- gen/src/lib.rs | 161 ++++------------ gen/src/main.rs | 74 ++++++-- gen/src/prelude.rs | 6 +- gen/src/tables.rs | 238 ++++++++++++++++++++++++ gen/src/wmo/btable.rs | 114 ++---------- gen/src/wmo/dtable.rs | 109 ++--------- gen/src/wmo/mod.rs | 80 ++++++++ rbufr/src/block.rs | 5 +- rbufr/src/tables.rs | 4 +- tables/master/BUFR_TableB_en_00.bufrtbl | Bin 3832 -> 3928 bytes tables/master/BUFR_TableB_en_01.bufrtbl | Bin 15361 -> 15757 bytes tables/master/BUFR_TableB_en_02.bufrtbl | Bin 27334 -> 28042 bytes tables/master/BUFR_TableB_en_03.bufrtbl | Bin 4585 -> 4705 bytes tables/master/BUFR_TableB_en_04.bufrtbl | Bin 5021 -> 5161 bytes tables/master/BUFR_TableB_en_05.bufrtbl | Bin 6661 -> 6837 bytes tables/master/BUFR_TableB_en_06.bufrtbl | Bin 2724 -> 2796 bytes tables/master/BUFR_TableB_en_07.bufrtbl | Bin 5425 -> 5573 bytes tables/master/BUFR_TableB_en_08.bufrtbl | Bin 14001 -> 14333 bytes tables/master/BUFR_TableB_en_10.bufrtbl | Bin 8989 -> 9205 bytes tables/master/BUFR_TableB_en_11.bufrtbl | Bin 12405 -> 12729 bytes tables/master/BUFR_TableB_en_12.bufrtbl | Bin 13258 -> 13622 bytes tables/master/BUFR_TableB_en_13.bufrtbl | Bin 14441 -> 14785 bytes tables/master/BUFR_TableB_en_14.bufrtbl | Bin 7729 -> 7917 bytes tables/master/BUFR_TableB_en_15.bufrtbl | Bin 12193 -> 12481 bytes tables/master/BUFR_TableB_en_19.bufrtbl | Bin 5401 -> 5525 bytes tables/master/BUFR_TableB_en_20.bufrtbl | Bin 17494 -> 17954 bytes tables/master/BUFR_TableB_en_21.bufrtbl | Bin 21358 -> 21942 bytes tables/master/BUFR_TableB_en_22.bufrtbl | Bin 22238 -> 22786 bytes tables/master/BUFR_TableB_en_23.bufrtbl | Bin 4149 -> 4249 bytes tables/master/BUFR_TableB_en_24.bufrtbl | Bin 2128 -> 2180 bytes tables/master/BUFR_TableB_en_25.bufrtbl | Bin 24082 -> 24694 bytes tables/master/BUFR_TableB_en_26.bufrtbl | Bin 1436 -> 1472 bytes tables/master/BUFR_TableB_en_27.bufrtbl | Bin 1832 -> 1872 bytes tables/master/BUFR_TableB_en_28.bufrtbl | Bin 1112 -> 1136 bytes tables/master/BUFR_TableB_en_29.bufrtbl | Bin 460 -> 472 bytes tables/master/BUFR_TableB_en_30.bufrtbl | Bin 1272 -> 1312 bytes tables/master/BUFR_TableB_en_31.bufrtbl | Bin 1312 -> 1340 bytes tables/master/BUFR_TableB_en_33.bufrtbl | Bin 15445 -> 15825 bytes tables/master/BUFR_TableB_en_35.bufrtbl | Bin 2256 -> 2308 bytes tables/master/BUFR_TableB_en_40.bufrtbl | Bin 12441 -> 12757 bytes tables/master/BUFR_TableB_en_41.bufrtbl | Bin 1080 -> 1108 bytes tables/master/BUFR_TableB_en_42.bufrtbl | Bin 2996 -> 3068 bytes tables/master/BUFR_TableD_en_00.bufrtbl | Bin 1104 -> 1200 bytes tables/master/BUFR_TableD_en_01.bufrtbl | Bin 17365 -> 18581 bytes tables/master/BUFR_TableD_en_02.bufrtbl | Bin 17429 -> 18581 bytes tables/master/BUFR_TableD_en_03.bufrtbl | Bin 7025 -> 7489 bytes tables/master/BUFR_TableD_en_04.bufrtbl | Bin 4076 -> 4348 bytes tables/master/BUFR_TableD_en_05.bufrtbl | Bin 3272 -> 3480 bytes tables/master/BUFR_TableD_en_06.bufrtbl | Bin 12597 -> 13285 bytes tables/master/BUFR_TableD_en_07.bufrtbl | Bin 21497 -> 22633 bytes tables/master/BUFR_TableD_en_08.bufrtbl | Bin 6052 -> 6372 bytes tables/master/BUFR_TableD_en_09.bufrtbl | Bin 16513 -> 17409 bytes tables/master/BUFR_TableD_en_10.bufrtbl | Bin 29061 -> 30261 bytes tables/master/BUFR_TableD_en_11.bufrtbl | Bin 4728 -> 4952 bytes tables/master/BUFR_TableD_en_12.bufrtbl | Bin 13889 -> 14705 bytes tables/master/BUFR_TableD_en_13.bufrtbl | Bin 1664 -> 1776 bytes tables/master/BUFR_TableD_en_15.bufrtbl | Bin 5820 -> 6044 bytes tables/master/BUFR_TableD_en_16.bufrtbl | Bin 10441 -> 11145 bytes tables/master/BUFR_TableD_en_18.bufrtbl | Bin 508 -> 556 bytes tables/master/BUFR_TableD_en_21.bufrtbl | Bin 4720 -> 5056 bytes tables/master/BUFR_TableD_en_22.bufrtbl | Bin 780 -> 812 bytes tables/master/BUFR_TableD_en_40.bufrtbl | Bin 11105 -> 11521 bytes 65 files changed, 601 insertions(+), 611 deletions(-) create mode 100644 gen/src/tables.rs diff --git a/gen/src/fr/btable.rs b/gen/src/fr/btable.rs index f3d4dec..5c77e88 100644 --- a/gen/src/fr/btable.rs +++ b/gen/src/fr/btable.rs @@ -1,7 +1,11 @@ -use crate::{FXY, TableEntry, TableEntryLoader}; -use rkyv::Archive; +use super::EntryLoader; +use crate::{ + FXY, + tables::{BTable, BTableEntry}, +}; -pub struct BTableCsvLoader; +#[derive(Default)] +pub struct BTableLoader; #[derive(Debug)] pub struct RawBTableEntry { @@ -10,145 +14,62 @@ pub struct RawBTableEntry { pub y: u16, } -// Helper function to deserialize empty strings as None -fn deserialize_optional_string<'de, D>(deserializer: D) -> Result, D::Error> -where - D: serde::Deserializer<'de>, -{ - let s: String = serde::Deserialize::deserialize(deserializer)?; - if s.is_empty() { Ok(None) } else { Ok(Some(s)) } -} +impl EntryLoader for BTableLoader { + type Output = BTableEntry; + type TableType = BTable; -// Helper function to deserialize empty strings as None for u32 -fn deserialize_optional_u32<'de, D>(deserializer: D) -> Result, D::Error> -where - D: serde::Deserializer<'de>, -{ - let s: String = serde::Deserialize::deserialize(deserializer)?; - if s.is_empty() { - Ok(None) - } else { - s.parse::().map(Some).map_err(serde::de::Error::custom) - } -} + fn process_entry(&mut self, raw: csv::StringRecord) -> anyhow::Result> { + let f = raw + .get(0) + .ok_or_else(|| anyhow::anyhow!("Missing F field"))? + .parse()?; -#[derive( - Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, -)] -#[rkyv(compare(PartialEq), derive(Debug))] -pub struct BTableEntry { - fxy: FXY, - class_name_en: String, - element_name_en: String, - bufr_unit: String, - bufr_scale: i32, - bufr_reference_value: i32, - bufr_datawidth_bits: u32, - note_en: Option, - note_ids: Option, - status: String, -} + let x = raw + .get(1) + .ok_or_else(|| anyhow::anyhow!("Missing X field"))? + .parse()?; -impl BTableEntry { - pub fn fxy(&self) -> FXY { - self.fxy - } + let y = raw + .get(2) + .ok_or_else(|| anyhow::anyhow!("Missing Y field"))? + .parse()?; - pub fn class_name_en(&self) -> &str { - &self.class_name_en - } + let fxy = FXY::new(f, x, y); - pub fn element_name_en(&self) -> &str { - &self.element_name_en - } - - pub fn bufr_unit(&self) -> &str { - &self.bufr_unit - } - - pub fn bufr_scale(&self) -> i32 { - self.bufr_scale - } - - pub fn bufr_reference_value(&self) -> i32 { - self.bufr_reference_value - } - - pub fn bufr_datawidth_bits(&self) -> u32 { - self.bufr_datawidth_bits - } - - pub fn note_en(&self) -> Option<&str> { - self.note_en.as_deref() - } - - pub fn note_ids(&self) -> Option<&str> { - self.note_ids.as_deref() - } - - pub fn status(&self) -> &str { - &self.status - } -} - -impl std::fmt::Display for BTableEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let element_name = if self.element_name_en.len() > 40 { - format!("{}...", &self.element_name_en[..37]) - } else { - self.element_name_en.clone() - }; - - let unit = if self.bufr_unit.len() > 15 { - format!("{}...", &self.bufr_unit[..12]) - } else { - self.bufr_unit.clone() - }; - - write!( - f, - "{:02}{:02}{:03} | {:<40} | {:<15} | {:>5} | {:>8} | {:>8} | {}", - self.fxy.f, - self.fxy.x, - self.fxy.y, - element_name, - unit, - self.bufr_scale, - self.bufr_reference_value, - self.bufr_datawidth_bits, - self.status - ) - } -} - -impl TableEntryLoader for BTableCsvLoader { - type RawEntry = RawBTableEntry; - type TableEntry = BTableEntry; - const TABLE_TYPE: crate::TableType = crate::TableType::B; - - fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result> { - // Parse FXY string (e.g., "001001") to u32 - let fxy = FXY::from_str(&raw.fxy)?; + let class_name_en = raw + .get(3) + .ok_or_else(|| anyhow::anyhow!("Missing Class Name EN"))? + .to_string(); + let bufr_unit = raw + .get(4) + .ok_or_else(|| anyhow::anyhow!("Missing BUFR Unit"))? + .to_string(); + let bufr_scale = raw + .get(5) + .ok_or_else(|| anyhow::anyhow!("Missing Scaling Field"))? + .parse()?; + let bufr_reference_value = raw + .get(6) + .ok_or_else(|| anyhow::anyhow!("Missing Reference Value Field"))? + .parse()?; + let bufr_datawidth_bits = raw + .get(7) + .ok_or_else(|| anyhow::anyhow!("Missing Datawidth Bits Field"))? + .parse()?; let entry = BTableEntry { fxy, - class_name_en: raw.class_name_en, - element_name_en: raw.element_name_en, - bufr_unit: raw.bufr_unit, - bufr_scale: raw.bufr_scale, - bufr_reference_value: raw.bufr_reference_value, - bufr_datawidth_bits: raw.bufr_datawidth_bits, - note_en: raw.note_en, - note_ids: raw.note_ids, - status: raw.status, + class_name_en: class_name_en.clone(), + element_name_en: class_name_en, + bufr_unit, + bufr_scale, + bufr_reference_value, + bufr_datawidth_bits, + note_en: None, + note_ids: None, + status: None, }; Ok(Some(entry)) } } - -impl TableEntry for BTableEntry { - fn fxy(&self) -> FXY { - self.fxy - } -} diff --git a/gen/src/fr/dtable.rs b/gen/src/fr/dtable.rs index 10f6489..80ba369 100644 --- a/gen/src/fr/dtable.rs +++ b/gen/src/fr/dtable.rs @@ -1,34 +1,67 @@ -use super::TableEntryLoader; +use super::EntryLoader; +use crate::{ + FXY, + tables::{DTable, DTableEntry}, +}; use csv::StringRecord; -use rkyv::Archive; -#[derive(Debug, Clone, Default)] -pub struct DTableCsvLoader { +#[derive(Default)] +pub struct FRDTableLoader { current_chain: Option, } -impl TableEntryLoader for DTableCsvLoader { - type TableEntry = DTableEntry; - const TABLE_TYPE: crate::TableType = crate::TableType::D; +impl EntryLoader for FRDTableLoader { + type Output = DTableEntry; + type TableType = DTable; - fn process_entry(&mut self, raw: &StringRecord) -> anyhow::Result> { + fn process_entry(&mut self, raw: StringRecord) -> anyhow::Result> { + let f = raw + .get(0) + .ok_or_else(|| anyhow::anyhow!("Missing F field"))? + .parse::()?; + + let x = raw + .get(1) + .ok_or_else(|| anyhow::anyhow!("Missing X field"))? + .parse::()?; + + let y = raw + .get(2) + .ok_or_else(|| anyhow::anyhow!("Missing Y field"))? + .parse::()?; + + let f1 = raw + .get(3) + .ok_or_else(|| anyhow::anyhow!("Missing F1 field"))?; + + let x1 = raw + .get(4) + .ok_or_else(|| anyhow::anyhow!("Missing X1 field"))?; + + let y1 = raw + .get(5) + .ok_or_else(|| anyhow::anyhow!("Missing Y1 field"))?; + + let fxy1 = FXY::new(f1.parse()?, x1.parse()?, y1.parse()?); + + let fxy = FXY::new(f, x, y); // Process the raw entry as needed if self.current_chain.is_none() { let entry = DTableEntry { - fxy: FXY::from_str(&raw.fxy1)?, - fxy_chain: vec![FXY::from_str(&raw.fxy2)?], - category: raw.category, - category_of_sequences_en: raw.category_of_sequences_en, - title_en: raw.title_en, - subtitle_en: raw.subtitle_en, - note_en: raw.note_en, - note_ids: raw.note_ids, - status: raw.status, + fxy, + fxy_chain: vec![fxy1], + category: None, + category_of_sequences_en: None, + title_en: None, + subtitle_en: None, + note_en: None, + note_ids: None, + status: None, }; self.current_chain = Some(entry); return Ok(None); } else { - let fxy = FXY::from_str(&raw.fxy1)?; + let fxy = FXY::new(f, x, y); if self.current_chain.as_ref().unwrap().fxy != fxy { // First take out the old completed chain let finished = self.current_chain.take(); @@ -36,116 +69,26 @@ impl TableEntryLoader for DTableCsvLoader { // Then create and save the new chain let entry = DTableEntry { fxy, - fxy_chain: vec![FXY::from_str(&raw.fxy2)?], - category: raw.category, - category_of_sequences_en: raw.category_of_sequences_en, - title_en: raw.title_en, - subtitle_en: raw.subtitle_en, - note_en: raw.note_en, - note_ids: raw.note_ids, - status: raw.status, + fxy_chain: vec![fxy1], + category: None, + category_of_sequences_en: None, + title_en: None, + subtitle_en: None, + note_en: None, + note_ids: None, + status: None, }; self.current_chain = Some(entry); - // Return the old completed chain return Ok(finished); } else { - self.current_chain - .as_mut() - .unwrap() - .fxy_chain - .push(FXY::from_str(&raw.fxy2)?); - + self.current_chain.as_mut().unwrap().fxy_chain.push(fxy1); return Ok(None); } } } - fn finish(&mut self) -> anyhow::Result> { + fn finish(&mut self) -> anyhow::Result> { Ok(self.current_chain.take()) } } - -#[derive( - Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, -)] -#[rkyv(compare(PartialEq), derive(Debug))] -pub struct DTableEntry { - fxy: FXY, - fxy_chain: Vec, - category: String, - category_of_sequences_en: String, - title_en: Option, - subtitle_en: Option, - note_en: Option, - note_ids: String, - status: String, -} - -impl DTableEntry { - pub fn fxy(&self) -> FXY { - self.fxy - } - - pub fn fxy_chain(&self) -> &[FXY] { - &self.fxy_chain - } - - pub fn category(&self) -> &str { - &self.category - } - - pub fn category_of_sequences_en(&self) -> &str { - &self.category_of_sequences_en - } - - pub fn title_en(&self) -> Option<&str> { - self.title_en.as_deref() - } - - pub fn subtitle_en(&self) -> Option<&str> { - self.subtitle_en.as_deref() - } - - pub fn note_en(&self) -> Option<&str> { - self.note_en.as_deref() - } - - pub fn note_ids(&self) -> &str { - &self.note_ids - } - - pub fn status(&self) -> &str { - &self.status - } -} - -impl std::fmt::Display for DTableEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let fxy_chain_str: String = self - .fxy_chain - .iter() - .map(|fxy| format!("{:02}{:02}{:03}", fxy.f, fxy.x, fxy.y)) - .collect::>() - .join(", "); - - let title = self.title_en.as_deref().unwrap_or("N/A"); - let truncated_title = if title.len() > 50 { - format!("{}...", &title[..47]) - } else { - title.to_string() - }; - - write!( - f, - "{:02}{:02}{:03} | {:<50} | {:<12} | [{}]", - self.fxy.f, self.fxy.x, self.fxy.y, truncated_title, self.status, fxy_chain_str - ) - } -} - -impl TableEntry for DTableEntry { - fn fxy(&self) -> FXY { - self.fxy - } -} diff --git a/gen/src/fr/mod.rs b/gen/src/fr/mod.rs index 57c0dd6..85b901e 100644 --- a/gen/src/fr/mod.rs +++ b/gen/src/fr/mod.rs @@ -1,24 +1,34 @@ +use crate::{ + TableConverter, + tables::{TableEntry, TableEntryFull, TableTypeTrait}, +}; use csv::{ReaderBuilder, StringRecord}; -use std::path::Path; pub mod btable; pub mod dtable; -pub struct TableLoader; +pub type FRDTableLoader = TableLoader; +pub type FRBTableLoader = TableLoader; -impl TableLoader { - pub fn load_table, T: TableEntryLoader>( +#[derive(Default)] +pub struct TableLoader { + _marker: std::marker::PhantomData, +} + +impl TableLoader { + pub fn load_table>( &self, path: P, - loader: &mut T, - ) -> anyhow::Result> { + loader: &mut C, + ) -> anyhow::Result> { + let path = path.as_ref(); let mut entries = vec![]; let mut rdr = ReaderBuilder::new() .has_headers(false) .delimiter(b';') - .flexible(false) // Allow variable number of fields - .from_path(path.as_ref())?; + .flexible(false) + .from_path(path)?; - let mut line_num = 1; // Start at 1 for header + let mut line_num = 1; for result in rdr.records() { line_num += 1; match result { @@ -28,11 +38,10 @@ impl TableLoader { } } Err(e) => { - // Log the error but continue processing eprintln!( "Warning: Skipping line {} in {}: {}", line_num, - path.as_ref().display(), + path.display(), e ); } @@ -47,15 +56,25 @@ impl TableLoader { } } -pub trait TableEntryLoader: Sized { - type TableEntry: TableEntry; +pub trait EntryLoader: Default { + type Output: TableEntryFull; + type TableType: TableTypeTrait; - const TABLE_TYPE: TableType; - - /// Process a single entry from the CSV file - fn process_entry(&mut self, raw: &StringRecord) -> anyhow::Result>; - - fn finish(&mut self) -> anyhow::Result> { + fn process_entry(&mut self, raw: StringRecord) -> anyhow::Result>; + fn finish(&mut self) -> anyhow::Result> { Ok(None) } } + +impl TableConverter for TableLoader { + type OutputEntry = T::Output; + type TableType = T::TableType; + + fn convert>( + &self, + path: P, + ) -> anyhow::Result> { + let mut loader = T::default(); + self.load_table(path, &mut loader) + } +} diff --git a/gen/src/lib.rs b/gen/src/lib.rs index ad68205..50591e7 100644 --- a/gen/src/lib.rs +++ b/gen/src/lib.rs @@ -1,117 +1,44 @@ -// pub mod fr; +pub mod fr; pub mod prelude; +pub mod tables; mod utils; pub mod wmo; use anyhow::Context; use memmap2::Mmap; use ph::fmph::GOFunction; use rkyv::Archive; -use rkyv::api::high::{HighDeserializer, HighSerializer}; use rkyv::rancor::Error; -use serde::de::DeserializeOwned; use serde::{Deserialize as SerdeDeserialize, Serialize as SerdeSerialize}; use std::fmt::Debug; use std::io::Write; use std::path::Path; -use csv::ReaderBuilder; +use crate::tables::{TableEntryFull, TableTypeTrait}; -pub struct TableLoader; +pub trait TableConverter { + type OutputEntry: TableEntryFull; + type TableType: TableTypeTrait; + fn convert>(&self, path: P) -> anyhow::Result>; -impl TableLoader { - pub fn load_table, T: TableEntryLoader>( - &self, - path: P, - loader: &mut T, - ) -> anyhow::Result> { - let mut entries = vec![]; - let mut rdr = ReaderBuilder::new() - .has_headers(true) - .delimiter(b',') - .flexible(true) // Allow variable number of fields - .from_path(path.as_ref())?; - - let mut line_num = 1; // Start at 1 for header - for result in rdr.deserialize() { - line_num += 1; - match result { - Ok(record) => { - let record: T::RawEntry = record; - if let Some(processed_entry) = loader.process_entry(record)? { - entries.push(processed_entry); - } - } - Err(e) => { - // Log the error but continue processing - eprintln!( - "Warning: Skipping line {} in {}: {}", - line_num, - path.as_ref().display(), - e - ); - } - } - } - - if let Some(processed_entry) = loader.finish()? { - entries.push(processed_entry); - } - - Ok(entries) + fn table_type(&self) -> crate::TableType { + Self::TableType::TABLE_TYPE } } -pub trait TableEntryLoader: Sized -where - Self::TableEntry: for<'a> rkyv::Serialize< - HighSerializer, Error>, - >, - ::Archived: - rkyv::Deserialize>, -{ - /// The raw CSV entry type that will be deserialized - type RawEntry: for<'de> serde::Deserialize<'de> + Debug; - - type TableEntry: TableEntry; - - const TABLE_TYPE: TableType; - - /// Process a single entry from the CSV file - fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result>; - - fn finish(&mut self) -> anyhow::Result> { - Ok(None) - } -} - -pub trait TableEntry: SerdeSerialize + DeserializeOwned + Debug + Clone + Archive { - fn fxy(&self) -> FXY; -} - -struct BufrTableMph { +struct BufrTableMph { mphf: GOFunction, offsets: Vec, mmap: Mmap, _marker: std::marker::PhantomData, } -struct BUFRTableM { - mphf: GOFunction, -} - -impl BufrTableMph -where - for<'a> T::TableEntry: rkyv::Serialize< - HighSerializer, Error>, - >, - ::Archived: rkyv::Deserialize>, -{ - fn build(entries: Vec, output_path: &str) -> std::io::Result { +impl BufrTableMph { + fn build(entries: Vec, output_path: &str) -> std::io::Result { println!("Building MPH table with {} entries...", entries.len()); let keys: Vec = entries.iter().map(|e| e.fxy()).collect(); let mphf = GOFunction::from_slice(&keys); - let mut sorted_entries: Vec<(usize, T::TableEntry)> = entries + let mut sorted_entries: Vec<(usize, T)> = entries .into_iter() .map(|e| (mphf.get(&(e.fxy())).unwrap() as usize, e)) .collect(); @@ -212,7 +139,7 @@ where } /// 获取拥有的版本 - fn get(&self, fxy: FXY) -> Option { + fn get(&self, fxy: FXY) -> Option { let hash = self.mphf.get(&fxy)? as usize; let offset = *self.offsets.get(hash)? as usize; @@ -221,13 +148,12 @@ where let data = self.mmap.get(offset + 4..offset + 4 + len)?; - let archived = - unsafe { rkyv::access_unchecked::<::Archived>(data) }; - rkyv::deserialize::(archived).ok() + let archived = unsafe { rkyv::access_unchecked::<::Archived>(data) }; + rkyv::deserialize::(archived).ok() } /// 获取所有条目 - fn get_all(&self) -> Vec { + fn get_all(&self) -> Vec { let mut entries = Vec::new(); for offset in &self.offsets { let offset = *offset as usize; @@ -236,9 +162,9 @@ where let len = u32::from_le_bytes(len_bytes_array) as usize; if let Some(data) = self.mmap.get(offset + 4..offset + 4 + len) { let archived = unsafe { - rkyv::access_unchecked::<::Archived>(data) + rkyv::access_unchecked::<::Archived>(data) }; - if let Ok(entry) = rkyv::deserialize::(archived) { + if let Ok(entry) = rkyv::deserialize::(archived) { entries.push(entry); } } @@ -269,15 +195,6 @@ pub struct FXY { pub y: u16, } -// // Custom Hash implementation to work around boomphf's overflow bug -// // We implement Hash by converting to u32 first -// impl std::hash::Hash for FXY { -// fn hash(&self, state: &mut H) { -// // Convert FXY to a simple u32 value to avoid complex hashing -// self.to_u32().hash(state); -// } -// } - impl FXY { pub fn new(f: u16, x: u16, y: u16) -> Self { FXY { f, x, y } @@ -319,32 +236,37 @@ impl FXY { } } -pub struct BUFRTableMPH { - inner: BufrTableMph, +pub struct BUFRTableMPH { + inner: BufrTableMph, } -impl BUFRTableMPH { - pub fn build_from_csv>( - mut loader: T, - csv_path: P, +impl BUFRTableMPH { + pub fn build_from_csv, L: TableConverter>( + loader: L, + path: P, output_path: P, - ) -> anyhow::Result { - let entries = TableLoader.load_table(csv_path, &mut loader)?; - let bhm = BufrTableMph::::build(entries, output_path.as_ref().to_str().unwrap())?; + ) -> anyhow::Result + where + L: TableConverter, + L: TableConverter, + { + let entries = loader.convert(path)?; + let bhm = + BufrTableMph::::build(entries, output_path.as_ref().to_str().unwrap())?; Ok(BUFRTableMPH { inner: bhm }) } pub fn load_from_disk>(path: P) -> anyhow::Result { - let bhm: BufrTableMph = BufrTableMph::load(path)?; + let bhm: BufrTableMph = BufrTableMph::load(path)?; Ok(BUFRTableMPH { inner: bhm }) } - pub fn lookup(&self, fxy: FXY) -> anyhow::Result> { + pub fn lookup(&self, fxy: FXY) -> anyhow::Result> { Ok(self.inner.get(fxy)) } - pub fn get_all_entries(&self) -> Vec { + pub fn get_all_entries(&self) -> Vec { self.inner.get_all() } } @@ -358,16 +280,7 @@ pub enum TableType { #[cfg(test)] mod test { - use crate::{BUFRTableMPH, dtable::DTableCsvLoader}; #[test] - fn test() { - let d_loader = DTableCsvLoader::default(); - BUFRTableMPH::build_from_csv( - d_loader, - "/Users/xiang.li1/projects/rbufr/BUFR4/BUFR_TableD_en_00.csv", - "test_table_d", - ) - .unwrap(); - } + fn test() {} } diff --git a/gen/src/main.rs b/gen/src/main.rs index dd3d079..7986153 100644 --- a/gen/src/main.rs +++ b/gen/src/main.rs @@ -1,6 +1,9 @@ -use anyhow::{Context, Result}; +use anyhow::{Context, Result, anyhow}; use clap::{Parser, Subcommand}; -use genlib::{BUFRTableMPH, btable::BTableCsvLoader, dtable::DTableCsvLoader}; +use genlib::{ + TableType, + prelude::{BUFRTableB, BUFRTableD}, +}; use std::path::{Path, PathBuf}; #[derive(Parser)] @@ -196,16 +199,63 @@ fn convert_single_file(input_path: &Path, output_path: &Path, table_type: &str) Ok(()) } +type BuildFn = fn(&Path, &Path) -> Result<()>; + +fn run_with_fallbacks( + kind: TableType, + input_path: &Path, + output_path: &Path, + attempts: &[(&str, BuildFn)], +) -> Result<()> { + let mut errors = Vec::new(); + for (label, build_fn) in attempts { + match build_fn(input_path, output_path) { + Ok(()) => return Ok(()), + Err(err) => errors.push(format!("{label} failed: {err:#}")), + } + } + + Err(anyhow!( + "all {:?} loaders failed:\n{}", + kind, + errors.join("\n---\n") + )) +} + +fn build_wmo_d(input_path: &Path, output_path: &Path) -> Result<()> { + let loader = genlib::wmo::TableLoader::::default(); + BUFRTableD::build_from_csv(loader, input_path, output_path).map(|_| ()) +} + +fn build_fr_d(input_path: &Path, output_path: &Path) -> Result<()> { + let loader = genlib::fr::FRDTableLoader::default(); + BUFRTableD::build_from_csv(loader, input_path, output_path).map(|_| ()) +} + fn convert_table_d(input_path: &Path, output_path: &Path) -> Result<()> { - let loader = DTableCsvLoader::default(); - BUFRTableMPH::build_from_csv(loader, input_path, output_path)?; - Ok(()) + const ATTEMPTS: &[(&str, BuildFn)] = &[ + ("WMO Table D loader", build_wmo_d), + ("FR Table D loader", build_fr_d), + ]; + run_with_fallbacks(TableType::D, input_path, output_path, ATTEMPTS) +} + +fn build_wmo_b(input_path: &Path, output_path: &Path) -> Result<()> { + let loader = genlib::wmo::TableLoader::::default(); + BUFRTableB::build_from_csv(loader, input_path, output_path).map(|_| ()) +} + +fn build_fr_b(input_path: &Path, output_path: &Path) -> Result<()> { + let loader = genlib::fr::FRBTableLoader::default(); + BUFRTableB::build_from_csv(loader, input_path, output_path).map(|_| ()) } fn convert_table_b(input_path: &Path, output_path: &Path) -> Result<()> { - let loader = BTableCsvLoader; - BUFRTableMPH::build_from_csv(loader, input_path, output_path)?; - Ok(()) + const ATTEMPTS: &[(&str, BuildFn)] = &[ + ("WMO Table B loader", build_wmo_b), + ("FR Table B loader", build_fr_b), + ]; + run_with_fallbacks(TableType::B, input_path, output_path, ATTEMPTS) } fn print_table(input_path: &Path, table_type: &str, limit: Option) -> Result<()> { @@ -219,11 +269,9 @@ fn print_table(input_path: &Path, table_type: &str, limit: Option) -> Res } fn print_table_d(input_path: &Path, limit: Option) -> Result<()> { - use genlib::dtable::DTableEntry; - println!("Loading Table D from: {}", input_path.display()); - let table: BUFRTableMPH = BUFRTableMPH::load_from_disk(input_path)?; + let table: BUFRTableD = BUFRTableD::load_from_disk(input_path)?; let entries = table.get_all_entries(); println!("\nTable D Entries (Total: {})", entries.len()); @@ -254,11 +302,9 @@ fn print_table_d(input_path: &Path, limit: Option) -> Result<()> { } fn print_table_b(input_path: &Path, limit: Option) -> Result<()> { - use genlib::btable::BTableEntry; - println!("Loading Table B from: {}", input_path.display()); - let table: BUFRTableMPH = BUFRTableMPH::load_from_disk(input_path)?; + let table: BUFRTableB = BUFRTableB::load_from_disk(input_path)?; let entries = table.get_all_entries(); println!("\nTable B Entries (Total: {})", entries.len()); diff --git a/gen/src/prelude.rs b/gen/src/prelude.rs index 7cdc85f..9aaa2b8 100644 --- a/gen/src/prelude.rs +++ b/gen/src/prelude.rs @@ -1,6 +1,8 @@ +use crate::tables::BTable; +use crate::tables::DTable; pub use crate::wmo; -// pub type BUFRTableD = crate::BUFRTableMPH; -// pub type BUFRTableB = crate::BUFRTableMPH; +pub type BUFRTableD = crate::BUFRTableMPH; +pub type BUFRTableB = crate::BUFRTableMPH; pub use crate::BUFRTableMPH; pub use crate::FXY; pub use crate::TableType; diff --git a/gen/src/tables.rs b/gen/src/tables.rs new file mode 100644 index 0000000..d6719c8 --- /dev/null +++ b/gen/src/tables.rs @@ -0,0 +1,238 @@ +use crate::FXY; +use rkyv::Archive; +use rkyv::api::high::{HighDeserializer, HighSerializer}; +use rkyv::de::Pool; +use rkyv::rancor::{Error, Strategy}; +use serde::Serialize as SerdeSerialize; +use serde::de::DeserializeOwned; +use std::fmt::Debug; + +pub struct BTable; +pub struct DTable; + +pub trait TableTypeTrait { + type EntryType: TableEntryFull; + const TABLE_TYPE: crate::TableType; +} + +impl TableTypeTrait for BTable { + type EntryType = crate::tables::BTableEntry; + const TABLE_TYPE: crate::TableType = crate::TableType::B; +} +impl TableTypeTrait for DTable { + type EntryType = crate::tables::DTableEntry; + const TABLE_TYPE: crate::TableType = crate::TableType::D; +} + +pub trait TableEntry: + SerdeSerialize + + DeserializeOwned + + Debug + + Clone + + Sized + + Archive + + for<'a> rkyv::Serialize< + HighSerializer, Error>, + > +{ + fn fxy(&self) -> FXY; +} + +pub trait TableEntryFull: TableEntry { + type Archived: for<'a> rkyv::Deserialize> + + rkyv::Deserialize> + + rkyv::Portable; +} + +impl TableEntryFull for T +where + T: TableEntry, + ::Archived: for<'a> rkyv::Deserialize> + + rkyv::Deserialize>, +{ + type Archived = ::Archived; +} + +#[derive( + Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, +)] +#[rkyv(compare(PartialEq), derive(Debug))] +pub struct BTableEntry { + pub fxy: FXY, + pub class_name_en: String, + pub element_name_en: String, + pub bufr_unit: String, + pub bufr_scale: i32, + pub bufr_reference_value: i32, + pub bufr_datawidth_bits: u32, + pub note_en: Option, + pub note_ids: Option, + pub status: Option, +} + +impl BTableEntry { + pub fn fxy(&self) -> FXY { + self.fxy + } + + pub fn class_name_en(&self) -> &str { + &self.class_name_en + } + + pub fn element_name_en(&self) -> &str { + &self.element_name_en + } + + pub fn bufr_unit(&self) -> &str { + &self.bufr_unit + } + + pub fn bufr_scale(&self) -> i32 { + self.bufr_scale + } + + pub fn bufr_reference_value(&self) -> i32 { + self.bufr_reference_value + } + + pub fn bufr_datawidth_bits(&self) -> u32 { + self.bufr_datawidth_bits + } + + pub fn note_en(&self) -> Option<&str> { + self.note_en.as_deref() + } + + pub fn note_ids(&self) -> Option<&str> { + self.note_ids.as_deref() + } + + pub fn status(&self) -> Option<&str> { + self.status.as_deref() + } +} + +impl std::fmt::Display for BTableEntry { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let element_name = if self.element_name_en.len() > 40 { + format!("{}...", &self.element_name_en[..37]) + } else { + self.element_name_en.clone() + }; + + let unit = if self.bufr_unit.len() > 15 { + format!("{}...", &self.bufr_unit[..12]) + } else { + self.bufr_unit.clone() + }; + + write!( + f, + "{:02}{:02}{:03} | {:<40} | {:<15} | {:>5} | {:>8} | {:>8} | {}", + self.fxy.f, + self.fxy.x, + self.fxy.y, + element_name, + unit, + self.bufr_scale, + self.bufr_reference_value, + self.bufr_datawidth_bits, + self.status().unwrap_or("N/A") + ) + } +} + +#[derive( + Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, +)] +#[rkyv(compare(PartialEq), derive(Debug))] +pub struct DTableEntry { + pub fxy: FXY, + pub fxy_chain: Vec, + pub category: Option, + pub category_of_sequences_en: Option, + pub title_en: Option, + pub subtitle_en: Option, + pub note_en: Option, + pub note_ids: Option, + pub status: Option, +} + +impl DTableEntry { + pub fn fxy(&self) -> FXY { + self.fxy + } + + pub fn fxy_chain(&self) -> &[FXY] { + &self.fxy_chain + } + + pub fn category(&self) -> Option<&str> { + self.category.as_deref() + } + + pub fn category_of_sequences_en(&self) -> Option<&str> { + self.category_of_sequences_en.as_deref() + } + + pub fn title_en(&self) -> Option<&str> { + self.title_en.as_deref() + } + + pub fn subtitle_en(&self) -> Option<&str> { + self.subtitle_en.as_deref() + } + + pub fn note_en(&self) -> Option<&str> { + self.note_en.as_deref() + } + + pub fn note_ids(&self) -> Option<&str> { + self.note_ids.as_deref() + } + + pub fn status(&self) -> Option<&str> { + self.status.as_deref() + } +} + +impl std::fmt::Display for DTableEntry { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let fxy_chain_str: String = self + .fxy_chain + .iter() + .map(|fxy| format!("{:02}{:02}{:03}", fxy.f, fxy.x, fxy.y)) + .collect::>() + .join(", "); + + let title = self.title_en.as_deref().unwrap_or("N/A"); + let truncated_title = if title.len() > 50 { + format!("{}...", &title[..47]) + } else { + title.to_string() + }; + + write!( + f, + "{:02}{:02}{:03} | {:<50} | {:<12} | [{}]", + self.fxy.f, + self.fxy.x, + self.fxy.y, + truncated_title, + self.status().unwrap_or("N/A"), + fxy_chain_str + ) + } +} + +impl TableEntry for DTableEntry { + fn fxy(&self) -> FXY { + self.fxy + } +} + +impl TableEntry for BTableEntry { + fn fxy(&self) -> FXY { + self.fxy + } +} diff --git a/gen/src/wmo/btable.rs b/gen/src/wmo/btable.rs index 701e7b4..87a2970 100644 --- a/gen/src/wmo/btable.rs +++ b/gen/src/wmo/btable.rs @@ -1,6 +1,10 @@ -use crate::{FXY, TableEntry, TableEntryLoader}; -use rkyv::Archive; +use super::EntryLoader; +use crate::{ + FXY, + tables::{BTable, BTableEntry}, +}; +#[derive(Default)] pub struct BTableCsvLoader; #[derive(Debug, serde::Deserialize)] @@ -32,7 +36,7 @@ pub struct RawBTableEntry { #[serde(rename = "noteIDs")] pub note_ids: Option, #[serde(rename = "Status")] - pub status: String, + pub status: Option, } // Helper function to deserialize empty strings as None @@ -57,102 +61,12 @@ where } } -#[derive( - Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, -)] -#[rkyv(compare(PartialEq), derive(Debug))] -pub struct BTableEntry { - fxy: FXY, - class_name_en: String, - element_name_en: String, - bufr_unit: String, - bufr_scale: i32, - bufr_reference_value: i32, - bufr_datawidth_bits: u32, - note_en: Option, - note_ids: Option, - status: String, -} - -impl BTableEntry { - pub fn fxy(&self) -> FXY { - self.fxy - } - - pub fn class_name_en(&self) -> &str { - &self.class_name_en - } - - pub fn element_name_en(&self) -> &str { - &self.element_name_en - } - - pub fn bufr_unit(&self) -> &str { - &self.bufr_unit - } - - pub fn bufr_scale(&self) -> i32 { - self.bufr_scale - } - - pub fn bufr_reference_value(&self) -> i32 { - self.bufr_reference_value - } - - pub fn bufr_datawidth_bits(&self) -> u32 { - self.bufr_datawidth_bits - } - - pub fn note_en(&self) -> Option<&str> { - self.note_en.as_deref() - } - - pub fn note_ids(&self) -> Option<&str> { - self.note_ids.as_deref() - } - - pub fn status(&self) -> &str { - &self.status - } -} - -impl std::fmt::Display for BTableEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let element_name = if self.element_name_en.len() > 40 { - format!("{}...", &self.element_name_en[..37]) - } else { - self.element_name_en.clone() - }; - - let unit = if self.bufr_unit.len() > 15 { - format!("{}...", &self.bufr_unit[..12]) - } else { - self.bufr_unit.clone() - }; - - write!( - f, - "{:02}{:02}{:03} | {:<40} | {:<15} | {:>5} | {:>8} | {:>8} | {}", - self.fxy.f, - self.fxy.x, - self.fxy.y, - element_name, - unit, - self.bufr_scale, - self.bufr_reference_value, - self.bufr_datawidth_bits, - self.status - ) - } -} - -impl TableEntryLoader for BTableCsvLoader { +impl EntryLoader for BTableCsvLoader { type RawEntry = RawBTableEntry; - type TableEntry = BTableEntry; - const TABLE_TYPE: crate::TableType = crate::TableType::B; + type Output = BTableEntry; + type TableType = BTable; - fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result> { - // Parse FXY string (e.g., "001001") to u32 + fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result> { let fxy = FXY::from_str(&raw.fxy)?; let entry = BTableEntry { @@ -171,9 +85,3 @@ impl TableEntryLoader for BTableCsvLoader { Ok(Some(entry)) } } - -impl TableEntry for BTableEntry { - fn fxy(&self) -> FXY { - self.fxy - } -} diff --git a/gen/src/wmo/dtable.rs b/gen/src/wmo/dtable.rs index d9af9f8..65c3de0 100644 --- a/gen/src/wmo/dtable.rs +++ b/gen/src/wmo/dtable.rs @@ -1,5 +1,8 @@ -use crate::{FXY, TableEntry, TableEntryLoader}; -use rkyv::Archive; +use super::EntryLoader; +use crate::{ + FXY, + tables::{DTable, DTableEntry}, +}; #[derive(Debug, Clone, Default)] pub struct DTableCsvLoader { @@ -9,9 +12,9 @@ pub struct DTableCsvLoader { #[derive(Debug, serde::Deserialize)] pub struct RawDTableEntry { #[serde(rename = "Category")] - pub category: String, + pub category: Option, #[serde(rename = "CategoryOfSequences_en")] - pub category_of_sequences_en: String, + pub category_of_sequences_en: Option, #[serde(rename = "FXY1")] pub fxy1: String, #[serde(rename = "Title_en")] @@ -27,17 +30,17 @@ pub struct RawDTableEntry { #[serde(rename = "Note_en")] pub note_en: Option, #[serde(rename = "noteIDs")] - pub note_ids: String, + pub note_ids: Option, #[serde(rename = "Status")] - pub status: String, + pub status: Option, } -impl TableEntryLoader for DTableCsvLoader { +impl EntryLoader for DTableCsvLoader { type RawEntry = RawDTableEntry; - type TableEntry = DTableEntry; - const TABLE_TYPE: crate::TableType = crate::TableType::D; + type Output = DTableEntry; + type TableType = DTable; - fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result> { + fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result> { // Process the raw entry as needed if self.current_chain.is_none() { let entry = DTableEntry { @@ -87,91 +90,7 @@ impl TableEntryLoader for DTableCsvLoader { } } - fn finish(&mut self) -> anyhow::Result> { + fn finish(&mut self) -> anyhow::Result> { Ok(self.current_chain.take()) } } - -#[derive( - Debug, Clone, serde::Deserialize, serde::Serialize, Archive, rkyv::Serialize, rkyv::Deserialize, -)] -#[rkyv(compare(PartialEq), derive(Debug))] -pub struct DTableEntry { - fxy: FXY, - fxy_chain: Vec, - category: String, - category_of_sequences_en: String, - title_en: Option, - subtitle_en: Option, - note_en: Option, - note_ids: String, - status: String, -} - -impl DTableEntry { - pub fn fxy(&self) -> FXY { - self.fxy - } - - pub fn fxy_chain(&self) -> &[FXY] { - &self.fxy_chain - } - - pub fn category(&self) -> &str { - &self.category - } - - pub fn category_of_sequences_en(&self) -> &str { - &self.category_of_sequences_en - } - - pub fn title_en(&self) -> Option<&str> { - self.title_en.as_deref() - } - - pub fn subtitle_en(&self) -> Option<&str> { - self.subtitle_en.as_deref() - } - - pub fn note_en(&self) -> Option<&str> { - self.note_en.as_deref() - } - - pub fn note_ids(&self) -> &str { - &self.note_ids - } - - pub fn status(&self) -> &str { - &self.status - } -} - -impl std::fmt::Display for DTableEntry { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let fxy_chain_str: String = self - .fxy_chain - .iter() - .map(|fxy| format!("{:02}{:02}{:03}", fxy.f, fxy.x, fxy.y)) - .collect::>() - .join(", "); - - let title = self.title_en.as_deref().unwrap_or("N/A"); - let truncated_title = if title.len() > 50 { - format!("{}...", &title[..47]) - } else { - title.to_string() - }; - - write!( - f, - "{:02}{:02}{:03} | {:<50} | {:<12} | [{}]", - self.fxy.f, self.fxy.x, self.fxy.y, truncated_title, self.status, fxy_chain_str - ) - } -} - -impl TableEntry for DTableEntry { - fn fxy(&self) -> FXY { - self.fxy - } -} diff --git a/gen/src/wmo/mod.rs b/gen/src/wmo/mod.rs index 2b2c7b1..f829fc6 100644 --- a/gen/src/wmo/mod.rs +++ b/gen/src/wmo/mod.rs @@ -1,2 +1,82 @@ pub mod btable; pub mod dtable; +use crate::{ + TableConverter, + tables::{TableEntryFull, TableTypeTrait}, +}; +pub use btable::BTableCsvLoader as WMOBTableLoader; +use csv::ReaderBuilder; +pub use dtable::DTableCsvLoader as WMODTableLoader; +use std::fmt::Debug; + +#[derive(Default)] +pub struct TableLoader { + _marker: std::marker::PhantomData, +} + +impl TableLoader { + pub fn load_table>( + &self, + path: P, + loader: &mut C, + ) -> anyhow::Result> { + let mut entries = vec![]; + let mut rdr = ReaderBuilder::new() + .has_headers(true) + .delimiter(b',') + .flexible(true) // Allow variable number of fields + .from_path(path.as_ref())?; + + let mut line_num = 1; // Start at 1 for header + for result in rdr.deserialize() { + line_num += 1; + match result { + Ok(record) => { + let record: C::RawEntry = record; + if let Some(processed_entry) = loader.process_entry(record)? { + entries.push(processed_entry); + } + } + Err(e) => { + // Log the error but continue processing + eprintln!( + "Warning: Skipping line {} in {}: {}", + line_num, + path.as_ref().display(), + e + ); + } + } + } + + if let Some(processed_entry) = loader.finish()? { + entries.push(processed_entry); + } + Ok(entries) + } +} + +pub trait EntryLoader: Default { + type Output: TableEntryFull; + type RawEntry: for<'de> serde::Deserialize<'de> + Debug; + type TableType: TableTypeTrait; + + fn process_entry(&mut self, raw: Self::RawEntry) -> anyhow::Result>; + + fn finish(&mut self) -> anyhow::Result> { + Ok(None) + } +} + +impl TableConverter for TableLoader { + type OutputEntry = T::Output; + type TableType = T::TableType; + + fn convert>( + &self, + path: P, + ) -> anyhow::Result> { + let mut loader = T::default(); + self.load_table(path, &mut loader) + } +} diff --git a/rbufr/src/block.rs b/rbufr/src/block.rs index 02c13db..1da4386 100644 --- a/rbufr/src/block.rs +++ b/rbufr/src/block.rs @@ -1,4 +1,5 @@ -use genlib::{BUFRTableMPH, TableEntryLoader}; +use genlib::BUFRTableMPH; +use genlib::tables::TableTypeTrait; use crate::errors::Result; use crate::structs::versions::BUFRMessage; @@ -44,7 +45,7 @@ impl MessageBlock { // master_b_table.load_table(TT::Standard); } - fn load_first_validable_table( + fn load_first_validable_table( &self, table_version: u8, ) -> Result> { diff --git a/rbufr/src/tables.rs b/rbufr/src/tables.rs index 6489f5b..33bf68f 100644 --- a/rbufr/src/tables.rs +++ b/rbufr/src/tables.rs @@ -1,6 +1,6 @@ use crate::errors::Result; pub use genlib::prelude::{BUFRTableB, BUFRTableD, TableType}; -use genlib::{TableEntryLoader, prelude::*}; +use genlib::{prelude::*, tables::TableTypeTrait}; use std::path::PathBuf; pub trait TableTrait { @@ -94,7 +94,7 @@ pub struct TableLoader; impl TableLoader { pub fn load_table(&self, table_type: impl TableTrait) -> Result> where - T: TableEntryLoader, + T: TableTypeTrait, { let path = table_type.file_path(T::TABLE_TYPE); BUFRTableMPH::::load_from_disk(path).map_err(|e| e.into()) diff --git a/tables/master/BUFR_TableB_en_00.bufrtbl b/tables/master/BUFR_TableB_en_00.bufrtbl index babfa11394cfae54da222e80e693096dcefc7596..8b586bc9dcd83560671925630eb5c55d15a1dd3d 100644 GIT binary patch delta 683 zcmew%dqZx5O8puJ2=HKp&^MrT4HJaV!3?3-Kxr2is5&T}!wTU`utDfOP&$Jh!v6xL z7jQuMCY%uZ1cbI?h~a_=aBxHDDNtI42g2V0rG0oI{0~ri#pFU3xrx6Uc|i{D2IAHK z|Noyc`69E_zJ3a+B?OGT~-|bWfPPk*6I^#E};vvKHcRUgXdP P#X>h?ZFD+e}K{x*dTlhb_jg{ zN@s9D_&=a@2Pc?s#UQ~2RS2a$xFP&2P&$PN!v6xLr|?4fOD13Bke~RcfwLRPU;qFA z|0$CdS*0c~W-Mg|iENnc$e}seizyB)zX2#e2dF`A@@1wtp;u%#AJTOJQ;MK7_a-h8y7qi21BM@nHSyfT1Kextk{w$^-dKnl~5DQ<=P#Hy!Mfjo=Ujxz?Ev V;r^D%jJzt7Kk`L$fWjPPBLE)8q%Hse diff --git a/tables/master/BUFR_TableB_en_01.bufrtbl b/tables/master/BUFR_TableB_en_01.bufrtbl index a4755b808a7e2564ee6efd0a7212fe8124c7029a..0197c6f6057e81ca0e7b10765bf597125c68c928 100644 GIT binary patch delta 2665 zcmZXVTTEP46o$ug8(oBp9M`e&km=`Cb# z3SKN?y)U@rVC^bq-V+=wVQng9`UM?M)?0$TCt2_6r01LZ%h)&&94%*UsbGc#8!B0E z33gYpekeG6iuG9+^MT-SHR}VxVK?in8h*a%ehnM`TBf6pxh~jI&w5Ajc@OK~1g|%+ zu5D!A5j@+(dRK6;nYG!=40y$vx?0#+6GWXY6WuYF6X`b0=zkHkS7~?{^LEM;XXWVV zXbEGr9=soWQMzH>^&>uRS~?UL!3S}l%UsKtOVd#6O~p&`12T?Q`mh~8E}e+(ETAg^ z(plD>B|J{}SUMEr$6itnR?I`vrMOv?CEkz@=enDya?$e^aW3h$jGY$9Fx~E`GQ+X(}AMUTUGR!w z74`Nj8MBPA*A7dOagru5R;12|p1y{|qUESnG&kQm)ZEb17tva*I=6B>xqlQJGgIHc zl=V<%ecDRZ8B&k*X)87EE2Q6C8`_-j$_m1;Y7RVds+NsI~y@SSA--bRe zHhAhjlG&*WzSgnzlmDy4_|gc#?oqoAW3@oTJmPHF?Mt|s25Ne?n?c_8JsI^ z8af+QcJ9txy$!!MUXl5zwl(xLsR3Wncb<>3<`-lPtqkC1^Ne)(3Kn`*r^%Vcs#pCm sQ05?7Thzs+e);qXaN^Gvm7UMJr&VPqX9|0*|GgU5+NLc}ek3XTztZ5QQvd(} delta 2249 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 delta 701 zcmYk3KS%;`6vzE@=6R>*x!fQZ6gC9?p`j@n99-HQT9S|gjY_<%3^F6#TZA{{AT13w zh<`vx8eAf9bZCeMp@tx6aA?2o_j}LFTR!)>@4NTj@9tynJ5pIH)f{-~PGpxDb)k=l z6*u~#fNT+0J?H~sY6@NOBCAAQMDG$~KJF#Q8{Rll5*GXtFJ<%*vF1l#2_Wmlc?G>g zj0VyB#JGxHwXk8F=1CKJ3(no~nT^9rJfB<9%g#lnm<4@|Zl%m#ustNHCN$ zG>x5g-;ZZyy>syC&)Ab5AQ8Bm*h^P%uZC55Zhf%`yeM&A%}&Ukgke3nHQvUW-3j9C fCf_usj*ZQIRkO4uvz^fY7G-!36-D-M*!TYf4#mJ8 diff --git a/tables/master/BUFR_TableB_en_04.bufrtbl b/tables/master/BUFR_TableB_en_04.bufrtbl index 8989c533b7c1b3fcfc25d549d2b06ae62d4fedea..197b21338ccf8df7e6056d0b42d090e3822f24cc 100644 GIT binary patch delta 991 zcmZ8g&r1Sf5M6cEU3LAjL0tobIvCNVC_;q@45CBlF40w}NXUa=5rL4EF@;_tFF}?; zhdLBpx^)og=pp(8BBD!BLE6sF=l8iTEN|cA&CL5|cTWZ@LxtgNMxx7SBg`=zuoEvc zj5vrtF-*zCKN%*S#9tWBxrjeAjJt`~7)~iB&q@t?kP<2x-WjGn#1${$5yO5T@dt(} zjrcdioS%3kKv-oM4-&62Tnr)ak)($CAV~?G3~7kkRy170u5n+rTCF_nho<4j7Uyc! zP|-I6Yj&Zcw*>e01MWkGd|M8yF9)xl7^t#PFU;x%SyW#d$~nBrr@S93)bG(LD#eru zmsL%|hbs(c9V&J}b=lH$6XyNnaOf7*ZC@Dvx>QQOqX;i1PeNU>_AJ4qD$ar#Db1HE zDsf5~qMjm8gPX+(S*~DrdIJ@&sBHUUFzOR3dMV#sms$e5Ceq;C8{_@;!nJm6nS`6z z;0pTkQ1@?Jlrl8+F(?FC$ULqVVWpbD)>lYVW&k(35bnWQ3&`Tm_}1*z{riHiD+RX zNFHD#SXf916H(#fj~3CD`qADeaD;)LO(HAL(tJMSZAg!=m+L> z1p1k|5`})3OlVp@2IG-gqIp-*cVe48dJCm!;Mz8Y>JEoPkxkH^J13oBCczd0Vb7gqP{wi@aky*QEO{WiAxzKYgmcMB{qV*?)s9W0YQXRS##*ubeU+ z`*)ljMZWH+Lpm_jX;7OrRc(XzO?4aOGXa&is2XU>-NZD+-4?10~ji%_!LZ6Q8vlPLrh>8~VBTas>f+t1g v=$cbovv(UIS8Pi<;>GM4#43MIoR0s0-_uwtYID_9U(FM<#e z@fCzpYW;Bt$!_RHPm+@d@eo8j6#oJbQt=`pLY&DPXJ!N8lkc1Fy!YnK11rPar#-vnkY{I2U!)zd0WosAtp2ea?jp>TjIuS=3$*xx+bUj`gN?fIqZ578-Ik zvcp+-P=DcE$fN$wdEZ4{CCJyDa|P5NIBykE|K)r%$@ILY1tnbA=d63E-*KKTqkhkM z$wz&_xn4o-RgpWK@PZtHmlG|MO|(tFJ?Q%ZoJw6)A`K&ex2bC)5<_SP(9oNCv1>FM z?ZMEPhJk)h_`1-ykHZb)itxqMw?%#JgeQQF^m4+p2Z!lr!V`__bu+SFMDujO%{~{N z9sG*MA?Zq%*2VE8tB$-;fY{Z4`AE6DpCMI@s03}8S^=qb_OxaLXH zN=%SVncfCj6}z$SfOv3T&%;{boLIrGzZPWIF+46EgSBFq$cZ=ntEk>Eo3Wj7;ML^3 zl8^Oyw6rWD*kiw>R$!inr+V0{`sg*qE_z-%feU3h0epGGvh-l&qOV5SOBniczL;mm twP2}oS!7qI?!wQ?qF9N>ce`zsp{{!|e{{iYN?&tsj delta 1032 zcmYk4PiPZC6vnrkZnC>gCV#p~s%*;kCNu^QDm|$O5lz7+JSK_JZ07$=;zFO8TtitrULz* zdA$n#he_W>jUJCI7!SjGkG9et9o6S7rG~@dDm79rz0ohLN)T37!phBf-B;^7soU!O z7Ik%xmPT7j1#~0tk!~y|);5h+?BtV3Zz$DgUzc{$vvK7~xL%`knY;0AvYQ$WGnW#M z4@@}rLXQp&%r&)!muwn>J~>7DV4a9PI?DC9y`=W_Y0~!SvyB(Y_jRZ_29JQg3Xdw; zD4R)pik@YcW2dm2TwA#W%H`HXm44;sxi^{QvY6vrWG(}NTzd4oG(~IqYkXFwG!Pa| z7p^3{yM@SGc5$kRE&`Qs!?EaRv8i^;o_#t~+TeTTO=3KnfK**pJ@uZ3lXQCP?4>6s z>(bfsEcYy5@Ue_ z@ZUh`77hqsg%eD3F|2_w80JiV$SyPSWH~R$0o_2n>i_@$6F`EKQyH`2qHBPnC1BC7 zjQ*T3wQDB}aw$yy%g#NygeeBDb~W6DuS}>WG=NQLWsXKOft4j4NyL#|Yw~QCOt^U< zyCE*pWX(oW2eNx7D?;a*$%QNmlU>>J;W|Nn=>Xe#lPwu8x)vx3_V(mNc7(q{t_HcU o9Bu=|yjl)a^B_6}IT1QR=Cw?o$XN}y0TG6VT-iLZ&;p490IUjs(EtDd delta 438 zcmaDOxO8p!L2+(1K&%XE%_$?*IS)J(DN0s7)?rOazN;0E!e$e#n>& z=4}M>I)FTx$)!x`V3GA;9Uu`_W{4V)jvBCV zI}Wl!RDz gaC1PqCbNQky>YT2hr;ByoDltpFsSEBJpT~!pm)Y`s;lhQ#xP)vl#)nXM z7&qLgyNp>G^%vv52esivRvE{9s9TInex{KH*NTG1H{(eF^)F*lMQsF;6~-kEb&YXO zN8M&z4WaHbrVZ5NVPutZ%H>K%(C9E`qo{uw;aM4l9Vw@f&0N`E9S$Qg_>oSzV}UN4 zP#W6gP7`_o6J+-mcPu;0grfVLJ9W6$O_-K5+_7j@RTf!w>cl+4!OGPE=TR{s<`ok* z;a!SBKA^#qcTfAD+v@lGWw;A1Le96&-KOmx!J0Gz9bbyOB(?(Ao(V|$j~(-oi9h|$ ziHVa|oK8MJC>pyfZN@Zq%UvnAhR0p!4p3n|071 delta 910 zcmYjPy-Oo;5Z##USF$l1V^ks@DnUfK!#_a7iZ(V9!NQL-M~)~KiU=tZ@aw?tK$P)7 zxPwcvw$XrvrAPz|5eo|o%k(xDSBSZt-%Nfc&D%Hg=Ixuw-V9fU4nObiEA$)m5tbNx zTZmT~9Y66aMkm0WaZ)8-W6W#J8Mk!e{}}Uz;JeBjJt(e8g25o6%QzAue#tm$5r1Ty z3=^+1rdx?WGp_}YN}+y{otB2?EFPTXA6?S4~+{4!M~z^4ykwo(jmGNCi8an=4+wG{Jqr&->el@ zquYa~!;AI3k=&atm7XEnJip+U2CR;fnW0pIBspecsIk97fh98-P7M z3S)Mf-;DipdtExx=1!Eh!sM6YI=9hZG8x`H38!t2m_m&!G diff --git a/tables/master/BUFR_TableB_en_08.bufrtbl b/tables/master/BUFR_TableB_en_08.bufrtbl index 5e20f5ccf23a0852e1dd648fcfc3f5a447efc0d0..c3ed6f79678aaca18d30e7c4d450602dcdcb97d6 100644 GIT binary patch delta 2281 zcmZ8hUr1Y57{9a8{86u(YK-}F6Jyk9W1=w@*<|El4||ZYhZgprW3Yb~=UUmMEz7DM zE36cx<6Ef(DH+SdNNxrlW9@@04rKTsoiBqtNe6l8!ze5C!H2BwoclXH=f(@+cYnX! zbH4BUo$ovMmi{|`b87WR4bQ?WKt~g>C~*1&cvavB4)D6bLNoXqEx>;TZaTqdT)=&S zpS!{R9t&5sDqgfpt@tC<2HX<(PCIyAU_l4Zb^vz-&UJ!EyM!)q&I?`_xO)29-g)#6%3b-Ti?KF5zV167tIsvQ-+{l0@CpCCpn}krv0_ks8kRCT(b@QgY!G2{j z;s!lv%h0bUK9*{UQXYeHjuokxbk}K6)p1!WW%_9-LMzRmNTpFDwOIlDB)agf0>1ObaYgpr+q>C&6$^K#Zn)ogEa5T%hhE%=siu{?j@;Im}0Q1 zbo$wSQL4yh*3+1=K~FqOGD69U@NVnvW6F!x+j5_ZaOjRyOwuz+`l@|Vu0p0)QZe%D zcFzvt5xS>ek}J!Wud^L1$5uXc1gO^WGJL30<>WB*I;Rww~zm}_@H1{i|Y@M*#e@^BFAB@<2 zsqhnKyT^Wz`=Hl&x0nN}Wz9R;p!}Fp*xa*8 zYfGs~L-o9lLW9bCGMQF42D|ZCWlz#-2H?QjxSC^R;F?hJ*a@;e%X!`O{ltQ-2%e<+ z67*{3y!4|)ZyAHM*kjPMjNKDVhsp$9Ka*8aOt#XXz3jJgFV=xpH{X&9>YP5k-1hRu H<{k4t=@0I} delta 1986 zcmYk6J4};Z7{@ELw3Jc`f=FVTd70TW{!9E6Yagzy8njob#OLa^ByU z3Kt#>%r02)8`}nMFf%34p;GXF=8zS7m6@YrzG0r(0UfCa zKQpHqpc@*&EOXcky}{Id(1U((jhP5QhcrPE-||-e5x?U>u%QWDW}aw<_P2m9nM1A6 z-`k;dnnthx*%Tz2u7Rj?g*U)HF($J}#GPacgTULs9E}Wy{k{ zl}4Yf)5?|;HeJ~K^snu_vM(xo!s(=Fxr?G@C(Scb^sH=F`4ni=snMW)l205JYSn&& zZBiv2P&sl3G{R}u*)CV!mETgzh*o@?i={paRE)D-o|dn`X^SM)F_#fZX1U>dtUQs| zT8W!pS0a;w@=jJeXv}?;eYE-@{dQk7bI;JlQZLO_!Hyk!JjVH-+(G*2NthMT>43Y1 z($%NTm9*MlTXU9gyD9FsP=mS@XvVA2zU@zyEl2XSZMBJF&sx({^yEmll@8WjHSe}e zqdR@{v2MX!(dpif+e+nCPi3X{*H3Y7vaT!jx6Hd`Y10;?Ck@6-$lAplky}pP%@ZD> z0q;S+pRDGb_wUT;^epb95g$5{rzN{aKYcgN^L3i>-{#oTmfT%MdjpqEdsbCzHE@%C zWNlKKk@5O~_AqXz*5Ey5#vrT&r`cIHYP#u~QUzLy1gWt(Ris`ur&J(0z-Yom3!0!( zd)WF^nG3?4RdsyTnl?9N)Xfs13mi=L$rCQ_(}ys+F88O!{(p?nB2PzKaYp&JNi&jo zNfA_Jk*j5+!x0z#h)gIS`4Uqqw%$Hs?!pXuI*b_|b;f9^lfW1xghJt$#bz3+UF@xJ9` z48<@R^0W-C$L_1W$Y{pzr{}%+QXraqRk1$QSA2~`=a>78)8rh=cY3b>l6gj+XFWvW zIOYxCusLr(eT$zq{d5`~`1=CHOa^^ax$6OUN6l22zV4df#>&9S-IEUWQ4|;d1CQ|( AA^-pY diff --git a/tables/master/BUFR_TableB_en_10.bufrtbl b/tables/master/BUFR_TableB_en_10.bufrtbl index e3b0e4c69118064751a580ec71ed1853d29eaa6c..2a5e92ddcac6e176d84921ecd0b8b8884d717a07 100644 GIT binary patch delta 1537 zcmZ8gT}V@57(Tj9w|O@Azo}<)i?+GS61?duBqF;AD!r&EOoVBZawXY?$W{^=7$m$x zUQ|?<`^yWVZVE34MivBh5!gl0&yC(h7m26u+xz*RZyh*1=XuWiz5n0imDED4-3BllSl-wM3fggn%YxFT@airi&Gd@8WVUgLS?D}E?5EojiC zB9;X9IFMHbUU4Gd+lsgS0-;DQHvmlv@r@SKnHyrOK?J{0A?9}Tns;)=k_ zLF8%(u`2Ld8}d*);v8qd%C3S`Vv%3T`*!E zBeg8lIQ%h>OCAoonFq@gQi?F4_CmVpA}J-rK1EjLvu$nKm43UB-^;kEA z)HDCZt(fAV2kh`n9VYuC@YshO({;ADSjXa!jdW$bxs3Wx?`)sLhfuJlP+XPrkA4gD>GU<;73#?!*A8yejO+X2j?R x?!;W@Bt>A^vh7PojhV51a{~wgHVIu$l delta 1281 zcmYk5OK4M35Qfvd-;dtBn&xFRm1~nCR1pzMLC{SQr6P(U6sd(qQ5Qk2NJ3Gh*g`8) zXptC23l&PiJ)r%kBa+sG3TIXQk?S{t5EYSYuW0=!|>8OMmM;R2_O2XK-nb2N8elO1|4~>y^Ry+ zBz59KNQOP>24!=P=lu9K?{ozY{J2eYvKBxmvCFaGB;Dg3{0Vk^<(p26ZM_Ix?y4OM zV{Pu_26`W!(R!;gZ*FDpNPSe&uk{D*g}b?tkvtSZ)9S diff --git a/tables/master/BUFR_TableB_en_11.bufrtbl b/tables/master/BUFR_TableB_en_11.bufrtbl index eb500a05e31379dbe33a246b05e126efb3553aac..bbfa2cba63a6ea202b9e4d6b811f96377926b5d0 100644 GIT binary patch delta 2366 zcmZuyU1*zC7>;X_=Kr@%(l1S#ra#Hrw5Ec)3MCi4ReIsD{;bRBl-71rp_2;h&!A$5 zPGTR04WtB7k@Sm9*u{jhtAV?SMP%Sjg@C=-MOPH2^g>s^bKaA4z7#(Q&-c9N`QE?t zo|C^yKg^V$U%hFer~etkhXQ9$iG?=8uLS0-#2*NpwGlrOxNaw&YA3uaaKb_SXMvMW z&Q~oBda;yTBxnd+a1&2?2zLZ7c!k|Zcw6A4pLkv1Y=F2UNT>^(3<({_Rf}aROol** z5DJ{=B>soMZzIGDQNjlTr((qS1TJ(De(x-{bmGspb*Zlz`Z89mA4=UeR(u*t-Vn~%W?FO=Ll?#4NEmh7 zC8@9Bo=d|Q4j)nHabA%hQ~4{_B&J*!q*doG$0NP?-8F6cI+-;Jb)S=#DoWEQ#5JW%D(5^i6}l>7MFXXxb8J;eKDiRL;y$LYtjQNNkbv&!k50c zrM1epDeu1_Ej6&OOW_!v_*FY~o@>eL#jQZeq}{T`aU;-`*0D!2(q}UTKkSFc}W|{K#~^+Ol$o zuT(lem#OMTQ{p%qS(272&12Ywza#S|>u#HdwdnQ#@s|rZF&6t+uCR$Ji!8mnFo#$9jD_t|kC|>AWlRoKW(s;DaRvFX%=C09olE&bG zxemHKT=-@{T~*C1Foov^&&!NzJfqu#s4Q*5SU(hr4+Cmef;b%^RY3=;Z!0PisT(p3qOXM-d#JHC4iT!FKw);TdVw z`7M#peJU+AK531d`FcVl|wyo|sqFe)|A=U*Svpv|wbr7tKD17YV=Z*X z!ez)>hTGS&4P>}6XrPimke5Lb*;5&A^ug_ED}Ct09^CL{;9%hHIltdcvb=omH|KoM z?{|K`bI$j(f6uIs7d907#a|#kW}a^$eZaiuA{}Za7MYW7(odM@J){qrmX~zEN8DhB zRH+NfCVeQeHlDzY`$_LH=K`cdLE3Bj!ek^vMq5KJ#=~=z^l`%MV3a zi_nBrC$Yx7*hM;|6StU|D9>Y_jFH}DPIQxg%$zhx?=u%oTifxKL-Aq%*5kxjf>>it zBuVcwXL?90DdH+K)l0g_oaiI{gn6-_^mFE1n&KdTplEy9U|74lNr)` z%(-FGohOLv%+LtwEoLT5dYhRaRp`{9nuubr23e)+MRRC?yO`sX@HqzA7D6+p&qAND9BYKV-*3E{+?XSyt0g14o`)QkC%3 zV<4N?@U8cKUU8+%!1`btUh~b$6-zRslCMzroA@&n!JInJ4w1uw+MNGFTO)r9Np}># z>uoUo)9gsb4Q%=^NmYV~7!O?M^~KnBz!?)N8@yDnh6OG4I(`YBV(&t`fz*&2uWI+$ zFZOq!-Kyta#ELhDPulPDxNzjtwj)H2ii|&{c7EP*fv1R~Y_*nM`010+iJ zQzD3uyDv+ZIB1r11;sB}g1dOiC_mCnYU zDv5YA13G?;zsoLae**Ifr;UxAC{`I?XY;s`d`~(`5Rv~)Ua7~~lyzI}X;e}i3_7CX zP@AZxZcA?&3px9W^v>74&OW_(*89H|`>0dYH_;bg{~gX)#NY03p1l*XJDsLZQ}uSz z&K02@(-p1AQ*z|#gFg5+?}n}zRgEsZX7*xah^|Lf?sj{q5zVRUo6=8DfT-vX8Kk)y*{d8;ob=Tm9Y1I38L2>A zqqjys<8jf^y%s+n_`?{;Ijf4S)^b;xvJQ+j#}K=II7Yj+SG4<-&C{b&lB&k4A|Jh1 KUR?4yPvn0`e);nN diff --git a/tables/master/BUFR_TableB_en_12.bufrtbl b/tables/master/BUFR_TableB_en_12.bufrtbl index 5fe1d6a41c0581020c3a369a8e5c012047bcc02e..0e07415c78141f263f62335660f5c8dfea3b481a 100644 GIT binary patch delta 2577 zcmZ8hUr3u*6#rKLn`qR=F^LsgnaofW26iZ8Y*I?coXk?Tu25lt1rpZ4 zga`}#3JaSsp=BE;oez_-kuv(=(-8E*2OmbC#uz9#);$O-xbNiL-0N*1{J!70=brOB z=iGaLTl(pC{|4SReFT9bj|@7z+Z!gUm|; zr-qns3!Dow|65=(#N2+7aaEu>%)BHp5jNhgSoXraFc)Fm5qNEc`GLUYDDxA6$r$t6 zIOBsV!cmiJqLZAn{zdFMx>2tAw54j@ z&!wek#VX<5`iGij4V%6IVhwks^|9rb!FLUxNDHaRV#eE#o)!-l8WY+|9>?J*eu$X( z=gdl}5@pj2;v=sOcbcZ;9*Unrx#^y?kZ%f?o0Ww#MqT4LYQC!Zm8@(&Wa_WtD_cVA zTo;~M3cKysr9V}iLfZav-2d!)hqFkxC=2PUW=UYNRpqC6>)34lQp=FVtV8W4<>X`H z(2>^slGrpmvC^jWQKl6fwkbdE{c$*mxkeklZP&Y&#PfDFVN!D!QMZZv9kcf8iJ=H+ zt?9>$jt^veO4h-euv+87FXyMFD3ZEnwUfp_g6mE-Rtl2EL#JLA4SE_McB+QZ;F8D% zBKYHsm4syxb*bGv;2G~F{OM9zcsxNi>As;etD~%>Tq+0Nsk^Y zZ(S7S!}(^s%7-j8EVp%ZGO{leYXwVPx{4JXpRsVhVmyxTyOl1k{CT&koO--mxvu%1 zH)RI0TKaua^hR8W^{NOImyY8&w$50o-XuE#@j&ZE}l^Uutg+ssUcXjvI+RhAY z0rl8$t+{}%)Y3H?KyYwD?xg7a5S9iPvYREG213{$y{W~k-VYO> LT}sI3jWYcYL9x7Z delta 2230 zcmYk6UufG^6vw0e-*ij=CHZGS>UTVmWK0g1ID2RI8%WQ4JVqmL ztO_Gdte1t6X4Xr>n4fh?m*j=kE=Kr zc?SW(&%pfd3+C7&W}I=2&EcCT`SZ zTpu|+t@*@Jw4cNKwXDeA!qZyLnD$n&-O!2I$T+sVN3%-Sx8SQ#6uV^sd|daU}`vmSCAFpugiruELs%Zpkp;o-=OS_&etoW`tXKt%A zr=0!I>-ByXnV=s}>fdm0X(Q7x@2b4I3D=DxXED{touI5|vE4ZBo-82K^rfSy0@URZ zbDU;D}8bU;V6upZD=&Z#a&@m8P# zpSExeuH{cH+!xB&#u-E3CWlQ!@2QM~I#Le1$sshiau3M1fT{jgTy6cp$&Gy4}PusU?kS!{ObdeN8hwVOT7xV~=|H#+r63*M;Cp`gB>G#*CTFGuo~ zb>eK7o|6*pblr4)TX;RD?Nu#fy3Qp`b?cLPRP`L4sMCP~-0zu?Ira_5k?6hX-kV;6 zQEc^cCNx8NbeU{V9ii7i--+T5VK%PoL2nDcJ!DJ$AA;Sd_ifen82;{i)4fSibsesv zmqOo*CMJys3AX2s(nO36yy9BexH-W6r+u2{G-e021=Ut(d<~i87mh7W9L=DvoBG;P z+#!y%o#H*Z3FkdO#Cg;HqRP#L@5Hp@jaKq1l8LFf58t2Qnc)~TgY?xre^SpNWj%(C dliY_jZ1%-5GOVYXvZnb9;K}erHN80$;eWXt!|eb7 diff --git a/tables/master/BUFR_TableB_en_13.bufrtbl b/tables/master/BUFR_TableB_en_13.bufrtbl index 0d52b9dd0ffb5c82485c2fe3a0b5476048374218..3acf0f4ff07e14a068d3a4ee35223f7d4d72a216 100644 GIT binary patch delta 2339 zcmZ9NUue@;6vs33%bzxX+BCK4pP05LZA{Z&(l%Cw1(EH+F=YnnK&94yMf@{s=gL+# zv114-$|@Yef+!KfhOW}$@5XNTbqft!x@)r zWIZ{8EySwiRE+F+EAf$Jv5o9sC8yiT4t5Y9NS5McH*S!A$&V6b`#X`C-?bpV;4{+Y zz_lVd)lIg4BXLP`G)eZF`$W^Q3T(-03Rz0t=A<<;QuE04JCGQtFt~_``%zi1TXBSbko_6>&v`?+G;9lH> z7oh{1N2pipjKKNuLEVedfdA zU)WBDKnv?;JEs*n@3yc?bk|u=8|;qlR~bm--(#$?1rzmnw$`uJ8mu|iA)AfD$8Beo z7f<5Uq797pxAw#SxZchkYN4VRVRc;wk{x@sXrbtx4ptNu!2Pzy`K}h^(m7a(a|Nkq zKi|MTTXB>;yVVcT#8Fj6k+TXH5)V~Ayp=l#~7{&~-OTyWG`9!$bmiffN|#pu6NdbH@8 zOFi5*coJt~)3B@e1C>SG)r7@feVy1#sB|pNQ$qK6ndZ(R#V>DS#i{nO4EIL`yP*Vs zWe%x)q|i(sD}=p<^OwzXmtvi;tA5V%nlgx4`Kq61g{s?Q>eUtJUNm(L#9MGS?}hz2 zo+p|U(c4CzdlBDW7(JWk3JbMmFAlt0r#l0jg(BY{WDia(o_~3e&rfsr&5*91n3HHh z*Xp*n0KXK*l~xw4V#UTc^E-obxraFy?R;~XcP2gaTUbweUo2}Ltcz1)-lu}^fgBjy M4hG-+TZp;%AH?Cnxc~qF delta 2031 zcmZ9MU1(cn7{`yxcfXP*%hHc5&6=b=O>)jomh8hju@eUyWgE)a)>WBho8sJ@;>3%l z>aY=m44z&n$X0L{Lg6H3LMyvy#a;|5%nNY?!66LkV0U`43u%1c_y4@@@Z9{)|2*%< z^ZeiEJwLwp`119=)mZ~ib=nlU``U2Y$~y6{2j)1oV{Em5~6FSlb&M^;$p`S3XMWEB&;0kjx3hj-7-!O~YrLG#rFY3iG zuEjCH*#SOc))LUk9&nE7^g{p2oa}@4_VYOAcoO<4v%VAhP)bnjZ~P-)#8V#tBWds! zv$6~N33GZ7I++2Nn6G4^*O}8f=*SSb%KUH`I%{HoV^zG!=kf^HlLwcWM+(r7n6)Bw z(gNq06&w04^Znh>9S*p{94|rtTQV^7`W}2R%ivw+g$fU3(y?rw1`>Yi^o;wy5U~br zgeJqy3uBn8T?qqnlzTR=wa}zQVkj_SadZs#mY5pDz?3;M~c{58)8k`5USdKMa7Ws zaK|~NT(N^iKXrV<^ERw9{g8;!Z0AW;PeasGBR83+Y}ZLO2GuX7yJ@xSjQ%3lKM}_I z*sT@5qUO6|{t8V+?rf?${jqI?E_F|+xeF>cPgLhN)@jjv^aEa3Iy;aE&_wJt^~ELW z&fhWZj&zo`YiDJZ`{P&%&OVGI)>LQo=?r$7)`elHNylp6Hj}6#8XBIkJ2pNXx0My_U!xxUFW0?8^@IrO&gH z9kiH!cH~ANPe*rsuHsEqYk2S@-c9He}LTu2|??9&-418od)Bx@Ao|K^SsY_p1nWyGg~@d zY%25_brAOjpE*eqN;h#qFcT%cW3s3y`4|}of=}Y42NJ|@f~6kP znIv&ra4JPQm?pjyJgbpD5PY2>Z7_^YPR&f_XKu}*;EiD2@zBp-`(yU4W7nzUy7RVl z41DqE_~X3WC1YBxRuu);igZ?)b016bAzXHkw4LO+*4*!ejRVMelx@8&i49$(>hKBr)5rFt%P#o zB)$j7+cNODb6xhhs^~P1hU*w2s&%tE%TmLHTKO--k&rz@4NIYlt#*@5>?kgVAIXyq znEiz3WgPXbCNw;cT(P-%lpQHVyT_!<``N%;_nOUNTM$Yk7riR0ut~7D_AzQzp_9Y0 zH5s!iZlaekk+nz0pqF?jg@# delta 1160 zcmYjPyK7T%6u!yL`*HJr-Q=bjRB)&u2oALpYp8YUpqtd2p@Y_HDIKavZA3$rHbdZu z76~PPKuB^ybQN5L4tD5Rilc&-E`ozJ<~+RSF5msm<2&E){C+R2aGjkEx-X+knxpZA;kQn;N39u zW5I2W`AmfIKyWU~d{3|uV;+h#wgu-B$R`x#n0^#xImrb|im@eFPBZ^4_%y@31g0ZX zI?gfM))^~##&3dPX*zsxY`V9G@g5X|2HbJ366?dP+W=L4?5EsdFlfW&;uSb@CE!rK zM$zstx&}Lei?HA-OBZTSy44auR-dD%5YmQr3W~ z_pLbUY6gt?*k2!RMT)TJTNuez{hPL08+IH9Bm(Oc>5I3AHfzFRyaZFhMT+#u&8$<0 z{ooV3rVeJPMhwr^7%JvK4KLXpbyyGo&*Q`#3<_syD^+b;oSo}ne$U1p?4xh`N% zjdBiWbja2F=nJaG9W_aHKDI&;J_q{z6T59kmZ_!|zagr)wO-TCx*% za%H5W>Q6&BQGxMP+3w=$kmBjMCBEV7X|6#(4M0Er^aIl3mvS}3F9lD4dzqr0jAf@u z8Fk)~=dJ8(J5q;pIo>9!wkW@=otABSAg1$7zAIDbm-BBz4$%Mk{C(T|OH%lhzem0- k+V#!ChPcGHG$`en4if#K4Hu zIz|3fib1gVW`m>_L_a`KFrq*DFEOG1CR1u8GY%J{_B)Yj#_kf-g{72nNt)FjB&od&Uwmd9 zccG5CkzW{Zm!od2KpHEN6O7Fs)C-I!s!)f#$R)^fwSj`WujM7>65CyPJ?{##hjr z^R$2t&UNxnWHOm|5HZY~vlaz*70KW;_Hc`;Ssv>w3JjWSq1AMn$5BX}5fV87pG=*6 zr2?Zy8RAuDSP56b&D<#Wr+L$w|L@#U?w^3SHW@xvxM4BxDECbgUlls5g3ytFnfuZ` z(0w|f%-qGTN%&hJ!?gK4x2T$BEaHKKmi;`Y%FcZp8mwZ!sunZjFhSaSQWs$~Plh&I z|C-gRw)>y9A?~NZ3zH1@3-)tM66ng8E(4{Fc=F( zh3Ssp!(ibe_aV`(w7L~iZXNhgDL z=9~Kh&qr&Lg5L6nx_q?%TPs9#h0WC9f2)>5LAX{qyvCYlQ|5*gndCmtZXTCTaxMJu zh|`mkY1QxLKBP)y+Q))c_+WRzCT~plhVF{a>J#rVo{`>}G|-;3`fjYTreN78&V+S- zx5tOF}_z)ORaKrnq+uZEBtXbf_3`XSa%t|)`=OX zeOK9xJK;j8oyR5_N$gBWbOmqQ-Fk7`NPcoF=`6K`&*@k4Z&ioRO20CAw&OZ0?Wdtp z>=VCSZ3c3t#&f*Vw8OLHJFy*-*WK#A<-E_m@8*7w@7 IpJ#gXe-^LF_W%F@ delta 1755 zcmYk6Ur5wh6vuz%jLtaf{8cA)MxB}8y6O&M=!o&~wcG zF!UO8CIY=(2cI$1QE1y%@Gs^!ZJO32P5+5M^7nHL^u@tBX1X0(>j3XC=V)~EWBY_K z=GNEO7bx2qrxwQ^x?PsCN~=Msa-EWPC+)O+r!09I4Mb_)a+cRueL8iAoit=U$(E

TsiZRZYfbrL{VoH`G1;UXNSNp<0iZzV)9eb?vh1+8h5d_Nclh>Kof~ zi8E4JHy~?tW~l)ljZ%-t8&Q9rK6yg4)_g`xwq*PN(9S zT7wc|ezvz?P@d!$z9fdgkk!wMHJ z!Ut_aBwSdu2p4{UK0s@i?QE{+ddG2K_;LR8KaYFnK1|+6<*Afnz-N&|b|@Q0jJHil z$&7rXJhWgOwj#eM6E^C%BO8<(JjQ+j*+ixcYYzHBM7~h&J2CE1=3E#rxRHO9vV`%h z2ic^Idohmqs7@)X;mUdJ^eld~7e0U}m*mNj)9PD>m^TQYT!txC2>F5#Gp3z=Pqo|a zenZkZ4iVE6Q!A=kfR-sckV$G?m@~{%?s)pwxuCpxCuK*)9 zeO3g1Y&Xn9x+`#OPqR8Wx0lz?{Rm5*QTX5!%vVzT1)*&dVOJQ=799F)1)c{K(zC8A z6Ogt>;ZoevO(R2y8w0EJgsJ2lb#-sAOev|#ty*CQc3jI$C3TDN?#eTT_=>RU&JRr; zkh07}cB?>5(k3PfIWI5|sdERvo-0CcM& IJ3%V{14Hh``2YX_ delta 723 zcmYk3IY!nmY_W=nh&CP(tVP5sg@~Y~SSSc07(v0KFcyO1kwkwrngn7Y z79u%7Y;6P;#9AzZg@u)cm4y)Zy%`s``S{*H^LBRjsPnWV-JM9+(bK08-$(!NoG-%vLcd^MtrFIva*b4)j-ynvF^;H-}P5nR174&e%Rcb zTpbMvBD7ucR}L|#r#KV){L(XS@yEo3zd-E6 A!2kdN diff --git a/tables/master/BUFR_TableB_en_20.bufrtbl b/tables/master/BUFR_TableB_en_20.bufrtbl index 48f53e60f63b37ff47519426be7d4bd233ebbbad..07806574ff80b08e0db18a36ece20ad32bb85795 100644 GIT binary patch delta 3156 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 GYyCe~?4l3= diff --git a/tables/master/BUFR_TableB_en_21.bufrtbl b/tables/master/BUFR_TableB_en_21.bufrtbl index dfdf41a2f4b782ebf93bbc5ba6beace5a1962205..179186f432ac06e18efec5972561b1948a1e47b7 100644 GIT binary patch delta 3946 zcmZXW322l@6vsE3V{@6q9GlDBi6$}krHRR!!$fo1D8@FWv8GkDHE9iXAxn4LEOa3Y zS@@@9!GMvJD({@=cN^Pe~0 z%(qWI4fxy};O@4$4g41!z`Q2dvVrwo!GVpe0|S{C1#5#?F9~)Av;Ib~KZNyN!G0s_ zz)(MJhAIAFNDbpJ+=9k%p#@D5tUZD`k*pU4&6`+X7d#NfdPQ&~nsr1B)9I(pUO=q2v!JH8+%4F>mtjuEll}4K1FqqAOM}qbo))~3XCBeZw zktaBs&)Tq+=@2w-W9<GdtTT$4R|L%^VxZtiDQjaH z^SaLDRa33$|c2igMft5BW&uc(sTfXG6}& z2vzKqYmhD9GHyKk8=1sQxH8Q^T@ju)6u78Eg#0r$>?e`qAcc!%p(_5TD^E& ziFr>(X$^Li#H#*NWE7WUPs(~;gp{SDVe_aQ#p|>M=i!&lugWMnaiT3wb($g`+>V=+ zIpo5EWAUo@G@k{_Ya%qtfb>{4ldzxQ6l!G zz9nA7M!NJ0mj#H(Y?68G^iZa9N)bEmWvY>vu)N=d;Vd;LRp%4DAzPhbb~~A^ z^2jaid@AyD`sAGC*oE;NwHv&us9gO>2PSg$zFgYbP@~9&$A4N*HOJxo`W*b8XO^>2 zO};A*=c~JdqEq-He?sO_l^Jwwh3wQk?giz-xb59_IpfQ1FqIB|QsO?uXz!L&r2C_XM7Qe_YB6|1L- zJ7NothqL5Ona3S@Rx%-Lc`*@{gxS*9Wez!*L3o+!kr%6pdHA+W-99v*OUp??ce!#w zBRyCwS1x!phbq+h@gXHy>v!b|IUm*X`FFOVDiY@^RR?MGtoX*R%eVM%zWY@#>!MaP zR;#CqyM3ct-)%SQYE*Cesk&LC98-r}I9jWAgxC7?e-XMb&+kyT2lp*xr+RK^qz7|5 zRdt%riMl$qM#^#H%R1$WyGU=$6ZICkKJsP9o3E`2RG&UO^z ze8XY6=ku5=%R_FX-aDV&3ypoU9yzgMqglO+=CRnGjE~K4%N+9cVvk}_v3pp4L!<5R z?$-Bz7KKgIGKYJ6vuRv<^P#6c1*e+T+lgjy<8iZE6`$g<7S(BXn%Jt}{VAYTfA+1& z-=kLJ)#fU}tv!Qs_IX6bWZ__&>J0b&Mw?m%MYKI^U%!X+Hu<^z9l18jn?c{+^)8?8 zRW2!q?zv33_Nfy{QND3Eb*LMc=RMo8e%|a()fwu8cAs>rrbUV*Xf}TB z(*N#oqpw@lqApwTuv@>QR=m=)wu5vt{M~azc2K)38sah9t3TgP{MM^{lc!M(?^o|x k@-&5q`}Mm;@3b0x_L92i>3Oke(PYH*9gKMK+mW392Q0W0ApigX delta 3374 zcmYk8eMr=I9LKNqpq1sb=TrHV52baLS6XVGsri^?DvMRDwMH@^5(B z@ILThLbAyw6}hOjSV8>}3`S6kqJcp{K{6u83>ItPe&65wv)?!WdEM*xefWI7pYH=+ zKD*$>cMBq2{;-XI@e9aFq4O>JO<~hQ`iwBNh@Q5Xj0y9Xhzr-m(Z_|k@${Rd-?n!t zKim^GEu&u%)-I>t5Y{Hh1j79*=)Vg)SJIyf2NUV9gpnkAe6ph7W($}?^qU4%eA~f7et0bO6w#B`kmrQ0#q?Xk-V*vl;lWaI zVSgF@l`ycDzGxjewvO>_`Q`j@N$9Mg-w_^MPoEJ6HqetCUhU7xAK_Pa}dW82Ns(Z!R<|1XlXA*MpBcNPXLd$WWt~HzLk>~vq?iTBCo9wUnRe1 z^^V|CVmgviJ~6+jynH|kYo%-u_S6BhO=TIyNa~1XA(W>vXSMPmuBNdn%A#mVXHT_q z51yp6MruwE-p$Yz^I%#`^_;}?ib{NGAGD$b5tr#Vv%i4(?h^c%`GMJ{dWTV(#a&i* z99Oe+okDPA>+GVqp3Qtzc3!xXGjJm3kU10AIi16Ga^3@Vxp3$53s?6nm#b5C2w-T{ zoBQ*672~Rzf^e^9Pi0ZOUd^~_oEM{cJP)eP3wypk%>m>57UAdo{nqMy$SdGZsIfsj z%dNxXf}K`n0&o;E3)Sw!PlfEQ@(rV=NLNOk_^+*TUYuN`vrxN{i`3#Cvt5l1VW^mu zW0ng`bngI8mFSouxH}6_QF_G6Ich|*V@GouvUjY(AEhp{Ma`q`Pzer|^~qjNRoij5 z%xjH|;qA4sddKj$nA(pRM%S@T*c!ML3C8m)Hoj=ROkx&aA5sOGx`)x z7ufOFdY&@Y%e{g1Qn?1P(7`iz9wRAseB+>ghA@ z*370OX3X;#PR+wV@zpr9*(F&_xk`{#$=j&r4jK0=2WRTb@M|S2r*bnQI`!ENA=Icb8|#QLXD`M5@-2j2pd8 zuRDY%+jvHpx7}HW8%-Iwu$?a|zYZ@c!P*+$GL=mXsNp`U_9z_fndqoxM73W*+^*HP zEQ|wnjL#~}*6H{@4DaAL)#gEBz1v)q+J!KN>-D%W@?4+GnH$-cj`+%C+;{1mJg9Hr zST&OuR~z_NUcf+dHoA9yWX-E;S%$fty0;JRMqRHl%r%Z$l?`FEi4{^Si^#q3ShIz3 zy;)Z`hMryegnKc!OYceqLoGa2Y9{0DYRo`ED_5ZE7{P2^IWD&zw&o5P@7roLwCVTF zhqG(^l%^PPNIIB%Y71MctcwyF?D zWtZNI5Ps?6SXFDj2%qigv*L#FXpin4HddOB(B6;DcC~g7;<|P9y*Sm)y_$l$NyYp0 zO$q?}-h3l+dbnN{cM#wA@MTvyN08U6tE=AJD!l0B?NinD7+I>0YW1< A{{R30 diff --git a/tables/master/BUFR_TableB_en_22.bufrtbl b/tables/master/BUFR_TableB_en_22.bufrtbl index 96a240cd69a73c057e049e9c44cb2454366f526e..b76e1e867cda5d72977441c488ced28e52d2f7b2 100644 GIT binary patch delta 3917 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

7IQ0 zDmI(mwL96O^f6#R5In;e?Jv?IB)u^>5KAQ|K|KS}#jtIsP- za{e~e7vJQ$r8wg3K3ZSgP4kU*vXnLiSB!}J;h>L8cL&esrNvTQYClOEfw&}kutv+S z^u51KD=gU_0%a(56z6OhYw~`NiPk3CQ2DWCJC25=(Y^9x91U5EhbmBuq9(+R zepZ2NIHUT9f8AlVR^IO^vZj^OWMM2Fs@xm2C~LqUX5p)%~hr0@UpiMq*il>z7 z9<{5u(jsz(mSnn8eUeAyEoiIpESnG1pyvIm4Nt8{*vw?vq6O3Au+b;s33PEwN3d{ii!w|j!`4rE zq1Ltk+p4X?OBzi_w_z)-F=$s&9`T)a?LhMFG`W`EWiMHs`SgQpSlRdC;p;%*%7A#u z*VakZogK^O{hdqmqN(U@bhR;;#)>28#C9!Jsugvi)MOdBMFV&vSol&EQCYY42FNlp zxf1DWxAvT(-9=K8r-QhDrxWG&bO7%epMu= Ndj|FLe-U}6{{f?9YbXE! diff --git a/tables/master/BUFR_TableB_en_23.bufrtbl b/tables/master/BUFR_TableB_en_23.bufrtbl index f2a2cfa163528d819390ffed2fc3a7f6902cf563..6e7604d4ef712d98e9a3f7bb27066e3c4d63c1e9 100644 GIT binary patch delta 698 zcmdn0FjH}YZv7kv2+&}J&}X1@0uzL%C^p2G^^8?Zs>D^NOt9m40~ zfY3{zvo^Z_WH!vo<<@IvS{P`ZT=!WZC&&@(2!>*obIx*Les z{Qv*IW8yoh$qN`$Q3MxE=3|=92~)OuvL374jFI$pWSA}pCG zYSw@aXX)gD8MPK@!EP?$M7SAbJ}`u&CUKR*jR%WOuH!-k8%Sge z(D%}lWBIrz+i0|41*wFCeF delta 598 zcmYL_Jxjw-6o%V0-%XRf+7NMxgHRm0=p-E_IH;S0P8M{t;36*F3O4lwY%%Cyh7OXZ zl!8-n@CP_L2>t=-?9_PgJ(ufU9^P}#eb2{mZRUlWH-iE`uZVo(+?P;WCFFp!DWm@6 zyi!o>DsseG*LWT0xsLjmGc=gqE%+uTzBn(-s8=oIJLf?KwQnOc&ZxiW8C?>~@;vWA zplrajcqAe*1bPGZq!WeKjN#UBp)NVFZ5i+*9g4bF2uf2{lfhhb!IxViH-bm`nW+is z5t1HVk&F9_>YaMcex}SlQ7>3_Olo6rwR=(9fz+zOw{|Kb37PJRsgyY{opq=gXUuKF z=6Er14(di$t-_Ak7WNU$O}cNC2d3Fs@9RR^2XV3ru delta 323 zcmZn>ydW?^C2^oLkJ=4dic_e2`gYvMFOWCy2N4|Ns9>K+=fJF+K`r#rQAVzRZ z)@AMn3$6nyYXK{}%bX4uIRF&d4c9aU$dj9F&RPhU&jIT=%jypn0a@My7I9?DM-#aU Z6#>~(F*%UE7%snN@276fn>xugV_h&LKc^>xO@NSc+ahg`EgFqJ@?#m z&pG#h@9~^}#^>B^>wRd#e>HQE6T~BPQJy8^0RdpoPTFG?ZtFU#Fv7yb$@A=*>X+1u>Y3a=r!mlo-fDd4_m58|C60$zGG` zvGIq=bi|53yeAGXLfO9spWz zqQ{4F?*#qfYemH*G1!Lk3~`_x<&}QqI5DsT<#)uZ9b~tY?1Nqj5Aq?=+e3E5Fk~iySx&Dn#s4^rr8~gCHyM6OI;FHjP+)dIck(5r zi9v)*-mJj4j3+90FP2HD7zT+raHi5zM?cyLldrB z058qKg&*UKe)#ZV95yA};o^b^n(e_92UMq>QJNtbt98Q9Y3GzC4((au4C#lJ22T|z zNrso{L8Xm>^d;lFzVL|Bil{{f=4WsQqEJ~|1m9+`jo2a20cDv7v{k(s4j9ZlmJojg z#>{!}T~7vhE$5XjM&t21;kTMBn3vV0ei4}vUM#L8IG1%uX~j*66Sh{`Av1fo(heCh z^k;Jn!mrl_X*p+=P1LyKa1QS+&fMhyxAhBU6DLguytZCeT3i`gl(14{%et5|kC}=r z=1dJ48TI6{4OZE+-190gF>$XEQHe_+VEbI{hj$Sy5CyvAgtCnb+Y!TdV97mYJ7m<$ zvz=uSw0G#*3@7|yKdNbD9Rx~5HuLst+V69n@K@exO(W|xlz&}mqDBR|99%)73q(~! z9DLR|{JFdWd``|#)HwZ=lTRNrIv`k}dzRf~ah+6WlyyD=W7blLy85&TM3pYZCmlif2-cdYConZ>o}`9WpxOY_=UvyAz@n z)oEFsP(yOACTNUVUd6SDw_>SCgSS8)$$HFhbC+FxTN=6E!kktalxYvdN0UdQtNnMTph0C)p)Pf9=>~=hT|SyCE^m3 zx^p9UBW7oEDr{Plrar%V(%D}$E(LwSt;HNFL$h%f;k0{ z(Yz2o+k8;-E`7~xW?$GV{af@&BHxqSO({^bmCqPArfR@e0&liuf5tAtZU z;NUVlWHsDSS~;mjKZ}YPZQz~cd*FmajR{d36N>Ls%v$l5y0@mnK+`U@FTQT+%?Ff5 zZ>GM)>EywJO)}HTA4PJ+VM|==;+7B}SfaQe)S01b7k^~MjO>r@ z(zE||#|G%}TH)yK2JQ4lG`sa^q`wp031wFyMqD?49Eh@WJK@HjYnmVV;JJEuAmbRs zPq>h>`}pC^S;Es#RVKlky}SdKU2q@AC7v0vgRGv#`?-2B>#|mU+~1Y{@$*-f^8Y?Y BUJC#K delta 3566 zcmY+GTTGNk6vtN!xZD?9uI_%jaz_vlZ!3bkTm-~Lkc%z~h%Ifb#X>D@sG*|9HngRN zaBNBw8z0I;8!5Y+5Ni_>d9VpdY086XG_jGiq@hid(wBw@8#*)pGf4O4xBqXxnRA(Q z&h9_6o5p4~jUF4iWx}Uu6FA3g*$lnR?0*5;8UhBG-cabMFz^<$Xbbc-(`$x)!t4)M zddOsoz`_-#ITCu3Srr96&+LkZUS#&iK$~O10MloI{*yTv2W^c9ClrN!*H%1u!tAj^ zI}^YeW>q5e9MhKsy~-R+hPI}F_n5V*(96vJZO}P3L1EvtAis!@&kimzuNcra2RO-e zIiVjg8@EF*GJDdXGt$8?ncfV3k2#zP`zC7^7Va?{v!R!n{W;L4TyTV$v4i(9tMYgs zb2uM5XD2wr^cFxb6sY)3ruITSFcpF0%%WY;v&{Bl=oRMhZs?3X;55^_7kZJ|zYjWU zKRC|Jcgg&V&$J8l9spOFS4yC*2f;~ZX({wPv#Si+d^B-2v|J@k;j)E>oyhs0IKlKZK+iK<8lg?c!BJ*Z6Ypbsnw73IE#QmE*Mb*Tnb%vPb54LW%-WOCOUynW z^f<+aQs_rQ1j!xgr0+v}mGaYlmqBO4-r}{}X?A)RcAnK*jX@u8c|)lwl4}`etWA-_ zWhYNz6wR71s`UV^CECdseu>|f%2F0VnGiq1>RoC2`aoSEJt%J7(jsL--}UtdED6es%UzJkA#T zQw%C=jH63iyLhiV(mrO@$vI;Y#}|gu=hmxgIY`f+gi}+(0B=IdlgONSN<9$)#~AcM zA`&&F+_WVjV39VF#BY!)YS?FguOdUgy2C9Gv#cN==Ek4f@W0 zRw?0^NUhg^&q3wavVpWusZ&NBI7Rp@PRVfUQ)I!-#)Z-k&X?CqC_wJ*ci4)|pe5~n zR?^>@G<~^p?|fDqwWYW5`d|ADdYt|aD_Nd_ya>9M(Wjn>QW5baXTp=9D)z}t6uVz3 zOLQ1jWa+}g`MOc$-uCQ`dsnj0E1v@*&(qYKm`Yc3K2eqeDwn0XC~wh7;+`Jl>U_u& zyRbu-n2d1Qu#h$HeI9J zfE6P26zVnA427^M{FOcx>E@LCLU!RzQ6<8IXLU(*XV+_NMc$#zY;|$JdV*20SgdbV zv;|$?jlMwEoduDUz2_y~FDosu2ibvNuDu)L9kYf|UyYR(`60@yZ{K=?S`3Qbk0glc zCYtA~{b&$OC^?g=UHa19kp}(j(&?6AkEBG>&;bO)J4(CtbxvopwD4(~B67Rr$sG;B|WZdg&WW0hJ+H*Z$LxL-}C{3_j7 z^7bEB>D!lm(|1@WyZX^x|kcHu6%WHM{w8b>sG$_ntaBzaG~Ntnf@)mbT5uIe$V>|i zVc)1DnR;4JaGl7DTW;0EU0RXj@v{>MR*VZ#N69BqM}CquHgOU)h9NEcrqkEG?)L!w z=zEi|=4qWl_7)p;dE@ERHvQWvEry)Z7UhVXIHeS#e@p7H2n5eBJ;5 z|0_TOljRtL&_w28h{!P^)NBFj@|k>+DH*J5J*<)?t{S;vwG Qw+Eubi#3Y_W&>Tz_BH;j^$o=q-~K8MP&5S%I|%F1i}1ZUtEM0&59e6y&};V9^S;6+Cb^0!0C9 CN=POE delta 234 zcmcb>w}Nkiisu#v2nb+=(0`!x93}|gff+)7fzll;5WWQ~gnj^}H%varY(H^L4rez| zeBJ;5|7QRNv?m8JX0U=pfYPk`lRq$4fO+dCD>7P6Ud5CI6^UVEOex)l0zgA6QG^cHfv>$aa|nY%fqA0Hn1>kpKVy diff --git a/tables/master/BUFR_TableB_en_28.bufrtbl b/tables/master/BUFR_TableB_en_28.bufrtbl index 76b0a414a0dae1c13b645a1a472952b58680b80b..d05d3bc4263c9062b8849c6c5323c43489bd0a43 100644 GIT binary patch delta 169 zcmcb?@quH4islUl2$;YKp*5Hw^a&`P!wlhHnXJgDJ+Wc|FGyWC5U>6J|Nj=C;A#|+ wDIjH&m=ZW)%GOL~WVV_-pD7ka*#eNV$p*|haM9IJ;~XYGWzOb-=>~}c0E3Avi2wiq delta 147 zcmeysaf4%mislst2^~ieL=`1bl$f6%$R1IlF1U!J!0gMpF2`FvB1mSOi(kjdl{tPHB!2;puOw3K^>;|$o{Qv(y zXW~N$XCsI+Ig}B?TLdCsQ$!oFy~Dl!D1?nX|!iAX924 UtFn}Xc_14KCa+}4=73oa0QIg!=>Px# diff --git a/tables/master/BUFR_TableB_en_31.bufrtbl b/tables/master/BUFR_TableB_en_31.bufrtbl index 1a289ce4fd606abed67d1ac74b852e357fae8ba1..786ea1017bc8f21ad286a4165d580138dcbc6aba 100644 GIT binary patch delta 202 zcmZ3$wTEkhiops72#8>W&^$~K`UI42V21E@SRnM|1I!u|Yf3ml%DaJh?c{}w+LIL+ zYj|NItN;K1zhUx0X7$MvSY#&l%T8uxa)(Q<0!r=xOV%)TAQ=+Kq%+x+xf!l*4N%<* Wpt|{R5sW zD+3v@)JmH(-Gw65jmdk%EFuV%Hic4Lw8a5SvzSE|E@lzREV?Y%d)~R;`!a#>%m3bU z?>YCJb8r62KL6~S>CHU{ee_Gj6VA*VqysI)2IrxZ^n#060}4-l(Tx3^vX42LLnYn+;lkJ z@1%iOoLgO_gWbdm=VFlb8RvG0bV4N_bKcgt9cL~~I@m+3a4todX8s-j;ScuNzD|rr ziHDpEy`*cL=|0llexkv-6eHc>%ny)O;>0~peUS7iBl>sbhiD*pgZPYdVVHD{Ge1H) znIKjA&;W(_ub%xCw-w#<=7g<9*H z7%?o@D{kr9gnuSgc;)_5*qCr>XutG3;3ilYc)?I0Gild$90 z+vP&TIxO2i=Y1&5%J5UG3X1PFkA*%b6n!#UGE4ZSSqUPk2vq!QA_nudOdSX(CVB=X zAoI+Q)v3WjAS-O}pc=f}krDf0ZYx%9>mA?O>@c@at~UEU6BUYH`$gDNd6h?EOAPTP z-02R%56W+16iZxWqY3!F^CK~ewyd;WKijrL*Nv`b*SJ!qo$3_`%CwiU5CxYD_Je7$ zm0{JIC0P&2CNZt%`!yu1V_I$V%eh0ZN#!cw|Z2z6kUMd zqw)fjFe#Afl_$k(69H$R9Kp8M;M+bKfC-V11_S*ci;%3#hVF7+Hyrh^iV2orb|>_h zEKUjhVGW+gvLbQVbw$=q-LN*06D#rV%s@15&xAi5gQxLNgbm+)Q0{J38BPXe_+@rP z4L%sM=NMypIb>gjNBsPTyb0K#26g!G*TNsw>}c4YQrzpE5xEyNP<_O1gDK4dIPZS^_BpfP1x=5na@sch??S6ru@05Wd7*ypfV+MV>KW?eT&of zKybU0X}cLdXDc)EIm0(ugG;lrtX3AV2cOK|6LC--cjDd9JGU+BXu_XE8vHSrZnC3) qmD{)WZFczl#O7saR1Ralxg09sgQ2J7Xvxacaq6-6;$N-AGV(tFU>G<6 delta 2234 zcmZ8hT}Yc}6#h0pHO6QYjelP>rt!bV8g109)#7C@idgWX8zLPzro(k9tB_G!BW%pE zPQp$HD+uj{0|yenKnoiTW+4u-YCn>ljl9>ea~~A z_q^Y)cYaT%2NoY2_{H7;<^-qT1V0qqDFRKpMO0y)8nX7GK%L!7t z;ME@RJ;B6zaI+Wqt>ADJ^^F%%1d@F~S3mH9VCx0&oZxs2d`~bv03I3y?h7V{zz+rQ z$H7+}xHkXp-0W?-)Luy=MXBO1oh6&5OpEeG^NMBYrQ4#Uc}uZPnku)*Q@kXx6y9el|WvTMm*|GsEoZ#_O2t=7YBr?RsWY0%#BO{98E+HTNiaGw(v z`pl{cIj}Gx8RfyJ0UaCjS`=#hOjSbdt!|Uj9VPTz0x-c;3t)9OIct z(NSw1Jq%7uHfswtLmR67(5xL-x@jLjdok=Y31zaauW9y59Xp zS-}MH{oQDRwk)aXZGj86(|4GbTeT;w%infd*G8Mx#hzbjzpLtE7Dq=K$?SMfl(262 zg8f-_1D%~<&dl&z=+w8vY`hB$nfWfA$tn&klNQdM%=5Z>gZ}O>RJBd@>YjBc6vO_B zh_1^nyo%_4;R#O4;C=QyQhtK*Yyai^f}G2`=6e6<=hsmzz|M3Og)+*@&OUABiZ4J< z`;sDwAKkV7xl;o3{dylan7p9dFGh{?CbH+0F1-ug;(^NG=mC)bd3)ch@~ diff --git a/tables/master/BUFR_TableB_en_35.bufrtbl b/tables/master/BUFR_TableB_en_35.bufrtbl index dece8d2275a025cee3731f3251856ba00dfdc84d..e9bac0863d2f8c1071a58e6d84712dac349b9324 100644 GIT binary patch delta 364 zcmca0*djDRCGi3S1e7pBXaOb&y#-3=FhlqpED(APl=fkT@ZUh`32YF)4LgK>0Hx1N z4rG*@xOgcq$oy^~UiJU~{{=w7>6|c;wUY%|l_v8u6~fi5hN`ice2^&~E(+4Q1!UZ0 zcjjKW?$u!3znKxbVK!JyUds{>SGRU@A&b&vW7bl*$QrQ7dDc=C8$fQ8o1D#72^U=h iw08wql$*T~MHHmgV)9vbge|MVW(ISV^1yrtat#3ZSytr$ delta 312 zcmZn>x*#|~CGiXc1mrM6Xci_2y#z`}Fhlqsp!5V52w#U4LZ5)r8Eg=~06T=<0Hse% z{>Ushaq&{tZlL(O$%!0Flkc-jP3~ok=LCst{Qv*|6p)h1;!K5LHS6JO&N4yNtOKgq z09F&u+zZyV9;&M!&D5hT2vcWFHe{U)R=okJddB37tdo&c_p?>P<(7cWHfC=G%Wr_% VUkP>1TV|!n%^am1VD|$}0sycbS`z>O diff --git a/tables/master/BUFR_TableB_en_40.bufrtbl b/tables/master/BUFR_TableB_en_40.bufrtbl index 236ecb28104c124b7839484b8bb5b084da439fb4..5e3475fdb02e45a15858bb28af212c4cafb933be 100644 GIT binary patch delta 2158 zcmY+EU2KzO6vxZhN4s@pAKlw+Z$H+p``#+iY3AgL3%yYSftXz^M1mwDWh^*#(Q0RG zpt_~L;ornc-i$_}k^c`akbE z&-r*x-*1lHIqtleDS7xazKeNV@?e#Gu$x(yoT+B*tzo*7!CKbql9P3;gI;Dya@@yy zgPHN9>e=u}GTp%1?`OJ__RaG2`(pKl|bF zOa=MDeaUPa>j8^-Q!*W5?QLh4B*!{f-9gUKg4Gy%KTe0 z9b=v7Vpb&g#aVAjzSYh8zGSY4^;m*gkv!7N`krK=kMnzi{rq4!KO|=cSwE6o z9Ae!y%&bVhKEirSa(2zf+d7u&m%h%_U`_$PG-?{;VwIQ$W5o46E*pVRewN zJFhGhIg6eUH|EJ1I1Ipo+Kcg&^VIFTbeyA)Ixro5tVeAS_s+?s^ zM=kv6^Wl@gJBDu&{{+k)Tuit0;QKu@hM$A(COss|>*87yln?b#z=7rkmGde-uwr=J ztn=|ardxFV6h#%hfWcOM!Mq6hR(;kgoy??zUf6KGaQ4%pi_OM0veJ3WVzxF;$L9?z%{PX&ZgU&vajskM zE^h-x$9v5C%3`TU|2t@!ocoQ0-tkpLgEoFk=t!z&1^at1?bwE;1`Gf7o=~;XSw+0t zXHMKfRlhl<6*2K4toOgKB6$NR2J{BfSu6Nyz;S z-7$6I;M}nGp; a74UCT?<`re`0_ckF1m@&{pw{Ye4YXZt2|@? delta 1819 zcmYk5U1*b67{{~Puh@^Yv3*+`+q7x=m3|l*n;;4@Mj3-anY-{J7C$zrTelS&UABcL zn*|F77x=%pY%8v?qP-|>6~~770pf)h>XqI|DcSHs#48y?hPHdp`9GY~-2C!C&vTy7 z^FBKE(~W@mvr@~a3_zCmn)V&pCQ8-pf{YseiYn}1+ zZlz&G7_XwfE_|<=x+qN7P*>NI3&Ont>bt^`I_jswbUk%Lkj!gle7^Q=Ja{PlxPkf~ zq1#9ucgUh}tcm)SFxN~S-A=9wQ!Ui-5P46S*x_j}zwf2`KR3{(R0?l5PU?AFMq90eyNxGJ+!b$f zyYZcq)b?cz2g7J>8sFr-8mYnWP3%xboAqY)qrR{57Vx0icChH}>5{go3a1fi;VfC< zQj6_QZ99rjL&r=dE*^($%~x@1huvsF_Fsk1TkZ7K)_23-mNFR&IM)W*{F2w{{xCaL z@2h~@;mwsEZMT&s;dFdyD&d}Qbl6OD-Y!De7s=|_D|(8n5j({+MmzaVxEbaBx-+RG zs@}7hit^PdrQ+Mo=5fA@bK&Z#R&l5CVu&w6-JQeK&R@*5^XQJ-mz%}SxXn3(;a#UI)t9V#{2%p#K?DE* diff --git a/tables/master/BUFR_TableB_en_41.bufrtbl b/tables/master/BUFR_TableB_en_41.bufrtbl index 1779d0a5499e33d010812744e03257039946b69f..9f08ee6b1082049b43ffe4e52225eb7fb5622ce0 100644 GIT binary patch delta 200 zcmdnNafM@ois2Ln2vA{!&}*Qy0~3UQ0!qg)L--RW7cy#1tdHdcsp|&f)ssIm>P_Zn zjO2xhtoi@{e+y7qHC$vhPz0=TvOH5PTok6xdh!7#2e>FgtuZq~?JA%N3qV#+KFplU J1G5Pv3ILDFG@1Ya delta 176 zcmcb@v4dlRis1wX2#{ff&_Du^mHAAd0-!WOrtW$?JgT%$dBAc{&Hk9uN-z9LF_! diff --git a/tables/master/BUFR_TableB_en_42.bufrtbl b/tables/master/BUFR_TableB_en_42.bufrtbl index fa2f762ebc2db839494fb20b4ee35b1e142bd6fc..649c101337c35c3fe3e543161737cac85a93ddac 100644 GIT binary patch delta 515 zcmdlY{zrU*O8p832nb+=&_AGb0TYBT!3?42KxqvY2>$|2j#&B6tyxfs?!7z|4$2Qo@dJl4buazHl_um1o4KS*#kTx1nkq>xK$GCxxz zTy!l^v;?Gi@+PJrxF|#|NK}m(VJ1klVe&@ia=5xRK#`8ghAj1P5s-Oc$4tJ&f~pfF zDmA&B6=65XybY5X*_NZ|ZkfE1tr{)@QZohYK0o#%PMGgjP5#IzJ6Vd2ck+AoLKL+S zyY;w*Cr{gP0Myk2)|JGP1~&&{*E<%3E{Mo9 zR)okJur52cK30$mH%>mtEIauVTN2#n2|)R7IByPAHSc73jzYL7#MEsZO;9re8D%HO pakhcwL4Mu=bn9j?59H1TlQ(kBhU2iOfjH2|u>i*Nt{ diff --git a/tables/master/BUFR_TableD_en_00.bufrtbl b/tables/master/BUFR_TableD_en_00.bufrtbl index fef828578d8577b2d6422f8c1e0886bb881d0041..744e559286f7b7175b75c2d360a9f0728d29aa59 100644 GIT binary patch delta 382 zcmcb>v4L}fislgp2uNUr&<0Ep`UjNW!wlgcnCP3Y2vTEU@E;67>^VTZ2*?Amrvve( z$%;(UlM5JmctIlFKs*yDJ7Y2Q2W*a wO`nBfA4uB>=$kKTVDKLd<^aW30a+kD(}8%`OD|lb~j=1Ddo5!)%bAEt6}R oic!qohhg?Ipt=o{U71OB_ms(;EWs#dgWW9vG!6_v{sXxI0L^5Z!vFvP diff --git a/tables/master/BUFR_TableD_en_01.bufrtbl b/tables/master/BUFR_TableD_en_01.bufrtbl index 9e195c19eda0774be81638e501fc83d63b6fdc9e..e20871bd7ef21ff88996deddf0d2a73b79896e1e 100644 GIT binary patch literal 18581 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 delta 4824 zcmbVPe@xX?6#t?x#b1aB%8w_A0-@p$exstGrMYRWRcp@5nzk}Eb6R3)f{H&eK#qU{ zA_6K379mrdBsE!kbIe}NoHOQFV~sV|{KGj{n|97S_r7uZUYPT4?|tsQ?|kk#_ndR@ zJ+I`b&u<5Oijs5cEpFR=7}JI@I)^e&b};(Bz}Tg*Z5WU9hBL14Wqfl4W8g@}xKWH7 zN2~cUjGc@*R<0jUCZTN9HUENZUB#88_yUO$mk4Wysa>I0*_ZrWK0icObStQ zp^QagggKVA)5#N2lNj9!Tf=#r7s0r5GGkgKW3NKj6dt!sWo(OLJQ&TmJ%%yvMMf)@ zv5OG(TOHGQB6m9D!x@b3IK~Gv86VGL?4HeN#WQv)Jf6VgjfsrQk{C0S8GTb2yA}4N zTGqQX)tbgXlA>(6(l^HxQ&xwEPX=iZq z0`}k+hcn~|4jOO}uYSzO@i`oK!qTDnLH#KOI7_)%51WD_0&w7ITE5MKpA*BOVQMUV z;z)A#Csv^#5zFv%1^cKscpS5zJ|+HH9CX7Y$EhX#Y5Nt8%sqvD1aG6|zQ#`@&Zj2e z7dBeyJfa2R0TD1_ShcWz75+l3O86!zLTIPm_P~>2wZiC~O8y#hO0aJ;x*jLp@Mw6U zP?M)<%}|hLSJMUed@F=}sggep*Bw%x*6)CuBlZgUN+n+oRWqbKZKDHfMw;bM*yPFS z4)}7^4YB?awSFVqUn18h*S10N=pDjM$CZ3Fy6HRYlbga2Jxxa>kQ{G~v_@GNo5(O2 zo8kv0W2(hMtC8VJ68y@>zRllcZ#o?I`&ZBoE80a=P-~)*8|&cS*tLR2=}+1yhi(i+ zYk^|_t-?FyigpsN$4KvxnkHB^?o*+rPRSRen(s|&C}@AjxQ-*y~BW^2F^U#9C z;AX+wsCb9b#(jz>yuiDf7a~*Qn4;CelW1ukMW7yrgnlH{XfG5EHUdYG3F-Vn{Y9_tyBQ9(0^$O*6 z3UnoY$SeeJ!=b0?Yrhp9i_A&bKJ*rDBIx9q8Kch49JegwOO|@&?)qxw;NQ zBjw$28D~jR>>KMo-aO6V0;1K!uaV}!(phgu37h9AA9|o*ihO6b;Vfy}jbDW(8l@}c zLo~jvYsCIcIT3==o~9lA5Z4aJyVn7k!9kD{RVtRyNuQ6}jY-c(e|@w(`h&khjgS(v zL8z%glW3Er__>CCqi?$4QB1|F{VM<+z-FXTG9q{zEeH5HgY(I$aS4ftv}ZE77m@ZH z1^y{XFeP?_I1?YD1hETY^)h*4DOnxxN9+w@{5macwXO? zr)_s7dA=3a%+3~SblOmyjcG%)&6j4)ne8KZ#mc-oW9%bo8 zltAz{N*G-#C*yC_DBWl!CsZZ;E(~}FXNhqFzdpyl%>d4{TZuB$)+ibvZO1^g9{4j! zULhYSS~1eTGSS$``^nE?qzn8~4~QV{SK6B4@1gSeP|#iQ*Z<^oMS0# zsP*$yW2<^-`?q0RI*6pwxkyKaauLDXC`EKq#V2?S_9m4Ds~5D3q$c;!fR>-tZ7rd2W4s#QQ+2+qa3*K8049hc%MG$nkafr$d5j1{B5*En= zPP4QnDu#YEZHau^22U2rKOOpN9rO?7ZMd}@#))I3)>A53quX#0^j+F_%=07-R!t$llg{9h^1t?>5CvC75ZZ4Hk&>K99 YG;+8tv53|OrLPQ9Tl%Ajr|A>-AMR%?p#T5? diff --git a/tables/master/BUFR_TableD_en_02.bufrtbl b/tables/master/BUFR_TableD_en_02.bufrtbl index b512e79a13440f3b038840570ffb4a16c940f640..ec30d189504780a04d14f6f58b642803bce999ba 100644 GIT binary patch literal 18581 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 TVME*z;1VUTjo(r49j*TY8t%&E delta 4318 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 aszH2PQaJj1XeE^__6i-nMjF)GI{yGs-!3`; diff --git a/tables/master/BUFR_TableD_en_04.bufrtbl b/tables/master/BUFR_TableD_en_04.bufrtbl index 9a902d070a047d9088b85e09fb3b9aa1506e0d6a..fef2f0a76a011cedbd3610fab8336e3dec47ab2d 100644 GIT binary patch delta 1227 zcma)*ze_?<6vur()R+2{z#)kc!LdQ1KcN1I2MtY54K1}4C0Gy@8fl%L^{feDA%S&;6cv-nmVGJCF*-8Wuik64w)%YgFMn ztqQer9k+1}*}1A3*AJnpgYRF2ww-+M)wybJuCtzw%9i?Welx(#LlfVf!PeI}*KxwpK@-%u#zC1 zR|R^6&PB>Og8_ATSLpAK3p|B*wIAMwqIyNTFA4k{@jQheVn7W}tuYec5I7)S>A~H- zRkuhGv6aZWZJXJ{l=P==*^aegA8eieW!?SZ41WWkmLxNe3gsnC#Mgd9XAHma?2uv3}#TkHA;7|_&ClB5fesb!#rm{ z)r+^^4NQ*ROg<%sx8T)9KczWgR6;yUm4;PzrgE!0CDPvP=p^!FN3+s4LH8V!Ewv@= P_o1wqE#)%Xk@dt6IHrEt delta 1021 zcmZva&r3o<5XbfT>*;%nMN$zVLdOmT9=mw!(6K)vqHab|2P=XiE6p*5qC%ofLK7m& zGBP~m!9xVyI`{{8=-45#nYa6(WgS?)zS;Ts-JPA^P&=3$i#07Q%2uWe3ezbYQ`OG& zhilcrzROOgQ5Vx`mFcXT>41mnxW+WBGad3Wo%0#0SQ-ZxTf-CKt`QYX?&2>x%ptA{ zM3j*}w%6^(F>{F@Em*gn3Cs#-@>r4Y$vnW4vMewe&d|TsdooRk*x~}S&6y))?j$CU zyA250#rvc-5PWpF@f3V3?TDFOg|=!F#Gmxfe&X% zfYMk%&8EY>N=60Tt-+_Ow^7D45*~<{cPOZd!2d_x;6DHW diff --git a/tables/master/BUFR_TableD_en_05.bufrtbl b/tables/master/BUFR_TableD_en_05.bufrtbl index 6ea92d60beb7036a66d0325fff0717d32d51bf13..d2f822eba62094297301c19fbf5048fc8ded8411 100644 GIT binary patch literal 3480 zcmcIn&ubGw6rMD-)>xs{2p%-dp@$SHNJa3_OG(vQD6Lje5rk?)y1Q)+c<5O@ zC_=4>3Lc7zh$qp5|BDBYJ@n9n2cdp%X4Y=D8|{|O!oD}N^CR=UU*9Cp7(0TuKhw=P zUs+k7>_Y<|LQgTHJG@Kl6IreE-CF-Pda%cQKdAM|Uai?7t+$Nc%<2BdVXX(Te}Uy# zAIq>j-VAzK$Razd+M`NNC^@6#6(z4KIjiI~HYI)OxK7QPx5}c%9hX;|m7TsP7Z#;m zmL4xV^}1to-)WuT%z4sX629fwUU7D8yfi#I{I(XhWhVAYaiiV!~8Ai4D3V}%Hh|@ zPTDq?I)>h}?D?8(3tQo)Ggfgv3Il3Kanl%me}ng3Lfp^);x4eT@3q&jD;uQj`y0ZS zE?-y_HOp_dLr(r403O1206Gr0ZE(ND_@{)pUts<(tfRa*rDPv^MK*>$rB4=;{67Mn zYUEE{7}s&{%7)|m+;27{AK4Y_6yp_~ky1Vmd&6K~!}#Zf*eTY3VjZFD!R~pqQpGqn zUD6nbd8sNY|MD@Fu=_X<<#rs-n!))B;~x{^Bp(O0FY4n0_S^Asud+qIk^|}5BI@sD z%df&9K`m`^VORKaOG;FPFTw#qemaWtQtcyq#o1}b*y$U_pX|d<8(2rbL;L61Z6i~S ziog=XQ#&<2F8tLwCn`%ys&-zTdQ4r$05W{idx}wP| z@~&lDM2umtYkv^_n>cT~8hFRp;XUTP-iIB2U>(_^pse1dWVU12bJA^qD<6&pxOqz4{#%-&ZpOo8HVXM9IdT+Yeqnx+f?Fu_x(L2fO z#CLSFKaStIh|CJ^`uaW_+--;OJ;zR`Yk>$^G=wXN=Uk5q&vVKaI1Wrl^w;voAcK0|YQZs25QB3NwVih6O?&VTI63*dX*Ab_iX-0ii=UA+!S*gx2AP z&>|CCFN+$O{s)5|pk-M=7Rb(JlM~tH1tH@9|91mLRscCqCa+~&jH12(s($|DL>5%_ z%fafGGA))wHopw2em2m=ZIcU`q*3fx36y;?c`oyE6gw)QdS*;^F8AVS7RL@SJo*7v6+?l+RZ8nOYA|!h@f%FIi1;79lULgN} zVPKft%PBi~2m2HhooPThP$;hi;$;}NfplJ&ypW?GMNb`6&t#yUeHeN`A@=|na;lS8 zaaN(|Yk=yT2-J4~tG*YLE4i?T_%w_VUj{S{6ho?$XK^=?5KAJH3wcmOJP7Kpy+C(O O0=Y{7C;$eq&;tNF-f!~& diff --git a/tables/master/BUFR_TableD_en_06.bufrtbl b/tables/master/BUFR_TableD_en_06.bufrtbl index 367e14eba5d858275b4a20dd0e402d9d1e21611e..ced2fc7e9c1c13e52347d958cc9f9bff00c075a8 100644 GIT binary patch delta 3040 zcmai#Ye_5Q`8Yix?FmAr%p25fU=AOuEsXpu zlIA6qKKNSMx1c@*MfJ)05CmOll+dV%pzAq1&pS3fv%&U%_PqN&|MQ%4o@cjryx-Nb ztfA9v^1rm1tlJ}4TV}DojAYHXu$D!$7RRu* zgUOr16J9H;mdaX^#_CCDtK7xz&9fzo+eM@`w~tb(PL)j$^4r?%=gYPnX)AQGENpkeZ&XRo-Fk@y!z6hLdhR(h?nwkr&TA{ugO5FGLixa?b-@Ou@5pO zWGg6s*938aE?JX*{eqYm3ZcyM9!ENgYrg5qiH-1RnkSyfFE9DvvIVU=NO`M!LeZ*ayeMcaChMykvC3vFQ!I3-DF>- zk7OsxZC4oNUl-&b(sn+GbjnwwaZInHy?9J1Yv16bvqy~HxZ18EE?#YPNw}cMkpsUM zkBUo_s14BH@bPdPn1Js~u1s6EwkdU^$je|nXZpIGnN+tx-YD{FJ#|@%oOh$)Zz5kA z6n3EQR5z^q{#?24M&c=R!HEy>)b0}|SmQ{CV|k5Y>T2;PXg}qTDX<4h!4KHr>KD(f Zac8vQ5`A=LZM|y20_rL?rZY?H`~%QZ11JCh delta 2673 zcma)-e`w5c7{~ACIGfv#+b_2>+p+C7+wHcrhES3p3rSg8%OCQ`ZGS8+NlThY%$$XX zEbNA1*ev<_ot7vq6lx(|tdKQg_(#Y*&pn^7?(zLz`P6;ipYM;?=Xsv@=f}OPySjdV z>9(NN!fhOj&&IlHJZsAY)o29@6uy7rjOaGY zi&TCvkj6Ti&T7kK^-WgyF4pWU)}WiUW(w=3Y}PwdSsl5oO&-?aX{_I;v(C;ZU2U;c z6!3!Dk*7klLMS-jL^ zAHKx7ocwxhY%jgQn?}t&uFRSd&5itK?hLf$_{9O@&fh^an9jG z54;@zT3{6lYe#mo8Aj<qV-ZOufxH8Z-Zm5SSLg)(POD&9pJ z`9NjatWf97fv54OMYJ{eifX%wzjo{!Y9n?C9wc-oMh6Q*b9|w&j*78C|D=0j`1NY| z9vuF(+3-}%AUtz`z_uvtAY!-8Fp5?V{fVCiR;93=SW#;%%m;DFAH;enQrKBYDv;}e zCN>2YraTs5bkA1qRDH}?&tmEY&kxrP@Q<$XvR^k z4p>s~P*~KYu)~PnGQ%j%c@Xga6l-gt!uCPPZQPjOEpWZ?nuw!sv@;mTbfZz6RodO6 zWNF6&JrI_)1N#O$h#LZLu{>||EprmXnQj?!<1M&LxFbqpdj|ogS{zxq2DZ_bC={Gk%NXCmlA~p!CFx|mWl!Jn!br?p@hZ diff --git a/tables/master/BUFR_TableD_en_07.bufrtbl b/tables/master/BUFR_TableD_en_07.bufrtbl index af93874bc83d2cbe6094c9419cc137625f1550c9..11185e58b14574bdd8a2d9bd0bde57dad1838b49 100644 GIT binary patch delta 5105 zcmbtYeN2^Q6n|f?ABc#iSGfv;AS5d4T?hyQVu%_am+QyOSs`VmO{1pHTsA2qMQxxQ z6EIW+6h%esMI%SX%952Uw*13C9P^LXsO7dF`#S5IV|GKq0(7-MZXV@w2NV1e*Moyyo9 z!+0l_F>e}SiKZ3B@dN90#$JWanS5`HXS}7bZx-Ko&Sq?#!`PL;SUs0r!-`~z< z+>p;0=g_o763Yts!BQuqa~Wgla>niz3Rg0=!^;8dV<=(l$q!v0l8@tc4DU!jjMqh! zVPQ%*+_40XqKEtOs=|lA!B|VfWQo38(Jw$xY9u&Qg5A7oTq!dCw2apM>a89~Zw>Ox z49C!9nIEkbLjZ;ZWgojq{{#4XSd(aXp`uqo;UZtV!{PGqZ$z_KE8Z~-#zsjkncW6o z1+Ej-*8Zo~;jQ+ti&s2C=G7}6Kw+LYkKDXtObDuw!<43opP;=3D2rh#HGUbH5Fq-S zr})jtUn}v+-#&OD`_bK{0wBV>jCkyUE@%ZCn5Y6PN^hq8Hf)j(7twUAl zl_-i$|NdYWcs;JwKu<*IWI9LsW?~8oN;VsX4G!C`i$2U#-|RqYF3RSCxT8q6`~>wA zt3)3*n2Mk!-#ZZ~bk|_#q%ERav%OWJ!D4%(`f);1*h7(SM*a-a#mJL(I{WWM`k>Ce z6dXen8or#Yi}ANA#}8qjo8}e&Cvb&6bQb&Yq5!@{dqH~S1JRs8^~^Hb!Z<%=h-}XU zrIGsXbeBDi>PdflD6;MFd(?XIKuy*G$Qa>$pyWq8)JOa09rWRmzPsR+p2!6*2Z?9i7xsyw0NRlmGOE4aTa+ zL-kqoz5aE$S@D~3?L8&ayR!klwS;*YF-C{y!<=A=D;5noq{vjzO(^>qLh)#Y%W-Q( z`k=buO;|JiU6F2Tr_n>yP6btDM9&zli)mxFqZXfegW`V;w$1e42mFp39WXn7qiFV^ zyq*F*@!yGbJK9EvT8c%Jg|bh~$@osVH|sT#ZoWlN(s@gC%AH;~HTy%6UXH7zy$P=q z1JSL?FhO}Dky|B12j>^xnEnfQVTuva&1!8w&AMlu$?KR zaH<~erqO}lgyIyrO3ZZo0M&^j2bul@B&C8F@twFz)_jcDLDK@ynV#sG5HkN)k-l8f z8*q=82BLStlWA{=bTi#(<`dJ6d~b(;(*DN}l9fhtx<&2~mCAZ~WV{XcGWLskV)7b& zMol{68}Ru8IlW7jz61~#W-{I~SBxPTMXR?Ffovbb~>Z_C) zH1NJ6nL%E(LHQ#22ZsM2Ce=n#_7d5Avo|%O`<}hYYtU}R#Rx4(i-fCjxpqp;b7&3L zvqp0NSDl&teh2PW*O*eXBwjWvMunpil_U=oju&x{Fo=EX(WWK0XH-RH=m2@9gMCJ< zQIQiQ_mWg)&P8-LU&(usy4kCjQ2KO0Ppv#YB77D9;-yhongH524;I z5?`s$m(`nZ?h~lq^Udv^Jt!PQbf|EABqr!KrT#PI@AXjc6;4-fU^o|GI78uNL8rLY zR<+eG^kk36R_^XfxxN&do%cn$IhFSx<=k`%L?8UPO#V%~Mrp4>?XODOso>3l^6Dd5 L5R6;8|8)5mHs8(P delta 4447 zcmb7HdrXyO82=8SBBCA@@d5#&AR#J9TuhKNK%v`fo(@D>Bp7%TB>HQe<-44I+eZTkj{hr%< z;rC9*zb%g4Y1Qopx4jO=-T=n8f*9Sy7*`Ev3?9MQsc_p!?mr&I*cZy!Gn%o?$rw70 zamIMY;0ZpgHv0I%NDk*0S(6wiPiE{^7&evrNfC_RNXD=z#@*43Suu>g3U5r~{)1SB z(-}+R2&)al9nS*~6?Vk2)I+^?C%=t^RYna!Ax!q}^@J(c_Co@4Z+GX`fc zb`zq$(VEEvcjhzhf1WXK0b@-TV_7z1f*BmL-fE+>EWTI$+I|#!BsZ!6MBPKEC$BnwfB5{Xi^eyxd;rD5>vGjXsvOd4CNcx_02TjNo_dZ1!rgNR6- z;t_)>4A0O4Z=1nzjbJvo?i-x3j>nxfR@P@^6i!rMe+zvL-03pwg!L4aXf84 z{=sI2Dj3d8`Bs?V!nefe!aqwjH_3!w;MUZAg0n$!b|Po1#-Y%hf=dw_1&2mSXCMCb zO@or;g6)z0w&85k!bxAFwEZYFhECZgs2Y~qloss}(Tr5K?Zs_lENpiG%rQoyQ27Iv0Xvgt^W>DZ-p?YR64cDxvJ?<&BtJprooC8PDqWnUthH2 z_}15WobGE@u|75+W99`>5sf&39Qz!eWXT0a2EJ+*BusJ?3|uG`if{}`pQvX#QfP4? z_#1Y8&C{m*a`=^ur|MN*%fZG>+U-w?GxR?+;yH=k=zF>9->MuVn7 zRqr-Slg2s(!8%({XlE;B`V^d*ZNC%;KU&+NYR=lHbi@e@=l&o#nacTXSkJ{;b&zeH zP@cSA_+p(YU(lJN-4pIWe99rAQLi*wFvxA128BP!44-#3P>{AL(nTbJEvXCUq*n^V z>J-O*FS=qrNw1d2aIzxQqW6n55h|BpxRoh4;~k1~8Vx(7ambr4^ZxuwxoueKKZqnc z3#@wUz-JutH|+Wvl{m@Qz@-JnqX#aQE|i=pf=)@g1}n3+iuhSo{V9G)KT_%KPmrDs zB7WO(lq@?7RkQWPCPUQ1Kg9gk)%+%SvRt2k4$5;j3!AJ$XeRHp(D9Zx$0fHs>r5K_ zBAaL4a|O!04te?gi^k~}A4*0S#4f57oEjB?4&*dw4w30u=AVlm$*sVu zQu_rx-3CV_=C|r8oG7+UPr6Un@?MX-iTb*5Ma(v~ZG_%a9lWf0Ybz znhV3p91q$`hC5(YQk=Pdafn==xk~sXdh&{T{s<{_GU1TFVb|BJ69`kdWUWZjQG8Ev zIRGm|WRj>FO3YgKDCzS%ia`JFS86`fnrMgnFG~^YggZi~k2sRa*M|mllzt`Zv`UFw zM$7h)h!&t2G8zMvg8`ZZKQFx^_#Y_#hd67OW+Wvh6YeehTX0Gh$A5RwHmyELUw&M0 c$`$7T>b$4vPz0^J$|b?mw46BA*Q`wa2gTwUAOHXW diff --git a/tables/master/BUFR_TableD_en_08.bufrtbl b/tables/master/BUFR_TableD_en_08.bufrtbl index 29960bec690d41462be65fbb637ad182aa128995..960141d7c43e02691606df7a13acf6ddd1fcd3fb 100644 GIT binary patch delta 1370 zcmZ3Y|HN>DN__z%0~p9KLFfZeT7w0`Pho@5J?s$r3I~K1;fBx*yb$^Xls>};;cEy$ zXa_+EZ6XYzEkq#n7YHrIut5|eus{q#cZfsioXLUQt&^P?rzwJ5XkhUl3_$F8KwJgn zf!KS1xMy-BlR7Vm*A2uofHEs4%QA(FV$-(;q;_(HI1gO?G@$wglXo)tV^zOxvM4jE zdXV`kn|+yu8L>L71M0AKK&Q;YaG1qpMb7liJgg0jy4YOj1=ZXMl#GG07Xl5MIr$@_ zG>VH=CSPQ`jMV`;Ff)J=X@}x~=|CBm$uHSIW7Ssy)wdUDUl)cxo6U-xudzGY4XUvp z=;#P28|3KOD2@gN+l$SC+|#ie!UEN}3TTKJl-&kom!KE|imM}&b$N@!fKnJ~ViHu} z44~W+AR9=*0Z4rh5QD@)Y(rxp1ImV_8V1J6&v@5i4IG%ZNkFaJPyz?!uZYbz`Pi{1 zhXSY_Aip$WXcU>ODsUL9g;7v_vw`|@Q1pRf@xx|a!THz&k_oC26p$iNb~lh+1PVw# zAOoC9W&&k^-W3vFCkqln&s_~rjoT-G&{Ku?vS*au2EPbS-nO~$Hk e0#x4;pgR{~=$kWHRNNbD=>RWHcwhkwvIhVz52twm delta 1280 zcmb7D&r4KM6n<}JYIO9CGtCdPM5%;?jFMc`qD`O}MNtT~D3B0rks!E<=*JKwO$NR3 zNDc{=B{hi+$O~$rZu$$P76mN|3W7FLEsNR|Gx%a-Wy$k!? zt{cO)<;Nd`Zb16qgM!J;f<0lukp{t;h~Rj$V7DXK9u>UUV&-FlLt6v~6N0}5w^@&q zGLT6Lo=pp$qxGg+bi}^jw*O$skB6AJ3C2!W&}L{kv^_3!rP35e3h3l%Z{Unmtyw|d zZk6{8c`khnoK$&hbU3K8ALVQK;H@{!>ZO{Iz@8WJ=`ef}{3>{59T0yVe9G0oqE%-? zRr0{7^T=MJQ_Ts1`(wfDfnL@G0;s;4oVWbp7BWUx1;=pNXQ{ z`!gV2xitNI6^5Jl7g diff --git a/tables/master/BUFR_TableD_en_09.bufrtbl b/tables/master/BUFR_TableD_en_09.bufrtbl index a55ee8927cc672eab6be9353841551b079b613ac..bb5899c78c1265a1cc8276a76a00107d72ef7c4a 100644 GIT binary patch literal 17409 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 delta 3779 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 delta 4736 zcmbVP4NO&K7{2_7gkb0p$PmcHuqU2MBLlz)iuVXPmf(U)<>aE&iAjvB#e3uFu%$rwC}@v6qo(Y*d?4C8^Z`uA~+ zEunqJOMe&T$QyDW8^g5BTQ)AII zT%*3tJ(+(9PGLMVgE20Z(e*XPh&0CbnT%&AOBOTwEM>g7jInJwW86x{*H<$x%wsHD!}!Do+nig6O^oPv9L=~} zhG$e^jj$ylXejS@cW+8;U$4^!lg2xCuxr+?ZeAX;yJwQ;y4iR(#gmZ}~w$Vuq zAT-4+hFH&gLS`fWPWk;BPJ76hbL_Tw$=De|=rgtMkTv*xO3#YetYsQeiY!I=_aONl z_-V%dDE!b-j%!N#4Jdqmukh3OCxutgKUwBH0CK%=`Svs*A1@`Ltxm9OUZAPC?67l) zb+)UJWLd*x-gLEKsEf0(Z@d=ThBcXHW#1v(tcRm9De8ewpseS9`IfC#`T9v-rq(=w z9u`<>lC1^mn%@M;OVB)pyj;x_Jx;dbP{?_qkD*|SE9|szoKLXH#_&`7UK2y642Jvtz=gm4%w$1|1o) z9f{ZiT~kNH>X0CJC3$lb`DiZCq#}vENJ_*N!0OnJSUe# z{2Jj>k{_gm<_TJrrtL*qtELGfDZdfQE$mNOll7WMCDCrhBP(yHwD7%>XOvZ+)7cJ_ zBA(smq6J6}Ti`A4V0d|Al_-(7wW;NhpKMN+9nypR;P-3~6&0B!vuxC2HPxaB3aPcJ zj;QyfbKzR)eH<$3cy1~y8rCK1XiTCMD$_jcBDOih%FhiwO{^Ks7Et0 zWK#Rpj6SM5^@`-tSfU|aiJvw+HwA_&Z@)U1mLqw~G_MTFrB*x&Xc1gk8Vg5eJrOPj zXlf<4R=gFJB)^BQ+1muo$OYZSEOSAMA#gMOH$mH^)lMLd@{F6)htu=V3z^OO`aW-GdFp0%=m5d9 zx(#eX)|7L3Mu&*3{8uE7TUA4&2<=>yxwSb z=ve&ho0MpLs!>m9TJnR4s4@9kOp}jXY*ZJPE|*^Y(Z%go;$pK6wla@+`&H>XIsfCS zr$S9y@zj{05Kz1KIR}rcn=9A3h_?xPjUpZmLZd0D5s%?M!oLSD9f$Ea*$K64tY105 zG`(_CPi$1R`LQxYi*TEycj6blubL81A@Wz@1=r5b?(j5q#&0Cac-5dZ)H diff --git a/tables/master/BUFR_TableD_en_11.bufrtbl b/tables/master/BUFR_TableD_en_11.bufrtbl index 3318af6a86cc3f6ebeae723cfce5438d5a301f82..7b0e7e5a06242844277d84c5f13aabd202e4aaa1 100644 GIT binary patch delta 1018 zcmeyNazkx`O6CbB1~Ayb4539>A@meB2)%uJ<^dBw=ZNdYg8F(SI03TEy zO0N)r@Q-ZlEoM?=1ab@w|APUDy%C7(fIJX;2@o%y{E=CD@&_)C$p*|UydcqTAf66X z@no_q^JKjG7vt1F4X8h1vn&fgBUS?%pbl6FG+-%K2Y?Ky*<8q~joknTr~ylW4o<~t zz)YYDg~<=u&SP~z2vmO`P=6(|em>+7;9;EnjeQqZ17e^Cv;oyOA{&4bgepJ>7*1B> zT!ht(0H_&LfM%2;n*nzO$P*lllli!|VKtx&YQPL&Fs?^70L2j|lR3E`W7S^+)xQF$ ze<4==AP1b7Y{*lNRsR&I{(hkToyhv(9+&}C0Sv`=JlI1q32MN8paJd32EaW4N(V0{ zzvZ2d)d7>B`X>SPZ^x=1pd;kEc)2@tQItjH`a2$B2$zZ)pB9LTvcIh1)aRy~Wc z>RATV6R_Eqg`W{cQwP+dg+NVfF)RXU%Gtb-RU1{42UOD%pc8X3G_3^63QSgHKaXNj z3{+1aP){RBj}TA*3}8O`!!X&6V;7316rci7Fth=QP7I4c!5{*($Z&ES=OPq+5m0?o zfck1NECV_42gBq#u5F^oVLl0}X~yJ0etC@WR+-$%{TRiP7O46aKnJeGa2&{z9g`38 zl%wdG1J%HSVJm>Lz) zkmF`-?&J?gjn^`$rY%5CvoSP*f?Hs-so;53O-)cu%YmAfgER>M1;79lu^`t005p4s Ar~m)} diff --git a/tables/master/BUFR_TableD_en_12.bufrtbl b/tables/master/BUFR_TableD_en_12.bufrtbl index 68852590e99e303c55817870b7efa41f92ee8684..1becd81d3c726eef2011ea2b9c971c8660cb7c9e 100644 GIT binary patch delta 3247 zcmbVOTS!z<6rCBTe2t^|DzY3$Cm;DX4Wa1EkFXF4A)=7z!>=GoA&Jls>7k<1Hd7n5 z>?L|JaUzVQ7k-FEMSkRm#1I4a5n&)D6x7*wpL^*xyUB6jvgX`#*Ij$ESu1lBgeUf^?8I<`GnR2LZ8G}g*1LvL^!fbAewX+(~X4^ z!ew}39&(z+ps?td`osU@;%XEl{C`(mH()S5BML`t;_4AIr7&z+VtEyk*CQUU_2Vh< zI^<{qzUgnh+xRS0T5a|}b*yGMWu0V&nx)Vk@iLXH2iPZOTu`%Np5?Vm-gUtnHw1{h zT2JFfhnXc_lEeW)95oQHi5UexhW^Ky9w25=f#$Gap7%m(c;`Ce^1`=&@cN~ncHw8* z;HOv2{DirPvF+SSwMw2F?Ah7+Y9S}g438rpvOzXTk|MX%k@ngWMn-mpBJMPHrbnlfYv%gg1d*)-4BA@6EnYt~0Pk$G%oz#6;*TK!n3--*wXN6nDXFS6&z6JQ0d67+s=Br2Zr57sdiGBZm z)_V4R1x9xUlaPZ@p8bOjP}_C!14TW|47C|A&Iq+ObB0-V;E$a}xRTq(^0ZFU`&VBE z>|X^={4Tr)w2N_vy5jE>iFPY{u(=0j}Loi8Ac0+SYHiN4?hHrr!_|6 zgN{O8FEDQzYKn$fe}0~7sLE$>0g_T0I2p1JDEJ`Z0MOfL8(lOJV zw5GoaL&On@2%E%(h}4iSS`@elY9UeKLMX6%-nmaY-pRoS!#DT7``zz5=bd}r``P&R zOh-w}7mY59nQ%yAU>%J^F@&xSgcA}^ZlrPLCc=bR!aouh<7n(oAk5lK_)%hKqCRfX z0!efuluX!UB|K^){AefCQVCFl_#s@$dQ?xxPz~nxNUdMdA41 z`?|W=WeyCc6<2yQ|NE+FpC!>RZI zrg2+xd~nd>WEscxiyE9x7-b??B;kb+@hc+u_=}-7FB|S|o?^UPlJ`LHhLC3y6Z(Z^ zgJKJs2K#Ke@Hx@TEUx~HM_?@JEK|BC_QK-q6u;MsLsWVRt(FUnW2CN4aMaXcR2Dd# z{GM_8q)xlwgcKbt4SVpsb%xi{RY?lK@jbkjP-F!9>}w6?6V#{lvV<8L1BwO~_~l?t zY85wS6v2I^2$0}1!Rh!Mh)oZ%@attHH$<+lE8!zi14qUi=B!I{dSIWGM~~~>K~Lsa z6BCJkUVYH8HQMnDfn!?>+t;YZhvM1k)yPU8&73nsU0znu=CGRA5W*L@nDr>4QlFuu zG>2Je%m&8kmT9^pIIonmf|WHd&Ps#L372x(R%bFbWQL%2JI{rY;~t@=_C(^8x*~JB zBXY2mt3~fU0>^S+Fn@;D|9RhnwRz8Y5g6&f1Fffn1%+ZhsBuRtf(pGY{H$a=wlK*Mb}ushW9SRJ1aEVW0Q*4+GBl?SrRSay)aeso0&1X z9Clp2%dsAePddg#byc;)&(hQ??qN@j{KB6GPuWeTq?|97T0CDqu$D)QU>e5D`MwXN z5A3<)5u45|_&rfh6Z3*m&q3SHe&*kJ%i+h4`j*4THVe%aTqinb4(fOD4=JPk^v=tC t=?xKTck>S^uZ-U>d<`n`qpwL(<^!<5@)L{4ICsn6Jr=Q4zpxfi>o4c5iZcKJ diff --git a/tables/master/BUFR_TableD_en_13.bufrtbl b/tables/master/BUFR_TableD_en_13.bufrtbl index ab58defd36ecd3860efb35787756871065081743..6aaa134ce2d50d17e50a317d1e11c8c97799f478 100644 GIT binary patch delta 503 zcmZqR{lGgx#qbFO1gv0$&;?8odIK|rp2Gs6*RVq92NOg4WkG5UjsJrIh&>O8n}9qJ zd+X#v7Wv5nj2uAB!V41V2I84O*#na`8S@pf>74`BI~%BS-Qa3#$QbPy;ps4VZy!07@Xf0XkwfR{dpA{riCWJCODBAUgm6V3wN{ delta 419 zcmeys+rT?P#qbIP1avS$Xa^<;UBC>XeORD0D}=rZ<>X{8xu??%9EtCH;7Nh7{0M#=GsAm&~o@GE; zoykX;UZdzKgX#f!t^-5Q3ZU$b$&76BlT}zMM3Mc}1l6}|G9#nB5Rd}~Apd~u`NJ^z t6U#0Xi~4}Vpg`CN#0xMi0tLbyphdG$^wdH1>;vkV0Ma7>6aWL5MF6)A#{>WX diff --git a/tables/master/BUFR_TableD_en_15.bufrtbl b/tables/master/BUFR_TableD_en_15.bufrtbl index f266c2ece8e8d2d7286a05f73c70df483085a1be..b13ba082c14a77216bee375d74bdda96a1300227 100644 GIT binary patch delta 1070 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 DOdA0+ delta 2748 zcmb7GT}V_>5WbrK>%XhJo4V#tu0{!wNkmb-g^3VJJ@f|>BxVLBS@vLsSefMJ^sAy` zKWc?7Dj_B&CSflkB^2R957JWn_&lU`gS-UQ53Z_GGp*5!jqr~X1>jc7zX%a9k9tJog;_HxhA~E zaqj0FrC<<#+Rlhmt|)U(7>@iPXe+Wd1Ye@61&y>phs@bmb?WrVT>nFohcnQSz5{+l zmk6p(neq6vIVhZzg?R&7WBLV8rxhVHipvmm#a91^EN4)bvT&?=>%)_1>y11cg#Ga{ z{Ip5|X~jz`Nh)yz+zGF=PBkOVDgfaWy|)MYLS3-OUM#3X$|8mA4bHVXnTBunCPA|j zPK`k;FS7Uy-X;FKg$YTMe={iQ(IgMNOez-zFb-QC9^n?{*bX(0_u_1phDrL`?n6c} z#ZDVSX4&lov)7|(}j&p6?N6Z%aG`UnzsrM80 zE?$&AKPvlIno=#oHwL4@GJKSyImkup4>WPayGTv0=!TZKZbU2SNymi@qj9Dxyn8q64i_ z`(7r{^hr9Jc|Syz^Ww~(f709+}B z*|JiuF0pn;XN_nRSp1uz+f)39nj&)i)l@c6nB$Qi?Nl}{;XlM;oefg!XLys_Ap&TL X{I3cbf#G%k7FH}8Fo*e90B64eUzJS2#*2d3h8F+90K}dP#5*P~RG%Ec$ioW~=mz4MKuddB2JMt8i*d5{eU0H*FVbN~PV delta 141 zcmZ3(@`rhXir^9k2(V#<&e=^w-#wr2^L@Y1(_U*%>sD%}y-Gp)Gh`Av zZWdZ*5n5j;^j_*gk+_drg$}Ahn`}ZKq}~;a`$UP*2~B9XF4S*NYjwf6Lp-Q=3iY~# zYNbLuedixl6tcDDGyS3KRUAWjN7rlkH3}({2VTu84vS7t7jOh{Mj0rk3zm;aK7un7 z*}UE0S8;}_fZcq^8pNbQ5Dk*q2AKe45Cxm1i{6!`%6|p{b&TbW4Ol`xX9F_*5ubz}+wcAPk>~qcNB$k& zY@6)*^egqcjU&e9rx`ccp$FcJ2U!o}6i3k`=M-n&fjllDTr$b>v`a>YD4T(1+(Dl< z!}5N~@8J3omZuIopjLlj&(MhEm*G~)KSPxL0d#X4G&|al% B@zVeR delta 1258 zcmb7^y=#+E6vp$NH%-#K35FmQLH0F)7qOxS zKf_b8(+uq%J7Ct`5YPvPULjN`NEi{6g_P%xV4BRVA@gah(LV?L@U#R}WhjSGLo=d| z@-Xl&3TB@fK&GuR?{N1k6nxJFQ)6ZmnU=;-Lw#ftkoB*M+umdDEjT^;ZCBx*u`KG} zbA17B_+>ris>4iRMdY$CZQZ^!anZ!&VHgKZdDf;dJ-|G@yno(IA}9*8|1h&N1r$Rs^^0wW6y^MYi$ gL9#$qC7YKrDq}Zf1=Nr}pweCFhVZ})nE_M<0Q;~ojQ{`u delta 120 zcmZ3(*26YIg|mW@0Srnu>KZdj8X5fugLy!)Wk424ayk(2nB2%HEeMhO|Gyh3vK+`s a*}Roe8CBB;sHQ%kl0zU(0?3+H0675jtT^2O diff --git a/tables/master/BUFR_TableD_en_40.bufrtbl b/tables/master/BUFR_TableD_en_40.bufrtbl index b6fbc6ecc50a658d15a831372517c3b65c0a7dcd..33d58d71c65e4aed8087a9f9b035b74c45e601f4 100644 GIT binary patch delta 1928 zcma)+Ur5tY6vuy?o4=_O=Ra)DZLXY>A}!c^AU=fj;7dMKl=YC0`5+@A)C$rT+1MFv z>WY~p@BKD*>s(@R zrl-azeNzspM@*@oT~dqnQb*lV$D5@_TcjQ+jkL*mce~VVhg8EWwWxH{C+EZdl8zXe zfc)VgDD`GY>d&K69bu_ol^T6=?(Ub`H6XQn{nwU#(1w#}2 zdjkSaUnBi$9|kiI>lT6{qU|fV*wWRdFgFi&OOL;%a-Jo#k^X^9AJJaCM{bz_&nxu zz7jtxJ_Jwjd|dG>7=MN1X^)d)C=}#*eHIsyFCQjrH;DI?-Xt(EPNXY!f);c^Ec~9u*{8s|3+jTaM$GlTvX61MS(kwhB|Yyb<&W0KajfF+WS@+p rp=|x=yKQji_**u&8*1qWqQG@X-uB!5{B2)Q_%q5t<4riBRCM^i@u@X+ delta 1704 zcmb7^O-xfk5XbvUZJt(2X`z-JQ+a`iouYk zQ$;C3gCg}{1h*&=jCwN~KMuxts0X75FV>#WD2dLz-A6j~HPKD>{b%>R-_GpJ?mK(< zQ*V0bKvSK~Xa^lqzdEI6b*abKNiDmSdZZQ_rS^NJrhQUVO;U?~sT~0|R{Az5$6X;q zleVFaa^gdq)b5DXnN3m)Tci#~rKV$2FKt!2O{!;h>5ctBXU89-P2uD?S{f=~pHucl zv=`AvS!o7Qo1UaSSqjVX@e7qz%Sao@Gqn#)yi zY~QzWv1JE*_jQTk`cn=TY+5;;MwrrC6>J_SpF*#9fMNd>>kPE}PB842@QNNd@c?nLqGm4!@c2u!GRHM;Vp-@wr4a%OF z_!!bTJ%KOD^HuB*(XJ{!(fh!yx5A;eFD&Tu3Y|stx)n-$?G__p7k8Od++Fm0v=)~V zrN}O=x$<&n6n7Kc^`x{ zmJlN8%HvPF_>p*EZ>da(xj#BJbMU%-ga00Wxw{h|*v!A= pvJL9CKVlxw;cF^-0ecQ@%c2*-yCcW)aYbR1FcA-Xa9}jk&tHYdF`WPa