diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ra144.c b/src/add-ons/media/plugins/avcodec/libavcodec/ra144.c index 4a8cba6b66..b947d67968 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/ra144.c +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ra144.c @@ -1,513 +1,356 @@ /* * Real Audio 1.0 (14.4K) - * Copyright (c) 2003 the ffmpeg project * - * This library is free software; you can redistribute it and/or + * Copyright (c) 2008 Vitor Sessak + * Copyright (c) 2003 Nick Kurshev + * Based on public domain decoder at http://www.honeypot.net/audio + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avcodec.h" +#include "bitstream.h" #include "ra144.h" +#include "acelp_filters.h" -#define DATABLOCK1 20 /* size of 14.4 input block in bytes */ -#define DATACHUNK1 1440 /* size of 14.4 input chunk in bytes */ -#define AUDIOBLOCK 160 /* size of output block in 16-bit words (320 bytes) */ -#define AUDIOBUFFER 12288 /* size of output buffer in 16-bit words (24576 bytes) */ -/* consts */ -#define NBLOCKS 4 /* number of segments within a block */ -#define BLOCKSIZE 40 /* (quarter) block size in 16-bit words (80 bytes) */ -#define HALFBLOCK 20 /* BLOCKSIZE/2 */ -#define BUFFERSIZE 146 /* for do_output */ +#define NBLOCKS 4 ///< number of subblocks within a block +#define BLOCKSIZE 40 ///< subblock size in 16-bit words +#define BUFFERSIZE 146 ///< the size of the adaptive codebook -/* internal globals */ typedef struct { - unsigned int resetflag, val, oldval; - unsigned int unpacked[28]; /* buffer for unpacked input */ - unsigned int *iptr; /* pointer to current input (from unpacked) */ - unsigned int gval; - unsigned short *gsp; - unsigned int gbuf1[8]; - unsigned short gbuf2[120]; - signed short output_buffer[40]; - unsigned int *decptr; /* decoder ptr */ - signed short *decsp; + unsigned int old_energy; ///< previous frame energy - /* the swapped buffers */ - unsigned int swapb1a[10]; - unsigned int swapb2a[10]; - unsigned int swapb1b[10]; - unsigned int swapb2b[10]; - unsigned int *swapbuf1; - unsigned int *swapbuf2; - unsigned int *swapbuf1alt; - unsigned int *swapbuf2alt; + unsigned int lpc_tables[2][10]; - unsigned int buffer[5]; - unsigned short int buffer_2[148]; - unsigned short int buffer_a[40]; - unsigned short int buffer_b[40]; - unsigned short int buffer_c[40]; - unsigned short int buffer_d[40]; + /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame + * and lpc_coef[1] of the previous one */ + unsigned int *lpc_coef[2]; - unsigned short int work[50]; - unsigned short *sptr; + unsigned int lpc_refl_rms[2]; - int buffer1[10]; - int buffer2[10]; + /** the current subblock padded by the last 10 values of the previous one*/ + int16_t curr_sblock[50]; - signed short wavtable1[2304]; - unsigned short wavtable2[2304]; -} Real144_internal; + /** adaptive codebook. Its size is two units bigger to avoid a + * buffer overflow */ + uint16_t adapt_cb[148]; +} RA144Context; static int ra144_decode_init(AVCodecContext * avctx) { - Real144_internal *glob=avctx->priv_data; + RA144Context *ractx = avctx->priv_data; - memset(glob,0,sizeof(Real144_internal)); - glob->resetflag=1; - glob->swapbuf1=glob->swapb1a; - glob->swapbuf2=glob->swapb2a; - glob->swapbuf1alt=glob->swapb1b; - glob->swapbuf2alt=glob->swapb2b; + ractx->lpc_coef[0] = ractx->lpc_tables[0]; + ractx->lpc_coef[1] = ractx->lpc_tables[1]; - memcpy(glob->wavtable1,wavtable1,sizeof(wavtable1)); - memcpy(glob->wavtable2,wavtable2,sizeof(wavtable2)); - - return 0; + avctx->sample_fmt = SAMPLE_FMT_S16; + return 0; } -static void final(Real144_internal *glob, short *i1, short *i2, void *out, int *statbuf, int len); -static void add_wav(Real144_internal *glob, int n, int f, int m1, int m2, int m3, short *s1, short *s2, short *s3, short *dest); -static int irms(short *data, int factor); -static void rotate_block(short *source, short *target, int offset); -/* lookup square roots in table */ +/** + * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an + * odd way to make the output identical to the binary decoder. + */ static int t_sqrt(unsigned int x) { - int s=0; - while (x>0xfff) { s++; x=x>>2; } - return (sqrt_table[x]<0) { - ptr=b2+x; - for (y=0;y<=x-1;y++) - b1[y]=(((*a1)*(*(--ptr)))>>12)+b2[y]; + int s = 2; + while (x > 0xfff) { + s++; + x >>= 2; } - tmp=b1; - b1=b2; - b2=tmp; - a1++; - } - ptr=a2+10; - while (ptr>a2) (*a2++)>>=4; + + return ff_sqrt(x << 20) << s; } - -/* do quarter-block output */ -static void do_output_subblock(Real144_internal *glob, int x) +/** + * Evaluate the LPC filter coefficients from the reflection coefficients. + * Does the inverse of the eval_refl() function. + */ +static void eval_coefs(int *coefs, const int *refl) { - int a,b,c,d,e,f,g; + int buffer[10]; + int *b1 = buffer; + int *b2 = coefs; + int i, j; - if (x==1) memset(glob->buffer,0,20); - if ((*glob->iptr)==0) a=0; - else a=(*glob->iptr)+HALFBLOCK-1; - glob->iptr++; - b=*(glob->iptr++); - c=*(glob->iptr++); - d=*(glob->iptr++); - if (a) rotate_block(glob->buffer_2,glob->buffer_a,a); - memcpy(glob->buffer_b,etable1+b*BLOCKSIZE,BLOCKSIZE*2); - e=((ftable1[b]>>4)*glob->gval)>>8; - memcpy(glob->buffer_c,etable2+c*BLOCKSIZE,BLOCKSIZE*2); - f=((ftable2[c]>>4)*glob->gval)>>8; - if (a) g=irms(glob->buffer_a,glob->gval)>>12; - else g=0; - add_wav(glob,d,a,g,e,f,glob->buffer_a,glob->buffer_b,glob->buffer_c,glob->buffer_d); - memmove(glob->buffer_2,glob->buffer_2+BLOCKSIZE,(BUFFERSIZE-BLOCKSIZE)*2); - memcpy(glob->buffer_2+BUFFERSIZE-BLOCKSIZE,glob->buffer_d,BLOCKSIZE*2); - final(glob,glob->gsp,glob->buffer_d,glob->output_buffer,glob->buffer,BLOCKSIZE); -} + for (i=0; i < 10; i++) { + b1[i] = refl[i] << 4; -/* rotate block */ -static void rotate_block(short *source, short *target, int offset) -{ - short *end; - short *ptr1; - short *ptr2; - short *ptr3; - ptr2=source+BUFFERSIZE; - ptr3=ptr1=ptr2-offset; - end=target+BLOCKSIZE; - while (target> 12) + b2[j]; -/* inverse root mean square */ -static int irms(short *data, int factor) -{ - short *p1,*p2; - unsigned int sum; - p2=(p1=data)+BLOCKSIZE; - for (sum=0;p2>p1;p1++) sum+=(*p1)*(*p1); - if (sum==0) return 0; /* OOPS - division by zero */ - return (0x20000000/(t_sqrt(sum)>>8))*factor; -} - -/* multiply/add wavetable */ -static void add_wav(Real144_internal *glob, int n, int f, int m1, int m2, int m3, short *s1, short *s2, short *s3, short *dest) -{ - int a,b,c; - short *ptr,*ptr2; - - ptr=glob->wavtable1+n*9; - ptr2=glob->wavtable2+n*9; - if (f!=0) { - a=((*ptr)*m1)>>((*ptr2)+1); - } else { - a=0; - } - ptr++;ptr2++; - b=((*ptr)*m2)>>((*ptr2)+1); - ptr++;ptr2++; - c=((*ptr)*m3)>>((*ptr2)+1); - ptr2=(ptr=dest)+BLOCKSIZE; - if (f!=0) - while (ptr>12; - else - while (ptr>12; -} - - -static void final(Real144_internal *glob, short *i1, short *i2, void *out, int *statbuf, int len) -{ - int x,sum; - int buffer[10]; - short *ptr; - short *ptr2; - - memcpy(glob->work,statbuf,20); - memcpy(glob->work+10,i2,len*2); - - buffer[9]=i1[0]; - buffer[8]=i1[1]; - buffer[7]=i1[2]; - buffer[6]=i1[3]; - buffer[5]=i1[4]; - buffer[4]=i1[5]; - buffer[3]=i1[6]; - buffer[2]=i1[7]; - buffer[1]=i1[8]; - buffer[0]=i1[9]; - - ptr2=(ptr=glob->work)+len; - while (ptr>12; - x=ptr[10]-sum; - if (x<-32768 || x>32767) - { - memset(out,0,len*2); - memset(statbuf,0,20); - return; + FFSWAP(int *, b1, b2); } - ptr[10]=x; - ptr++; - } - memcpy(out,ptr+10-len,len*2); - memcpy(statbuf,ptr,20); + + for (i=0; i < 10; i++) + coefs[i] >>= 4; } -/* Decode 20-byte input */ -static void unpack_input(unsigned char *input, unsigned int *output) +/** + * Copy the last offset values of *source to *target. If those values are not + * enough to fill the target buffer, fill it with another copy of those values. + */ +static void copy_and_dup(int16_t *target, const int16_t *source, int offset) { - unsigned int outbuffer[28]; - unsigned short inbuffer[10]; - unsigned int x; - unsigned int *ptr; + source += BUFFERSIZE - offset; - /* fix endianness */ - for (x=0;x<20;x+=2) - inbuffer[x/2]=(input[x]<<8)+input[x+1]; - - /* unpack */ - ptr=outbuffer; - *(ptr++)=27; - *(ptr++)=(inbuffer[0]>>10)&0x3f; - *(ptr++)=(inbuffer[0]>>5)&0x1f; - *(ptr++)=inbuffer[0]&0x1f; - *(ptr++)=(inbuffer[1]>>12)&0xf; - *(ptr++)=(inbuffer[1]>>8)&0xf; - *(ptr++)=(inbuffer[1]>>5)&7; - *(ptr++)=(inbuffer[1]>>2)&7; - *(ptr++)=((inbuffer[1]<<1)&6)|((inbuffer[2]>>15)&1); - *(ptr++)=(inbuffer[2]>>12)&7; - *(ptr++)=(inbuffer[2]>>10)&3; - *(ptr++)=(inbuffer[2]>>5)&0x1f; - *(ptr++)=((inbuffer[2]<<2)&0x7c)|((inbuffer[3]>>14)&3); - *(ptr++)=(inbuffer[3]>>6)&0xff; - *(ptr++)=((inbuffer[3]<<1)&0x7e)|((inbuffer[4]>>15)&1); - *(ptr++)=(inbuffer[4]>>8)&0x7f; - *(ptr++)=(inbuffer[4]>>1)&0x7f; - *(ptr++)=((inbuffer[4]<<7)&0x80)|((inbuffer[5]>>9)&0x7f); - *(ptr++)=(inbuffer[5]>>2)&0x7f; - *(ptr++)=((inbuffer[5]<<5)&0x60)|((inbuffer[6]>>11)&0x1f); - *(ptr++)=(inbuffer[6]>>4)&0x7f; - *(ptr++)=((inbuffer[6]<<4)&0xf0)|((inbuffer[7]>>12)&0xf); - *(ptr++)=(inbuffer[7]>>5)&0x7f; - *(ptr++)=((inbuffer[7]<<2)&0x7c)|((inbuffer[8]>>14)&3); - *(ptr++)=(inbuffer[8]>>7)&0x7f; - *(ptr++)=((inbuffer[8]<<1)&0xfe)|((inbuffer[9]>>15)&1); - *(ptr++)=(inbuffer[9]>>8)&0x7f; - *(ptr++)=(inbuffer[9]>>1)&0x7f; - - *(output++)=outbuffer[11]; - for (x=1;x<11;*(output++)=outbuffer[x++]); - ptr=outbuffer+12; - for (x=0;x<16;x+=4) - { - *(output++)=ptr[x]; - *(output++)=ptr[x+2]; - *(output++)=ptr[x+3]; - *(output++)=ptr[x+1]; - } -} - -static unsigned int rms(int *data, int f) -{ - int *c; - int x; - unsigned int res; - int b; - - c=data; - b=0; - res=0x10000; - for (x=0;x<10;x++) - { - res=(((0x1000000-(*c)*(*c))>>12)*res)>>12; - if (res==0) return 0; - if (res<=0x3fff) - { - while (res<=0x3fff) - { - b++; - res<<=2; - } + if (offset > BLOCKSIZE) { + memcpy(target, source, BLOCKSIZE*sizeof(*target)); } else { - if (res>0x10000) - return 0; /* We're screwed, might as well go out with a bang. :P */ + memcpy(target, source, offset*sizeof(*target)); + memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target)); } - c++; - } - if (res>0) res=t_sqrt(res); - - res>>=(b+10); - res=(res*f)>>10; - return res; } -static void dec1(Real144_internal *glob, int *data, int *inp, int n, int f) +/** inverse root mean square */ +static int irms(const int16_t *data) { - short *ptr,*end; + unsigned int i, sum = 0; - *(glob->decptr++)=rms(data,f); - glob->decptr++; - end=(ptr=glob->decsp)+(n*10); - while (ptr> 8); } -static int eq(Real144_internal *glob, short *in, int *target) +static void add_wav(int16_t *dest, int n, int skip_first, int *m, + const int16_t *s1, const int8_t *s2, const int8_t *s3) { - int retval; - int a; - int b; - int c; - unsigned int u; - short *sptr; - int *ptr1,*ptr2,*ptr3; - int *bp1,*bp2,*temp; + int i; + int v[3]; - retval=0; - bp1=glob->buffer1; - bp2=glob->buffer2; - ptr2=(ptr3=glob->buffer2)+9; - sptr=in; - while (ptr2>=ptr3) - *(ptr3++)=*(sptr++); + v[0] = 0; + for (i=!skip_first; i<3; i++) + v[i] = (gain_val_tab[n][i] * m[i]) >> (gain_exp_tab[n][i] + 1); - target+=9; - a=bp2[9]; - *target=a; - if (a+0x1000>0x1fff) - return 0; /* We're screwed, might as well go out with a bang. :P */ - c=8;u=a; - while (c>=0) - { - if (u==0x1000) u++; - if (u==0xfffff000) u--; - b=0x1000-((u*u)>>12); - if (b==0) b++; - ptr2=bp1; - ptr1=(ptr3=bp2)+c; - for (u=0;u<=c;u++) - *(ptr2++)=((*(ptr3++)-(((*target)*(*(ptr1--)))>>12))*(0x1000000/b))>>12; - *(--target)=u=bp1[(c--)]; - if ((u+0x1000)>0x1fff) retval=1; - temp=bp2; - bp2=bp1; - bp1=temp; - } - return retval; + for (i=0; i < BLOCKSIZE; i++) + dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12; } -static void dec2(Real144_internal *glob, int *data, int *inp, int n, int f, int *inp2, int l) +static unsigned int rescale_rms(unsigned int rms, unsigned int energy) { - unsigned int *ptr1,*ptr2; - int work[10]; - int a,b; - int x; - int result; - - if(l+1decsp=glob->sptr=glob->gbuf2; - glob->decptr=glob->gbuf1; - } - ptr1=inp; - ptr2=inp2; - for (x=0;x<10*n;x++) - *(glob->sptr++)=(a*(*ptr1++)+b*(*ptr2++))>>2; - result=eq(glob,glob->decsp,work); - if (result==1) - { - dec1(glob,data,inp,n,f); - } else { - *(glob->decptr++)=rms(work,f); - glob->decptr++; - } - glob->decsp+=n*10; + return (rms * energy) >> 10; } -/* Uncompress one block (20 bytes -> 160*2 bytes) */ -static int ra144_decode_frame(AVCodecContext * avctx, - void *data, int *data_size, - uint8_t * buf, int buf_size) +static unsigned int rms(const int *data) { - unsigned int a,b,c; - long s; - signed short *shptr; - unsigned int *lptr,*temp; - const short **dptr; - void *datao; - Real144_internal *glob=avctx->priv_data; + int i; + unsigned int res = 0x10000; + int b = 10; - datao = data; - unpack_input(buf,glob->unpacked); - - glob->iptr=glob->unpacked; - glob->val=decodetable[0][(*(glob->iptr++))<<1]; + for (i=0; i < 10; i++) { + res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12; - dptr=decodetable+1; - lptr=glob->swapbuf1; - while (lptrswapbuf1+10) - *(lptr++)=(*(dptr++))[(*(glob->iptr++))<<1]; + if (res == 0) + return 0; - do_voice(glob->swapbuf1,glob->swapbuf2); + while (res <= 0x3fff) { + b++; + res <<= 2; + } + } - a=t_sqrt(glob->val*glob->oldval)>>12; + return t_sqrt(res) >> b; +} - for (c=0;cswapbuf1,glob->swapbuf2,3,glob->val); +static void do_output_subblock(RA144Context *ractx, const uint16_t *lpc_coefs, + int gval, GetBitContext *gb) +{ + uint16_t buffer_a[40]; + uint16_t *block; + int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none + int gain = get_bits(gb, 8); + int cb1_idx = get_bits(gb, 7); + int cb2_idx = get_bits(gb, 7); + int m[3]; + + if (cba_idx) { + cba_idx += BLOCKSIZE/2 - 1; + copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx); + m[0] = (irms(buffer_a) * gval) >> 12; } else { - if (c*2==(NBLOCKS-2)) { - if (glob->oldvalval) { - dec2(glob,glob->swapbuf1,glob->swapbuf2,3,a,glob->swapbuf2alt,c); - } else { - dec2(glob,glob->swapbuf1alt,glob->swapbuf2alt,3,a,glob->swapbuf2,c); - } - } else { - if (c*2<(NBLOCKS-2)) { - dec2(glob,glob->swapbuf1alt,glob->swapbuf2alt,3,glob->oldval,glob->swapbuf2,c); - } else { - dec2(glob,glob->swapbuf1,glob->swapbuf2,3,glob->val,glob->swapbuf2alt,c); - } - } + m[0] = 0; } - } - /* do output */ - for (b=0,c=0;c<4;c++) { - glob->gval=glob->gbuf1[c*2]; - glob->gsp=glob->gbuf2+b; - do_output_subblock(glob,glob->resetflag); - glob->resetflag=0; + m[1] = (cb1_base[cb1_idx] * gval) >> 8; + m[2] = (cb2_base[cb2_idx] * gval) >> 8; - shptr=glob->output_buffer; - while (shptroutput_buffer+BLOCKSIZE) { - s=*(shptr++)<<2; - *((int16_t *)data)=s; - if (s>32767) *((int16_t *)data)=32767; - if (s<-32767) *((int16_t *)data)=-32768; - data = (int16_t *)data + 1; - } - b+=30; - } + memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE, + (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb)); - glob->oldval=glob->val; - temp=glob->swapbuf1alt; - glob->swapbuf1alt=glob->swapbuf1; - glob->swapbuf1=temp; - temp=glob->swapbuf2alt; - glob->swapbuf2alt=glob->swapbuf2; - glob->swapbuf2=temp; - *data_size=data-datao; - return 20; + block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE; + + add_wav(block, gain, cba_idx, m, buffer_a, + cb1_vects[cb1_idx], cb2_vects[cb2_idx]); + + memcpy(ractx->curr_sblock, ractx->curr_sblock + 40, + 10*sizeof(*ractx->curr_sblock)); + + if (ff_acelp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs, + block, BLOCKSIZE, 10, 1, 0xfff)) + memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock)); } +static void int_to_int16(int16_t *out, const int *inp) +{ + int i; + + for (i=0; i < 30; i++) + *(out++) = *(inp++); +} + +/** + * Evaluate the reflection coefficients from the filter coefficients. + * Does the inverse of the eval_coefs() function. + * + * @return 1 if one of the reflection coefficients is of magnitude greater than + * 4095, 0 if not. + */ +static int eval_refl(int *refl, const int16_t *coefs, RA144Context *ractx) +{ + int b, i, j; + int buffer1[10]; + int buffer2[10]; + int *bp1 = buffer1; + int *bp2 = buffer2; + + for (i=0; i < 10; i++) + buffer2[i] = coefs[i]; + + refl[9] = bp2[9]; + + if ((unsigned) bp2[9] + 0x1000 > 0x1fff) { + av_log(ractx, AV_LOG_ERROR, "Overflow. Broken sample?\n"); + return 1; + } + + for (i=8; i >= 0; i--) { + b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12); + + if (!b) + b = -2; + + for (j=0; j <= i; j++) + bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12; + + refl[i] = bp1[i]; + + if ((unsigned) bp1[i] + 0x1000 > 0x1fff) + return 1; + + FFSWAP(int *, bp1, bp2); + } + return 0; +} + +static int interp(RA144Context *ractx, int16_t *out, int block_num, + int copyold, int energy) +{ + int work[10]; + int a = block_num + 1; + int b = NBLOCKS - a; + int i; + + // Interpolate block coefficients from the this frame forth block and + // last frame forth block + for (i=0; i<30; i++) + out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2; + + if (eval_refl(work, out, ractx)) { + // The interpolated coefficients are unstable, copy either new or old + // coefficients + int_to_int16(out, ractx->lpc_coef[copyold]); + return rescale_rms(ractx->lpc_refl_rms[copyold], energy); + } else { + return rescale_rms(rms(work), energy); + } +} + +/** Uncompress one block (20 bytes -> 160*2 bytes) */ +static int ra144_decode_frame(AVCodecContext * avctx, void *vdata, + int *data_size, const uint8_t *buf, int buf_size) +{ + static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2}; + unsigned int refl_rms[4]; // RMS of the reflection coefficients + uint16_t block_coefs[4][30]; // LPC coefficients of each sub-block + unsigned int lpc_refl[10]; // LPC reflection coefficients of the frame + int i, j; + int16_t *data = vdata; + unsigned int energy; + + RA144Context *ractx = avctx->priv_data; + GetBitContext gb; + + if (*data_size < 2*160) + return -1; + + if(buf_size < 20) { + av_log(avctx, AV_LOG_ERROR, + "Frame too small (%d bytes). Truncated file?\n", buf_size); + *data_size = 0; + return buf_size; + } + init_get_bits(&gb, buf, 20 * 8); + + for (i=0; i<10; i++) + lpc_refl[i] = lpc_refl_cb[i][get_bits(&gb, sizes[i])]; + + eval_coefs(ractx->lpc_coef[0], lpc_refl); + ractx->lpc_refl_rms[0] = rms(lpc_refl); + + energy = energy_tab[get_bits(&gb, 5)]; + + refl_rms[0] = interp(ractx, block_coefs[0], 0, 1, ractx->old_energy); + refl_rms[1] = interp(ractx, block_coefs[1], 1, energy <= ractx->old_energy, + t_sqrt(energy*ractx->old_energy) >> 12); + refl_rms[2] = interp(ractx, block_coefs[2], 2, 0, energy); + refl_rms[3] = rescale_rms(ractx->lpc_refl_rms[0], energy); + + int_to_int16(block_coefs[3], ractx->lpc_coef[0]); + + for (i=0; i < 4; i++) { + do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb); + + for (j=0; j < BLOCKSIZE; j++) + *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2); + } + + ractx->old_energy = energy; + ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0]; + + FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]); + + *data_size = 2*160; + return 20; +} AVCodec ra_144_decoder = { "real_144", CODEC_TYPE_AUDIO, CODEC_ID_RA_144, - sizeof(Real144_internal), + sizeof(RA144Context), ra144_decode_init, NULL, NULL, ra144_decode_frame, + .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"), }; diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ra144.h b/src/add-ons/media/plugins/avcodec/libavcodec/ra144.h index f95a8bab31..11e0c25f86 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/ra144.h +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ra144.h @@ -2,2425 +2,1554 @@ * Real Audio 1.0 (14.4K) * Copyright (c) 2003 the ffmpeg project * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef RA144TABLES_H -#define RA144TABLES_H +#ifndef FFMPEG_RA144_H +#define FFMPEG_RA144_H + +#include /* 14.4 data tables */ -static const unsigned short sqrt_table[4096]={ -0x0000,0x0400,0x05a8,0x06ed,0x0800,0x08f1,0x09cc,0x0a95, -0x0b50,0x0c00,0x0ca6,0x0d44,0x0ddb,0x0e6c,0x0ef7,0x0f7d, -0x1000,0x107e,0x10f8,0x116f,0x11e3,0x1254,0x12c2,0x132e, -0x1398,0x1400,0x1465,0x14c8,0x152a,0x158a,0x15e8,0x1645, -0x16a0,0x16fa,0x1752,0x17aa,0x1800,0x1854,0x18a8,0x18fa, -0x194c,0x199c,0x19ec,0x1a3a,0x1a88,0x1ad5,0x1b21,0x1b6c, -0x1bb6,0x1c00,0x1c48,0x1c90,0x1cd8,0x1d1e,0x1d64,0x1daa, -0x1dee,0x1e33,0x1e76,0x1eb9,0x1efb,0x1f3d,0x1f7e,0x1fbf, -0x2000,0x203f,0x207f,0x20bd,0x20fc,0x2139,0x2177,0x21b4, -0x21f0,0x222d,0x2268,0x22a4,0x22df,0x2319,0x2353,0x238d, -0x23c6,0x2400,0x2438,0x2471,0x24a9,0x24e0,0x2518,0x254f, -0x2585,0x25bc,0x25f2,0x2628,0x265d,0x2693,0x26c8,0x26fc, -0x2731,0x2765,0x2799,0x27cc,0x2800,0x2833,0x2865,0x2898, -0x28ca,0x28fc,0x292e,0x2960,0x2991,0x29c2,0x29f3,0x2a24, -0x2a54,0x2a85,0x2ab5,0x2ae5,0x2b14,0x2b44,0x2b73,0x2ba2, -0x2bd1,0x2c00,0x2c2e,0x2c5c,0x2c8a,0x2cb8,0x2ce6,0x2d13, -0x2d41,0x2d6e,0x2d9b,0x2dc8,0x2df4,0x2e21,0x2e4d,0x2e79, -0x2ea5,0x2ed1,0x2efd,0x2f28,0x2f54,0x2f7f,0x2faa,0x2fd5, -0x3000,0x302a,0x3055,0x307f,0x30a9,0x30d3,0x30fd,0x3127, -0x3150,0x317a,0x31a3,0x31cc,0x31f5,0x321e,0x3247,0x3270, -0x3298,0x32c1,0x32e9,0x3311,0x3339,0x3361,0x3389,0x33b0, -0x33d8,0x3400,0x3427,0x344e,0x3475,0x349c,0x34c3,0x34ea, -0x3510,0x3537,0x355d,0x3584,0x35aa,0x35d0,0x35f6,0x361c, -0x3642,0x3667,0x368d,0x36b2,0x36d8,0x36fd,0x3722,0x3747, -0x376c,0x3791,0x37b6,0x37db,0x3800,0x3824,0x3848,0x386d, -0x3891,0x38b5,0x38d9,0x38fd,0x3921,0x3945,0x3969,0x398c, -0x39b0,0x39d3,0x39f7,0x3a1a,0x3a3d,0x3a60,0x3a83,0x3aa6, -0x3ac9,0x3aec,0x3b0f,0x3b31,0x3b54,0x3b76,0x3b99,0x3bbb, -0x3bdd,0x3c00,0x3c22,0x3c44,0x3c66,0x3c87,0x3ca9,0x3ccb, -0x3ced,0x3d0e,0x3d30,0x3d51,0x3d72,0x3d94,0x3db5,0x3dd6, -0x3df7,0x3e18,0x3e39,0x3e5a,0x3e7b,0x3e9c,0x3ebc,0x3edd, -0x3efd,0x3f1e,0x3f3e,0x3f5f,0x3f7f,0x3f9f,0x3fbf,0x3fdf, -0x4000,0x401f,0x403f,0x405f,0x407f,0x409f,0x40be,0x40de, -0x40fe,0x411d,0x413c,0x415c,0x417b,0x419a,0x41ba,0x41d9, -0x41f8,0x4217,0x4236,0x4255,0x4273,0x4292,0x42b1,0x42d0, -0x42ee,0x430d,0x432b,0x434a,0x4368,0x4387,0x43a5,0x43c3, -0x43e1,0x4400,0x441e,0x443c,0x445a,0x4478,0x4495,0x44b3, -0x44d1,0x44ef,0x450c,0x452a,0x4548,0x4565,0x4583,0x45a0, -0x45be,0x45db,0x45f8,0x4615,0x4633,0x4650,0x466d,0x468a, -0x46a7,0x46c4,0x46e1,0x46fe,0x471b,0x4737,0x4754,0x4771, -0x478d,0x47aa,0x47c7,0x47e3,0x4800,0x481c,0x4838,0x4855, -0x4871,0x488d,0x48a9,0x48c6,0x48e2,0x48fe,0x491a,0x4936, -0x4952,0x496e,0x498a,0x49a5,0x49c1,0x49dd,0x49f9,0x4a14, -0x4a30,0x4a4b,0x4a67,0x4a83,0x4a9e,0x4ab9,0x4ad5,0x4af0, -0x4b0b,0x4b27,0x4b42,0x4b5d,0x4b78,0x4b93,0x4bae,0x4bca, -0x4be5,0x4c00,0x4c1a,0x4c35,0x4c50,0x4c6b,0x4c86,0x4ca1, -0x4cbb,0x4cd6,0x4cf1,0x4d0b,0x4d26,0x4d40,0x4d5b,0x4d75, -0x4d90,0x4daa,0x4dc4,0x4ddf,0x4df9,0x4e13,0x4e2d,0x4e48, -0x4e62,0x4e7c,0x4e96,0x4eb0,0x4eca,0x4ee4,0x4efe,0x4f18, -0x4f32,0x4f4c,0x4f65,0x4f7f,0x4f99,0x4fb3,0x4fcc,0x4fe6, -0x5000,0x5019,0x5033,0x504c,0x5066,0x507f,0x5099,0x50b2, -0x50cb,0x50e5,0x50fe,0x5117,0x5130,0x514a,0x5163,0x517c, -0x5195,0x51ae,0x51c7,0x51e0,0x51f9,0x5212,0x522b,0x5244, -0x525d,0x5276,0x528f,0x52a7,0x52c0,0x52d9,0x52f2,0x530a, -0x5323,0x533c,0x5354,0x536d,0x5385,0x539e,0x53b6,0x53cf, -0x53e7,0x5400,0x5418,0x5430,0x5449,0x5461,0x5479,0x5491, -0x54a9,0x54c2,0x54da,0x54f2,0x550a,0x5522,0x553a,0x5552, -0x556a,0x5582,0x559a,0x55b2,0x55ca,0x55e2,0x55fa,0x5611, -0x5629,0x5641,0x5659,0x5670,0x5688,0x56a0,0x56b7,0x56cf, -0x56e6,0x56fe,0x5716,0x572d,0x5745,0x575c,0x5773,0x578b, -0x57a2,0x57ba,0x57d1,0x57e8,0x5800,0x5817,0x582e,0x5845, -0x585c,0x5874,0x588b,0x58a2,0x58b9,0x58d0,0x58e7,0x58fe, -0x5915,0x592c,0x5943,0x595a,0x5971,0x5988,0x599f,0x59b5, -0x59cc,0x59e3,0x59fa,0x5a11,0x5a27,0x5a3e,0x5a55,0x5a6b, -0x5a82,0x5a99,0x5aaf,0x5ac6,0x5adc,0x5af3,0x5b09,0x5b20, -0x5b36,0x5b4d,0x5b63,0x5b7a,0x5b90,0x5ba6,0x5bbd,0x5bd3, -0x5be9,0x5c00,0x5c16,0x5c2c,0x5c42,0x5c58,0x5c6f,0x5c85, -0x5c9b,0x5cb1,0x5cc7,0x5cdd,0x5cf3,0x5d09,0x5d1f,0x5d35, -0x5d4b,0x5d61,0x5d77,0x5d8d,0x5da3,0x5db9,0x5dce,0x5de4, -0x5dfa,0x5e10,0x5e26,0x5e3b,0x5e51,0x5e67,0x5e7c,0x5e92, -0x5ea8,0x5ebd,0x5ed3,0x5ee9,0x5efe,0x5f14,0x5f29,0x5f3f, -0x5f54,0x5f6a,0x5f7f,0x5f95,0x5faa,0x5fbf,0x5fd5,0x5fea, -0x6000,0x6015,0x602a,0x603f,0x6055,0x606a,0x607f,0x6094, -0x60aa,0x60bf,0x60d4,0x60e9,0x60fe,0x6113,0x6128,0x613d, -0x6152,0x6168,0x617d,0x6192,0x61a7,0x61bb,0x61d0,0x61e5, -0x61fa,0x620f,0x6224,0x6239,0x624e,0x6263,0x6277,0x628c, -0x62a1,0x62b6,0x62ca,0x62df,0x62f4,0x6309,0x631d,0x6332, -0x6347,0x635b,0x6370,0x6384,0x6399,0x63ad,0x63c2,0x63d7, -0x63eb,0x6400,0x6414,0x6428,0x643d,0x6451,0x6466,0x647a, -0x648e,0x64a3,0x64b7,0x64cb,0x64e0,0x64f4,0x6508,0x651d, -0x6531,0x6545,0x6559,0x656e,0x6582,0x6596,0x65aa,0x65be, -0x65d2,0x65e6,0x65fa,0x660f,0x6623,0x6637,0x664b,0x665f, -0x6673,0x6687,0x669b,0x66af,0x66c3,0x66d6,0x66ea,0x66fe, -0x6712,0x6726,0x673a,0x674e,0x6761,0x6775,0x6789,0x679d, -0x67b1,0x67c4,0x67d8,0x67ec,0x6800,0x6813,0x6827,0x683b, -0x684e,0x6862,0x6875,0x6889,0x689d,0x68b0,0x68c4,0x68d7, -0x68eb,0x68fe,0x6912,0x6925,0x6939,0x694c,0x6960,0x6973, -0x6986,0x699a,0x69ad,0x69c1,0x69d4,0x69e7,0x69fb,0x6a0e, -0x6a21,0x6a35,0x6a48,0x6a5b,0x6a6e,0x6a82,0x6a95,0x6aa8, -0x6abb,0x6ace,0x6ae2,0x6af5,0x6b08,0x6b1b,0x6b2e,0x6b41, -0x6b54,0x6b67,0x6b7a,0x6b8d,0x6ba1,0x6bb4,0x6bc7,0x6bda, -0x6bed,0x6c00,0x6c12,0x6c25,0x6c38,0x6c4b,0x6c5e,0x6c71, -0x6c84,0x6c97,0x6caa,0x6cbc,0x6ccf,0x6ce2,0x6cf5,0x6d08, -0x6d1a,0x6d2d,0x6d40,0x6d53,0x6d65,0x6d78,0x6d8b,0x6d9e, -0x6db0,0x6dc3,0x6dd6,0x6de8,0x6dfb,0x6e0d,0x6e20,0x6e33, -0x6e45,0x6e58,0x6e6a,0x6e7d,0x6e8f,0x6ea2,0x6eb4,0x6ec7, -0x6ed9,0x6eec,0x6efe,0x6f11,0x6f23,0x6f36,0x6f48,0x6f5a, -0x6f6d,0x6f7f,0x6f92,0x6fa4,0x6fb6,0x6fc9,0x6fdb,0x6fed, -0x7000,0x7012,0x7024,0x7036,0x7049,0x705b,0x706d,0x707f, -0x7091,0x70a4,0x70b6,0x70c8,0x70da,0x70ec,0x70fe,0x7110, -0x7123,0x7135,0x7147,0x7159,0x716b,0x717d,0x718f,0x71a1, -0x71b3,0x71c5,0x71d7,0x71e9,0x71fb,0x720d,0x721f,0x7231, -0x7243,0x7255,0x7267,0x7279,0x728a,0x729c,0x72ae,0x72c0, -0x72d2,0x72e4,0x72f5,0x7307,0x7319,0x732b,0x733d,0x734e, -0x7360,0x7372,0x7384,0x7395,0x73a7,0x73b9,0x73ca,0x73dc, -0x73ee,0x7400,0x7411,0x7423,0x7434,0x7446,0x7458,0x7469, -0x747b,0x748c,0x749e,0x74b0,0x74c1,0x74d3,0x74e4,0x74f6, -0x7507,0x7519,0x752a,0x753c,0x754d,0x755f,0x7570,0x7581, -0x7593,0x75a4,0x75b6,0x75c7,0x75d8,0x75ea,0x75fb,0x760d, -0x761e,0x762f,0x7641,0x7652,0x7663,0x7674,0x7686,0x7697, -0x76a8,0x76ba,0x76cb,0x76dc,0x76ed,0x76fe,0x7710,0x7721, -0x7732,0x7743,0x7754,0x7766,0x7777,0x7788,0x7799,0x77aa, -0x77bb,0x77cc,0x77dd,0x77ee,0x7800,0x7811,0x7822,0x7833, -0x7844,0x7855,0x7866,0x7877,0x7888,0x7899,0x78aa,0x78bb, -0x78cc,0x78dd,0x78ee,0x78fe,0x790f,0x7920,0x7931,0x7942, -0x7953,0x7964,0x7975,0x7986,0x7996,0x79a7,0x79b8,0x79c9, -0x79da,0x79eb,0x79fb,0x7a0c,0x7a1d,0x7a2e,0x7a3e,0x7a4f, -0x7a60,0x7a71,0x7a81,0x7a92,0x7aa3,0x7ab3,0x7ac4,0x7ad5, -0x7ae5,0x7af6,0x7b07,0x7b17,0x7b28,0x7b39,0x7b49,0x7b5a, -0x7b6b,0x7b7b,0x7b8c,0x7b9c,0x7bad,0x7bbd,0x7bce,0x7bde, -0x7bef,0x7c00,0x7c10,0x7c21,0x7c31,0x7c41,0x7c52,0x7c62, -0x7c73,0x7c83,0x7c94,0x7ca4,0x7cb5,0x7cc5,0x7cd5,0x7ce6, -0x7cf6,0x7d07,0x7d17,0x7d27,0x7d38,0x7d48,0x7d58,0x7d69, -0x7d79,0x7d89,0x7d9a,0x7daa,0x7dba,0x7dcb,0x7ddb,0x7deb, -0x7dfb,0x7e0c,0x7e1c,0x7e2c,0x7e3c,0x7e4d,0x7e5d,0x7e6d, -0x7e7d,0x7e8d,0x7e9e,0x7eae,0x7ebe,0x7ece,0x7ede,0x7eee, -0x7efe,0x7f0f,0x7f1f,0x7f2f,0x7f3f,0x7f4f,0x7f5f,0x7f6f, -0x7f7f,0x7f8f,0x7f9f,0x7faf,0x7fbf,0x7fcf,0x7fdf,0x7fef, -0x8000,0x800f,0x801f,0x802f,0x803f,0x804f,0x805f,0x806f, -0x807f,0x808f,0x809f,0x80af,0x80bf,0x80cf,0x80df,0x80ef, -0x80ff,0x810e,0x811e,0x812e,0x813e,0x814e,0x815e,0x816d, -0x817d,0x818d,0x819d,0x81ad,0x81bc,0x81cc,0x81dc,0x81ec, -0x81fc,0x820b,0x821b,0x822b,0x823b,0x824a,0x825a,0x826a, -0x8279,0x8289,0x8299,0x82a8,0x82b8,0x82c8,0x82d7,0x82e7, -0x82f7,0x8306,0x8316,0x8326,0x8335,0x8345,0x8354,0x8364, -0x8374,0x8383,0x8393,0x83a2,0x83b2,0x83c1,0x83d1,0x83e0, -0x83f0,0x8400,0x840f,0x841f,0x842e,0x843e,0x844d,0x845c, -0x846c,0x847b,0x848b,0x849a,0x84aa,0x84b9,0x84c9,0x84d8, -0x84e7,0x84f7,0x8506,0x8516,0x8525,0x8534,0x8544,0x8553, -0x8562,0x8572,0x8581,0x8591,0x85a0,0x85af,0x85be,0x85ce, -0x85dd,0x85ec,0x85fc,0x860b,0x861a,0x862a,0x8639,0x8648, -0x8657,0x8667,0x8676,0x8685,0x8694,0x86a3,0x86b3,0x86c2, -0x86d1,0x86e0,0x86ef,0x86ff,0x870e,0x871d,0x872c,0x873b, -0x874a,0x8759,0x8769,0x8778,0x8787,0x8796,0x87a5,0x87b4, -0x87c3,0x87d2,0x87e1,0x87f0,0x8800,0x880f,0x881e,0x882d, -0x883c,0x884b,0x885a,0x8869,0x8878,0x8887,0x8896,0x88a5, -0x88b4,0x88c3,0x88d2,0x88e1,0x88f0,0x88ff,0x890e,0x891c, -0x892b,0x893a,0x8949,0x8958,0x8967,0x8976,0x8985,0x8994, -0x89a3,0x89b2,0x89c0,0x89cf,0x89de,0x89ed,0x89fc,0x8a0b, -0x8a19,0x8a28,0x8a37,0x8a46,0x8a55,0x8a64,0x8a72,0x8a81, -0x8a90,0x8a9f,0x8aad,0x8abc,0x8acb,0x8ada,0x8ae8,0x8af7, -0x8b06,0x8b15,0x8b23,0x8b32,0x8b41,0x8b50,0x8b5e,0x8b6d, -0x8b7c,0x8b8a,0x8b99,0x8ba8,0x8bb6,0x8bc5,0x8bd4,0x8be2, -0x8bf1,0x8c00,0x8c0e,0x8c1d,0x8c2b,0x8c3a,0x8c49,0x8c57, -0x8c66,0x8c74,0x8c83,0x8c91,0x8ca0,0x8caf,0x8cbd,0x8ccc, -0x8cda,0x8ce9,0x8cf7,0x8d06,0x8d14,0x8d23,0x8d31,0x8d40, -0x8d4e,0x8d5d,0x8d6b,0x8d7a,0x8d88,0x8d97,0x8da5,0x8db4, -0x8dc2,0x8dd1,0x8ddf,0x8ded,0x8dfc,0x8e0a,0x8e19,0x8e27, -0x8e36,0x8e44,0x8e52,0x8e61,0x8e6f,0x8e7d,0x8e8c,0x8e9a, -0x8ea9,0x8eb7,0x8ec5,0x8ed4,0x8ee2,0x8ef0,0x8eff,0x8f0d, -0x8f1b,0x8f2a,0x8f38,0x8f46,0x8f54,0x8f63,0x8f71,0x8f7f, -0x8f8e,0x8f9c,0x8faa,0x8fb8,0x8fc7,0x8fd5,0x8fe3,0x8ff1, -0x9000,0x900e,0x901c,0x902a,0x9038,0x9047,0x9055,0x9063, -0x9071,0x907f,0x908d,0x909c,0x90aa,0x90b8,0x90c6,0x90d4, -0x90e2,0x90f0,0x90ff,0x910d,0x911b,0x9129,0x9137,0x9145, -0x9153,0x9161,0x916f,0x917e,0x918c,0x919a,0x91a8,0x91b6, -0x91c4,0x91d2,0x91e0,0x91ee,0x91fc,0x920a,0x9218,0x9226, -0x9234,0x9242,0x9250,0x925e,0x926c,0x927a,0x9288,0x9296, -0x92a4,0x92b2,0x92c0,0x92ce,0x92dc,0x92ea,0x92f8,0x9306, -0x9314,0x9321,0x932f,0x933d,0x934b,0x9359,0x9367,0x9375, -0x9383,0x9391,0x939f,0x93ac,0x93ba,0x93c8,0x93d6,0x93e4, -0x93f2,0x9400,0x940d,0x941b,0x9429,0x9437,0x9445,0x9452, -0x9460,0x946e,0x947c,0x948a,0x9497,0x94a5,0x94b3,0x94c1, -0x94cf,0x94dc,0x94ea,0x94f8,0x9506,0x9513,0x9521,0x952f, -0x953c,0x954a,0x9558,0x9566,0x9573,0x9581,0x958f,0x959c, -0x95aa,0x95b8,0x95c5,0x95d3,0x95e1,0x95ee,0x95fc,0x960a, -0x9617,0x9625,0x9633,0x9640,0x964e,0x965c,0x9669,0x9677, -0x9684,0x9692,0x96a0,0x96ad,0x96bb,0x96c8,0x96d6,0x96e4, -0x96f1,0x96ff,0x970c,0x971a,0x9727,0x9735,0x9742,0x9750, -0x975d,0x976b,0x9779,0x9786,0x9794,0x97a1,0x97af,0x97bc, -0x97ca,0x97d7,0x97e5,0x97f2,0x9800,0x980d,0x981a,0x9828, -0x9835,0x9843,0x9850,0x985e,0x986b,0x9879,0x9886,0x9893, -0x98a1,0x98ae,0x98bc,0x98c9,0x98d6,0x98e4,0x98f1,0x98ff, -0x990c,0x9919,0x9927,0x9934,0x9942,0x994f,0x995c,0x996a, -0x9977,0x9984,0x9992,0x999f,0x99ac,0x99ba,0x99c7,0x99d4, -0x99e2,0x99ef,0x99fc,0x9a09,0x9a17,0x9a24,0x9a31,0x9a3f, -0x9a4c,0x9a59,0x9a66,0x9a74,0x9a81,0x9a8e,0x9a9b,0x9aa9, -0x9ab6,0x9ac3,0x9ad0,0x9ade,0x9aeb,0x9af8,0x9b05,0x9b12, -0x9b20,0x9b2d,0x9b3a,0x9b47,0x9b54,0x9b62,0x9b6f,0x9b7c, -0x9b89,0x9b96,0x9ba3,0x9bb1,0x9bbe,0x9bcb,0x9bd8,0x9be5, -0x9bf2,0x9c00,0x9c0d,0x9c1a,0x9c27,0x9c34,0x9c41,0x9c4e, -0x9c5b,0x9c68,0x9c75,0x9c83,0x9c90,0x9c9d,0x9caa,0x9cb7, -0x9cc4,0x9cd1,0x9cde,0x9ceb,0x9cf8,0x9d05,0x9d12,0x9d1f, -0x9d2c,0x9d39,0x9d46,0x9d53,0x9d60,0x9d6d,0x9d7a,0x9d87, -0x9d94,0x9da1,0x9dae,0x9dbb,0x9dc8,0x9dd5,0x9de2,0x9def, -0x9dfc,0x9e09,0x9e16,0x9e23,0x9e30,0x9e3d,0x9e4a,0x9e57, -0x9e64,0x9e71,0x9e7e,0x9e8b,0x9e98,0x9ea4,0x9eb1,0x9ebe, -0x9ecb,0x9ed8,0x9ee5,0x9ef2,0x9eff,0x9f0c,0x9f18,0x9f25, -0x9f32,0x9f3f,0x9f4c,0x9f59,0x9f66,0x9f72,0x9f7f,0x9f8c, -0x9f99,0x9fa6,0x9fb3,0x9fbf,0x9fcc,0x9fd9,0x9fe6,0x9ff3, -0xa000,0xa00c,0xa019,0xa026,0xa033,0xa03f,0xa04c,0xa059, -0xa066,0xa073,0xa07f,0xa08c,0xa099,0xa0a6,0xa0b2,0xa0bf, -0xa0cc,0xa0d9,0xa0e5,0xa0f2,0xa0ff,0xa10b,0xa118,0xa125, -0xa132,0xa13e,0xa14b,0xa158,0xa164,0xa171,0xa17e,0xa18a, -0xa197,0xa1a4,0xa1b0,0xa1bd,0xa1ca,0xa1d6,0xa1e3,0xa1f0, -0xa1fc,0xa209,0xa216,0xa222,0xa22f,0xa23c,0xa248,0xa255, -0xa261,0xa26e,0xa27b,0xa287,0xa294,0xa2a0,0xa2ad,0xa2ba, -0xa2c6,0xa2d3,0xa2df,0xa2ec,0xa2f8,0xa305,0xa312,0xa31e, -0xa32b,0xa337,0xa344,0xa350,0xa35d,0xa369,0xa376,0xa382, -0xa38f,0xa39b,0xa3a8,0xa3b5,0xa3c1,0xa3ce,0xa3da,0xa3e7, -0xa3f3,0xa400,0xa40c,0xa418,0xa425,0xa431,0xa43e,0xa44a, -0xa457,0xa463,0xa470,0xa47c,0xa489,0xa495,0xa4a2,0xa4ae, -0xa4ba,0xa4c7,0xa4d3,0xa4e0,0xa4ec,0xa4f9,0xa505,0xa511, -0xa51e,0xa52a,0xa537,0xa543,0xa54f,0xa55c,0xa568,0xa574, -0xa581,0xa58d,0xa59a,0xa5a6,0xa5b2,0xa5bf,0xa5cb,0xa5d7, -0xa5e4,0xa5f0,0xa5fc,0xa609,0xa615,0xa621,0xa62e,0xa63a, -0xa646,0xa653,0xa65f,0xa66b,0xa678,0xa684,0xa690,0xa69d, -0xa6a9,0xa6b5,0xa6c1,0xa6ce,0xa6da,0xa6e6,0xa6f2,0xa6ff, -0xa70b,0xa717,0xa724,0xa730,0xa73c,0xa748,0xa754,0xa761, -0xa76d,0xa779,0xa785,0xa792,0xa79e,0xa7aa,0xa7b6,0xa7c3, -0xa7cf,0xa7db,0xa7e7,0xa7f3,0xa800,0xa80c,0xa818,0xa824, -0xa830,0xa83c,0xa849,0xa855,0xa861,0xa86d,0xa879,0xa885, -0xa892,0xa89e,0xa8aa,0xa8b6,0xa8c2,0xa8ce,0xa8da,0xa8e6, -0xa8f3,0xa8ff,0xa90b,0xa917,0xa923,0xa92f,0xa93b,0xa947, -0xa953,0xa960,0xa96c,0xa978,0xa984,0xa990,0xa99c,0xa9a8, -0xa9b4,0xa9c0,0xa9cc,0xa9d8,0xa9e4,0xa9f0,0xa9fc,0xaa09, -0xaa15,0xaa21,0xaa2d,0xaa39,0xaa45,0xaa51,0xaa5d,0xaa69, -0xaa75,0xaa81,0xaa8d,0xaa99,0xaaa5,0xaab1,0xaabd,0xaac9, -0xaad5,0xaae1,0xaaed,0xaaf9,0xab05,0xab11,0xab1d,0xab29, -0xab35,0xab41,0xab4d,0xab58,0xab64,0xab70,0xab7c,0xab88, -0xab94,0xaba0,0xabac,0xabb8,0xabc4,0xabd0,0xabdc,0xabe8, -0xabf4,0xac00,0xac0b,0xac17,0xac23,0xac2f,0xac3b,0xac47, -0xac53,0xac5f,0xac6b,0xac76,0xac82,0xac8e,0xac9a,0xaca6, -0xacb2,0xacbe,0xacc9,0xacd5,0xace1,0xaced,0xacf9,0xad05, -0xad11,0xad1c,0xad28,0xad34,0xad40,0xad4c,0xad57,0xad63, -0xad6f,0xad7b,0xad87,0xad92,0xad9e,0xadaa,0xadb6,0xadc2, -0xadcd,0xadd9,0xade5,0xadf1,0xadfd,0xae08,0xae14,0xae20, -0xae2c,0xae37,0xae43,0xae4f,0xae5b,0xae66,0xae72,0xae7e, -0xae8a,0xae95,0xaea1,0xaead,0xaeb8,0xaec4,0xaed0,0xaedc, -0xaee7,0xaef3,0xaeff,0xaf0a,0xaf16,0xaf22,0xaf2e,0xaf39, -0xaf45,0xaf51,0xaf5c,0xaf68,0xaf74,0xaf7f,0xaf8b,0xaf97, -0xafa2,0xafae,0xafba,0xafc5,0xafd1,0xafdd,0xafe8,0xaff4, -0xb000,0xb00b,0xb017,0xb022,0xb02e,0xb03a,0xb045,0xb051, -0xb05c,0xb068,0xb074,0xb07f,0xb08b,0xb097,0xb0a2,0xb0ae, -0xb0b9,0xb0c5,0xb0d0,0xb0dc,0xb0e8,0xb0f3,0xb0ff,0xb10a, -0xb116,0xb121,0xb12d,0xb139,0xb144,0xb150,0xb15b,0xb167, -0xb172,0xb17e,0xb189,0xb195,0xb1a0,0xb1ac,0xb1b8,0xb1c3, -0xb1cf,0xb1da,0xb1e6,0xb1f1,0xb1fd,0xb208,0xb214,0xb21f, -0xb22b,0xb236,0xb242,0xb24d,0xb259,0xb264,0xb270,0xb27b, -0xb286,0xb292,0xb29d,0xb2a9,0xb2b4,0xb2c0,0xb2cb,0xb2d7, -0xb2e2,0xb2ee,0xb2f9,0xb305,0xb310,0xb31b,0xb327,0xb332, -0xb33e,0xb349,0xb355,0xb360,0xb36b,0xb377,0xb382,0xb38e, -0xb399,0xb3a4,0xb3b0,0xb3bb,0xb3c7,0xb3d2,0xb3dd,0xb3e9, -0xb3f4,0xb400,0xb40b,0xb416,0xb422,0xb42d,0xb438,0xb444, -0xb44f,0xb45a,0xb466,0xb471,0xb47c,0xb488,0xb493,0xb49f, -0xb4aa,0xb4b5,0xb4c1,0xb4cc,0xb4d7,0xb4e2,0xb4ee,0xb4f9, -0xb504,0xb510,0xb51b,0xb526,0xb532,0xb53d,0xb548,0xb554, -0xb55f,0xb56a,0xb575,0xb581,0xb58c,0xb597,0xb5a3,0xb5ae, -0xb5b9,0xb5c4,0xb5d0,0xb5db,0xb5e6,0xb5f1,0xb5fd,0xb608, -0xb613,0xb61e,0xb62a,0xb635,0xb640,0xb64b,0xb657,0xb662, -0xb66d,0xb678,0xb684,0xb68f,0xb69a,0xb6a5,0xb6b0,0xb6bc, -0xb6c7,0xb6d2,0xb6dd,0xb6e8,0xb6f4,0xb6ff,0xb70a,0xb715, -0xb720,0xb72c,0xb737,0xb742,0xb74d,0xb758,0xb763,0xb76f, -0xb77a,0xb785,0xb790,0xb79b,0xb7a6,0xb7b2,0xb7bd,0xb7c8, -0xb7d3,0xb7de,0xb7e9,0xb7f4,0xb800,0xb80b,0xb816,0xb821, -0xb82c,0xb837,0xb842,0xb84d,0xb858,0xb864,0xb86f,0xb87a, -0xb885,0xb890,0xb89b,0xb8a6,0xb8b1,0xb8bc,0xb8c7,0xb8d3, -0xb8de,0xb8e9,0xb8f4,0xb8ff,0xb90a,0xb915,0xb920,0xb92b, -0xb936,0xb941,0xb94c,0xb957,0xb962,0xb96d,0xb978,0xb983, -0xb98f,0xb99a,0xb9a5,0xb9b0,0xb9bb,0xb9c6,0xb9d1,0xb9dc, -0xb9e7,0xb9f2,0xb9fd,0xba08,0xba13,0xba1e,0xba29,0xba34, -0xba3f,0xba4a,0xba55,0xba60,0xba6b,0xba76,0xba81,0xba8c, -0xba97,0xbaa2,0xbaad,0xbab8,0xbac3,0xbace,0xbad8,0xbae3, -0xbaee,0xbaf9,0xbb04,0xbb0f,0xbb1a,0xbb25,0xbb30,0xbb3b, -0xbb46,0xbb51,0xbb5c,0xbb67,0xbb72,0xbb7d,0xbb88,0xbb92, -0xbb9d,0xbba8,0xbbb3,0xbbbe,0xbbc9,0xbbd4,0xbbdf,0xbbea, -0xbbf5,0xbc00,0xbc0a,0xbc15,0xbc20,0xbc2b,0xbc36,0xbc41, -0xbc4c,0xbc57,0xbc61,0xbc6c,0xbc77,0xbc82,0xbc8d,0xbc98, -0xbca3,0xbcad,0xbcb8,0xbcc3,0xbcce,0xbcd9,0xbce4,0xbcef, -0xbcf9,0xbd04,0xbd0f,0xbd1a,0xbd25,0xbd30,0xbd3a,0xbd45, -0xbd50,0xbd5b,0xbd66,0xbd70,0xbd7b,0xbd86,0xbd91,0xbd9c, -0xbda6,0xbdb1,0xbdbc,0xbdc7,0xbdd2,0xbddc,0xbde7,0xbdf2, -0xbdfd,0xbe08,0xbe12,0xbe1d,0xbe28,0xbe33,0xbe3d,0xbe48, -0xbe53,0xbe5e,0xbe68,0xbe73,0xbe7e,0xbe89,0xbe93,0xbe9e, -0xbea9,0xbeb4,0xbebe,0xbec9,0xbed4,0xbedf,0xbee9,0xbef4, -0xbeff,0xbf0a,0xbf14,0xbf1f,0xbf2a,0xbf34,0xbf3f,0xbf4a, -0xbf55,0xbf5f,0xbf6a,0xbf75,0xbf7f,0xbf8a,0xbf95,0xbf9f, -0xbfaa,0xbfb5,0xbfbf,0xbfca,0xbfd5,0xbfdf,0xbfea,0xbff5, -0xc000,0xc00a,0xc015,0xc01f,0xc02a,0xc035,0xc03f,0xc04a, -0xc055,0xc05f,0xc06a,0xc075,0xc07f,0xc08a,0xc095,0xc09f, -0xc0aa,0xc0b5,0xc0bf,0xc0ca,0xc0d4,0xc0df,0xc0ea,0xc0f4, -0xc0ff,0xc109,0xc114,0xc11f,0xc129,0xc134,0xc13e,0xc149, -0xc154,0xc15e,0xc169,0xc173,0xc17e,0xc189,0xc193,0xc19e, -0xc1a8,0xc1b3,0xc1bd,0xc1c8,0xc1d3,0xc1dd,0xc1e8,0xc1f2, -0xc1fd,0xc207,0xc212,0xc21d,0xc227,0xc232,0xc23c,0xc247, -0xc251,0xc25c,0xc266,0xc271,0xc27b,0xc286,0xc290,0xc29b, -0xc2a5,0xc2b0,0xc2bb,0xc2c5,0xc2d0,0xc2da,0xc2e5,0xc2ef, -0xc2fa,0xc304,0xc30f,0xc319,0xc324,0xc32e,0xc339,0xc343, -0xc34e,0xc358,0xc363,0xc36d,0xc377,0xc382,0xc38c,0xc397, -0xc3a1,0xc3ac,0xc3b6,0xc3c1,0xc3cb,0xc3d6,0xc3e0,0xc3eb, -0xc3f5,0xc400,0xc40a,0xc414,0xc41f,0xc429,0xc434,0xc43e, -0xc449,0xc453,0xc45d,0xc468,0xc472,0xc47d,0xc487,0xc492, -0xc49c,0xc4a6,0xc4b1,0xc4bb,0xc4c6,0xc4d0,0xc4da,0xc4e5, -0xc4ef,0xc4fa,0xc504,0xc50e,0xc519,0xc523,0xc52e,0xc538, -0xc542,0xc54d,0xc557,0xc562,0xc56c,0xc576,0xc581,0xc58b, -0xc595,0xc5a0,0xc5aa,0xc5b4,0xc5bf,0xc5c9,0xc5d4,0xc5de, -0xc5e8,0xc5f3,0xc5fd,0xc607,0xc612,0xc61c,0xc626,0xc631, -0xc63b,0xc645,0xc650,0xc65a,0xc664,0xc66f,0xc679,0xc683, -0xc68e,0xc698,0xc6a2,0xc6ac,0xc6b7,0xc6c1,0xc6cb,0xc6d6, -0xc6e0,0xc6ea,0xc6f5,0xc6ff,0xc709,0xc713,0xc71e,0xc728, -0xc732,0xc73d,0xc747,0xc751,0xc75b,0xc766,0xc770,0xc77a, -0xc784,0xc78f,0xc799,0xc7a3,0xc7ae,0xc7b8,0xc7c2,0xc7cc, -0xc7d7,0xc7e1,0xc7eb,0xc7f5,0xc800,0xc80a,0xc814,0xc81e, -0xc828,0xc833,0xc83d,0xc847,0xc851,0xc85c,0xc866,0xc870, -0xc87a,0xc884,0xc88f,0xc899,0xc8a3,0xc8ad,0xc8b7,0xc8c2, -0xc8cc,0xc8d6,0xc8e0,0xc8ea,0xc8f5,0xc8ff,0xc909,0xc913, -0xc91d,0xc928,0xc932,0xc93c,0xc946,0xc950,0xc95a,0xc965, -0xc96f,0xc979,0xc983,0xc98d,0xc997,0xc9a2,0xc9ac,0xc9b6, -0xc9c0,0xc9ca,0xc9d4,0xc9df,0xc9e9,0xc9f3,0xc9fd,0xca07, -0xca11,0xca1b,0xca26,0xca30,0xca3a,0xca44,0xca4e,0xca58, -0xca62,0xca6c,0xca76,0xca81,0xca8b,0xca95,0xca9f,0xcaa9, -0xcab3,0xcabd,0xcac7,0xcad1,0xcadc,0xcae6,0xcaf0,0xcafa, -0xcb04,0xcb0e,0xcb18,0xcb22,0xcb2c,0xcb36,0xcb40,0xcb4a, -0xcb55,0xcb5f,0xcb69,0xcb73,0xcb7d,0xcb87,0xcb91,0xcb9b, -0xcba5,0xcbaf,0xcbb9,0xcbc3,0xcbcd,0xcbd7,0xcbe1,0xcbeb, -0xcbf5,0xcc00,0xcc0a,0xcc14,0xcc1e,0xcc28,0xcc32,0xcc3c, -0xcc46,0xcc50,0xcc5a,0xcc64,0xcc6e,0xcc78,0xcc82,0xcc8c, -0xcc96,0xcca0,0xccaa,0xccb4,0xccbe,0xccc8,0xccd2,0xccdc, -0xcce6,0xccf0,0xccfa,0xcd04,0xcd0e,0xcd18,0xcd22,0xcd2c, -0xcd36,0xcd40,0xcd4a,0xcd54,0xcd5e,0xcd68,0xcd72,0xcd7c, -0xcd86,0xcd90,0xcd99,0xcda3,0xcdad,0xcdb7,0xcdc1,0xcdcb, -0xcdd5,0xcddf,0xcde9,0xcdf3,0xcdfd,0xce07,0xce11,0xce1b, -0xce25,0xce2f,0xce39,0xce43,0xce4c,0xce56,0xce60,0xce6a, -0xce74,0xce7e,0xce88,0xce92,0xce9c,0xcea6,0xceb0,0xceba, -0xcec3,0xcecd,0xced7,0xcee1,0xceeb,0xcef5,0xceff,0xcf09, -0xcf13,0xcf1d,0xcf26,0xcf30,0xcf3a,0xcf44,0xcf4e,0xcf58, -0xcf62,0xcf6c,0xcf75,0xcf7f,0xcf89,0xcf93,0xcf9d,0xcfa7, -0xcfb1,0xcfbb,0xcfc4,0xcfce,0xcfd8,0xcfe2,0xcfec,0xcff6, -0xd000,0xd009,0xd013,0xd01d,0xd027,0xd031,0xd03b,0xd044, -0xd04e,0xd058,0xd062,0xd06c,0xd076,0xd07f,0xd089,0xd093, -0xd09d,0xd0a7,0xd0b0,0xd0ba,0xd0c4,0xd0ce,0xd0d8,0xd0e1, -0xd0eb,0xd0f5,0xd0ff,0xd109,0xd112,0xd11c,0xd126,0xd130, -0xd13a,0xd143,0xd14d,0xd157,0xd161,0xd16b,0xd174,0xd17e, -0xd188,0xd192,0xd19b,0xd1a5,0xd1af,0xd1b9,0xd1c3,0xd1cc, -0xd1d6,0xd1e0,0xd1ea,0xd1f3,0xd1fd,0xd207,0xd211,0xd21a, -0xd224,0xd22e,0xd238,0xd241,0xd24b,0xd255,0xd25f,0xd268, -0xd272,0xd27c,0xd285,0xd28f,0xd299,0xd2a3,0xd2ac,0xd2b6, -0xd2c0,0xd2c9,0xd2d3,0xd2dd,0xd2e7,0xd2f0,0xd2fa,0xd304, -0xd30d,0xd317,0xd321,0xd32b,0xd334,0xd33e,0xd348,0xd351, -0xd35b,0xd365,0xd36e,0xd378,0xd382,0xd38b,0xd395,0xd39f, -0xd3a8,0xd3b2,0xd3bc,0xd3c6,0xd3cf,0xd3d9,0xd3e3,0xd3ec, -0xd3f6,0xd400,0xd409,0xd413,0xd41c,0xd426,0xd430,0xd439, -0xd443,0xd44d,0xd456,0xd460,0xd46a,0xd473,0xd47d,0xd487, -0xd490,0xd49a,0xd4a3,0xd4ad,0xd4b7,0xd4c0,0xd4ca,0xd4d4, -0xd4dd,0xd4e7,0xd4f0,0xd4fa,0xd504,0xd50d,0xd517,0xd521, -0xd52a,0xd534,0xd53d,0xd547,0xd551,0xd55a,0xd564,0xd56d, -0xd577,0xd581,0xd58a,0xd594,0xd59d,0xd5a7,0xd5b0,0xd5ba, -0xd5c4,0xd5cd,0xd5d7,0xd5e0,0xd5ea,0xd5f4,0xd5fd,0xd607, -0xd610,0xd61a,0xd623,0xd62d,0xd637,0xd640,0xd64a,0xd653, -0xd65d,0xd666,0xd670,0xd679,0xd683,0xd68c,0xd696,0xd6a0, -0xd6a9,0xd6b3,0xd6bc,0xd6c6,0xd6cf,0xd6d9,0xd6e2,0xd6ec, -0xd6f5,0xd6ff,0xd708,0xd712,0xd71b,0xd725,0xd72f,0xd738, -0xd742,0xd74b,0xd755,0xd75e,0xd768,0xd771,0xd77b,0xd784, -0xd78e,0xd797,0xd7a1,0xd7aa,0xd7b4,0xd7bd,0xd7c7,0xd7d0, -0xd7da,0xd7e3,0xd7ed,0xd7f6,0xd800,0xd809,0xd812,0xd81c, -0xd825,0xd82f,0xd838,0xd842,0xd84b,0xd855,0xd85e,0xd868, -0xd871,0xd87b,0xd884,0xd88e,0xd897,0xd8a0,0xd8aa,0xd8b3, -0xd8bd,0xd8c6,0xd8d0,0xd8d9,0xd8e3,0xd8ec,0xd8f5,0xd8ff, -0xd908,0xd912,0xd91b,0xd925,0xd92e,0xd938,0xd941,0xd94a, -0xd954,0xd95d,0xd967,0xd970,0xd979,0xd983,0xd98c,0xd996, -0xd99f,0xd9a9,0xd9b2,0xd9bb,0xd9c5,0xd9ce,0xd9d8,0xd9e1, -0xd9ea,0xd9f4,0xd9fd,0xda07,0xda10,0xda19,0xda23,0xda2c, -0xda35,0xda3f,0xda48,0xda52,0xda5b,0xda64,0xda6e,0xda77, -0xda81,0xda8a,0xda93,0xda9d,0xdaa6,0xdaaf,0xdab9,0xdac2, -0xdacb,0xdad5,0xdade,0xdae8,0xdaf1,0xdafa,0xdb04,0xdb0d, -0xdb16,0xdb20,0xdb29,0xdb32,0xdb3c,0xdb45,0xdb4e,0xdb58, -0xdb61,0xdb6a,0xdb74,0xdb7d,0xdb86,0xdb90,0xdb99,0xdba2, -0xdbac,0xdbb5,0xdbbe,0xdbc8,0xdbd1,0xdbda,0xdbe4,0xdbed, -0xdbf6,0xdc00,0xdc09,0xdc12,0xdc1b,0xdc25,0xdc2e,0xdc37, -0xdc41,0xdc4a,0xdc53,0xdc5d,0xdc66,0xdc6f,0xdc78,0xdc82, -0xdc8b,0xdc94,0xdc9e,0xdca7,0xdcb0,0xdcb9,0xdcc3,0xdccc, -0xdcd5,0xdcde,0xdce8,0xdcf1,0xdcfa,0xdd04,0xdd0d,0xdd16, -0xdd1f,0xdd29,0xdd32,0xdd3b,0xdd44,0xdd4e,0xdd57,0xdd60, -0xdd69,0xdd73,0xdd7c,0xdd85,0xdd8e,0xdd98,0xdda1,0xddaa, -0xddb3,0xddbd,0xddc6,0xddcf,0xddd8,0xdde2,0xddeb,0xddf4, -0xddfd,0xde06,0xde10,0xde19,0xde22,0xde2b,0xde35,0xde3e, -0xde47,0xde50,0xde59,0xde63,0xde6c,0xde75,0xde7e,0xde87, -0xde91,0xde9a,0xdea3,0xdeac,0xdeb5,0xdebf,0xdec8,0xded1, -0xdeda,0xdee3,0xdeed,0xdef6,0xdeff,0xdf08,0xdf11,0xdf1a, -0xdf24,0xdf2d,0xdf36,0xdf3f,0xdf48,0xdf52,0xdf5b,0xdf64, -0xdf6d,0xdf76,0xdf7f,0xdf89,0xdf92,0xdf9b,0xdfa4,0xdfad, -0xdfb6,0xdfbf,0xdfc9,0xdfd2,0xdfdb,0xdfe4,0xdfed,0xdff6, -0xe000,0xe009,0xe012,0xe01b,0xe024,0xe02d,0xe036,0xe03f, -0xe049,0xe052,0xe05b,0xe064,0xe06d,0xe076,0xe07f,0xe088, -0xe092,0xe09b,0xe0a4,0xe0ad,0xe0b6,0xe0bf,0xe0c8,0xe0d1, -0xe0db,0xe0e4,0xe0ed,0xe0f6,0xe0ff,0xe108,0xe111,0xe11a, -0xe123,0xe12c,0xe136,0xe13f,0xe148,0xe151,0xe15a,0xe163, -0xe16c,0xe175,0xe17e,0xe187,0xe190,0xe199,0xe1a3,0xe1ac, -0xe1b5,0xe1be,0xe1c7,0xe1d0,0xe1d9,0xe1e2,0xe1eb,0xe1f4, -0xe1fd,0xe206,0xe20f,0xe218,0xe221,0xe22b,0xe234,0xe23d, -0xe246,0xe24f,0xe258,0xe261,0xe26a,0xe273,0xe27c,0xe285, -0xe28e,0xe297,0xe2a0,0xe2a9,0xe2b2,0xe2bb,0xe2c4,0xe2cd, -0xe2d6,0xe2df,0xe2e8,0xe2f1,0xe2fa,0xe303,0xe30c,0xe315, -0xe31f,0xe328,0xe331,0xe33a,0xe343,0xe34c,0xe355,0xe35e, -0xe367,0xe370,0xe379,0xe382,0xe38b,0xe394,0xe39d,0xe3a6, -0xe3af,0xe3b8,0xe3c1,0xe3ca,0xe3d3,0xe3dc,0xe3e5,0xe3ee, -0xe3f7,0xe400,0xe408,0xe411,0xe41a,0xe423,0xe42c,0xe435, -0xe43e,0xe447,0xe450,0xe459,0xe462,0xe46b,0xe474,0xe47d, -0xe486,0xe48f,0xe498,0xe4a1,0xe4aa,0xe4b3,0xe4bc,0xe4c5, -0xe4ce,0xe4d7,0xe4e0,0xe4e9,0xe4f2,0xe4fa,0xe503,0xe50c, -0xe515,0xe51e,0xe527,0xe530,0xe539,0xe542,0xe54b,0xe554, -0xe55d,0xe566,0xe56f,0xe578,0xe580,0xe589,0xe592,0xe59b, -0xe5a4,0xe5ad,0xe5b6,0xe5bf,0xe5c8,0xe5d1,0xe5da,0xe5e3, -0xe5eb,0xe5f4,0xe5fd,0xe606,0xe60f,0xe618,0xe621,0xe62a, -0xe633,0xe63c,0xe644,0xe64d,0xe656,0xe65f,0xe668,0xe671, -0xe67a,0xe683,0xe68c,0xe694,0xe69d,0xe6a6,0xe6af,0xe6b8, -0xe6c1,0xe6ca,0xe6d3,0xe6db,0xe6e4,0xe6ed,0xe6f6,0xe6ff, -0xe708,0xe711,0xe71a,0xe722,0xe72b,0xe734,0xe73d,0xe746, -0xe74f,0xe758,0xe760,0xe769,0xe772,0xe77b,0xe784,0xe78d, -0xe795,0xe79e,0xe7a7,0xe7b0,0xe7b9,0xe7c2,0xe7cb,0xe7d3, -0xe7dc,0xe7e5,0xe7ee,0xe7f7,0xe800,0xe808,0xe811,0xe81a, -0xe823,0xe82c,0xe834,0xe83d,0xe846,0xe84f,0xe858,0xe861, -0xe869,0xe872,0xe87b,0xe884,0xe88d,0xe895,0xe89e,0xe8a7, -0xe8b0,0xe8b9,0xe8c1,0xe8ca,0xe8d3,0xe8dc,0xe8e5,0xe8ed, -0xe8f6,0xe8ff,0xe908,0xe911,0xe919,0xe922,0xe92b,0xe934, -0xe93c,0xe945,0xe94e,0xe957,0xe960,0xe968,0xe971,0xe97a, -0xe983,0xe98b,0xe994,0xe99d,0xe9a6,0xe9ae,0xe9b7,0xe9c0, -0xe9c9,0xe9d2,0xe9da,0xe9e3,0xe9ec,0xe9f5,0xe9fd,0xea06, -0xea0f,0xea18,0xea20,0xea29,0xea32,0xea3b,0xea43,0xea4c, -0xea55,0xea5e,0xea66,0xea6f,0xea78,0xea80,0xea89,0xea92, -0xea9b,0xeaa3,0xeaac,0xeab5,0xeabe,0xeac6,0xeacf,0xead8, -0xeae0,0xeae9,0xeaf2,0xeafb,0xeb03,0xeb0c,0xeb15,0xeb1d, -0xeb26,0xeb2f,0xeb38,0xeb40,0xeb49,0xeb52,0xeb5a,0xeb63, -0xeb6c,0xeb74,0xeb7d,0xeb86,0xeb8f,0xeb97,0xeba0,0xeba9, -0xebb1,0xebba,0xebc3,0xebcb,0xebd4,0xebdd,0xebe5,0xebee, -0xebf7,0xec00,0xec08,0xec11,0xec1a,0xec22,0xec2b,0xec34, -0xec3c,0xec45,0xec4e,0xec56,0xec5f,0xec68,0xec70,0xec79, -0xec82,0xec8a,0xec93,0xec9c,0xeca4,0xecad,0xecb5,0xecbe, -0xecc7,0xeccf,0xecd8,0xece1,0xece9,0xecf2,0xecfb,0xed03, -0xed0c,0xed15,0xed1d,0xed26,0xed2e,0xed37,0xed40,0xed48, -0xed51,0xed5a,0xed62,0xed6b,0xed74,0xed7c,0xed85,0xed8d, -0xed96,0xed9f,0xeda7,0xedb0,0xedb8,0xedc1,0xedca,0xedd2, -0xeddb,0xede4,0xedec,0xedf5,0xedfd,0xee06,0xee0f,0xee17, -0xee20,0xee28,0xee31,0xee3a,0xee42,0xee4b,0xee53,0xee5c, -0xee65,0xee6d,0xee76,0xee7e,0xee87,0xee8f,0xee98,0xeea1, -0xeea9,0xeeb2,0xeeba,0xeec3,0xeecc,0xeed4,0xeedd,0xeee5, -0xeeee,0xeef6,0xeeff,0xef08,0xef10,0xef19,0xef21,0xef2a, -0xef32,0xef3b,0xef43,0xef4c,0xef55,0xef5d,0xef66,0xef6e, -0xef77,0xef7f,0xef88,0xef90,0xef99,0xefa2,0xefaa,0xefb3, -0xefbb,0xefc4,0xefcc,0xefd5,0xefdd,0xefe6,0xefee,0xeff7, -0xf000,0xf008,0xf011,0xf019,0xf022,0xf02a,0xf033,0xf03b, -0xf044,0xf04c,0xf055,0xf05d,0xf066,0xf06e,0xf077,0xf07f, -0xf088,0xf090,0xf099,0xf0a1,0xf0aa,0xf0b2,0xf0bb,0xf0c3, -0xf0cc,0xf0d4,0xf0dd,0xf0e5,0xf0ee,0xf0f6,0xf0ff,0xf107, -0xf110,0xf118,0xf121,0xf129,0xf132,0xf13a,0xf143,0xf14b, -0xf154,0xf15c,0xf165,0xf16d,0xf176,0xf17e,0xf187,0xf18f, -0xf198,0xf1a0,0xf1a9,0xf1b1,0xf1ba,0xf1c2,0xf1cb,0xf1d3, -0xf1dc,0xf1e4,0xf1ec,0xf1f5,0xf1fd,0xf206,0xf20e,0xf217, -0xf21f,0xf228,0xf230,0xf239,0xf241,0xf24a,0xf252,0xf25a, -0xf263,0xf26b,0xf274,0xf27c,0xf285,0xf28d,0xf296,0xf29e, -0xf2a6,0xf2af,0xf2b7,0xf2c0,0xf2c8,0xf2d1,0xf2d9,0xf2e1, -0xf2ea,0xf2f2,0xf2fb,0xf303,0xf30c,0xf314,0xf31c,0xf325, -0xf32d,0xf336,0xf33e,0xf347,0xf34f,0xf357,0xf360,0xf368, -0xf371,0xf379,0xf381,0xf38a,0xf392,0xf39b,0xf3a3,0xf3ac, -0xf3b4,0xf3bc,0xf3c5,0xf3cd,0xf3d6,0xf3de,0xf3e6,0xf3ef, -0xf3f7,0xf400,0xf408,0xf410,0xf419,0xf421,0xf429,0xf432, -0xf43a,0xf443,0xf44b,0xf453,0xf45c,0xf464,0xf46d,0xf475, -0xf47d,0xf486,0xf48e,0xf496,0xf49f,0xf4a7,0xf4b0,0xf4b8, -0xf4c0,0xf4c9,0xf4d1,0xf4d9,0xf4e2,0xf4ea,0xf4f2,0xf4fb, -0xf503,0xf50c,0xf514,0xf51c,0xf525,0xf52d,0xf535,0xf53e, -0xf546,0xf54e,0xf557,0xf55f,0xf567,0xf570,0xf578,0xf580, -0xf589,0xf591,0xf599,0xf5a2,0xf5aa,0xf5b2,0xf5bb,0xf5c3, -0xf5cb,0xf5d4,0xf5dc,0xf5e4,0xf5ed,0xf5f5,0xf5fd,0xf606, -0xf60e,0xf616,0xf61f,0xf627,0xf62f,0xf638,0xf640,0xf648, -0xf651,0xf659,0xf661,0xf66a,0xf672,0xf67a,0xf682,0xf68b, -0xf693,0xf69b,0xf6a4,0xf6ac,0xf6b4,0xf6bd,0xf6c5,0xf6cd, -0xf6d6,0xf6de,0xf6e6,0xf6ee,0xf6f7,0xf6ff,0xf707,0xf710, -0xf718,0xf720,0xf728,0xf731,0xf739,0xf741,0xf74a,0xf752, -0xf75a,0xf762,0xf76b,0xf773,0xf77b,0xf784,0xf78c,0xf794, -0xf79c,0xf7a5,0xf7ad,0xf7b5,0xf7bd,0xf7c6,0xf7ce,0xf7d6, -0xf7de,0xf7e7,0xf7ef,0xf7f7,0xf800,0xf808,0xf810,0xf818, -0xf821,0xf829,0xf831,0xf839,0xf842,0xf84a,0xf852,0xf85a, -0xf863,0xf86b,0xf873,0xf87b,0xf883,0xf88c,0xf894,0xf89c, -0xf8a4,0xf8ad,0xf8b5,0xf8bd,0xf8c5,0xf8ce,0xf8d6,0xf8de, -0xf8e6,0xf8ef,0xf8f7,0xf8ff,0xf907,0xf90f,0xf918,0xf920, -0xf928,0xf930,0xf939,0xf941,0xf949,0xf951,0xf959,0xf962, -0xf96a,0xf972,0xf97a,0xf982,0xf98b,0xf993,0xf99b,0xf9a3, -0xf9ab,0xf9b4,0xf9bc,0xf9c4,0xf9cc,0xf9d4,0xf9dd,0xf9e5, -0xf9ed,0xf9f5,0xf9fd,0xfa06,0xfa0e,0xfa16,0xfa1e,0xfa26, -0xfa2f,0xfa37,0xfa3f,0xfa47,0xfa4f,0xfa58,0xfa60,0xfa68, -0xfa70,0xfa78,0xfa80,0xfa89,0xfa91,0xfa99,0xfaa1,0xfaa9, -0xfab1,0xfaba,0xfac2,0xfaca,0xfad2,0xfada,0xfae2,0xfaeb, -0xfaf3,0xfafb,0xfb03,0xfb0b,0xfb13,0xfb1c,0xfb24,0xfb2c, -0xfb34,0xfb3c,0xfb44,0xfb4c,0xfb55,0xfb5d,0xfb65,0xfb6d, -0xfb75,0xfb7d,0xfb85,0xfb8e,0xfb96,0xfb9e,0xfba6,0xfbae, -0xfbb6,0xfbbe,0xfbc7,0xfbcf,0xfbd7,0xfbdf,0xfbe7,0xfbef, -0xfbf7,0xfc00,0xfc08,0xfc10,0xfc18,0xfc20,0xfc28,0xfc30, -0xfc38,0xfc40,0xfc49,0xfc51,0xfc59,0xfc61,0xfc69,0xfc71, -0xfc79,0xfc81,0xfc8a,0xfc92,0xfc9a,0xfca2,0xfcaa,0xfcb2, -0xfcba,0xfcc2,0xfcca,0xfcd2,0xfcdb,0xfce3,0xfceb,0xfcf3, -0xfcfb,0xfd03,0xfd0b,0xfd13,0xfd1b,0xfd23,0xfd2c,0xfd34, -0xfd3c,0xfd44,0xfd4c,0xfd54,0xfd5c,0xfd64,0xfd6c,0xfd74, -0xfd7c,0xfd84,0xfd8d,0xfd95,0xfd9d,0xfda5,0xfdad,0xfdb5, -0xfdbd,0xfdc5,0xfdcd,0xfdd5,0xfddd,0xfde5,0xfded,0xfdf5, -0xfdfd,0xfe06,0xfe0e,0xfe16,0xfe1e,0xfe26,0xfe2e,0xfe36, -0xfe3e,0xfe46,0xfe4e,0xfe56,0xfe5e,0xfe66,0xfe6e,0xfe76, -0xfe7e,0xfe86,0xfe8e,0xfe97,0xfe9f,0xfea7,0xfeaf,0xfeb7, -0xfebf,0xfec7,0xfecf,0xfed7,0xfedf,0xfee7,0xfeef,0xfef7, -0xfeff,0xff07,0xff0f,0xff17,0xff1f,0xff27,0xff2f,0xff37, -0xff3f,0xff47,0xff4f,0xff57,0xff5f,0xff67,0xff6f,0xff77, -0xff7f,0xff87,0xff8f,0xff97,0xff9f,0xffa7,0xffaf,0xffb7, -0xffbf,0xffc7,0xffcf,0xffd7,0xffdf,0xffe7,0xffef,0xfff7}; +static const int16_t gain_val_tab[256][3] = { + {541, 956, 768}, {877, 581, 568}, {675, 787, 635}, {624, 732, 668}, + {623, 839, 697}, {640, 693, 991}, {925, 687, 608}, {552, 797, 572}, + {535, 832, 799}, {762, 605, 577}, {832, 561, 1003}, {590, 687, 588}, + {646, 901, 732}, {828, 689, 896}, {875, 624, 848}, {571, 942, 1022}, + {824, 736, 643}, {517, 765, 512}, {562, 908, 761}, {694, 913, 675}, + {704, 524, 672}, {721, 757, 558}, {884, 551, 633}, {558, 1007, 846}, + {932, 746, 777}, {566, 822, 926}, {613, 771, 611}, {737, 671, 1008}, + {651, 594, 579}, {801, 636, 564}, {852, 910, 719}, {998, 614, 575}, + {665, 935, 628}, {631, 596, 829}, {644, 926, 526}, {879, 988, 613}, + {941, 692, 693}, {565, 672, 576}, {547, 628, 740}, {639, 532, 537}, + {955, 604, 598}, {562, 580, 900}, {603, 899, 621}, {746, 533, 624}, + {729, 514, 735}, {853, 551, 692}, {949, 1018, 1004}, {544, 988, 735}, + {789, 782, 821}, {897, 516, 754}, {517, 702, 828}, {586, 818, 763}, + {907, 652, 592}, {528, 652, 642}, {531, 708, 780}, {666, 625, 727}, + {947, 727, 554}, {549, 657, 981}, {605, 920, 852}, {624, 619, 983}, + {605, 909, 547}, {690, 935, 516}, {700, 612, 853}, {767, 832, 574}, + {523, 898, 923}, {722, 958, 691}, {613, 771, 928}, {758, 757, 584}, + {512, 567, 577}, {615, 638, 698}, {574, 642, 589}, {993, 682, 878}, + {539, 890, 913}, {694, 928, 544}, {805, 600, 680}, {540, 951, 782}, + {816, 950, 590}, {955, 847, 811}, {547, 883, 556}, {652, 888, 604}, + {863, 585, 855}, {1023, 997, 516}, {932, 614, 640}, {627, 564, 573}, + {876, 900, 724}, {515, 857, 896}, {647, 953, 879}, {806, 854, 857}, + {545, 583, 631}, {657, 601, 751}, {740, 905, 795}, {841, 1016, 568}, + {747, 589, 983}, {878, 613, 526}, {864, 723, 779}, {534, 674, 774}, + {950, 649, 939}, {590, 703, 899}, {618, 527, 579}, {725, 647, 972}, + {641, 647, 707}, {730, 663, 644}, {807, 572, 578}, {879, 611, 821}, + {667, 729, 841}, {782, 585, 751}, {802, 733, 976}, {850, 871, 708}, + {870, 743, 704}, {941, 899, 585}, {943, 632, 875}, {1023, 732, 638}, + {778, 753, 655}, {843, 945, 945}, {942, 969, 572}, {1008, 559, 854}, + {868, 729, 787}, {970, 686, 547}, {535, 635, 674}, {560, 636, 828}, + {994, 592, 833}, {548, 621, 694}, {550, 801, 955}, {582, 522, 646}, + {606, 625, 818}, {623, 591, 874}, {669, 535, 1001}, {701, 938, 592}, + {925, 820, 738}, {735, 790, 544}, {575, 788, 674}, {655, 783, 528}, + {527, 513, 677}, {782, 852, 940}, {578, 910, 513}, {692, 882, 734}, + {586, 683, 715}, {739, 609, 717}, {778, 773, 697}, {922, 785, 813}, + {766, 651, 984}, {978, 596, 515}, {535, 757, 540}, {662, 687, 589}, + {554, 536, 979}, {723, 982, 690}, {936, 956, 527}, {590, 1002, 547}, + {517, 653, 825}, {832, 592, 974}, {512, 957, 903}, {631, 545, 906}, + {514, 720, 649}, {596, 679, 694}, {617, 740, 979}, {711, 685, 877}, + {655, 835, 848}, {754, 839, 698}, {871, 515, 769}, {955, 852, 573}, + {640, 859, 587}, {792, 863, 554}, {843, 708, 682}, {971, 768, 552}, + {891, 536, 690}, {1016, 560, 663}, {543, 870, 674}, {601, 999, 585}, + {945, 966, 889}, {529, 912, 777}, {574, 1020, 714}, {609, 922, 932}, + {598, 778, 929}, {651, 772, 744}, {691, 957, 722}, {729, 766, 984}, + {547, 519, 632}, {583, 532, 922}, {633, 995, 603}, {677, 571, 874}, + {602, 545, 666}, {627, 542, 875}, {672, 983, 598}, {692, 979, 730}, + {668, 634, 872}, {711, 706, 674}, {739, 977, 595}, {759, 905, 763}, + {756, 582, 763}, {748, 1013, 908}, {804, 937, 950}, {785, 543, 998}, + {999, 684, 942}, {626, 633, 996}, {626, 567, 835}, {739, 571, 973}, + {655, 769, 707}, {702, 952, 571}, {727, 712, 514}, {744, 686, 741}, + {731, 552, 714}, {824, 991, 726}, {795, 615, 544}, {870, 575, 824}, + {803, 832, 923}, {819, 839, 531}, {887, 786, 852}, {933, 764, 570}, + {716, 906, 654}, {784, 804, 563}, {774, 535, 876}, {807, 598, 649}, + {817, 759, 718}, {831, 993, 846}, {858, 567, 605}, {876, 1012, 651}, + {852, 548, 549}, {895, 1008, 871}, {892, 1000, 591}, {935, 516, 836}, + {931, 612, 776}, {968, 614, 816}, {524, 777, 719}, {549, 694, 786}, + {882, 754, 534}, {597, 837, 766}, {635, 954, 704}, {803, 550, 798}, + {699, 654, 798}, {924, 767, 738}, {970, 675, 608}, {632, 706, 684}, + {858, 767, 563}, {527, 765, 702}, {559, 924, 1003}, {618, 524, 611}, + {999, 942, 963}, {547, 857, 935}, {734, 926, 569}, {967, 746, 551}, + {834, 633, 881}, {941, 701, 727}, {945, 564, 636}, {512, 563, 793}, + {984, 556, 570}, {984, 540, 740}, {527, 764, 874}, {530, 664, 1014}, + {546, 515, 521}, {554, 934, 672}, {598, 945, 556}, {627, 531, 733}, + {576, 1020, 1014}, {623, 924, 594}, {678, 909, 603}, {814, 744, 543} +}; -static const signed short wavtable1[2304]={ -0x021d,0x03bc,0x0300,0xfc0d,0xfcd5,0xfd33,0xfdc5,0xfc83, -0xfdc0,0x036d,0x0245,0x0238,0xfc1b,0xfc31,0xfd7a,0xfd10, -0xfd6b,0xfd88,0x02a3,0x0313,0x027b,0xfdf9,0xfcba,0xfc2f, -0xfc86,0xfda3,0xfceb,0x0270,0x02dc,0x029c,0xfc83,0xfcd1, -0xfc44,0xfd06,0xfdf5,0xfc97,0x026f,0x0347,0x02b9,0xfc02, -0xfcaf,0xfdc5,0xfd09,0xfd50,0xfc4b,0x0280,0x02b5,0x03df, -0xfc9d,0xfd95,0xfd61,0xfce0,0xfc54,0xfc41,0x039d,0x02af, -0x0260,0xfd93,0xfddb,0xfccf,0xfcbb,0xfc64,0xfd2e,0x0228, -0x031d,0x023c,0xfca3,0xfd97,0xfc84,0xfdac,0xfd93,0xfd80, -0x0217,0x0340,0x031f,0xfc99,0xfcbc,0xfd77,0xfdd0,0xfd5c, -0xfd90,0x02fa,0x025d,0x0241,0xfc7a,0xfca5,0xfd56,0xfdc8, -0xfd34,0xfd76,0x0340,0x0231,0x03eb,0xfc6f,0xfcd1,0xfdda, -0xfd5c,0xfd98,0xfc2a,0x024e,0x02af,0x024c,0xfce7,0xfd59, -0xfcea,0xfd57,0xfc65,0xfd5b,0x0286,0x0385,0x02dc,0xfdc7, -0xfc64,0xfd7b,0xfcd0,0xfce6,0xfdf4,0x033c,0x02b1,0x0380, -0xfdd3,0xfd2b,0xfda5,0xfd62,0xfc61,0xfcf0,0x036b,0x0270, -0x0350,0xfdeb,0xfd2b,0xfdfc,0xfd14,0xfd08,0xfd42,0x023b, -0x03ae,0x03fe,0xfdf2,0xfdc6,0xfc53,0xfd82,0xfc9c,0xfc04, -0x0338,0x02e0,0x0283,0xfdaf,0xfdfb,0xfc63,0xfd69,0xfdee, -0xfcd8,0x0205,0x02fd,0x0200,0xfcfa,0xfdfa,0xfd01,0xfdf5, -0xfdc4,0xfdff,0x0232,0x038c,0x02f9,0xfc1b,0xfcbc,0xfd5d, -0xfd97,0xfcdb,0xfdca,0x02b6,0x0391,0x02a3,0xfd95,0xfc6c, -0xfda5,0xfc53,0xfcd1,0xfc85,0x02c0,0x020c,0x02a0,0xfd2e, -0xfc63,0xfd4f,0xfc37,0xfde6,0xfc8d,0x02d1,0x02f5,0x022e, -0xfdea,0xfcee,0xfcc6,0xfc06,0xfdcf,0xfda0,0x0374,0x0227, -0x0279,0xfc49,0xfdde,0xfd57,0xfd05,0xfdb0,0xfcf0,0x022e, -0x03ef,0x034e,0xfddb,0xfc65,0xfcc0,0xfda0,0xfc21,0xfd45, -0x03a4,0x02ea,0x0309,0xfd59,0xfd3d,0xfdca,0xfcaf,0xfde0, -0xfdb3,0x0236,0x0336,0x039e,0xfc72,0xfdff,0xfd18,0xfd8d, -0xfd6d,0xfcb9,0x0265,0x0303,0x0263,0xfc64,0xfd25,0xfc67, -0xfd23,0xfdbb,0xfd27,0x02e1,0x029f,0x03f0,0xfc39,0xfd2a, -0xfd6b,0xfded,0xfc90,0xfc1f,0x028b,0x0252,0x0243,0xfd0b, -0xfd1f,0xfd5f,0xfcc2,0xfd4d,0xfd71,0x0321,0x027c,0x0234, -0xfc1c,0xfc8d,0xfd42,0xfd8e,0xfce8,0xfd92,0x0354,0x038e, -0x02cf,0xfd0b,0xfda9,0xfd81,0xfd3b,0xfcd7,0xfc0c,0x03e6, -0x0266,0x023f,0xfda9,0xfdcf,0xfd4d,0xfc32,0xfd1f,0xfd79, -0x0299,0x03a7,0x0274,0xfda1,0xfcd0,0xfdc2,0xfca1,0xfcaa, -0xfcfd,0x0277,0x0254,0x033d,0xfd21,0xfc01,0xfc3a,0xfcf6, -0xfd4a,0xfd60,0x0284,0x039e,0x020e,0xfdb9,0xfd69,0xfc47, -0xfcd5,0xfcba,0xfde2,0x036f,0x03dc,0x0265,0xfcb0,0xfdf2, -0xfdb0,0xfd0d,0xfc47,0xfd22,0x03ad,0x02b4,0x02b5,0xfd83, -0xfd82,0xfc55,0xfc9e,0xfc57,0xfc54,0x0235,0x02a0,0x0240, -0xfd1a,0xfd83,0xfd0b,0xfd8f,0xfc8e,0xfd77,0x0223,0x0274, -0x02e4,0xfd61,0xfce9,0xfc73,0xfdb7,0xfcfd,0xfde9,0x027f, -0x0214,0x0219,0xfd67,0xfd61,0xfdd1,0xfce2,0xfdd6,0xfdcc, -0x03bb,0x025c,0x0256,0xfdcc,0xfdd2,0xfd3e,0xfc85,0xfd36, -0xfd45,0x0232,0x0244,0x0384,0xfd83,0xfc23,0xfc03,0xfd97, -0xfd6e,0xfce9,0x025b,0x0383,0x026d,0xfdee,0xfd23,0xfddf, -0xfd38,0xfceb,0xfd0d,0x02ea,0x0215,0x0270,0xfcf8,0xfc73, -0xfd76,0xfde1,0xfdd5,0xfd07,0x02d9,0x0202,0x02df,0xfd23, -0xfdf5,0xfd1d,0xfdf9,0xfdfb,0xfdf0,0x0355,0x0227,0x02b4, -0xfc69,0xfdbf,0xfd17,0xfd39,0xfdaf,0xfc58,0x03b5,0x03fa, -0x03ec,0xfc50,0xfc5d,0xfc19,0xfc90,0xfc0b,0xfc27,0x0220, -0x03dc,0x02df,0xfdf3,0xfcf3,0xfd3a,0xfdbe,0xfc46,0xfdf0, -0x0315,0x030e,0x0335,0xfda5,0xfd87,0xfd8c,0xfda0,0xfdaa, -0xfd6d,0x0381,0x0204,0x02f2,0xfc76,0xfd6b,0xfd07,0xfcee, -0xfdf7,0xfdd4,0x0205,0x02be,0x033c,0xfd3a,0xfcbb,0xfdc8, -0xfdf5,0xfc3d,0xfd62,0x024a,0x0332,0x02fb,0xfc57,0xfc96, -0xfd9f,0xfd60,0xfd72,0xfdc8,0x038b,0x028c,0x0250,0xfdbe, -0xfdf3,0xfd0e,0xfcdc,0xfcc2,0xfd52,0x0210,0x028c,0x0282, -0xfd5f,0xfd69,0xfcce,0xfdde,0xfcc2,0xfcda,0x0213,0x02c4, -0x030c,0xfd20,0xfcd5,0xfde4,0xfdd8,0xfc2b,0xfdad,0x029a, -0x0271,0x02d7,0xfcd3,0xfc4e,0xfc88,0xfc9d,0xfd05,0xfdfc, -0x03b3,0x02d7,0x022a,0xfd5f,0xfe00,0xfced,0xfc95,0xfdfb, -0xfda9,0x0225,0x0291,0x03d5,0xfd3f,0xfdf2,0xfd8a,0xfdb3, -0xfcb5,0xfc53,0x025d,0x0398,0x0354,0xfde0,0xfc10,0xfd02, -0xfd34,0xfcc5,0xfd3b,0x0270,0x026b,0x03d7,0xfd0d,0xfda9, -0xfdad,0xfd07,0xfd12,0xfc50,0x025d,0x038d,0x0223,0xfde7, -0xfd7a,0xfc35,0xfd35,0xfcd9,0xfdb8,0x02b2,0x03a7,0x0204, -0xfd89,0xfd47,0xfc50,0xfc5c,0xfca9,0xfdf7,0x02bc,0x0264, -0x0355,0xfcba,0xfdb8,0xfc03,0xfc41,0xfd24,0xfd39,0x02ff, -0x0340,0x023e,0xfd91,0xfca3,0xfc5b,0xfdc1,0xfd5c,0xfd7d, -0x020b,0x0382,0x039b,0xfc69,0xfc4f,0xfcd6,0xfde8,0xfceb, -0xfcbf,0x02d2,0x03be,0x02b3,0xfd5c,0xfc30,0xfd79,0xfc04, -0xfc80,0xfc59,0x0265,0x0303,0x03a0,0xfc64,0xfdd4,0xfd44, -0xfd22,0xfdbb,0xfcb6,0x02f6,0x02f5,0x0248,0xfdcf,0xfc9e, -0xfc9f,0xfdce,0xfdd0,0xfd65,0x0200,0x0237,0x0241,0xfdc9, -0xfdbf,0xfd81,0xfe00,0xfd8c,0xfd76,0x0267,0x027e,0x02ba, -0xfd02,0xfcb9,0xfc99,0xfd1d,0xfce5,0xfc46,0x023e,0x0282, -0x024d,0xfd30,0xfd6c,0xfd1d,0xfd7c,0xfcda,0xfd5b,0x03e1, -0x02aa,0x036e,0xfd6a,0xfcac,0xfdb7,0xfc3d,0xfc72,0xfd0f, -0x021b,0x037a,0x0391,0xfc55,0xfc3d,0xfce5,0xfdc7,0xfcf9, -0xfcd1,0x02b6,0x03a0,0x0220,0xfd8b,0xfd1e,0xfc25,0xfc53, -0xfcb6,0xfdbe,0x0325,0x0258,0x02a8,0xfc50,0xfde9,0xfce2, -0xfd87,0xfd40,0xfc77,0x021c,0x03b7,0x030e,0xfc14,0xfcc7, -0xfd29,0xfdc6,0xfc8c,0xfdab,0x0330,0x03b6,0x024e,0xfd0b, -0xfc53,0xfddc,0xfd76,0xfc8f,0xfd57,0x03bb,0x034f,0x032b, -0xfcea,0xfd0b,0xfd61,0xfc85,0xfd44,0xfd7d,0x0223,0x0373, -0x022c,0xfc4f,0xfdad,0xfc40,0xfdb6,0xfd06,0xfda3,0x028c, -0x0378,0x025c,0xfdcb,0xfcfe,0xfdf4,0xfcc1,0xfcfe,0xfd37, -0x035f,0x0249,0x0357,0xfc26,0xfd2f,0xfc2e,0xfd29,0xfd64, -0xfd35,0x03ff,0x03e5,0x0204,0xfc1b,0xfdfc,0xfc12,0xfc01, -0xfc34,0xfdf8,0x03a4,0x0266,0x0280,0xfdd0,0xfdb9,0xfcff, -0xfcae,0xfd1e,0xfce0,0x0273,0x0234,0x023d,0xfd4d,0xfd42, -0xfd89,0xfcff,0xfd93,0xfd7f,0x036c,0x0384,0x02d4,0xfcfe, -0xfd94,0xfd83,0xfd12,0xfce8,0xfe00,0x0203,0x0359,0x0380, -0xfca1,0xfc7a,0xfd12,0xfdf9,0xfd32,0xfcf0,0x0287,0x03b9, -0x036f,0xfda6,0xfdd5,0xfcce,0xfccf,0xfc88,0xfd0d,0x0326, -0x0356,0x0359,0xfd60,0xfd5d,0xfd35,0xfd86,0xfd38,0xfd32, -0x0221,0x0247,0x0277,0xfd93,0xfd60,0xfd31,0xfdbb,0xfd68, -0xfcf6,0x0291,0x0259,0x02ef,0xfcfc,0xfc3d,0xfc8e,0xfcb5, -0xfd3d,0xfdda,0x02e4,0x0389,0x031b,0xfd72,0xfdc1,0xfd40, -0xfde9,0xfcdf,0xfd96,0x0349,0x03f8,0x0238,0xfcbd,0xfc5a, -0xfdcc,0xfd4d,0xfc0f,0xfd89,0x02eb,0x024d,0x03d7,0xfca3, -0xfd32,0xfdca,0xfddf,0xfd59,0xfc4f,0x036e,0x0265,0x020e, -0xfdf2,0xfc7a,0xfd8a,0xfd0f,0xfd20,0xfde4,0x0360,0x02d3, -0x030b,0xfd9e,0xfd6f,0xfdda,0xfd27,0xfc02,0xfdb0,0x0216, -0x02a2,0x0306,0xfd41,0xfcd8,0xfc05,0xfdd3,0xfc89,0xfdb6, -0x03b6,0x0289,0x03ab,0xfda6,0xfc99,0xfdad,0xfc8f,0xfcc8, -0xfca3,0x024e,0x02bf,0x0383,0xfcd5,0xfdfa,0xfd96,0xfd58, -0xfc3a,0xfcea,0x026a,0x020f,0x0243,0xfd83,0xfd44,0xfdab, -0xfd16,0xfde1,0xfd6f,0x02d5,0x0287,0x03cc,0xfc6b,0xfd4f, -0xfd99,0xfdff,0xfcce,0xfc64,0x0281,0x0287,0x02c3,0xfcd6, -0xfc8b,0xfc83,0xfcdd,0xfccf,0xfc30,0x02da,0x0297,0x0284, -0xfc4e,0xfc68,0xfcbd,0xfdf7,0xfca4,0xfcd4,0x0327,0x023c, -0x0242,0xfc7a,0xfc70,0xfd7a,0xfd83,0xfd81,0xfd73,0x036f, -0x0263,0x0335,0xfdf4,0xfd3f,0xfc2d,0xfd0d,0xfd27,0xfd6e, -0x029b,0x02d9,0x0349,0xfc49,0xfddb,0xfda9,0xfc99,0xfdf9, -0xfd4c,0x030e,0x0249,0x02ef,0xfc81,0xfdc2,0xfca5,0xfdaa, -0xfd62,0xfdd9,0x0322,0x02dd,0x03d0,0xfdc2,0xfd03,0xfd45, -0xfd8c,0xfdf3,0xfc5d,0x0352,0x0367,0x02c4,0xfd2c,0xfdb4, -0xfda6,0xfd3e,0xfd1a,0xfc2d,0x0366,0x02e7,0x02c0,0xfd88, -0xfdaa,0xfc01,0xfd1d,0xfde4,0xfc36,0x03ad,0x0383,0x0249, -0xfcc5,0xfde6,0xfdfe,0xfc9e,0xfcea,0xfd63,0x03af,0x0278, -0x036b,0xfdba,0xfcda,0xfde3,0xfc9b,0xfcf3,0xfd13,0x03ff, -0x02dc,0x027e,0xfd25,0xfd83,0xfc70,0xfc02,0xfdf5,0xfce5, -0x030a,0x02f1,0x028f,0xfdc3,0xfc1b,0xfc3b,0xfdb0,0xfdd6, -0xfcb9,0x034b,0x03b1,0x03b1,0xfcf5,0xfcf5,0xfc97,0xfd4a, -0xfc97,0xfc97,0x03ae,0x03c9,0x023c,0xfc84,0xfdf1,0xfde2, -0xfc9d,0xfc6a,0xfd80,0x03f0,0x022f,0x0356,0xfdd9,0xfcb7, -0xfc5a,0xfc1f,0xfd9c,0xfd38,0x0364,0x02d9,0x0313,0xfd96, -0xfd64,0xfdd0,0xfd1f,0xfdf9,0xfda3,0x03ca,0x02ae,0x0223, -0xfd76,0xfdfa,0xfd23,0xfc69,0xfc69,0xfdb7,0x0217,0x027b, -0x02a2,0xfd68,0xfd3f,0xfcbc,0xfdd0,0xfcec,0xfc89,0x0230, -0x027c,0x033c,0xfd48,0xfc75,0xfdfe,0xfd9b,0xfcea,0xfd62, -0x03e2,0x0250,0x0341,0xfdc1,0xfcd7,0xfc3c,0xfc3a,0xfd52, -0xfd5b,0x0224,0x026d,0x02b6,0xfd67,0xfd19,0xfcb5,0xfdb5, -0xfd0d,0xfc52,0x0226,0x0321,0x03bb,0xfca3,0xfdff,0xfd14, -0xfdb1,0xfd8d,0xfc84,0x0246,0x020a,0x0286,0xfdae,0xfd21, -0xfd6d,0xfd69,0xfdeb,0xfcd1,0x025e,0x0271,0x0332,0xfd1d, -0xfc37,0xfc19,0xfd33,0xfd05,0xfd71,0x026f,0x024f,0x036a, -0xfd30,0xfded,0xfc0e,0xfd0a,0xfd55,0xfd16,0x029d,0x0217, -0x03e9,0xfd44,0xfd72,0xfdf5,0xfc94,0xfdd1,0xfc2d,0x02bd, -0x03aa,0x0250,0xfd7e,0xfcd6,0xfde2,0xfc40,0xfca4,0xfd54, -0x039d,0x0334,0x02e2,0xfd1b,0xfd65,0xfdb0,0xfcbd,0xfd6f, -0xfdeb,0x02df,0x0316,0x0220,0xfdc9,0xfcf3,0xfcb8,0xfdf1, -0xfd9e,0xfdbe,0x023f,0x0314,0x02a2,0xfc8a,0xfd0a,0xfdf9, -0xfd79,0xfda1,0xfc88,0x028f,0x030f,0x0210,0xfc15,0xfd5b, -0xfcd7,0xfcb8,0xfda9,0xfddf,0x020f,0x0201,0x02a5,0xfdef, -0xfd45,0xfd59,0xfde0,0xfdfe,0xfc7f,0x030e,0x0354,0x03ac, -0xfd75,0xfd32,0xfcf1,0xfdab,0xfd3b,0xfca1,0x0242,0x038e, -0x0201,0xfdfe,0xfdbb,0xfc6e,0xfd72,0xfcd7,0xfdfd,0x02b4, -0x0372,0x02de,0xfdac,0xfc1f,0xfd88,0xfc57,0xfd09,0xfdf2, -0x024a,0x02ab,0x02cb,0xfcf2,0xfcce,0xfc46,0xfd62,0xfc71, -0xfc19,0x02e3,0x0261,0x02cd,0xfc90,0xfdfa,0xfcaa,0xfdea, -0xfd2b,0xfc12,0x030a,0x0305,0x02b9,0xfdb4,0xfdee,0xfdf1, -0xfdb0,0xfdb8,0xfc49,0x039a,0x0311,0x032d,0xfd3d,0xfd24, -0xfd90,0xfcc2,0xfda6,0xfd7a,0x02fe,0x028b,0x03d8,0xfc32, -0xfd20,0xfd8e,0xfdc3,0xfcc5,0xfc4e,0x03d2,0x0254,0x0203, -0xfdc7,0xfc28,0xfda8,0xfc5a,0xfd4a,0xfdfa,0x0217,0x02f5, -0x021c,0xfce8,0xfdcb,0xfce1,0xfdd0,0xfdd1,0xfdc5,0x0296, -0x02af,0x024d,0xfc86,0xfd06,0xfce9,0xfca7,0xfc64,0xfd5a, -0x022a,0x0218,0x03d3,0xfdbc,0xfdee,0xfe00,0xfda7,0xfdcf, -0xfc58,0x02d3,0x03d6,0x02b2,0xfd4a,0xfc30,0xfd6a,0xfc02, -0xfc51,0xfc5c,0x03a8,0x03bc,0x020f,0xfc95,0xfc3b,0xfc26, -0xfca8,0xfc82,0xfde1,0x024e,0x03ea,0x0223,0xfdbf,0xfd89, -0xfde8,0xfd58,0xfc2c,0xfdb6,0x0205,0x028d,0x0339,0xfd6c, -0xfcbf,0xfdf2,0xfdf6,0xfcbe,0xfd68,0x0340,0x0250,0x03ce, -0xfc3c,0xfce8,0xfdcc,0xfd5b,0xfd52,0xfc60,0x0200,0x03bd, -0x0387,0xfc43,0xfc79,0xfcb4,0xfe00,0xfc82,0xfce4,0x0277, -0x0221,0x038a,0xfd60,0xfdd2,0xfc3b,0xfcf7,0xfdbb,0xfcde, -0x0202,0x02d0,0x0289,0xfd2d,0xfd74,0xfc6f,0xfdfc,0xfc0c, -0xfcc8,0x0254,0x02a7,0x02b6,0xfcea,0xfcd9,0xfc68,0xfd4b, -0xfc7c,0xfc54,0x0269,0x02e4,0x03d3,0xfc84,0xfdb2,0xfd3c, -0xfd19,0xfde9,0xfc58,0x02c7,0x02ad,0x036d,0xfc48,0xfd9f, -0xfdb5,0xfc25,0xfc6b,0xfd10,0x028f,0x0343,0x0350,0xfdea, -0xfde2,0xfd4d,0xfcba,0xfd57,0xfd42,0x02f2,0x0347,0x02ba, -0xfd96,0xfdfd,0xfdc3,0xfdd4,0xfd50,0xfc46,0x0367,0x0203, -0x0301,0xfc93,0xfd71,0xfcfa,0xfd1a,0xfdfa,0xfdbe,0x03bb, -0x0354,0x023d,0xfce5,0xfde9,0xfc45,0xfc84,0xfd3b,0xfd7d, -0x0280,0x035b,0x024b,0xfde7,0xfd21,0xfc26,0xfcdf,0xfd2f, -0xfd5e,0x0318,0x035f,0x022a,0xfd65,0xfca6,0xfc59,0xfd9c, -0xfd29,0xfda7,0x034b,0x02c4,0x02aa,0xfdb9,0xfdce,0xfc50, -0xfd4a,0xfc2d,0xfc72,0x03cb,0x0300,0x0228,0xfd28,0xfdf4, -0xfcc3,0xfc67,0xfdc0,0xfdac,0x037b,0x0218,0x02b2,0xfc59, -0xfda7,0xfd2c,0xfcf8,0xfdcd,0xfc5d,0x03f8,0x0230,0x0297, -0xfdd4,0xfd6d,0xfd29,0xfc0f,0xfd9a,0xfca4,0x021f,0x0366, -0x02a2,0xfc64,0xfd34,0xfdc3,0xfdbf,0xfd1d,0xfc87,0x0259, -0x03e7,0x0249,0xfdb6,0xfd52,0xfdc5,0xfd3f,0xfc31,0xfd64, -0x03b1,0x03c6,0x0379,0xfc84,0xfccb,0xfcb8,0xfc98,0xfc70, -0xfcfb,0x0211,0x0390,0x0309,0xfc51,0xfcdc,0xfd4c,0xfddd, -0xfcd4,0xfdb2,0x023e,0x03fc,0x02ca,0xfdc4,0xfcdf,0xfd39, -0xfd7d,0xfc08,0xfc1b,0x0261,0x039a,0x03a4,0xfddb,0xfdd5, -0xfcb8,0xfd2b,0xfcc1,0xfcb0,0x0256,0x030a,0x03a1,0xfc73, -0xfde1,0xfd3d,0xfd46,0xfdb0,0xfcb4,0x028b,0x0304,0x02e8, -0xfc2a,0xfc4d,0xfdcf,0xfcc5,0xfdba,0xfde3,0x02b3,0x03bd, -0x02d2,0xfd7a,0xfc30,0xfd5d,0xfc5a,0xfc82,0xfc04,0x02d9, -0x02fe,0x03d8,0xfdde,0xfd43,0xfd20,0xfdf8,0xfdc3,0xfc4f, -0x0223,0x0207,0x0278,0xfdd5,0xfd5d,0xfd80,0xfdb7,0xfdf2, -0xfcf4,0x0247,0x0214,0x039a,0xfda1,0xfdf3,0xfc40,0xfd68, -0xfdd6,0xfcc1,0x0279,0x03e3,0x025b,0xfd99,0xfd17,0xfdb6, -0xfcf1,0xfc38,0xfd3a,0x02a5,0x023b,0x036a,0xfd0b,0xfdbe, -0xfc2f,0xfc80,0xfd82,0xfd15,0x025a,0x0221,0x029a,0xfd7f, -0xfcf1,0xfd3b,0xfd3c,0xfdbc,0xfc9e,0x0273,0x021e,0x036b, -0xfd67,0xfde8,0xfc60,0xfcff,0xfdc1,0xfd14,0x02a0,0x03d7, -0x0256,0xfd7b,0xfcee,0xfdc1,0xfc8e,0xfc50,0xfd44,0x02b4, -0x03d3,0x02da,0xfd6a,0xfc24,0xfd46,0xfc57,0xfc57,0xfdf7, -0x029c,0x027a,0x0368,0xfcc5,0xfdc7,0xfde4,0xfc99,0xfcef, -0xfd1a,0x02c7,0x02c2,0x02a2,0xfc2a,0xfc57,0xfc5d,0xfc24, -0xfc31,0xfc87,0x02e3,0x03d1,0x0253,0xfd3e,0xfca4,0xfdc8, -0xfdea,0xfc5c,0xfd4d,0x02f7,0x0389,0x02fb,0xfd61,0xfdca, -0xfd5d,0xfdcd,0xfce1,0xfdc7,0x02f4,0x0246,0x02fb,0xfca4, -0xfdcd,0xfc9c,0xfdd2,0xfd69,0xfdc8,0x02ec,0x03f5,0x038c, -0xfd1b,0xfd68,0xfc7e,0xfddd,0xfc16,0xfcdb,0x0324,0x03a9, -0x03b6,0xfd20,0xfd16,0xfc9b,0xfd89,0xfca6,0xfc8e,0x0311, -0x021f,0x03e6,0xfcbf,0xfd02,0xfdef,0xfda6,0xfdc0,0xfc33, -0x03e7,0x02ac,0x03ae,0xfd64,0xfc68,0xfd8a,0xfc31,0xfc6d, -0xfc9c,0x0272,0x0279,0x03e4,0xfcfa,0xfd9f,0xfd98,0xfd03, -0xfcf1,0xfc36,0x0272,0x0237,0x0343,0xfd4b,0xfc03,0xfc63, -0xfd03,0xfd8c,0xfd57,0x02e3,0x023b,0x03cd,0xfcc7,0xfd42, -0xfde1,0xfdeb,0xfd83,0xfc63,0x028f,0x0301,0x02c3,0xfc28, -0xfc76,0xfded,0xfcb9,0xfdbf,0xfc2e,0x02be,0x03b8,0x023b, -0xfd73,0xfcef,0xfdec,0xfc3c,0xfc8a,0xfd82,0x02d7,0x02c8, -0x0202,0xfc0c,0xfd26,0xfd35,0xfdfc,0xfc22,0xfdfc,0x02e8, -0x02ae,0x02e5,0xfc1a,0xfde5,0xfc1e,0xfde3,0xfc67,0xfde8, -0x02db,0x0228,0x02ca,0xfceb,0xfc03,0xfcfc,0xfdf6,0xfdac, -0xfc1a,0x0338,0x03df,0x02d6,0xfce2,0xfdb7,0xfd41,0xfd68, -0xfc41,0xfdfd,0x031b,0x0267,0x0220,0xfc45,0xfcb4,0xfd73, -0xfd97,0xfd1e,0xfdbe,0x0366,0x023f,0x0338,0xfc2e,0xfd44, -0xfc62,0xfd1d,0xfd7a,0xfd68,0x0323,0x0340,0x039b,0xfd73, -0xfd2c,0xfd12,0xfd8a,0xfd5b,0xfcc0,0x0333,0x0347,0x0213, -0xfd61,0xfcaf,0xfc99,0xfd71,0xfd50,0xfdda,0x0377,0x0312, -0x0354,0xfd57,0xfd1e,0xfd72,0xfcff,0xfda5,0xfd3b,0x03a5, -0x02fc,0x023a,0xfd48,0xfdf9,0xfcad,0xfcae,0xfdc6,0xfd86, -0x02cc,0x038a,0x028e,0xfd86,0xfc6c,0xfdbd,0xfc15,0xfcde, -0xfcbb,0x0310,0x0324,0x0233,0xfd98,0xfca0,0xfc8b,0xfda7, -0xfd89,0xfd94,0x0306,0x0217,0x036c,0xfcd7,0xfd6a,0xfc6d, -0xfdb7,0xfdd1,0xfd13,0x0327,0x0256,0x0289,0xfc51,0xfc01, -0xfd0a,0xfd84,0xfd45,0xfcca,0x0331,0x02f7,0x02ce,0xfda2, -0xfdc3,0xfdeb,0xfd74,0xfdcd,0xfc10,0x033f,0x03e1,0x034e, -0xfcda,0xfd51,0xfccb,0xfd5d,0xfc3d,0xfd45,0x035a,0x0237, -0x025d,0xfc49,0xfc09,0xfd62,0xfd30,0xfd8c,0xfd34,0x036c, -0x03f4,0x028b,0xfc9e,0xfdd3,0xfd7d,0xfd12,0xfc17,0xfcc5, -0x0354,0x0224,0x0225,0xfc6f,0xfc6e,0xfdb4,0xfd3a,0xfdb5, -0xfdb3,0x037f,0x03f0,0x0367,0xfc8f,0xfd07,0xfca6,0xfcf2, -0xfc1f,0xfd1b,0x037c,0x03e8,0x024f,0xfc98,0xfdfd,0xfdbe, -0xfcf7,0xfc2f,0xfd55,0x03a7,0x0204,0x0344,0xfc50,0xfd04, -0xfcb4,0xfca9,0xfdf7,0xfd56,0x03a3,0x0264,0x0308,0xfdd3, -0xfd3e,0xfc5f,0xfcb1,0xfd23,0xfdb3,0x03c8,0x0266,0x0330, -0xfdbb,0xfcfd,0xfc2c,0xfc6d,0xfd1e,0xfd75,0x020c,0x0309, -0x02cf,0xfce4,0xfd1f,0xfdde,0xfde7,0xfdb2,0xfc0c,0x0225, -0x02b6,0x0312,0xfd18,0xfcb5,0xfdeb,0xfdb3,0xfc53,0xfda5, -0x0372,0x02f2,0x0216,0xfd77,0xfc68,0xfced,0xfd09,0xfdd5, -0xfdd3,0x0255,0x0345,0x02fe,0xfc2f,0xfc81,0xfd8d,0xfd47, -0xfd54,0xfdc2,0x027b,0x03ba,0x02c0,0xfdb0,0xfc97,0xfd70, -0xfcec,0xfc86,0xfc37,0x0323,0x0226,0x031e,0xfca1,0xfd8e, -0xfca6,0xfd8a,0xfdb1,0xfd92,0x02bb,0x028e,0x031e,0xfc82, -0xfddf,0xfc03,0xfc46,0xfcbb,0xfd92,0x039c,0x02ff,0x02e2, -0xfd4b,0xfd66,0xfdd7,0xfcbe,0xfdc1,0xfded,0x03ca,0x02a3, -0x0260,0xfd81,0xfdc0,0xfcdf,0xfc69,0xfc86,0xfd2e,0x0278, -0x02c2,0x02ac,0xfc97,0xfcb4,0xfc50,0xfcf4,0xfc30,0xfc6e, -0x035a,0x02ff,0x0233,0xfd7d,0xfc4f,0xfcb4,0xfd31,0xfdc2, -0xfd94,0x020f,0x02fd,0x02be,0xfcec,0xfd2c,0xfdf3,0xfde1, -0xfdc4,0xfc3c,0x022f,0x039c,0x03eb,0xfc0f,0xfddd,0xfc77, -0xfd9e,0xfcbf,0xfc29,0x026a,0x020c,0x0263,0xfd87,0xfd1e, -0xfd8f,0xfd15,0xfde8,0xfd27,0x03e7,0x03ae,0x03c3,0xfc68, -0xfc54,0xfc8a,0xfc30,0xfc9d,0xfc77,0x0223,0x0359,0x03a7, -0xfc6c,0xfc19,0xfcf1,0xfdb8,0xfd32,0xfcaa,0x02de,0x039e, -0x0239,0xfd67,0xfcce,0xfdfd,0xfdf1,0xfcba,0xfd86,0x03c7, -0x02ea,0x0227,0xfd3f,0xfdf8,0xfcdc,0xfc6f,0xfde0,0xfdaf, -0x0342,0x0279,0x0371,0xfdfd,0xfd32,0xfddf,0xfd59,0xfcf1, -0xfd0a,0x03ad,0x02bd,0x02d7,0xfd7b,0xfd64,0xfc1b,0xfc9f, -0xfc3f,0xfdfc,0x03b1,0x0234,0x027c,0xfdf7,0xfdb5,0xfd43, -0xfc97,0xfd91,0xfcea,0x0200,0x0233,0x0319,0xfdcd,0xfce6, -0xfc97,0xfe00,0xfd95,0xfd99,0x03d8,0x022c,0x023a,0xfdea, -0xfddc,0xfd94,0xfc4f,0xfda4,0xfd84,0x03d8,0x021c,0x02e4, -0xfdf9,0xfd38,0xfcf2,0xfc4e,0xfdc6,0xfde8,0x020f,0x02fc, -0x036a,0xfced,0xfc7b,0xfd74,0xfde1,0xfdc6,0xfd15,0x0212, -0x0298,0x03f6,0xfd50,0xfdf3,0xfd6e,0xfddb,0xfca2,0xfc13, -0x0222,0x0203,0x0209,0xfdda,0xfdd4,0xfdf3,0xfdb8,0xfdf9, -0xfded,0x022a,0x03a6,0x02a0,0xfc0d,0xfd28,0xfd9b,0xfda8, -0xfcac,0xfc8e,0x0256,0x03b1,0x022c,0xfdd8,0xfd76,0xfdff, -0xfd44,0xfc98,0xfda5,0x0273,0x0213,0x02dd,0xfd75,0xfc7d, -0xfd08,0xfcff,0xfdd9,0xfdf3,0x0240,0x03fc,0x03f6,0xfdc2, -0xfdc5,0xfc0d,0xfd76,0xfc08,0xfc13,0x026f,0x039c,0x0252, -0xfdcd,0xfd2c,0xfde7,0xfd09,0xfcbd,0xfd4d,0x02a6,0x038d, -0x025b,0xfda6,0xfce0,0xfde8,0xfc7d,0xfcd9,0xfd38,0x032e, -0x02e8,0x021f,0xfdb0,0xfc9f,0xfcea,0xfd78,0xfde3,0xfdbf}; +static const uint8_t gain_exp_tab[256][3] = { + {14, 14, 14}, {14, 14, 14}, {14, 13, 14}, {13, 13, 14}, + {13, 14, 13}, {13, 14, 15}, {13, 13, 13}, {12, 14, 13}, + {13, 13, 13}, {13, 13, 12}, {13, 12, 13}, {12, 13, 12}, + {12, 13, 13}, {12, 13, 13}, {12, 12, 13}, {11, 13, 13}, + {13, 12, 13}, {12, 12, 12}, {13, 12, 12}, {13, 12, 11}, + {12, 12, 12}, {12, 13, 11}, {12, 12, 11}, {11, 13, 12}, + {12, 12, 12}, {11, 12, 12}, {11, 12, 12}, {11, 12, 13}, + {11, 12, 11}, {11, 12, 11}, {11, 13, 12}, {11, 12, 12}, + {12, 12, 12}, {12, 11, 12}, {12, 12, 11}, {12, 12, 11}, + {13, 11, 11}, {12, 11, 10}, {11, 11, 11}, {11, 11, 10}, + {12, 11, 12}, {11, 11, 12}, {11, 12, 11}, {11, 11, 11}, + {11, 11, 12}, {11, 11, 12}, {11, 12, 12}, {10, 12, 12}, + {11, 12, 11}, {11, 11, 11}, {10, 12, 11}, {10, 12, 11}, + {11, 11, 11}, {10, 11, 11}, {10, 11, 12}, {10, 11, 12}, + {11, 12, 11}, {10, 12, 12}, {10, 13, 12}, {10, 12, 13}, + {10, 12, 11}, {10, 12, 11}, {10, 12, 12}, {10, 12, 12}, + {12, 11, 12}, {12, 11, 11}, {11, 11, 12}, {11, 11, 11}, + {11, 10, 11}, {11, 10, 11}, {12, 10, 10}, {12, 10, 10}, + {11, 11, 11}, {11, 11, 10}, {11, 11, 10}, {10, 12, 10}, + {11, 11, 11}, {11, 11, 11}, {10, 11, 11}, {10, 11, 11}, + {11, 10, 11}, {11, 11, 10}, {11, 10, 10}, {10, 10, 10}, + {11, 11, 10}, {10, 11, 10}, {10, 11, 10}, {10, 11, 10}, + {10, 10, 11}, {10, 10, 11}, {10, 11, 11}, {10, 11, 11}, + {10, 10, 11}, {10, 10, 10}, {10, 10, 11}, { 9, 10, 11}, + {11, 11, 11}, {10, 11, 11}, {10, 11, 10}, {10, 11, 11}, + {10, 11, 11}, {10, 11, 11}, {10, 11, 11}, {10, 11, 12}, + {10, 12, 11}, {10, 12, 11}, {10, 12, 12}, {10, 13, 12}, + {10, 12, 11}, {10, 12, 11}, {10, 12, 12}, {10, 12, 12}, + {10, 12, 10}, {10, 12, 11}, {10, 12, 10}, {10, 11, 11}, + {10, 11, 11}, {10, 11, 11}, { 9, 11, 11}, { 9, 11, 12}, + {10, 12, 11}, { 9, 12, 11}, { 9, 12, 12}, { 9, 12, 12}, + { 9, 12, 11}, { 9, 12, 12}, { 9, 12, 12}, { 9, 13, 12}, + {12, 10, 11}, {11, 10, 10}, {10, 10, 11}, {10, 10, 10}, + {11, 9, 10}, {11, 10, 10}, {10, 10, 9}, {10, 10, 9}, + {10, 10, 10}, {10, 10, 10}, {10, 10, 10}, {10, 10, 10}, + {10, 10, 10}, {10, 10, 9}, { 9, 10, 9}, { 9, 10, 9}, + {10, 9, 11}, {10, 10, 10}, {10, 10, 10}, { 9, 10, 10}, + {10, 9, 10}, {10, 9, 10}, { 9, 10, 10}, { 9, 9, 10}, + { 9, 10, 10}, { 9, 10, 10}, { 9, 10, 11}, { 9, 10, 11}, + { 9, 10, 10}, { 9, 10, 10}, { 9, 9, 10}, { 9, 10, 10}, + {10, 11, 10}, {10, 11, 10}, {10, 11, 10}, {10, 11, 10}, + {10, 10, 10}, {10, 10, 10}, { 9, 11, 10}, { 9, 11, 10}, + {10, 11, 11}, { 9, 11, 11}, { 9, 11, 11}, { 9, 11, 12}, + { 9, 11, 11}, { 9, 11, 11}, { 9, 11, 11}, { 9, 11, 12}, + { 9, 11, 10}, { 9, 11, 11}, { 9, 12, 10}, { 9, 11, 11}, + { 9, 11, 11}, { 9, 11, 12}, { 9, 12, 11}, { 9, 12, 12}, + { 9, 12, 11}, { 9, 12, 11}, { 9, 12, 11}, { 9, 12, 12}, + { 9, 12, 11}, { 9, 13, 12}, { 9, 13, 12}, { 9, 12, 13}, + {10, 11, 10}, { 9, 11, 10}, { 9, 10, 10}, { 9, 10, 10}, + { 9, 11, 10}, { 9, 11, 10}, { 9, 11, 10}, { 9, 11, 11}, + { 9, 10, 10}, { 9, 11, 10}, { 9, 10, 10}, { 9, 10, 11}, + { 9, 11, 11}, { 9, 11, 11}, { 9, 11, 11}, { 9, 11, 11}, + { 9, 12, 10}, { 9, 12, 10}, { 9, 11, 11}, { 9, 11, 11}, + { 9, 12, 11}, { 9, 12, 12}, { 9, 12, 11}, { 9, 13, 12}, + { 9, 11, 10}, { 9, 12, 11}, { 9, 12, 11}, { 9, 11, 12}, + { 9, 12, 11}, { 9, 12, 12}, { 8, 12, 11}, { 8, 12, 12}, + {10, 9, 9}, { 9, 9, 9}, { 9, 10, 9}, { 9, 9, 9}, + { 9, 9, 10}, { 9, 9, 10}, { 9, 9, 9}, { 8, 9, 9}, + { 9, 10, 9}, { 8, 10, 9}, { 8, 10, 10}, { 8, 9, 10}, + { 9, 9, 9}, { 7, 8, 8}, { 8, 10, 9}, { 8, 9, 9}, + { 9, 11, 10}, { 9, 11, 10}, { 9, 10, 10}, { 8, 10, 11}, + { 9, 11, 10}, { 9, 11, 11}, { 8, 11, 11}, { 8, 11, 12}, + { 8, 10, 9}, { 8, 11, 10}, { 8, 11, 10}, { 8, 10, 11}, + { 8, 12, 11}, { 8, 12, 11}, { 8, 11, 10}, { 8, 11, 10} +}; -static const unsigned short wavtable2[2304]={ -0x0e,0x0e,0x0e,0x14,0x14,0x13,0x15,0x14,0x14,0x0e,0x0e,0x0e, -0x14,0x14,0x14,0x14,0x15,0x15,0x0e,0x0d,0x0e,0x12,0x14,0x13, -0x15,0x12,0x15,0x0d,0x0d,0x0e,0x12,0x13,0x13,0x13,0x12,0x15, -0x0d,0x0e,0x0d,0x13,0x12,0x12,0x13,0x14,0x13,0x0d,0x0e,0x0f, -0x13,0x13,0x14,0x13,0x15,0x16,0x0d,0x0d,0x0d,0x11,0x11,0x12, -0x12,0x13,0x13,0x0c,0x0e,0x0d,0x12,0x11,0x13,0x11,0x14,0x13, -0x0d,0x0d,0x0d,0x12,0x12,0x11,0x13,0x12,0x12,0x0d,0x0d,0x0c, -0x12,0x11,0x11,0x12,0x13,0x11,0x0d,0x0c,0x0d,0x11,0x11,0x10, -0x12,0x11,0x12,0x0c,0x0d,0x0c,0x11,0x10,0x11,0x11,0x13,0x11, -0x0c,0x0d,0x0d,0x10,0x11,0x11,0x11,0x12,0x12,0x0c,0x0d,0x0d, -0x10,0x10,0x11,0x10,0x13,0x12,0x0c,0x0c,0x0d,0x0f,0x10,0x10, -0x10,0x11,0x12,0x0b,0x0d,0x0d,0x0f,0x0f,0x11,0x0f,0x12,0x12, -0x0d,0x0c,0x0d,0x10,0x11,0x11,0x12,0x10,0x13,0x0c,0x0c,0x0c, -0x10,0x10,0x10,0x11,0x10,0x11,0x0d,0x0c,0x0c,0x11,0x11,0x0f, -0x13,0x10,0x10,0x0d,0x0c,0x0b,0x10,0x10,0x0e,0x13,0x10,0x0f, -0x0c,0x0c,0x0c,0x10,0x10,0x10,0x11,0x11,0x11,0x0c,0x0d,0x0b, -0x10,0x0f,0x10,0x11,0x12,0x0f,0x0c,0x0c,0x0b,0x10,0x0e,0x0f, -0x10,0x11,0x0f,0x0b,0x0d,0x0c,0x0f,0x0f,0x10,0x0f,0x12,0x10, -0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x0b,0x0c,0x0c, -0x0f,0x0e,0x0f,0x0f,0x10,0x10,0x0b,0x0c,0x0c,0x0f,0x0f,0x10, -0x0f,0x10,0x11,0x0b,0x0c,0x0d,0x0f,0x0f,0x10,0x0e,0x11,0x12, -0x0b,0x0c,0x0b,0x0f,0x0e,0x0f,0x0f,0x11,0x0f,0x0b,0x0c,0x0b, -0x0f,0x0e,0x0f,0x0e,0x11,0x0f,0x0b,0x0d,0x0c,0x0f,0x0e,0x10, -0x0e,0x12,0x11,0x0b,0x0c,0x0c,0x0e,0x0e,0x10,0x0e,0x11,0x11, -0x0c,0x0c,0x0c,0x0f,0x10,0x0f,0x11,0x10,0x11,0x0c,0x0b,0x0c, -0x0f,0x10,0x0f,0x11,0x0f,0x10,0x0c,0x0c,0x0b,0x0f,0x0f,0x0f, -0x11,0x10,0x0f,0x0c,0x0c,0x0b,0x0f,0x0e,0x0e,0x10,0x10,0x0f, -0x0d,0x0b,0x0b,0x0f,0x0f,0x0e,0x12,0x0f,0x0f,0x0c,0x0b,0x0a, -0x0f,0x0e,0x0d,0x11,0x0f,0x0d,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e, -0x0f,0x0f,0x0e,0x0b,0x0b,0x0a,0x0e,0x0d,0x0d,0x0f,0x0f,0x0d, -0x0c,0x0b,0x0c,0x0e,0x0f,0x0f,0x10,0x0f,0x11,0x0b,0x0b,0x0c, -0x0e,0x0f,0x0f,0x0f,0x0f,0x10,0x0b,0x0c,0x0b,0x0e,0x0e,0x0e, -0x0f,0x10,0x0f,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f, -0x0b,0x0b,0x0c,0x0e,0x0e,0x0f,0x0e,0x0f,0x10,0x0b,0x0b,0x0c, -0x0e,0x0e,0x0f,0x0e,0x0f,0x11,0x0b,0x0c,0x0c,0x0e,0x0e,0x0f, -0x0e,0x10,0x10,0x0a,0x0c,0x0c,0x0d,0x0e,0x0f,0x0d,0x10,0x10, -0x0b,0x0c,0x0b,0x0e,0x0d,0x0e,0x0e,0x10,0x0e,0x0b,0x0b,0x0b, -0x0e,0x0d,0x0e,0x0e,0x0f,0x0e,0x0a,0x0c,0x0b,0x0e,0x0d,0x0e, -0x0d,0x11,0x0e,0x0a,0x0c,0x0b,0x0e,0x0d,0x0e,0x0d,0x10,0x0e, -0x0b,0x0b,0x0b,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x0a,0x0b,0x0b, -0x0d,0x0d,0x0e,0x0d,0x0f,0x0f,0x0a,0x0b,0x0c,0x0d,0x0e,0x0e, -0x0d,0x0f,0x10,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x0d,0x0f,0x10, -0x0b,0x0c,0x0b,0x0e,0x0d,0x0f,0x0e,0x10,0x0f,0x0a,0x0c,0x0c, -0x0e,0x0d,0x0f,0x0d,0x11,0x10,0x0a,0x0d,0x0c,0x0e,0x0e,0x10, -0x0d,0x12,0x10,0x0a,0x0c,0x0d,0x0e,0x0e,0x10,0x0d,0x11,0x12, -0x0a,0x0c,0x0b,0x0d,0x0d,0x0f,0x0d,0x10,0x0f,0x0a,0x0c,0x0b, -0x0d,0x0d,0x0f,0x0d,0x10,0x0f,0x0a,0x0c,0x0c,0x0e,0x0d,0x10, -0x0d,0x11,0x10,0x0a,0x0c,0x0c,0x0d,0x0e,0x10,0x0c,0x10,0x11, -0x0c,0x0b,0x0c,0x0f,0x10,0x0e,0x11,0x0e,0x10,0x0c,0x0b,0x0b, -0x0e,0x0f,0x0d,0x11,0x0e,0x0f,0x0b,0x0b,0x0c,0x0e,0x0e,0x0e, -0x0f,0x0e,0x10,0x0b,0x0b,0x0b,0x0d,0x0e,0x0e,0x0e,0x0e,0x0f, -0x0b,0x0a,0x0b,0x0d,0x0e,0x0d,0x0f,0x0d,0x0f,0x0b,0x0a,0x0b, -0x0d,0x0e,0x0d,0x0f,0x0d,0x0f,0x0c,0x0a,0x0a,0x0e,0x0e,0x0c, -0x11,0x0d,0x0d,0x0c,0x0a,0x0a,0x0d,0x0d,0x0b,0x10,0x0d,0x0c, -0x0b,0x0b,0x0b,0x0e,0x0e,0x0d,0x0f,0x0e,0x0e,0x0b,0x0b,0x0a, -0x0d,0x0d,0x0d,0x0f,0x0e,0x0d,0x0b,0x0b,0x0a,0x0e,0x0c,0x0d, -0x0e,0x0f,0x0d,0x0a,0x0c,0x0a,0x0e,0x0c,0x0d,0x0d,0x10,0x0c, -0x0b,0x0b,0x0b,0x0d,0x0e,0x0d,0x0e,0x0e,0x0f,0x0b,0x0b,0x0b, -0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0a,0x0b,0x0b,0x0d,0x0d,0x0e, -0x0d,0x0e,0x0f,0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0d,0x0e,0x0f, -0x0b,0x0a,0x0b,0x0d,0x0d,0x0d,0x0e,0x0d,0x0e,0x0b,0x0b,0x0a, -0x0d,0x0c,0x0d,0x0e,0x0e,0x0d,0x0b,0x0a,0x0a,0x0c,0x0c,0x0c, -0x0e,0x0d,0x0d,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d, -0x0b,0x0b,0x0a,0x0d,0x0c,0x0c,0x0e,0x0e,0x0c,0x0a,0x0b,0x0a, -0x0d,0x0c,0x0c,0x0d,0x0e,0x0c,0x0a,0x0b,0x0a,0x0c,0x0b,0x0c, -0x0d,0x0e,0x0c,0x0a,0x0b,0x0a,0x0c,0x0b,0x0c,0x0c,0x0e,0x0c, -0x0a,0x0a,0x0b,0x0c,0x0d,0x0d,0x0d,0x0d,0x0f,0x0a,0x0a,0x0b, -0x0c,0x0d,0x0d,0x0d,0x0d,0x0e,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d, -0x0c,0x0e,0x0e,0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0c,0x0e,0x0f, -0x0a,0x0a,0x0b,0x0c,0x0c,0x0c,0x0c,0x0d,0x0e,0x0a,0x0a,0x0a, -0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c, -0x0c,0x0d,0x0e,0x09,0x0a,0x0b,0x0b,0x0c,0x0d,0x0b,0x0d,0x0e, -0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0e,0x0f,0x0e,0x0a,0x0b,0x0b, -0x0d,0x0c,0x0d,0x0d,0x0f,0x0e,0x0a,0x0b,0x0a,0x0d,0x0c,0x0d, -0x0d,0x0f,0x0d,0x0a,0x0b,0x0b,0x0d,0x0c,0x0d,0x0c,0x0f,0x0e, -0x0a,0x0b,0x0b,0x0d,0x0d,0x0e,0x0d,0x0f,0x0f,0x0a,0x0b,0x0b, -0x0d,0x0d,0x0e,0x0c,0x0f,0x0f,0x0a,0x0b,0x0b,0x0d,0x0d,0x0e, -0x0c,0x0f,0x0f,0x0a,0x0b,0x0c,0x0c,0x0d,0x0f,0x0c,0x0f,0x10, -0x0a,0x0c,0x0b,0x0e,0x0c,0x0e,0x0d,0x10,0x0e,0x0a,0x0c,0x0b, -0x0e,0x0c,0x0f,0x0c,0x11,0x0e,0x0a,0x0c,0x0c,0x0d,0x0d,0x0f, -0x0c,0x10,0x10,0x0a,0x0d,0x0c,0x0e,0x0d,0x10,0x0c,0x12,0x11, -0x0a,0x0c,0x0b,0x0d,0x0c,0x0f,0x0c,0x10,0x0f,0x0a,0x0c,0x0b, -0x0d,0x0c,0x0e,0x0c,0x10,0x0f,0x0a,0x0c,0x0c,0x0d,0x0d,0x0f, -0x0c,0x11,0x10,0x0a,0x0c,0x0c,0x0d,0x0d,0x10,0x0c,0x10,0x11, -0x0a,0x0c,0x0a,0x0d,0x0c,0x0e,0x0c,0x10,0x0d,0x0a,0x0c,0x0b, -0x0d,0x0c,0x0e,0x0c,0x10,0x0e,0x0a,0x0c,0x0a,0x0d,0x0b,0x0d, -0x0c,0x10,0x0d,0x0a,0x0b,0x0b,0x0c,0x0c,0x0e,0x0c,0x0f,0x0e, -0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0c,0x0e,0x0e,0x0a,0x0b,0x0b, -0x0c,0x0c,0x0e,0x0c,0x0f,0x0f,0x09,0x0b,0x0b,0x0c,0x0c,0x0e, -0x0b,0x0f,0x0f,0x09,0x0b,0x0c,0x0c,0x0d,0x0e,0x0b,0x0f,0x10, -0x0a,0x0c,0x0b,0x0d,0x0c,0x0f,0x0c,0x11,0x0e,0x09,0x0c,0x0b, -0x0d,0x0c,0x0f,0x0b,0x11,0x0f,0x09,0x0c,0x0c,0x0d,0x0c,0x0f, -0x0b,0x10,0x10,0x09,0x0c,0x0c,0x0d,0x0d,0x10,0x0b,0x11,0x11, -0x09,0x0c,0x0b,0x0d,0x0c,0x0f,0x0b,0x11,0x0e,0x09,0x0c,0x0c, -0x0d,0x0c,0x10,0x0b,0x11,0x10,0x09,0x0c,0x0c,0x0d,0x0c,0x0f, -0x0b,0x11,0x10,0x09,0x0d,0x0c,0x0d,0x0d,0x10,0x0b,0x12,0x11, -0x0c,0x0a,0x0b,0x0d,0x0e,0x0c,0x10,0x0c,0x0e,0x0b,0x0a,0x0a, -0x0c,0x0d,0x0c,0x0e,0x0c,0x0d,0x0a,0x0a,0x0b,0x0c,0x0d,0x0c, -0x0d,0x0c,0x0f,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0c,0x0d, -0x0b,0x09,0x0a,0x0c,0x0d,0x0b,0x0f,0x0b,0x0d,0x0b,0x0a,0x0a, -0x0c,0x0c,0x0b,0x0e,0x0c,0x0c,0x0a,0x0a,0x09,0x0b,0x0b,0x0b, -0x0d,0x0c,0x0b,0x0a,0x0a,0x09,0x0b,0x0b,0x0a,0x0d,0x0c,0x0a, -0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a, -0x0c,0x0b,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b, -0x0c,0x0c,0x0d,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c, -0x0a,0x0a,0x0a,0x0c,0x0b,0x0b,0x0c,0x0d,0x0c,0x0a,0x0a,0x09, -0x0b,0x0b,0x0b,0x0c,0x0d,0x0b,0x09,0x0a,0x09,0x0b,0x0a,0x0b, -0x0b,0x0c,0x0b,0x09,0x0a,0x09,0x0b,0x0a,0x0b,0x0b,0x0d,0x0b, -0x0a,0x09,0x0b,0x0b,0x0c,0x0b,0x0d,0x0b,0x0e,0x0a,0x0a,0x0a, -0x0b,0x0c,0x0b,0x0d,0x0c,0x0d,0x0a,0x0a,0x0a,0x0b,0x0c,0x0c, -0x0c,0x0c,0x0d,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0d, -0x0a,0x09,0x0a,0x0b,0x0c,0x0a,0x0d,0x0b,0x0c,0x0a,0x09,0x0a, -0x0b,0x0b,0x0a,0x0c,0x0b,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0b, -0x0b,0x0c,0x0c,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c, -0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x09,0x0a,0x0a, -0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x09,0x0a,0x0b,0x0b,0x0b,0x0c, -0x0b,0x0c,0x0e,0x09,0x0a,0x0b,0x0b,0x0b,0x0c,0x0b,0x0d,0x0e, -0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x09,0x0a,0x0a, -0x0a,0x0a,0x0b,0x0a,0x0c,0x0d,0x09,0x09,0x0a,0x0a,0x0a,0x0b, -0x0a,0x0b,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0c,0x0a,0x0c,0x0d, -0x0a,0x0b,0x0a,0x0c,0x0c,0x0d,0x0d,0x0e,0x0d,0x0a,0x0b,0x0a, -0x0c,0x0c,0x0d,0x0c,0x0e,0x0d,0x0a,0x0b,0x0a,0x0c,0x0b,0x0d, -0x0c,0x0f,0x0d,0x0a,0x0b,0x0a,0x0c,0x0b,0x0d,0x0c,0x0e,0x0d, -0x0a,0x0a,0x0a,0x0c,0x0b,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0a, -0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x09,0x0b,0x0a,0x0c,0x0b,0x0c, -0x0b,0x0e,0x0d,0x09,0x0b,0x0a,0x0b,0x0b,0x0c,0x0b,0x0e,0x0d, -0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0c,0x0e,0x0e,0x09,0x0b,0x0b, -0x0c,0x0c,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0c,0x0d, -0x0b,0x0e,0x0f,0x09,0x0b,0x0c,0x0b,0x0c,0x0e,0x0b,0x0e,0x10, -0x09,0x0b,0x0b,0x0c,0x0b,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b, -0x0c,0x0c,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0c,0x0d, -0x0b,0x0e,0x0f,0x09,0x0b,0x0c,0x0b,0x0c,0x0e,0x0a,0x0e,0x10, -0x09,0x0b,0x0a,0x0c,0x0b,0x0d,0x0b,0x0f,0x0d,0x09,0x0b,0x0b, -0x0c,0x0b,0x0e,0x0b,0x0f,0x0e,0x09,0x0c,0x0a,0x0c,0x0b,0x0d, -0x0b,0x10,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e,0x0b,0x0f,0x0e, -0x09,0x0b,0x0b,0x0c,0x0c,0x0e,0x0b,0x0f,0x0f,0x09,0x0b,0x0c, -0x0c,0x0c,0x0f,0x0b,0x0f,0x10,0x09,0x0c,0x0b,0x0c,0x0c,0x0e, -0x0b,0x10,0x0f,0x09,0x0c,0x0c,0x0c,0x0d,0x0f,0x0b,0x10,0x10, -0x09,0x0c,0x0b,0x0d,0x0b,0x0e,0x0b,0x11,0x0e,0x09,0x0c,0x0b, -0x0d,0x0c,0x0f,0x0b,0x11,0x0f,0x09,0x0c,0x0b,0x0c,0x0c,0x0e, -0x0a,0x10,0x0f,0x09,0x0c,0x0c,0x0c,0x0c,0x0f,0x0a,0x10,0x10, -0x09,0x0c,0x0b,0x0d,0x0b,0x0f,0x0a,0x11,0x0e,0x09,0x0d,0x0c, -0x0d,0x0c,0x10,0x0a,0x12,0x10,0x09,0x0d,0x0c,0x0d,0x0c,0x10, -0x0a,0x12,0x10,0x09,0x0c,0x0d,0x0d,0x0d,0x10,0x0a,0x11,0x12, -0x0a,0x0b,0x0a,0x0c,0x0b,0x0c,0x0c,0x0f,0x0c,0x09,0x0b,0x0a, -0x0c,0x0a,0x0c,0x0b,0x0f,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, -0x0b,0x0d,0x0c,0x09,0x0a,0x0a,0x0b,0x0a,0x0b,0x0a,0x0d,0x0c, -0x09,0x0b,0x0a,0x0c,0x0b,0x0c,0x0b,0x0e,0x0d,0x09,0x0b,0x0a, -0x0b,0x0b,0x0c,0x0b,0x0e,0x0d,0x09,0x0b,0x0a,0x0c,0x0b,0x0d, -0x0a,0x0f,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e,0x0a,0x0f,0x0e, -0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0a,0x0d,0x0d,0x09,0x0b,0x0a, -0x0b,0x0a,0x0c,0x0a,0x0e,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, -0x0a,0x0d,0x0d,0x09,0x0a,0x0b,0x0b,0x0b,0x0d,0x0a,0x0d,0x0e, -0x09,0x0b,0x0b,0x0b,0x0b,0x0d,0x0a,0x0e,0x0e,0x09,0x0b,0x0b, -0x0b,0x0c,0x0e,0x0a,0x0e,0x0f,0x09,0x0b,0x0b,0x0b,0x0b,0x0d, -0x0a,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0b,0x0e,0x0a,0x0e,0x0f, -0x09,0x0c,0x0a,0x0c,0x0b,0x0d,0x0b,0x10,0x0d,0x09,0x0c,0x0a, -0x0c,0x0b,0x0e,0x0a,0x10,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e, -0x0a,0x0f,0x0e,0x09,0x0b,0x0b,0x0c,0x0c,0x0e,0x0a,0x0f,0x0f, -0x09,0x0c,0x0b,0x0c,0x0b,0x0e,0x0a,0x10,0x0f,0x09,0x0c,0x0c, -0x0c,0x0c,0x0f,0x0a,0x10,0x10,0x09,0x0c,0x0b,0x0d,0x0c,0x0f, -0x0a,0x11,0x0f,0x09,0x0d,0x0c,0x0d,0x0c,0x10,0x0a,0x12,0x11, -0x09,0x0b,0x0a,0x0c,0x0b,0x0d,0x0a,0x0f,0x0d,0x09,0x0c,0x0b, -0x0c,0x0b,0x0e,0x0a,0x10,0x0e,0x09,0x0c,0x0b,0x0c,0x0b,0x0e, -0x0a,0x10,0x0f,0x09,0x0b,0x0c,0x0c,0x0c,0x0f,0x0a,0x0f,0x10, -0x09,0x0c,0x0b,0x0c,0x0b,0x0f,0x0a,0x11,0x0e,0x09,0x0c,0x0c, -0x0c,0x0c,0x10,0x0a,0x11,0x10,0x08,0x0c,0x0b,0x0c,0x0b,0x0e, -0x09,0x10,0x0f,0x08,0x0c,0x0c,0x0c,0x0c,0x0f,0x09,0x11,0x10, -0x0a,0x09,0x09,0x0a,0x0b,0x0a,0x0c,0x0a,0x0b,0x09,0x09,0x09, -0x0a,0x0a,0x09,0x0b,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x0a, -0x0b,0x0c,0x0b,0x09,0x09,0x09,0x0a,0x09,0x0a,0x0a,0x0b,0x0a, -0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x09,0x09,0x0a, -0x09,0x0a,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x09,0x09,0x09,0x0a, -0x0a,0x0b,0x0b,0x08,0x09,0x09,0x09,0x09,0x0a,0x09,0x0b,0x0b, -0x09,0x0a,0x09,0x0a,0x0a,0x0b,0x0a,0x0c,0x0b,0x08,0x0a,0x09, -0x0a,0x09,0x0a,0x09,0x0c,0x0b,0x08,0x0a,0x0a,0x0a,0x09,0x0b, -0x09,0x0c,0x0c,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0b,0x0d, -0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x07,0x08,0x08, -0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x0a,0x09,0x09,0x09,0x0a, -0x08,0x0c,0x0b,0x08,0x09,0x09,0x08,0x08,0x0a,0x08,0x0a,0x0b, -0x09,0x0b,0x0a,0x0b,0x0a,0x0c,0x0a,0x0f,0x0c,0x09,0x0b,0x0a, -0x0b,0x0a,0x0d,0x0a,0x0f,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0c, -0x0a,0x0d,0x0d,0x08,0x0a,0x0b,0x0a,0x0b,0x0d,0x09,0x0d,0x0e, -0x09,0x0b,0x0a,0x0b,0x0a,0x0d,0x0a,0x0f,0x0d,0x09,0x0b,0x0b, -0x0b,0x0b,0x0e,0x0a,0x0f,0x0e,0x08,0x0b,0x0b,0x0b,0x0b,0x0d, -0x09,0x0e,0x0e,0x08,0x0b,0x0c,0x0b,0x0b,0x0e,0x09,0x0f,0x10, -0x08,0x0a,0x09,0x0a,0x09,0x0b,0x09,0x0d,0x0b,0x08,0x0b,0x0a, -0x0b,0x0a,0x0c,0x09,0x0e,0x0d,0x08,0x0b,0x0a,0x0a,0x0a,0x0c, -0x09,0x0e,0x0d,0x08,0x0a,0x0b,0x0a,0x0b,0x0d,0x09,0x0d,0x0e, -0x08,0x0c,0x0b,0x0b,0x0a,0x0e,0x09,0x10,0x0e,0x08,0x0c,0x0b, -0x0b,0x0b,0x0e,0x09,0x10,0x0f,0x08,0x0b,0x0a,0x0a,0x0a,0x0c, -0x09,0x0e,0x0d,0x08,0x0b,0x0a,0x0a,0x0a,0x0d,0x08,0x0e,0x0d}; +static const int8_t cb1_vects[128][40]={ + { + 38, -4, 15, -4, 14, -13, 12, -11, -2, -6, + -6, -11, -45, -16, -11, -13, -7, 6, -12, 4, + -20, 3, -16, 12, -1, 12, 46, 24, 0, 33, + -3, 9, -12, -12, -8, -7, 17, -6, 0, -2, + }, { + 60, -16, 3, -22, 10, -32, 0, -28, -17, -18, + -3, -25, -37, -23, -10, 3, 2, 3, 0, 3, + -14, 0, -14, -1, 0, 2, 32, 9, -1, 25, + 7, 13, -5, 13, 8, 1, 2, 8, -10, 6, + }, { + 27, -12, 28, -2, 6, -7, 15, 9, -11, 1, + -13, -11, -40, 4, -29, -14, -19, -5, -23, -8, + -30, -13, -17, 0, -14, 12, 34, 20, -2, 25, + 2, -16, -4, -12, 15, 16, 29, 7, 24, 10, + }, { + 49, -24, 16, -20, 2, -26, 2, -7, -25, -10, + -11, -25, -32, -3, -27, 2, -8, -8, -11, -9, + -24, -17, -16, -14, -13, 2, 20, 5, -4, 17, + 14, -12, 3, 13, 33, 25, 14, 23, 15, 19, + }, { + 46, -6, 21, 8, -2, -16, -5, -8, -11, 4, + 8, 15, -24, 4, -2, -26, -3, -16, -16, -14, + -9, -2, -1, 4, 19, 7, 36, 17, 9, 13, + 0, 31, -5, -12, 7, -8, 11, -15, -13, -4, + }, { + 68, -18, 9, -9, -6, -35, -18, -25, -26, -7, + 10, 1, -16, -3, -1, -9, 6, -19, -4, -15, + -4, -6, 0, -8, 20, -2, 23, 2, 7, 5, + 12, 35, 1, 13, 24, 0, -3, 0, -22, 4, + }, { + 35, -14, 34, 10, -10, -10, -1, 12, -20, 12, + 0, 15, -18, 24, -20, -27, -14, -28, -27, -27, + -20, -19, -2, -8, 5, 7, 25, 13, 5, 5, + 6, 5, 2, -12, 31, 15, 23, -1, 12, 8, + }, { + 57, -26, 22, -7, -14, -28, -14, -3, -35, 0, + 3, 1, -11, 16, -18, -10, -4, -31, -15, -28, + -14, -23, -1, -21, 7, -2, 11, -1, 3, -1, + 18, 9, 10, 13, 49, 24, 8, 14, 2, 16, + }, { + 25, 15, 22, 11, 18, 4, 15, -22, 8, -2, + -17, -9, -48, -20, -30, -17, -16, 11, -1, 16, + 2, 10, -5, 26, -2, -4, 22, 0, 2, 10, + -6, 13, -14, 10, -23, 0, 10, -2, 1, 0, + }, { + 47, 3, 11, -6, 15, -13, 2, -38, -6, -13, + -15, -22, -40, -28, -28, 0, -5, 8, 10, 15, + 7, 7, -4, 13, -1, -14, 9, -14, 0, 2, + 4, 18, -7, 36, -6, 8, -3, 13, -7, 8, + }, { + 14, 7, 36, 13, 10, 10, 18, 0, 0, 5, + -25, -8, -43, 0, -48, -18, -27, 0, -12, 3, + -7, -6, -7, 13, -15, -5, 11, -3, 0, 2, + 0, -12, -6, 10, 0, 23, 22, 11, 26, 12, + }, { + 36, -5, 24, -4, 7, -7, 6, -17, -14, -5, + -22, -22, -35, -8, -46, -1, -17, -3, 0, 2, + -2, -10, -5, 0, -14, -15, -2, -18, -2, -4, + 11, -7, 1, 36, 18, 32, 7, 27, 17, 20, + }, { + 33, 13, 29, 24, 1, 1, -2, -18, 0, 9, + -3, 17, -27, 0, -21, -30, -12, -11, -5, -2, + 12, 4, 9, 19, 18, -9, 13, -6, 11, -8, + -2, 35, -8, 10, -7, -1, 4, -11, -10, -2, + }, { + 55, 1, 17, 6, -1, -16, -15, -35, -15, -2, + 0, 4, -19, -8, -20, -13, -1, -14, 7, -3, + 18, 0, 10, 5, 19, -19, 0, -21, 8, -16, + 9, 39, 0, 36, 10, 7, -9, 4, -20, 5, + }, { + 22, 5, 42, 26, -6, 8, 1, 2, -9, 17, + -10, 18, -21, 19, -39, -31, -23, -23, -16, -15, + 2, -12, 7, 6, 5, -9, 1, -10, 7, -16, + 4, 9, 0, 10, 17, 22, 16, 2, 14, 9, + }, { + 44, -6, 30, 8, -9, -10, -11, -14, -23, 5, + -8, 4, -14, 12, -37, -14, -12, -26, -4, -16, + 8, -16, 9, -7, 6, -19, -12, -25, 5, -24, + 15, 13, 8, 36, 34, 31, 1, 18, 4, 18, + }, { + -3, -5, -9, -7, 15, -1, 5, 13, 2, 12, + 5, 2, -21, -23, -2, -16, 0, 5, -6, 13, + -23, 3, -32, 10, -15, 8, 44, 28, 9, 37, + -2, 13, -9, -15, -12, -27, -7, -12, 0, -11, + }, { + 18, -17, -21, -25, 11, -19, -6, -3, -11, 0, + 7, -11, -13, -31, -1, 0, 9, 1, 5, 12, + -18, 0, -31, -2, -13, -1, 30, 14, 7, 29, + 9, 18, -1, 10, 4, -18, -22, 3, -10, -2, + }, { + -13, -13, 3, -5, 7, 4, 9, 34, -5, 20, + -2, 3, -16, -3, -20, -17, -11, -7, -17, 0, + -34, -13, -33, -2, -28, 8, 32, 24, 5, 29, + 3, -12, 0, -15, 11, -3, 3, 2, 24, 1, + }, { + 8, -25, -8, -23, 3, -13, -3, 17, -20, 8, + 0, -10, -8, -11, -18, 0, -1, -10, -5, 0, + -28, -17, -32, -15, -26, -1, 19, 9, 3, 21, + 15, -7, 6, 9, 29, 5, -10, 17, 15, 9, + }, { + 4, -6, -3, 5, -1, -4, -11, 16, -6, 23, + 19, 29, 0, -3, 6, -30, 3, -17, -10, -5, + -13, -2, -17, 3, 5, 3, 35, 21, 17, 17, + 2, 35, -2, -15, 3, -28, -13, -21, -13, -13, + }, { + 26, -19, -15, -12, -5, -22, -24, 0, -21, 12, + 21, 15, 8, -11, 7, -12, 14, -20, 2, -6, + -7, -6, -16, -9, 6, -5, 21, 7, 15, 10, + 13, 39, 5, 10, 20, -19, -28, -5, -22, -5, + }, { + -5, -15, 9, 7, -9, 2, -8, 37, -14, 31, + 11, 29, 5, 16, -11, -30, -7, -29, -21, -18, + -23, -19, -18, -9, -7, 3, 23, 17, 14, 9, + 8, 9, 6, -15, 27, -4, -2, -6, 12, -1, + }, { + 16, -27, -2, -10, -13, -16, -20, 20, -29, 20, + 14, 16, 13, 8, -9, -13, 2, -33, -9, -19, + -17, -23, -17, -22, -6, -6, 9, 2, 12, 2, + 20, 13, 13, 10, 45, 4, -16, 8, 2, 7, + }, { + -16, 14, -2, 8, 20, 17, 9, 2, 14, 16, + -6, 5, -24, -28, -21, -20, -8, 9, 4, 25, + -1, 11, -22, 24, -15, -8, 21, 5, 11, 14, + -5, 18, -11, 7, -27, -20, -14, -7, 1, -9, + }, { + 6, 2, -14, -9, 16, -1, -3, -14, 0, 5, + -3, -8, -16, -36, -19, -3, 1, 6, 17, 24, + 4, 7, -21, 11, -14, -18, 7, -9, 9, 7, + 6, 22, -3, 33, -10, -11, -28, 7, -7, 0, + }, { + -26, 6, 11, 10, 12, 23, 12, 23, 5, 24, + -13, 5, -19, -8, -38, -21, -20, -2, -6, 12, + -11, -5, -23, 11, -29, -9, 9, 0, 7, 6, + 1, -7, -2, 7, -3, 3, -2, 6, 27, 3, + }, { + -4, -6, 0, -7, 8, 4, 0, 6, -9, 13, + -11, -7, -11, -15, -37, -4, -9, -5, 5, 11, + -5, -9, -22, -1, -27, -18, -4, -14, 5, 0, + 12, -3, 4, 32, 14, 12, -17, 22, 17, 11, + }, { + -8, 12, 3, 21, 3, 14, -8, 5, 4, 28, + 7, 32, -2, -8, -12, -34, -4, -12, 1, 6, + 9, 4, -7, 17, 4, -13, 11, -1, 19, -4, + 0, 39, -4, 7, -11, -21, -20, -16, -10, -11, + }, { + 13, 0, -8, 3, 0, -4, -21, -11, -9, 16, + 10, 18, 5, -16, -10, -16, 5, -15, 13, 5, + 15, 1, -6, 4, 6, -23, -2, -16, 17, -12, + 10, 44, 3, 33, 6, -12, -34, -1, -20, -3, + }, { + -18, 4, 17, 23, -4, 20, -4, 26, -3, 36, + 0, 32, 2, 12, -29, -34, -16, -24, -10, -6, + 0, -12, -8, 4, -8, -13, 0, -6, 16, -12, + 5, 13, 3, 7, 13, 3, -8, -2, 14, 0, + }, { + 3, -7, 5, 5, -8, 2, -17, 9, -18, 24, + 2, 19, 10, 4, -28, -17, -5, -28, 2, -7, + 4, -15, -7, -8, -6, -23, -13, -21, 14, -20, + 17, 18, 11, 33, 30, 11, -23, 13, 5, 9, + }, { + 60, 10, 7, -1, 9, -8, 6, -13, 2, -15, + -1, -10, -13, -11, 15, 0, 6, 9, -1, 0, + -13, 1, -11, -3, -13, 21, 13, 26, -7, 31, + -10, -7, -16, -33, -31, -10, 22, -8, 1, -2, + }, { + 82, -1, -4, -19, 6, -27, -6, -29, -12, -26, + 1, -24, -5, -18, 17, 17, 17, 6, 10, 0, + -7, -2, -9, -16, -12, 11, 0, 11, -9, 23, + 0, -3, -8, -8, -13, -1, 8, 7, -7, 6, + }, { + 49, 2, 21, 0, 1, -2, 9, 8, -6, -6, + -8, -10, -8, 9, -2, 0, -4, -2, -13, -12, + -23, -15, -12, -16, -26, 21, 2, 21, -11, 23, + -4, -33, -7, -33, -6, 13, 34, 5, 27, 10, + }, { + 71, -10, 9, -17, -1, -20, -3, -8, -21, -18, + -6, -24, 0, 1, 0, 16, 6, -5, 0, -13, + -17, -19, -11, -29, -25, 11, -11, 6, -13, 15, + 7, -29, 0, -8, 11, 22, 20, 21, 17, 18, + }, { + 67, 8, 14, 11, -7, -11, -11, -9, -7, -3, + 13, 16, 8, 9, 24, -12, 10, -13, -5, -17, + -2, -4, 3, -10, 6, 17, 4, 19, 0, 11, + -6, 13, -9, -33, -14, -10, 16, -17, -10, -4, + }, { + 90, -3, 2, -6, -10, -29, -24, -26, -21, -15, + 15, 2, 16, 1, 25, 4, 21, -16, 6, -18, + 3, -8, 5, -24, 8, 7, -9, 4, -1, 3, + 5, 18, -1, -7, 2, -1, 2, -1, -19, 3, + }, { + 57, 0, 27, 13, -14, -5, -7, 11, -15, 4, + 5, 16, 13, 29, 6, -13, 0, -25, -16, -31, + -12, -22, 2, -23, -6, 16, -7, 14, -2, 3, + 0, -12, 0, -33, 9, 13, 28, -3, 14, 7, + }, { + 79, -11, 15, -4, -18, -23, -20, -5, -30, -7, + 7, 2, 21, 21, 8, 3, 10, -28, -4, -31, + -6, -25, 3, -37, -4, 7, -20, 0, -4, -4, + 11, -7, 6, -8, 27, 22, 14, 12, 5, 16, + }, { + 47, 30, 15, 14, 14, 9, 9, -23, 13, -10, + -12, -7, -16, -15, -3, -3, -1, 14, 9, 12, + 9, 8, 0, 10, -14, 4, -9, 2, -5, 8, + -13, -3, -18, -10, -45, -3, 16, -4, 4, 0, + }, { + 69, 17, 3, -3, 10, -8, -3, -40, -1, -21, + -10, -21, -8, -23, -1, 13, 8, 11, 21, 11, + 15, 4, 0, -2, -13, -5, -23, -12, -7, 0, + -1, 0, -10, 14, -28, 5, 1, 11, -5, 7, + }, { + 36, 21, 28, 16, 6, 16, 12, -2, 4, -2, + -20, -7, -11, 4, -20, -4, -12, 2, -1, 0, + 0, -8, -2, -2, -27, 4, -21, -2, -9, 0, + -6, -29, -9, -10, -21, 21, 28, 10, 29, 11, + }, { + 58, 9, 16, -1, 2, -2, 0, -19, -10, -13, + -17, -21, -3, -3, -19, 12, -2, 0, 10, -1, + 5, -12, 0, -15, -26, -5, -34, -16, -11, -7, + 4, -25, -2, 14, -3, 29, 13, 25, 20, 20, + }, { + 55, 28, 21, 27, -2, 7, -8, -20, 4, 1, + 1, 18, 5, 4, 5, -16, 2, -8, 5, -5, + 19, 2, 14, 3, 6, 0, -18, -4, 2, -11, + -8, 18, -11, -10, -29, -3, 10, -13, -8, -3, + }, { + 77, 16, 9, 9, -6, -11, -21, -37, -10, -10, + 4, 5, 13, -3, 7, 0, 13, -11, 17, -6, + 25, -1, 15, -9, 7, -9, -32, -19, 0, -18, + 2, 22, -3, 15, -12, 5, -4, 2, -17, 5, + }, { + 44, 20, 34, 29, -10, 13, -4, 0, -4, 9, + -5, 19, 10, 24, -11, -17, -8, -20, -5, -19, + 9, -14, 12, -9, -6, 0, -30, -9, 0, -19, + -2, -7, -2, -10, -5, 20, 21, 1, 17, 9, + }, { + 66, 8, 23, 11, -14, -5, -17, -16, -19, -2, + -3, 5, 18, 17, -10, 0, 1, -23, 6, -20, + 15, -18, 14, -22, -5, -10, -44, -23, -2, -26, + 9, -3, 4, 14, 12, 29, 7, 16, 7, 18, + }, { + 18, 9, -17, -4, 11, 3, 0, 11, 7, 4, + 10, 3, 10, -18, 24, -3, 14, 7, 4, 10, + -16, 1, -27, -4, -27, 17, 12, 30, 0, 35, + -9, -3, -12, -36, -35, -30, -2, -13, 2, -11, + }, { + 40, -2, -29, -22, 7, -14, -12, -5, -7, -7, + 12, -9, 18, -26, 26, 14, 24, 4, 16, 9, + -10, -2, -26, -18, -26, 7, -1, 15, -1, 27, + 2, 0, -4, -11, -17, -21, -16, 1, -7, -3, + }, { + 8, 1, -3, -2, 3, 10, 3, 32, -1, 12, + 2, 4, 15, 1, 7, -3, 2, -4, -6, -3, + -26, -15, -29, -17, -40, 17, 0, 26, -2, 27, + -2, -29, -4, -36, -10, -6, 9, 0, 27, 0, + }, { + 30, -11, -15, -20, 0, -8, -9, 15, -15, 0, + 5, -9, 23, -6, 8, 13, 13, -7, 5, -3, + -20, -19, -27, -31, -39, 7, -13, 11, -4, 19, + 8, -25, 3, -11, 7, 2, -4, 16, 18, 9, + }, { + 26, 7, -11, 8, -5, 1, -17, 14, -1, 15, + 24, 30, 32, 1, 33, -16, 18, -14, 0, -8, + -6, -4, -12, -12, -6, 13, 2, 23, 8, 15, + -4, 17, -5, -36, -18, -30, -8, -22, -10, -14, + }, { + 48, -4, -23, -9, -9, -17, -30, -2, -16, 3, + 26, 16, 40, -6, 35, 1, 28, -17, 12, -9, + 0, -8, -11, -25, -5, 3, -10, 8, 6, 7, + 6, 22, 1, -11, -1, -21, -22, -7, -19, -5, + }, { + 15, 0, 2, 10, -13, 7, -14, 35, -10, 23, + 16, 31, 37, 21, 16, -17, 6, -26, -10, -21, + -16, -21, -13, -25, -19, 13, -8, 19, 5, 7, + 1, -8, 2, -36, 5, -6, 3, -8, 15, -1, + }, { + 37, -12, -9, -7, -17, -11, -26, 18, -25, 12, + 19, 17, 45, 14, 17, 0, 17, -30, 1, -22, + -10, -25, -12, -38, -18, 3, -22, 4, 3, 0, + 13, -3, 10, -11, 23, 2, -10, 7, 5, 7, + }, { + 5, 29, -9, 11, 15, 22, 3, 0, 18, 8, + -1, 6, 7, -23, 6, -6, 5, 12, 15, 21, + 5, 8, -17, 9, -28, 0, -11, 6, 2, 12, + -11, 0, -14, -13, -49, -22, -8, -9, 4, -9, + }, { + 27, 16, -21, -6, 12, 3, -9, -16, 3, -2, + 1, -7, 15, -31, 7, 10, 16, 9, 27, 21, + 11, 5, -16, -3, -26, -9, -24, -7, 0, 4, + 0, 4, -6, 11, -32, -14, -23, 6, -5, -1, + }, { + -4, 20, 3, 13, 8, 28, 6, 21, 10, 16, + -8, 7, 12, -3, -11, -7, -5, 0, 4, 8, + -4, -8, -18, -3, -41, 0, -22, 2, 0, 4, + -5, -25, -6, -14, -25, 1, 2, 4, 29, 2, + }, { + 17, 8, -8, -4, 4, 10, -6, 5, -4, 5, + -6, -6, 20, -10, -9, 9, 4, -2, 16, 7, + 1, -12, -17, -16, -39, -9, -36, -12, -2, -3, + 6, -21, 1, 11, -7, 10, -11, 20, 20, 11, + }, { + 13, 27, -3, 24, -1, 19, -14, 3, 9, 20, + 12, 33, 29, -3, 15, -20, 9, -9, 11, 3, + 16, 2, -2, 2, -7, -3, -20, 0, 10, -7, + -7, 22, -7, -13, -33, -23, -14, -18, -7, -12, + }, { + 35, 15, -15, 6, -4, 1, -27, -12, -5, 8, + 15, 19, 37, -11, 16, -2, 20, -12, 23, 2, + 22, -1, -1, -11, -5, -13, -34, -14, 8, -14, + 4, 26, 0, 11, -16, -14, -29, -2, -17, -3, + }, { + 3, 19, 9, 26, -8, 26, -10, 24, 0, 28, + 5, 33, 34, 17, -2, -20, -1, -22, 0, -10, + 6, -14, -3, -10, -20, -4, -32, -4, 7, -15, + 0, -3, 0, -13, -9, 0, -3, -4, 17, 0, + }, { + 25, 7, -2, 8, -12, 7, -23, 8, -13, 16, + 7, 20, 42, 9, 0, -3, 9, -25, 12, -10, + 12, -18, -2, -24, -19, -13, -46, -19, 5, -22, + 10, 0, 8, 11, 8, 9, -17, 11, 7, 8, + }, { + -25, -7, 2, -8, 12, -7, 23, -8, 13, -16, + -7, -20, -42, -9, 0, 3, -9, 25, -12, 10, + -12, 18, 2, 24, 19, 13, 46, 19, -5, 22, + -10, 0, -8, -11, -8, -9, 17, -11, -7, -8, + }, { + -3, -19, -9, -26, 8, -26, 10, -24, 0, -28, + -5, -33, -34, -17, 2, 20, 1, 22, 0, 10, + -6, 14, 3, 10, 20, 4, 32, 4, -7, 15, + 0, 3, 0, 13, 9, 0, 3, 4, -17, 0, + }, { + -35, -15, 15, -6, 4, -1, 27, 12, 5, -8, + -15, -19, -37, 11, -16, 2, -20, 12, -23, -2, + -22, 1, 1, 11, 5, 13, 34, 14, -8, 14, + -4, -26, 0, -11, 16, 14, 29, 2, 17, 3, + }, { + -13, -27, 3, -24, 1, -19, 14, -3, -9, -20, + -12, -33, -29, 3, -15, 20, -9, 9, -11, -3, + -16, -2, 2, -2, 7, 3, 20, 0, -10, 7, + 7, -22, 7, 13, 33, 23, 14, 18, 7, 12, + }, { + -17, -8, 8, 4, -4, -10, 6, -5, 4, -5, + 6, 6, -20, 10, 9, -9, -4, 2, -16, -7, + -1, 12, 17, 16, 39, 9, 36, 12, 2, 3, + -6, 21, -1, -11, 7, -10, 11, -20, -20, -11, + }, { + 4, -20, -3, -13, -8, -28, -6, -21, -10, -16, + 8, -7, -12, 3, 11, 7, 5, 0, -4, -8, + 4, 8, 18, 3, 41, 0, 22, -2, 0, -4, + 5, 25, 6, 14, 25, -1, -2, -4, -29, -2, + }, { + -27, -16, 21, 6, -12, -3, 9, 16, -3, 2, + -1, 7, -15, 31, -7, -10, -16, -9, -27, -21, + -11, -5, 16, 3, 26, 9, 24, 7, 0, -4, + 0, -4, 6, -11, 32, 14, 23, -6, 5, 1, + }, { + -5, -29, 9, -11, -15, -22, -3, 0, -18, -8, + 1, -6, -7, 23, -6, 6, -5, -12, -15, -21, + -5, -8, 17, -9, 28, 0, 11, -6, -2, -12, + 11, 0, 14, 13, 49, 22, 8, 9, -4, 9, + }, { + -37, 12, 9, 7, 17, 11, 26, -18, 25, -12, + -19, -17, -45, -14, -17, 0, -17, 30, -1, 22, + 10, 25, 12, 38, 18, -3, 22, -4, -3, 0, + -13, 3, -10, 11, -23, -2, 10, -7, -5, -7, + }, { + -15, 0, -2, -10, 13, -7, 14, -35, 10, -23, + -16, -31, -37, -21, -16, 17, -6, 26, 10, 21, + 16, 21, 13, 25, 19, -13, 8, -19, -5, -7, + -1, 8, -2, 36, -5, 6, -3, 8, -15, 1, + }, { + -48, 4, 23, 9, 9, 17, 30, 2, 16, -3, + -26, -16, -40, 6, -35, -1, -28, 17, -12, 9, + 0, 8, 11, 25, 5, -3, 10, -8, -6, -7, + -6, -22, -1, 11, 1, 21, 22, 7, 19, 5, + }, { + -26, -7, 11, -8, 5, -1, 17, -14, 1, -15, + -24, -30, -32, -1, -33, 16, -18, 14, 0, 8, + 6, 4, 12, 12, 6, -13, -2, -23, -8, -15, + 4, -17, 5, 36, 18, 30, 8, 22, 10, 14, + }, { + -30, 11, 15, 20, 0, 8, 9, -15, 15, 0, + -5, 9, -23, 6, -8, -13, -13, 7, -5, 3, + 20, 19, 27, 31, 39, -7, 13, -11, 4, -19, + -8, 25, -3, 11, -7, -2, 4, -16, -18, -9, + }, { + -8, -1, 3, 2, -3, -10, -3, -32, 1, -12, + -2, -4, -15, -1, -7, 3, -2, 4, 6, 3, + 26, 15, 29, 17, 40, -17, 0, -26, 2, -27, + 2, 29, 4, 36, 10, 6, -9, 0, -27, 0, + }, { + -40, 2, 29, 22, -7, 14, 12, 5, 7, 7, + -12, 9, -18, 26, -26, -14, -24, -4, -16, -9, + 10, 2, 26, 18, 26, -7, 1, -15, 1, -27, + -2, 0, 4, 11, 17, 21, 16, -1, 7, 3, + }, { + -18, -9, 17, 4, -11, -3, 0, -11, -7, -4, + -10, -3, -10, 18, -24, 3, -14, -7, -4, -10, + 16, -1, 27, 4, 27, -17, -12, -30, 0, -35, + 9, 3, 12, 36, 35, 30, 2, 13, -2, 11, + }, { + -66, -8, -23, -11, 14, 5, 17, 16, 19, 2, + 3, -5, -18, -17, 10, 0, -1, 23, -6, 20, + -15, 18, -14, 22, 5, 10, 44, 23, 2, 26, + -9, 3, -4, -14, -12, -29, -7, -16, -7, -18, + }, { + -44, -20, -34, -29, 10, -13, 4, 0, 4, -9, + 5, -19, -10, -24, 11, 17, 8, 20, 5, 19, + -9, 14, -12, 9, 6, 0, 30, 9, 0, 19, + 2, 7, 2, 10, 5, -20, -21, -1, -17, -9, + }, { + -77, -16, -9, -9, 6, 11, 21, 37, 10, 10, + -4, -5, -13, 3, -7, 0, -13, 11, -17, 6, + -25, 1, -15, 9, -7, 9, 32, 19, 0, 18, + -2, -22, 3, -15, 12, -5, 4, -2, 17, -5, + }, { + -55, -28, -21, -27, 2, -7, 8, 20, -4, -1, + -1, -18, -5, -4, -5, 16, -2, 8, -5, 5, + -19, -2, -14, -3, -6, 0, 18, 4, -2, 11, + 8, -18, 11, 10, 29, 3, -10, 13, 8, 3, + }, { + -58, -9, -16, 1, -2, 2, 0, 19, 10, 13, + 17, 21, 3, 3, 19, -12, 2, 0, -10, 1, + -5, 12, 0, 15, 26, 5, 34, 16, 11, 7, + -4, 25, 2, -14, 3, -29, -13, -25, -20, -20, + }, { + -36, -21, -28, -16, -6, -16, -12, 2, -4, 2, + 20, 7, 11, -4, 20, 4, 12, -2, 1, 0, + 0, 8, 2, 2, 27, -4, 21, 2, 9, 0, + 6, 29, 9, 10, 21, -21, -28, -10, -29, -11, + }, { + -69, -17, -3, 3, -10, 8, 3, 40, 1, 21, + 10, 21, 8, 23, 1, -13, -8, -11, -21, -11, + -15, -4, 0, 2, 13, 5, 23, 12, 7, 0, + 1, 0, 10, -14, 28, -5, -1, -11, 5, -7, + }, { + -47, -30, -15, -14, -14, -9, -9, 23, -13, 10, + 12, 7, 16, 15, 3, 3, 1, -14, -9, -12, + -9, -8, 0, -10, 14, -4, 9, -2, 5, -8, + 13, 3, 18, 10, 45, 3, -16, 4, -4, 0, + }, { + -79, 11, -15, 4, 18, 23, 20, 5, 30, 7, + -7, -2, -21, -21, -8, -3, -10, 28, 4, 31, + 6, 25, -3, 37, 4, -7, 20, 0, 4, 4, + -11, 7, -6, 8, -27, -22, -14, -12, -5, -16, + }, { + -57, 0, -27, -13, 14, 5, 7, -11, 15, -4, + -5, -16, -13, -29, -6, 13, 0, 25, 16, 31, + 12, 22, -2, 23, 6, -16, 7, -14, 2, -3, + 0, 12, 0, 33, -9, -13, -28, 3, -14, -7, + }, { + -90, 3, -2, 6, 10, 29, 24, 26, 21, 15, + -15, -2, -16, -1, -25, -4, -21, 16, -6, 18, + -3, 8, -5, 24, -8, -7, 9, -4, 1, -3, + -5, -18, 1, 7, -2, 1, -2, 1, 19, -3, + }, { + -67, -8, -14, -11, 7, 11, 11, 9, 7, 3, + -13, -16, -8, -9, -24, 12, -10, 13, 5, 17, + 2, 4, -3, 10, -6, -17, -4, -19, 0, -11, + 6, -13, 9, 33, 14, 10, -16, 17, 10, 4, + }, { + -71, 10, -9, 17, 1, 20, 3, 8, 21, 18, + 6, 24, 0, -1, 0, -16, -6, 5, 0, 13, + 17, 19, 11, 29, 25, -11, 11, -6, 13, -15, + -7, 29, 0, 8, -11, -22, -20, -21, -17, -18, + }, { + -49, -2, -21, 0, -1, 2, -9, -8, 6, 6, + 8, 10, 8, -9, 2, 0, 4, 2, 13, 12, + 23, 15, 12, 16, 26, -21, -2, -21, 11, -23, + 4, 33, 7, 33, 6, -13, -34, -5, -27, -10, + }, { + -82, 1, 4, 19, -6, 27, 6, 29, 12, 26, + -1, 24, 5, 18, -17, -17, -17, -6, -10, 0, + 7, 2, 9, 16, 12, -11, 0, -11, 9, -23, + 0, 3, 8, 8, 13, 1, -8, -7, 7, -6, + }, { + -60, -10, -7, 1, -9, 8, -6, 13, -2, 15, + 1, 10, 13, 11, -15, 0, -6, -9, 1, 0, + 13, -1, 11, 3, 13, -21, -13, -26, 7, -31, + 10, 7, 16, 33, 31, 10, -22, 8, -1, 2, + }, { + -3, 7, -5, -5, 8, -2, 17, -9, 18, -24, + -2, -19, -10, -4, 28, 17, 5, 28, -2, 7, + -4, 15, 7, 8, 6, 23, 13, 21, -14, 20, + -17, -18, -11, -33, -30, -11, 23, -13, -5, -9, + }, { + 18, -4, -17, -23, 4, -20, 4, -26, 3, -36, + 0, -32, -2, -12, 29, 34, 16, 24, 10, 6, + 0, 12, 8, -4, 8, 13, 0, 6, -16, 12, + -5, -13, -3, -7, -13, -3, 8, 2, -14, 0, + }, { + -13, 0, 8, -3, 0, 4, 21, 11, 9, -16, + -10, -18, -5, 16, 10, 16, -5, 15, -13, -5, + -15, -1, 6, -4, -6, 23, 2, 16, -17, 12, + -10, -44, -3, -33, -6, 12, 34, 1, 20, 3, + }, { + 8, -12, -3, -21, -3, -14, 8, -5, -4, -28, + -7, -32, 2, 8, 12, 34, 4, 12, -1, -6, + -9, -4, 7, -17, -4, 13, -11, 1, -19, 4, + 0, -39, 4, -7, 11, 21, 20, 16, 10, 11, + }, { + 4, 6, 0, 7, -8, -4, 0, -6, 9, -13, + 11, 7, 11, 15, 37, 4, 9, 5, -5, -11, + 5, 9, 22, 1, 27, 18, 4, 14, -5, 0, + -12, 3, -4, -32, -14, -12, 17, -22, -17, -11, + }, { + 26, -6, -11, -10, -12, -23, -12, -23, -5, -24, + 13, -5, 19, 8, 38, 21, 20, 2, 6, -12, + 11, 5, 23, -11, 29, 9, -9, 0, -7, -6, + -1, 7, 2, -7, 3, -3, 2, -6, -27, -3, + }, { + -6, -2, 14, 9, -16, 1, 3, 14, 0, -5, + 3, 8, 16, 36, 19, 3, -1, -6, -17, -24, + -4, -7, 21, -11, 14, 18, -7, 9, -9, -7, + -6, -22, 3, -33, 10, 11, 28, -7, 7, 0, + }, { + 16, -14, 2, -8, -20, -17, -9, -2, -14, -16, + 6, -5, 24, 28, 21, 20, 8, -9, -4, -25, + 1, -11, 22, -24, 15, 8, -21, -5, -11, -14, + 5, -18, 11, -7, 27, 20, 14, 7, -1, 9, + }, { + -16, 27, 2, 10, 13, 16, 20, -20, 29, -20, + -14, -16, -13, -8, 9, 13, -2, 33, 9, 19, + 17, 23, 17, 22, 6, 6, -9, -2, -12, -2, + -20, -13, -13, -10, -45, -4, 16, -8, -2, -7, + }, { + 5, 15, -9, -7, 9, -2, 8, -37, 14, -31, + -11, -29, -5, -16, 11, 30, 7, 29, 21, 18, + 23, 19, 18, 9, 7, -3, -23, -17, -14, -9, + -8, -9, -6, 15, -27, 4, 2, 6, -12, 1, + }, { + -26, 19, 15, 12, 5, 22, 24, 0, 21, -12, + -21, -15, -8, 11, -7, 12, -14, 20, -2, 6, + 7, 6, 16, 9, -6, 5, -21, -7, -15, -10, + -13, -39, -5, -10, -20, 19, 28, 5, 22, 5, + }, { + -4, 6, 3, -5, 1, 4, 11, -16, 6, -23, + -19, -29, 0, 3, -6, 30, -3, 17, 10, 5, + 13, 2, 17, -3, -5, -3, -35, -21, -17, -17, + -2, -35, 2, 15, -3, 28, 13, 21, 13, 13, + }, { + -8, 25, 8, 23, -3, 13, 3, -17, 20, -8, + 0, 10, 8, 11, 18, 0, 1, 10, 5, 0, + 28, 17, 32, 15, 26, 1, -19, -9, -3, -21, + -15, 7, -6, -9, -29, -5, 10, -17, -15, -9, + }, { + 13, 13, -3, 5, -7, -4, -9, -34, 5, -20, + 2, -3, 16, 3, 20, 17, 11, 7, 17, 0, + 34, 13, 33, 2, 28, -8, -32, -24, -5, -29, + -3, 12, 0, 15, -11, 3, -3, -2, -24, -1, + }, { + -18, 17, 21, 25, -11, 19, 6, 3, 11, 0, + -7, 11, 13, 31, 1, 0, -9, -1, -5, -12, + 18, 0, 31, 2, 13, 1, -30, -14, -7, -29, + -9, -18, 1, -10, -4, 18, 22, -3, 10, 2, + }, { + 3, 5, 9, 7, -15, 1, -5, -13, -2, -12, + -5, -2, 21, 23, 2, 16, 0, -5, 6, -13, + 23, -3, 32, -10, 15, -8, -44, -28, -9, -37, + 2, -13, 9, 15, 12, 27, 7, 12, 0, 11, + }, { + -44, 6, -30, -8, 9, 10, 11, 14, 23, -5, + 8, -4, 14, -12, 37, 14, 12, 26, 4, 16, + -8, 16, -9, 7, -6, 19, 12, 25, -5, 24, + -15, -13, -8, -36, -34, -31, -1, -18, -4, -18, + }, { + -22, -5, -42, -26, 6, -8, -1, -2, 9, -17, + 10, -18, 21, -19, 39, 31, 23, 23, 16, 15, + -2, 12, -7, -6, -5, 9, -1, 10, -7, 16, + -4, -9, 0, -10, -17, -22, -16, -2, -14, -9, + }, { + -55, -1, -17, -6, 1, 16, 15, 35, 15, 2, + 0, -4, 19, 8, 20, 13, 1, 14, -7, 3, + -18, 0, -10, -5, -19, 19, 0, 21, -8, 16, + -9, -39, 0, -36, -10, -7, 9, -4, 20, -5, + }, { + -33, -13, -29, -24, -1, -1, 2, 18, 0, -9, + 3, -17, 27, 0, 21, 30, 12, 11, 5, 2, + -12, -4, -9, -19, -18, 9, -13, 6, -11, 8, + 2, -35, 8, -10, 7, 1, -4, 11, 10, 2, + }, { + -36, 5, -24, 4, -7, 7, -6, 17, 14, 5, + 22, 22, 35, 8, 46, 1, 17, 3, 0, -2, + 2, 10, 5, 0, 14, 15, 2, 18, 2, 4, + -11, 7, -1, -36, -18, -32, -7, -27, -17, -20, + }, { + -14, -7, -36, -13, -10, -10, -18, 0, 0, -5, + 25, 8, 43, 0, 48, 18, 27, 0, 12, -3, + 7, 6, 7, -13, 15, 5, -11, 3, 0, -2, + 0, 12, 6, -10, 0, -23, -22, -11, -26, -12, + }, { + -47, -3, -11, 6, -15, 13, -2, 38, 6, 13, + 15, 22, 40, 28, 28, 0, 5, -8, -10, -15, + -7, -7, 4, -13, 1, 14, -9, 14, 0, -2, + -4, -18, 7, -36, 6, -8, 3, -13, 7, -8, + }, { + -25, -15, -22, -11, -18, -4, -15, 22, -8, 2, + 17, 9, 48, 20, 30, 17, 16, -11, 1, -16, + -2, -10, 5, -26, 2, 4, -22, 0, -2, -10, + 6, -13, 14, -10, 23, 0, -10, 2, -1, 0, + }, { + -57, 26, -22, 7, 14, 28, 14, 3, 35, 0, + -3, -1, 11, -16, 18, 10, 4, 31, 15, 28, + 14, 23, 1, 21, -7, 2, -11, 1, -3, 1, + -18, -9, -10, -13, -49, -24, -8, -14, -2, -16, + }, { + -35, 14, -34, -10, 10, 10, 1, -12, 20, -12, + 0, -15, 18, -24, 20, 27, 14, 28, 27, 27, + 20, 19, 2, 8, -5, -7, -25, -13, -5, -5, + -6, -5, -2, 12, -31, -15, -23, 1, -12, -8, + }, { + -68, 18, -9, 9, 6, 35, 18, 25, 26, 7, + -10, -1, 16, 3, 1, 9, -6, 19, 4, 15, + 4, 6, 0, 8, -20, 2, -23, -2, -7, -5, + -12, -35, -1, -13, -24, 0, 3, 0, 22, -4, + }, { + -46, 6, -21, -8, 2, 16, 5, 8, 11, -4, + -8, -15, 24, -4, 2, 26, 3, 16, 16, 14, + 9, 2, 1, -4, -19, -7, -36, -17, -9, -13, + 0, -31, 5, 12, -7, 8, -11, 15, 13, 4, + }, { + -49, 24, -16, 20, -2, 26, -2, 7, 25, 10, + 11, 25, 32, 3, 27, -2, 8, 8, 11, 9, + 24, 17, 16, 14, 13, -2, -20, -5, 4, -17, + -14, 12, -3, -13, -33, -25, -14, -23, -15, -19, + }, { + -27, 12, -28, 2, -6, 7, -15, -9, 11, -1, + 13, 11, 40, -4, 29, 14, 19, 5, 23, 8, + 30, 13, 17, 0, 14, -12, -34, -20, 2, -25, + -2, 16, 4, 12, -15, -16, -29, -7, -24, -10, + }, { + -60, 16, -3, 22, -10, 32, 0, 28, 17, 18, + 3, 25, 37, 23, 10, -3, -2, -3, 0, -3, + 14, 0, 14, 1, 0, -2, -32, -9, 1, -25, + -7, -13, 5, -13, -8, -1, -2, -8, 10, -6, + }, { + -38, 4, -15, 4, -14, 13, -12, 11, 2, 6, + 6, 11, 45, 16, 11, 13, 7, -6, 12, -4, + 20, -3, 16, -12, 1, -12, -46, -24, 0, -33, + 3, -9, 12, 12, 8, 7, -17, 6, 0, 2 + } +}; -static const signed short etable1[5120]={ -0x0026,0xfffc,0x000f,0xfffc,0x000e,0xfff3,0x000c,0xfff5, -0xfffe,0xfffa,0xfffa,0xfff5,0xffd3,0xfff0,0xfff5,0xfff3, -0xfff9,0x0006,0xfff4,0x0004,0xffec,0x0003,0xfff0,0x000c, -0xffff,0x000c,0x002e,0x0018,0x0000,0x0021,0xfffd,0x0009, -0xfff4,0xfff4,0xfff8,0xfff9,0x0011,0xfffa,0x0000,0xfffe, -0x003c,0xfff0,0x0003,0xffea,0x000a,0xffe0,0x0000,0xffe4, -0xffef,0xffee,0xfffd,0xffe7,0xffdb,0xffe9,0xfff6,0x0003, -0x0002,0x0003,0x0000,0x0003,0xfff2,0x0000,0xfff2,0xffff, -0x0000,0x0002,0x0020,0x0009,0xffff,0x0019,0x0007,0x000d, -0xfffb,0x000d,0x0008,0x0001,0x0002,0x0008,0xfff6,0x0006, -0x001b,0xfff4,0x001c,0xfffe,0x0006,0xfff9,0x000f,0x0009, -0xfff5,0x0001,0xfff3,0xfff5,0xffd8,0x0004,0xffe3,0xfff2, -0xffed,0xfffb,0xffe9,0xfff8,0xffe2,0xfff3,0xffef,0x0000, -0xfff2,0x000c,0x0022,0x0014,0xfffe,0x0019,0x0002,0xfff0, -0xfffc,0xfff4,0x000f,0x0010,0x001d,0x0007,0x0018,0x000a, -0x0031,0xffe8,0x0010,0xffec,0x0002,0xffe6,0x0002,0xfff9, -0xffe7,0xfff6,0xfff5,0xffe7,0xffe0,0xfffd,0xffe5,0x0002, -0xfff8,0xfff8,0xfff5,0xfff7,0xffe8,0xffef,0xfff0,0xfff2, -0xfff3,0x0002,0x0014,0x0005,0xfffc,0x0011,0x000e,0xfff4, -0x0003,0x000d,0x0021,0x0019,0x000e,0x0017,0x000f,0x0013, -0x002e,0xfffa,0x0015,0x0008,0xfffe,0xfff0,0xfffb,0xfff8, -0xfff5,0x0004,0x0008,0x000f,0xffe8,0x0004,0xfffe,0xffe6, -0xfffd,0xfff0,0xfff0,0xfff2,0xfff7,0xfffe,0xffff,0x0004, -0x0013,0x0007,0x0024,0x0011,0x0009,0x000d,0x0000,0x001f, -0xfffb,0xfff4,0x0007,0xfff8,0x000b,0xfff1,0xfff3,0xfffc, -0x0044,0xffee,0x0009,0xfff7,0xfffa,0xffdd,0xffee,0xffe7, -0xffe6,0xfff9,0x000a,0x0001,0xfff0,0xfffd,0xffff,0xfff7, -0x0006,0xffed,0xfffc,0xfff1,0xfffc,0xfffa,0x0000,0xfff8, -0x0014,0xfffe,0x0017,0x0002,0x0007,0x0005,0x000c,0x0023, -0x0001,0x000d,0x0018,0x0000,0xfffd,0x0000,0xffea,0x0004, -0x0023,0xfff2,0x0022,0x000a,0xfff6,0xfff6,0xffff,0x000c, -0xffec,0x000c,0x0000,0x000f,0xffee,0x0018,0xffec,0xffe5, -0xfff2,0xffe4,0xffe5,0xffe5,0xffec,0xffed,0xfffe,0xfff8, -0x0005,0x0007,0x0019,0x000d,0x0005,0x0005,0x0006,0x0005, -0x0002,0xfff4,0x001f,0x000f,0x0017,0xffff,0x000c,0x0008, -0x0039,0xffe6,0x0016,0xfff9,0xfff2,0xffe4,0xfff2,0xfffd, -0xffdd,0x0000,0x0003,0x0001,0xfff5,0x0010,0xffee,0xfff6, -0xfffc,0xffe1,0xfff1,0xffe4,0xfff2,0xffe9,0xffff,0xffeb, -0x0007,0xfffe,0x000b,0xffff,0x0003,0xffff,0x0012,0x0009, -0x000a,0x000d,0x0031,0x0018,0x0008,0x000e,0x0002,0x0010, -0x0019,0x000f,0x0016,0x000b,0x0012,0x0004,0x000f,0xffea, -0x0008,0xfffe,0xffef,0xfff7,0xffd0,0xffec,0xffe2,0xffef, -0xfff0,0x000b,0xffff,0x0010,0x0002,0x000a,0xfffb,0x001a, -0xfffe,0xfffc,0x0016,0x0000,0x0002,0x000a,0xfffa,0x000d, -0xfff2,0x000a,0xffe9,0x0000,0x000a,0xfffe,0x0001,0x0000, -0x002f,0x0003,0x000b,0xfffa,0x000f,0xfff3,0x0002,0xffda, -0xfffa,0xfff3,0xfff1,0xffea,0xffd8,0xffe4,0xffe4,0x0000, -0xfffb,0x0008,0x000a,0x000f,0x0007,0x0007,0xfffc,0x000d, -0xffff,0xfff2,0x0009,0xfff2,0x0000,0x0002,0x0004,0x0012, -0xfff9,0x0024,0xfffa,0x0008,0xfffd,0x000d,0xfff9,0x0008, -0x000e,0x0007,0x0024,0x000d,0x000a,0x000a,0x0012,0x0000, -0x0000,0x0005,0xffe7,0xfff8,0xffd5,0x0000,0xffd0,0xffee, -0xffe5,0x0000,0xfff4,0x0003,0xfff9,0xfffa,0xfff9,0x000d, -0xfff1,0xfffb,0x000b,0xfffd,0x0000,0x0002,0x0000,0xfff4, -0xfffa,0x000a,0x0000,0x0017,0x0016,0x000b,0x001a,0x000c, -0x0024,0xfffb,0x0018,0xfffc,0x0007,0xfff9,0x0006,0xffef, -0xfff2,0xfffb,0xffea,0xffea,0xffdd,0xfff8,0xffd2,0xffff, -0xffef,0xfffd,0x0000,0x0002,0xfffe,0xfff6,0xfffb,0x0000, -0xfff2,0xfff1,0xfffe,0xffee,0xfffe,0xfffc,0x000b,0xfff9, -0x0001,0x0024,0x0012,0x0020,0x0007,0x001b,0x0011,0x0014, -0x0021,0x000d,0x001d,0x0018,0x0001,0x0001,0xfffe,0xffee, -0x0000,0x0009,0xfffd,0x0011,0xffe5,0x0000,0xffeb,0xffe2, -0xfff4,0xfff5,0xfffb,0xfffe,0x000c,0x0004,0x0009,0x0013, -0x0012,0xfff7,0x000d,0xfffa,0x000b,0xfff8,0xfffe,0x0023, -0xfff8,0x000a,0xfff9,0xffff,0x0004,0xfff5,0xfff6,0xfffe, -0x0037,0x0001,0x0011,0x0006,0xffff,0xfff0,0xfff1,0xffdd, -0xfff1,0xfffe,0x0000,0x0004,0xffed,0xfff8,0xffec,0xfff3, -0xffff,0xfff2,0x0007,0xfffd,0x0012,0x0000,0x000a,0x0005, -0x0013,0xffed,0x0000,0xffeb,0x0008,0xfff0,0x0009,0x0027, -0x0000,0x0024,0x000a,0x0007,0xfff7,0x0004,0xffec,0x0005, -0x0016,0x0005,0x002a,0x001a,0xfffa,0x0008,0x0001,0x0002, -0xfff7,0x0011,0xfff6,0x0012,0xffeb,0x0013,0xffd9,0xffe1, -0xffe9,0xffe9,0xfff0,0xfff1,0x0002,0xfff4,0x0007,0x0006, -0x0005,0xfff7,0x0001,0xfff6,0x0007,0xfff0,0x0004,0x0009, -0x0000,0x000a,0x0011,0x0016,0x0010,0x0002,0x000e,0x0009, -0x002c,0xfffa,0x001e,0x0008,0xfff7,0xfff6,0xfff5,0xfff2, -0xffe9,0x0005,0xfff8,0x0004,0xfff2,0x000c,0xffdb,0xfff2, -0xfff4,0xffe6,0xfffc,0xfff0,0x0008,0xfff0,0x0009,0xfff9, -0x0006,0xffed,0xfff4,0xffe7,0x0005,0xffe8,0x000f,0x000d, -0x0008,0x0024,0x0022,0x001f,0x0001,0x0012,0x0004,0x0012, -0xfffd,0xfffb,0xfff7,0xfff9,0x000f,0xffff,0x0005,0x000d, -0x0002,0x000c,0x0005,0x0002,0xffeb,0xffe9,0xfffe,0xfff0, -0x0000,0x0005,0xfffa,0x000d,0xffe9,0x0003,0xffe0,0x000a, -0xfff1,0x0008,0x002c,0x001c,0x0009,0x0025,0xfffe,0x000d, -0xfff7,0xfff1,0xfff4,0xffe5,0xfff9,0xfff4,0x0000,0xfff5, -0x0012,0xffef,0xffeb,0xffe7,0x000b,0xffed,0xfffa,0xfffd, -0xfff5,0x0000,0x0007,0xfff5,0xfff3,0xffe1,0xffff,0x0000, -0x0009,0x0001,0x0005,0x000c,0xffee,0x0000,0xffe1,0xfffe, -0xfff3,0xffff,0x001e,0x000e,0x0007,0x001d,0x0009,0x0012, -0xffff,0x000a,0x0004,0xffee,0xffea,0x0003,0xfff6,0xfffe, -0xfff3,0xfff3,0x0003,0xfffb,0x0007,0x0004,0x0009,0x0022, -0xfffb,0x0014,0xfffe,0x0003,0xfff0,0xfffd,0xffec,0xffef, -0xfff5,0xfff9,0xffef,0x0000,0xffde,0xfff3,0xffdf,0xfffe, -0xffe4,0x0008,0x0020,0x0018,0x0005,0x001d,0x0003,0xfff4, -0x0000,0xfff1,0x000b,0xfffd,0x0003,0x0002,0x0018,0x0001, -0x0008,0xffe7,0xfff8,0xffe9,0x0003,0xfff3,0xfffd,0x0011, -0xffec,0x0008,0x0000,0xfff6,0xfff8,0xfff5,0xffee,0x0000, -0xffff,0xfff6,0xfffb,0x0000,0xffe4,0xffef,0xffe0,0xfff1, -0xffe6,0xffff,0x0013,0x0009,0x0003,0x0015,0x000f,0xfff9, -0x0006,0x0009,0x001d,0x0005,0xfff6,0x0011,0x000f,0x0009, -0x0004,0xfffa,0xfffd,0x0005,0xffff,0xfffc,0xfff5,0x0010, -0xfffa,0x0017,0x0013,0x001d,0x0000,0xfffd,0x0006,0xffe2, -0x0003,0xffef,0xfff6,0xfffb,0xfff3,0xfffe,0xffef,0x0003, -0x0005,0x0003,0x0023,0x0015,0x0011,0x0011,0x0002,0x0023, -0xfffe,0xfff1,0x0003,0xffe4,0xfff3,0xffeb,0xfff3,0xfff3, -0x001a,0xffed,0xfff1,0xfff4,0xfffb,0xffea,0xffe8,0x0000, -0xffeb,0x000c,0x0015,0x000f,0x0008,0xfff5,0x0007,0xfff4, -0x000e,0xffec,0x0002,0xfffa,0xfff9,0xfffa,0xfff0,0xfff7, -0x0006,0xfffb,0x0015,0x0007,0x000f,0x000a,0x000d,0x0027, -0x0005,0x000a,0x0014,0xffed,0xffe4,0xfffb,0xffea,0xfffb, -0xfffb,0xfff1,0x0009,0x0007,0xfff7,0x0002,0xfff8,0x0025, -0xfff2,0x001f,0x000b,0x001d,0x0005,0x0010,0xfff5,0xffe2, -0xfff9,0xffe3,0xffeb,0xffee,0xffe9,0xffed,0xffee,0xfff7, -0xfff9,0x0003,0x0017,0x0011,0x000e,0x0009,0x0008,0x0009, -0x0006,0xfff1,0x001b,0xfffc,0xfffe,0xfffa,0x000c,0xffff, -0x0010,0xffe5,0xfffe,0xfff6,0xfff3,0xfff0,0xffec,0x0014, -0xffe3,0x0014,0x000e,0x0010,0x000d,0x0008,0xfff7,0xfff3, -0x0002,0xffdf,0xfff7,0xffed,0xffef,0xffe9,0xffef,0xffea, -0xfffa,0xfffa,0x0009,0x0002,0x000c,0x0002,0x0014,0x000d, -0x000d,0x000a,0x002d,0x0004,0xfff0,0x0008,0x0002,0x0007, -0xfff0,0x000e,0xfffe,0x0008,0x0014,0x0011,0x0009,0x0002, -0x000e,0x0010,0xfffa,0x0005,0xffe8,0xffe4,0xffeb,0xffec, -0xfff8,0x0009,0x0004,0x0019,0xffff,0x000b,0xffea,0x0018, -0xfff1,0xfff8,0x0015,0x0005,0x000b,0x000e,0xfffb,0x0012, -0xfff5,0x0007,0xffe5,0xffec,0xfff2,0xfff9,0x0001,0xfff7, -0x0006,0x0002,0xfff2,0xfff7,0x0010,0xffff,0xfffd,0xfff2, -0x0000,0x0005,0xfffd,0xfff8,0xfff0,0xffdc,0xffed,0xfffd, -0x0001,0x0006,0x0011,0x0018,0x0004,0x0007,0xffeb,0x000b, -0xfff2,0xffee,0x0007,0xfff7,0x0009,0x0007,0x0006,0x0016, -0xfffd,0x0021,0xfff6,0xfff5,0xffe4,0x0007,0xfff9,0x0000, -0xffe6,0x0006,0x000b,0x000a,0x000c,0x0017,0x000c,0x0017, -0x0005,0x0018,0xfff3,0x0005,0xffed,0xfff8,0xffda,0xffeb, -0xffec,0xfffe,0xfffa,0x000c,0xfff5,0xfffb,0xffe9,0x000b, -0xffe3,0xfff7,0x0009,0x0000,0x0007,0x0006,0x0001,0xfff9, -0xfffe,0x0007,0xfffd,0x0003,0xfffe,0x0006,0x001b,0x0003, -0xfffc,0xfffa,0x0000,0xfff9,0x0008,0x0004,0x0000,0x0006, -0xfff7,0x000d,0xfff5,0xfff9,0xfff5,0xfff1,0xffdb,0xfffc, -0xfff7,0xfffb,0x0005,0x000b,0xfffb,0xfff7,0xffea,0xffff, -0xffe5,0xffee,0xfffc,0xfff2,0x0005,0x0000,0x000c,0xfffd, -0x0004,0x0020,0x000e,0x000c,0xffef,0x0016,0x0011,0x000b, -0xfff8,0x000c,0x0003,0x0015,0x0003,0x000e,0xfff8,0x0005, -0x0004,0x001c,0x0007,0x0020,0xfffe,0xfff8,0xfff4,0xffde, -0xfffc,0xfff4,0x0001,0x0006,0x0009,0x0004,0xfff9,0x0011, -0x0004,0xfff3,0x000b,0xffff,0x0013,0xfffc,0x0000,0x0027, -0xfffc,0x0007,0xfff5,0xffeb,0xffec,0xfff0,0xfff6,0xfff5, -0x000d,0x0000,0xfff8,0x0003,0x0000,0xfffc,0xffeb,0xfff5, -0xfff7,0x0010,0x000a,0x0012,0x0005,0xfff0,0xfff6,0xfff0, -0x0005,0xfff1,0x000d,0x0005,0x000f,0x0001,0xfffa,0x0004, -0x0006,0xffe9,0xfffe,0xfff0,0x0011,0xfff4,0x000a,0x002c, -0x0003,0x0021,0x0006,0xfff4,0xffde,0xffff,0xffec,0xfffd, -0xffee,0x0004,0x0011,0x0017,0xfffc,0x0014,0xfffc,0x001a, -0xfffd,0x0024,0x0000,0x0020,0x0002,0x000c,0xffe3,0xffde, -0xfff0,0xffe8,0xfff6,0xfffa,0x0000,0xfff4,0xfff8,0x0004, -0xfff8,0xfff3,0x0000,0xfffa,0x0010,0xfff4,0x0005,0x000d, -0x0003,0x0007,0x000d,0x0003,0xfff8,0xfffe,0x000e,0x0000, -0x0003,0xfff9,0x0005,0x0005,0xfff8,0x0002,0xffef,0x0009, -0xffee,0x0018,0x0002,0x0013,0x000a,0x0004,0xffe4,0xffef, -0xfffb,0xffe4,0x0002,0xfff9,0x0004,0xfff1,0xfff9,0xfff8, -0xfffa,0xffe9,0xfff3,0xffeb,0x000e,0xffec,0x0011,0x0012, -0x000b,0x0021,0x001e,0x000b,0xffe9,0x000d,0x0005,0x0009, -0x003c,0x000a,0x0007,0xffff,0x0009,0xfff8,0x0006,0xfff3, -0x0002,0xfff1,0xffff,0xfff6,0xfff3,0xfff5,0x000f,0x0000, -0x0006,0x0009,0xffff,0x0000,0xfff3,0x0001,0xfff5,0xfffd, -0xfff3,0x0015,0x000d,0x001a,0xfff9,0x001f,0xfff6,0xfff9, -0xfff0,0xffdf,0xffe1,0xfff6,0x0016,0xfff8,0x0001,0xfffe, -0x0052,0xffff,0xfffc,0xffed,0x0006,0xffe5,0xfffa,0xffe3, -0xfff4,0xffe6,0x0001,0xffe8,0xfffb,0xffee,0x0011,0x0011, -0x0011,0x0006,0x000a,0x0000,0xfff9,0xfffe,0xfff7,0xfff0, -0xfff4,0x000b,0x0000,0x000b,0xfff7,0x0017,0x0000,0xfffd, -0xfff8,0xfff8,0xfff3,0xffff,0x0008,0x0007,0xfff9,0x0006, -0x0031,0x0002,0x0015,0x0000,0x0001,0xfffe,0x0009,0x0008, -0xfffa,0xfffa,0xfff8,0xfff6,0xfff8,0x0009,0xfffe,0x0000, -0xfffc,0xfffe,0xfff3,0xfff4,0xffe9,0xfff1,0xfff4,0xfff0, -0xffe6,0x0015,0x0002,0x0015,0xfff5,0x0017,0xfffc,0xffdf, -0xfff9,0xffdf,0xfffa,0x000d,0x0022,0x0005,0x001b,0x000a, -0x0047,0xfff6,0x0009,0xffef,0xffff,0xffec,0xfffd,0xfff8, -0xffeb,0xffee,0xfffa,0xffe8,0x0000,0x0001,0x0000,0x0010, -0x0006,0xfffb,0x0000,0xfff3,0xffef,0xffed,0xfff5,0xffe3, -0xffe7,0x000b,0xfff5,0x0006,0xfff3,0x000f,0x0007,0xffe3, -0x0000,0xfff8,0x000b,0x0016,0x0014,0x0015,0x0011,0x0012, -0x0043,0x0008,0x000e,0x000b,0xfff9,0xfff5,0xfff5,0xfff7, -0xfff9,0xfffd,0x000d,0x0010,0x0008,0x0009,0x0018,0xfff4, -0x000a,0xfff3,0xfffb,0xffef,0xfffe,0xfffc,0x0003,0xfff6, -0x0006,0x0011,0x0004,0x0013,0x0000,0x000b,0xfffa,0x000d, -0xfff7,0xffdf,0xfff2,0xfff6,0x0010,0xffef,0xfff6,0xfffc, -0x005a,0xfffd,0x0002,0xfffa,0xfff6,0xffe3,0xffe8,0xffe6, -0xffeb,0xfff1,0x000f,0x0002,0x0010,0x0001,0x0019,0x0004, -0x0015,0xfff0,0x0006,0xffee,0x0003,0xfff8,0x0005,0xffe8, -0x0008,0x0007,0xfff7,0x0004,0xffff,0x0003,0x0005,0x0012, -0xffff,0xfff9,0x0002,0xffff,0x0002,0xffff,0xffed,0x0003, -0x0039,0x0000,0x001b,0x000d,0xfff2,0xfffb,0xfff9,0x000b, -0xfff1,0x0004,0x0005,0x0010,0x000d,0x001d,0x0006,0xfff3, -0x0000,0xffe7,0xfff0,0xffe1,0xfff4,0xffea,0x0002,0xffe9, -0xfffa,0x0010,0xfff9,0x000e,0xfffe,0x0003,0x0000,0xfff4, -0x0000,0xffdf,0x0009,0x000d,0x001c,0xfffd,0x000e,0x0007, -0x004f,0xfff5,0x000f,0xfffc,0xffee,0xffe9,0xffec,0xfffb, -0xffe2,0xfff9,0x0007,0x0002,0x0015,0x0015,0x0008,0x0003, -0x000a,0xffe4,0xfffc,0xffe1,0xfffa,0xffe7,0x0003,0xffdb, -0xfffc,0x0007,0xffec,0x0000,0xfffc,0xfffc,0x000b,0xfff9, -0x0006,0xfff8,0x001b,0x0016,0x000e,0x000c,0x0005,0x0010, -0x002f,0x001e,0x000f,0x000e,0x000e,0x0009,0x0009,0xffe9, -0x000d,0xfff6,0xfff4,0xfff9,0xfff0,0xfff1,0xfffd,0xfffd, -0xffff,0x000e,0x0009,0x000c,0x0009,0x0008,0x0000,0x000a, -0xfff2,0x0004,0xfff7,0x0002,0xfffb,0x0008,0xfff3,0xfffd, -0xffee,0xfff6,0xffd3,0xfffd,0x0010,0xfffc,0x0004,0x0000, -0x0045,0x0011,0x0003,0xfffd,0x000a,0xfff8,0xfffd,0xffd8, -0xffff,0xffeb,0xfff6,0xffeb,0xfff8,0xffe9,0xffff,0x000d, -0x0008,0x000b,0x0015,0x000b,0x000f,0x0004,0x0000,0xfffe, -0xfff3,0xfffb,0xffe9,0xfff4,0xfff9,0x0000,0xffff,0x0000, -0xfff6,0x000e,0xffe4,0x0005,0x0001,0x000b,0xfffb,0x0007, -0x0024,0x0015,0x001c,0x0010,0x0006,0x0010,0x000c,0xfffe, -0x0004,0xfffe,0xffec,0xfff9,0xfff5,0x0004,0xffec,0xfffc, -0xfff4,0x0002,0xffff,0x0000,0x0000,0xfff8,0xfffe,0xfffe, -0xffe5,0x0004,0xffeb,0xfffe,0xfff7,0x0000,0xfffa,0xffe3, -0xfff7,0xfff6,0xffeb,0x0015,0x001c,0x000a,0x001d,0x000b, -0x003a,0x0009,0x0010,0xffff,0x0002,0xfffe,0x0000,0xffed, -0xfff6,0xfff3,0xffef,0xffeb,0xfffd,0xfffd,0xffed,0x000c, -0xfffe,0x0000,0x000a,0xffff,0x0005,0xfff4,0x0000,0xfff1, -0xffe6,0xfffb,0xffde,0xfff0,0xfff5,0xfff9,0x0004,0xffe7, -0xfffe,0x000e,0xfffd,0x001d,0x000d,0x0019,0x0014,0x0014, -0x0037,0x001c,0x0015,0x001b,0xfffe,0x0007,0xfff8,0xffec, -0x0004,0x0001,0x0001,0x0012,0x0005,0x0004,0x0005,0xfff0, -0x0002,0xfff8,0x0005,0xfffb,0x0013,0x0002,0x000e,0x0003, -0x0006,0x0000,0xffee,0xfffc,0x0002,0xfff5,0xfff8,0x0012, -0xfff5,0xfff6,0xffe3,0xfffd,0x000a,0xfff3,0xfff8,0xfffd, -0x004d,0x0010,0x0009,0x0009,0xfffa,0xfff5,0xffeb,0xffdb, -0xfff6,0xfff6,0x0004,0x0005,0x000d,0xfffd,0x0007,0x0000, -0x000d,0xfff5,0x0011,0xfffa,0x0019,0xffff,0x000f,0xfff7, -0x0007,0xfff7,0xffe0,0xffed,0x0000,0xffee,0x0002,0x0016, -0xfffd,0x000f,0xfff4,0x0005,0xfffc,0x0002,0xffef,0x0005, -0x002c,0x0014,0x0022,0x001d,0xfff6,0x000d,0xfffc,0x0000, -0xfffc,0x0009,0xfffb,0x0013,0x000a,0x0018,0xfff5,0xffef, -0xfff8,0xffec,0xfffb,0xffed,0x0009,0xfff2,0x000c,0xfff7, -0xfffa,0x0000,0xffe2,0xfff7,0x0000,0xffed,0xfffe,0xfff9, -0xfffe,0xfff6,0xfffb,0x0014,0x0015,0x0001,0x0011,0x0009, -0x0042,0x0008,0x0017,0x000b,0xfff2,0xfffb,0xffef,0xfff0, -0xffed,0xfffe,0xfffd,0x0005,0x0012,0x0011,0xfff6,0x0000, -0x0001,0xffe9,0x0006,0xffec,0x000f,0xffee,0x000e,0xffea, -0xfffb,0xfff6,0xffd4,0xffe9,0xfffe,0xffe6,0x0009,0xfffd, -0x0004,0x000e,0x000c,0x001d,0x0007,0x0010,0x0007,0x0012, -0x0012,0x0009,0xffef,0xfffc,0x000b,0x0003,0x0000,0x000b, -0x0007,0x0004,0x000a,0x0003,0x000a,0xffee,0x0018,0xfffd, -0x000e,0x0007,0x0004,0x000a,0xfff0,0x0001,0xffe5,0xfffc, -0xffe5,0x0011,0x000c,0x001e,0x0000,0x0023,0xfff7,0xfffd, -0xfff4,0xffdc,0xffdd,0xffe2,0xfffe,0xfff3,0x0002,0xfff5, -0x0028,0xfffe,0xffe3,0xffea,0x0007,0xfff2,0xfff4,0xfffb, -0xfff9,0xfff9,0x000c,0xfff7,0x0012,0xffe6,0x001a,0x000e, -0x0018,0x0004,0x0010,0x0009,0xfff6,0xfffe,0xffe6,0xffee, -0xffe6,0x0007,0xffff,0x000f,0xffff,0x001b,0x0002,0x0000, -0xfffc,0xfff5,0xffef,0xffeb,0xfff0,0x0001,0xfff9,0xfffd, -0x0008,0x0001,0xfffd,0xfffe,0x0003,0x000a,0x0003,0x0020, -0xffff,0x000c,0x0002,0x0004,0x000f,0x0001,0x0007,0xfffd, -0x0002,0xfffc,0xfffa,0xfffd,0xffe6,0xfff1,0xffe3,0xffef, -0xffd8,0x0011,0x0000,0x001a,0xfffe,0x001b,0xfffe,0xffe3, -0xfffc,0xffdc,0xfff6,0xfffa,0x0009,0x0000,0x001b,0x0000, -0x001e,0xfff5,0xfff1,0xffec,0x0000,0xfff8,0xfff7,0x000f, -0xfff1,0x0000,0x0005,0xfff7,0x0017,0xfffa,0x0008,0x000d, -0x000d,0xfff9,0x0005,0xfffd,0xffec,0xffed,0xffe5,0xffe1, -0xffd9,0x0007,0xfff3,0x000b,0xfffc,0x0013,0x0008,0xffe7, -0x0003,0xfff5,0x0007,0x0002,0xfffc,0x0010,0x0012,0x0009, -0x001a,0x0007,0xfff5,0x0008,0xfffb,0x0001,0xffef,0x000e, -0xffff,0x000f,0x0018,0x001e,0x0020,0x0001,0x0021,0xfff0, -0x0012,0xfff2,0x0000,0xfff8,0xfffa,0xfffc,0xfff4,0xfff4, -0xfffa,0x000d,0x0002,0x0017,0x0008,0x000f,0xfffc,0x0011, -0xfffb,0xffdc,0xffee,0xffe2,0xfff8,0xffea,0xfff6,0xfff2, -0x0030,0xfffc,0xffe9,0xfff7,0xfff7,0xffef,0xffe2,0xfffe, -0xfff0,0x0003,0x001a,0x0010,0x0028,0xfffa,0x0023,0x0001, -0x001c,0xffef,0x000c,0xfff7,0x0000,0xfff8,0xfff5,0xffe7, -0xfffb,0x0003,0xfff6,0x0008,0x0006,0x0007,0x0006,0x0016, -0x0001,0xfff5,0xffff,0xffeb,0xffea,0xfff9,0xffed,0xfffb, -0x000f,0x0000,0x0002,0x000a,0xfff3,0x0007,0xfff2,0x0023, -0xfff6,0x0017,0x0010,0x001f,0x0025,0x0015,0x0010,0xffef, -0x0006,0xffe6,0xfff6,0xffeb,0xfff0,0xffeb,0xfff3,0xffe7, -0xffed,0x000d,0xfff8,0x0013,0x0005,0x0007,0x0001,0xfff8, -0x0002,0xffdc,0x0005,0xfffa,0x0003,0xfff8,0x000f,0xffff, -0x0025,0xfff4,0xfff7,0xfff9,0xffef,0xfff5,0xffe6,0x0012, -0xffe7,0x000c,0x0013,0x0011,0x002d,0x000e,0x0011,0x0000, -0x0011,0xffe2,0x0001,0xffea,0xfff6,0xffe7,0xfff4,0xffda, -0xffee,0x0003,0xffea,0x0004,0x0003,0x0000,0x000d,0xfffd, -0x000a,0xfff5,0x0017,0x0002,0xfff6,0x0007,0x0005,0x0007, -0x0005,0x001d,0xfff7,0x000b,0x000f,0x0016,0x0003,0x0000, -0x0012,0x0008,0xffff,0x0006,0x0007,0xffe9,0x0006,0xfffa, -0x0005,0x000c,0x000f,0x0015,0x0005,0x0008,0xffef,0x0009, -0xffe4,0x0000,0xfff5,0x0006,0x0002,0x000c,0xfff5,0x0000, -0xfff2,0xfff3,0xffcf,0xffea,0xfff8,0xfff7,0x0004,0xfff7, -0x001b,0x0010,0xffeb,0xfffa,0x000c,0x0003,0xfff7,0xfff0, -0x0003,0xfffe,0x0001,0xfff9,0x000f,0xffe1,0x0007,0x000a, -0x0010,0x0009,0x001b,0x0015,0x000b,0x0005,0xfff0,0xfffd, -0xffe6,0xfff7,0xffe8,0xfff9,0x0000,0x0004,0x0000,0x0004, -0xfffa,0x000b,0xffe0,0xfff2,0xffe9,0x0006,0xfffb,0xffff, -0xfffc,0x0014,0x0003,0x000d,0x0008,0x001c,0x0006,0x0015, -0x000a,0x0010,0xfff8,0x0007,0x000c,0xfffd,0xfff5,0xfff9, -0xfffb,0x0000,0x0004,0x0008,0xfffc,0xfff8,0xffee,0xfffd, -0xffd7,0x0000,0xffea,0x0002,0x0000,0x0004,0xfffb,0xffe7, -0xfffa,0xfff2,0xffe7,0x0001,0x0002,0x0004,0x001d,0x0002, -0x0011,0x0008,0xfff8,0xfffc,0x0004,0x000a,0xfffa,0x0005, -0xfffc,0x0005,0xfffa,0xfffa,0x0014,0xfff6,0xfff7,0x0009, -0x0004,0xfffe,0x0010,0x0007,0x0001,0xfff4,0xffef,0xfff0, -0xffd9,0xfff7,0xffdc,0xfff4,0xfffe,0xfffd,0x0006,0xffeb, -0x0001,0x000b,0xfff9,0x000a,0xfff5,0x0014,0x0014,0x000b, -0x000d,0x001b,0xfffd,0x0018,0xffff,0x0013,0xfff2,0x0003, -0x0009,0x0014,0x000c,0x0021,0x001d,0xfffd,0x000f,0xffec, -0x0009,0xfff7,0x000b,0x0003,0x0010,0x0002,0xfffe,0x0002, -0xfff9,0xfffd,0xffec,0x0000,0x000a,0xfff9,0xfff9,0x0016, -0xfff9,0xfff3,0xffdf,0xffe9,0xfff2,0xffee,0xfff9,0xfff4, -0x0023,0x000f,0xfff1,0x0006,0xfffc,0x0001,0xffe5,0xfff4, -0xfffb,0x0008,0x000f,0x0013,0x0025,0xfff5,0x0010,0xfffe, -0x0014,0xfff4,0x0017,0x0002,0x0016,0xffff,0xffff,0xfff5, -0xfffb,0xfff3,0xffde,0xfff2,0x0008,0xfff2,0x0004,0x001a, -0x0000,0x000b,0xfff0,0xfff2,0xffe3,0xfffe,0xffef,0xfffd, -0x0003,0x0013,0x0009,0x001a,0xfff8,0x001a,0xfff6,0x0018, -0x0000,0x001c,0x0005,0x0021,0x0022,0x0011,0xfffe,0xffec, -0xffff,0xffea,0x0000,0xfff6,0x0006,0xfff2,0xfffd,0xfff6, -0xffec,0xfffc,0xffe0,0xfffc,0x0007,0xfff1,0x0000,0xfffd, -0x0000,0xfff3,0xfff7,0x0000,0xfffd,0xfffc,0x0011,0x0000, -0x0019,0x0007,0xfffe,0x0008,0xfff4,0x0007,0xffe9,0x0008, -0xfff3,0x0010,0x0007,0x0014,0x002a,0x0009,0x0000,0xfffd, -0x0009,0xffe7,0x000c,0xfff6,0x000c,0xffee,0xfffe,0xffe8, -0xffed,0xfff3,0xffd2,0xffed,0x0005,0xffea,0x000a,0x0000, -0x0008,0x000b,0x0008,0x0009,0xffef,0x000b,0x0007,0x0008, -0xffe7,0xfff9,0x0002,0xfff8,0x000c,0xfff9,0x0017,0xfff8, -0x000d,0xfff0,0xfff9,0xffec,0xffd6,0xfff7,0x0000,0x0003, -0xfff7,0x0019,0xfff4,0x000a,0xfff4,0x0012,0x0002,0x0018, -0x0013,0x000d,0x002e,0x0013,0xfffb,0x0016,0xfff6,0x0000, -0xfff8,0xfff5,0xfff8,0xfff7,0x0011,0xfff5,0xfff9,0xfff8, -0xfffd,0xffed,0xfff7,0xffe6,0x0008,0xffe6,0x000a,0xffe8, -0x0000,0xffe4,0xfffb,0xffdf,0xffde,0xffef,0x0002,0x0014, -0x0001,0x0016,0x0000,0x000a,0xfffa,0x000e,0x0003,0x000a, -0x0014,0x0004,0x0020,0x0004,0xfff9,0x000f,0x0000,0x0003, -0x0000,0x000d,0x0009,0x0000,0x0003,0x0004,0xffef,0x0000, -0xffdd,0xfff1,0x000f,0xfffa,0x0004,0xffff,0x001b,0x000c, -0x0005,0xfff8,0xfff1,0xffed,0xffdb,0x000b,0xfff0,0x0002, -0xffec,0x000c,0xffe9,0xfffe,0xffea,0x0001,0x0001,0x000b, -0x0005,0x000d,0x0022,0x000e,0xfff8,0x000e,0xfffc,0xffe6, -0x0000,0xfff5,0x0010,0x000e,0x001d,0x0002,0x0011,0x0003, -0xfff3,0xffe5,0x0003,0xffe8,0x0001,0xffed,0x000e,0xfffd, -0xfff7,0xffec,0xfff4,0xffdf,0xffe3,0x0003,0xfff1,0x0014, -0xfff7,0x0009,0xfff5,0xfffd,0xfff0,0xfffe,0x0002,0xfffe, -0x0007,0x0003,0x0014,0x0000,0xfff6,0x0007,0x0007,0xffea, -0x0007,0x000d,0x0021,0x0017,0x000e,0x0012,0x0007,0x000c, -0xffef,0xfff8,0x0008,0x0004,0xfffc,0xfff6,0x0006,0xfffb, -0x0004,0xfffb,0x0006,0x0006,0xffec,0x000a,0x0009,0xfff7, -0xfffc,0x0002,0xfff0,0xfff9,0xffff,0x000c,0x0011,0x0010, -0x0027,0x0009,0x0024,0x000c,0x0002,0x0003,0xfffa,0x0015, -0xffff,0xfff5,0x0007,0xfff6,0x000b,0xffec,0xffec,0xfff5, -0x0004,0xffec,0xfffd,0xfff3,0xfff8,0xffe4,0xfffa,0xffeb, -0xfff6,0xfff0,0x0008,0xfff9,0xfff4,0x0003,0x000b,0x0007, -0x0005,0x0000,0xfffc,0xfff8,0x0004,0x0008,0x0012,0x0003, -0x0029,0x0000,0x0016,0xfffe,0x0000,0xfffc,0x0005,0x0019, -0x0006,0x000e,0x0019,0xffff,0xfffe,0xfffc,0xffe3,0xfffe, -0xffe5,0xfff0,0x0015,0x0006,0xfff4,0xfffd,0x0009,0x0010, -0xfffd,0x0002,0xffff,0x0007,0xfff1,0x001f,0xfff9,0xfff6, -0xfff0,0xfff7,0xffe5,0xffeb,0xfff5,0xfffb,0x0010,0x0003, -0x001a,0x0009,0x0018,0x0007,0x0000,0xfffc,0x0000,0xfffc, -0x0006,0xfff5,0x0020,0x000e,0x0017,0xfffa,0x0005,0x0001, -0xfffb,0xffe3,0x0009,0xfff5,0xfff1,0xffea,0xfffd,0x0000, -0xffee,0xfff8,0x0001,0xfffa,0xfff9,0x0017,0xfffa,0x0006, -0xfffb,0xfff4,0xfff1,0xffeb,0xfffb,0xfff8,0x0011,0xfff7, -0x001c,0x0000,0x000b,0xfffa,0xfffe,0xfff4,0x000b,0x0000, -0x000e,0x000d,0x0031,0x0016,0x0008,0x0009,0xfffc,0x0009, -0xffdb,0x000c,0x0009,0x0007,0x0011,0x000b,0x001a,0xffee, -0x0019,0xfff4,0xffed,0xffef,0xffd3,0xfff2,0xffef,0x0000, -0xffef,0x001e,0xffff,0x0016,0x000a,0x0019,0x000c,0x0026, -0x0012,0xfffd,0x0016,0xfffc,0xfffd,0x0000,0xfff3,0x0003, -0xfff6,0x000b,0xffe9,0xfffe,0x000a,0xfff9,0xfffb,0xfff9, -0xfff1,0x0000,0xfffe,0xfff6,0x000d,0xfff9,0x000e,0xffdd, -0x000a,0xffe9,0xfff0,0xffe1,0xffdb,0xffeb,0xfff0,0x0011, -0xfffa,0x001a,0x000a,0x0015,0x0010,0x0015,0x000d,0x0019, -0x0013,0xfff3,0x0008,0xffed,0xfffb,0xfff9,0xffff,0x0008, -0xfffe,0x0024,0xfffb,0x0006,0xfffd,0x0008,0xfff1,0x0001, -0xffd0,0x0004,0x0017,0x0009,0x0009,0x0011,0x001e,0x0002, -0x0010,0xfffd,0xffe6,0xfff0,0xffd8,0x0006,0xffdd,0xffff, -0xffe4,0x0011,0xfff4,0x0009,0x0000,0x0008,0x000b,0x0019, -0x0005,0xfffd,0x000a,0xfff8,0xfffa,0xfff9,0xfffa,0xffea, -0xffff,0x000b,0x0001,0x0015,0x0016,0x0007,0x0013,0x0005, -0xffe6,0xfff9,0x000b,0xfff8,0x0005,0xffff,0x0011,0xfff2, -0x0001,0xfff1,0xffe8,0xffe2,0xffe0,0xffff,0xffdf,0x0010, -0xffee,0x000e,0x0000,0x0008,0x0006,0x0004,0x000c,0x000c, -0x0006,0xfff3,0xfffe,0xffe9,0xfff8,0xfff1,0x0004,0xffef, -0x0005,0x0024,0x0012,0x001e,0x0008,0x0016,0x000a,0x000e, -0xffe2,0x000b,0x000f,0x0014,0x0000,0x0008,0x0009,0xfff1, -0x000f,0x0000,0xfffb,0x0009,0xffe9,0x0006,0xfff8,0xfff3, -0xfff3,0x0007,0xfffb,0x0003,0x0014,0x0013,0x001b,0x001f, -0x0027,0xfff9,0x000d,0xfff5,0x0004,0xffed,0xfff8,0x0019, -0xfffd,0x000b,0xfff9,0xfffe,0x0004,0xfff0,0xffee,0xfff7, -0xfff8,0xffff,0x0003,0x0002,0xfffd,0xfff6,0xfffd,0xffe0, -0x0001,0xfff4,0xfffe,0xfffc,0xfff1,0xffff,0xfff9,0x0003, -0xfffe,0x0004,0x0006,0x0003,0x001a,0x000f,0x001d,0x0011, -0x0028,0xffef,0x0000,0xffe6,0x0002,0xffe5,0x0002,0x001d, -0x0004,0x0024,0x000a,0x0006,0xfff7,0x0000,0xffe5,0x0000, -0xffd8,0x0002,0x001d,0x0016,0xfff9,0x000e,0x000c,0x0005, -0x0007,0x0007,0xfff4,0x0009,0xffee,0x001a,0xffe6,0xfff2, -0xffe8,0xfffc,0xfff0,0xfff7,0x000a,0x0002,0x001a,0x0012, -0x001a,0xfff9,0x0001,0xfff1,0x0001,0xffe5,0xfffe,0x0000, -0x0004,0x000b,0x0011,0x0015,0x0010,0xffff,0x0007,0x0003, -0xffee,0xfff7,0x0011,0x0004,0xfff5,0xfffd,0x0000,0xfff5, -0xfff9,0xfffc,0xfff6,0xfffd,0xfff6,0x0012,0xffe8,0x0003, -0xfff2,0xfff9,0xfffc,0xfff6,0x0010,0xffff,0x001b,0x0004, -0x001b,0xffef,0xfff4,0xffe2,0x0000,0xffdd,0x0009,0x0003, -0x000c,0x0024,0x0023,0x001e,0x0002,0x000d,0xfffe,0x000b, -0xffbe,0xfff8,0xffe9,0xfff5,0x000e,0x0005,0x0011,0x0010, -0x0013,0x0002,0x0003,0xfffb,0xffee,0xffef,0x000a,0x0000, -0xffff,0x0017,0xfffa,0x0014,0xfff1,0x0012,0xfff2,0x0016, -0x0005,0x000a,0x002c,0x0017,0x0002,0x001a,0xfff7,0x0003, -0xfffc,0xfff2,0xfff4,0xffe3,0xfff9,0xfff0,0xfff9,0xffee, -0xffd4,0xffec,0xffde,0xffe3,0x000a,0xfff3,0x0004,0x0000, -0x0004,0xfff7,0x0005,0xffed,0xfff6,0xffe8,0x000b,0x0011, -0x0008,0x0014,0x0005,0x0013,0xfff7,0x000e,0xfff4,0x0009, -0x0006,0x0000,0x001e,0x0009,0x0000,0x0013,0x0002,0x0007, -0x0002,0x000a,0x0005,0xffec,0xffeb,0xffff,0xffef,0xfff7, -0xffb3,0xfff0,0xfff7,0xfff7,0x0006,0x000b,0x0015,0x0025, -0x000a,0x000a,0xfffc,0xfffb,0xfff3,0x0003,0xfff9,0x0000, -0xfff3,0x000b,0xffef,0x0006,0xffe7,0x0001,0xfff1,0x0009, -0xfff9,0x0009,0x0020,0x0013,0x0000,0x0012,0xfffe,0xffea, -0x0003,0xfff1,0x000c,0xfffb,0x0004,0xfffe,0x0011,0xfffb, -0xffc9,0xffe4,0xffeb,0xffe5,0x0002,0xfff9,0x0008,0x0014, -0xfffc,0xffff,0xffff,0xffee,0xfffb,0xfffc,0xfffb,0x0010, -0xfffe,0x0008,0xfffb,0x0005,0xffed,0xfffe,0xfff2,0xfffd, -0xfffa,0x0000,0x0012,0x0004,0xfffe,0x000b,0x0008,0xffee, -0x000b,0x000a,0x001d,0x0003,0xfff6,0x000d,0x0008,0x0003, -0xffc6,0xfff7,0xfff0,0x0001,0xfffe,0x0002,0x0000,0x0013, -0x000a,0x000d,0x0011,0x0015,0x0003,0x0003,0x0013,0xfff4, -0x0002,0x0000,0xfff6,0x0001,0xfffb,0x000c,0x0000,0x000f, -0x001a,0x0005,0x0022,0x0010,0x000b,0x0007,0xfffc,0x0019, -0x0002,0xfff2,0x0003,0xffe3,0xfff3,0xffe7,0xffec,0xffec, -0xffdc,0xffeb,0xffe4,0xfff0,0xfffa,0xfff0,0xfff4,0x0002, -0xfffc,0x0002,0x0014,0x0007,0x000b,0xfffc,0x0014,0x0004, -0x000c,0xfffe,0x0001,0x0000,0x0000,0x0008,0x0002,0x0002, -0x001b,0xfffc,0x0015,0x0002,0x0009,0x0000,0x0006,0x001d, -0x0009,0x000a,0x0015,0xffeb,0xffe4,0xfff6,0xffe3,0xfff5, -0xffbb,0xffef,0xfffd,0x0003,0xfff6,0x0008,0x0003,0x0028, -0x0001,0x0015,0x000a,0x0015,0x0008,0x0017,0x0001,0xfff3, -0xfff8,0xfff5,0xffeb,0xfff5,0xfff1,0xfffc,0x0000,0x0002, -0x000d,0x0005,0x0017,0x000c,0x0007,0x0000,0x0001,0x0000, -0x000a,0xfff2,0x001c,0xfffb,0xffff,0xfff5,0x0005,0xfff9, -0xffd1,0xffe2,0xfff1,0xfff2,0xfff2,0xfff7,0xfff7,0x0017, -0xfff3,0x000a,0x000c,0x0007,0x0010,0x000f,0x0003,0x0003, -0x0001,0xfff2,0xfff7,0xfff4,0xfff7,0xfff8,0x0000,0xfff6, -0x000e,0xfffc,0x0009,0xfffe,0x0005,0xfff8,0x000d,0x0003, -0x0012,0x000a,0x002d,0x0003,0xfff0,0x0004,0xfffc,0x0000, -0xffb1,0x000b,0xfff1,0x0004,0x0012,0x0017,0x0014,0x0005, -0x001e,0x0007,0xfff9,0xfffe,0xffeb,0xffeb,0xfff8,0xfffd, -0xfff6,0x001c,0x0004,0x001f,0x0006,0x0019,0xfffd,0x0025, -0x0004,0xfff9,0x0014,0x0000,0x0004,0x0004,0xfff5,0x0007, -0xfffa,0x0008,0xffe5,0xffea,0xfff2,0xfff4,0xfffb,0xfff0, -0xffc7,0x0000,0xffe5,0xfff3,0x000e,0x0005,0x0007,0xfff5, -0x000f,0xfffc,0xfffb,0xfff0,0xfff3,0xffe3,0xfffa,0x000d, -0x0000,0x0019,0x0010,0x001f,0x000c,0x0016,0xfffe,0x0017, -0x0006,0xfff0,0x0007,0xfff2,0x0002,0xfffd,0x0000,0x000c, -0x0000,0x0021,0xfff7,0xfff3,0xffe4,0x0003,0xfff2,0xfff9, -0xffa6,0x0003,0xfffe,0x0006,0x000a,0x001d,0x0018,0x001a, -0x0015,0x000f,0xfff1,0xfffe,0xfff0,0xffff,0xffe7,0xfffc, -0xffeb,0x0010,0xfffa,0x0012,0xfffd,0x0008,0xfffb,0x0018, -0xfff8,0xfff9,0x0009,0xfffc,0x0001,0xfffd,0xfffb,0xffee, -0x0001,0x0007,0xfffe,0x0001,0xfffe,0x0001,0x0013,0xfffd, -0xffbd,0xfff8,0xfff2,0xfff5,0x0007,0x000b,0x000b,0x0009, -0x0007,0x0003,0xfff3,0xfff0,0xfff8,0xfff7,0xffe8,0x000c, -0xfff6,0x000d,0x0005,0x0011,0x0002,0x0004,0xfffd,0x000a, -0xfffa,0xffef,0xfffc,0xffed,0x0000,0xfff5,0x0006,0xfff3, -0x0009,0x0021,0x000e,0x000a,0xfff0,0x0011,0x000a,0x0004, -0xffb9,0x000a,0xfff7,0x0011,0x0001,0x0014,0x0003,0x0008, -0x0015,0x0012,0x0006,0x0018,0x0000,0xffff,0x0000,0xfff0, -0xfffa,0x0005,0x0000,0x000d,0x0011,0x0013,0x000b,0x001d, -0x0019,0xfff5,0x000b,0xfffa,0x000d,0xfff1,0xfff9,0x001d, -0x0000,0x0008,0xfff5,0xffea,0xffec,0xffeb,0xffef,0xffee, -0xffcf,0xfffe,0xffeb,0x0000,0xffff,0x0002,0xfff7,0xfff8, -0x0006,0x0006,0x0008,0x000a,0x0008,0xfff7,0x0002,0x0000, -0x0004,0x0002,0x000d,0x000c,0x0017,0x000f,0x000c,0x0010, -0x001a,0xffeb,0xfffe,0xffeb,0x000b,0xffe9,0x0004,0x0021, -0x0007,0x0021,0x0006,0xfff3,0xffde,0xfffb,0xffe5,0xfff6, -0xffae,0x0001,0x0004,0x0013,0xfffa,0x001b,0x0006,0x001d, -0x000c,0x001a,0xffff,0x0018,0x0005,0x0012,0xffef,0xffef, -0xffef,0xfffa,0xfff6,0x0000,0x0007,0x0002,0x0009,0x0010, -0x000c,0xfff5,0x0000,0xfff5,0x0009,0xffe9,0x0000,0x0003, -0x0008,0x0008,0x000d,0x0001,0xfff8,0xfff9,0x0007,0xfffa, -0xffc4,0xfff6,0xfff9,0x0001,0xfff7,0x0008,0xfffa,0x000d, -0xfffe,0x000f,0x0001,0x000a,0x000d,0x000b,0xfff1,0x0000, -0xfffa,0xfff7,0x0001,0x0000,0x000d,0xffff,0x000b,0x0003, -0x000d,0xffeb,0xfff3,0xffe6,0x0007,0xffe1,0x000a,0x0007, -0x0010,0x0021,0x001f,0x000a,0xffea,0x0008,0xffff,0x0002, -0xfffd,0x0007,0xfffb,0xfffb,0x0008,0xfffe,0x0011,0xfff7, -0x0012,0xffe8,0xfffe,0xffed,0xfff6,0xfffc,0x001c,0x0011, -0x0005,0x001c,0xfffe,0x0007,0xfffc,0x000f,0x0007,0x0008, -0x0006,0x0017,0x000d,0x0015,0xfff2,0x0014,0xffef,0xffee, -0xfff5,0xffdf,0xffe2,0xfff5,0x0017,0xfff3,0xfffb,0xfff7, -0x0012,0xfffc,0xffef,0xffe9,0x0004,0xffec,0x0004,0xffe6, -0x0003,0xffdc,0x0000,0xffe0,0xfffe,0xfff4,0x001d,0x0022, -0x0010,0x0018,0x000a,0x0006,0x0000,0x000c,0x0008,0xfffc, -0x0008,0x000d,0x0000,0x0006,0xfff0,0x000c,0xfffb,0xfff3, -0xfffd,0xfff9,0xfff3,0xfffd,0x0008,0x0002,0xfff2,0x0000, -0xfff3,0x0000,0x0008,0xfffd,0x0000,0x0004,0x0015,0x000b, -0x0009,0xfff0,0xfff6,0xffee,0xfffb,0x0010,0x000a,0x0010, -0xfffb,0x000f,0xfff3,0xfffb,0xfff1,0xffff,0x0006,0xfffc, -0xfffa,0x0017,0x0002,0x0010,0xffef,0x000c,0xfff6,0xffd4, -0xfffd,0xffdf,0xfffa,0x000c,0x0022,0x0001,0x0014,0x0003, -0x0008,0xfff4,0xfffd,0xffeb,0xfffd,0xfff2,0x0008,0xfffb, -0xfffc,0xffe4,0xfff9,0xffe0,0x0002,0x0008,0x000c,0x0022, -0x0004,0x000c,0xffff,0xfffa,0xfff7,0xfffc,0x0007,0xffef, -0xfffc,0x000d,0xfff5,0x0001,0xffed,0x0004,0x0000,0xffd9, -0x0004,0xfff9,0x000b,0x0015,0x0014,0x0010,0x000a,0x000b, -0x0004,0x0006,0x0000,0x0007,0xfff8,0xfffc,0x0000,0xfffa, -0x0009,0xfff3,0x000b,0x0007,0x000b,0x000f,0x0025,0x0004, -0x0009,0x0005,0xfffb,0xfff5,0x0005,0x0009,0x0016,0x0001, -0x001b,0x0012,0x0004,0x000e,0xfffb,0x0000,0xfff4,0x0003, -0xfffc,0xffe0,0xfff2,0xfff4,0x0011,0xffea,0xffef,0xfff5, -0x001a,0xfffa,0xfff5,0xfff6,0xfff4,0xffe9,0xfff4,0xffe9, -0xfffb,0xffe8,0x000d,0xfffb,0x0013,0x0008,0x0026,0x0015, -0x0014,0x0002,0x0006,0xfff4,0x000b,0x0005,0x0017,0xfff5, -0x001d,0x0009,0xfff7,0x0000,0xfff9,0xfffa,0xffff,0x0007, -0x0002,0xfff9,0x0003,0xfffd,0x0002,0xfffa,0xffe5,0xfffd, -0xfffa,0xfffe,0x000e,0x0009,0xfff0,0x0001,0x0003,0x000e, -0x0000,0xfffb,0x0003,0x0008,0x0010,0x0024,0x0013,0x0003, -0xffff,0xfffa,0xffef,0xffe8,0xfffc,0xfff9,0x0015,0xfff5, -0x000e,0x0012,0xfff9,0x0009,0xfff7,0xfff9,0xfffa,0xffea, -0x0003,0xffdf,0x000a,0x000b,0x001c,0xfff9,0x0007,0x0000, -0x0010,0xfff2,0x0002,0xfff8,0xffec,0xffef,0xfff7,0xfffe, -0xfff2,0xfff0,0x0006,0xfffb,0x0018,0x001c,0x0015,0x0014, -0x0008,0xfff7,0xfffc,0xffe7,0x0001,0xfff5,0x0016,0xffe8, -0x000f,0x0008,0xffeb,0xfffb,0xfff5,0xfff2,0x0005,0xffee, -0x000b,0xfff9,0x001b,0x0014,0x000e,0x0007,0xffff,0x0009, -0xfff0,0x001b,0x0002,0x000a,0x000d,0x0010,0x0014,0xffec, -0x001d,0xffec,0xfff2,0xfff0,0xfff3,0xfff8,0x0009,0x000d, -0xfffe,0x0021,0x0009,0x0013,0x0011,0x0017,0x0011,0x0016, -0x0006,0x0006,0xfff7,0xfffe,0xfff4,0xfffe,0xffec,0xfff3, -0xfff3,0xfff6,0xffd3,0xfffc,0x0010,0xfff8,0xfffe,0xfff9, -0x0005,0x000f,0xfff7,0xfff9,0x0009,0xfffe,0x0008,0xffdb, -0x000e,0xffe1,0xfff5,0xffe3,0xfffb,0xfff0,0x000b,0x001e, -0x0007,0x001d,0x0015,0x0012,0x0017,0x0013,0x0012,0x0009, -0x0007,0xfffd,0xffe9,0xffef,0xfff2,0xfff7,0xfff8,0xfff7, -0xfffa,0x000f,0xffe5,0x0004,0x0002,0x0006,0xfff4,0x0001, -0xffe6,0x0013,0x000f,0x000c,0x0005,0x0016,0x0018,0x0000, -0x0015,0xfff4,0xffeb,0xfff1,0xfff8,0x000b,0xfff9,0x000c, -0xfff2,0x0014,0xfffe,0x0006,0x0007,0x0006,0x0010,0x0009, -0xfffa,0x0005,0xffeb,0xfff9,0xfff1,0xfff6,0xfff3,0xffd9, -0xfffb,0xfff6,0xffec,0x0013,0x001c,0x0005,0x0016,0x0005, -0xfffc,0x0006,0x0003,0xfffb,0x0001,0x0004,0x000b,0xfff0, -0x0006,0xffe9,0xffed,0xffe3,0x0000,0x0003,0xfffa,0x001e, -0xfffd,0x0011,0x000a,0x0005,0x000d,0x0002,0x0011,0xfffd, -0xfffb,0xfffd,0xffdd,0xffeb,0xffef,0xffef,0xfffe,0xffdd, -0x0002,0x000f,0xfffd,0x001c,0x000d,0x0015,0x000d,0x000d, -0xfff8,0x0019,0x0008,0x0017,0xfffd,0x000d,0x0003,0xffef, -0x0014,0xfff8,0x0000,0x000a,0x0008,0x000b,0x0012,0x0000, -0x0001,0x000a,0x0005,0x0000,0x001c,0x0011,0x0020,0x000f, -0x001a,0x0001,0xffed,0xfff7,0xfffd,0xffeb,0xfff1,0x0007, -0xfffa,0xfff7,0xffe3,0xfffb,0x000a,0xffef,0xfff1,0xfff7, -0x000d,0x000d,0xfffd,0x0005,0xfff9,0xfffc,0xfff7,0xffde, -0x0005,0xffec,0x0002,0xfffd,0x0010,0x0003,0x0014,0x0011, -0x000b,0x0007,0x0011,0x0000,0x0022,0x000d,0x0021,0x0002, -0x001c,0xfff8,0xffe0,0xffe8,0xfffb,0xffe3,0xfffd,0x000c, -0x0000,0x000f,0xfff5,0x0003,0xfffd,0xfffe,0xffe8,0xffff, -0xffee,0x0011,0x0015,0x0019,0xfff5,0x0013,0x0006,0x0003, -0x000b,0x0000,0xfff9,0x000b,0x000d,0x001f,0x0001,0x0000, -0xfff7,0xffff,0xfffb,0xfff4,0x0012,0x0000,0x001f,0x0002, -0x000d,0x0001,0xffe2,0xfff2,0xfff9,0xffe3,0xfff7,0xffee, -0x0001,0xfff6,0xfffc,0x0012,0x0016,0xfffd,0x000a,0x0002, -0x0003,0x0005,0x0009,0x0007,0xfff1,0x0001,0xfffb,0xfff3, -0xfffe,0xfff4,0xfffb,0xfffe,0x0015,0x0017,0x0002,0x0010, -0x0000,0xfffb,0x0006,0xfff3,0x0017,0xfffd,0x0020,0xfff6, -0x000f,0xfff8,0xffd4,0xffe4,0xfff7,0xffdb,0x0002,0xfff3, -0x0009,0x000f,0x000c,0x001b,0x0007,0x000c,0x0000,0x000b, -0xffd4,0x0006,0xffe2,0xfff8,0x0009,0x000a,0x000b,0x000e, -0x0017,0xfffb,0x0008,0xfffc,0x000e,0xfff4,0x0025,0x000e, -0x000c,0x001a,0x0004,0x0010,0xfff8,0x0010,0xfff7,0x0007, -0xfffa,0x0013,0x000c,0x0019,0xfffb,0x0018,0xfff1,0xfff3, -0xfff8,0xffdc,0xffde,0xffe1,0xffff,0xffee,0xfffc,0xffee, -0xffea,0xfffb,0xffd6,0xffe6,0x0006,0xfff8,0xffff,0xfffe, -0x0009,0xffef,0x000a,0xffee,0x0015,0xffed,0x0027,0x001f, -0x0017,0x0017,0x0010,0x000f,0xfffe,0x000c,0xfff9,0xfffa, -0xfffb,0x0009,0xffff,0x000a,0xfff9,0x0010,0xfffc,0xfff7, -0x0000,0xfff6,0xffef,0xffea,0xfff0,0xfffe,0xfff2,0xfff7, -0xffc9,0xffff,0xffef,0xfffa,0x0001,0x0010,0x000f,0x0023, -0x000f,0x0002,0x0000,0xfffc,0x0013,0x0008,0x0014,0x000d, -0x0001,0x000e,0xfff9,0x0003,0xffee,0x0000,0xfff6,0xfffb, -0xffed,0x0013,0x0000,0x0015,0xfff8,0x0010,0xfff7,0xffd9, -0x0000,0xffdc,0xfff6,0xfff9,0x0009,0xfffc,0x0014,0xfffb, -0xffdf,0xfff3,0xffe3,0xffe8,0xffff,0xffff,0x0002,0x0012, -0x0000,0xfff7,0x0003,0xffef,0x001b,0x0000,0x0015,0x001e, -0x000c,0x000b,0x0005,0x0002,0xfff4,0xfffc,0xfff7,0xffed, -0xffee,0x0009,0xfff3,0x0006,0xfff5,0x0008,0x0002,0xffdd, -0x0008,0xfff6,0x0007,0x0001,0xfffc,0x000b,0x000a,0x0002, -0xffdc,0x0005,0xffe8,0x0004,0xfff9,0x0007,0xfffa,0x0011, -0x000e,0x0005,0x0016,0x0016,0x0023,0x0008,0x002e,0x0001, -0x0011,0x0003,0x0000,0xfffe,0x0002,0x000a,0x0005,0x0000, -0x000e,0x000f,0x0002,0x0012,0x0002,0x0004,0xfff5,0x0007, -0xffff,0xffdc,0xffee,0xffe0,0xfff9,0xffe5,0xffef,0xffec, -0xfff2,0xfff9,0xffdc,0xfff3,0xfff6,0xfff6,0xffee,0x0000, -0x0000,0xfffb,0x0019,0x0008,0x002b,0x0000,0x0030,0x0012, -0x001b,0x0000,0x000c,0xfffd,0x0007,0x0006,0x0007,0xfff3, -0x000f,0x0005,0xfff5,0x0003,0x0000,0xfffe,0x0000,0x000c, -0x0006,0xfff6,0x0000,0xffe9,0xffea,0xfff5,0xffe6,0xfff4, -0xffd1,0xfffd,0xfff5,0x0006,0xfff1,0x000d,0xfffe,0x0026, -0x0006,0x000d,0x000f,0x0016,0x0028,0x001c,0x001c,0x0000, -0x0005,0xfff8,0xfff6,0xfff1,0xfff9,0xfff9,0x0004,0xfff3, -0x0001,0x000e,0xfff7,0x000e,0x0000,0xfffe,0xfffc,0xffee, -0x0007,0xffdc,0x0006,0xfff8,0x0003,0xfff3,0x0007,0xfff8, -0xffe7,0xfff1,0xffea,0xfff5,0xffee,0xfffc,0xfff1,0x0016, -0xfff8,0x0002,0x0011,0x0009,0x0030,0x0014,0x001e,0x0011, -0x0010,0xfff5,0x0001,0xfff0,0xfffe,0xfff6,0x0005,0xffe6, -0x0002,0x0004,0xffea,0x0000,0xfffe,0xfff6,0x0006,0xfff3, -0x000e,0xfff6,0x0017,0x0000,0xfff6,0x0002,0xffff,0x0000, -0xffc7,0x001a,0xffea,0x0007,0x000e,0x001c,0x000e,0x0003, -0x0023,0x0000,0xfffd,0xffff,0x000b,0xfff0,0x0012,0x000a, -0x0004,0x001f,0x000f,0x001c,0x000e,0x0017,0x0001,0x0015, -0xfff9,0x0002,0xfff5,0x0001,0xfffd,0x0001,0xffee,0xfff7, -0xfff6,0xfff3,0xffcf,0xffe8,0xfff8,0xfff2,0xfffe,0xfff0, -0xffdd,0x000e,0xffde,0xfff6,0x000a,0x000a,0x0001,0xfff4, -0x0014,0xfff4,0x0000,0xfff1,0x0012,0xffe8,0x0014,0x001b, -0x000e,0x001c,0x001b,0x001b,0x0014,0x0013,0x0002,0x0008, -0xfffb,0xfff9,0xffe7,0xfff3,0xfffb,0xfffb,0xfffa,0xfffb, -0xfffe,0x000c,0xffe1,0xfff1,0xffe9,0x0001,0xfff4,0xfff8, -0xffbc,0x0012,0xfff7,0x0009,0x0006,0x0023,0x0012,0x0019, -0x001a,0x0007,0xfff6,0xffff,0x0010,0x0003,0x0001,0x0009, -0xfffa,0x0013,0x0004,0x000f,0x0004,0x0006,0x0000,0x0008, -0xffec,0x0002,0xffe9,0xfffe,0xfff9,0xfffb,0xfff4,0xffdd, -0xffff,0xfff3,0xffe8,0x0000,0x0003,0x0000,0x0016,0xfffc, -0xffd2,0x0006,0xffeb,0xfff8,0x0002,0x0010,0x0005,0x0008, -0x000b,0xfffc,0xfff8,0xfff1,0x0018,0xfffc,0x0002,0x001a, -0x0003,0x0010,0x0010,0x000e,0x0009,0x0002,0x0001,0xfffc, -0xffed,0xfff9,0xffdc,0xffef,0xfff7,0xfff3,0x0000,0xffe1, -0x0005,0x000c,0xfff9,0x0008,0xfff5,0x000f,0x000d,0x0004, -0xffcf,0x0018,0xfff0,0x0014,0xfffe,0x001a,0xfffe,0x0007, -0x0019,0x000a,0x000b,0x0019,0x0020,0x0003,0x001b,0xfffe, -0x0008,0x0008,0x000b,0x0009,0x0018,0x0011,0x0010,0x000e, -0x000d,0xfffe,0xffec,0xfffb,0x0004,0xffef,0xfff2,0x000c, -0xfffd,0xfff3,0xffdf,0xffe7,0xfff2,0xffe9,0xfff1,0xffed, -0xffe5,0x000c,0xffe4,0x0002,0xfffa,0x0007,0xfff1,0xfff7, -0x000b,0xffff,0x000d,0x000b,0x0028,0xfffc,0x001d,0x000e, -0x0013,0x0005,0x0017,0x0008,0x001e,0x000d,0x0011,0x0000, -0x000e,0xfff4,0xffde,0xffec,0x0002,0xffe7,0xfffe,0x0010, -0x0004,0x000c,0xfff1,0xfff0,0xffe3,0xfff9,0xffe8,0xfff6, -0xffc4,0x0010,0xfffd,0x0016,0xfff6,0x0020,0x0000,0x001c, -0x0011,0x0012,0x0003,0x0019,0x0025,0x0017,0x000a,0xfffd, -0xfffe,0xfffd,0x0000,0xfffd,0x000e,0x0000,0x000e,0x0001, -0x0000,0xfffe,0xffe0,0xfff7,0x0001,0xffe7,0xfff9,0xfff3, -0x0005,0xfff3,0xfff8,0xffff,0xfffe,0xfff8,0x000a,0xfffa, -0xffda,0x0004,0xfff1,0x0004,0xfff2,0x000d,0xfff4,0x000b, -0x0002,0x0006,0x0006,0x000b,0x002d,0x0010,0x000b,0x000d, -0x0007,0xfffa,0x000c,0xfffc,0x0014,0xfffd,0x0010,0xfff4, -0x0001,0xfff4,0xffd2,0xffe8,0x0000,0xffdf,0x0003,0xfff7, -0x000c,0x000c,0x0008,0x0007,0xffef,0x0006,0x0000,0x0002}; +static const int8_t cb2_vects[128][40]={ + { + 73, -32, -60, -15, -26, 59, 2, -33, 30, -10, + -3, -17, 8, 30, -1, -26, -4, -22, 10, 16, + -36, -5, -11, 56, 37, 6, -10, -5, -13, -3, + 6, -5, 11, 4, -19, -5, -16, 41, 24, 13, + }, { + 4, -11, -37, 23, -5, 46, -2, -29, -5, -39, + -21, -9, 0, 49, 12, -9, -16, -26, 22, 15, + -45, -20, -5, 40, 22, 17, -26, 31, -14, 2, + -14, 10, 30, 20, -27, -9, -39, 39, 18, 5, + }, { + 34, -25, -48, -28, -11, 34, -2, -41, 9, -7, + -17, 21, 20, 24, -17, -33, 0, -24, 10, 42, + 3, -5, 10, 42, 11, 8, -3, 3, 16, 9, + 22, -2, 0, -33, -10, 18, 7, 58, 10, 28, + }, { + -34, -4, -25, 10, 9, 21, -7, -36, -26, -36, + -35, 28, 12, 42, -3, -16, -12, -28, 21, 42, + -5, -21, 16, 26, -4, 19, -19, 39, 15, 15, + 1, 13, 19, -17, -17, 14, -15, 55, 4, 19, + }, { + 28, -20, -51, -14, -6, 7, 0, -26, 27, -4, + 18, -40, -6, 16, -1, -15, 0, -55, -5, -16, + -19, 14, -3, 49, 14, 1, -22, -30, -12, 0, + 24, 15, 9, -17, -45, -29, 4, 28, 51, 35, + }, { + -40, 0, -28, 24, 14, -5, -4, -21, -7, -33, + 0, -32, -15, 35, 12, 1, -11, -58, 5, -16, + -28, 0, 1, 33, 0, 11, -39, 5, -14, 6, + 3, 31, 28, -1, -53, -33, -19, 25, 46, 26, + }, { + -11, -14, -39, -27, 9, -17, -4, -33, 6, 0, + 4, -1, 5, 10, -17, -22, 5, -57, -5, 9, + 20, 13, 18, 35, -11, 3, -16, -22, 17, 13, + 40, 19, -1, -55, -35, -5, 27, 44, 37, 49, + }, { + -80, 6, -16, 11, 30, -30, -9, -28, -28, -29, + -13, 6, -2, 28, -3, -5, -7, -60, 5, 9, + 11, -1, 24, 19, -27, 13, -32, 13, 15, 19, + 19, 35, 17, -39, -43, -9, 4, 42, 32, 41, + }, { + 78, -21, -43, 4, -38, 17, 17, -5, 55, 24, + -15, -36, 14, 4, 24, -24, 12, 5, 17, 31, + -54, -5, -2, 27, 43, -12, 2, 9, -9, -15, + 22, -3, 28, 21, -20, 3, 20, 28, 9, -5, + }, { + 9, -1, -20, 43, -17, 3, 12, 0, 20, -4, + -33, -29, 6, 22, 38, -7, 0, 1, 29, 30, + -63, -21, 3, 11, 27, -1, -14, 45, -10, -9, + 1, 12, 47, 37, -28, 0, -2, 26, 4, -13, + }, { + 39, -14, -30, -8, -22, -8, 12, -12, 34, 27, + -29, 2, 26, -2, 8, -31, 16, 3, 17, 57, + -14, -6, 19, 13, 16, -10, 8, 17, 20, -2, + 38, 0, 17, -16, -11, 27, 44, 45, -4, 8, + }, { + -29, 5, -7, 30, -1, -21, 7, -7, 0, 0, + -47, 9, 18, 15, 22, -14, 4, 0, 28, 57, + -23, -21, 25, -2, 1, 0, -7, 53, 19, 3, + 17, 15, 36, 0, -19, 24, 21, 43, -9, 0, + }, { + 33, -10, -34, 5, -17, -35, 15, 1, 53, 30, + 6, -59, 0, -10, 24, -13, 17, -27, 1, -1, + -37, 13, 4, 20, 20, -18, -10, -16, -8, -11, + 39, 18, 26, 0, -46, -20, 41, 15, 37, 15, + }, { + -35, 10, -11, 44, 3, -48, 10, 6, 17, 2, + -11, -51, -8, 8, 38, 3, 4, -31, 12, -2, + -46, -1, 10, 4, 5, -7, -26, 19, -10, -5, + 18, 34, 45, 15, -54, -24, 18, 13, 31, 7, + }, { + -5, -3, -21, -7, -2, -60, 10, -5, 32, 34, + -7, -20, 11, -16, 8, -20, 21, -29, 1, 24, + 2, 13, 27, 6, -5, -15, -3, -8, 21, 1, + 55, 21, 15, -38, -37, 3, 65, 32, 23, 30, + }, { + -74, 17, 0, 31, 18, -73, 5, 0, -3, 5, + -25, -12, 3, 1, 22, -3, 9, -33, 12, 24, + -6, -2, 33, -9, -21, -5, -20, 27, 19, 7, + 34, 37, 34, -22, -44, 0, 41, 29, 17, 21, + }, { + 76, -35, -31, -28, -49, 43, -40, 0, 29, -14, + 8, 5, 10, 18, -26, -46, 0, 7, 6, 3, + -25, -7, -2, 40, 28, 14, 18, -3, -27, -28, + -8, -45, -13, 34, -13, -27, -15, 31, 12, 3, + }, { + 7, -15, -9, 9, -28, 29, -45, 5, -6, -43, + -9, 12, 2, 36, -12, -30, -11, 3, 17, 3, + -34, -22, 3, 24, 12, 24, 2, 32, -28, -22, + -29, -29, 5, 50, -21, -31, -38, 29, 7, -5, + }, { + 36, -29, -19, -41, -34, 18, -45, -6, 8, -10, + -5, 43, 23, 11, -42, -53, 5, 5, 6, 30, + 14, -8, 20, 26, 1, 16, 25, 4, 3, -15, + 7, -41, -23, -3, -4, -3, 8, 48, -1, 17, + }, { + -32, -8, 3, -2, -13, 4, -50, -1, -27, -39, + -23, 51, 15, 30, -27, -37, -7, 1, 17, 29, + 5, -23, 25, 10, -14, 26, 8, 41, 1, -9, + -13, -26, -5, 12, -12, -7, -14, 45, -6, 9, + }, { + 31, -24, -23, -27, -29, -9, -43, 8, 26, -7, + 30, -17, -4, 3, -26, -35, 5, -24, -10, -28, + -9, 12, 5, 33, 5, 8, 5, -29, -26, -24, + 9, -23, -14, 12, -39, -52, 5, 18, 39, 24, + }, { + -37, -3, 0, 10, -7, -22, -48, 12, -8, -36, + 12, -9, -12, 22, -12, -19, -6, -28, 0, -29, + -18, -3, 11, 17, -10, 18, -10, 7, -27, -18, + -11, -7, 3, 28, -47, -55, -18, 15, 34, 16, + }, { + -8, -17, -10, -40, -13, -34, -47, 0, 5, -4, + 16, 21, 8, -2, -42, -43, 10, -26, -10, -2, + 31, 11, 27, 19, -21, 10, 12, -20, 3, -11, + 25, -20, -25, -25, -29, -28, 28, 34, 25, 38, + }, { + -77, 2, 11, -1, 7, -47, -52, 5, -29, -33, + -1, 28, 0, 15, -28, -26, -2, -30, 0, -2, + 22, -4, 33, 3, -36, 21, -3, 15, 2, -5, + 4, -4, -6, -9, -37, -31, 5, 32, 20, 30, + }, { + 81, -25, -14, -8, -61, 0, -25, 28, 54, 20, + -3, -14, 17, -8, 0, -44, 16, 35, 13, 18, + -43, -7, 6, 11, 33, -4, 30, 11, -22, -40, + 6, -43, 3, 50, -14, -18, 22, 18, -1, -16, + }, { + 12, -4, 8, 29, -39, -12, -30, 33, 19, -8, + -21, -6, 8, 9, 13, -28, 4, 31, 24, 18, + -52, -23, 12, -4, 18, 5, 14, 47, -24, -34, + -14, -27, 22, 66, -22, -22, -1, 16, -6, -24, + }, { + 41, -18, -2, -21, -45, -24, -30, 21, 33, 24, + -17, 24, 29, -15, -16, -51, 21, 33, 13, 45, + -3, -8, 28, -2, 7, -2, 37, 19, 7, -27, + 22, -39, -7, 12, -5, 5, 45, 35, -15, -1, + }, { + -27, 1, 20, 17, -24, -38, -35, 26, -1, -4, + -35, 32, 21, 3, -2, -35, 8, 29, 24, 44, + -12, -24, 34, -18, -8, 7, 21, 55, 5, -21, + 2, -23, 11, 28, -13, 1, 22, 33, -21, -10, + }, { + 36, -13, -5, -7, -40, -51, -28, 36, 52, 27, + 18, -36, 2, -22, 0, -33, 21, 2, -3, -13, + -26, 11, 14, 4, 10, -10, 18, -14, -22, -36, + 24, -21, 1, 28, -40, -42, 42, 5, 25, 5, + }, { + -32, 6, 17, 31, -19, -65, -33, 41, 16, -1, + 0, -29, -6, -4, 13, -17, 9, -1, 8, -14, + -35, -3, 19, -11, -4, 0, 1, 21, -23, -30, + 3, -5, 20, 44, -48, -46, 19, 3, 20, -3, + }, { + -3, -7, 6, -20, -25, -77, -32, 29, 31, 30, + 4, 2, 14, -29, -16, -40, 26, 0, -3, 12, + 13, 10, 36, -9, -15, -8, 24, -6, 7, -22, + 40, -17, -8, -9, -31, -18, 66, 22, 11, 19, + }, { + -72, 13, 29, 18, -4, -90, -37, 34, -4, 1, + -13, 9, 6, -11, -2, -24, 13, -3, 7, 11, + 4, -4, 42, -25, -31, 1, 8, 29, 6, -17, + 19, -2, 10, 6, -38, -22, 42, 19, 6, 11, + }, { + 116, -20, -68, -30, -28, 83, 28, -18, 32, -22, + -13, -21, 5, 28, 5, -7, -24, -8, -22, 17, + -23, 30, -25, 45, 15, -9, -11, -18, 22, -10, + 4, -2, 19, -12, 23, 3, -43, 2, 12, -4, + }, { + 47, 0, -45, 7, -7, 69, 23, -13, -2, -51, + -32, -14, -3, 47, 19, 8, -37, -11, -10, 16, + -32, 15, -19, 29, 0, 1, -28, 18, 20, -4, + -16, 13, 38, 3, 15, 0, -66, 0, 7, -13, + }, { + 77, -13, -56, -43, -13, 57, 23, -26, 11, -19, + -27, 16, 17, 22, -10, -15, -19, -10, -22, 43, + 16, 30, -2, 31, -11, -6, -5, -9, 52, 2, + 20, 0, 8, -50, 33, 27, -19, 19, -1, 9, + }, { + 8, 6, -33, -4, 7, 44, 18, -21, -23, -48, + -46, 24, 9, 40, 3, 1, -32, -13, -11, 43, + 7, 14, 3, 15, -26, 3, -21, 26, 50, 8, + 0, 16, 27, -34, 25, 23, -43, 17, -6, 1, + }, { + 71, -9, -59, -29, -8, 30, 26, -11, 30, -16, + 8, -44, -9, 14, 5, 2, -19, -40, -38, -15, + -7, 50, -17, 38, -7, -14, -24, -43, 22, -6, + 22, 19, 17, -34, -2, -20, -23, -10, 39, 16, + }, { + 2, 11, -36, 9, 13, 17, 21, -6, -5, -45, + -10, -36, -18, 33, 19, 19, -31, -44, -27, -15, + -16, 34, -11, 22, -22, -4, -40, -7, 21, 0, + 1, 35, 36, -18, -10, -24, -46, -12, 34, 8, + }, { + 32, -2, -47, -42, 7, 5, 21, -18, 9, -12, + -5, -5, 2, 8, -10, -4, -14, -42, -38, 10, + 33, 49, 5, 24, -33, -12, -17, -35, 52, 6, + 38, 22, 7, -72, 7, 3, 0, 6, 25, 30, + }, { + -36, 18, -24, -3, 28, -7, 16, -13, -26, -41, + -24, 1, -5, 26, 3, 12, -27, -46, -27, 10, + 24, 34, 10, 8, -49, -2, -34, 0, 51, 12, + 17, 38, 25, -56, 0, 0, -22, 3, 20, 22, + }, { + 121, -9, -50, -10, -40, 40, 43, 9, 58, 12, + -25, -41, 11, 2, 31, -5, -8, 19, -15, 32, + -41, 30, -16, 16, 20, -28, 0, -3, 26, -22, + 19, 0, 36, 4, 22, 12, -6, -9, -1, -24, + }, { + 52, 10, -27, 27, -18, 26, 38, 14, 23, -16, + -44, -33, 3, 20, 45, 10, -20, 15, -3, 31, + -50, 14, -10, 0, 5, -17, -15, 32, 24, -16, + -1, 15, 55, 20, 14, 8, -29, -12, -7, -32, + }, { + 82, -3, -38, -23, -24, 15, 38, 2, 37, 15, + -39, -2, 23, -4, 15, -12, -3, 17, -15, 58, + -1, 29, 6, 2, -5, -26, 7, 4, 56, -9, + 35, 3, 25, -33, 32, 36, 17, 7, -15, -9, + }, { + 13, 17, -15, 15, -3, 1, 33, 7, 1, -12, + -58, 5, 15, 13, 29, 3, -16, 13, -4, 57, + -10, 13, 11, -13, -21, -15, -9, 40, 55, -3, + 14, 19, 44, -17, 24, 32, -5, 4, -21, -18, + }, { + 76, 1, -41, -9, -19, -12, 41, 17, 55, 18, + -3, -63, -3, -12, 30, 5, -3, -12, -31, 0, + -24, 49, -8, 9, -1, -33, -12, -29, 27, -18, + 37, 21, 34, -17, -3, -11, 14, -23, 25, -2, + }, { + 7, 22, -18, 29, 1, -25, 36, 21, 20, -9, + -22, -56, -11, 6, 45, 21, -15, -16, -20, -1, + -33, 34, -2, -6, -17, -23, -28, 6, 25, -12, + 16, 37, 53, -1, -11, -15, -8, -25, 20, -11, + }, { + 37, 8, -29, -22, -4, -37, 36, 9, 34, 22, + -17, -24, 8, -18, 15, -2, 1, -14, -31, 25, + 15, 48, 13, -4, -28, -31, -5, -21, 57, -4, + 53, 24, 23, -55, 6, 12, 37, -6, 11, 11, + }, { + -31, 28, -6, 16, 16, -50, 31, 14, 0, -6, + -36, -17, 0, 0, 29, 14, -11, -18, -20, 25, + 6, 33, 19, -20, -43, -21, -21, 14, 55, 0, + 32, 40, 42, -39, -1, 8, 14, -8, 6, 3, + }, { + 119, -24, -39, -44, -51, 66, -14, 15, 31, -26, + -1, 0, 7, 16, -19, -28, -19, 22, -26, 4, + -13, 28, -16, 29, 5, -1, 16, -16, 8, -35, + -10, -42, -4, 17, 29, -19, -42, -7, 0, -15, + }, { + 50, -3, -16, -5, -30, 53, -19, 20, -3, -55, + -19, 8, 0, 34, -5, -11, -32, 18, -15, 4, + -22, 13, -10, 13, -9, 8, 0, 19, 7, -29, + -31, -26, 13, 33, 21, -22, -65, -9, -4, -23, + }, { + 79, -17, -27, -56, -36, 41, -19, 8, 10, -22, + -15, 39, 20, 9, -35, -35, -15, 20, -26, 31, + 26, 27, 6, 15, -20, 0, 23, -8, 38, -22, + 5, -38, -15, -20, 39, 4, -18, 9, -13, -1, + }, { + 10, 3, -4, -18, -15, 27, -24, 13, -24, -51, + -34, 47, 12, 28, -21, -19, -27, 16, -15, 30, + 17, 12, 12, 0, -36, 10, 7, 27, 37, -16, + -15, -22, 3, -4, 31, 1, -42, 7, -18, -9, + }, { + 74, -12, -30, -42, -30, 14, -16, 23, 29, -19, + 20, -21, -7, 1, -19, -17, -14, -10, -43, -27, + 3, 48, -8, 22, -16, -7, 4, -42, 9, -31, + 6, -20, -6, -4, 3, -43, -22, -20, 28, 5, + }, { + 5, 7, -7, -4, -9, 0, -21, 28, -6, -48, + 2, -14, -15, 20, -5, 0, -27, -14, -32, -28, + -5, 32, -2, 6, -32, 3, -12, -5, 8, -25, + -14, -4, 12, 11, -4, -47, -45, -22, 22, -2, + }, { + 34, -6, -18, -55, -15, -11, -21, 16, 8, -16, + 6, 16, 5, -4, -35, -24, -10, -12, -43, -1, + 43, 47, 14, 8, -43, -5, 10, -34, 39, -18, + 22, -16, -17, -42, 13, -19, 1, -3, 14, 20, + }, { + -34, 14, 4, -17, 5, -24, -26, 20, -27, -45, + -12, 24, -2, 13, -21, -8, -22, -16, -32, -2, + 34, 31, 20, -7, -58, 5, -5, 2, 38, -12, + 2, -1, 1, -26, 5, -23, -21, -6, 8, 11, + }, { + 124, -13, -21, -23, -62, 23, 0, 43, 57, 8, + -13, -18, 14, -10, 6, -26, -3, 49, -19, 19, + -31, 27, -7, 0, 11, -20, 29, -1, 12, -47, + 4, -39, 11, 34, 28, -9, -5, -19, -13, -34, + }, { + 55, 6, 1, 14, -41, 10, -4, 48, 22, -20, + -31, -10, 5, 7, 20, -9, -16, 45, -8, 19, + -40, 12, -1, -15, -4, -10, 12, 34, 11, -41, + -16, -24, 30, 49, 20, -13, -28, -22, -18, -43, + }, { + 84, -6, -9, -36, -47, -1, -4, 36, 36, 12, + -27, 20, 26, -17, -9, -33, 1, 47, -19, 46, + 9, 27, 15, -13, -15, -18, 35, 6, 42, -33, + 20, -36, 1, -4, 38, 14, 18, -2, -27, -20, + }, { + 15, 13, 13, 1, -26, -14, -9, 41, 1, -16, + -46, 27, 18, 1, 4, -16, -11, 43, -8, 45, + 0, 11, 21, -29, -30, -8, 19, 42, 41, -28, + 0, -20, 20, 11, 30, 10, -4, -5, -32, -28, + }, { + 79, -2, -12, -22, -42, -28, -1, 51, 54, 15, + 8, -41, 0, -24, 6, -15, 1, 17, -36, -12, + -14, 47, 0, -6, -11, -26, 16, -27, 13, -43, + 22, -18, 10, 12, 2, -34, 15, -33, 13, -13, + }, { + 10, 18, 10, 15, -21, -41, -6, 56, 19, -13, + -9, -33, -9, -6, 20, 1, -11, 13, -24, -13, + -23, 32, 6, -22, -26, -15, 0, 8, 12, -37, + 1, -2, 28, 27, -5, -37, -7, -35, 8, -21, + }, { + 39, 4, 0, -35, -27, -53, -6, 44, 33, 18, + -5, -2, 11, -31, -9, -22, 6, 15, -36, 13, + 25, 46, 23, -20, -37, -24, 23, -19, 43, -29, + 38, -14, 0, -26, 12, -10, 38, -16, 0, 0, + }, { + -29, 25, 22, 2, -6, -67, -11, 49, -1, -10, + -24, 5, 3, -13, 4, -5, -6, 11, -25, 12, + 16, 31, 28, -36, -53, -13, 6, 16, 42, -24, + 17, 1, 18, -10, 4, -13, 15, -18, -5, -7, + }, { + 29, -25, -22, -2, 6, 67, 11, -49, 1, 10, + 24, -5, -3, 13, -4, 5, 6, -11, 25, -12, + -16, -31, -28, 36, 53, 13, -6, -16, -42, 24, + -17, -1, -18, 10, -4, 13, -15, 18, 5, 7, + }, { + -39, -4, 0, 35, 27, 53, 6, -44, -33, -18, + 5, 2, -11, 31, 9, 22, -6, -15, 36, -13, + -25, -46, -23, 20, 37, 24, -23, 19, -43, 29, + -38, 14, 0, 26, -12, 10, -38, 16, 0, 0, + }, { + -10, -18, -10, -15, 21, 41, 6, -56, -19, 13, + 9, 33, 9, 6, -20, -1, 11, -13, 24, 13, + 23, -32, -6, 22, 26, 15, 0, -8, -12, 37, + -1, 2, -28, -27, 5, 37, 7, 35, -8, 21, + }, { + -79, 2, 12, 22, 42, 28, 1, -51, -54, -15, + -8, 41, 0, 24, -6, 15, -1, -17, 36, 12, + 14, -47, 0, 6, 11, 26, -16, 27, -13, 43, + -22, 18, -10, -12, -2, 34, -15, 33, -13, 13, + }, { + -15, -13, -13, -1, 26, 14, 9, -41, -1, 16, + 46, -27, -18, -1, -4, 16, 11, -43, 8, -45, + 0, -11, -21, 29, 30, 8, -19, -42, -41, 28, + 0, 20, -20, -11, -30, -10, 4, 5, 32, 28, + }, { + -84, 6, 9, 36, 47, 1, 4, -36, -36, -12, + 27, -20, -26, 17, 9, 33, -1, -47, 19, -46, + -9, -27, -15, 13, 15, 18, -35, -6, -42, 33, + -20, 36, -1, 4, -38, -14, -18, 2, 27, 20, + }, { + -55, -6, -1, -14, 41, -10, 4, -48, -22, 20, + 31, 10, -5, -7, -20, 9, 16, -45, 8, -19, + 40, -12, 1, 15, 4, 10, -12, -34, -11, 41, + 16, 24, -30, -49, -20, 13, 28, 22, 18, 43, + }, { + -124, 13, 21, 23, 62, -23, 0, -43, -57, -8, + 13, 18, -14, 10, -6, 26, 3, -49, 19, -19, + 31, -27, 7, 0, -11, 20, -29, 1, -12, 47, + -4, 39, -11, -34, -28, 9, 5, 19, 13, 34, + }, { + 34, -14, -4, 17, -5, 24, 26, -20, 27, 45, + 12, -24, 2, -13, 21, 8, 22, 16, 32, 2, + -34, -31, -20, 7, 58, -5, 5, -2, -38, 12, + -2, 1, -1, 26, -5, 23, 21, 6, -8, -11, + }, { + -34, 6, 18, 55, 15, 11, 21, -16, -8, 16, + -6, -16, -5, 4, 35, 24, 10, 12, 43, 1, + -43, -47, -14, -8, 43, 5, -10, 34, -39, 18, + -22, 16, 17, 42, -13, 19, -1, 3, -14, -20, + }, { + -5, -7, 7, 4, 9, 0, 21, -28, 6, 48, + -2, 14, 15, -20, 5, 0, 27, 14, 32, 28, + 5, -32, 2, -6, 32, -3, 12, 5, -8, 25, + 14, 4, -12, -11, 4, 47, 45, 22, -22, 2, + }, { + -74, 12, 30, 42, 30, -14, 16, -23, -29, 19, + -20, 21, 7, -1, 19, 17, 14, 10, 43, 27, + -3, -48, 8, -22, 16, 7, -4, 42, -9, 31, + -6, 20, 6, 4, -3, 43, 22, 20, -28, -5, + }, { + -10, -3, 4, 18, 15, -27, 24, -13, 24, 51, + 34, -47, -12, -28, 21, 19, 27, -16, 15, -30, + -17, -12, -12, 0, 36, -10, -7, -27, -37, 16, + 15, 22, -3, 4, -31, -1, 42, -7, 18, 9, + }, { + -79, 17, 27, 56, 36, -41, 19, -8, -10, 22, + 15, -39, -20, -9, 35, 35, 15, -20, 26, -31, + -26, -27, -6, -15, 20, 0, -23, 8, -38, 22, + -5, 38, 15, 20, -39, -4, 18, -9, 13, 1, + }, { + -50, 3, 16, 5, 30, -53, 19, -20, 3, 55, + 19, -8, 0, -34, 5, 11, 32, -18, 15, -4, + 22, -13, 10, -13, 9, -8, 0, -19, -7, 29, + 31, 26, -13, -33, -21, 22, 65, 9, 4, 23, + }, { + -119, 24, 39, 44, 51, -66, 14, -15, -31, 26, + 1, 0, -7, -16, 19, 28, 19, -22, 26, -4, + 13, -28, 16, -29, -5, 1, -16, 16, -8, 35, + 10, 42, 4, -17, -29, 19, 42, 7, 0, 15, + }, { + 31, -28, 6, -16, -16, 50, -31, -14, 0, 6, + 36, 17, 0, 0, -29, -14, 11, 18, 20, -25, + -6, -33, -19, 20, 43, 21, 21, -14, -55, 0, + -32, -40, -42, 39, 1, -8, -14, 8, -6, -3, + }, { + -37, -8, 29, 22, 4, 37, -36, -9, -34, -22, + 17, 24, -8, 18, -15, 2, -1, 14, 31, -25, + -15, -48, -13, 4, 28, 31, 5, 21, -57, 4, + -53, -24, -23, 55, -6, -12, -37, 6, -11, -11, + }, { + -7, -22, 18, -29, -1, 25, -36, -21, -20, 9, + 22, 56, 11, -6, -45, -21, 15, 16, 20, 1, + 33, -34, 2, 6, 17, 23, 28, -6, -25, 12, + -16, -37, -53, 1, 11, 15, 8, 25, -20, 11, + }, { + -76, -1, 41, 9, 19, 12, -41, -17, -55, -18, + 3, 63, 3, 12, -30, -5, 3, 12, 31, 0, + 24, -49, 8, -9, 1, 33, 12, 29, -27, 18, + -37, -21, -34, 17, 3, 11, -14, 23, -25, 2, + }, { + -13, -17, 15, -15, 3, -1, -33, -7, -1, 12, + 58, -5, -15, -13, -29, -3, 16, -13, 4, -57, + 10, -13, -11, 13, 21, 15, 9, -40, -55, 3, + -14, -19, -44, 17, -24, -32, 5, -4, 21, 18, + }, { + -82, 3, 38, 23, 24, -15, -38, -2, -37, -15, + 39, 2, -23, 4, -15, 12, 3, -17, 15, -58, + 1, -29, -6, -2, 5, 26, -7, -4, -56, 9, + -35, -3, -25, 33, -32, -36, -17, -7, 15, 9, + }, { + -52, -10, 27, -27, 18, -26, -38, -14, -23, 16, + 44, 33, -3, -20, -45, -10, 20, -15, 3, -31, + 50, -14, 10, 0, -5, 17, 15, -32, -24, 16, + 1, -15, -55, -20, -14, -8, 29, 12, 7, 32, + }, { + -121, 9, 50, 10, 40, -40, -43, -9, -58, -12, + 25, 41, -11, -2, -31, 5, 8, -19, 15, -32, + 41, -30, 16, -16, -20, 28, 0, 3, -26, 22, + -19, 0, -36, -4, -22, -12, 6, 9, 1, 24, + }, { + 36, -18, 24, 3, -28, 7, -16, 13, 26, 41, + 24, -1, 5, -26, -3, -12, 27, 46, 27, -10, + -24, -34, -10, -8, 49, 2, 34, 0, -51, -12, + -17, -38, -25, 56, 0, 0, 22, -3, -20, -22, + }, { + -32, 2, 47, 42, -7, -5, -21, 18, -9, 12, + 5, 5, -2, -8, 10, 4, 14, 42, 38, -10, + -33, -49, -5, -24, 33, 12, 17, 35, -52, -6, + -38, -22, -7, 72, -7, -3, 0, -6, -25, -30, + }, { + -2, -11, 36, -9, -13, -17, -21, 6, 5, 45, + 10, 36, 18, -33, -19, -19, 31, 44, 27, 15, + 16, -34, 11, -22, 22, 4, 40, 7, -21, 0, + -1, -35, -36, 18, 10, 24, 46, 12, -34, -8, + }, { + -71, 9, 59, 29, 8, -30, -26, 11, -30, 16, + -8, 44, 9, -14, -5, -2, 19, 40, 38, 15, + 7, -50, 17, -38, 7, 14, 24, 43, -22, 6, + -22, -19, -17, 34, 2, 20, 23, 10, -39, -16, + }, { + -8, -6, 33, 4, -7, -44, -18, 21, 23, 48, + 46, -24, -9, -40, -3, -1, 32, 13, 11, -43, + -7, -14, -3, -15, 26, -3, 21, -26, -50, -8, + 0, -16, -27, 34, -25, -23, 43, -17, 6, -1, + }, { + -77, 13, 56, 43, 13, -57, -23, 26, -11, 19, + 27, -16, -17, -22, 10, 15, 19, 10, 22, -43, + -16, -30, 2, -31, 11, 6, 5, 9, -52, -2, + -20, 0, -8, 50, -33, -27, 19, -19, 1, -9, + }, { + -47, 0, 45, -7, 7, -69, -23, 13, 2, 51, + 32, 14, 3, -47, -19, -8, 37, 11, 10, -16, + 32, -15, 19, -29, 0, -1, 28, -18, -20, 4, + 16, -13, -38, -3, -15, 0, 66, 0, -7, 13, + }, { + -116, 20, 68, 30, 28, -83, -28, 18, -32, 22, + 13, 21, -5, -28, -5, 7, 24, 8, 22, -17, + 23, -30, 25, -45, -15, 9, 11, 18, -22, 10, + -4, 2, -19, 12, -23, -3, 43, -2, -12, 4, + }, { + 72, -13, -29, -18, 4, 90, 37, -34, 4, -1, + 13, -9, -6, 11, 2, 24, -13, 3, -7, -11, + -4, 4, -42, 25, 31, -1, -8, -29, -6, 17, + -19, 2, -10, -6, 38, 22, -42, -19, -6, -11, + }, { + 3, 7, -6, 20, 25, 77, 32, -29, -31, -30, + -4, -2, -14, 29, 16, 40, -26, 0, 3, -12, + -13, -10, -36, 9, 15, 8, -24, 6, -7, 22, + -40, 17, 8, 9, 31, 18, -66, -22, -11, -19, + }, { + 32, -6, -17, -31, 19, 65, 33, -41, -16, 1, + 0, 29, 6, 4, -13, 17, -9, 1, -8, 14, + 35, 3, -19, 11, 4, 0, -1, -21, 23, 30, + -3, 5, -20, -44, 48, 46, -19, -3, -20, 3, + }, { + -36, 13, 5, 7, 40, 51, 28, -36, -52, -27, + -18, 36, -2, 22, 0, 33, -21, -2, 3, 13, + 26, -11, -14, -4, -10, 10, -18, 14, 22, 36, + -24, 21, -1, -28, 40, 42, -42, -5, -25, -5, + }, { + 27, -1, -20, -17, 24, 38, 35, -26, 1, 4, + 35, -32, -21, -3, 2, 35, -8, -29, -24, -44, + 12, 24, -34, 18, 8, -7, -21, -55, -5, 21, + -2, 23, -11, -28, 13, -1, -22, -33, 21, 10, + }, { + -41, 18, 2, 21, 45, 24, 30, -21, -33, -24, + 17, -24, -29, 15, 16, 51, -21, -33, -13, -45, + 3, 8, -28, 2, -7, 2, -37, -19, -7, 27, + -22, 39, 7, -12, 5, -5, -45, -35, 15, 1, + }, { + -12, 4, -8, -29, 39, 12, 30, -33, -19, 8, + 21, 6, -8, -9, -13, 28, -4, -31, -24, -18, + 52, 23, -12, 4, -18, -5, -14, -47, 24, 34, + 14, 27, -22, -66, 22, 22, 1, -16, 6, 24, + }, { + -81, 25, 14, 8, 61, 0, 25, -28, -54, -20, + 3, 14, -17, 8, 0, 44, -16, -35, -13, -18, + 43, 7, -6, -11, -33, 4, -30, -11, 22, 40, + -6, 43, -3, -50, 14, 18, -22, -18, 1, 16, + }, { + 77, -2, -11, 1, -7, 47, 52, -5, 29, 33, + 1, -28, 0, -15, 28, 26, 2, 30, 0, 2, + -22, 4, -33, -3, 36, -21, 3, -15, -2, 5, + -4, 4, 6, 9, 37, 31, -5, -32, -20, -30, + }, { + 8, 17, 10, 40, 13, 34, 47, 0, -5, 4, + -16, -21, -8, 2, 42, 43, -10, 26, 10, 2, + -31, -11, -27, -19, 21, -10, -12, 20, -3, 11, + -25, 20, 25, 25, 29, 28, -28, -34, -25, -38, + }, { + 37, 3, 0, -10, 7, 22, 48, -12, 8, 36, + -12, 9, 12, -22, 12, 19, 6, 28, 0, 29, + 18, 3, -11, -17, 10, -18, 10, -7, 27, 18, + 11, 7, -3, -28, 47, 55, 18, -15, -34, -16, + }, { + -31, 24, 23, 27, 29, 9, 43, -8, -26, 7, + -30, 17, 4, -3, 26, 35, -5, 24, 10, 28, + 9, -12, -5, -33, -5, -8, -5, 29, 26, 24, + -9, 23, 14, -12, 39, 52, -5, -18, -39, -24, + }, { + 32, 8, -3, 2, 13, -4, 50, 1, 27, 39, + 23, -51, -15, -30, 27, 37, 7, -1, -17, -29, + -5, 23, -25, -10, 14, -26, -8, -41, -1, 9, + 13, 26, 5, -12, 12, 7, 14, -45, 6, -9, + }, { + -36, 29, 19, 41, 34, -18, 45, 6, -8, 10, + 5, -43, -23, -11, 42, 53, -5, -5, -6, -30, + -14, 8, -20, -26, -1, -16, -25, -4, -3, 15, + -7, 41, 23, 3, 4, 3, -8, -48, 1, -17, + }, { + -7, 15, 9, -9, 28, -29, 45, -5, 6, 43, + 9, -12, -2, -36, 12, 30, 11, -3, -17, -3, + 34, 22, -3, -24, -12, -24, -2, -32, 28, 22, + 29, 29, -5, -50, 21, 31, 38, -29, -7, 5, + }, { + -76, 35, 31, 28, 49, -43, 40, 0, -29, 14, + -8, -5, -10, -18, 26, 46, 0, -7, -6, -3, + 25, 7, 2, -40, -28, -14, -18, 3, 27, 28, + 8, 45, 13, -34, 13, 27, 15, -31, -12, -3, + }, { + 74, -17, 0, -31, -18, 73, -5, 0, 3, -5, + 25, 12, -3, -1, -22, 3, -9, 33, -12, -24, + 6, 2, -33, 9, 21, 5, 20, -27, -19, -7, + -34, -37, -34, 22, 44, 0, -41, -29, -17, -21, + }, { + 5, 3, 21, 7, 2, 60, -10, 5, -32, -34, + 7, 20, -11, 16, -8, 20, -21, 29, -1, -24, + -2, -13, -27, -6, 5, 15, 3, 8, -21, -1, + -55, -21, -15, 38, 37, -3, -65, -32, -23, -30, + }, { + 35, -10, 11, -44, -3, 48, -10, -6, -17, -2, + 11, 51, 8, -8, -38, -3, -4, 31, -12, 2, + 46, 1, -10, -4, -5, 7, 26, -19, 10, 5, + -18, -34, -45, -15, 54, 24, -18, -13, -31, -7, + }, { + -33, 10, 34, -5, 17, 35, -15, -1, -53, -30, + -6, 59, 0, 10, -24, 13, -17, 27, -1, 1, + 37, -13, -4, -20, -20, 18, 10, 16, 8, 11, + -39, -18, -26, 0, 46, 20, -41, -15, -37, -15, + }, { + 29, -5, 7, -30, 1, 21, -7, 7, 0, 0, + 47, -9, -18, -15, -22, 14, -4, 0, -28, -57, + 23, 21, -25, 2, -1, 0, 7, -53, -19, -3, + -17, -15, -36, 0, 19, -24, -21, -43, 9, 0, + }, { + -39, 14, 30, 8, 22, 8, -12, 12, -34, -27, + 29, -2, -26, 2, -8, 31, -16, -3, -17, -57, + 14, 6, -19, -13, -16, 10, -8, -17, -20, 2, + -38, 0, -17, 16, 11, -27, -44, -45, 4, -8, + }, { + -9, 1, 20, -43, 17, -3, -12, 0, -20, 4, + 33, 29, -6, -22, -38, 7, 0, -1, -29, -30, + 63, 21, -3, -11, -27, 1, 14, -45, 10, 9, + -1, -12, -47, -37, 28, 0, 2, -26, -4, 13, + }, { + -78, 21, 43, -4, 38, -17, -17, 5, -55, -24, + 15, 36, -14, -4, -24, 24, -12, -5, -17, -31, + 54, 5, 2, -27, -43, 12, -2, -9, 9, 15, + -22, 3, -28, -21, 20, -3, -20, -28, -9, 5, + }, { + 80, -6, 16, -11, -30, 30, 9, 28, 28, 29, + 13, -6, 2, -28, 3, 5, 7, 60, -5, -9, + -11, 1, -24, -19, 27, -13, 32, -13, -15, -19, + -19, -35, -17, 39, 43, 9, -4, -42, -32, -41, + }, { + 11, 14, 39, 27, -9, 17, 4, 33, -6, 0, + -4, 1, -5, -10, 17, 22, -5, 57, 5, -9, + -20, -13, -18, -35, 11, -3, 16, 22, -17, -13, + -40, -19, 1, 55, 35, 5, -27, -44, -37, -49, + }, { + 40, 0, 28, -24, -14, 5, 4, 21, 7, 33, + 0, 32, 15, -35, -12, -1, 11, 58, -5, 16, + 28, 0, -1, -33, 0, -11, 39, -5, 14, -6, + -3, -31, -28, 1, 53, 33, 19, -25, -46, -26, + }, { + -28, 20, 51, 14, 6, -7, 0, 26, -27, 4, + -18, 40, 6, -16, 1, 15, 0, 55, 5, 16, + 19, -14, 3, -49, -14, -1, 22, 30, 12, 0, + -24, -15, -9, 17, 45, 29, -4, -28, -51, -35, + }, { + 34, 4, 25, -10, -9, -21, 7, 36, 26, 36, + 35, -28, -12, -42, 3, 16, 12, 28, -21, -42, + 5, 21, -16, -26, 4, -19, 19, -39, -15, -15, + -1, -13, -19, 17, 17, -14, 15, -55, -4, -19, + }, { + -34, 25, 48, 28, 11, -34, 2, 41, -9, 7, + 17, -21, -20, -24, 17, 33, 0, 24, -10, -42, + -3, 5, -10, -42, -11, -8, 3, -3, -16, -9, + -22, 2, 0, 33, 10, -18, -7, -58, -10, -28, + }, { + -4, 11, 37, -23, 5, -46, 2, 29, 5, 39, + 21, 9, 0, -49, -12, 9, 16, 26, -22, -15, + 45, 20, 5, -40, -22, -17, 26, -31, 14, -2, + 14, -10, -30, -20, 27, 9, 39, -39, -18, -5, + }, { + -73, 32, 60, 15, 26, -59, -2, 33, -30, 10, + 3, 17, -8, -30, 1, 26, 4, 22, -10, -16, + 36, 5, 11, -56, -37, -6, 10, 5, 13, 3, + -6, 5, -11, -4, 19, 5, 16, -41, -24, -13 + } +}; -static const signed short etable2[5120]={ -0x0049,0xffe0,0xffc4,0xfff1,0xffe6,0x003b,0x0002,0xffdf, -0x001e,0xfff6,0xfffd,0xffef,0x0008,0x001e,0xffff,0xffe6, -0xfffc,0xffea,0x000a,0x0010,0xffdc,0xfffb,0xfff5,0x0038, -0x0025,0x0006,0xfff6,0xfffb,0xfff3,0xfffd,0x0006,0xfffb, -0x000b,0x0004,0xffed,0xfffb,0xfff0,0x0029,0x0018,0x000d, -0x0004,0xfff5,0xffdb,0x0017,0xfffb,0x002e,0xfffe,0xffe3, -0xfffb,0xffd9,0xffeb,0xfff7,0x0000,0x0031,0x000c,0xfff7, -0xfff0,0xffe6,0x0016,0x000f,0xffd3,0xffec,0xfffb,0x0028, -0x0016,0x0011,0xffe6,0x001f,0xfff2,0x0002,0xfff2,0x000a, -0x001e,0x0014,0xffe5,0xfff7,0xffd9,0x0027,0x0012,0x0005, -0x0022,0xffe7,0xffd0,0xffe4,0xfff5,0x0022,0xfffe,0xffd7, -0x0009,0xfff9,0xffef,0x0015,0x0014,0x0018,0xffef,0xffdf, -0x0000,0xffe8,0x000a,0x002a,0x0003,0xfffb,0x000a,0x002a, -0x000b,0x0008,0xfffd,0x0003,0x0010,0x0009,0x0016,0xfffe, -0x0000,0xffdf,0xfff6,0x0012,0x0007,0x003a,0x000a,0x001c, -0xffde,0xfffc,0xffe7,0x000a,0x0009,0x0015,0xfff9,0xffdc, -0xffe6,0xffdc,0xffdd,0x001c,0x000c,0x002a,0xfffd,0xfff0, -0xfff4,0xffe4,0x0015,0x002a,0xfffb,0xffeb,0x0010,0x001a, -0xfffc,0x0013,0xffed,0x0027,0x000f,0x000f,0x0001,0x000d, -0x0013,0xffef,0xffef,0x000e,0xfff1,0x0037,0x0004,0x0013, -0x001c,0xffec,0xffcd,0xfff2,0xfffa,0x0007,0x0000,0xffe6, -0x001b,0xfffc,0x0012,0xffd8,0xfffa,0x0010,0xffff,0xfff1, -0x0000,0xffc9,0xfffb,0xfff0,0xffed,0x000e,0xfffd,0x0031, -0x000e,0x0001,0xffea,0xffe2,0xfff4,0x0000,0x0018,0x000f, -0x0009,0xffef,0xffd3,0xffe3,0x0004,0x001c,0x0033,0x0023, -0xffd8,0x0000,0xffe4,0x0018,0x000e,0xfffb,0xfffc,0xffeb, -0xfff9,0xffdf,0x0000,0xffe0,0xfff1,0x0023,0x000c,0x0001, -0xfff5,0xffc6,0x0005,0xfff0,0xffe4,0x0000,0x0001,0x0021, -0x0000,0x000b,0xffd9,0x0005,0xfff2,0x0006,0x0003,0x001f, -0x001c,0xffff,0xffcb,0xffdf,0xffed,0x0019,0x002e,0x001a, -0xfff5,0xfff2,0xffd9,0xffe5,0x0009,0xffef,0xfffc,0xffdf, -0x0006,0x0000,0x0004,0xffff,0x0005,0x000a,0xffef,0xffea, -0x0005,0xffc7,0xfffb,0x0009,0x0014,0x000d,0x0012,0x0023, -0xfff5,0x0003,0xfff0,0xffea,0x0011,0x000d,0x0028,0x0013, -0xffff,0xffc9,0xffdd,0xfffb,0x001b,0x002c,0x0025,0x0031, -0xffb0,0x0006,0xfff0,0x000b,0x001e,0xffe2,0xfff7,0xffe4, -0xffe4,0xffe3,0xfff3,0x0006,0xfffe,0x001c,0xfffd,0xfffb, -0xfff9,0xffc4,0x0005,0x0009,0x000b,0xffff,0x0018,0x0013, -0xffe5,0x000d,0xffe0,0x000d,0x000f,0x0013,0x0013,0x0023, -0x0011,0xffd9,0xffd5,0xfff7,0x0004,0x002a,0x0020,0x0029, -0x004e,0xffeb,0xffd5,0x0004,0xffda,0x0011,0x0011,0xfffb, -0x0037,0x0018,0xfff1,0xffdc,0x000e,0x0004,0x0018,0xffe8, -0x000c,0x0005,0x0011,0x001f,0xffca,0xfffb,0xfffe,0x001b, -0x002b,0xfff4,0x0002,0x0009,0xfff7,0xfff1,0x0016,0xfffd, -0x001c,0x0015,0xffec,0x0003,0x0014,0x001c,0x0009,0xfffb, -0x0009,0xffff,0xffec,0x002b,0xffef,0x0003,0x000c,0x0000, -0x0014,0xfffc,0xffdf,0xffe3,0x0006,0x0016,0x0026,0xfff9, -0x0000,0x0001,0x001d,0x001e,0xffc1,0xffeb,0x0003,0x000b, -0x001b,0xffff,0xfff2,0x002d,0xfff6,0xfff7,0x0001,0x000c, -0x002f,0x0025,0xffe4,0x0000,0xfffe,0x001a,0x0004,0xfff3, -0x0027,0xfff2,0xffe2,0xfff8,0xffea,0xfff8,0x000c,0xfff4, -0x0022,0x001b,0xffe3,0x0002,0x001a,0xfffe,0x0008,0xffe1, -0x0010,0x0003,0x0011,0x0039,0xfff2,0xfffa,0x0013,0x000d, -0x0010,0xfff6,0x0008,0x0011,0x0014,0xfffe,0x0026,0x0000, -0x0011,0xfff0,0xfff5,0x001b,0x002c,0x002d,0xfffc,0x0008, -0xffe3,0x0005,0xfff9,0x001e,0xffff,0xffeb,0x0007,0xfff9, -0x0000,0x0000,0xffd1,0x0009,0x0012,0x000f,0x0016,0xfff2, -0x0004,0x0000,0x001c,0x0039,0xffe9,0xffeb,0x0019,0xfffe, -0x0001,0x0000,0xfff9,0x0035,0x0013,0x0003,0x0011,0x000f, -0x0024,0x0000,0xffed,0x0018,0x0015,0x002b,0xfff7,0x0000, -0x0021,0xfff6,0xffde,0x0005,0xffef,0xffdd,0x000f,0x0001, -0x0035,0x001e,0x0006,0xffc5,0x0000,0xfff6,0x0018,0xfff3, -0x0011,0xffe5,0x0001,0xffff,0xffdb,0x000d,0x0004,0x0014, -0x0014,0xffee,0xfff6,0xfff0,0xfff8,0xfff5,0x0027,0x0012, -0x001a,0x0000,0xffd2,0xffec,0x0029,0x000f,0x0025,0x000f, -0xffdd,0x000a,0xfff5,0x002c,0x0003,0xffd0,0x000a,0x0006, -0x0011,0x0002,0xfff5,0xffcd,0xfff8,0x0008,0x0026,0x0003, -0x0004,0xffe1,0x000c,0xfffe,0xffd2,0xffff,0x000a,0x0004, -0x0005,0xfff9,0xffe6,0x0013,0xfff6,0xfffb,0x0012,0x0022, -0x002d,0x000f,0xffca,0xffe8,0x0012,0x000d,0x001f,0x0007, -0xfffb,0xfffd,0xffeb,0xfff9,0xfffe,0xffc4,0x000a,0xfffb, -0x0020,0x0022,0xfff9,0xffec,0x000b,0xfff0,0x0008,0xffec, -0x0015,0xffe3,0x0001,0x0018,0x0002,0x000d,0x001b,0x0006, -0xfffb,0xfff1,0xfffd,0xfff8,0x0015,0x0001,0x0037,0x0015, -0x000f,0xffda,0xffdb,0x0003,0x0041,0x0020,0x0017,0x001e, -0xffb6,0x0011,0x0000,0x001f,0x0012,0xffb7,0x0005,0x0000, -0xfffd,0x0005,0xffe7,0xfff4,0x0003,0x0001,0x0016,0xfffd, -0x0009,0xffdf,0x000c,0x0018,0xfffa,0xfffe,0x0021,0xfff7, -0xffeb,0xfffb,0xffec,0x001b,0x0013,0x0007,0x0022,0x0025, -0x0022,0xffea,0xffd4,0x0000,0x0029,0x001d,0x0011,0x0015, -0x004c,0xffdd,0xffe1,0xffe4,0xffcf,0x002b,0xffd8,0x0000, -0x001d,0xfff2,0x0008,0x0005,0x000a,0x0012,0xffe6,0xffd2, -0x0000,0x0007,0x0006,0x0003,0xffe7,0xfff9,0xfffe,0x0028, -0x001c,0x000e,0x0012,0xfffd,0xffe5,0xffe4,0xfff8,0xffd3, -0xfff3,0x0022,0xfff3,0xffe5,0xfff1,0x001f,0x000c,0x0003, -0x0007,0xfff1,0xfff7,0x0009,0xffe4,0x001d,0xffd3,0x0005, -0xfffa,0xffd5,0xfff7,0x000c,0x0002,0x0024,0xfff4,0xffe2, -0xfff5,0x0003,0x0011,0x0003,0xffde,0xffea,0x0003,0x0018, -0x000c,0x0018,0x0002,0x0020,0xffe4,0xffea,0xffe3,0xffe3, -0x0005,0x0032,0xffeb,0xffe1,0xffda,0x001d,0x0007,0xfffb, -0x0024,0xffe3,0xffed,0xffd7,0xffde,0x0012,0xffd3,0xfffa, -0x0008,0xfff6,0xfffb,0x002b,0x0017,0x000b,0xffd6,0xffcb, -0x0005,0x0005,0x0006,0x001e,0x000e,0xfff8,0x0014,0x001a, -0x0001,0x0010,0x0019,0x0004,0x0003,0xfff1,0x0007,0xffd7, -0xffe9,0xfffd,0xfffc,0xfffd,0x0008,0x0030,0xffff,0x0011, -0xffe0,0xfff8,0x0003,0xfffe,0xfff3,0x0004,0xffce,0xffff, -0xffe5,0xffd9,0xffe9,0x0033,0x000f,0x001e,0xffe5,0xffdb, -0xfff9,0x0001,0x0011,0x001d,0x0005,0xffe9,0x0019,0x000a, -0xfff2,0x001a,0x0008,0x0029,0x0001,0xfff7,0xfff3,0xffe6, -0xfffb,0x000c,0xfff4,0xfff9,0xfff2,0x002d,0xfffa,0x0009, -0x001f,0xffe8,0xffe9,0xffe5,0xffe3,0xfff7,0xffd5,0x0008, -0x001a,0xfff9,0x001e,0xffef,0xfffc,0x0003,0xffe6,0xffdd, -0x0005,0xffe8,0xfff6,0xffe4,0xfff7,0x000c,0x0005,0x0021, -0x0005,0x0008,0x0005,0xffe3,0xffe6,0xffe8,0x0009,0xffe9, -0xfff2,0x000c,0xffd9,0xffcc,0x0005,0x0012,0x0027,0x0018, -0xffdb,0xfffd,0x0000,0x000a,0xfff9,0xffea,0xffd0,0x000c, -0xfff8,0xffdc,0x000c,0xfff7,0xfff4,0x0016,0xfff4,0xffed, -0xfffa,0xffe4,0x0000,0xffe3,0xffee,0xfffd,0x000b,0x0011, -0xfff6,0x0012,0xfff6,0x0007,0xffe5,0xffee,0xfff5,0xfff9, -0x0003,0x001c,0xffd1,0xffc9,0xffee,0x000f,0x0022,0x0010, -0xfff8,0xffef,0xfff6,0xffd8,0xfff3,0xffde,0xffd1,0x0000, -0x0005,0xfffc,0x0010,0x0015,0x0008,0xfffe,0xffd6,0xffd5, -0x000a,0xffe6,0xfff6,0xfffe,0x001f,0x000b,0x001b,0x0013, -0xffeb,0x000a,0x000c,0xffec,0x0003,0xfff5,0x0019,0xffec, -0xffe7,0xffe7,0xffe3,0xffe4,0x001c,0x0022,0x0019,0x0026, -0xffb3,0x0002,0x000b,0xffff,0x0007,0xffd1,0xffcc,0x0005, -0xffe3,0xffdf,0xffff,0x001c,0x0000,0x000f,0xffe4,0xffe6, -0xfffe,0xffe2,0x0000,0xfffe,0x0016,0xfffc,0x0021,0x0003, -0xffdc,0x0015,0xfffd,0x000f,0x0002,0xfffb,0x0004,0xfffc, -0xfffa,0xfff7,0xffdb,0xffe1,0x0005,0x0020,0x0014,0x001e, -0x0051,0xffe7,0xfff2,0xfff8,0xffc3,0x0000,0xffe7,0x001c, -0x0036,0x0014,0xfffd,0xfff2,0x0011,0xfff8,0x0000,0xffd4, -0x0010,0x0023,0x000d,0x0012,0xffd5,0xfff9,0x0006,0x000b, -0x0021,0xfffc,0x001e,0x000b,0xffea,0xffd8,0x0006,0xffd5, -0x0003,0x0032,0xfff2,0xffee,0x0016,0x0012,0xffff,0xfff0, -0x000c,0xfffc,0x0008,0x001d,0xffd9,0xfff4,0xffe2,0x0021, -0x0013,0xfff8,0xffeb,0xfffa,0x0008,0x0009,0x000d,0xffe4, -0x0004,0x001f,0x0018,0x0012,0xffcc,0xffe9,0x000c,0xfffc, -0x0012,0x0005,0x000e,0x002f,0xffe8,0xffde,0xfff2,0xffe5, -0x0016,0x0042,0xffea,0xffea,0xffff,0x0010,0xfffa,0xffe8, -0x0029,0xffee,0xfffe,0xffeb,0xffd3,0xffe8,0xffe2,0x0015, -0x0021,0x0018,0xffef,0x0018,0x001d,0xfff1,0xfff0,0xffcd, -0x0015,0x0021,0x000d,0x002d,0xfffd,0xfff8,0x001c,0xfffe, -0x0007,0xfffe,0x0025,0x0013,0x0007,0xffe5,0x0016,0xffd9, -0xfff9,0x000c,0xfffb,0x0005,0x002d,0x0023,0xfff1,0xffff, -0xffe5,0x0001,0x0014,0x0011,0xffe8,0xffda,0xffdd,0x001a, -0xffff,0xfffc,0xffdd,0x0020,0x0015,0x0003,0xfffe,0xffdd, -0x0008,0x001d,0x0018,0x002c,0xfff4,0xffe8,0x0022,0xffee, -0xfff8,0x0007,0x0015,0x0037,0x0005,0xffeb,0x0002,0xffe9, -0x000b,0x001c,0xfff3,0x0001,0x0016,0x0021,0xffeb,0xfff6, -0x0024,0xfff3,0xfffb,0xfff9,0xffd8,0xffcd,0xffe4,0x0024, -0x0034,0x001b,0x0012,0xffdc,0x0002,0xffea,0x0000,0xffdf, -0x0015,0x0002,0xfffd,0xfff3,0xffe6,0x000b,0x000e,0x0004, -0x000a,0xfff6,0x0012,0xfff2,0xffea,0xffdc,0x0018,0xffeb, -0x0001,0x001c,0xffd8,0xffd6,0x002a,0x0005,0x0019,0x0005, -0xffe0,0x0006,0x0011,0x001f,0xffed,0xffbf,0xffdf,0x0029, -0x0010,0xffff,0x0000,0xffe3,0xfffa,0xfffc,0x000d,0xffef, -0x0009,0xffff,0x0008,0xfff2,0xffdd,0xfffd,0x0013,0xfff5, -0xfffc,0x0000,0x0001,0x0015,0xffe9,0xffe2,0x0003,0xfffb, -0x0014,0x002c,0xffd0,0xffd2,0x0013,0x0003,0x0014,0xfffd, -0xfffd,0xfff9,0x0006,0xffec,0xffe7,0xffb3,0xffe0,0x001d, -0x001f,0x001e,0x0004,0x0002,0x000e,0xffe3,0xfff0,0xffd8, -0x001a,0x0000,0xfffd,0x000c,0x000d,0x000a,0x0024,0xfff7, -0xfff1,0xfff8,0x0018,0xfffa,0x0007,0xffea,0x0028,0xffef, -0xfff8,0xfff7,0xffe1,0xffee,0x0042,0x0016,0x000b,0x0013, -0xffb8,0x000d,0x001d,0x0012,0xfffc,0xffa6,0xffdb,0x0022, -0xfffc,0x0001,0xfff3,0x0009,0x0006,0xfff5,0xfffe,0xffe8, -0x000d,0xfffd,0x0007,0x000b,0x0004,0xfffc,0x002a,0xffe7, -0xffe1,0x0001,0x0008,0x001d,0x0006,0xffef,0x0013,0xfffe, -0x000a,0x0006,0xffda,0xffea,0x002a,0x0013,0x0006,0x000b, -0x0074,0xffec,0xffbc,0xffe2,0xffe4,0x0053,0x001c,0xffee, -0x0020,0xffea,0xfff3,0xffeb,0x0005,0x001c,0x0005,0xfff9, -0xffe8,0xfff8,0xffea,0x0011,0xffe9,0x001e,0xffe7,0x002d, -0x000f,0xfff7,0xfff5,0xffee,0x0016,0xfff6,0x0004,0xfffe, -0x0013,0xfff4,0x0017,0x0003,0xffd5,0x0002,0x000c,0xfffc, -0x002f,0x0000,0xffd3,0x0007,0xfff9,0x0045,0x0017,0xfff3, -0xfffe,0xffcd,0xffe0,0xfff2,0xfffd,0x002f,0x0013,0x0008, -0xffdb,0xfff5,0xfff6,0x0010,0xffe0,0x000f,0xffed,0x001d, -0x0000,0x0001,0xffe4,0x0012,0x0014,0xfffc,0xfff0,0x000d, -0x0026,0x0003,0x000f,0x0000,0xffbe,0x0000,0x0007,0xfff3, -0x004d,0xfff3,0xffc8,0xffd5,0xfff3,0x0039,0x0017,0xffe6, -0x000b,0xffed,0xffe5,0x0010,0x0011,0x0016,0xfff6,0xfff1, -0xffed,0xfff6,0xffea,0x002b,0x0010,0x001e,0xfffe,0x001f, -0xfff5,0xfffa,0xfffb,0xfff7,0x0034,0x0002,0x0014,0x0000, -0x0008,0xffce,0x0021,0x001b,0xffed,0x0013,0xffff,0x0009, -0x0008,0x0006,0xffdf,0xfffc,0x0007,0x002c,0x0012,0xffeb, -0xffe9,0xffd0,0xffd2,0x0018,0x0009,0x0028,0x0003,0x0001, -0xffe0,0xfff3,0xfff5,0x002b,0x0007,0x000e,0x0003,0x000f, -0xffe6,0x0003,0xffeb,0x001a,0x0032,0x0008,0x0000,0x0010, -0x001b,0xffde,0x0019,0x0017,0xffd5,0x0011,0xfffa,0x0001, -0x0047,0xfff7,0xffc5,0xffe3,0xfff8,0x001e,0x001a,0xfff5, -0x001e,0xfff0,0x0008,0xffd4,0xfff7,0x000e,0x0005,0x0002, -0xffed,0xffd8,0xffda,0xfff1,0xfff9,0x0032,0xffef,0x0026, -0xfff9,0xfff2,0xffe8,0xffd5,0x0016,0xfffa,0x0016,0x0013, -0x0011,0xffde,0xfffe,0xffec,0xffe9,0xfff6,0x0027,0x0010, -0x0002,0x000b,0xffdc,0x0009,0x000d,0x0011,0x0015,0xfffa, -0xfffb,0xffd3,0xfff6,0xffdc,0xffee,0x0021,0x0013,0x0013, -0xffe1,0xffd4,0xffe5,0xfff1,0xfff0,0x0022,0xfff5,0x0016, -0xffea,0xfffc,0xffd8,0xfff9,0x0015,0x0000,0x0001,0x0023, -0x0024,0xffee,0xfff6,0xffe8,0xffd2,0xfff4,0x0022,0x0008, -0x0020,0xfffe,0xffd1,0xffd6,0x0007,0x0005,0x0015,0xffee, -0x0009,0xfff4,0xfffb,0xfffb,0x0002,0x0008,0xfff6,0xfffc, -0xfff2,0xffd6,0xffda,0x000a,0x0021,0x0031,0x0005,0x0018, -0xffdf,0xfff4,0xffef,0xffdd,0x0034,0x0006,0x0026,0x0016, -0x0007,0xffb8,0x0007,0x0003,0x0000,0x0006,0x0019,0x001e, -0xffdc,0x0012,0xffe8,0xfffd,0x001c,0xfff9,0x0010,0xfff3, -0xffe6,0xffd7,0xffe8,0x0001,0xfffb,0x001a,0x0003,0x000c, -0xffe5,0xffd2,0xffe5,0x000a,0x0018,0x0022,0x000a,0x0008, -0xffcf,0xfffe,0xffde,0x0000,0x0033,0x000c,0x0011,0x0026, -0x0019,0xffc8,0x0000,0x0000,0xffea,0x0003,0x0014,0x0016, -0x0079,0xfff7,0xffce,0xfff6,0xffd8,0x0028,0x002b,0x0009, -0x003a,0x000c,0xffe7,0xffd7,0x000b,0x0002,0x001f,0xfffb, -0xfff8,0x0013,0xfff1,0x0020,0xffd7,0x001e,0xfff0,0x0010, -0x0014,0xffe4,0x0000,0xfffd,0x001a,0xffea,0x0013,0x0000, -0x0024,0x0004,0x0016,0x000c,0xfffa,0xfff7,0xffff,0xffe8, -0x0034,0x000a,0xffe5,0x001b,0xffee,0x001a,0x0026,0x000e, -0x0017,0xfff0,0xffd4,0xffdf,0x0003,0x0014,0x002d,0x000a, -0xffec,0x000f,0xfffd,0x001f,0xffce,0x000e,0xfff6,0x0000, -0x0005,0xffef,0xfff1,0x0020,0x0018,0xfff0,0xffff,0x000f, -0x0037,0x0014,0x000e,0x0008,0xffe3,0xfff4,0xfff9,0xffe0, -0x0052,0xfffd,0xffda,0xffe9,0xffe8,0x000f,0x0026,0x0002, -0x0025,0x000f,0xffd9,0xfffe,0x0017,0xfffc,0x000f,0xfff4, -0xfffd,0x0011,0xfff1,0x003a,0xffff,0x001d,0x0006,0x0002, -0xfffb,0xffe6,0x0007,0x0004,0x0038,0xfff7,0x0023,0x0003, -0x0019,0xffdf,0x0020,0x0024,0x0011,0x0007,0xfff1,0xfff7, -0x000d,0x0011,0xfff1,0x000f,0xfffd,0x0001,0x0021,0x0007, -0x0001,0xfff4,0xffc6,0x0005,0x000f,0x000d,0x001d,0x0003, -0xfff0,0x000d,0xfffc,0x0039,0xfff6,0x000d,0x000b,0xfff3, -0xffeb,0xfff1,0xfff7,0x0028,0x0037,0xfffd,0x000e,0x0013, -0x002c,0xffef,0x0018,0x0020,0xfffb,0x0004,0xffeb,0xffee, -0x004c,0x0001,0xffd7,0xfff7,0xffed,0xfff4,0x0029,0x0011, -0x0037,0x0012,0xfffd,0xffc1,0xfffd,0xfff4,0x001e,0x0005, -0xfffd,0xfff4,0xffe1,0x0000,0xffe8,0x0031,0xfff8,0x0009, -0xffff,0xffdf,0xfff4,0xffe3,0x001b,0xffee,0x0025,0x0015, -0x0022,0xffef,0xfffd,0xfff5,0x000e,0xffe9,0x0019,0xfffe, -0x0007,0x0016,0xffee,0x001d,0x0001,0xffe7,0x0024,0x0015, -0x0014,0xfff7,0xffea,0xffc8,0xfff5,0x0006,0x002d,0x0015, -0xfff1,0xfff0,0xffec,0xffff,0xffdf,0x0022,0xfffe,0xfffa, -0xffef,0xffe9,0xffe4,0x0006,0x0019,0xfff4,0x0010,0x0025, -0x0035,0xffff,0xfff5,0xfff1,0xfff8,0xffe7,0x0014,0xfff5, -0x0025,0x0008,0xffe3,0xffea,0xfffc,0xffdb,0x0024,0x0009, -0x0022,0x0016,0xffef,0xffe8,0x0008,0xffee,0x000f,0xfffe, -0x0001,0xfff2,0xffe1,0x0019,0x000f,0x0030,0x000d,0xfffc, -0xffe4,0xffe1,0xfffb,0xffeb,0x0039,0xfffc,0x0035,0x0018, -0x0017,0xffc9,0x0006,0x000c,0x0025,0xfffa,0x000b,0x000b, -0xffe1,0x001c,0xfffa,0x0010,0x0010,0xffce,0x001f,0x000e, -0x0000,0xfffa,0xffdc,0xffef,0x0000,0x0000,0x001d,0x000e, -0xfff5,0xffee,0xffec,0x0019,0x0006,0x0021,0x0013,0xffec, -0xffd5,0xffeb,0xffeb,0x000e,0x0037,0x0000,0x0020,0x0028, -0x002a,0xffd9,0xffff,0x0008,0x000e,0xfff8,0x0006,0x0003, -0x0077,0xffe8,0xffd9,0xffd4,0xffcd,0x0042,0xfff2,0x000f, -0x001f,0xffe6,0xffff,0x0000,0x0007,0x0010,0xffed,0xffe4, -0xffed,0x0016,0xffe6,0x0004,0xfff3,0x001c,0xfff0,0x001d, -0x0005,0xffff,0x0010,0xfff0,0x0008,0xffdd,0xfff6,0xffd6, -0xfffc,0x0011,0x001d,0xffed,0xffd6,0xfff9,0x0000,0xfff1, -0x0032,0xfffd,0xfff0,0xfffb,0xffe2,0x0035,0xffed,0x0014, -0xfffd,0xffc9,0xffed,0x0008,0x0000,0x0022,0xfffb,0xfff5, -0xffe0,0x0012,0xfff1,0x0004,0xffea,0x000d,0xfff6,0x000d, -0xfff7,0x0008,0x0000,0x0013,0x0007,0xffe3,0xffe1,0xffe6, -0x000d,0x0021,0x0015,0xffea,0xffbf,0xfff7,0xfffc,0xffe9, -0x004f,0xffef,0xffe5,0xffc8,0xffdc,0x0029,0xffed,0x0008, -0x000a,0xffea,0xfff1,0x0027,0x0014,0x0009,0xffdd,0xffdd, -0xfff1,0x0014,0xffe6,0x001f,0x001a,0x001b,0x0006,0x000f, -0xffec,0x0000,0x0017,0xfff8,0x0026,0xffea,0x0005,0xffda, -0xfff1,0xffec,0x0027,0x0004,0xffee,0x0009,0xfff3,0xffff, -0x000a,0x0003,0xfffc,0xffee,0xfff1,0x001b,0xffe8,0x000d, -0xffe8,0xffcd,0xffde,0x002f,0x000c,0x001c,0xffeb,0xffed, -0xffe5,0x0010,0xfff1,0x001e,0x0011,0x000c,0x000c,0x0000, -0xffdc,0x000a,0x0007,0x001b,0x0025,0xfff0,0xfff1,0xffea, -0x0003,0xfffc,0x001f,0x0001,0xffd6,0x0007,0xffee,0xfff7, -0x004a,0xfff4,0xffe2,0xffd6,0xffe2,0x000e,0xfff0,0x0017, -0x001d,0xffed,0x0014,0xffeb,0xfff9,0x0001,0xffed,0xffef, -0xfff2,0xfff6,0xffd5,0xffe5,0x0003,0x0030,0xfff8,0x0016, -0xfff0,0xfff9,0x0004,0xffd6,0x0009,0xffe1,0x0006,0xffec, -0xfffa,0xfffc,0x0003,0xffd5,0xffea,0xffec,0x001c,0x0005, -0x0005,0x0007,0xfff9,0xfffc,0xfff7,0x0000,0xffeb,0x001c, -0xfffa,0xffd0,0x0002,0xfff2,0xfff1,0x0014,0xfffb,0x0000, -0xffe5,0xfff2,0xffe0,0xffe4,0xfffb,0x0020,0xfffe,0x0006, -0xffe0,0x0003,0xfff4,0xfffb,0x0008,0xffe7,0xfff2,0xfffc, -0x000c,0x000b,0xfffc,0xffd1,0xffd3,0xffea,0x0016,0xfffe, -0x0022,0xfffa,0xffee,0xffc9,0xfff1,0xfff5,0xffeb,0x0010, -0x0008,0xfff0,0x0006,0x0010,0x0005,0xfffc,0xffdd,0xffe8, -0xfff6,0xfff4,0xffd5,0xffff,0x002b,0x002f,0x000e,0x0008, -0xffd5,0xfffb,0x000a,0xffde,0x0027,0xffee,0x0016,0xfff0, -0xffef,0xffd6,0x000d,0xffed,0x0001,0xfffd,0x000e,0x0014, -0xffde,0x000e,0x0004,0xffef,0x0005,0xffe8,0xffe6,0x0014, -0xffe5,0xffd3,0xfff4,0x0018,0xfffe,0x000d,0xffeb,0xfff8, -0xffea,0xfff0,0xffe0,0xfffe,0x0022,0x001f,0x0014,0xfff9, -0xffc6,0x0005,0xfffb,0x0002,0x0026,0xfff4,0x0002,0xffff, -0x0001,0xffe6,0x0005,0xffe9,0xffeb,0xfffa,0x0008,0x000b, -0x007c,0xfff3,0xffeb,0xffe9,0xffc2,0x0017,0x0000,0x002b, -0x0039,0x0008,0xfff3,0xffee,0x000e,0xfff6,0x0006,0xffe6, -0xfffd,0x0031,0xffed,0x0013,0xffe1,0x001b,0xfff9,0x0000, -0x000b,0xffec,0x001d,0xffff,0x000c,0xffd1,0x0004,0xffd9, -0x000b,0x0022,0x001c,0xfff7,0xfffb,0xffed,0xfff3,0xffde, -0x0037,0x0006,0x0001,0x000e,0xffd7,0x000a,0xfffc,0x0030, -0x0016,0xffec,0xffe1,0xfff6,0x0005,0x0007,0x0014,0xfff7, -0xfff0,0x002d,0xfff8,0x0013,0xffd8,0x000c,0xffff,0xfff1, -0xfffc,0xfff6,0x000c,0x0022,0x000b,0xffd7,0xfff0,0xffe8, -0x001e,0x0031,0x0014,0xfff3,0xffe4,0xffea,0xffee,0xffd5, -0x0054,0xfffa,0xfff7,0xffdc,0xffd1,0xffff,0xfffc,0x0024, -0x0024,0x000c,0xffe5,0x0014,0x001a,0xffef,0xfff7,0xffdf, -0x0001,0x002f,0xffed,0x002e,0x0009,0x001b,0x000f,0xfff3, -0xfff1,0xffee,0x0023,0x0006,0x002a,0xffdf,0x0014,0xffdc, -0x0001,0xfffc,0x0026,0x000e,0x0012,0xfffe,0xffe5,0xffec, -0x000f,0x000d,0x000d,0x0001,0xffe6,0xfff2,0xfff7,0x0029, -0x0001,0xfff0,0xffd2,0x001b,0x0012,0x0001,0x0004,0xfff0, -0xfff5,0x002b,0xfff8,0x002d,0x0000,0x000b,0x0015,0xffe3, -0xffe2,0xfff8,0x0013,0x002a,0x0029,0xffe4,0x0000,0xffec, -0x0014,0x000b,0x001e,0x000a,0xfffc,0xfffb,0xffe0,0xffe4, -0x004f,0xfffe,0xfff4,0xffea,0xffd6,0xffe4,0xffff,0x0033, -0x0036,0x000f,0x0008,0xffd7,0x0000,0xffe8,0x0006,0xfff1, -0x0001,0x0011,0xffdc,0xfff4,0xfff2,0x002f,0x0000,0xfffa, -0xfff5,0xffe6,0x0010,0xffe5,0x000d,0xffd5,0x0016,0xffee, -0x000a,0x000c,0x0002,0xffde,0x000f,0xffdf,0x000d,0xfff3, -0x000a,0x0012,0x000a,0x000f,0xffeb,0xffd7,0xfffa,0x0038, -0x0013,0xfff3,0xfff7,0xffdf,0xfff7,0xfffa,0x0014,0x0001, -0xfff5,0x000d,0xffe8,0xfff3,0xffe9,0x0020,0x0006,0xffea, -0xffe6,0xfff1,0x0000,0x0008,0x000c,0xffdb,0x0001,0xfffe, -0x001c,0x001b,0xfffb,0xffdb,0xfff9,0xffdd,0x0008,0xffeb, -0x0027,0x0004,0x0000,0xffdd,0xffe5,0xffcb,0xfffa,0x002c, -0x0021,0x0012,0xfffb,0xfffe,0x000b,0xffe1,0xfff7,0xffea, -0x0006,0x000f,0xffdc,0x000d,0x0019,0x002e,0x0017,0xffec, -0xffdb,0xffe8,0x0017,0xffed,0x002b,0xffe3,0x0026,0xfff2, -0x0000,0xffe6,0x000c,0xfff6,0x0026,0xfff0,0x0000,0x0000, -0xffe3,0x0019,0x0016,0x0002,0xfffa,0xffbd,0xfff5,0x0031, -0xffff,0xfff6,0xffe8,0x0005,0x0003,0xfff3,0x0004,0xfffb, -0xfffa,0x000b,0xffe7,0x000c,0x0010,0x001f,0x001c,0xffdc, -0xffcb,0xfff3,0x0006,0x0010,0x002a,0xffe8,0x0011,0x0001, -0x0012,0xfff6,0x0004,0xfff3,0x000f,0xffee,0xfffb,0xfff9, -0x001d,0xffe7,0xffea,0xfffe,0x0006,0x0043,0x000b,0xffcf, -0x0001,0x000a,0x0018,0xfffb,0xfffd,0x000d,0xfffc,0x0005, -0x0006,0xfff5,0x0019,0xfff4,0xfff0,0xffe1,0xffe4,0x0024, -0x0035,0x000d,0xfffa,0xfff0,0xffd6,0x0018,0xffef,0xffff, -0xffee,0x000a,0xfffc,0x000d,0xfff1,0x0012,0x0005,0x0007, -0xffd9,0xfffc,0x0000,0x0023,0x001b,0x0035,0x0006,0xffd4, -0xffdf,0xffee,0x0005,0x0002,0xfff5,0x001f,0x0009,0x0016, -0xfffa,0xfff1,0x0024,0xfff3,0xffe7,0xffd2,0xffe9,0x0014, -0x0025,0x0018,0xffe9,0x0013,0xffd5,0x001d,0xffda,0x000e, -0x0000,0x001a,0xfff4,0x000a,0xffda,0x0010,0x0000,0x0000, -0xfff6,0xffee,0xfff6,0xfff1,0x0015,0x0029,0x0006,0xffc8, -0xffed,0x000d,0x0009,0x0021,0x0009,0x0006,0xffec,0xffff, -0x000b,0xfff3,0x0018,0x000d,0x0017,0xffe0,0xfffa,0x0016, -0x001a,0x000f,0x0000,0xfff8,0xfff4,0x0025,0xffff,0x0002, -0xffe4,0xffe5,0x0005,0x0025,0x0007,0x0023,0xfff8,0x0015, -0xffb1,0x0002,0x000c,0x0016,0x002a,0x001c,0x0001,0xffcd, -0xffca,0xfff1,0xfff8,0x0029,0x0000,0x0018,0xfffa,0x000f, -0xffff,0xffef,0x0024,0x000c,0x000e,0xffd1,0x0000,0x0006, -0x000b,0x001a,0xfff0,0x001b,0xfff3,0x002b,0xffea,0x0012, -0xfff6,0xfff4,0xfffe,0x0022,0xfff1,0x0021,0xfff3,0x000d, -0xfff1,0xfff3,0xfff3,0xffff,0x001a,0x000e,0x0009,0xffd7, -0xffff,0x0010,0x002e,0xffe5,0xffee,0xffff,0xfffc,0x0010, -0x000b,0xffd5,0x0008,0xffd3,0x0000,0xfff5,0xffeb,0x001d, -0x001e,0x0008,0xffed,0xffd6,0xffd7,0x001c,0x0000,0x0014, -0xffec,0xfff5,0xffe2,0xfff6,0x0004,0x0005,0x0020,0x001c, -0xffac,0x0006,0x0009,0x0024,0x002f,0x0001,0x0004,0xffdc, -0xffdc,0xfff4,0x001b,0xffec,0xffe6,0x0011,0x0009,0x0021, -0xffff,0xffd1,0x0013,0xffd2,0xfff7,0xffe5,0xfff1,0x000d, -0x000f,0x0012,0xffdd,0xfffa,0xffd6,0x0021,0xffec,0x0024, -0xffff,0x0004,0xffda,0xfff2,0xffee,0x0002,0x001b,0x0014, -0xffc9,0xfffa,0xffff,0xfff2,0x0029,0xfff6,0x0004,0xffd0, -0xffea,0x0014,0x001f,0x000a,0xfffb,0xfff9,0xffec,0x0009, -0x0010,0xffd3,0x0008,0xffed,0x0028,0xfff4,0x0001,0x000f, -0x0004,0x000a,0xfff4,0xffde,0xfff5,0x0029,0x0010,0x0018, -0xffe2,0xffcf,0xffec,0x000d,0x001c,0x0016,0x0012,0x002b, -0xff84,0x000d,0x0015,0x0017,0x003e,0xffe9,0x0000,0xffd5, -0xffc7,0xfff8,0x000d,0x0012,0xfff2,0x000a,0xfffa,0x001a, -0x0003,0xffcf,0x0013,0xffed,0x001f,0xffe5,0x0007,0x0000, -0xfff5,0x0014,0xffe3,0x0001,0xfff4,0x002f,0xfffc,0x0027, -0xfff5,0xffde,0xffe4,0x0009,0x0005,0x0013,0x000d,0x0022, -0x0022,0xfff2,0xfffc,0x0011,0xfffb,0x0018,0x001a,0xffec, -0x001b,0x002d,0x000c,0xffe8,0x0002,0xfff3,0x0015,0x0008, -0x0016,0x0010,0x0020,0x0002,0xffde,0xffe1,0xffec,0x0007, -0x003a,0xfffb,0x0005,0xfffe,0xffda,0x000c,0xfffe,0x0001, -0xffff,0x001a,0xfffb,0x0017,0x0015,0x0006,0xfff8,0xfff5, -0xffde,0x0006,0x0012,0x0037,0x000f,0x000b,0x0015,0xfff0, -0xfff8,0x0010,0xfffa,0xfff0,0xfffb,0x0004,0x0023,0x0018, -0x000a,0x000c,0x002b,0x0001,0xffd5,0xffd1,0xfff2,0xfff8, -0x002b,0x0005,0xfff6,0x0022,0xffd9,0x0012,0xffea,0x0010, -0x0011,0x002a,0xfff3,0x0013,0xffff,0x0003,0xfff2,0xffec, -0xfffb,0xfff9,0x0007,0x0004,0x0009,0x0000,0x0015,0xffe4, -0x0006,0x0030,0xfffe,0x000e,0x000f,0xffec,0x0005,0x0000, -0x001b,0x000e,0x0020,0x001c,0x0005,0xffe0,0x0002,0xfffa, -0x0020,0xfffd,0x000c,0x0005,0xfff8,0x0019,0x000e,0x0004, -0xfff4,0xfff5,0x0004,0x002f,0x002d,0x0016,0xffea,0x0002, -0xffb6,0x000c,0x001e,0x002a,0x001e,0xfff2,0x0010,0xffe9, -0xffe3,0x0013,0xffec,0x0015,0x0007,0xffff,0x0013,0x0011, -0x000e,0x000a,0x002b,0x001b,0xfffd,0xffd0,0x0008,0xffea, -0x0010,0x0007,0xfffc,0x002a,0xfff7,0x001f,0xfffa,0x0014, -0x0006,0x0004,0xfffd,0x002b,0x0016,0x0014,0xffe4,0xfffb, -0xfff6,0xfffd,0x0004,0x0012,0x000f,0xffe5,0x0018,0xfff3, -0x0018,0x0033,0x0022,0xffd1,0xfff4,0xffe4,0x0015,0x0013, -0x001b,0xfff0,0x000f,0xffe2,0xffef,0xfff4,0xfff4,0x0000, -0x0024,0xfff6,0xfff9,0xffe5,0xffdb,0x0010,0x000f,0x0016, -0xfffd,0x0004,0xffe1,0xffff,0x002a,0xfff9,0x0012,0x0009, -0xffb1,0x0011,0x001b,0x0038,0x0024,0xffd7,0x0013,0xfff8, -0xfff6,0x0016,0x000f,0xffd9,0xffec,0xfff7,0x0023,0x0023, -0x000f,0xffec,0x001a,0xffe1,0xffe6,0xffe5,0xfffa,0xfff1, -0x0014,0x0000,0xffe9,0x0008,0xffda,0x0016,0xfffb,0x0026, -0x000f,0x0014,0xffd9,0xfffc,0x0012,0xfff7,0x000d,0x0001, -0xffce,0x0003,0x0010,0x0005,0x001e,0xffcb,0x0013,0xffec, -0x0003,0x0037,0x0013,0xfff8,0x0000,0xffde,0x0005,0x000b, -0x0020,0xffee,0x000f,0xfffc,0x0016,0xfff3,0x000a,0xfff3, -0x0009,0xfff8,0x0000,0xffed,0xfff9,0x001d,0x001f,0x001a, -0xfff3,0xffdf,0xffeb,0x0016,0x0041,0x0009,0x0004,0x0017, -0xff89,0x0018,0x0027,0x002c,0x0033,0xffbe,0x000e,0xfff1, -0xffe1,0x001a,0x0001,0x0000,0xfff9,0xfff0,0x0013,0x001c, -0x0013,0xffea,0x001a,0xfffc,0x000d,0xffe4,0x0010,0xffe3, -0xfffb,0x0001,0xfff0,0x0010,0xfff8,0x0023,0x000a,0x002a, -0x0004,0xffef,0xffe3,0x0013,0x002a,0x0007,0x0000,0x000f, -0x001f,0xffe4,0x0006,0xfff0,0xfff0,0x0032,0xffe1,0xfff2, -0x0000,0x0006,0x0024,0x0011,0x0000,0x0000,0xffe3,0xfff2, -0x000b,0x0012,0x0014,0xffe7,0xfffa,0xffdf,0xffed,0x0014, -0x002b,0x0015,0x0015,0xfff2,0xffc9,0x0000,0xffe0,0xffd8, -0xffd6,0x0027,0x0001,0xfff8,0xfff2,0x0008,0xfffa,0xfffd, -0xffdb,0xfff8,0x001d,0x0016,0x0004,0x0025,0xffdc,0xfff7, -0xffde,0xffea,0x0011,0x0018,0xfff8,0x0012,0xfff1,0x0002, -0xffff,0x000e,0x001f,0xffe7,0xfff1,0xffd0,0xfff3,0x0004, -0x001c,0x001f,0x0005,0x0015,0xffc7,0x0004,0xffcb,0xffe8, -0xffe9,0x0037,0xfffa,0xfff4,0xffdb,0x0006,0xfff5,0xfff5, -0xfff9,0xffea,0x0012,0xffe3,0xffff,0x0019,0xffdc,0xffeb, -0xffec,0x0009,0x0016,0x0038,0x000b,0xfffa,0xffd3,0xffeb, -0x000f,0x0010,0x0014,0x0001,0x0021,0xffde,0x0002,0x0006, -0x0011,0x0017,0x001c,0xfffa,0xffe7,0x000c,0xfff0,0xffdb, -0xffcb,0x0001,0x000b,0x000f,0x0008,0x0019,0xffec,0x000b, -0xffb4,0xffff,0x0029,0x0009,0x0013,0x000c,0xffd7,0xffef, -0xffc9,0xffee,0x0003,0x003f,0x0003,0x000c,0xffe2,0xfffb, -0x0003,0x000c,0x001f,0x0000,0x0018,0xffcf,0x0008,0xfff7, -0x0001,0x0021,0x000c,0x001d,0xffe5,0x0012,0xffdb,0xffeb, -0xffde,0x0011,0x0003,0x000b,0xfff2,0x0017,0xffe7,0x0002, -0xfff3,0xffef,0x000f,0xfff1,0x0003,0xffff,0xffdf,0xfff9, -0xffff,0x000c,0x003a,0xfffb,0xfff1,0xfff3,0xffe3,0xfffd, -0x0010,0xfff3,0x0004,0xffc7,0x000a,0xfff3,0xfff5,0x000d, -0x0015,0x000f,0x0009,0xffd8,0xffc9,0x0003,0xfff2,0xffed, -0xffd4,0x0011,0xffe8,0xffe0,0x0005,0xfffc,0x0015,0x0012, -0xffae,0x0003,0x0026,0x0017,0x0018,0xfff1,0xffda,0xfffe, -0xffdb,0xfff1,0x0027,0x0002,0xffe9,0x0004,0xfff1,0x000c, -0x0003,0xffef,0x000f,0xffc6,0x0001,0xffe3,0xfffa,0xfffe, -0x0005,0x001a,0xfff9,0xfffc,0xffc8,0x0009,0xffdd,0xfffd, -0xffe7,0x0021,0xffe0,0xffdc,0xffef,0xfff9,0x000f,0x0009, -0xffcc,0xfff6,0x001b,0xffe5,0x0012,0xffe6,0xffda,0xfff2, -0xffe9,0x0010,0x002c,0x0021,0xfffd,0xffec,0xffd3,0xfff6, -0x0014,0xfff1,0x0003,0xffe1,0x0032,0xfff2,0x000a,0x0000, -0xfffb,0x0011,0x000f,0xffe0,0xffe8,0x0010,0x0001,0xfff1, -0xffc9,0xffec,0xfff2,0xfff8,0x001d,0x000c,0x0007,0x0020, -0xff87,0x0009,0x0032,0x000a,0x0028,0xffd8,0xffd5,0xfff7, -0xffc6,0xfff4,0x0019,0x0029,0xfff5,0xfffe,0xffe1,0x0005, -0x0008,0xffed,0x000f,0xffe0,0x0029,0xffe2,0x0010,0xfff0, -0xffec,0x001c,0x0000,0x0003,0xffe6,0x0016,0xffed,0x0000, -0xffdc,0xfffc,0xffea,0xfff4,0x0006,0x0009,0x0001,0x0018, -0x0024,0xffee,0x0018,0x0003,0xffe4,0x0007,0xfff0,0x000d, -0x001a,0x0029,0x0018,0xffff,0x0005,0xffe6,0xfffd,0xfff4, -0x001b,0x002e,0x001b,0xfff6,0xffe8,0xffde,0xfff6,0xfff8, -0x0031,0x0002,0x0022,0x0000,0xffcd,0xfff4,0xffef,0xffda, -0xffe7,0x0038,0x0000,0x0000,0x0016,0xfffd,0xffec,0xffea, -0xffe0,0x0002,0x002f,0x002a,0xfff9,0xfffb,0xffeb,0x0012, -0xfff7,0x000c,0x0005,0x0005,0xfffe,0xfff8,0x000a,0x0004, -0x000e,0x002a,0x0026,0xfff6,0xffdf,0xffcf,0xfffb,0xffe8, -0x0021,0x000c,0x0011,0x0023,0xffcc,0xfffa,0xffda,0xffea, -0xfff9,0x0048,0xfff9,0xfffd,0x0000,0xfffa,0xffe7,0xffe2, -0xfffe,0xfff5,0x0024,0xfff7,0xfff3,0xffef,0xffeb,0x0006, -0x0005,0x002d,0x000a,0x0024,0x0012,0xffdf,0xffed,0xffed, -0x001f,0x002c,0x001b,0x000f,0x0010,0xffde,0x000b,0xffea, -0x0016,0x0004,0x0028,0x0007,0xffeb,0x0000,0xffff,0xffdd, -0xffdc,0x0012,0x000a,0x0018,0x002e,0x000c,0xffde,0xfff8, -0xffb9,0x0009,0x003b,0x001d,0x0008,0xffe2,0xffe6,0x000b, -0xffe2,0x0010,0xfff8,0x002c,0x0009,0xfff2,0xfffb,0xfffe, -0x0013,0x0028,0x0026,0x000f,0x0007,0xffce,0x0011,0xffda, -0x0007,0x000e,0x0018,0x002b,0xffea,0x0006,0xffea,0xffed, -0xffef,0x0022,0x0002,0x0014,0x0017,0x000a,0xffd9,0xfff0, -0xfff8,0xfffa,0x0021,0x0004,0xfff9,0xffd4,0xffee,0x0015, -0x0017,0x0030,0x002e,0xffe8,0xfff7,0xffd8,0xfffd,0xffff, -0x0020,0x000d,0x000b,0xffd5,0xfff9,0xfff2,0xfffd,0xfff1, -0x001a,0xfffd,0x0015,0xffe6,0xffce,0xfff8,0x0000,0xfff0, -0xffe5,0x0022,0xffe7,0xffe9,0x002b,0xffef,0x0006,0xffff, -0xffb3,0x000d,0x0038,0x002b,0x000d,0xffc7,0xffe9,0x001a, -0xfff5,0x0013,0x001b,0xfff0,0xffef,0xffea,0x000a,0x000f, -0x0013,0x000a,0x0016,0xffd5,0xfff0,0xffe2,0x0002,0xffe1, -0x000b,0x0006,0x0005,0x0009,0xffcc,0xfffe,0xffec,0x0000, -0xfff8,0x0032,0xffdf,0xffe5,0x0013,0xffed,0x0001,0xfff7, -0xffd1,0x0000,0x002d,0xfff9,0x0007,0xffbb,0xffe9,0x000d, -0x0002,0x0033,0x0020,0x000e,0x0003,0xffd1,0xffed,0xfff8, -0x0025,0x000b,0x000a,0xfff0,0x0020,0xfff1,0x0013,0xffe3, -0x0000,0xffff,0x001c,0xffee,0xffec,0x0004,0x0010,0xfff3, -0xffda,0xfffd,0xfff1,0x0000,0x0042,0x0000,0xfff9,0x000d, -0xff8c,0x0014,0x0044,0x001e,0x001c,0xffad,0xffe4,0x0012, -0xffe0,0x0016,0x000d,0x0015,0xfffb,0xffe4,0xfffb,0x0007, -0x0018,0x0008,0x0016,0xffef,0x0017,0xffe2,0x0019,0xffd3, -0xfff1,0x0009,0x000b,0x0012,0xffea,0x000a,0xfffc,0x0002, -0xffed,0x000c,0xffe9,0xfffd,0x002b,0xfffe,0xfff4,0x0004, -0x0048,0xfff3,0xffe3,0xffee,0x0004,0x005a,0x0025,0xffde, -0x0004,0xffff,0x000d,0xfff7,0xfffa,0x000b,0x0002,0x0018, -0xfff3,0x0003,0xfff9,0xfff5,0xfffc,0x0004,0xffd6,0x0019, -0x001f,0xffff,0xfff8,0xffe3,0xfffa,0x0011,0xffed,0x0002, -0xfff6,0xfffa,0x0026,0x0016,0xffd6,0xffed,0xfffa,0xfff5, -0x0003,0x0007,0xfffa,0x0014,0x0019,0x004d,0x0020,0xffe3, -0xffe1,0xffe2,0xfffc,0xfffe,0xfff2,0x001d,0x0010,0x0028, -0xffe6,0x0000,0x0003,0xfff4,0xfff3,0xfff6,0xffdc,0x0009, -0x000f,0x0008,0xffe8,0x0006,0xfff9,0x0016,0xffd8,0x0011, -0x0008,0x0009,0x001f,0x0012,0xffbe,0xffea,0xfff5,0xffed, -0x0020,0xfffa,0xffef,0xffe1,0x0013,0x0041,0x0021,0xffd7, -0xfff0,0x0001,0x0000,0x001d,0x0006,0x0004,0xfff3,0x0011, -0xfff7,0x0001,0xfff8,0x000e,0x0023,0x0003,0xffed,0x000b, -0x0004,0x0000,0xffff,0xffeb,0x0017,0x001e,0xfffd,0x0005, -0xffec,0xffd4,0x0030,0x002e,0xffed,0xfffd,0xffec,0x0003, -0xffdc,0x000d,0x0005,0x0007,0x0028,0x0033,0x001c,0xffdc, -0xffcc,0xffe5,0xffee,0x0024,0xfffe,0x0016,0x0000,0x0021, -0xffeb,0xfffe,0x0003,0x000d,0x001a,0xfff5,0xfff2,0xfffc, -0xfff6,0x000a,0xffee,0x000e,0x0016,0x0024,0xffe8,0x0015, -0xffff,0xffe4,0x0028,0x002a,0xffd6,0xfffb,0xffe7,0xfffb, -0x001b,0xffff,0xffec,0xffef,0x0018,0x0026,0x0023,0xffe6, -0x0001,0x0004,0x0023,0xffe0,0xffeb,0xfffd,0x0002,0x0023, -0xfff8,0xffe3,0xffe8,0xffd4,0x000c,0x0018,0xffde,0x0012, -0x0008,0xfff9,0xffeb,0xffc9,0xfffb,0x0015,0xfffe,0x0017, -0xfff5,0xffe4,0x000d,0xffff,0xffea,0xffdf,0x0015,0x000a, -0xffd7,0x0012,0x0002,0x0015,0x002d,0x0018,0x001e,0xffeb, -0xffdf,0xffe8,0x0011,0xffe8,0xffe3,0x000f,0x0010,0x0033, -0xffeb,0xffdf,0xfff3,0xffd3,0x0003,0x0008,0xffe4,0x0002, -0xfff9,0x0002,0xffdb,0xffed,0xfff9,0x001b,0xffea,0x0027, -0x0007,0xfff4,0x0005,0xfffb,0xffd3,0xffdd,0x000f,0x0001, -0xfff4,0x0004,0xfff8,0xffe3,0x0027,0x000c,0x001e,0xffdf, -0xffed,0x0008,0x0015,0x0006,0xfff8,0xfff7,0xfff3,0x001c, -0xfffc,0xffe1,0xffe8,0xffee,0x0034,0x0017,0xfff4,0x0004, -0xffee,0xfffb,0xfff2,0xffd1,0x0018,0x0022,0x000e,0x001b, -0xffea,0xffbe,0x0016,0x0016,0x0001,0xfff0,0x0006,0x0018, -0xffaf,0x0019,0x000e,0x0008,0x003d,0x0000,0x0019,0xffe4, -0xffca,0xffec,0x0003,0x000e,0xffef,0x0008,0x0000,0x002c, -0xfff0,0xffdd,0xfff3,0xffee,0x002b,0x0007,0xfffa,0xfff5, -0xffdf,0x0004,0xffe2,0xfff5,0x0016,0x0028,0xfffa,0x002b, -0xfffd,0xffce,0x000e,0x0012,0xffea,0xffee,0x0001,0x0010, -0x004d,0xfffe,0xfff5,0x0001,0xfff9,0x002f,0x0034,0xfffb, -0x001d,0x0021,0x0001,0xffe4,0x0000,0xfff1,0x001c,0x001a, -0x0002,0x001e,0x0000,0x0002,0xffea,0x0004,0xffdf,0xfffd, -0x0024,0xffeb,0x0003,0xfff1,0xfffe,0x0005,0xfffc,0x0004, -0x0006,0x0009,0x0025,0x001f,0xfffb,0xffe0,0xffec,0xffe2, -0x0008,0x0011,0x000a,0x0028,0x000d,0x0022,0x002f,0x0000, -0xfffb,0x0004,0xfff0,0xffeb,0xfff8,0x0002,0x002a,0x002b, -0xfff6,0x001a,0x000a,0x0002,0xffe1,0xfff5,0xffe5,0xffed, -0x0015,0xfff6,0xfff4,0x0014,0xfffd,0x000b,0xffe7,0x0014, -0x0019,0x0019,0x001d,0x001c,0xffe4,0xffde,0xffe7,0xffda, -0x0025,0x0003,0x0000,0xfff6,0x0007,0x0016,0x0030,0xfff4, -0x0008,0x0024,0xfff4,0x0009,0x000c,0xffea,0x000c,0x0013, -0x0006,0x001c,0x0000,0x001d,0x0012,0x0003,0xfff5,0xffef, -0x000a,0xffee,0x000a,0xfff9,0x001b,0x0012,0x000b,0x0007, -0xfffd,0xffe4,0x002f,0x0037,0x0012,0xfff1,0xffde,0xfff0, -0xffe1,0x0018,0x0017,0x001b,0x001d,0x0009,0x002b,0xfff8, -0xffe6,0x0007,0xffe2,0x0011,0x0004,0xfffd,0x001a,0x0023, -0xfffb,0x0018,0x000a,0x001c,0x0009,0xfff4,0xfffb,0xffdf, -0xfffb,0xfff8,0xfffb,0x001d,0x001a,0x0018,0xfff7,0x0017, -0x000e,0xfff4,0x0027,0x0034,0xfffb,0xffee,0xffd9,0xffe8, -0x0020,0x0008,0xfffd,0x0002,0x000d,0xfffc,0x0032,0x0001, -0x001b,0x0027,0x0017,0xffcd,0xfff1,0xffe2,0x001b,0x0025, -0x0007,0xffff,0xffef,0xffe3,0xfffb,0x0017,0xffe7,0xfff6, -0x000e,0xffe6,0xfff8,0xffd7,0xffff,0x0009,0x000d,0x001a, -0x0005,0xfff4,0x000c,0x0007,0x000e,0xffd3,0x0006,0xfff7, -0xffdc,0x001d,0x0013,0x0029,0x0022,0xffee,0x002d,0x0006, -0xfff8,0x000a,0x0005,0xffd5,0xffe9,0xfff5,0x002a,0x0035, -0xfffb,0xfffb,0xfffa,0xffe2,0xfff2,0x0008,0xffec,0xffe6, -0xffff,0xfff0,0xffe7,0xfffc,0xfffd,0x000f,0xfff9,0x0029, -0x0017,0x0003,0x0004,0x0003,0xfff8,0xffd0,0x0001,0xffef, -0xfff9,0x000f,0x0009,0xfff7,0x001c,0xffe3,0x002d,0xfffb, -0x0006,0x002b,0x0009,0xfff4,0xfffe,0xffdc,0x000c,0x001e, -0x000b,0xfffd,0xffef,0xfffd,0x0022,0x0016,0xfffd,0xffe8, -0xfff4,0xffe8,0xfffe,0xffe0,0x001c,0x0016,0x001d,0x001d, -0xfffb,0xffce,0x0015,0x001f,0x0026,0xffe3,0xfff9,0x0005, -0xffb4,0x0023,0x001f,0x001c,0x0031,0xffd5,0x0028,0x0000, -0xffe3,0x000e,0xfff8,0xfffb,0xfff6,0xffee,0x001a,0x002e, -0x0000,0xfff9,0xfffa,0xfffd,0x0019,0x0007,0x0002,0xffd8, -0xffe4,0xfff2,0xffee,0x0003,0x001b,0x001c,0x0008,0x002d, -0x000d,0xffde,0x000d,0x001b,0x000f,0xffe1,0xfff4,0xfffd, -0x004a,0xffef,0x0000,0xffe1,0xffee,0x0049,0xfffb,0x0000, -0x0003,0xfffb,0x0019,0x000c,0xfffd,0xffff,0xffea,0x0003, -0xfff7,0x0021,0xfff4,0xffe8,0x0006,0x0002,0xffdf,0x0009, -0x0015,0x0005,0x0014,0xffe5,0xffed,0xfff9,0xffde,0xffdb, -0xffde,0x0016,0x002c,0x0000,0xffd7,0xffe3,0xffef,0xffeb, -0x0005,0x0003,0x0015,0x0007,0x0002,0x003c,0xfff6,0x0005, -0xffe0,0xffde,0x0007,0x0014,0xfff5,0x0010,0xfff8,0x0014, -0xffeb,0x001d,0xffff,0xffe8,0xfffe,0xfff3,0xffe5,0xfffa, -0x0005,0x000f,0x0003,0x0008,0xffeb,0xffff,0xffc9,0xffeb, -0xfff1,0x0026,0x0025,0xfffd,0xffbf,0xffe0,0xffe9,0xffe2, -0x0023,0xfff6,0x000b,0xffd4,0xfffd,0x0030,0xfff6,0xfffa, -0xffef,0xfffe,0x000b,0x0033,0x0008,0xfff8,0xffda,0xfffd, -0xfffc,0x001f,0xfff4,0x0002,0x002e,0x0001,0xfff6,0xfffc, -0xfffb,0x0007,0x001a,0xffed,0x000a,0x0005,0xffee,0xffde, -0xffd3,0xfff1,0x0036,0x0018,0xffee,0xfff3,0xffe1,0xfff9, -0xffdf,0x000a,0x0022,0xfffb,0x0011,0x0023,0xfff1,0xffff, -0xffcb,0xffe2,0xfffa,0x003b,0x0000,0x000a,0xffe8,0x000d, -0xffef,0x001b,0xffff,0x0001,0x0025,0xfff3,0xfffc,0xffec, -0xffec,0x0012,0x000a,0x0010,0x0008,0x000b,0xffd9,0xffee, -0xffe6,0x0000,0x002e,0x0014,0xffd7,0xfff1,0xffdb,0xfff1, -0x001d,0xfffb,0x0007,0xffe2,0x0001,0x0015,0xfff9,0x0007, -0x0000,0x0000,0x002f,0xfff7,0xffee,0xfff1,0xffea,0x000e, -0xfffc,0x0000,0xffe4,0xffc7,0x0017,0x0015,0xffe7,0x0002, -0xffff,0x0000,0x0007,0xffcb,0xffed,0xfffd,0xffef,0xfff1, -0xffdc,0x0000,0x0013,0xffe8,0xffeb,0xffd5,0x0009,0x0000, -0xffd9,0x000e,0x001e,0x0008,0x0016,0x0008,0xfff4,0x000c, -0xffde,0xffe5,0x001d,0xfffe,0xffe6,0x0002,0xfff8,0x001f, -0xfff0,0xfffd,0xffef,0xffc7,0x000e,0x0006,0xffed,0xfff3, -0xfff0,0x000a,0xfff8,0xffef,0xffec,0x0002,0xffda,0x0000, -0xffef,0x0010,0x000b,0xffe5,0xffd4,0xffd3,0x0004,0xfff8, -0xfff7,0x0001,0x0014,0xffd5,0x0011,0xfffd,0xfff4,0x0000, -0xffec,0x0004,0x0021,0x001d,0xfffa,0xffea,0xffda,0x0007, -0x0000,0xffff,0xffe3,0xffe2,0x003f,0x0015,0xfffd,0xfff5, -0xffe5,0x0001,0x000e,0xffd3,0x000a,0x0009,0xffff,0xfff4, -0xffd1,0xffdb,0x001c,0x0000,0x0002,0xffe6,0xfffc,0x000d, -0xffb2,0x0015,0x002b,0xfffc,0x0026,0xffef,0xffef,0x0005, -0xffc9,0xffe8,0x000f,0x0024,0xfff2,0xfffc,0xffe8,0x0018, -0xfff4,0xfffb,0xffef,0xffe1,0x0036,0x0005,0x0002,0xffe5, -0xffd5,0x000c,0xfffe,0xfff7,0x0009,0x000f,0xffea,0x0003, -0xffe4,0xffeb,0x0014,0xfffd,0xffec,0xffe4,0xfff7,0x0005, -0x0050,0xfffa,0x0010,0xfff5,0xffe2,0x001e,0x0009,0x001c, -0x001c,0x001d,0x000d,0xfffa,0x0002,0xffe4,0x0003,0x0005, -0x0007,0x003c,0xfffb,0xfff7,0xfff5,0x0001,0xffe8,0xffed, -0x001b,0xfff3,0x0020,0xfff3,0xfff1,0xffed,0xffed,0xffdd, -0xffef,0x0027,0x002b,0x0009,0xfffc,0xffd6,0xffe0,0xffd7, -0x000b,0x000e,0x0027,0x001b,0xfff7,0x0011,0x0004,0x0021, -0xfffa,0x0000,0xfffc,0x0001,0xfffb,0xfff6,0x0011,0x0016, -0xfffb,0x0039,0x0005,0xfff7,0xffec,0xfff3,0xffee,0xffdd, -0x000b,0xfffd,0x0010,0x0016,0xffef,0xfff3,0xffd8,0xffed, -0x0001,0x0037,0x0023,0x0005,0xffe5,0xffd4,0xffdb,0xffcf, -0x0028,0x0000,0x001c,0xffe8,0xfff2,0x0005,0x0004,0x0015, -0x0007,0x0021,0x0000,0x0020,0x000f,0xffdd,0xfff4,0xffff, -0x000b,0x003a,0xfffb,0x0010,0x001c,0x0000,0xffff,0xffdf, -0x0000,0xfff5,0x0027,0xfffb,0x000e,0xfffa,0xfffd,0xffe1, -0xffe4,0x0001,0x0035,0x0021,0x0013,0xffe7,0xffd2,0xffe6, -0xffe4,0x0014,0x0033,0x000e,0x0006,0xfff9,0x0000,0x001a, -0xffe5,0x0004,0xffee,0x0028,0x0006,0xfff0,0x0001,0x000f, -0x0000,0x0037,0x0005,0x0010,0x0013,0xfff2,0x0003,0xffcf, -0xfff2,0xffff,0x0016,0x001e,0x000c,0x0000,0xffe8,0xfff1, -0xfff7,0x0011,0x002d,0x001d,0xfffc,0xffe4,0xffcd,0xffdd, -0x0022,0x0004,0x0019,0xfff6,0xfff7,0xffeb,0x0007,0x0024, -0x001a,0x0024,0x0023,0xffe4,0xfff4,0xffd6,0x0003,0x0010, -0x000c,0x001c,0xffeb,0xffd6,0x0005,0x0015,0xfff0,0xffe6, -0x0004,0xffed,0x0013,0xffd9,0xfff1,0xfff1,0xffff,0xfff3, -0xffed,0x0011,0x0011,0xfff2,0x000f,0xffc9,0xfffc,0xffed, -0xffde,0x0019,0x0030,0x001c,0x000b,0xffde,0x0002,0x0029, -0xfff7,0x0007,0x0011,0xffeb,0xffec,0xffe8,0x0011,0x0021, -0x0000,0x0018,0xfff6,0xffd6,0xfffd,0x0005,0xfff6,0xffd6, -0xfff5,0xfff8,0x0003,0xfffd,0xfff0,0xfff7,0xffea,0x0002, -0x0000,0x0021,0x000a,0xffee,0xfff9,0xffc6,0xfff6,0xffe4, -0xfffc,0x000b,0x0025,0xffe9,0x0005,0xffd2,0x0002,0x001d, -0x0005,0x0027,0x0015,0x0009,0x0000,0xffcf,0xfff4,0x0009, -0x0010,0x001a,0xffea,0xfff1,0x002d,0x0014,0x0005,0xffd8, -0xffea,0xffef,0x001a,0xffe1,0x000e,0xfffe,0x000e,0xfff6, -0xffe2,0xffec,0x001b,0x0009,0x0027,0xffd9,0xffee,0xfffb, -0xffb7,0x0020,0x003c,0x000f,0x001a,0xffc5,0xfffe,0x0021, -0xffe2,0x000a,0x0003,0x0011,0xfff8,0xffe2,0x0001,0x001a, -0x0004,0x0016,0xfff6,0xfff0,0x0024,0x0005,0x000b,0xffc8, -0xffdb,0xfffa,0x000a,0x0005,0x000d,0x0003,0xfffa,0x0005, -0xfff5,0xfffc,0x0013,0x0005,0x0010,0xffd7,0xffe8,0xfff3}; - -static const unsigned long ftable1[128]={ -0x4cc9f,0x482af,0x47bd8,0x44700,0x5238b,0x47377,0x4898a,0x411fd, -0x4f8b7,0x4a7d5,0x4bd1b,0x47feb,0x5554b,0x49414,0x4c9d4,0x4403c, -0x4fa57,0x550c5,0x4ea1c,0x54c6e,0x51f27,0x4ff8f,0x4cab5,0x4bbb6, -0x53e58,0x5a5e8,0x5551f,0x5d6ff,0x56499,0x540f7,0x528e8,0x51740, -0x4cdba,0x459db,0x4a644,0x4445b,0x4e123,0x423bc,0x480ed,0x3ed60, -0x5292b,0x49d33,0x51d8c,0x49f1d,0x53cc4,0x45a9d,0x4e88c,0x43073, -0x4d3a1,0x4e583,0x4f702,0x5182e,0x4b81f,0x47291,0x49dc4,0x46541, -0x5434b,0x55bc1,0x5a27e,0x5d510,0x51ba0,0x4c587,0x51f83,0x4d45f, -0x4d45f,0x51f83,0x4c587,0x51ba0,0x5d510,0x5a27e,0x55bc1,0x5434b, -0x46541,0x49dc4,0x47291,0x4b81f,0x5182e,0x4f702,0x4e583,0x4d3a1, -0x43073,0x4e88c,0x45a9d,0x53cc4,0x49f1d,0x51d8c,0x49d33,0x5292b, -0x3ed60,0x480ed,0x423bc,0x4e123,0x4445b,0x4a644,0x459db,0x4cdba, -0x51740,0x528e8,0x540f7,0x56499,0x5d6ff,0x5551f,0x5a5e8,0x53e58, -0x4bbb6,0x4cab5,0x4ff8f,0x51f27,0x54c6e,0x4ea1c,0x550c5,0x4fa57, -0x4403c,0x4c9d4,0x49414,0x5554b,0x47feb,0x4bd1b,0x4a7d5,0x4f8b7, -0x411fd,0x4898a,0x47377,0x5238b,0x44700,0x47bd8,0x482af,0x4cc9f}; +static const uint16_t cb1_base[128]={ + 19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671, + 20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411, + 20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387, + 21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852, + 19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086, + 21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159, + 19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004, + 21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781, + 19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556, + 18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770, + 17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138, + 16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675, + 20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477, + 19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389, + 17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363, + 16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657, +}; -static const unsigned long ftable2[128]={ -0x2f8e9,0x3444d,0x3637b,0x3608d,0x3372e,0x33ab9,0x33946,0x2f157, -0x307a1,0x36a4d,0x380c9,0x39279,0x332c0,0x34673,0x33a8a,0x2fec4, -0x2ecea,0x36011,0x34bb0,0x37829,0x36353,0x39c4a,0x35f32,0x33352, -0x2cb99,0x33db5,0x3221f,0x3595c,0x31b84,0x35804,0x31d79,0x3075f, -0x27f6f,0x2f99d,0x2d6c9,0x3369b,0x2df25,0x34928,0x3018c,0x32129, -0x28cb2,0x31e5c,0x2eebd,0x36c4e,0x2e2a3,0x3601f,0x30a58,0x33aa8, -0x28cee,0x336a2,0x2e69d,0x37dcd,0x323b6,0x3fa08,0x34b2d,0x3acd3, -0x27abc,0x3214b,0x2cff6,0x3695f,0x2f09d,0x3ae92,0x315ba,0x37761, -0x37761,0x315ba,0x3ae92,0x2f09d,0x3695f,0x2cff6,0x3214b,0x27abc, -0x3acd3,0x34b2d,0x3fa08,0x323b6,0x37dcd,0x2e69d,0x336a2,0x28cee, -0x33aa8,0x30a58,0x3601f,0x2e2a3,0x36c4e,0x2eebd,0x31e5c,0x28cb2, -0x32129,0x3018c,0x34928,0x2df25,0x3369b,0x2d6c9,0x2f99d,0x27f6f, -0x3075f,0x31d79,0x35804,0x31b84,0x3595c,0x3221f,0x33db5,0x2cb99, -0x33352,0x35f32,0x39c4a,0x36353,0x37829,0x34bb0,0x36011,0x2ecea, -0x2fec4,0x33a8a,0x34673,0x332c0,0x39279,0x380c9,0x36a4d,0x307a1, -0x2f157,0x33946,0x33ab9,0x3372e,0x3608d,0x3637b,0x3444d,0x2f8e9}; +static const uint16_t cb2_base[128]={ + 12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053, + 12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268, + 11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109, + 11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405, + 10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818, + 10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226, + 10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053, + 10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198, + 14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155, + 15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446, + 13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443, + 12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230, + 12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449, + 13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982, + 12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410, + 12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174, +}; -static const short decodetable1[63]={ -0x0000,0x0006,0x0010,0x0012,0x0014,0x0017,0x0019,0x001d, -0x0020,0x0024,0x0029,0x002e,0x0033,0x0039,0x0041,0x0049, -0x0051,0x005b,0x0067,0x0073,0x0081,0x0091,0x00a3,0x00b7, -0x00cd,0x00e6,0x0103,0x0122,0x0146,0x016d,0x019a,0x01cc, -0x0204,0x0243,0x028a,0x02da,0x0333,0x0397,0x0407,0x0485, -0x0512,0x05b0,0x0662,0x0729,0x0809,0x0904,0x0a1e,0x0b5a, -0x0cbd,0x0e4b,0x1009,0x11fe,0x1430,0x16a7,0x196b,0x1c85, -0x2000,0x23e7,0x2849,0x2d33,0x32b7,0x38e7,0x3fd9}; +static const int16_t energy_tab[32]={ + 0, 16, 20, 25, 32, 41, 51, 65, + 81, 103, 129, 163, 205, 259, 326, 410, + 516, 650, 819, 1031, 1298, 1634, 2057, 2590, + 3261, 4105, 5168, 6507, 8192, 10313, 12983, 16345 +}; -static const short decodetable2[127]={ -0xf037,0xf043,0xf04e,0xf058,0xf062,0xf06c,0xf077,0xf082, -0xf08e,0xf09a,0xf0a6,0xf0b2,0xf0be,0xf0cc,0xf0d9,0xf0e6, -0xf0f4,0xf101,0xf10f,0xf11e,0xf12d,0xf13d,0xf14c,0xf15c, -0xf16d,0xf17d,0xf18d,0xf19d,0xf1ae,0xf1bf,0xf1d1,0xf1e3, -0xf1f6,0xf20a,0xf21d,0xf232,0xf247,0xf25d,0xf274,0xf28c, -0xf2a4,0xf2bc,0xf2d4,0xf2ee,0xf307,0xf321,0xf33c,0xf358, -0xf374,0xf391,0xf3af,0xf3ce,0xf3ee,0xf410,0xf433,0xf459, -0xf480,0xf4a9,0xf4d1,0xf4ff,0xf52c,0xf55c,0xf58c,0xf5c4, -0xf5fb,0xf637,0xf673,0xf6ad,0xf6e8,0xf727,0xf766,0xf7a7, -0xf7e8,0xf82a,0xf86b,0xf8ae,0xf8f0,0xf93a,0xf984,0xf9d0, -0xfa1c,0xfa6c,0xfabc,0xfb0d,0xfb5f,0xfbbe,0xfc1e,0xfc80, -0xfce2,0xfd45,0xfda8,0xfe19,0xfe8a,0xff0e,0xff92,0x0015, -0x0098,0x012c,0x01bf,0x0248,0x02d0,0x0353,0x03d6,0x0451, -0x04cd,0x053e,0x05b0,0x0621,0x0692,0x0707,0x077c,0x07e7, -0x0852,0x08c2,0x0931,0x09aa,0x0a23,0x0aa4,0x0b25,0x0baa, -0x0c2e,0x0ca8,0x0d23,0x0d93,0x0e04,0x0e75,0x0ee6}; +static const int16_t lpc_refl_cb1[64]={ + -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879, + -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631, + -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268, + -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676, + -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660, + -1508, -1348, -1185, -994, -798, -600, -374, -110, + 152, 447, 720, 982, 1229, 1456, 1682, 1916, + 2130, 2353, 2595, 2853, 3118, 3363, 3588, 3814 +}; -static const short decodetable3[63]={ -0xf3ed,0xf54d,0xf6ae,0xf7af,0xf8b1,0xf990,0xfa6f,0xfb39, -0xfc03,0xfcbd,0xfd77,0xfe1d,0xfec4,0xff58,0xffec,0x007b, -0x010b,0x0196,0x0220,0x02a5,0x032a,0x03a9,0x0429,0x04a1, -0x0519,0x058c,0x05fe,0x066d,0x06dc,0x0747,0x07b2,0x0817, -0x087b,0x08d9,0x0937,0x0990,0x09e8,0x0a3a,0x0a8c,0x0ad9, -0x0b26,0x0b6d,0x0bb4,0x0bf8,0x0c3d,0x0c7e,0x0cbf,0x0cfc, -0x0d3a,0x0d72,0x0dab,0x0ddf,0x0e13,0x0e44,0x0e75,0x0ea1, -0x0ecd,0x0ef5,0x0f1e,0x0f44,0x0f6b,0x0f8f,0x0fb4}; +static const int16_t lpc_refl_cb2[32]={ + -3091, -2386, -1871, -1425, -1021, -649, -316, -20, + 267, 544, 810, 1065, 1305, 1534, 1756, 1970, + 2171, 2359, 2536, 2700, 2854, 2996, 3133, 3263, + 3386, 3499, 3603, 3701, 3789, 3870, 3947, 4020 +}; -static const short decodetable4[63]={ -0xf23b,0xf2ae,0xf321,0xf38c,0xf3f7,0xf457,0xf4b6,0xf517, -0xf578,0xf5d5,0xf631,0xf68d,0xf6e8,0xf742,0xf79b,0xf7f0, -0xf845,0xf896,0xf8e7,0xf937,0xf986,0xf9d6,0xfa26,0xfa74, -0xfac3,0xfb0f,0xfb5c,0xfbaa,0xfbf8,0xfc46,0xfc94,0xfce2, -0xfd2f,0xfd7f,0xfdcf,0xfe22,0xfe76,0xfec9,0xff1c,0xff73, -0xffca,0x0020,0x0077,0x00d0,0x0128,0x0186,0x01e4,0x0248, -0x02ab,0x0315,0x037f,0x03f1,0x0463,0x04e0,0x055d,0x05e8, -0x0673,0x0710,0x07ad,0x0872,0x0938,0x0a2f,0x0b26}; +static const int16_t lpc_refl_cb3[32]={ + -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149, + -1979, -1817, -1658, -1498, -1341, -1188, -1032, -876, + -721, -561, -394, -228, -54, 119, 296, 484, + 683, 895, 1123, 1373, 1651, 1965, 2360, 2854 +}; -static const short decodetable5[31]={ -0xf8cb,0xfa55,0xfbdf,0xfcea,0xfdf6,0xfed4,0xffb3,0x006f, -0x012d,0x01da,0x0287,0x032b,0x03cf,0x046a,0x0505,0x059a, -0x062e,0x06bf,0x0751,0x07e2,0x0873,0x0904,0x0994,0x0a22, -0x0aaf,0x0b3c,0x0bc9,0x0c56,0x0ce3,0x0d6a,0x0df1}; +static const int16_t lpc_refl_cb4[16]={ + -1845, -1057, -522, -77, 301, 647, 975, 1285, + 1582, 1873, 2163, 2452, 2735, 3017, 3299, 3569 +}; -static const short decodetable6[31]={ -0xf57d,0xf679,0xf775,0xf83d,0xf904,0xf9b5,0xfa65,0xfb04, -0xfba2,0xfc2f,0xfcbb,0xfd40,0xfdc5,0xfe44,0xfec4,0xff44, -0xffc5,0x0047,0x00c9,0x0150,0x01d6,0x0266,0x02f7,0x0396, -0x0435,0x04f3,0x05b1,0x0692,0x0774,0x0899,0x09bf}; +static const int16_t lpc_refl_cb5[16]={ + -2691, -2187, -1788, -1435, -1118, -837, -571, -316, + -59, 201, 470, 759, 1077, 1457, 1908, 2495 +}; -static const short decodetable7[15]={ -0xfaa4,0xfc65,0xfe26,0xff56,0x0085,0x017f,0x0278,0x0362, -0x044c,0x0537,0x0623,0x071f,0x081b,0x0946,0x0a70}; +static const int16_t lpc_refl_cb6[8]={ + -1372, -474, 133, 632, 1100, 1571, 2075, 2672 +}; -static const short decodetable8[15]={ -0xf6ab,0xf7d8,0xf905,0xfa1b,0xfb31,0xfc32,0xfd33,0xfe22, -0xff11,0xfffe,0x00ea,0x01f6,0x0302,0x0462,0x05c2}; +static const int16_t lpc_refl_cb7[8]={ + -2389, -1787, -1231, -717, -239, 234, 770, 1474 +}; -static const short decodetable9[15]={ -0xf9df,0xfb3f,0xfca0,0xfdbc,0xfed8,0xffd1,0x00c8,0x01b3, -0x029e,0x038f,0x047f,0x0596,0x06ad,0x07ff,0x0951}; +static const int16_t lpc_refl_cb8[8]={ + -1569, -864, -296, 200, 670, 1151, 1709, 2385 +}; -static const short decodetable10[15]={ -0xf768,0xf890,0xf9b8,0xfac9,0xfbda,0xfcd0,0xfdc7,0xfea8, -0xff88,0x006c,0x0152,0x0258,0x035f,0x04da,0x0655}; +static const int16_t lpc_refl_cb9[8]={ + -2200, -1608, -1062, -569, -120, 338, 863, 1621 +}; -static const short decodetable11[7]={ -0xfd97,0xff2b,0x00be,0x01f0,0x0322,0x0476,0x05cb}; +static const int16_t lpc_refl_cb10[4]={ + -617, 190, 802, 1483 +}; -static const short *decodetable[11]={ -decodetable1,decodetable2,decodetable3,decodetable4,decodetable5, -decodetable6,decodetable7,decodetable8,decodetable9,decodetable10, -decodetable11}; +static const int16_t * const lpc_refl_cb[10]={ + lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5, + lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10 +}; -#endif /* RA144TABLES_H */ +#endif /* FFMPEG_RA144_H */ diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ra288.c b/src/add-ons/media/plugins/avcodec/libavcodec/ra288.c index a44eb96f14..353ae529a6 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/ra288.c +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ra288.c @@ -2,267 +2,260 @@ * RealAudio 2.0 (28.8K) * Copyright (c) 2003 the ffmpeg project * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avcodec.h" +#define ALT_BITSTREAM_READER_LE +#include "bitstream.h" #include "ra288.h" - + typedef struct { - float history[8]; - float output[40]; - float pr1[36]; - float pr2[10]; - int phase, phasep; + float sp_lpc[36]; ///< LPC coefficients for speech data (spec: A) + float gain_lpc[10]; ///< LPC coefficients for gain (spec: GB) - float st1a[111],st1b[37],st1[37]; - float st2a[38],st2b[11],st2[11]; - float sb[41]; - float lhist[10]; -} Real288_internal; + float sp_hist[111]; ///< Speech data history (spec: SB) -static int ra288_decode_init(AVCodecContext * avctx) + /** Speech part of the gain autocorrelation (spec: REXP) */ + float sp_rec[37]; + + float gain_hist[38]; ///< Log-gain history (spec: SBLG) + + /** Recursive part of the gain autocorrelation (spec: REXPLG) */ + float gain_rec[11]; + + float sp_block[41]; ///< Speech data of four blocks (spec: STTMP) + float gain_block[10]; ///< Gain data of four blocks (spec: GSTATE) +} RA288Context; + +static av_cold int ra288_decode_init(AVCodecContext *avctx) { - Real288_internal *glob=avctx->priv_data; - memset(glob,0,sizeof(Real288_internal)); - return 0; -} - -static void prodsum(float *tgt, float *src, int len, int n); -static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table); -static int pred(float *in, float *tgt, int n); -static void colmult(float *tgt, float *m1, const float *m2, int n); - - -/* initial decode */ -static void unpack(unsigned short *tgt, unsigned char *src, int len) -{ - int x,y,z; - int n,temp; - int buffer[len]; - - for (x=0;x>(8-n); - tgt[y]+=temp<>n; - z=8-n; - } else z+=8; - } -} - -static void update(Real288_internal *glob) -{ - int x,y; - float buffer1[40],temp1[37]; - float buffer2[8],temp2[11]; - - for (x=0,y=glob->phasep+5;x<40;buffer1[x++]=glob->output[(y++)%40]); - co(36,40,35,buffer1,temp1,glob->st1a,glob->st1b,table1); - if (pred(temp1,glob->st1,36)) - colmult(glob->pr1,glob->st1,table1a,36); - - for (x=0,y=glob->phase+1;x<8;buffer2[x++]=glob->history[(y++)%8]); - co(10,8,20,buffer2,temp2,glob->st2a,glob->st2b,table2); - if (pred(temp2,glob->st2,10)) - colmult(glob->pr2,glob->st2,table2a,10); -} - -/* Decode and produce output */ -static void decode(Real288_internal *glob, unsigned int input) -{ - unsigned int x,y; - float f; - double sum,sumsum; - float *p1,*p2; - float buffer[5]; - const float *table; - - for (x=36;x--;glob->sb[x+5]=glob->sb[x]); - for (x=5;x--;) { - p1=glob->sb+x;p2=glob->pr1; - for (sum=0,y=36;y--;sum-=(*(++p1))*(*(p2++))); - glob->sb[x]=sum; - } - - f=amptable[input&7]; - table=codetable+(input>>3)*5; - - /* convert log and do rms */ - for (sum=32,x=10;x--;sum-=glob->pr2[x]*glob->lhist[x]); - if (sum<0) sum=0; else if (sum>60) sum=60; - - sumsum=exp(sum*0.1151292546497)*f; /* pow(10.0,sum/20)*f */ - for (sum=0,x=5;x--;) { buffer[x]=table[x]*sumsum; sum+=buffer[x]*buffer[x]; } - if ((sum/=5)<1) sum=1; - - /* shift and store */ - for (x=10;--x;glob->lhist[x]=glob->lhist[x-1]); - *glob->lhist=glob->history[glob->phase]=10*log10(sum)-32; - - for (x=1;x<5;x++) for (y=x;y--;buffer[x]-=glob->pr1[x-y-1]*buffer[y]); - - /* output */ - for (x=0;x<5;x++) { - f=glob->sb[4-x]+buffer[x]; - if (f>4095) f=4095; else if (f<-4095) f=-4095; - glob->output[glob->phasep+x]=glob->sb[4-x]=f; - } -} - -/* column multiply */ -static void colmult(float *tgt, float *m1, const float *m2, int n) -{ - while (n--) - *(tgt++)=(*(m1++))*(*(m2++)); -} - -static int pred(float *in, float *tgt, int n) -{ - int x,y; - float *p1,*p2; - double f0,f1,f2; - float temp; - - if (in[n]==0) return 0; - if ((f0=*in)<=0) return 0; - - for (x=1;;x++) { - if (n>1;y--;) { - temp=*p2+*p1*f2; - *(p1--)+=*p2*f2; - *(p2++)=temp; - } - if ((f0+=f1*f2)<0) return 0; - } -} - -static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table) -{ - int a,b,c; - unsigned int x; - float *fp; - float buffer1[37]; - float buffer2[37]; - float work[111]; - - /* rotate and multiply */ - c=(b=(a=n+i)+j)-i; - fp=st1+i; - for (x=0;x=0) - { - p1=(p2=src)-n; - for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++)); - tgt[n--]=sum; - } -} - -void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out,unsigned len) -{ - int x,y; - Real288_internal *glob=avctx->priv_data; - unsigned short int buffer[len]; - - unpack(buffer,in,len); - for (x=0;x<32;x++) - { - glob->phasep=(glob->phase=x&7)*5; - decode(glob,buffer[x]); - for (y=0;y<5;*(out++)=8*glob->output[glob->phasep+(y++)]); - if (glob->phase==3) update(glob); - } - return out; -} - -/* Decode a block (celp) */ -static int ra288_decode_frame(AVCodecContext * avctx, - void *data, int *data_size, - uint8_t * buf, int buf_size) -{ - if(avctx->extradata_size>=6) - { -//((short*)(avctx->extradata))[0]; /* subpacket size */ -//((short*)(avctx->extradata))[1]; /* subpacket height */ -//((short*)(avctx->extradata))[2]; /* subpacket flavour */ -//((short*)(avctx->extradata))[3]; /* coded frame size */ -//((short*)(avctx->extradata))[4]; /* codec's data length */ -//((short*)(avctx->extradata))[5...] /* codec's data */ - int bret; - void *datao; - int w=avctx->block_align; /* 228 */ - int h=((short*)(avctx->extradata))[1]; /* 12 */ - int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ - int i,j; - if(buf_sizesample_fmt = SAMPLE_FMT_S16; return 0; - } +} + +static inline float scalar_product_float(const float * v1, const float * v2, + int size) +{ + float res = 0.; + + while (size--) + res += *v1++ * *v2++; + + return res; +} + +static void colmult(float *tgt, const float *m1, const float *m2, int n) +{ + while (n--) + *tgt++ = *m1++ * *m2++; +} + +static void decode(RA288Context *ractx, float gain, int cb_coef) +{ + int i, j; + double sumsum; + float sum, buffer[5]; + float *block = ractx->sp_block + 36; // Current block + + memmove(ractx->sp_block, ractx->sp_block + 5, 36*sizeof(*ractx->sp_block)); + + for (i=0; i < 5; i++) { + block[i] = 0.; + for (j=0; j < 36; j++) + block[i] -= block[i-1-j]*ractx->sp_lpc[j]; + } + + /* block 46 of G.728 spec */ + sum = 32.; + for (i=0; i < 10; i++) + sum -= ractx->gain_block[9-i] * ractx->gain_lpc[i]; + + /* block 47 of G.728 spec */ + sum = av_clipf(sum, 0, 60); + + /* block 48 of G.728 spec */ + sumsum = exp(sum * 0.1151292546497) * gain; /* pow(10.0,sum/20)*gain */ + + for (i=0; i < 5; i++) + buffer[i] = codetable[cb_coef][i] * sumsum; + + sum = scalar_product_float(buffer, buffer, 5) / 5; + + sum = FFMAX(sum, 1); + + /* shift and store */ + memmove(ractx->gain_block, ractx->gain_block + 1, + 9 * sizeof(*ractx->gain_block)); + + ractx->gain_block[9] = 10 * log10(sum) - 32; + + for (i=1; i < 5; i++) + for (j=i-1; j >= 0; j--) + buffer[i] -= ractx->sp_lpc[i-j-1] * buffer[j]; + + /* output */ + for (i=0; i < 5; i++) + block[i] = av_clipf(block[i] + buffer[i], -4095, 4095); +} + +/** + * Converts autocorrelation coefficients to LPC coefficients using the + * Levinson-Durbin algorithm. See blocks 37 and 50 of the G.728 specification. + * + * @return 0 if success, -1 if fail + */ +static int eval_lpc_coeffs(const float *in, float *tgt, int n) +{ + int i, j; + double f0, f1, f2; + + if (in[n] == 0) + return -1; + + if ((f0 = *in) <= 0) + return -1; + + in--; // To avoid a -1 subtraction in the inner loop + + for (i=1; i <= n; i++) { + f1 = in[i+1]; + + for (j=0; j < i - 1; j++) + f1 += in[i-j]*tgt[j]; + + tgt[i-1] = f2 = -f1/f0; + for (j=0; j < i >> 1; j++) { + float temp = tgt[j] + tgt[i-j-2]*f2; + tgt[i-j-2] += tgt[j]*f2; + tgt[j] = temp; + } + if ((f0 += f1*f2) < 0) + return -1; + } + + return 0; +} + +static void convolve(float *tgt, const float *src, int len, int n) +{ + for (; n >= 0; n--) + tgt[n] = scalar_product_float(src, src - n, len); + +} + +/** + * Hybrid window filtering. See blocks 36 and 49 of the G.728 specification. + * + * @param order the order of the filter + * @param n the length of the input + * @param non_rec the number of non-recursive samples + * @param out the filter output + * @param in pointer to the input of the filter + * @param hist pointer to the input history of the filter. It is updated by + * this function. + * @param out pointer to the non-recursive part of the output + * @param out2 pointer to the recursive part of the output + * @param window pointer to the windowing function table + */ +static void do_hybrid_window(int order, int n, int non_rec, const float *in, + float *out, float *hist, float *out2, + const float *window) +{ + int i; + float buffer1[order + 1]; + float buffer2[order + 1]; + float work[order + n + non_rec]; + + /* update history */ + memmove(hist , hist + n, (order + non_rec)*sizeof(*hist)); + memcpy (hist + order + non_rec, in , n *sizeof(*hist)); + + colmult(work, window, hist, order + n + non_rec); + + convolve(buffer1, work + order , n , order); + convolve(buffer2, work + order + n, non_rec, order); + + for (i=0; i <= order; i++) { + out2[i] = out2[i] * 0.5625 + buffer1[i]; + out [i] = out2[i] + buffer2[i]; + } + + /* Multiply by the white noise correcting factor (WNCF) */ + *out *= 257./256.; +} + +/** + * Backward synthesis filter. Find the LPC coefficients from past speech data. + */ +static void backward_filter(RA288Context *ractx) +{ + float temp1[37]; // RTMP in the spec + float temp2[11]; // GPTPMP in the spec + + do_hybrid_window(36, 40, 35, ractx->sp_block+1, temp1, ractx->sp_hist, + ractx->sp_rec, syn_window); + + if (!eval_lpc_coeffs(temp1, ractx->sp_lpc, 36)) + colmult(ractx->sp_lpc, ractx->sp_lpc, syn_bw_tab, 36); + + do_hybrid_window(10, 8, 20, ractx->gain_block+2, temp2, ractx->gain_hist, + ractx->gain_rec, gain_window); + + if (!eval_lpc_coeffs(temp2, ractx->gain_lpc, 10)) + colmult(ractx->gain_lpc, ractx->gain_lpc, gain_bw_tab, 10); +} + +static int ra288_decode_frame(AVCodecContext * avctx, void *data, + int *data_size, const uint8_t * buf, + int buf_size) +{ + int16_t *out = data; + int i, j; + RA288Context *ractx = avctx->priv_data; + GetBitContext gb; + + if (buf_size < avctx->block_align) { + av_log(avctx, AV_LOG_ERROR, + "Error! Input buffer is too small [%d<%d]\n", + buf_size, avctx->block_align); + return 0; + } + + if (*data_size < 32*5*2) + return -1; + + init_get_bits(&gb, buf, avctx->block_align * 8); + + for (i=0; i < 32; i++) { + float gain = amptable[get_bits(&gb, 3)]; + int cb_coef = get_bits(&gb, 6 + (i&1)); + + decode(ractx, gain, cb_coef); + + for (j=0; j < 5; j++) + *(out++) = 8 * ractx->sp_block[36 + j]; + + if ((i & 7) == 3) + backward_filter(ractx); + } + + *data_size = (char *)out - (char *)data; + return avctx->block_align; } AVCodec ra_288_decoder = @@ -270,9 +263,10 @@ AVCodec ra_288_decoder = "real_288", CODEC_TYPE_AUDIO, CODEC_ID_RA_288, - sizeof(Real288_internal), + sizeof(RA288Context), ra288_decode_init, NULL, NULL, ra288_decode_frame, + .long_name = NULL_IF_CONFIG_SMALL("RealAudio 2.0 (28.8K)"), }; diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ra288.h b/src/add-ons/media/plugins/avcodec/libavcodec/ra288.h index 7cc0d8724c..c6b24d4d3c 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/ra288.h +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ra288.h @@ -2,202 +2,208 @@ * RealAudio 2.0 (28.8K) * Copyright (c) 2003 the ffmpeg project * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef RA288TABLES_H -#define RA288TABLES_H +#ifndef FFMPEG_RA288_H +#define FFMPEG_RA288_H -static const float amptable[8]={ 0.515625, 0.90234375, 1.57910156, 2.76342773, - -0.515625,-0.90234375,-1.57910156,-2.76342773 }; - -static const float codetable[640]={ - 0.326171875, -1.4404296875, -0.6123046875, -0.8740234375, -1.24658203125, - -2.45703125, -2.23486328125, -0.51025390625, 1.419921875, 1.6201171875, - -1.37646484375, -1.30712890625, -0.462890625, -1.37939453125, -2.1728515625, - -3.26123046875, -0.166015625, 0.7236328125, -0.623046875, 0.6162109375, - -0.2744140625, -3.29931640625, 0.62548828125, 0.08740234375, -0.6220703125, - -1.2265625, -3.4814453125, -2.40478515625, 3.37548828125, 1.17724609375, - -1.2099609375, -0.076171875, 2.28662109375, -1.89111328125, 0, - -4.0078125, 1.044921875, -0.2333984375, -1.35986328125, 0.26025390625, - 0.92236328125, 1.34716796875, 0.67431640625, -3.39599609375, -2.88720703125, - 2.4814453125, -1.201171875, -2.8212890625, 0.87744140625, 0.27734375, - -1.078125, -1.61572265625, -2.20849609375, -3.044921875, -3.66455078125, - -1.32763671875, 2.1279296875, -1.458984375, -0.56103515625, 1.30078125, - 0.61474609375, 0.48583984375, 1.32373046875, -1.203125, -5.0732421875, - 0.8408203125, -3.69580078125, -1.3388671875, 1.06005859375, -1.13720703125, - 0.50390625, 0.36474609375, -0.4189453125, -3.8798828125, -6.27099609375, - 1.5166015625, 2.37109375, -2.04736328125, -1.24072265625, 0.50537109375, - 0.9091796875, -0.46875, -3.236328125, 0.2001953125, 2.8720703125, - -1.21728515625, -1.283203125, -1.953125, -0.029296875, 3.5166015625, - -1.3046875, 0.7060546875, 0.75, -1.87060546875, 0.60205078125, - -2.5888671875, 3.375, 0.77587890625, -2.04443359375, 1.78955078125, - -1.6875, -3.9892578125, -3.76416015625, 0.67578125, 2.2939453125, - -2.29443359375, -3.03173828125, -5.45703125, 3.95703125, 8.2177734375, - 0.4541015625, 3.419921875, 0.61962890625, -4.38330078125, 1.25341796875, - 2.27001953125, 5.763671875, 1.68017578125, -2.76220703125, 0.58544921875, - 1.2412109375, -0.08935546875, -4.32568359375, -3.89453125, 1.5771484375, - -1.40234375, -0.98193359375, -4.74267578125, -4.09423828125, 6.33935546875, - 1.5068359375, 1.044921875, -1.796875, -4.70849609375, -1.4140625, - -3.71533203125, 3.18115234375, -1.11474609375, -1.2314453125, 3.091796875, - -1.62744140625, -2.744140625, -4.4580078125, -5.43505859375, 2.70654296875, - -0.19873046875, -3.28173828125, -8.5283203125, -1.41064453125, 5.6484375, - 1.802734375, 3.318359375, -0.1279296875, -5.2958984375, -0.90625, - 3.55224609375, 6.544921875, -1.45947265625, -5.17333984375, 2.41015625, - 0.119140625, -1.08349609375, 1.296875, 1.84375, -2.642578125, - -1.97412109375, -2.8974609375, 1.04052734375, 0.42138671875, -1.3994140625, - -1.6123046875, 0.85107421875, -0.9794921875, -0.0625, -1.001953125, - -3.10595703125, 1.6318359375, -0.77294921875, -0.01025390625, 0.5576171875, - -1.87353515625, -0.89404296875, 3.12353515625, 1.24267578125, -1.390625, - -4.556640625, -3.1875, 2.59228515625, 0.9697265625, -1.09619140625, - -2.1923828125, 0.365234375, 0.94482421875, -1.47802734375, -0.24072265625, - -4.51904296875, 2.6201171875, 1.55908203125, -2.19384765625, 0.87109375, - 2.3359375, -0.1806640625, 0.9111328125, 0.51611328125, -0.92236328125, - 3.5849609375, -1.3134765625, -1.25830078125, 0.330078125, -0.29833984375, - -0.2451171875, 1.09130859375, -0.9033203125, -0.86767578125, -1.00048828125, - 0.49365234375, 1.89453125, -1.20361328125, 1.07861328125, -0.07421875, - 1.265625, 1.38134765625, 2.728515625, 1.38623046875, -3.5673828125, - -1.48876953125, -2.4013671875, 2.90771484375, 4.49267578125, -2.17138671875, - 0.34033203125, 1.908203125, 2.8310546875, -2.17333984375, -2.267578125, - -1.03564453125, 2.658203125, -1.2548828125, 0.15673828125, -0.5869140625, - 1.3896484375, -1.0185546875, 1.724609375, 0.2763671875, -0.345703125, - -2.08935546875, 0.4638671875, 2.431640625, 1.83056640625, 0.220703125, - -1.212890625, 1.7099609375, 0.83935546875, -0.0830078125, 0.1162109375, - -1.67724609375, 0.12841796875, 1.0322265625, -0.97900390625, 1.15283203125, - -3.5830078125, -0.58984375, 4.56396484375, -0.59375, -1.95947265625, - -6.5908203125, -0.21435546875, 3.919921875, -2.06640625, 0.17626953125, - -1.82080078125, 2.65283203125, 0.978515625, -2.30810546875, -0.61474609375, - -1.9462890625, 3.78076171875, 4.11572265625, -1.80224609375, -0.48193359375, - 2.5380859375, -0.20654296875, 0.5615234375, -0.62548828125, 0.3984375, - 3.61767578125, 2.00634765625, -1.92822265625, 1.3134765625, 0.0146484384313, - 0.6083984375, 1.49169921875, -0.01708984375, -0.6689453125, -0.1201171875, - -0.72705078125, 2.75146484375, -0.3310546875, -1.28271484375, 1.5478515625, - 2.3583984375, -2.23876953125, 0.98046875, -0.5185546875, 0.39013671875, - -0.06298828125, 0.35009765625, 2.2431640625, 7.29345703125, 5.2275390625, - 0.20361328125, 1.34716796875, 0.9033203125, -2.46923828125, -0.56298828125, - -1.89794921875, 3.59423828125, -2.81640625, 2.09228515625, 0.3251953125, - 0.70458984375, -0.4580078125, 0.009765625, -1.03466796875, -0.82861328125, - -1.8125, -1.6611328125, -1.080078125, 0.0537109375, 1.04296875, - -1.44140625, 0.005859375, -0.765625, -1.708984375, -0.90576171875, - -0.64208984375, -0.84521484375, 0.56640625, -0.2724609375, 0.83447265625, - 0.04296875, -2.23095703125, 0.0947265625, -0.2216796875, -1.44384765625, - -1.38623046875, -0.8134765625, -0.13330078125, 1.017578125, -0.07568359375, - -0.09228515625, -1.16015625, 0.81201171875, -0.5078125, -1.19580078125, - -1.3876953125, -0.66845703125, 0.310546875, -0.12109375, -1.30712890625, - 0.74072265625, 0.03857421875, -1.47119140625, -1.79150390625, -0.47509765625, - 0.93408203125, -1.21728515625, -2.59375, -0.36572265625, 0.62060546875, - -1.41748046875, -1.623046875, -1.833984375, -1.8017578125, -0.89306640625, - -1.42236328125, -0.75537109375, -1.34765625, -0.6865234375, 0.548828125, - 0.900390625, -0.8955078125, 0.22265625, 0.3447265625, -2.0859375, - 0.22802734375, -2.078125, -0.93212890625, 0.74267578125, 0.5537109375, - -0.06201171875, -0.4853515625, -0.31103515625, -0.72802734375, -3.1708984375, - 0.42626953125, -0.99853515625, -1.869140625, -1.36328125, -0.2822265625, - 1.12841796875, -0.88720703125, 1.28515625, -1.490234375, 0.9609375, - 0.31298828125, 0.5830078125, 0.92431640625, 2.00537109375, 3.0966796875, - -0.02197265625, 0.5849609375, 1.0546875, -0.70751953125, 1.07568359375, - -0.978515625, 0.83642578125, 1.7177734375, 1.294921875, 2.07568359375, - 1.43359375, -1.9375, 0.625, 0.06396484375, -0.720703125, - 1.38037109375, 0.00390625, -0.94140625, 1.2978515625, 1.71533203125, - 1.56201171875, -0.3984375, 1.31201171875, -0.85009765625, -0.68701171875, - 1.439453125, 1.96728515625, 0.1923828125, -0.12353515625, 0.6337890625, - 2.0927734375, 0.02490234375, -2.20068359375, -0.015625, -0.32177734375, - 1.90576171875, 2.7568359375, -2.728515625, -1.265625, 2.78662109375, - -0.2958984375, 0.6025390625, -0.78466796875, -2.53271484375, 0.32421875, - -0.25634765625, 1.767578125, -1.0703125, -1.23388671875, 0.83349609375, - 2.09814453125, -1.58740234375, -1.11474609375, 0.396484375, -1.10546875, - 2.81494140625, 0.2578125, -1.60498046875, 0.66015625, 0.81640625, - 1.33544921875, 0.60595703125, -0.53857421875, -1.59814453125, -1.66357421875, - 1.96923828125, 0.8046875, -1.44775390625, -0.5732421875, 0.705078125, - 0.0361328125, 0.4482421875, 0.97607421875, 0.44677734375, -0.5009765625, - -1.21875, -0.78369140625, 0.9931640625, 1.4404296875, 0.11181640625, - -1.05859375, 0.99462890625, 0.00732421921566,-0.6171875, -0.1015625, - -1.734375, 0.7470703125, 0.28369140625, 0.72802734375, 0.4697265625, - -1.27587890625, -1.1416015625, 1.76806640625, -0.7265625, -1.06689453125, - -0.85302734375, 0.03955078125, 2.7041015625, 0.69921875, -1.10205078125, - -0.49755859375, 0.42333984375, 0.1044921875, -1.115234375, -0.7373046875, - -0.822265625, 1.375, -0.11181640625, 1.24560546875, -0.67822265625, - 1.32177734375, 0.24609375, 0.23388671875, 1.35888671875, -0.49267578125, - 1.22900390625, -0.72607421875, -0.779296875, 0.30322265625, 0.94189453125, - -0.072265625, 1.0771484375, -2.09375, 0.630859375, -0.68408203125, - -0.25732421875, 0.60693359375, -1.33349609375, 0.93212890625, 0.625, - 1.04931640625, -0.73291015625, 1.80078125, 0.2978515625, -2.24169921875, - 1.6142578125, -1.64501953125, 0.91552734375, 1.775390625, -0.59423828125, - 1.2568359375, 1.22705078125, 0.70751953125, -1.5009765625, -2.43115234375, - 0.3974609375, 0.8916015625, -1.21923828125, 2.0673828125, -1.99072265625, - 0.8125, -0.107421875, 1.6689453125, 0.4892578125, 0.54443359375, - 0.38134765625, 0.8095703125, 1.91357421875, 2.9931640625, 1.533203125, - 0.560546875, 1.98486328125, 0.740234375, 0.39794921875, 0.09716796875, - 0.58154296875, 1.21533203125, 1.25048828125, 1.18212890625, 1.19287109375, - 0.3759765625, -2.88818359375, 2.69287109375, -0.1796875, -1.56201171875, - 0.5810546875, 0.51123046875, 1.8271484375, 3.38232421875, -1.02001953125, - 0.142578125, 1.51318359375, 2.103515625, -0.3701171875, -1.19873046875, - 0.25537109375, 1.91455078125, 1.974609375, 0.6767578125, 0.04150390625, - 2.13232421875, 0.4912109375, -0.611328125, -0.7158203125, -0.67529296875, - 1.880859375, 0.77099609375, -0.03759765625, 1.0078125, 0.423828125, - 2.49462890625, 1.42529296875, -0.0986328125, 0.17529296875, -0.24853515625, - 1.7822265625, 1.5654296875, 1.12451171875, 0.82666015625, 0.6328125, - 1.41845703125, -1.90771484375, 0.11181640625, -0.583984375, -1.138671875, - 2.91845703125, -1.75048828125, 0.39306640625, 1.86767578125, -1.5322265625, - 1.8291015625, -0.2958984375, 0.02587890625, -0.13134765625, -1.61181640625, - 0.2958984375, 0.9853515625, -0.642578125, 1.984375, 0.1943359375 +static const float amptable[8]={ + 0.515625, 0.90234375, 1.57910156, 2.76342773, + -0.515625, -0.90234375, -1.57910156, -2.76342773 }; -static const float table1[111]={ - 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007, - 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473, - 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811, - 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369, - 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148, - 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184, - 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027, - 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197, - 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729, - 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174, - 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051, - 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543, - 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674, - 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461, - 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992, - 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707, - 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867, - 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924, - 0.142852783, 0.0954284668, 0.0477600098 +static const float codetable[128][5]={ +{ 0.326171875, -1.4404296875, -0.6123046875, -0.8740234375, -1.24658203125}, +{-2.45703125, -2.23486328125, -0.51025390625, 1.419921875, 1.6201171875 }, +{-1.37646484375, -1.30712890625, -0.462890625, -1.37939453125, -2.1728515625 }, +{-3.26123046875, -0.166015625, 0.7236328125, -0.623046875, 0.6162109375 }, +{-0.2744140625, -3.29931640625, 0.62548828125, 0.08740234375, -0.6220703125 }, +{-1.2265625, -3.4814453125, -2.40478515625, 3.37548828125, 1.17724609375}, +{-1.2099609375, -0.076171875, 2.28662109375, -1.89111328125, 0 }, +{-4.0078125, 1.044921875, -0.2333984375, -1.35986328125, 0.26025390625}, +{ 0.92236328125, 1.34716796875, 0.67431640625, -3.39599609375, -2.88720703125}, +{ 2.4814453125, -1.201171875, -2.8212890625, 0.87744140625, 0.27734375 }, +{-1.078125, -1.61572265625, -2.20849609375, -3.044921875, -3.66455078125}, +{-1.32763671875, 2.1279296875, -1.458984375, -0.56103515625, 1.30078125 }, +{ 0.61474609375, 0.48583984375, 1.32373046875, -1.203125, -5.0732421875 }, +{ 0.8408203125, -3.69580078125, -1.3388671875, 1.06005859375, -1.13720703125}, +{ 0.50390625, 0.36474609375, -0.4189453125, -3.8798828125, -6.27099609375}, +{ 1.5166015625, 2.37109375, -2.04736328125, -1.24072265625, 0.50537109375}, +{ 0.9091796875, -0.46875, -3.236328125, 0.2001953125, 2.8720703125 }, +{-1.21728515625, -1.283203125, -1.953125, -0.029296875, 3.5166015625 }, +{-1.3046875, 0.7060546875, 0.75, -1.87060546875, 0.60205078125}, +{-2.5888671875, 3.375, 0.77587890625, -2.04443359375, 1.78955078125}, +{-1.6875, -3.9892578125, -3.76416015625, 0.67578125, 2.2939453125 }, +{-2.29443359375, -3.03173828125, -5.45703125, 3.95703125, 8.2177734375 }, +{ 0.4541015625, 3.419921875, 0.61962890625, -4.38330078125, 1.25341796875}, +{ 2.27001953125, 5.763671875, 1.68017578125, -2.76220703125, 0.58544921875}, +{ 1.2412109375, -0.08935546875, -4.32568359375, -3.89453125, 1.5771484375 }, +{-1.40234375, -0.98193359375, -4.74267578125, -4.09423828125, 6.33935546875}, +{ 1.5068359375, 1.044921875, -1.796875, -4.70849609375, -1.4140625 }, +{-3.71533203125, 3.18115234375, -1.11474609375, -1.2314453125, 3.091796875 }, +{-1.62744140625, -2.744140625, -4.4580078125, -5.43505859375, 2.70654296875}, +{-0.19873046875, -3.28173828125, -8.5283203125, -1.41064453125, 5.6484375 }, +{ 1.802734375, 3.318359375, -0.1279296875, -5.2958984375, -0.90625 }, +{ 3.55224609375, 6.544921875, -1.45947265625, -5.17333984375, 2.41015625 }, +{ 0.119140625, -1.08349609375, 1.296875, 1.84375, -2.642578125 }, +{-1.97412109375, -2.8974609375, 1.04052734375, 0.42138671875, -1.3994140625 }, +{-1.6123046875, 0.85107421875, -0.9794921875, -0.0625, -1.001953125 }, +{-3.10595703125, 1.6318359375, -0.77294921875, -0.01025390625, 0.5576171875 }, +{-1.87353515625, -0.89404296875, 3.12353515625, 1.24267578125, -1.390625 }, +{-4.556640625, -3.1875, 2.59228515625, 0.9697265625, -1.09619140625}, +{-2.1923828125, 0.365234375, 0.94482421875, -1.47802734375, -0.24072265625}, +{-4.51904296875, 2.6201171875, 1.55908203125, -2.19384765625, 0.87109375 }, +{ 2.3359375, -0.1806640625, 0.9111328125, 0.51611328125, -0.92236328125}, +{ 3.5849609375, -1.3134765625, -1.25830078125, 0.330078125, -0.29833984375}, +{-0.2451171875, 1.09130859375, -0.9033203125, -0.86767578125, -1.00048828125}, +{ 0.49365234375, 1.89453125, -1.20361328125, 1.07861328125, -0.07421875 }, +{ 1.265625, 1.38134765625, 2.728515625, 1.38623046875, -3.5673828125 }, +{-1.48876953125, -2.4013671875, 2.90771484375, 4.49267578125, -2.17138671875}, +{ 0.34033203125, 1.908203125, 2.8310546875, -2.17333984375, -2.267578125 }, +{-1.03564453125, 2.658203125, -1.2548828125, 0.15673828125, -0.5869140625 }, +{ 1.3896484375, -1.0185546875, 1.724609375, 0.2763671875, -0.345703125 }, +{-2.08935546875, 0.4638671875, 2.431640625, 1.83056640625, 0.220703125 }, +{-1.212890625, 1.7099609375, 0.83935546875, -0.0830078125, 0.1162109375 }, +{-1.67724609375, 0.12841796875, 1.0322265625, -0.97900390625, 1.15283203125}, +{-3.5830078125, -0.58984375, 4.56396484375, -0.59375, -1.95947265625}, +{-6.5908203125, -0.21435546875, 3.919921875, -2.06640625, 0.17626953125}, +{-1.82080078125, 2.65283203125, 0.978515625, -2.30810546875, -0.61474609375}, +{-1.9462890625, 3.78076171875, 4.11572265625, -1.80224609375, -0.48193359375}, +{ 2.5380859375, -0.20654296875, 0.5615234375, -0.62548828125, 0.3984375 }, +{ 3.61767578125, 2.00634765625, -1.92822265625, 1.3134765625, 0.0146484384313}, +{ 0.6083984375, 1.49169921875, -0.01708984375, -0.6689453125, -0.1201171875 }, +{-0.72705078125, 2.75146484375, -0.3310546875, -1.28271484375, 1.5478515625 }, +{ 2.3583984375, -2.23876953125, 0.98046875, -0.5185546875, 0.39013671875}, +{-0.06298828125, 0.35009765625, 2.2431640625, 7.29345703125, 5.2275390625 }, +{ 0.20361328125, 1.34716796875, 0.9033203125, -2.46923828125, -0.56298828125}, +{-1.89794921875, 3.59423828125, -2.81640625, 2.09228515625, 0.3251953125 }, +{ 0.70458984375, -0.4580078125, 0.009765625, -1.03466796875, -0.82861328125}, +{-1.8125, -1.6611328125, -1.080078125, 0.0537109375, 1.04296875 }, +{-1.44140625, 0.005859375, -0.765625, -1.708984375, -0.90576171875}, +{-0.64208984375, -0.84521484375, 0.56640625, -0.2724609375, 0.83447265625}, +{ 0.04296875, -2.23095703125, 0.0947265625, -0.2216796875, -1.44384765625}, +{-1.38623046875, -0.8134765625, -0.13330078125, 1.017578125, -0.07568359375}, +{-0.09228515625, -1.16015625, 0.81201171875, -0.5078125, -1.19580078125}, +{-1.3876953125, -0.66845703125, 0.310546875, -0.12109375, -1.30712890625}, +{ 0.74072265625, 0.03857421875, -1.47119140625, -1.79150390625, -0.47509765625}, +{ 0.93408203125, -1.21728515625, -2.59375, -0.36572265625, 0.62060546875}, +{-1.41748046875, -1.623046875, -1.833984375, -1.8017578125, -0.89306640625}, +{-1.42236328125, -0.75537109375, -1.34765625, -0.6865234375, 0.548828125 }, +{ 0.900390625, -0.8955078125, 0.22265625, 0.3447265625, -2.0859375 }, +{ 0.22802734375, -2.078125, -0.93212890625, 0.74267578125, 0.5537109375 }, +{-0.06201171875, -0.4853515625, -0.31103515625, -0.72802734375, -3.1708984375 }, +{ 0.42626953125, -0.99853515625, -1.869140625, -1.36328125, -0.2822265625 }, +{ 1.12841796875, -0.88720703125, 1.28515625, -1.490234375, 0.9609375 }, +{ 0.31298828125, 0.5830078125, 0.92431640625, 2.00537109375, 3.0966796875 }, +{-0.02197265625, 0.5849609375, 1.0546875, -0.70751953125, 1.07568359375}, +{-0.978515625, 0.83642578125, 1.7177734375, 1.294921875, 2.07568359375}, +{ 1.43359375, -1.9375, 0.625, 0.06396484375, -0.720703125 }, +{ 1.38037109375, 0.00390625, -0.94140625, 1.2978515625, 1.71533203125}, +{ 1.56201171875, -0.3984375, 1.31201171875, -0.85009765625, -0.68701171875}, +{ 1.439453125, 1.96728515625, 0.1923828125, -0.12353515625, 0.6337890625 }, +{ 2.0927734375, 0.02490234375, -2.20068359375, -0.015625, -0.32177734375}, +{ 1.90576171875, 2.7568359375, -2.728515625, -1.265625, 2.78662109375}, +{-0.2958984375, 0.6025390625, -0.78466796875, -2.53271484375, 0.32421875 }, +{-0.25634765625, 1.767578125, -1.0703125, -1.23388671875, 0.83349609375}, +{ 2.09814453125, -1.58740234375, -1.11474609375, 0.396484375, -1.10546875 }, +{ 2.81494140625, 0.2578125, -1.60498046875, 0.66015625, 0.81640625 }, +{ 1.33544921875, 0.60595703125, -0.53857421875, -1.59814453125, -1.66357421875}, +{ 1.96923828125, 0.8046875, -1.44775390625, -0.5732421875, 0.705078125 }, +{ 0.0361328125, 0.4482421875, 0.97607421875, 0.44677734375, -0.5009765625 }, +{-1.21875, -0.78369140625, 0.9931640625, 1.4404296875, 0.11181640625}, +{-1.05859375, 0.99462890625,0.00732421921566,-0.6171875, -0.1015625 }, +{-1.734375, 0.7470703125, 0.28369140625, 0.72802734375, 0.4697265625 }, +{-1.27587890625, -1.1416015625, 1.76806640625, -0.7265625, -1.06689453125}, +{-0.85302734375, 0.03955078125, 2.7041015625, 0.69921875, -1.10205078125}, +{-0.49755859375, 0.42333984375, 0.1044921875, -1.115234375, -0.7373046875 }, +{-0.822265625, 1.375, -0.11181640625, 1.24560546875, -0.67822265625}, +{ 1.32177734375, 0.24609375, 0.23388671875, 1.35888671875, -0.49267578125}, +{ 1.22900390625, -0.72607421875, -0.779296875, 0.30322265625, 0.94189453125}, +{-0.072265625, 1.0771484375, -2.09375, 0.630859375, -0.68408203125}, +{-0.25732421875, 0.60693359375, -1.33349609375, 0.93212890625, 0.625 }, +{ 1.04931640625, -0.73291015625, 1.80078125, 0.2978515625, -2.24169921875}, +{ 1.6142578125, -1.64501953125, 0.91552734375, 1.775390625, -0.59423828125}, +{ 1.2568359375, 1.22705078125, 0.70751953125, -1.5009765625, -2.43115234375}, +{ 0.3974609375, 0.8916015625, -1.21923828125, 2.0673828125, -1.99072265625}, +{ 0.8125, -0.107421875, 1.6689453125, 0.4892578125, 0.54443359375}, +{ 0.38134765625, 0.8095703125, 1.91357421875, 2.9931640625, 1.533203125 }, +{ 0.560546875, 1.98486328125, 0.740234375, 0.39794921875, 0.09716796875}, +{ 0.58154296875, 1.21533203125, 1.25048828125, 1.18212890625, 1.19287109375}, +{ 0.3759765625, -2.88818359375, 2.69287109375, -0.1796875, -1.56201171875}, +{ 0.5810546875, 0.51123046875, 1.8271484375, 3.38232421875, -1.02001953125}, +{ 0.142578125, 1.51318359375, 2.103515625, -0.3701171875, -1.19873046875}, +{ 0.25537109375, 1.91455078125, 1.974609375, 0.6767578125, 0.04150390625}, +{ 2.13232421875, 0.4912109375, -0.611328125, -0.7158203125, -0.67529296875}, +{ 1.880859375, 0.77099609375, -0.03759765625, 1.0078125, 0.423828125 }, +{ 2.49462890625, 1.42529296875, -0.0986328125, 0.17529296875, -0.24853515625}, +{ 1.7822265625, 1.5654296875, 1.12451171875, 0.82666015625, 0.6328125 }, +{ 1.41845703125, -1.90771484375, 0.11181640625, -0.583984375, -1.138671875 }, +{ 2.91845703125, -1.75048828125, 0.39306640625, 1.86767578125, -1.5322265625 }, +{ 1.8291015625, -0.2958984375, 0.02587890625, -0.13134765625, -1.61181640625}, +{ 0.2958984375, 0.9853515625, -0.642578125, 1.984375, 0.1943359375 } }; -static const float table2[38]={ - 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668, - 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915, - 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836, - 0.961486816, 0.982757568, 0.995635986, 1, 0.995819092, 0.983154297, - 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883, - 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229, - 0.183868408, 0.0923461914 +static const float syn_window[111]={ + 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007, + 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473, + 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811, + 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369, + 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148, + 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184, + 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027, + 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197, + 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729, + 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174, + 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051, + 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543, + 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674, + 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461, + 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992, + 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707, + 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867, + 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924, + 0.142852783, 0.0954284668,0.0477600098 }; -static const float table1a[36]={ - 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488, - 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729, - 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493, - 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829, - 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589, - 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103 +static const float gain_window[38]={ + 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668, + 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915, + 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836, + 0.961486816, 0.982757568, 0.995635986, 1, 0.995819092, 0.983154297, + 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883, + 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229, + 0.183868408, 0.0923461914 }; -static const float table2a[10]={ - 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709, - 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227 +/** Synthesis bandwidth broadening table */ +static const float syn_bw_tab[36]={ + 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488, + 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729, + 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493, + 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829, + 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589, + 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103 }; -#endif /* RA288TABLES_H */ +/** Gain bandwidth broadening table */ +static const float gain_bw_tab[10]={ + 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709, + 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227 +}; + +#endif /* FFMPEG_RA288_H */ diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/rangecoder.c b/src/add-ons/media/plugins/avcodec/libavcodec/rangecoder.c new file mode 100644 index 0000000000..34cda723f3 --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/libavcodec/rangecoder.c @@ -0,0 +1,152 @@ +/* + * Range coder + * Copyright (c) 2004 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file rangecoder.c + * Range coder. + * based upon + * "Range encoding: an algorithm for removing redundancy from a digitised + * message. + * G. N. N. Martin Presented in March 1979 to the Video & + * Data Recording Conference, + * IBM UK Scientific Center held in Southampton July 24-27 1979." + * + */ + +#include + +#include "avcodec.h" +#include "rangecoder.h" +#include "bytestream.h" + + +void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size){ + c->bytestream_start= + c->bytestream= buf; + c->bytestream_end= buf + buf_size; + + c->low= 0; + c->range= 0xFF00; + c->outstanding_count= 0; + c->outstanding_byte= -1; +} + +void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size){ + /* cast to avoid compiler warning */ + ff_init_range_encoder(c, (uint8_t *) buf, buf_size); + + c->low = bytestream_get_be16(&c->bytestream); +} + +void ff_build_rac_states(RangeCoder *c, int factor, int max_p){ + const int64_t one= 1LL<<32; + int64_t p; + int last_p8, p8, i; + + memset(c->zero_state, 0, sizeof(c->zero_state)); + memset(c-> one_state, 0, sizeof(c-> one_state)); + + last_p8= 0; + p= one/2; + for(i=0; i<128; i++){ + p8= (256*p + one/2) >> 32; //FIXME try without the one + if(p8 <= last_p8) p8= last_p8+1; + if(last_p8 && last_p8<256 && p8<=max_p) + c->one_state[last_p8]= p8; + + p+= ((one-p)*factor + one/2) >> 32; + last_p8= p8; + } + + for(i=256-max_p; i<=max_p; i++){ + if(c->one_state[i]) + continue; + + p= (i*one + 128) >> 8; + p+= ((one-p)*factor + one/2) >> 32; + p8= (256*p + one/2) >> 32; //FIXME try without the one + if(p8 <= i) p8= i+1; + if(p8 > max_p) p8= max_p; + c->one_state[ i]= p8; + } + + for(i=1; i<255; i++) + c->zero_state[i]= 256-c->one_state[256-i]; +} + +/** + * + * @return the number of bytes written + */ +int ff_rac_terminate(RangeCoder *c){ + c->range=0xFF; + c->low +=0xFF; + renorm_encoder(c); + c->range=0xFF; + renorm_encoder(c); + + assert(c->low == 0); + assert(c->range >= 0x100); + + return c->bytestream - c->bytestream_start; +} + +#ifdef TEST +#define SIZE 10240 +#undef random +int main(void){ + RangeCoder c; + uint8_t b[9*SIZE]; + uint8_t r[9*SIZE]; + int i; + uint8_t state[10]= {0}; + + ff_init_range_encoder(&c, b, SIZE); + ff_build_rac_states(&c, 0.05*(1LL<<32), 128+64+32+16); + + memset(state, 128, sizeof(state)); + + for(i=0; i + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file rangecoder.h + * Range coder. + */ + +#ifndef FFMPEG_RANGECODER_H +#define FFMPEG_RANGECODER_H + +#include +#include +#include "common.h" + +typedef struct RangeCoder{ + int low; + int range; + int outstanding_count; + int outstanding_byte; + uint8_t zero_state[256]; + uint8_t one_state[256]; + uint8_t *bytestream_start; + uint8_t *bytestream; + uint8_t *bytestream_end; +}RangeCoder; + +void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size); +void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size); +int ff_rac_terminate(RangeCoder *c); +void ff_build_rac_states(RangeCoder *c, int factor, int max_p); + +static inline void renorm_encoder(RangeCoder *c){ + //FIXME optimize + while(c->range < 0x100){ + if(c->outstanding_byte < 0){ + c->outstanding_byte= c->low>>8; + }else if(c->low <= 0xFF00){ + *c->bytestream++ = c->outstanding_byte; + for(;c->outstanding_count; c->outstanding_count--) + *c->bytestream++ = 0xFF; + c->outstanding_byte= c->low>>8; + }else if(c->low >= 0x10000){ + *c->bytestream++ = c->outstanding_byte + 1; + for(;c->outstanding_count; c->outstanding_count--) + *c->bytestream++ = 0x00; + c->outstanding_byte= (c->low>>8) & 0xFF; + }else{ + c->outstanding_count++; + } + + c->low = (c->low & 0xFF)<<8; + c->range <<= 8; + } +} + +static inline int get_rac_count(RangeCoder *c){ + int x= c->bytestream - c->bytestream_start + c->outstanding_count; + if(c->outstanding_byte >= 0) + x++; + return 8*x - av_log2(c->range); +} + +static inline void put_rac(RangeCoder *c, uint8_t * const state, int bit){ + int range1= (c->range * (*state)) >> 8; + + assert(*state); + assert(range1 < c->range); + assert(range1 > 0); + if(!bit){ + c->range -= range1; + *state= c->zero_state[*state]; + }else{ + c->low += c->range - range1; + c->range = range1; + *state= c->one_state[*state]; + } + + renorm_encoder(c); +} + +static inline void refill(RangeCoder *c){ + if(c->range < 0x100){ + c->range <<= 8; + c->low <<= 8; + if(c->bytestream < c->bytestream_end) + c->low+= c->bytestream[0]; + c->bytestream++; + } +} + +static inline int get_rac(RangeCoder *c, uint8_t * const state){ + int range1= (c->range * (*state)) >> 8; + int av_unused one_mask; + + c->range -= range1; +#if 1 + if(c->low < c->range){ + *state= c->zero_state[*state]; + refill(c); + return 0; + }else{ + c->low -= c->range; + *state= c->one_state[*state]; + c->range = range1; + refill(c); + return 1; + } +#else + one_mask= (c->range - c->low-1)>>31; + + c->low -= c->range & one_mask; + c->range += (range1 - c->range) & one_mask; + + *state= c->zero_state[(*state) + (256&one_mask)]; + + refill(c); + + return one_mask&1; +#endif +} + +#endif /* FFMPEG_RANGECODER_H */ diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.c b/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.c index 6c90b1b6cd..e8d1ae8899 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.c +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.c @@ -3,31 +3,35 @@ * * Copyright (c) 2002-2004 Michael Niedermayer * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file ratecontrol.c * Rate control for video encoders. - */ + */ #include "avcodec.h" #include "dsputil.h" +#include "ratecontrol.h" #include "mpegvideo.h" +#include "eval.h" -#undef NDEBUG // allways check asserts, the speed effect is far too small to disable them +#undef NDEBUG // Always check asserts, the speed effect is far too small to disable them. #include #ifndef M_E @@ -38,147 +42,10 @@ static int init_pass2(MpegEncContext *s); static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num); void ff_write_pass1_stats(MpegEncContext *s){ - sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", - s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type, - s->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, - s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count); -} - -int ff_rate_control_init(MpegEncContext *s) -{ - RateControlContext *rcc= &s->rc_context; - int i; - emms_c(); - - for(i=0; i<5; i++){ - rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0; - rcc->pred[i].count= 1.0; - - rcc->pred[i].decay= 0.4; - rcc->i_cplx_sum [i]= - rcc->p_cplx_sum [i]= - rcc->mv_bits_sum[i]= - rcc->qscale_sum [i]= - rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such - rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5; - } - rcc->buffer_index= s->avctx->rc_initial_buffer_occupancy; - - if(s->flags&CODEC_FLAG_PASS2){ - int i; - char *p; - - /* find number of pics */ - p= s->avctx->stats_in; - for(i=-1; p; i++){ - p= strchr(p+1, ';'); - } - i+= s->max_b_frames; - rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry)); - rcc->num_entries= i; - - /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */ - for(i=0; inum_entries; i++){ - RateControlEntry *rce= &rcc->entry[i]; - rce->pict_type= rce->new_pict_type=P_TYPE; - rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2; - rce->misc_bits= s->mb_num + 10; - rce->mb_var_sum= s->mb_num*100; - } - - /* read stats */ - p= s->avctx->stats_in; - for(i=0; inum_entries - s->max_b_frames; i++){ - RateControlEntry *rce; - int picture_number; - int e; - char *next; - - next= strchr(p, ';'); - if(next){ - (*next)=0; //sscanf in unbelieavle slow on looong strings //FIXME copy / dont write - next++; - } - e= sscanf(p, " in:%d ", &picture_number); - - assert(picture_number >= 0); - assert(picture_number < rcc->num_entries); - rce= &rcc->entry[picture_number]; - - e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d", - &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits, - &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count); - if(e!=12){ - av_log(s->avctx, AV_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e); - return -1; - } - p= next; - } - - if(init_pass2(s) < 0) return -1; - } - - if(!(s->flags&CODEC_FLAG_PASS2)){ - - rcc->short_term_qsum=0.001; - rcc->short_term_qcount=0.001; - - rcc->pass1_rc_eq_output_sum= 0.001; - rcc->pass1_wanted_bits=0.001; - - /* init stuff with the user specified complexity */ - if(s->avctx->rc_initial_cplx){ - for(i=0; i<60*30; i++){ - double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num; - RateControlEntry rce; - double q; - - if (i%((s->gop_size+3)/4)==0) rce.pict_type= I_TYPE; - else if(i%(s->max_b_frames+1)) rce.pict_type= B_TYPE; - else rce.pict_type= P_TYPE; - - rce.new_pict_type= rce.pict_type; - rce.mc_mb_var_sum= bits*s->mb_num/100000; - rce.mb_var_sum = s->mb_num; - rce.qscale = FF_QP2LAMBDA * 2; - rce.f_code = 2; - rce.b_code = 1; - rce.misc_bits= 1; - - if(s->pict_type== I_TYPE){ - rce.i_count = s->mb_num; - rce.i_tex_bits= bits; - rce.p_tex_bits= 0; - rce.mv_bits= 0; - }else{ - rce.i_count = 0; //FIXME we do know this approx - rce.i_tex_bits= 0; - rce.p_tex_bits= bits*0.9; - rce.mv_bits= bits*0.1; - } - rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale; - rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale; - rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits; - rcc->frame_count[rce.pict_type] ++; - - bits= rce.i_tex_bits + rce.p_tex_bits; - - q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i); - rcc->pass1_wanted_bits+= s->bit_rate/(s->avctx->frame_rate / (double)s->avctx->frame_rate_base); - } - } - - } - - return 0; -} - -void ff_rate_control_uninit(MpegEncContext *s) -{ - RateControlContext *rcc= &s->rc_context; - emms_c(); - - av_freep(&rcc->entry); + snprintf(s->avctx->stats_out, 256, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d skipcount:%d hbits:%d;\n", + s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type, + s->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, + s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count, s->skip_count, s->header_bits); } static inline double qp2bits(RateControlEntry *rce, double qp){ @@ -194,82 +61,13 @@ static inline double bits2qp(RateControlEntry *rce, double bits){ } return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits; } - -int ff_vbv_update(MpegEncContext *s, int frame_size){ + +int ff_rate_control_init(MpegEncContext *s) +{ RateControlContext *rcc= &s->rc_context; - const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; - const int buffer_size= s->avctx->rc_buffer_size; - const double min_rate= s->avctx->rc_min_rate/fps; - const double max_rate= s->avctx->rc_max_rate/fps; - -//printf("%d %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate); - if(buffer_size){ - int left; - - rcc->buffer_index-= frame_size; - if(rcc->buffer_index < 0){ - av_log(s->avctx, AV_LOG_ERROR, "rc buffer underflow\n"); - rcc->buffer_index= 0; - } - - left= buffer_size - rcc->buffer_index - 1; - rcc->buffer_index += clip(left, min_rate, max_rate); - - if(rcc->buffer_index > buffer_size){ - int stuffing= ceil((rcc->buffer_index - buffer_size)/8); - - if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4) - stuffing=4; - rcc->buffer_index -= 8*stuffing; - - if(s->avctx->debug & FF_DEBUG_RC) - av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing); - - return stuffing; - } - } - return 0; -} - -/** - * modifies the bitrate curve from pass1 for one frame - */ -static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){ - RateControlContext *rcc= &s->rc_context; - AVCodecContext *a= s->avctx; - double q, bits; - const int pict_type= rce->new_pict_type; - const double mb_num= s->mb_num; int i; - - double const_values[]={ - M_PI, - M_E, - rce->i_tex_bits*rce->qscale, - rce->p_tex_bits*rce->qscale, - (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale, - rce->mv_bits/mb_num, - rce->pict_type == B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code, - rce->i_count/mb_num, - rce->mc_mb_var_sum/mb_num, - rce->mb_var_sum/mb_num, - rce->pict_type == I_TYPE, - rce->pict_type == P_TYPE, - rce->pict_type == B_TYPE, - rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type], - a->qcompress, -/* rcc->last_qscale_for[I_TYPE], - rcc->last_qscale_for[P_TYPE], - rcc->last_qscale_for[B_TYPE], - rcc->next_non_b_qscale,*/ - rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE], - rcc->i_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE], - rcc->p_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE], - rcc->p_cplx_sum[B_TYPE] / (double)rcc->frame_count[B_TYPE], - (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type], - 0 - }; - static const char *const_names[]={ + const char *error = NULL; + static const char * const const_names[]={ "PI", "E", "iTex", @@ -301,39 +99,280 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f (void *)qp2bits, NULL }; - static const char *func1_names[]={ + static const char * const func1_names[]={ "bits2qp", "qp2bits", NULL }; + emms_c(); + + rcc->rc_eq_eval = ff_parse(s->avctx->rc_eq ? s->avctx->rc_eq : "tex^qComp", const_names, func1, func1_names, NULL, NULL, &error); + if (!rcc->rc_eq_eval) { + av_log(s->avctx, AV_LOG_ERROR, "Error parsing rc_eq \"%s\": %s\n", s->avctx->rc_eq, error? error : ""); + return -1; + } + + for(i=0; i<5; i++){ + rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0; + rcc->pred[i].count= 1.0; + + rcc->pred[i].decay= 0.4; + rcc->i_cplx_sum [i]= + rcc->p_cplx_sum [i]= + rcc->mv_bits_sum[i]= + rcc->qscale_sum [i]= + rcc->frame_count[i]= 1; // 1 is better because of 1/0 and such + rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5; + } + rcc->buffer_index= s->avctx->rc_initial_buffer_occupancy; + + if(s->flags&CODEC_FLAG_PASS2){ + int i; + char *p; + + /* find number of pics */ + p= s->avctx->stats_in; + for(i=-1; p; i++){ + p= strchr(p+1, ';'); + } + i+= s->max_b_frames; + if(i<=0 || i>=INT_MAX / sizeof(RateControlEntry)) + return -1; + rcc->entry = av_mallocz(i*sizeof(RateControlEntry)); + rcc->num_entries= i; + + /* init all to skipped p frames (with b frames we might have a not encoded frame at the end FIXME) */ + for(i=0; inum_entries; i++){ + RateControlEntry *rce= &rcc->entry[i]; + rce->pict_type= rce->new_pict_type=FF_P_TYPE; + rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2; + rce->misc_bits= s->mb_num + 10; + rce->mb_var_sum= s->mb_num*100; + } + + /* read stats */ + p= s->avctx->stats_in; + for(i=0; inum_entries - s->max_b_frames; i++){ + RateControlEntry *rce; + int picture_number; + int e; + char *next; + + next= strchr(p, ';'); + if(next){ + (*next)=0; //sscanf in unbelievably slow on looong strings //FIXME copy / do not write + next++; + } + e= sscanf(p, " in:%d ", &picture_number); + + assert(picture_number >= 0); + assert(picture_number < rcc->num_entries); + rce= &rcc->entry[picture_number]; + + e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d skipcount:%d hbits:%d", + &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits, + &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count, &rce->skip_count, &rce->header_bits); + if(e!=14){ + av_log(s->avctx, AV_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e); + return -1; + } + + p= next; + } + + if(init_pass2(s) < 0) return -1; + + //FIXME maybe move to end + if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID) { +#ifdef CONFIG_LIBXVID + return ff_xvid_rate_control_init(s); +#else + av_log(s->avctx, AV_LOG_ERROR, "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n"); + return -1; +#endif + } + } + + if(!(s->flags&CODEC_FLAG_PASS2)){ + + rcc->short_term_qsum=0.001; + rcc->short_term_qcount=0.001; + + rcc->pass1_rc_eq_output_sum= 0.001; + rcc->pass1_wanted_bits=0.001; + + if(s->avctx->qblur > 1.0){ + av_log(s->avctx, AV_LOG_ERROR, "qblur too large\n"); + return -1; + } + /* init stuff with the user specified complexity */ + if(s->avctx->rc_initial_cplx){ + for(i=0; i<60*30; i++){ + double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num; + RateControlEntry rce; + double q; + + if (i%((s->gop_size+3)/4)==0) rce.pict_type= FF_I_TYPE; + else if(i%(s->max_b_frames+1)) rce.pict_type= FF_B_TYPE; + else rce.pict_type= FF_P_TYPE; + + rce.new_pict_type= rce.pict_type; + rce.mc_mb_var_sum= bits*s->mb_num/100000; + rce.mb_var_sum = s->mb_num; + rce.qscale = FF_QP2LAMBDA * 2; + rce.f_code = 2; + rce.b_code = 1; + rce.misc_bits= 1; + + if(s->pict_type== FF_I_TYPE){ + rce.i_count = s->mb_num; + rce.i_tex_bits= bits; + rce.p_tex_bits= 0; + rce.mv_bits= 0; + }else{ + rce.i_count = 0; //FIXME we do know this approx + rce.i_tex_bits= 0; + rce.p_tex_bits= bits*0.9; + rce.mv_bits= bits*0.1; + } + rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale; + rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale; + rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits; + rcc->frame_count[rce.pict_type] ++; + + bits= rce.i_tex_bits + rce.p_tex_bits; + + q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i); + rcc->pass1_wanted_bits+= s->bit_rate/(1/av_q2d(s->avctx->time_base)); //FIXME misbehaves a little for variable fps + } + } + + } + + return 0; +} + +void ff_rate_control_uninit(MpegEncContext *s) +{ + RateControlContext *rcc= &s->rc_context; + emms_c(); + + ff_eval_free(rcc->rc_eq_eval); + av_freep(&rcc->entry); + +#ifdef CONFIG_LIBXVID + if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID) + ff_xvid_rate_control_uninit(s); +#endif +} + +int ff_vbv_update(MpegEncContext *s, int frame_size){ + RateControlContext *rcc= &s->rc_context; + const double fps= 1/av_q2d(s->avctx->time_base); + const int buffer_size= s->avctx->rc_buffer_size; + const double min_rate= s->avctx->rc_min_rate/fps; + const double max_rate= s->avctx->rc_max_rate/fps; + +//printf("%d %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate); + if(buffer_size){ + int left; + + rcc->buffer_index-= frame_size; + if(rcc->buffer_index < 0){ + av_log(s->avctx, AV_LOG_ERROR, "rc buffer underflow\n"); + rcc->buffer_index= 0; + } + + left= buffer_size - rcc->buffer_index - 1; + rcc->buffer_index += av_clip(left, min_rate, max_rate); + + if(rcc->buffer_index > buffer_size){ + int stuffing= ceil((rcc->buffer_index - buffer_size)/8); + + if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4) + stuffing=4; + rcc->buffer_index -= 8*stuffing; + + if(s->avctx->debug & FF_DEBUG_RC) + av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing); + + return stuffing; + } + } + return 0; +} + +/** + * modifies the bitrate curve from pass1 for one frame + */ +static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){ + RateControlContext *rcc= &s->rc_context; + AVCodecContext *a= s->avctx; + double q, bits; + const int pict_type= rce->new_pict_type; + const double mb_num= s->mb_num; + int i; + + double const_values[]={ + M_PI, + M_E, + rce->i_tex_bits*rce->qscale, + rce->p_tex_bits*rce->qscale, + (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale, + rce->mv_bits/mb_num, + rce->pict_type == FF_B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code, + rce->i_count/mb_num, + rce->mc_mb_var_sum/mb_num, + rce->mb_var_sum/mb_num, + rce->pict_type == FF_I_TYPE, + rce->pict_type == FF_P_TYPE, + rce->pict_type == FF_B_TYPE, + rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type], + a->qcompress, +/* rcc->last_qscale_for[FF_I_TYPE], + rcc->last_qscale_for[FF_P_TYPE], + rcc->last_qscale_for[FF_B_TYPE], + rcc->next_non_b_qscale,*/ + rcc->i_cplx_sum[FF_I_TYPE] / (double)rcc->frame_count[FF_I_TYPE], + rcc->i_cplx_sum[FF_P_TYPE] / (double)rcc->frame_count[FF_P_TYPE], + rcc->p_cplx_sum[FF_P_TYPE] / (double)rcc->frame_count[FF_P_TYPE], + rcc->p_cplx_sum[FF_B_TYPE] / (double)rcc->frame_count[FF_B_TYPE], + (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type], + 0 + }; + + bits= ff_parse_eval(rcc->rc_eq_eval, const_values, rce); + if (isnan(bits)) { + av_log(s->avctx, AV_LOG_ERROR, "Error evaluating rc_eq \"%s\"\n", s->avctx->rc_eq); + return -1; + } - bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce); - rcc->pass1_rc_eq_output_sum+= bits; bits*=rate_factor; if(bits<0.0) bits=0.0; bits+= 1.0; //avoid 1/0 issues - + /* user override */ for(i=0; iavctx->rc_override_count; i++){ RcOverride *rco= s->avctx->rc_override; if(rco[i].start_frame > frame_num) continue; if(rco[i].end_frame < frame_num) continue; - - if(rco[i].qscale) + + if(rco[i].qscale) bits= qp2bits(rce, rco[i].qscale); //FIXME move at end to really force it? else bits*= rco[i].quality_factor; } q= bits2qp(rce, bits); - + /* I/B difference */ - if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0) + if (pict_type==FF_I_TYPE && s->avctx->i_quant_factor<0.0) q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; - else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0) + else if(pict_type==FF_B_TYPE && s->avctx->b_quant_factor<0.0) q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; - + if(q<1) q=1; + return q; } @@ -341,16 +380,17 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl RateControlContext *rcc= &s->rc_context; AVCodecContext *a= s->avctx; const int pict_type= rce->new_pict_type; - const double last_p_q = rcc->last_qscale_for[P_TYPE]; + const double last_p_q = rcc->last_qscale_for[FF_P_TYPE]; const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type]; - - if (pict_type==I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==P_TYPE)) - q= last_p_q *ABS(a->i_quant_factor) + a->i_quant_offset; - else if(pict_type==B_TYPE && a->b_quant_factor>0.0) + + if (pict_type==FF_I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==FF_P_TYPE)) + q= last_p_q *FFABS(a->i_quant_factor) + a->i_quant_offset; + else if(pict_type==FF_B_TYPE && a->b_quant_factor>0.0) q= last_non_b_q* a->b_quant_factor + a->b_quant_offset; + if(q<1) q=1; /* last qscale / qdiff stuff */ - if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){ + if(rcc->last_non_b_pict_type==pict_type || pict_type!=FF_I_TYPE){ double last_q= rcc->last_qscale_for[pict_type]; const int maxdiff= FF_QP2LAMBDA * a->max_qdiff; @@ -358,9 +398,9 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl else if(q < last_q - maxdiff) q= last_q - maxdiff; } - rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring - - if(pict_type!=B_TYPE) + rcc->last_qscale_for[pict_type]= q; //Note we cannot do that after blurring + + if(pict_type!=FF_B_TYPE) rcc->last_non_b_pict_type= pict_type; return q; @@ -370,24 +410,24 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl * gets the qmin & qmax for pict_type */ static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){ - int qmin= s->avctx->lmin; + int qmin= s->avctx->lmin; int qmax= s->avctx->lmax; - + assert(qmin <= qmax); - if(pict_type==B_TYPE){ - qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); - qmax= (int)(qmax*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); - }else if(pict_type==I_TYPE){ - qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); - qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); + if(pict_type==FF_B_TYPE){ + qmin= (int)(qmin*FFABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); + qmax= (int)(qmax*FFABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); + }else if(pict_type==FF_I_TYPE){ + qmin= (int)(qmin*FFABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); + qmax= (int)(qmax*FFABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); } - qmin= clip(qmin, 1, FF_LAMBDA_MAX); - qmax= clip(qmax, 1, FF_LAMBDA_MAX); + qmin= av_clip(qmin, 1, FF_LAMBDA_MAX); + qmax= av_clip(qmax, 1, FF_LAMBDA_MAX); if(qmaxnew_pict_type; const double buffer_size= s->avctx->rc_buffer_size; - const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; + const double fps= 1/av_q2d(s->avctx->time_base); const double min_rate= s->avctx->rc_min_rate / fps; const double max_rate= s->avctx->rc_max_rate / fps; - + get_qminmax(&qmin, &qmax, s, pict_type); /* modulation */ - if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE) + if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==FF_P_TYPE) q*= s->avctx->rc_qmod_amp; bits= qp2bits(rce, q); @@ -452,16 +492,16 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, }else{ double min2= log(qmin); double max2= log(qmax); - + q= log(q); q= (q - min2)/(max2-min2) - 0.5; q*= -4.0; q= 1.0/(1.0 + exp(q)); q= q*(max2-min2) + min2; - + q= exp(q); } - + return q; } @@ -499,28 +539,35 @@ static void adaptive_quantization(MpegEncContext *s, double q){ const float temp_cplx_masking= s->avctx->temporal_cplx_masking; const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; const float p_masking = s->avctx->p_masking; + const float border_masking = s->avctx->border_masking; float bits_sum= 0.0; float cplx_sum= 0.0; float cplx_tab[s->mb_num]; float bits_tab[s->mb_num]; - const int qmin= s->avctx->lmin; - const int qmax= s->avctx->lmax; + const int qmin= s->avctx->mb_lmin; + const int qmax= s->avctx->mb_lmax; Picture * const pic= &s->current_picture; - + const int mb_width = s->mb_width; + const int mb_height = s->mb_height; + for(i=0; imb_num; i++){ const int mb_xy= s->mb_index2xy[i]; float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); //FIXME merge in pow() float spat_cplx= sqrt(pic->mb_var[mb_xy]); const int lumi= pic->mb_mean[mb_xy]; float bits, cplx, factor; -#if 0 + int mb_x = mb_xy % s->mb_stride; + int mb_y = mb_xy / s->mb_stride; + int mb_distance; + float mb_factor = 0.0; +#if 0 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune -#endif +#endif if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune - if((s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTRA)){//FIXME hq mode + if((s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTRA)){//FIXME hq mode cplx= spat_cplx; factor= 1.0 + p_masking; }else{ @@ -533,9 +580,26 @@ static void adaptive_quantization(MpegEncContext *s, double q){ factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking); else factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking); - + + if(mb_x < mb_width/5){ + mb_distance = mb_width/5 - mb_x; + mb_factor = (float)mb_distance / (float)(mb_width/5); + }else if(mb_x > 4*mb_width/5){ + mb_distance = mb_x - 4*mb_width/5; + mb_factor = (float)mb_distance / (float)(mb_width/5); + } + if(mb_y < mb_height/5){ + mb_distance = mb_height/5 - mb_y; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + }else if(mb_y > 4*mb_height/5){ + mb_distance = mb_y - 4*mb_height/5; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + } + + factor*= 1.0 - border_masking*mb_factor; + if(factor<0.00001) factor= 0.00001; - + bits= cplx*factor; cplx_sum+= cplx; bits_sum+= bits; @@ -543,11 +607,12 @@ static void adaptive_quantization(MpegEncContext *s, double q){ bits_tab[i]= bits; } - /* handle qmin/qmax cliping */ + /* handle qmin/qmax clipping */ if(s->flags&CODEC_FLAG_NORMALIZE_AQP){ + float factor= bits_sum/cplx_sum; for(i=0; imb_num; i++){ float newq= q*cplx_tab[i]/bits_tab[i]; - newq*= bits_sum/cplx_sum; + newq*= factor; if (newq > qmax){ bits_sum -= bits_tab[i]; @@ -558,8 +623,10 @@ static void adaptive_quantization(MpegEncContext *s, double q){ cplx_sum -= cplx_tab[i]*q/qmin; } } + if(bits_sum < 0.001) bits_sum= 0.001; + if(cplx_sum < 0.001) cplx_sum= 0.001; } - + for(i=0; imb_num; i++){ const int mb_xy= s->mb_index2xy[i]; float newq= q*cplx_tab[i]/bits_tab[i]; @@ -578,9 +645,20 @@ static void adaptive_quantization(MpegEncContext *s, double q){ s->lambda_table[mb_xy]= intq; } } + +void ff_get_2pass_fcode(MpegEncContext *s){ + RateControlContext *rcc= &s->rc_context; + int picture_number= s->picture_number; + RateControlEntry *rce; + + rce= &rcc->entry[picture_number]; + s->f_code= rce->f_code; + s->b_code= rce->b_code; +} + //FIXME rd or at least approx for dquant -float ff_rate_estimate_qscale(MpegEncContext *s) +float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run) { float q; int qmin, qmax; @@ -600,13 +678,18 @@ float ff_rate_estimate_qscale(MpegEncContext *s) Picture * const pic= &s->current_picture; emms_c(); +#ifdef CONFIG_LIBXVID + if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID) + return ff_xvid_rate_estimate_qscale(s, dry_run); +#endif + get_qminmax(&qmin, &qmax, s, pict_type); - fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; + fps= 1/av_q2d(s->avctx->time_base); //printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate); /* update predictors */ - if(picture_number>2){ - const int last_var= s->last_pict_type == I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum; + if(picture_number>2 && !dry_run){ + const int last_var= s->last_pict_type == FF_I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum; update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits); } @@ -616,25 +699,40 @@ float ff_rate_estimate_qscale(MpegEncContext *s) rce= &rcc->entry[picture_number]; wanted_bits= rce->expected_bits; }else{ + Picture *dts_pic; rce= &local_rce; - wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); + + //FIXME add a dts field to AVFrame and ensure its set and use it here instead of reordering + //but the reordering is simpler for now until h.264 b pyramid must be handeld + if(s->pict_type == FF_B_TYPE || s->low_delay) + dts_pic= s->current_picture_ptr; + else + dts_pic= s->last_picture_ptr; + +//if(dts_pic) +// av_log(NULL, AV_LOG_ERROR, "%Ld %Ld %Ld %d\n", s->current_picture_ptr->pts, s->user_specified_pts, dts_pic->pts, picture_number); + + if(!dts_pic || dts_pic->pts == AV_NOPTS_VALUE) + wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); + else + wanted_bits= (uint64_t)(s->bit_rate*(double)dts_pic->pts/fps); } diff= s->total_bits - wanted_bits; br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance; if(br_compensation<=0.0) br_compensation=0.001; - var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum; - + var= pict_type == FF_I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum; + short_term_q = 0; /* avoid warning */ if(s->flags&CODEC_FLAG_PASS2){ - if(pict_type!=I_TYPE) + if(pict_type!=FF_I_TYPE) assert(pict_type == rce->new_pict_type); q= rce->new_qscale / br_compensation; //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type); }else{ - rce->pict_type= + rce->pict_type= rce->new_pict_type= pict_type; rce->mc_mb_var_sum= pic->mc_mb_var_sum; rce->mb_var_sum = pic-> mb_var_sum; @@ -644,7 +742,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) rce->misc_bits= 1; bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var)); - if(pict_type== I_TYPE){ + if(pict_type== FF_I_TYPE){ rce->i_count = s->mb_num; rce->i_tex_bits= bits; rce->p_tex_bits= 0; @@ -653,7 +751,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) rce->i_count = 0; //FIXME we do know this approx rce->i_tex_bits= 0; rce->p_tex_bits= bits*0.9; - + rce->mv_bits= bits*0.1; } rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale; @@ -663,8 +761,10 @@ float ff_rate_estimate_qscale(MpegEncContext *s) bits= rce->i_tex_bits + rce->p_tex_bits; rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation; - + q= get_qscale(s, rce, rate_factor, picture_number); + if (q < 0) + return -1; assert(q>0.0); //printf("%f ", q); @@ -672,7 +772,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) //printf("%f ", q); assert(q>0.0); - if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass + if(pict_type==FF_P_TYPE || s->intra_only){ //FIXME type dependent blur like in 2-pass rcc->short_term_qsum*=a->qblur; rcc->short_term_qcount*=a->qblur; @@ -683,7 +783,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) //printf("%f ", q); } assert(q>0.0); - + q= modify_qscale(s, rce, q, picture_number); rcc->pass1_wanted_bits+= s->bit_rate/fps; @@ -698,17 +798,19 @@ float ff_rate_estimate_qscale(MpegEncContext *s) ); } - if (qqmax) q=qmax; if(s->adaptive_quant) adaptive_quantization(s, q); else q= (int)(q + 0.5); - - rcc->last_qscale= q; - rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum; - rcc->last_mb_var_sum= pic->mb_var_sum; + + if(!dry_run){ + rcc->last_qscale= q; + rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum; + rcc->last_mb_var_sum= pic->mb_var_sum; + } #if 0 { static int mvsum=0, texsum=0; @@ -727,25 +829,23 @@ static int init_pass2(MpegEncContext *s) { RateControlContext *rcc= &s->rc_context; AVCodecContext *a= s->avctx; - int i; - double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; + int i, toobig; + double fps= 1/av_q2d(s->avctx->time_base); double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1 - double avg_quantizer[5]; - uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits - uint64_t available_bits[5]; + uint64_t const_bits[5]={0,0,0,0,0}; // quantizer independent bits uint64_t all_const_bits; uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps); double rate_factor=0; double step; //int last_i_frame=-10000000; - const int filter_size= (int)(a->qblur*4) | 1; + const int filter_size= (int)(a->qblur*4) | 1; double expected_bits; - double *qscale, *blured_qscale; + double *qscale, *blurred_qscale, qscale_sum; /* find complexity & const_bits & decide the pict_types */ for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; - + rce->new_pict_type= rce->pict_type; rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale; rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale; @@ -755,45 +855,21 @@ static int init_pass2(MpegEncContext *s) complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale; const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits; } - all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE]; - + all_const_bits= const_bits[FF_I_TYPE] + const_bits[FF_P_TYPE] + const_bits[FF_B_TYPE]; + if(all_available_bits < all_const_bits){ - av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is to low\n"); + av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is too low\n"); return -1; } - - /* find average quantizers */ - avg_quantizer[P_TYPE]=0; - for(step=256*256; step>0.0000001; step*=0.5){ - double expected_bits=0; - avg_quantizer[P_TYPE]+= step; - - avg_quantizer[I_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset; - avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset; - - expected_bits= - + all_const_bits - + complexity[I_TYPE]/avg_quantizer[I_TYPE] - + complexity[P_TYPE]/avg_quantizer[P_TYPE] - + complexity[B_TYPE]/avg_quantizer[B_TYPE]; - - if(expected_bits < all_available_bits) avg_quantizer[P_TYPE]-= step; -//printf("%f %lld %f\n", expected_bits, all_available_bits, avg_quantizer[P_TYPE]); - } -//printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]); - for(i=0; i<5; i++){ - available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i]; - } -//printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits); - qscale= av_malloc(sizeof(double)*rcc->num_entries); - blured_qscale= av_malloc(sizeof(double)*rcc->num_entries); + blurred_qscale= av_malloc(sizeof(double)*rcc->num_entries); + toobig = 0; for(step=256*256; step>0.0000001; step*=0.5){ expected_bits=0; rate_factor+= step; - + rcc->buffer_index= s->avctx->rc_buffer_size/2; /* find qscale */ @@ -805,7 +881,7 @@ static int init_pass2(MpegEncContext *s) /* fixed I/B QP relative to P mode */ for(i=rcc->num_entries-1; i>=0; i--){ RateControlEntry *rce= &rcc->entry[i]; - + qscale[i]= get_diff_limited_q(s, rce, qscale[i]); } @@ -815,41 +891,73 @@ static int init_pass2(MpegEncContext *s) const int pict_type= rce->new_pict_type; int j; double q=0.0, sum=0.0; - + for(j=0; jqblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur)); - + if(index < 0 || index >= rcc->num_entries) continue; if(pict_type != rcc->entry[index].new_pict_type) continue; q+= qscale[index] * coeff; sum+= coeff; } - blured_qscale[i]= q/sum; + blurred_qscale[i]= q/sum; } - + /* find expected bits */ for(i=0; inum_entries; i++){ RateControlEntry *rce= &rcc->entry[i]; double bits; - rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i); + rce->new_qscale= modify_qscale(s, rce, blurred_qscale[i], i); bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits; -//printf("%d %f\n", rce->new_bits, blured_qscale[i]); +//printf("%d %f\n", rce->new_bits, blurred_qscale[i]); bits += 8*ff_vbv_update(s, bits); rce->expected_bits= expected_bits; expected_bits += bits; } -// printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor); - if(expected_bits > all_available_bits) rate_factor-= step; + /* + av_log(s->avctx, AV_LOG_INFO, + "expected_bits: %f all_available_bits: %d rate_factor: %f\n", + expected_bits, (int)all_available_bits, rate_factor); + */ + if(expected_bits > all_available_bits) { + rate_factor-= step; + ++toobig; + } } av_free(qscale); - av_free(blured_qscale); + av_free(blurred_qscale); - if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){ - av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n"); + /* check bitrate calculations and print info */ + qscale_sum = 0.0; + for(i=0; inum_entries; i++){ + /* av_log(s->avctx, AV_LOG_DEBUG, "[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n", + i, rcc->entry[i].new_qscale, rcc->entry[i].new_qscale / FF_QP2LAMBDA); */ + qscale_sum += av_clip(rcc->entry[i].new_qscale / FF_QP2LAMBDA, s->avctx->qmin, s->avctx->qmax); + } + assert(toobig <= 40); + av_log(s->avctx, AV_LOG_DEBUG, + "[lavc rc] requested bitrate: %d bps expected bitrate: %d bps\n", + s->bit_rate, + (int)(expected_bits / ((double)all_available_bits/s->bit_rate))); + av_log(s->avctx, AV_LOG_DEBUG, + "[lavc rc] estimated target average qp: %.3f\n", + (float)qscale_sum / rcc->num_entries); + if (toobig == 0) { + av_log(s->avctx, AV_LOG_INFO, + "[lavc rc] Using all of requested bitrate is not " + "necessary for this video with these parameters.\n"); + } else if (toobig == 40) { + av_log(s->avctx, AV_LOG_ERROR, + "[lavc rc] Error: bitrate too low for this video " + "with these parameters.\n"); + return -1; + } else if (fabs(expected_bits/all_available_bits - 1.0) > 0.01) { + av_log(s->avctx, AV_LOG_ERROR, + "[lavc rc] Error: 2pass curve failed to converge\n"); return -1; } diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.h b/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.h new file mode 100644 index 0000000000..8704b43014 --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/libavcodec/ratecontrol.h @@ -0,0 +1,105 @@ +/* + * Ratecontrol + * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. + * Copyright (c) 2002-2004 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef FFMPEG_RATECONTROL_H +#define FFMPEG_RATECONTROL_H + +/** + * @file ratecontrol.h + * ratecontrol header. + */ + +#include +#include +#include "eval.h" + +typedef struct Predictor{ + double coeff; + double count; + double decay; +} Predictor; + +typedef struct RateControlEntry{ + int pict_type; + float qscale; + int mv_bits; + int i_tex_bits; + int p_tex_bits; + int misc_bits; + int header_bits; + uint64_t expected_bits; + int new_pict_type; + float new_qscale; + int mc_mb_var_sum; + int mb_var_sum; + int i_count; + int skip_count; + int f_code; + int b_code; +}RateControlEntry; + +/** + * rate control context. + */ +typedef struct RateControlContext{ + FILE *stats_file; + int num_entries; ///< number of RateControlEntries + RateControlEntry *entry; + double buffer_index; ///< amount of bits in the video/audio buffer + Predictor pred[5]; + double short_term_qsum; ///< sum of recent qscales + double short_term_qcount; ///< count of recent qscales + double pass1_rc_eq_output_sum;///< sum of the output of the rc equation, this is used for normalization + double pass1_wanted_bits; ///< bits which should have been outputed by the pass1 code (including complexity init) + double last_qscale; + double last_qscale_for[5]; ///< last qscale for a specific pict type, used for max_diff & ipb factor stuff + int last_mc_mb_var_sum; + int last_mb_var_sum; + uint64_t i_cplx_sum[5]; + uint64_t p_cplx_sum[5]; + uint64_t mv_bits_sum[5]; + uint64_t qscale_sum[5]; + int frame_count[5]; + int last_non_b_pict_type; + + void *non_lavc_opaque; ///< context for non lavc rc code (for example xvid) + float dry_run_qscale; ///< for xvid rc + int last_picture_number; ///< for xvid rc + AVEvalExpr * rc_eq_eval; +}RateControlContext; + +struct MpegEncContext; + +/* rate control */ +int ff_rate_control_init(struct MpegEncContext *s); +float ff_rate_estimate_qscale(struct MpegEncContext *s, int dry_run); +void ff_write_pass1_stats(struct MpegEncContext *s); +void ff_rate_control_uninit(struct MpegEncContext *s); +int ff_vbv_update(struct MpegEncContext *s, int frame_size); +void ff_get_2pass_fcode(struct MpegEncContext *s); + +int ff_xvid_rate_control_init(struct MpegEncContext *s); +void ff_xvid_rate_control_uninit(struct MpegEncContext *s); +float ff_xvid_rate_estimate_qscale(struct MpegEncContext *s, int dry_run); + +#endif /* FFMPEG_RATECONTROL_H */ + diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/raw.c b/src/add-ons/media/plugins/avcodec/libavcodec/raw.c index ee4b6fdc66..d0cf50d9e8 100644 --- a/src/add-ons/media/plugins/avcodec/libavcodec/raw.c +++ b/src/add-ons/media/plugins/avcodec/libavcodec/raw.c @@ -2,43 +2,35 @@ * Raw Video Codec * Copyright (c) 2001 Fabrice Bellard. * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - + /** * @file raw.c * Raw Video Codec */ - + #include "avcodec.h" +#include "raw.h" -typedef struct RawVideoContext { - unsigned char * buffer; /* block of memory for holding one frame */ - unsigned char * p; /* current position in buffer */ - int length; /* number of bytes in buffer */ - AVFrame pic; ///< AVCodecContext.coded_frame -} RawVideoContext; - -typedef struct PixleFormatTag { - int pix_fmt; - unsigned int fourcc; -} PixelFormatTag; - -const PixelFormatTag pixelFormatTags[] = { +const PixelFormatTag ff_raw_pixelFormatTags[] = { { PIX_FMT_YUV420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */ { PIX_FMT_YUV420P, MKTAG('I', 'Y', 'U', 'V') }, + { PIX_FMT_YUV420P, MKTAG('Y', 'V', '1', '2') }, { PIX_FMT_YUV410P, MKTAG('Y', 'U', 'V', '9') }, { PIX_FMT_YUV411P, MKTAG('Y', '4', '1', 'B') }, { PIX_FMT_YUV422P, MKTAG('Y', '4', '2', 'B') }, @@ -46,131 +38,30 @@ const PixelFormatTag pixelFormatTags[] = { { PIX_FMT_GRAY8, MKTAG(' ', ' ', 'Y', '8') }, - { PIX_FMT_YUV422, MKTAG('Y', '4', '2', '2') }, /* Packed formats */ - { PIX_FMT_YUV422, MKTAG('U', 'Y', 'V', 'Y') }, + { PIX_FMT_YUYV422, MKTAG('Y', 'U', 'Y', '2') }, /* Packed formats */ + { PIX_FMT_YUYV422, MKTAG('Y', '4', '2', '2') }, + { PIX_FMT_UYVY422, MKTAG('U', 'Y', 'V', 'Y') }, + { PIX_FMT_UYVY422, MKTAG('H', 'D', 'Y', 'C') }, { PIX_FMT_GRAY8, MKTAG('G', 'R', 'E', 'Y') }, + { PIX_FMT_RGB555, MKTAG('R', 'G', 'B', 15) }, + { PIX_FMT_BGR555, MKTAG('B', 'G', 'R', 15) }, + { PIX_FMT_RGB565, MKTAG('R', 'G', 'B', 16) }, + { PIX_FMT_BGR565, MKTAG('B', 'G', 'R', 16) }, + + /* quicktime */ + { PIX_FMT_UYVY422, MKTAG('2', 'v', 'u', 'y') }, + { PIX_FMT_UYVY422, MKTAG('A', 'V', 'U', 'I') }, /* FIXME merge both fields */ { -1, 0 }, }; -static int findPixelFormat(unsigned int fourcc) +unsigned int avcodec_pix_fmt_to_codec_tag(enum PixelFormat fmt) { - const PixelFormatTag * tags = pixelFormatTags; - while (tags->pix_fmt >= 0) { - if (tags->fourcc == fourcc) - return tags->pix_fmt; - tags++; - } - return PIX_FMT_YUV420P; -} - -static unsigned int findFourCC(int fmt) -{ - const PixelFormatTag * tags = pixelFormatTags; + const PixelFormatTag * tags = ff_raw_pixelFormatTags; while (tags->pix_fmt >= 0) { if (tags->pix_fmt == fmt) - return tags->fourcc; - tags++; + return tags->fourcc; + tags++; } return 0; } - -/* RAW Decoder Implementation */ - -static int raw_init_decoder(AVCodecContext *avctx) -{ - RawVideoContext *context = avctx->priv_data; - - if (avctx->codec_tag) - avctx->pix_fmt = findPixelFormat(avctx->codec_tag); - - context->length = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); - context->buffer = av_malloc(context->length); - context->p = context->buffer; - context->pic.pict_type = FF_I_TYPE; - context->pic.key_frame = 1; - - avctx->coded_frame= &context->pic; - - if (!context->buffer) - return -1; - - return 0; -} - -static int raw_decode(AVCodecContext *avctx, - void *data, int *data_size, - uint8_t *buf, int buf_size) -{ - RawVideoContext *context = avctx->priv_data; - int bytesNeeded; - - AVPicture * picture = (AVPicture *) data; - - /* Early out without copy if packet size == frame size */ - if (buf_size == context->length && context->p == context->buffer) { - avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height); - *data_size = sizeof(AVPicture); - return buf_size; - } - - bytesNeeded = context->length - (context->p - context->buffer); - if (buf_size < bytesNeeded) { - memcpy(context->p, buf, buf_size); - context->p += buf_size; - *data_size = 0; - return buf_size; - } - - memcpy(context->p, buf, bytesNeeded); - context->p = context->buffer; - avpicture_fill(picture, context->buffer, avctx->pix_fmt, avctx->width, avctx->height); - *data_size = sizeof(AVPicture); - return bytesNeeded; -} - -static int raw_close_decoder(AVCodecContext *avctx) -{ - RawVideoContext *context = avctx->priv_data; - - av_freep(&context->buffer); - return 0; -} - -/* RAW Encoder Implementation */ - -static int raw_init_encoder(AVCodecContext *avctx) -{ - avctx->coded_frame = (AVFrame *)avctx->priv_data; - avctx->coded_frame->pict_type = FF_I_TYPE; - avctx->coded_frame->key_frame = 1; - avctx->codec_tag = findFourCC(avctx->pix_fmt); - return 0; -} - -static int raw_encode(AVCodecContext *avctx, - unsigned char *frame, int buf_size, void *data) -{ - return avpicture_layout((AVPicture *)data, avctx->pix_fmt, avctx->width, - avctx->height, frame, buf_size); -} - -AVCodec rawvideo_encoder = { - "rawvideo", - CODEC_TYPE_VIDEO, - CODEC_ID_RAWVIDEO, - sizeof(AVFrame), - raw_init_encoder, - raw_encode, -}; - -AVCodec rawvideo_decoder = { - "rawvideo", - CODEC_TYPE_VIDEO, - CODEC_ID_RAWVIDEO, - sizeof(RawVideoContext), - raw_init_decoder, - NULL, - raw_close_decoder, - raw_decode, -}; diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/raw.h b/src/add-ons/media/plugins/avcodec/libavcodec/raw.h new file mode 100644 index 0000000000..1110114e25 --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/libavcodec/raw.h @@ -0,0 +1,39 @@ +/* + * Raw Video Codec + * Copyright (c) 2001 Fabrice Bellard. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file raw.h + * Raw Video Codec + */ + +#ifndef FFMPEG_RAW_H +#define FFMPEG_RAW_H + +#include "avcodec.h" + +typedef struct PixelFormatTag { + int pix_fmt; + unsigned int fourcc; +} PixelFormatTag; + +extern const PixelFormatTag ff_raw_pixelFormatTags[]; + +#endif /* FFMPEG_RAW_H */ diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/rawdec.c b/src/add-ons/media/plugins/avcodec/libavcodec/rawdec.c new file mode 100644 index 0000000000..45f8f98788 --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/libavcodec/rawdec.c @@ -0,0 +1,166 @@ +/* + * Raw Video Decoder + * Copyright (c) 2001 Fabrice Bellard. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file rawdec.c + * Raw Video Decoder + */ + +#include "avcodec.h" +#include "raw.h" + +typedef struct RawVideoContext { + unsigned char * buffer; /* block of memory for holding one frame */ + int length; /* number of bytes in buffer */ + AVFrame pic; ///< AVCodecContext.coded_frame +} RawVideoContext; + +static const PixelFormatTag pixelFormatBpsAVI[] = { + { PIX_FMT_PAL8, 4 }, + { PIX_FMT_PAL8, 8 }, + { PIX_FMT_RGB555, 15 }, + { PIX_FMT_RGB555, 16 }, + { PIX_FMT_BGR24, 24 }, + { PIX_FMT_RGB32, 32 }, + { -1, 0 }, +}; + +static const PixelFormatTag pixelFormatBpsMOV[] = { + /* FIXME fix swscaler to support those */ + /* http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html */ + { PIX_FMT_PAL8, 4 }, + { PIX_FMT_PAL8, 8 }, + { PIX_FMT_BGR555, 16 }, + { PIX_FMT_RGB24, 24 }, + { PIX_FMT_BGR32_1, 32 }, + { -1, 0 }, +}; + +static int findPixelFormat(const PixelFormatTag *tags, unsigned int fourcc) +{ + while (tags->pix_fmt >= 0) { + if (tags->fourcc == fourcc) + return tags->pix_fmt; + tags++; + } + return PIX_FMT_YUV420P; +} + +static av_cold int raw_init_decoder(AVCodecContext *avctx) +{ + RawVideoContext *context = avctx->priv_data; + + if (avctx->codec_tag == MKTAG('r','a','w',' ')) + avctx->pix_fmt = findPixelFormat(pixelFormatBpsMOV, avctx->bits_per_sample); + else if (avctx->codec_tag) + avctx->pix_fmt = findPixelFormat(ff_raw_pixelFormatTags, avctx->codec_tag); + else if (avctx->bits_per_sample) + avctx->pix_fmt = findPixelFormat(pixelFormatBpsAVI, avctx->bits_per_sample); + + context->length = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); + context->buffer = av_malloc(context->length); + context->pic.pict_type = FF_I_TYPE; + context->pic.key_frame = 1; + + avctx->coded_frame= &context->pic; + + if (!context->buffer) + return -1; + + return 0; +} + +static void flip(AVCodecContext *avctx, AVPicture * picture){ + if(!avctx->codec_tag && avctx->bits_per_sample && picture->linesize[2]==0){ + picture->data[0] += picture->linesize[0] * (avctx->height-1); + picture->linesize[0] *= -1; + } +} + +static int raw_decode(AVCodecContext *avctx, + void *data, int *data_size, + const uint8_t *buf, int buf_size) +{ + RawVideoContext *context = avctx->priv_data; + + AVFrame * frame = (AVFrame *) data; + AVPicture * picture = (AVPicture *) data; + + frame->interlaced_frame = avctx->coded_frame->interlaced_frame; + frame->top_field_first = avctx->coded_frame->top_field_first; + + //4bpp raw in avi and mov (yes this is ugly ...) + if(avctx->bits_per_sample == 4 && avctx->pix_fmt==PIX_FMT_PAL8 && + (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))){ + int i; + for(i=256*2; i+1 < context->length>>1; i++){ + context->buffer[2*i+0]= buf[i-256*2]>>4; + context->buffer[2*i+1]= buf[i-256*2]&15; + } + buf= context->buffer + 256*4; + buf_size= context->length - 256*4; + } + + if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0)) + return -1; + + avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height); + if(avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length){ + frame->data[1]= context->buffer; + } + if (avctx->palctrl && avctx->palctrl->palette_changed) { + memcpy(frame->data[1], avctx->palctrl->palette, AVPALETTE_SIZE); + avctx->palctrl->palette_changed = 0; + } + + flip(avctx, picture); + + if (avctx->codec_tag == MKTAG('Y', 'V', '1', '2')) + { + // swap fields + unsigned char *tmp = picture->data[1]; + picture->data[1] = picture->data[2]; + picture->data[2] = tmp; + } + + *data_size = sizeof(AVPicture); + return buf_size; +} + +static av_cold int raw_close_decoder(AVCodecContext *avctx) +{ + RawVideoContext *context = avctx->priv_data; + + av_freep(&context->buffer); + return 0; +} + +AVCodec rawvideo_decoder = { + "rawvideo", + CODEC_TYPE_VIDEO, + CODEC_ID_RAWVIDEO, + sizeof(RawVideoContext), + raw_init_decoder, + NULL, + raw_close_decoder, + raw_decode, + .long_name = NULL_IF_CONFIG_SMALL("raw video"), +}; diff --git a/src/add-ons/media/plugins/avcodec/libavcodec/rawenc.c b/src/add-ons/media/plugins/avcodec/libavcodec/rawenc.c new file mode 100644 index 0000000000..24f258066d --- /dev/null +++ b/src/add-ons/media/plugins/avcodec/libavcodec/rawenc.c @@ -0,0 +1,55 @@ +/* + * Raw Video Encoder + * Copyright (c) 2001 Fabrice Bellard. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file rawenc.c + * Raw Video Encoder + */ + +#include "avcodec.h" +#include "raw.h" + +static av_cold int raw_init_encoder(AVCodecContext *avctx) +{ + avctx->coded_frame = (AVFrame *)avctx->priv_data; + avctx->coded_frame->pict_type = FF_I_TYPE; + avctx->coded_frame->key_frame = 1; + if(!avctx->codec_tag) + avctx->codec_tag = avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt); + return 0; +} + +static int raw_encode(AVCodecContext *avctx, + unsigned char *frame, int buf_size, void *data) +{ + return avpicture_layout((AVPicture *)data, avctx->pix_fmt, avctx->width, + avctx->height, frame, buf_size); +} + +AVCodec rawvideo_encoder = { + "rawvideo", + CODEC_TYPE_VIDEO, + CODEC_ID_RAWVIDEO, + sizeof(AVFrame), + raw_init_encoder, + raw_encode, + .long_name = NULL_IF_CONFIG_SMALL("raw video"), +};