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