Indeo Video Interactive 4 and 5 common code and DSP functions.
[ffmpeg.git] / libavcodec / ivi_common.c
1 /*
2  * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3  *
4  * Copyright (c) 2009 Maxim Poliakovski
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file libavcodec/ivi_common.c
25  * This file contains functions and data shared by both Indeo4 and
26  * Indeo5 decoders.
27  */
28
29 #define ALT_BITSTREAM_READER_LE
30 #include "avcodec.h"
31 #include "get_bits.h"
32 #include "ivi_common.h"
33 #include "libavutil/common.h"
34 #include "ivi_dsp.h"
35
36 /**
37  *  Reverses "nbits" bits of the value "val" and returns the result
38  *  in the least significant bits.
39  */
40 static uint16_t inv_bits(uint16_t val, int nbits)
41 {
42     uint16_t res;
43
44     if (nbits <= 8) {
45         res = av_reverse[val] >> (8-nbits);
46     } else
47         res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
48
49     return res;
50 }
51
52 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
53 {
54     int         pos, i, j, codes_per_row, prefix, not_last_row;
55     uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
56     uint8_t     bits[256];
57
58     pos = 0; /* current position = 0 */
59
60     for (i = 0; i < cb->num_rows; i++) {
61         codes_per_row = 1 << cb->xbits[i];
62         not_last_row  = (i != cb->num_rows - 1);
63         prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
64
65         for (j = 0; j < codes_per_row; j++) {
66             if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
67                 break;      /* elements, but only 256 codes are allowed! */
68
69             bits[pos] = i + cb->xbits[i] + not_last_row;
70             if (bits[pos] > IVI_VLC_BITS)
71                 return -1; /* invalid descriptor */
72
73             codewords[pos] = inv_bits((prefix | j), bits[pos]);
74             if (!bits[pos])
75                 bits[pos] = 1;
76
77             pos++;
78         }//for j
79     }//for i
80
81     /* number of codewords = pos */
82     return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
83                     (flag & 1) | INIT_VLC_LE);
84 }
85
86 int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc)
87 {
88     int tab_sel, i;
89
90     tab_sel = get_bits(gb, 3);
91     if (tab_sel == 7) {
92         /* custom huffman table (explicitly encoded) */
93         desc->num_rows = get_bits(gb, 4);
94
95         for (i = 0; i < desc->num_rows; i++)
96             desc->xbits[i] = get_bits(gb, 4);
97     }
98
99     return tab_sel;
100 }
101
102 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
103 {
104     return    desc1->num_rows != desc2->num_rows
105            || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
106 }
107
108 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
109 {
110     dst->num_rows = src->num_rows;
111     memcpy(dst->xbits, src->xbits, src->num_rows);
112 }
113
114 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
115 {
116     int         p, b;
117     uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
118     IVIBandDesc *band;
119
120     ff_ivi_free_buffers(planes);
121
122     /* fill in the descriptor of the luminance plane */
123     planes[0].width     = cfg->pic_width;
124     planes[0].height    = cfg->pic_height;
125     planes[0].num_bands = cfg->luma_bands;
126
127     /* fill in the descriptors of the chrominance planes */
128     planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
129     planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
130     planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
131
132     for (p = 0; p < 3; p++) {
133         planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
134         if (!planes[p].bands)
135             return AVERROR(ENOMEM);
136
137         /* select band dimensions: if there is only one band then it
138          *  has the full size, if there are several bands each of them
139          *  has only half size */
140         b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
141         b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
142
143         /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
144         /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
145         align_fac       = p ? 8 : 16;
146         width_aligned   = FFALIGN(b_width , align_fac);
147         height_aligned  = FFALIGN(b_height, align_fac);
148         buf_size        = width_aligned * height_aligned * sizeof(int16_t);
149
150         for (b = 0; b < planes[p].num_bands; b++) {
151             band = &planes[p].bands[b]; /* select appropriate plane/band */
152             band->plane    = p;
153             band->band_num = b;
154             band->width    = b_width;
155             band->height   = b_height;
156             band->pitch    = width_aligned;
157             band->bufs[0]  = av_malloc(buf_size);
158             band->bufs[1]  = av_malloc(buf_size);
159             if (!band->bufs[0] || !band->bufs[1])
160                 return AVERROR(ENOMEM);
161
162             /* allocate the 3rd band buffer for scalability mode */
163             if (cfg->luma_bands > 1) {
164                 band->bufs[2] = av_malloc(buf_size);
165                 if (!band->bufs[2])
166                     return AVERROR(ENOMEM);
167             }
168
169             planes[p].bands[0].huff_desc.num_rows = 0; /* reset custom vlc */
170         }
171     }
172
173     return 0;
174 }
175
176 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
177 {
178     int p, b, t;
179
180     for (p = 0; p < 3; p++) {
181         for (b = 0; b < planes[p].num_bands; b++) {
182             av_freep(&planes[p].bands[b].bufs[0]);
183             av_freep(&planes[p].bands[b].bufs[1]);
184             av_freep(&planes[p].bands[b].bufs[2]);
185
186             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
187                 av_freep(&planes[p].bands[b].tiles[t].mbs);
188             av_freep(&planes[p].bands[b].tiles);
189         }
190         av_freep(&planes[p].bands);
191     }
192 }
193
194 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
195 {
196     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
197     IVIBandDesc *band;
198     IVITile     *tile, *ref_tile;
199
200     for (p = 0; p < 3; p++) {
201         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
202         t_height = !p ? tile_height : (tile_height + 3) >> 2;
203
204         for (b = 0; b < planes[p].num_bands; b++) {
205             band = &planes[p].bands[b];
206             x_tiles = IVI_NUM_TILES(band->width, t_width);
207             y_tiles = IVI_NUM_TILES(band->height, t_height);
208             band->num_tiles = x_tiles * y_tiles;
209
210             av_freep(&band->tiles);
211             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
212             if (!band->tiles)
213                 return AVERROR(ENOMEM);
214
215             tile = band->tiles;
216
217             /* use the first luma band as reference for motion vectors
218              * and quant */
219             ref_tile = planes[0].bands[0].tiles;
220
221             for (y = 0; y < band->height; y += t_height) {
222                 for (x = 0; x < band->width; x += t_width) {
223                     tile->xpos     = x;
224                     tile->ypos     = y;
225                     tile->width    = FFMIN(band->width - x,  t_width);
226                     tile->height   = FFMIN(band->height - y, t_height);
227                     tile->is_empty = tile->data_size = 0;
228                     /* calculate number of macroblocks */
229                     tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
230                                                       band->mb_size);
231
232                     av_freep(&tile->mbs);
233                     tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
234                     if (!tile->mbs)
235                         return AVERROR(ENOMEM);
236
237                     tile->ref_mbs = 0;
238                     if (p || b) {
239                         tile->ref_mbs = ref_tile->mbs;
240                         ref_tile++;
241                     }
242
243                     tile++;
244                 }
245             }
246
247         }// for b
248     }// for p
249
250     return 0;
251 }
252
253 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
254 {
255     int    len;
256
257     len = 0;
258     if (get_bits1(gb)) {
259         len = get_bits(gb, 8);
260         if (len == 255)
261             len = get_bits_long(gb, 24);
262     }
263
264     /* align the bitstream reader on the byte boundary */
265     align_get_bits(gb);
266
267     return len;
268 }
269
270 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
271 {
272     int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
273                 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
274     uint8_t     col_flags[8];
275     int32_t     prev_dc, trvec[64];
276     uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
277     IVIMbInfo   *mb;
278     RVMapDesc   *rvmap = band->rv_map;
279     void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
280     void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
281     const uint8_t   *base_tab, *scale_tab;
282
283     prev_dc = 0; /* init intra prediction for the DC coefficient */
284
285     blk_size   = band->blk_size;
286     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
287     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
288     num_coeffs = blk_size * blk_size;
289     if (blk_size == 8) {
290         mc_with_delta_func = ff_ivi_mc_8x8_delta;
291         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
292     } else {
293         mc_with_delta_func = ff_ivi_mc_4x4_delta;
294         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
295     }
296
297     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
298         is_intra = !mb->type;
299         cbp      = mb->cbp;
300         buf_offs = mb->buf_offs;
301
302         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
303
304         base_tab  = is_intra ? band->intra_base  : band->inter_base;
305         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
306
307         if (!is_intra) {
308             mv_x = mb->mv_x;
309             mv_y = mb->mv_y;
310             if (!band->is_halfpel) {
311                 mc_type = 0; /* we have only fullpel vectors */
312             } else {
313                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
314                 mv_x >>= 1;
315                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
316             }
317         }
318
319         for (blk = 0; blk < num_blocks; blk++) {
320             /* adjust block position in the buffer according to its number */
321             if (blk & 1) {
322                 buf_offs += blk_size;
323             } else if (blk == 2) {
324                 buf_offs -= blk_size;
325                 buf_offs += blk_size * band->pitch;
326             }
327
328             if (cbp & 1) { /* block coded ? */
329                 scan_pos = -1;
330                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
331                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
332
333                 while (scan_pos <= num_coeffs) {
334                     sym = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
335                     if (sym == rvmap->eob_sym)
336                         break; /* End of block */
337
338                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
339                         run = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1) + 1;
340                         lo  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
341                         hi  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
342                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
343                     } else {
344                         run = rvmap->runtab[sym];
345                         val = rvmap->valtab[sym];
346                     }
347
348                     /* de-zigzag and dequantize */
349                     scan_pos += run;
350                     if (scan_pos >= num_coeffs)
351                         break;
352                     pos = band->scan[scan_pos];
353
354                     if (IVI_DEBUG && !val)
355                         av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
356
357                     q = (base_tab[pos] * scale_tab[quant]) >> 8;
358                     if (q > 1)
359                         val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
360                     trvec[pos] = val;
361                     col_flags[pos & col_mask] |= val; /* track columns containing non-zero coeffs */
362                 }// while
363
364                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
365                     return -1; /* corrupt block data */
366
367                 /* undoing DC coeff prediction for intra-blocks */
368                 if (is_intra && band->is_2d_trans) {
369                     prev_dc      += trvec[0];
370                     trvec[0]      = prev_dc;
371                     col_flags[0] |= !!prev_dc;
372                 }
373
374                 /* apply inverse transform */
375                 band->inv_transform(trvec, band->buf + buf_offs,
376                                     band->pitch, col_flags);
377
378                 /* apply motion compensation */
379                 if (!is_intra)
380                     mc_with_delta_func(band->buf + buf_offs,
381                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
382                                        band->pitch, mc_type);
383             } else {
384                 /* block not coded */
385                 /* for intra blocks apply the dc slant transform */
386                 /* for inter - perform the motion compensation without delta */
387                 if (is_intra && band->dc_transform) {
388                     band->dc_transform(&prev_dc, band->buf + buf_offs,
389                                        band->pitch, blk_size);
390                 } else
391                     mc_no_delta_func(band->buf + buf_offs,
392                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
393                                      band->pitch, mc_type);
394             }
395
396             cbp >>= 1;
397         }// for blk
398     }// for mbn
399
400     align_get_bits(gb);
401
402     return 0;
403 }
404
405 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
406                                IVITile *tile, int32_t mv_scale)
407 {
408     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
409     int             offs, mb_offset, row_offset;
410     IVIMbInfo       *mb, *ref_mb;
411     const int16_t   *src;
412     int16_t         *dst;
413     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
414                              int mc_type);
415
416     offs       = tile->ypos * band->pitch + tile->xpos;
417     mb         = tile->mbs;
418     ref_mb     = tile->ref_mbs;
419     row_offset = band->mb_size * band->pitch;
420     need_mc    = 0; /* reset the mc tracking flag */
421
422     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
423         mb_offset = offs;
424
425         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
426             mb->xpos     = x;
427             mb->ypos     = y;
428             mb->buf_offs = mb_offset;
429
430             mb->type = 1; /* set the macroblocks type = INTER */
431             mb->cbp  = 0; /* all blocks are empty */
432
433             if (!band->qdelta_present && !band->plane && !band->band_num) {
434                 mb->q_delta = band->glob_quant;
435                 mb->mv_x    = 0;
436                 mb->mv_y    = 0;
437             }
438
439             if (band->inherit_qdelta && ref_mb)
440                 mb->q_delta = ref_mb->q_delta;
441
442             if (band->inherit_mv) {
443                 /* motion vector inheritance */
444                 if (mv_scale) {
445                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
446                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
447                 } else {
448                     mb->mv_x = ref_mb->mv_x;
449                     mb->mv_y = ref_mb->mv_y;
450                 }
451                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
452             }
453
454             mb++;
455             if (ref_mb)
456                 ref_mb++;
457             mb_offset += band->mb_size;
458         } // for x
459         offs += row_offset;
460     } // for y
461
462     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
463         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
464         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
465                                                  : ff_ivi_mc_4x4_no_delta;
466
467         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
468             mv_x = mb->mv_x;
469             mv_y = mb->mv_y;
470             if (!band->is_halfpel) {
471                 mc_type = 0; /* we have only fullpel vectors */
472             } else {
473                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
474                 mv_x >>= 1;
475                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
476             }
477
478             for (blk = 0; blk < num_blocks; blk++) {
479                 /* adjust block position in the buffer according with its number */
480                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
481                 mc_no_delta_func(band->buf + offs,
482                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
483                                  band->pitch, mc_type);
484             }
485         }
486     } else {
487         /* copy data from the reference tile into the current one */
488         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
489         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
490         for (y = 0; y < tile->height; y++) {
491             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
492             src += band->pitch;
493             dst += band->pitch;
494         }
495     }
496 }
497
498
499 #if IVI_DEBUG
500 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
501 {
502     int         x, y;
503     int16_t     *src, checksum;
504
505     src = band->buf;
506     checksum = 0;
507
508     for (y = 0; y < band->height; src += band->pitch, y++)
509         for (x = 0; x < band->width; x++)
510             checksum += src[x];
511
512     return checksum;
513 }
514
515 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
516 {
517     int         x, y, result;
518     uint8_t     t1, t2;
519     int16_t    *src;
520
521     src = band->buf;
522     result = 0;
523
524     for (y = 0; y < band->height; src += band->pitch, y++) {
525         for (x = 0; x < band->width; x++) {
526             t1 = av_clip(src[x] + 128, 0, 255);
527             t2 = ref[x];
528             if (t1 != t2) {
529                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
530                        y / band->blk_size, x / band->blk_size);
531                 result = -1;
532             }
533         }
534         ref += pitch;
535     }
536
537     return result;
538 }
539 #endif
540
541 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
542 {
543     int             x, y;
544     const int16_t   *src  = plane->bands[0].buf;
545     uint32_t        pitch = plane->bands[0].pitch;
546
547     for (y = 0; y < plane->height; y++) {
548         for (x = 0; x < plane->width; x++)
549             dst[x] = av_clip_uint8(src[x] + 128);
550         src += pitch;
551         dst += dst_pitch;
552     }
553 }
554
555
556 /**
557  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
558  * signals. They are specified using "huffman descriptors" in order to
559  * avoid huge static tables. The decoding tables will be generated at
560  * startup from these descriptors.
561  */
562 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
563     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
564     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
565     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
566     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
567     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
568     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
569     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
570     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
571 };
572
573 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
574     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
575     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
576     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
577     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
578     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
579     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
580     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
581     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
582 };
583
584
585 /**
586  *  Run-value (RLE) tables.
587  */
588 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
589 {   /* MapTab0 */
590     5, /* eob_sym */
591     2, /* esc_sym */
592     /* run table */
593     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
594      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
595      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
596      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
597      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
598      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
599      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
600      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
601      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
602      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
603     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
604      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
605      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
606      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
607      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
608     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
609
610     /* value table */
611     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
612       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
613      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
614       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
615      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
616       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
617       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
618       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
619      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
620       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
621      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
622       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
623     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
624      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
625       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
626      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
627 },{
628     /* MapTab1 */
629     0,  /* eob_sym */
630     38, /* esc_sym */
631     /* run table */
632     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
633      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
634     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
635     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
636     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
637     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
638     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
639     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
640     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
641     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
642     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
643      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
644     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
645     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
646     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
647      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
648
649     /* value table */
650     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
651     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
652     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
653      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
654      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
655      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
656     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
657     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
658      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
659      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
660      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
661      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
662      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
663      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
664     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
665     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
666 },{
667     /* MapTab2 */
668     2,  /* eob_sym */
669     11, /* esc_sym */
670     /* run table */
671     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
672      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
673      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
674      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
675      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
676      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
677     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
678     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
679     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
680      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
681      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
682     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
683     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
684     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
685      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
686      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
687
688     /* value table */
689     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
690       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
691      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
692       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
693       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
694       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
695       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
696       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
697       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
698      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
699     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
700      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
701       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
702      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
703      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
704      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
705 },{
706     /* MapTab3 */
707     0,  /* eob_sym */
708     35, /* esc_sym */
709     /* run table */
710     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
711      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
712      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
713      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
714     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
715      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
716      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
717     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
718     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
719     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
720     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
721      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
722     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
723     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
724     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
725     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
726
727     /* value table */
728     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
729      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
730      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
731       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
732       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
733       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
734       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
735      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
736       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
737       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
738      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
739      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
740      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
741       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
742      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
743      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
744 },{
745     /* MapTab4 */
746     0,  /* eob_sym */
747     34, /* esc_sym */
748     /* run table */
749     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
750      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
751      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
752      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
753      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
754      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
755      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
756      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
757      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
758      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
759      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
760      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
761      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
762      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
763      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
764      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
765
766     /* value table */
767     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
768       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
769       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
770       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
771      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
772      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
773       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
774       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
775       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
776     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
777     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
778      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
779     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
780       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
781      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
782      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
783 },{
784     /* MapTab5 */
785     2,  /* eob_sym */
786     33, /* esc_sym */
787     /* run table */
788     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
789      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
790      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
791     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
792      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
793      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
794      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
795      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
796      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
797      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
798      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
799      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
800      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
801     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
802      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
803     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
804
805     /* value table */
806     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
807      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
808      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
809       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
810       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
811       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
812      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
813      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
814     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
815      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
816      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
817       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
818      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
819      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
820      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
821      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
822 },{
823     /* MapTab6 */
824     2,  /* eob_sym */
825     13, /* esc_sym */
826     /* run table */
827     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
828      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
829      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
830      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
831      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
832      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
833     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
834      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
835     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
836      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
837      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
838      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
839      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
840     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
841      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
842     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
843
844     /* value table */
845     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
846        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
847        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
848        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
849      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
850        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
851       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
852       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
853        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
854       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
855       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
856      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
857       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
858       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
859        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
860        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
861 },{
862     /* MapTab7 */
863     2,  /* eob_sym */
864     38, /* esc_sym */
865     /* run table */
866     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
867      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
868      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
869     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
870      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
871     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
872     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
873     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
874     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
875     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
876      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
877     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
878      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
879      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
880      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
881     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
882
883     /* value table */
884     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
885      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
886      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
887       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
888       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
889      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
890      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
891       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
892      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
893      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
894      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
895      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
896      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
897      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
898       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
899       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
900 },{
901     /* MapTab8 */
902     4,  /* eob_sym */
903     11, /* esc_sym */
904     /* run table */
905     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
906      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
907      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
908      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
909      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
910      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
911      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
912     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
913      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
914      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
915      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
916     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
917     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
918      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
919     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
920     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
921
922     /* value table */
923     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
924       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
925       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
926       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
927      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
928       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
929      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
930       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
931     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
932      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
933       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
934       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
935      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
936       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
937       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
938       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
939 }
940 };