1/*
2 * Real Audio 1.0 (14.4K)
3 * Copyright (c) 2003 the ffmpeg project
4 *
5 * This file is part of Libav.
6 *
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <stdint.h>
23#include "avcodec.h"
24#include "celp_filters.h"
25#include "ra144.h"
26
27const int16_t ff_gain_val_tab[256][3] = {
28    { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
29    {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
30    { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
31    {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
32    { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
33    { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
34    { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
35    {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
36    { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
37    { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
38    { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
39    {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
40    {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
41    { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
42    {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
43    {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
44    { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
45    { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
46    { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
47    { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
48    { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
49    { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
50    {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
51    {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
52    { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
53    {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
54    {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
55    {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
56    {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
57    {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
58    {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
59    {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
60    { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
61    { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
62    { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
63    { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
64    {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
65    { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
66    {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
67    {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
68    {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
69    { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
70    {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
71    {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
72    {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
73    {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
74    {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
75    {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
76    {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
77    {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
78    {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
79    {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
80    {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
81    {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
82    {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
83    {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
84    { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
85    {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
86    {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
87    { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
88    {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
89    {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
90    {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
91    {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
92};
93
94const uint8_t ff_gain_exp_tab[256] = {
95   15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
96   14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
97   13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
98   13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
99   13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
100   12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
101   12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
102   13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
103   13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
104   12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
105   12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
106   12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
107   12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
108   13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
109   11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
110   12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
111};
112
113const int8_t ff_cb1_vects[128][40]={
114    {
115     38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
116     -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
117    -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
118     -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
119    }, {
120     60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
121     -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
122    -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
123      7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
124    }, {
125     27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
126    -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
127    -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
128      2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
129    }, {
130     49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
131    -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
132    -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
133     14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
134    }, {
135     46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
136      8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
137     -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
138      0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
139    }, {
140     68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
141     10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
142     -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
143     12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
144    }, {
145     35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
146      0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
147    -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
148      6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
149    }, {
150     57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
151      3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
152    -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
153     18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
154    }, {
155     25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
156    -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
157      2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
158     -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
159    }, {
160     47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
161    -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
162      7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
163      4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
164    }, {
165     14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
166    -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
167     -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
168      0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
169    }, {
170     36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
171    -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
172     -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
173     11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
174    }, {
175     33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
176     -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
177     12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
178     -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
179    }, {
180     55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
181      0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
182     18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
183      9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
184    }, {
185     22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
186    -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
187      2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
188      4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
189    }, {
190     44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
191     -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
192      8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
193     15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
194    }, {
195     -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
196      5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
197    -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
198     -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
199    }, {
200     18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
201      7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
202    -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
203      9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
204    }, {
205    -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
206     -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
207    -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
208      3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
209    }, {
210      8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
211      0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
212    -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
213     15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
214    }, {
215      4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
216     19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
217    -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
218      2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
219    }, {
220     26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
221     21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
222     -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
223     13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
224    }, {
225     -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
226     11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
227    -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
228      8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
229    }, {
230     16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
231     14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
232    -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
233     20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
234    }, {
235    -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
236     -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
237     -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
238     -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
239    }, {
240      6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
241     -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
242      4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
243      6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
244    }, {
245    -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
246    -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
247    -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
248      1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
249    }, {
250     -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
251    -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
252     -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
253     12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
254    }, {
255     -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
256      7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
257      9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
258      0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
259    }, {
260     13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
261     10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
262     15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
263     10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
264    }, {
265    -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
266      0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
267      0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
268      5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
269    }, {
270      3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
271      2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
272      4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
273     17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
274    }, {
275     60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
276     -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
277    -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
278    -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
279    }, {
280     82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
281      1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
282     -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
283      0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
284    }, {
285     49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
286     -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
287    -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
288     -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
289    }, {
290     71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
291     -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
292    -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
293      7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
294    }, {
295     67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
296     13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
297     -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
298     -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
299    }, {
300     90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
301     15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
302      3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
303      5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
304    }, {
305     57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
306      5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
307    -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
308      0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
309    }, {
310     79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
311      7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
312     -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
313     11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
314    }, {
315     47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
316    -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
317      9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
318    -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
319    }, {
320     69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
321    -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
322     15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
323     -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
324    }, {
325     36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
326    -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
327      0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
328     -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
329    }, {
330     58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
331    -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
332      5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
333      4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
334    }, {
335     55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
336      1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
337     19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
338     -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
339    }, {
340     77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
341      4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
342     25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
343      2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
344    }, {
345     44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
346     -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
347      9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
348     -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
349    }, {
350     66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
351     -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
352     15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
353      9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
354    }, {
355     18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
356     10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
357    -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
358     -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
359    }, {
360     40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
361     12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
362    -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
363      2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
364    }, {
365      8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
366      2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
367    -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
368     -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
369    }, {
370     30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
371      5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
372    -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
373      8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
374    }, {
375     26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
376     24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
377     -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
378     -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
379    }, {
380     48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
381     26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
382      0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
383      6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
384    }, {
385     15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
386     16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
387    -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
388      1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
389    }, {
390     37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
391     19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
392    -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
393     13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
394    }, {
395      5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
396     -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
397      5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
398    -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
399    }, {
400     27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
401      1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
402     11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
403      0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
404    }, {
405     -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
406     -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
407     -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
408     -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
409    }, {
410     17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
411     -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
412      1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
413      6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
414    }, {
415     13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
416     12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
417     16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
418     -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
419    }, {
420     35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
421     15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
422     22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
423      4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
424    }, {
425      3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
426      5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
427      6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
428      0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
429    }, {
430     25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
431      7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
432     12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
433     10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
434    }, {
435    -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
436     -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
437    -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
438    -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
439    }, {
440     -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
441     -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
442     -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
443      0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
444    }, {
445    -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
446    -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
447    -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
448     -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
449    }, {
450    -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
451    -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
452    -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
453      7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
454    }, {
455    -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
456      6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
457     -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
458     -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
459    }, {
460      4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
461      8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
462      4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
463      5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
464    }, {
465    -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
466     -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
467    -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
468      0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
469    }, {
470     -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
471      1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
472     -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
473     11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
474    }, {
475    -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
476    -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
477     10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
478    -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
479    }, {
480    -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
481    -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
482     16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
483     -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
484    }, {
485    -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
486    -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
487      0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
488     -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
489    }, {
490    -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
491    -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
492      6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
493      4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
494    }, {
495    -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
496     -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
497     20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
498     -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
499    }, {
500     -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
501     -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
502     26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
503      2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
504    }, {
505    -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
506    -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
507     10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
508     -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
509    }, {
510    -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
511    -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
512     16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
513      9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
514    }, {
515    -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
516      3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
517    -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
518     -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
519    }, {
520    -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
521      5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
522     -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
523      2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
524    }, {
525    -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
526     -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
527    -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
528     -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
529    }, {
530    -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
531     -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
532    -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
533      8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
534    }, {
535    -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
536     17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
537     -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
538     -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
539    }, {
540    -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
541     20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
542      0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
543      6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
544    }, {
545    -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
546     10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
547    -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
548      1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
549    }, {
550    -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
551     12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
552     -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
553     13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
554    }, {
555    -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
556     -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
557      6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
558    -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
559    }, {
560    -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
561     -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
562     12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
563      0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
564    }, {
565    -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
566    -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
567     -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
568     -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
569    }, {
570    -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
571    -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
572      2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
573      6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
574    }, {
575    -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
576      6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
577     17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
578     -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
579    }, {
580    -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
581      8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
582     23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
583      4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
584    }, {
585    -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
586     -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
587      7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
588      0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
589    }, {
590    -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
591      1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
592     13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
593     10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
594    }, {
595     -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
596     -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
597     -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
598    -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
599    }, {
600     18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
601      0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
602      0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
603     -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
604    }, {
605    -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
606    -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
607    -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
608    -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
609    }, {
610      8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
611     -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
612     -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
613      0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
614    }, {
615      4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
616     11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
617      5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
618    -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
619    }, {
620     26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
621     13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
622     11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
623     -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
624    }, {
625     -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
626      3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
627     -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
628     -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
629    }, {
630     16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
631      6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
632      1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
633      5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
634    }, {
635    -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
636    -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
637     17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
638    -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
639    }, {
640      5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
641    -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
642     23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
643     -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
644    }, {
645    -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
646    -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
647      7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
648    -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
649    }, {
650     -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
651    -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
652     13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
653     -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
654    }, {
655     -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
656      0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
657     28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
658    -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
659    }, {
660     13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
661      2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
662     34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
663     -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
664    }, {
665    -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
666     -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
667     18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
668     -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
669    }, {
670      3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
671     -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
672     23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
673      2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
674    }, {
675    -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
676      8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
677     -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
678    -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
679    }, {
680    -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
681     10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
682     -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
683     -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
684    }, {
685    -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
686      0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
687    -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
688     -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
689    }, {
690    -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
691      3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
692    -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
693      2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
694    }, {
695    -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
696     22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
697      2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
698    -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
699    }, {
700    -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
701     25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
702      7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
703      0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
704    }, {
705    -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
706     15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
707     -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
708     -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
709    }, {
710    -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
711     17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
712     -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
713      6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
714    }, {
715    -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
716     -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
717     14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
718    -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
719    }, {
720    -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
721      0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
722     20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
723     -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
724    }, {
725    -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
726    -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
727      4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
728    -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
729    }, {
730    -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
731     -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
732      9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
733      0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
734    }, {
735    -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
736     11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
737     24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
738    -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
739    }, {
740    -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
741     13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
742     30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
743     -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
744    }, {
745    -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
746      3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
747     14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
748     -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
749    }, {
750    -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
751      6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
752     20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
753      3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
754    }
755};
756
757const int8_t ff_cb2_vects[128][40]={
758    {
759     73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
760     -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
761    -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
762      6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
763    }, {
764      4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
765    -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
766    -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
767    -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
768    }, {
769     34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
770    -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
771      3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
772     22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
773    }, {
774    -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
775    -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
776     -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
777      1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
778    }, {
779     28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
780     18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
781    -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
782     24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
783    }, {
784    -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
785      0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
786    -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
787      3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
788    }, {
789    -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
790      4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
791     20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
792     40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
793    }, {
794    -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
795    -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
796     11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
797     19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
798    }, {
799     78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
800    -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
801    -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
802     22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
803    }, {
804      9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
805    -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
806    -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
807      1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
808    }, {
809     39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
810    -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
811    -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
812     38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
813    }, {
814    -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
815    -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
816    -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
817     17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
818    }, {
819     33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
820      6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
821    -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
822     39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
823    }, {
824    -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
825    -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
826    -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
827     18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
828    }, {
829     -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
830     -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
831      2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
832     55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
833    }, {
834    -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
835    -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
836     -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
837     34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
838    }, {
839     76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
840      8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
841    -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
842     -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
843    }, {
844      7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
845     -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
846    -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
847    -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
848    }, {
849     36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
850     -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
851     14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
852      7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
853    }, {
854    -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
855    -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
856      5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
857    -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
858    }, {
859     31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
860     30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
861     -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
862      9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
863    }, {
864    -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
865     12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
866    -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
867    -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
868    }, {
869     -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
870     16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
871     31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
872     25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
873    }, {
874    -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
875     -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
876     22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
877      4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
878    }, {
879     81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
880     -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
881    -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
882      6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
883    }, {
884     12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
885    -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
886    -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
887    -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
888    }, {
889     41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
890    -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
891     -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
892     22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
893    }, {
894    -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
895    -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
896    -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
897      2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
898    }, {
899     36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
900     18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
901    -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
902     24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
903    }, {
904    -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
905      0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
906    -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
907      3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
908    }, {
909     -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
910      4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
911     13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
912     40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
913    }, {
914    -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
915    -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
916      4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
917     19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
918    }, {
919    116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
920    -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
921    -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
922      4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
923    }, {
924     47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
925    -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
926    -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
927    -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
928    }, {
929     77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
930    -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
931     16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
932     20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
933    }, {
934      8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
935    -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
936      7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
937      0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
938    }, {
939     71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
940      8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
941     -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
942     22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
943    }, {
944      2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
945    -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
946    -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
947      1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
948    }, {
949     32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
950     -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
951     33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
952     38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
953    }, {
954    -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
955    -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
956     24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
957     17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
958    }, {
959    121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
960    -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
961    -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
962     19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
963    }, {
964     52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
965    -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
966    -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
967     -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
968    }, {
969     82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
970    -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
971     -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
972     35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
973    }, {
974     13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
975    -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
976    -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
977     14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
978    }, {
979     76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
980     -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
981    -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
982     37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
983    }, {
984      7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
985    -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
986    -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
987     16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
988    }, {
989     37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
990    -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
991     15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
992     53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
993    }, {
994    -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
995    -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
996      6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
997     32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
998    }, {
999    119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1000     -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1001    -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1002    -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1003    }, {
1004     50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1005    -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1006    -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1007    -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1008    }, {
1009     79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1010    -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1011     26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1012      5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1013    }, {
1014     10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1015    -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1016     17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1017    -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1018    }, {
1019     74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1020     20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1021      3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1022      6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1023    }, {
1024      5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1025      2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1026     -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1027    -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1028    }, {
1029     34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1030      6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1031     43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1032     22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1033    }, {
1034    -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1035    -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1036     34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1037      2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1038    }, {
1039    124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1040    -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1041    -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1042      4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1043    }, {
1044     55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1045    -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1046    -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1047    -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1048    }, {
1049     84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1050    -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1051      9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1052     20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1053    }, {
1054     15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1055    -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1056      0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1057      0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1058    }, {
1059     79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1060      8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1061    -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1062     22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1063    }, {
1064     10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1065     -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1066    -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1067      1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1068    }, {
1069     39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1070     -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1071     25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1072     38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1073    }, {
1074    -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1075    -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1076     16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1077     17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1078    }, {
1079     29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1080     24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1081    -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1082    -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1083    }, {
1084    -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1085      5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1086    -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1087    -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1088    }, {
1089    -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1090      9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1091     23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1092     -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1093    }, {
1094    -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1095     -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1096     14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1097    -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1098    }, {
1099    -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1100     46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1101      0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1102      0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1103    }, {
1104    -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1105     27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1106     -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1107    -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1108    }, {
1109    -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1110     31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1111     40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1112     16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1113    }, {
1114   -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1115     13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1116     31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1117     -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1118    }, {
1119     34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1120     12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1121    -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1122     -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1123    }, {
1124    -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1125     -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1126    -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1127    -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1128    }, {
1129     -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1130     -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1131      5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1132     14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1133    }, {
1134    -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1135    -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1136     -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1137     -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1138    }, {
1139    -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1140     34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1141    -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1142     15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1143    }, {
1144    -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1145     15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1146    -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1147     -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1148    }, {
1149    -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1150     19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1151     22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1152     31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1153    }, {
1154   -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1155      1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1156     13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1157     10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1158    }, {
1159     31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1160     36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1161     -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1162    -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1163    }, {
1164    -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1165     17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1166    -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1167    -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1168    }, {
1169     -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1170     22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1171     33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1172    -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1173    }, {
1174    -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1175      3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1176     24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1177    -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1178    }, {
1179    -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1180     58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1181     10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1182    -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1183    }, {
1184    -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1185     39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1186      1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1187    -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1188    }, {
1189    -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1190     44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1191     50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1192      1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1193    }, {
1194   -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1195     25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1196     41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1197    -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1198    }, {
1199     36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1200     24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1201    -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1202    -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1203    }, {
1204    -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1205      5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1206    -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1207    -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1208    }, {
1209     -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1210     10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1211     16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1212     -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1213    }, {
1214    -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1215     -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1216      7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1217    -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1218    }, {
1219     -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1220     46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1221     -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1222      0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1223    }, {
1224    -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1225     27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1226    -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1227    -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1228    }, {
1229    -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1230     32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1231     32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1232     16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1233    }, {
1234   -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1235     13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1236     23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1237     -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1238    }, {
1239     72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1240     13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1241     -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1242    -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1243    }, {
1244      3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1245     -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1246    -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1247    -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1248    }, {
1249     32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1250      0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1251     35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1252     -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1253    }, {
1254    -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1255    -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1256     26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1257    -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1258    }, {
1259     27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1260     35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1261     12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1262     -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1263    }, {
1264    -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1265     17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1266      3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1267    -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1268    }, {
1269    -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1270     21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1271     52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1272     14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1273    }, {
1274    -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1275      3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1276     43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1277     -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1278    }, {
1279     77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1280      1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1281    -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1282     -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1283    }, {
1284      8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1285    -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1286    -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1287    -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1288    }, {
1289     37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1290    -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1291     18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1292     11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1293    }, {
1294    -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1295    -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1296      9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1297     -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1298    }, {
1299     32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1300     23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1301     -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1302     13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1303    }, {
1304    -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1305      5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1306    -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1307     -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1308    }, {
1309     -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1310      9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1311     34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1312     29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1313    }, {
1314    -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1315     -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1316     25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1317      8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1318    }, {
1319     74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1320     25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1321      6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1322    -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1323    }, {
1324      5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1325      7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1326     -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1327    -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1328    }, {
1329     35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1330     11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1331     46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1332    -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1333    }, {
1334    -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1335     -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1336     37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1337    -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1338    }, {
1339     29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1340     47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1341     23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1342    -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1343    }, {
1344    -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1345     29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1346     14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1347    -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1348    }, {
1349     -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1350     33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1351     63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1352     -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1353    }, {
1354    -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1355     15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1356     54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1357    -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1358    }, {
1359     80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1360     13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1361    -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1362    -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1363    }, {
1364     11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1365     -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1366    -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1367    -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1368    }, {
1369     40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1370      0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1371     28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1372     -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1373    }, {
1374    -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1375    -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1376     19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1377    -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1378    }, {
1379     34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1380     35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1381      5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1382     -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1383    }, {
1384    -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1385     17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1386     -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1387    -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1388    }, {
1389     -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1390     21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1391     45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1392     14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1393    }, {
1394    -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1395      3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1396     36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1397     -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1398    }
1399};
1400
1401const uint16_t ff_cb1_base[128]={
1402    19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1403    20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1404    20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1405    21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1406    19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1407    21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1408    19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1409    21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1410    19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1411    18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1412    17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1413    16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1414    20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1415    19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1416    17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1417    16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1418};
1419
1420const uint16_t ff_cb2_base[128]={
1421    12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1422    12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1423    11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1424    11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1425    10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1426    10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1427    10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1428    10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1429    14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1430    15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1431    13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1432    12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1433    12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1434    13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1435    12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1436    12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1437};
1438
1439const int16_t ff_energy_tab[32]={
1440        0,    16,    20,    25,    32,    41,    51,    65,
1441       81,   103,   129,   163,   205,   259,   326,   410,
1442      516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1443     3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1444};
1445
1446static const int16_t lpc_refl_cb1[64]={
1447    -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1448    -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1449    -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1450    -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1451    -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1452    -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1453      152,   447,   720,   982,  1229,  1456,  1682,  1916,
1454     2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1455};
1456
1457static const int16_t lpc_refl_cb2[32]={
1458    -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1459      267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1460     2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1461     3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1462};
1463
1464static const int16_t lpc_refl_cb3[32]={
1465    -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1466    -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1467     -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1468      683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1469};
1470
1471static const int16_t lpc_refl_cb4[16]={
1472    -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1473     1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1474};
1475
1476static const int16_t lpc_refl_cb5[16]={
1477    -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1478      -59,   201,   470,   759,  1077,  1457,  1908,  2495
1479};
1480
1481static const int16_t lpc_refl_cb6[8]={
1482    -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1483};
1484
1485static const int16_t lpc_refl_cb7[8]={
1486    -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1487};
1488
1489static const int16_t lpc_refl_cb8[8]={
1490    -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1491};
1492
1493static const int16_t lpc_refl_cb9[8]={
1494    -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1495};
1496
1497static const int16_t lpc_refl_cb10[4]={
1498     -617,   190,   802,  1483
1499};
1500
1501const int16_t * const ff_lpc_refl_cb[10]={
1502    lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1503    lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1504};
1505
1506static void ff_add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1,
1507                       const int8_t *s2, const int8_t *s3)
1508{
1509    int i;
1510    int v[3];
1511
1512    v[0] = 0;
1513    for (i=!skip_first; i<3; i++)
1514        v[i] = (ff_gain_val_tab[n][i] * m[i]) >> ff_gain_exp_tab[n];
1515
1516    if (v[0]) {
1517        for (i=0; i < BLOCKSIZE; i++)
1518            dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1519    } else {
1520        for (i=0; i < BLOCKSIZE; i++)
1521            dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
1522    }
1523}
1524
1525/**
1526 * Copy the last offset values of *source to *target. If those values are not
1527 * enough to fill the target buffer, fill it with another copy of those values.
1528 */
1529void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1530{
1531    source += BUFFERSIZE - offset;
1532
1533    memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1534    if (offset < BLOCKSIZE)
1535        memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1536}
1537
1538/**
1539 * Evaluate the reflection coefficients from the filter coefficients.
1540 *
1541 * @return 1 if one of the reflection coefficients is greater than
1542 *         4095, 0 if not.
1543 */
1544int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1545{
1546    int b, i, j;
1547    int buffer1[LPC_ORDER];
1548    int buffer2[LPC_ORDER];
1549    int *bp1 = buffer1;
1550    int *bp2 = buffer2;
1551
1552    for (i=0; i < LPC_ORDER; i++)
1553        buffer2[i] = coefs[i];
1554
1555    refl[LPC_ORDER-1] = bp2[LPC_ORDER-1];
1556
1557    if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) {
1558        av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1559        return 1;
1560    }
1561
1562    for (i = LPC_ORDER-2; i >= 0; i--) {
1563        b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1564
1565        if (!b)
1566            b = -2;
1567
1568        for (j=0; j <= i; j++)
1569            bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12;
1570
1571        if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1572            return 1;
1573
1574        refl[i] = bp1[i];
1575
1576        FFSWAP(int *, bp1, bp2);
1577    }
1578    return 0;
1579}
1580
1581/**
1582 * Evaluate the LPC filter coefficients from the reflection coefficients.
1583 * Does the inverse of the ff_eval_refl() function.
1584 */
1585void ff_eval_coefs(int *coefs, const int *refl)
1586{
1587    int buffer[LPC_ORDER];
1588    int *b1 = buffer;
1589    int *b2 = coefs;
1590    int i, j;
1591
1592    for (i=0; i < LPC_ORDER; i++) {
1593        b1[i] = refl[i] << 4;
1594
1595        for (j=0; j < i; j++)
1596            b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1597
1598        FFSWAP(int *, b1, b2);
1599    }
1600
1601    for (i=0; i < LPC_ORDER; i++)
1602        coefs[i] >>= 4;
1603}
1604
1605void ff_int_to_int16(int16_t *out, const int *inp)
1606{
1607    int i;
1608
1609    for (i = 0; i < LPC_ORDER; i++)
1610        *out++ = *inp++;
1611}
1612
1613/**
1614 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1615 * odd way to make the output identical to the binary decoder.
1616 */
1617int ff_t_sqrt(unsigned int x)
1618{
1619    int s = 2;
1620    while (x > 0xfff) {
1621        s++;
1622        x >>= 2;
1623    }
1624
1625    return ff_sqrt(x << 20) << s;
1626}
1627
1628unsigned int ff_rms(const int *data)
1629{
1630    int i;
1631    unsigned int res = 0x10000;
1632    int b = LPC_ORDER;
1633
1634    for (i = 0; i < LPC_ORDER; i++) {
1635        res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1636
1637        if (res == 0)
1638            return 0;
1639
1640        while (res <= 0x3fff) {
1641            b++;
1642            res <<= 2;
1643        }
1644    }
1645
1646    return ff_t_sqrt(res) >> b;
1647}
1648
1649int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1650{
1651    int work[LPC_ORDER];
1652    int b = NBLOCKS - a;
1653    int i;
1654
1655    // Interpolate block coefficients from the this frame's forth block and
1656    // last frame's forth block.
1657    for (i = 0; i < LPC_ORDER; i++)
1658        out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1659
1660    if (ff_eval_refl(work, out, ractx->avctx)) {
1661        // The interpolated coefficients are unstable, copy either new or old
1662        // coefficients.
1663        ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1664        return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1665    } else {
1666        return ff_rescale_rms(ff_rms(work), energy);
1667    }
1668}
1669
1670unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1671{
1672    return (rms * energy) >> 10;
1673}
1674
1675/** inverse root mean square */
1676int ff_irms(const int16_t *data)
1677{
1678    unsigned int i, sum = 0;
1679
1680    for (i=0; i < BLOCKSIZE; i++)
1681        sum += data[i] * data[i];
1682
1683    if (sum == 0)
1684        return 0; /* OOPS - division by zero */
1685
1686    return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1687}
1688
1689void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs,
1690                           int cba_idx, int cb1_idx, int cb2_idx,
1691                           int gval, int gain)
1692{
1693    uint16_t buffer_a[BLOCKSIZE];
1694    uint16_t *block;
1695    int m[3];
1696
1697    if (cba_idx) {
1698        cba_idx += BLOCKSIZE/2 - 1;
1699        ff_copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
1700        m[0] = (ff_irms(buffer_a) * gval) >> 12;
1701    } else {
1702        m[0] = 0;
1703    }
1704    m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1705    m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1706    memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1707            (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1708
1709    block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1710
1711    ff_add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
1712               ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1713
1714    memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
1715           LPC_ORDER*sizeof(*ractx->curr_sblock));
1716
1717    if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
1718                                    block, BLOCKSIZE, LPC_ORDER, 1, 0xfff))
1719        memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
1720}
1721