Skip to main content

vane_core/h2/
huffman.rs

1//! HPACK Huffman codec (RFC 7541 Appendix B).
2//!
3//! Tables are the RFC 7541 Appendix B canonical code, in the generated
4//! two-level decode form proven by the reference h2 implementation.
5//! Decode: branch entries (bit 15 set) index a sub-table; leaves store
6//! consumed bits (high byte) and the symbol (low byte).
7
8const BRANCH: u16 = 0x8000;
9const TABLE_INDEX_MASK: u16 = 0x7f00;
10const TABLE_WIDTH: usize = 256;
11
12/// (num-bits, code) per symbol 0..=256 (256 = EOS, never emitted).
13#[rustfmt::skip]
14const ENCODE_TABLE: [(usize, u64); 257] = [
15    (13, 0x1ff8),
16    (23, 0x7fffd8),
17    (28, 0xfffffe2),
18    (28, 0xfffffe3),
19    (28, 0xfffffe4),
20    (28, 0xfffffe5),
21    (28, 0xfffffe6),
22    (28, 0xfffffe7),
23    (28, 0xfffffe8),
24    (24, 0xffffea),
25    (30, 0x3ffffffc),
26    (28, 0xfffffe9),
27    (28, 0xfffffea),
28    (30, 0x3ffffffd),
29    (28, 0xfffffeb),
30    (28, 0xfffffec),
31    (28, 0xfffffed),
32    (28, 0xfffffee),
33    (28, 0xfffffef),
34    (28, 0xffffff0),
35    (28, 0xffffff1),
36    (28, 0xffffff2),
37    (30, 0x3ffffffe),
38    (28, 0xffffff3),
39    (28, 0xffffff4),
40    (28, 0xffffff5),
41    (28, 0xffffff6),
42    (28, 0xffffff7),
43    (28, 0xffffff8),
44    (28, 0xffffff9),
45    (28, 0xffffffa),
46    (28, 0xffffffb),
47    (6, 0x14),
48    (10, 0x3f8),
49    (10, 0x3f9),
50    (12, 0xffa),
51    (13, 0x1ff9),
52    (6, 0x15),
53    (8, 0xf8),
54    (11, 0x7fa),
55    (10, 0x3fa),
56    (10, 0x3fb),
57    (8, 0xf9),
58    (11, 0x7fb),
59    (8, 0xfa),
60    (6, 0x16),
61    (6, 0x17),
62    (6, 0x18),
63    (5, 0x0),
64    (5, 0x1),
65    (5, 0x2),
66    (6, 0x19),
67    (6, 0x1a),
68    (6, 0x1b),
69    (6, 0x1c),
70    (6, 0x1d),
71    (6, 0x1e),
72    (6, 0x1f),
73    (7, 0x5c),
74    (8, 0xfb),
75    (15, 0x7ffc),
76    (6, 0x20),
77    (12, 0xffb),
78    (10, 0x3fc),
79    (13, 0x1ffa),
80    (6, 0x21),
81    (7, 0x5d),
82    (7, 0x5e),
83    (7, 0x5f),
84    (7, 0x60),
85    (7, 0x61),
86    (7, 0x62),
87    (7, 0x63),
88    (7, 0x64),
89    (7, 0x65),
90    (7, 0x66),
91    (7, 0x67),
92    (7, 0x68),
93    (7, 0x69),
94    (7, 0x6a),
95    (7, 0x6b),
96    (7, 0x6c),
97    (7, 0x6d),
98    (7, 0x6e),
99    (7, 0x6f),
100    (7, 0x70),
101    (7, 0x71),
102    (7, 0x72),
103    (8, 0xfc),
104    (7, 0x73),
105    (8, 0xfd),
106    (13, 0x1ffb),
107    (19, 0x7fff0),
108    (13, 0x1ffc),
109    (14, 0x3ffc),
110    (6, 0x22),
111    (15, 0x7ffd),
112    (5, 0x3),
113    (6, 0x23),
114    (5, 0x4),
115    (6, 0x24),
116    (5, 0x5),
117    (6, 0x25),
118    (6, 0x26),
119    (6, 0x27),
120    (5, 0x6),
121    (7, 0x74),
122    (7, 0x75),
123    (6, 0x28),
124    (6, 0x29),
125    (6, 0x2a),
126    (5, 0x7),
127    (6, 0x2b),
128    (7, 0x76),
129    (6, 0x2c),
130    (5, 0x8),
131    (5, 0x9),
132    (6, 0x2d),
133    (7, 0x77),
134    (7, 0x78),
135    (7, 0x79),
136    (7, 0x7a),
137    (7, 0x7b),
138    (15, 0x7ffe),
139    (11, 0x7fc),
140    (14, 0x3ffd),
141    (13, 0x1ffd),
142    (28, 0xffffffc),
143    (20, 0xfffe6),
144    (22, 0x3fffd2),
145    (20, 0xfffe7),
146    (20, 0xfffe8),
147    (22, 0x3fffd3),
148    (22, 0x3fffd4),
149    (22, 0x3fffd5),
150    (23, 0x7fffd9),
151    (22, 0x3fffd6),
152    (23, 0x7fffda),
153    (23, 0x7fffdb),
154    (23, 0x7fffdc),
155    (23, 0x7fffdd),
156    (23, 0x7fffde),
157    (24, 0xffffeb),
158    (23, 0x7fffdf),
159    (24, 0xffffec),
160    (24, 0xffffed),
161    (22, 0x3fffd7),
162    (23, 0x7fffe0),
163    (24, 0xffffee),
164    (23, 0x7fffe1),
165    (23, 0x7fffe2),
166    (23, 0x7fffe3),
167    (23, 0x7fffe4),
168    (21, 0x1fffdc),
169    (22, 0x3fffd8),
170    (23, 0x7fffe5),
171    (22, 0x3fffd9),
172    (23, 0x7fffe6),
173    (23, 0x7fffe7),
174    (24, 0xffffef),
175    (22, 0x3fffda),
176    (21, 0x1fffdd),
177    (20, 0xfffe9),
178    (22, 0x3fffdb),
179    (22, 0x3fffdc),
180    (23, 0x7fffe8),
181    (23, 0x7fffe9),
182    (21, 0x1fffde),
183    (23, 0x7fffea),
184    (22, 0x3fffdd),
185    (22, 0x3fffde),
186    (24, 0xfffff0),
187    (21, 0x1fffdf),
188    (22, 0x3fffdf),
189    (23, 0x7fffeb),
190    (23, 0x7fffec),
191    (21, 0x1fffe0),
192    (21, 0x1fffe1),
193    (22, 0x3fffe0),
194    (21, 0x1fffe2),
195    (23, 0x7fffed),
196    (22, 0x3fffe1),
197    (23, 0x7fffee),
198    (23, 0x7fffef),
199    (20, 0xfffea),
200    (22, 0x3fffe2),
201    (22, 0x3fffe3),
202    (22, 0x3fffe4),
203    (23, 0x7ffff0),
204    (22, 0x3fffe5),
205    (22, 0x3fffe6),
206    (23, 0x7ffff1),
207    (26, 0x3ffffe0),
208    (26, 0x3ffffe1),
209    (20, 0xfffeb),
210    (19, 0x7fff1),
211    (22, 0x3fffe7),
212    (23, 0x7ffff2),
213    (22, 0x3fffe8),
214    (25, 0x1ffffec),
215    (26, 0x3ffffe2),
216    (26, 0x3ffffe3),
217    (26, 0x3ffffe4),
218    (27, 0x7ffffde),
219    (27, 0x7ffffdf),
220    (26, 0x3ffffe5),
221    (24, 0xfffff1),
222    (25, 0x1ffffed),
223    (19, 0x7fff2),
224    (21, 0x1fffe3),
225    (26, 0x3ffffe6),
226    (27, 0x7ffffe0),
227    (27, 0x7ffffe1),
228    (26, 0x3ffffe7),
229    (27, 0x7ffffe2),
230    (24, 0xfffff2),
231    (21, 0x1fffe4),
232    (21, 0x1fffe5),
233    (26, 0x3ffffe8),
234    (26, 0x3ffffe9),
235    (28, 0xffffffd),
236    (27, 0x7ffffe3),
237    (27, 0x7ffffe4),
238    (27, 0x7ffffe5),
239    (20, 0xfffec),
240    (24, 0xfffff3),
241    (20, 0xfffed),
242    (21, 0x1fffe6),
243    (22, 0x3fffe9),
244    (21, 0x1fffe7),
245    (21, 0x1fffe8),
246    (23, 0x7ffff3),
247    (22, 0x3fffea),
248    (22, 0x3fffeb),
249    (25, 0x1ffffee),
250    (25, 0x1ffffef),
251    (24, 0xfffff4),
252    (24, 0xfffff5),
253    (26, 0x3ffffea),
254    (23, 0x7ffff4),
255    (26, 0x3ffffeb),
256    (27, 0x7ffffe6),
257    (26, 0x3ffffec),
258    (26, 0x3ffffed),
259    (27, 0x7ffffe7),
260    (27, 0x7ffffe8),
261    (27, 0x7ffffe9),
262    (27, 0x7ffffea),
263    (27, 0x7ffffeb),
264    (28, 0xffffffe),
265    (27, 0x7ffffec),
266    (27, 0x7ffffed),
267    (27, 0x7ffffee),
268    (27, 0x7ffffef),
269    (27, 0x7fffff0),
270    (26, 0x3ffffee),
271    (30, 0x3fffffff),
272];
273
274/// Two-level decode table, 15 levels x 256 entries.
275#[rustfmt::skip]
276const DECODE_TABLE: [u16; 15 * 256] = [
277    0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0530, 0x0531, 0x0531, 0x0531, 0x0531,
278    0x0531, 0x0531, 0x0531, 0x0531, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532,
279    0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0561, 0x0563, 0x0563, 0x0563, 0x0563,
280    0x0563, 0x0563, 0x0563, 0x0563, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565, 0x0565,
281    0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x0569, 0x056f, 0x056f, 0x056f, 0x056f,
282    0x056f, 0x056f, 0x056f, 0x056f, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573,
283    0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x0620, 0x0620, 0x0620, 0x0620,
284    0x0625, 0x0625, 0x0625, 0x0625, 0x062d, 0x062d, 0x062d, 0x062d, 0x062e, 0x062e, 0x062e, 0x062e,
285    0x062f, 0x062f, 0x062f, 0x062f, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634, 0x0634, 0x0634, 0x0634,
286    0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637,
287    0x0638, 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063d, 0x063d, 0x063d, 0x063d,
288    0x0641, 0x0641, 0x0641, 0x0641, 0x065f, 0x065f, 0x065f, 0x065f, 0x0662, 0x0662, 0x0662, 0x0662,
289    0x0664, 0x0664, 0x0664, 0x0664, 0x0666, 0x0666, 0x0666, 0x0666, 0x0667, 0x0667, 0x0667, 0x0667,
290    0x0668, 0x0668, 0x0668, 0x0668, 0x066c, 0x066c, 0x066c, 0x066c, 0x066d, 0x066d, 0x066d, 0x066d,
291    0x066e, 0x066e, 0x066e, 0x066e, 0x0670, 0x0670, 0x0670, 0x0670, 0x0672, 0x0672, 0x0672, 0x0672,
292    0x0675, 0x0675, 0x0675, 0x0675, 0x073a, 0x073a, 0x0742, 0x0742, 0x0743, 0x0743, 0x0744, 0x0744,
293    0x0745, 0x0745, 0x0746, 0x0746, 0x0747, 0x0747, 0x0748, 0x0748, 0x0749, 0x0749, 0x074a, 0x074a,
294    0x074b, 0x074b, 0x074c, 0x074c, 0x074d, 0x074d, 0x074e, 0x074e, 0x074f, 0x074f, 0x0750, 0x0750,
295    0x0751, 0x0751, 0x0752, 0x0752, 0x0753, 0x0753, 0x0754, 0x0754, 0x0755, 0x0755, 0x0756, 0x0756,
296    0x0757, 0x0757, 0x0759, 0x0759, 0x076a, 0x076a, 0x076b, 0x076b, 0x0771, 0x0771, 0x0776, 0x0776,
297    0x0777, 0x0777, 0x0778, 0x0778, 0x0779, 0x0779, 0x077a, 0x077a, 0x0826, 0x082a, 0x082c, 0x083b,
298    0x0858, 0x085a, 0x8500, 0x8100, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
299    0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
300    0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
301    0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
302    0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f,
303    0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x023f, 0x0327, 0x0327, 0x0327, 0x0327,
304    0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327,
305    0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327,
306    0x0327, 0x0327, 0x0327, 0x0327, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
307    0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
308    0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b, 0x032b,
309    0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c,
310    0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c,
311    0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x037c, 0x0423, 0x0423, 0x0423, 0x0423,
312    0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423,
313    0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e,
314    0x043e, 0x043e, 0x043e, 0x043e, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500,
315    0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0524, 0x0540, 0x0540, 0x0540, 0x0540,
316    0x0540, 0x0540, 0x0540, 0x0540, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b,
317    0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x057e, 0x057e, 0x057e, 0x057e,
318    0x057e, 0x057e, 0x057e, 0x057e, 0x065e, 0x065e, 0x065e, 0x065e, 0x067d, 0x067d, 0x067d, 0x067d,
319    0x073c, 0x073c, 0x0760, 0x0760, 0x077b, 0x077b, 0x8600, 0x8200, 0x05b0, 0x05b0, 0x05b0, 0x05b0,
320    0x05b0, 0x05b0, 0x05b0, 0x05b0, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1, 0x05b1,
321    0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05b3, 0x05d1, 0x05d1, 0x05d1, 0x05d1,
322    0x05d1, 0x05d1, 0x05d1, 0x05d1, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8, 0x05d8,
323    0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05d9, 0x05e3, 0x05e3, 0x05e3, 0x05e3,
324    0x05e3, 0x05e3, 0x05e3, 0x05e3, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5,
325    0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x0681, 0x0681, 0x0681, 0x0681,
326    0x0684, 0x0684, 0x0684, 0x0684, 0x0685, 0x0685, 0x0685, 0x0685, 0x0686, 0x0686, 0x0686, 0x0686,
327    0x0688, 0x0688, 0x0688, 0x0688, 0x0692, 0x0692, 0x0692, 0x0692, 0x069a, 0x069a, 0x069a, 0x069a,
328    0x069c, 0x069c, 0x069c, 0x069c, 0x06a0, 0x06a0, 0x06a0, 0x06a0, 0x06a3, 0x06a3, 0x06a3, 0x06a3,
329    0x06a4, 0x06a4, 0x06a4, 0x06a4, 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06aa, 0x06aa, 0x06aa, 0x06aa,
330    0x06ad, 0x06ad, 0x06ad, 0x06ad, 0x06b2, 0x06b2, 0x06b2, 0x06b2, 0x06b5, 0x06b5, 0x06b5, 0x06b5,
331    0x06b9, 0x06b9, 0x06b9, 0x06b9, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06bb, 0x06bb, 0x06bb, 0x06bb,
332    0x06bd, 0x06bd, 0x06bd, 0x06bd, 0x06be, 0x06be, 0x06be, 0x06be, 0x06c4, 0x06c4, 0x06c4, 0x06c4,
333    0x06c6, 0x06c6, 0x06c6, 0x06c6, 0x06e4, 0x06e4, 0x06e4, 0x06e4, 0x06e8, 0x06e8, 0x06e8, 0x06e8,
334    0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x0701, 0x0701, 0x0787, 0x0787, 0x0789, 0x0789, 0x078a, 0x078a,
335    0x078b, 0x078b, 0x078c, 0x078c, 0x078d, 0x078d, 0x078f, 0x078f, 0x0793, 0x0793, 0x0795, 0x0795,
336    0x0796, 0x0796, 0x0797, 0x0797, 0x0798, 0x0798, 0x079b, 0x079b, 0x079d, 0x079d, 0x079e, 0x079e,
337    0x07a5, 0x07a5, 0x07a6, 0x07a6, 0x07a8, 0x07a8, 0x07ae, 0x07ae, 0x07af, 0x07af, 0x07b4, 0x07b4,
338    0x07b6, 0x07b6, 0x07b7, 0x07b7, 0x07bc, 0x07bc, 0x07bf, 0x07bf, 0x07c5, 0x07c5, 0x07e7, 0x07e7,
339    0x07ef, 0x07ef, 0x0809, 0x088e, 0x0890, 0x0891, 0x0894, 0x089f, 0x08ab, 0x08ce, 0x08d7, 0x08e1,
340    0x08ec, 0x08ed, 0x8800, 0x8d00, 0x8700, 0x8900, 0x8c00, 0x8a00, 0x8b00, 0x8e00, 0x8300, 0x8400,
341    0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe,
342    0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe,
343    0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x03fe, 0x0402, 0x0402, 0x0402, 0x0402,
344    0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402,
345    0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403,
346    0x0403, 0x0403, 0x0403, 0x0403, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404,
347    0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0404, 0x0405, 0x0405, 0x0405, 0x0405,
348    0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405, 0x0405,
349    0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406, 0x0406,
350    0x0406, 0x0406, 0x0406, 0x0406, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407,
351    0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0408, 0x0408, 0x0408, 0x0408,
352    0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408,
353    0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b,
354    0x040b, 0x040b, 0x040b, 0x040b, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c,
355    0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040c, 0x040e, 0x040e, 0x040e, 0x040e,
356    0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e, 0x040e,
357    0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f, 0x040f,
358    0x040f, 0x040f, 0x040f, 0x040f, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410,
359    0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0410, 0x0411, 0x0411, 0x0411, 0x0411,
360    0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411, 0x0411,
361    0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412,
362    0x0412, 0x0412, 0x0412, 0x0412, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413,
363    0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0414, 0x0414, 0x0414, 0x0414,
364    0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414, 0x0414,
365    0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415, 0x0415,
366    0x0415, 0x0415, 0x0415, 0x0415, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417,
367    0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0418, 0x0418, 0x0418, 0x0418,
368    0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418,
369    0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419, 0x0419,
370    0x0419, 0x0419, 0x0419, 0x0419, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a,
371    0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041a, 0x041b, 0x041b, 0x041b, 0x041b,
372    0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b,
373    0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c, 0x041c,
374    0x041c, 0x041c, 0x041c, 0x041c, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d,
375    0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041e, 0x041e, 0x041e, 0x041e,
376    0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e, 0x041e,
377    0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f,
378    0x041f, 0x041f, 0x041f, 0x041f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f,
379    0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x04dc, 0x04dc, 0x04dc, 0x04dc,
380    0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc,
381    0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x04f9,
382    0x04f9, 0x04f9, 0x04f9, 0x04f9, 0x060a, 0x060a, 0x060a, 0x060a, 0x060d, 0x060d, 0x060d, 0x060d,
383    0x0616, 0x0616, 0x0616, 0x0616, 0x80ff, 0x80ff, 0x80ff, 0x80ff, 0x0221, 0x0221, 0x0221, 0x0221,
384    0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
385    0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
386    0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
387    0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
388    0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221, 0x0221,
389    0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
390    0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
391    0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
392    0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
393    0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222, 0x0222,
394    0x0222, 0x0222, 0x0222, 0x0222, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
395    0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
396    0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
397    0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
398    0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228,
399    0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0229, 0x0229, 0x0229, 0x0229,
400    0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
401    0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
402    0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
403    0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
404    0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229, 0x0229,
405    0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c,
406    0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c,
407    0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
408    0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
409    0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3,
410    0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
411    0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
412    0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0, 0x03d0,
413    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
414    0x0480, 0x0480, 0x0480, 0x0480, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482,
415    0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0482, 0x0483, 0x0483, 0x0483, 0x0483,
416    0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483,
417    0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04a2,
418    0x04a2, 0x04a2, 0x04a2, 0x04a2, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8,
419    0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04c2, 0x04c2, 0x04c2, 0x04c2,
420    0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2, 0x04c2,
421    0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e0,
422    0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2,
423    0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x0599, 0x0599, 0x0599, 0x0599,
424    0x0599, 0x0599, 0x0599, 0x0599, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1, 0x05a1,
425    0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05a7, 0x05ac, 0x05ac, 0x05ac, 0x05ac,
426    0x05ac, 0x05ac, 0x05ac, 0x05ac, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
427    0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
428    0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
429    0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
430    0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0,
431    0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
432    0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
433    0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
434    0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
435    0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
436    0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1, 0x02c1,
437    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
438    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
439    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
440    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
441    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c8,
442    0x02c8, 0x02c8, 0x02c8, 0x02c8, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
443    0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
444    0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
445    0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
446    0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9,
447    0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
448    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
449    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
450    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
451    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
452    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
453    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
454    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
455    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
456    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
457    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7,
458    0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
459    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
460    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
461    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
462    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
463    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
464    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
465    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
466    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
467    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
468    0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf,
469    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
470    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
471    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
472    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
473    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca,
474    0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
475    0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
476    0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
477    0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
478    0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd,
479    0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
480    0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
481    0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
482    0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
483    0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
484    0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2, 0x02d2,
485    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
486    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
487    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
488    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
489    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02d5,
490    0x02d5, 0x02d5, 0x02d5, 0x02d5, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
491    0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
492    0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
493    0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
494    0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2,
495    0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
496    0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
497    0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
498    0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
499    0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
500    0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3, 0x02f3,
501    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
502    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
503    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
504    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
505    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff,
506    0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
507    0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
508    0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb, 0x03cb,
509    0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc,
510    0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc,
511    0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
512    0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
513    0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d3,
514    0x03d3, 0x03d3, 0x03d3, 0x03d3, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
515    0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
516    0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4, 0x03d4,
517    0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6,
518    0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6,
519    0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03d6, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
520    0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
521    0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd,
522    0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
523    0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
524    0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de,
525    0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df,
526    0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df,
527    0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
528    0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
529    0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1,
530    0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
531    0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
532    0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4,
533    0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
534    0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
535    0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
536    0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
537    0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da,
538    0x02da, 0x02da, 0x02da, 0x02da, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
539    0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
540    0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
541    0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
542    0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db,
543    0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
544    0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
545    0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
546    0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
547    0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
548    0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee,
549    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
550    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
551    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
552    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
553    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0,
554    0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
555    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
556    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
557    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
558    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
559    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
560    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
561    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
562    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
563    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
564    0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea,
565    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
566    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
567    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
568    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
569    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
570    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
571    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
572    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
573    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
574    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb,
575    0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
576    0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
577    0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f5,
578    0x03f5, 0x03f5, 0x03f5, 0x03f5, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
579    0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
580    0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6, 0x03f6,
581    0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7,
582    0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7,
583    0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f7, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
584    0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
585    0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03f8,
586    0x03f8, 0x03f8, 0x03f8, 0x03f8, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
587    0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
588    0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x03fa,
589    0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb,
590    0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb,
591    0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fb, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
592    0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
593    0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc,
594    0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
595    0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
596    0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd,
597];
598
599/// HPACK Huffman decode errors.
600#[derive(Debug, Clone, Copy, PartialEq, Eq)]
601pub enum HuffmanError {
602    /// Invalid code or EOS in the middle of input.
603    InvalidCode,
604    /// Padding does not align to a symbol boundary.
605    InvalidPadding,
606}
607
608/// Decodes a Huffman-encoded byte string into `out`.
609///
610/// Returns the number of decoded bytes.
611///
612/// # Errors
613/// [`HuffmanError::InvalidCode`] on invalid codes;
614/// [`HuffmanError::InvalidPadding`] on bad padding.
615pub fn decode(src: &[u8], out: &mut Vec<u8>) -> Result<usize, HuffmanError> {
616    out.reserve(src.len() << 1);
617    let start = out.len();
618
619    let mut table = 0usize;
620    let mut acc = 0u32;
621    let mut bits = 0usize;
622
623    for &byte in src {
624        acc = (acc << 8) | u32::from(byte);
625        bits += 8;
626
627        while bits >= 8 {
628            let index = ((acc >> (bits - 8)) as u8) as usize;
629            let entry = DECODE_TABLE[table * TABLE_WIDTH + index];
630
631            if entry & BRANCH == 0 {
632                out.push(entry as u8);
633                table = 0;
634                bits -= (entry >> 8) as usize;
635            } else {
636                table = ((entry & TABLE_INDEX_MASK) >> 8) as usize;
637                if table == 0 {
638                    return Err(HuffmanError::InvalidCode);
639                }
640                bits -= 8;
641            }
642        }
643    }
644
645    // Fewer than eight bits remain: a prefix of EOS (all ones) is the
646    // only valid padding, and it must align to a symbol boundary.
647    while bits > 0 {
648        let padding = (1u32 << bits) - 1;
649        if table == 0 && acc & padding == padding {
650            break;
651        }
652
653        let index = ((acc << (8 - bits)) as u8) as usize;
654        let entry = DECODE_TABLE[table * TABLE_WIDTH + index];
655        if entry & BRANCH != 0 {
656            return Err(HuffmanError::InvalidPadding);
657        }
658
659        let used = (entry >> 8) as usize;
660        if used > bits {
661            return Err(HuffmanError::InvalidPadding);
662        }
663
664        out.push(entry as u8);
665        table = 0;
666        bits -= used;
667    }
668
669    if table != 0 {
670        return Err(HuffmanError::InvalidPadding);
671    }
672    Ok(out.len() - start)
673}
674
675/// Encodes `src` with the HPACK Huffman code, appending EOS-aligned
676/// padding, into `out`.
677pub fn encode(src: &[u8], out: &mut Vec<u8>) {
678    let mut bits: u64 = 0;
679    let mut bits_left = 40;
680
681    for &b in src {
682        let (nbits, code) = ENCODE_TABLE[usize::from(b)];
683
684        bits |= code << (bits_left - nbits);
685        bits_left -= nbits;
686
687        while bits_left <= 32 {
688            out.push((bits >> 32) as u8);
689
690            bits <<= 8;
691            bits_left += 8;
692        }
693    }
694
695    if bits_left != 40 {
696        // Pad with the EOS prefix (all ones).
697        bits |= (1 << bits_left) - 1;
698        out.push((bits >> 32) as u8);
699    }
700}
701
702#[cfg(test)]
703mod tests {
704    use super::*;
705
706    fn decoded(src: &[u8]) -> Vec<u8> {
707        let mut out = Vec::new();
708        decode(src, &mut out).expect("decode");
709        out
710    }
711
712    #[test]
713    fn decode_single_byte() {
714        assert_eq!(decoded(&[0b00111111]), b"o");
715        assert_eq!(decoded(&[7]), b"0");
716    }
717
718    #[test]
719    fn multi_char() {
720        assert_eq!(decoded(&[254, 1]), b"!0");
721        assert_eq!(decoded(&[0b01010011, 0b11111000]), b" !");
722    }
723
724    #[test]
725    fn encode_roundtrip_strings() {
726        const DATA: &[&[u8]] = &[
727            b"hello world",
728            b":method",
729            b":authority",
730            b"GET",
731            b"http",
732            b"/images/top/sp2/cmn/logo-ns-130528.png",
733            b"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
734            b"\0\0\0",
735            b"\xFF\xF8",
736        ];
737        for s in DATA {
738            let mut enc = Vec::new();
739            encode(s, &mut enc);
740            assert_eq!(decoded(&enc), *s);
741        }
742    }
743
744    #[test]
745    fn encode_decode_all_octets() {
746        let src: Vec<u8> = (0..=u8::MAX).collect();
747        let mut enc = Vec::new();
748        encode(&src, &mut enc);
749        assert_eq!(decoded(&enc), src);
750    }
751
752    #[test]
753    fn rejects_eos_and_invalid_padding() {
754        let mut out = Vec::new();
755        // Pure EOS prefix (all ones) is never valid data.
756        assert_eq!(decode(&[0xff], &mut out), Err(HuffmanError::InvalidPadding));
757        // 0x07 = 00000111: '0' (00000) + 111 EOS padding = "0", valid.
758        assert_eq!(decoded(&[7]), b"0");
759        // 0x00 = '0' + three ZERO padding bits: invalid (padding must be
760        // the EOS prefix, i.e. all ones).
761        assert_eq!(decode(&[0x00], &mut out), Err(HuffmanError::InvalidPadding));
762    }
763}