On Wed, Oct 07, 2020 at 03:18:44PM +0900, Michael Paquier wrote:
> About 0001, the new set of multipliers looks fine to me.  Even if this
> adds an extra item from 901 to 902 because this can be divided by 17
> in kwlist_d.h, I also don't think that this is really much bothering
> and.  As mentioned, this impacts none of the other tables that are much
> smaller in size, on top of coming back to normal once a new keyword
> will be added.  Being able to generate perfect hash functions for much
> larger sets is a nice property to have.  While on it, I also looked at
> the assembly code with gcc -O2 for keywords.c & co and I have not
> spotted any huge difference.  So I'd like to apply this first if there
> are no objections.

I looked at this one again today, and applied it.  I looked at what
MSVC compiler was able to do in terms of optimizations with
shift-and-add for multipliers, and it is by far not as good as gcc or
clang, applying imul for basically all the primes we could use for the
perfect hash generation.

> I have tested 0002 and 0003, that had better be merged together at the
> end, and I can see performance improvements with MSVC and gcc similar
> to what is being reported upthread, with 20~30% gains for simple
> data sample using IS NFC/NFKC.  That's cool.

For these two, I have merged both together and did some adjustments as
per the attached.  Not many tweaks, mainly some more comments for the
unicode header files as the number of structures generated gets
higher.  FWIW, with the addition of the two hash tables,
libpgcommon_srv.a grows from 1032600B to 1089240B, which looks like a
small price to pay for the ~30% performance gains with the quick
checks.
--
Michael
diff --git a/src/include/common/unicode_normprops_table.h b/src/include/common/unicode_normprops_table.h
index 93a2e55b75..efee19a3dc 100644
--- a/src/include/common/unicode_normprops_table.h
+++ b/src/include/common/unicode_normprops_table.h
@@ -3,7 +3,8 @@
 #include "common/unicode_norm.h"
 
 /*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint.  We use a bit field
+ * here to save space.
  */
 typedef struct
 {
@@ -11,6 +12,17 @@ typedef struct
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
 } pg_unicode_normprops;
 
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func	hash;
+	int		num_normprops;
+} unicode_norm_info;
+
 static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x0300, UNICODE_NORM_QC_MAYBE},
 	{0x0301, UNICODE_NORM_QC_MAYBE},
@@ -1245,6 +1257,343 @@ static const pg_unicode_normprops UnicodeNormProps_NFC_QC[] = {
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
 
+/* Perfect hash function for NFC_QC */
+static int
+NFC_QC_hash_func(const void *key)
+{
+	static const int16 h[2463] = {
+		     0,  -2717,      0,    221,   1293,    223,   1295,    225,
+		   226,    241,      0,    229,    230,    231,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -386,      0,      0,      0,      0,      0,      0,      0,
+		  -163,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  -246,   -175,   1260,      0,      0,      0,   -174,   -173,
+		     0,   -172,      0,      0,      0,      0,      0,      0,
+		  1049,      0,    300,    301,   1071,      0,   1071,      0,
+		  1071,   1071,   1057,      0,      0,      0,      0,   1061,
+		     0,  -1053,   1664,      0,   2956,      0,      0,    -13,
+		     0,      0,      0,      0,   2156,      0,      0,      0,
+		     0,      0,      0,      0,     71,      0,   1082,      0,
+		  1083,   1083,      0,   1084,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,    359,    360,    361,
+		 -1091,    363,   -762,   -130,   -129,   -128,   -127,   -126,
+		   137,   -124,   -708,   -707,   -706,   -120,   -185,   -705,
+		  -117,   -184,  -1307,   -114,   -113,   -112,   -111,      0,
+		   386,    387,    388,    389,    -90,    391,    171,    172,
+		   394,    -94,   -183,    397,    398,    399,    -98,   -225,
+		   402,  -1019,   -636,  -1019,   -225,    407,    408,    409,
+		   410,    411,    674,    413,   -171,   -170,   -169,    417,
+		   352,   -168,    420,    353,   -770,    423,    424,    425,
+		   426,    427,    428,  32767,    239,    239,    239,    239,
+		   239,    239,    239,    239,    239,    239,    239,    239,
+		   239,    239,  32767,  32767,    237,  32767,    236,  32767,
+		 32767,    234,    234,    234,    234,    617,    234,    234,
+		   234,  -2483,    234,  -1430,   1526,  -1430,   1527,     47,
+		    48,    471,    230,  32767,  32767,  32767,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		  -159,    227,    227,    227,    227,    227,    227,    227,
+		    64,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   227,    227,    227,    227,    227,    227,    227,    227,
+		   -19,     52,   1487,    227,    227,    227,     53,     54,
+		   227,     55,    227,    227,    227,    227,    227,    227,
+		  1276,    227,   -989,  32767,   1296,    225,   1296,    225,
+		  1296,   1296,   1282,    225,    225,    225,    225,   1286,
+		   225,   -828,   1889,    225,   3181,    225,    225,    212,
+		   225,    225,    225,    225,   2381,    225,    225,    225,
+		   225,    225,    225,    225,    296,    225,   1307,    225,
+		  1308,   1308,    225,   1309,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    225,    225,    225,
+		   225,    225,    225,    225,    225,    584,    585,    586,
+		  -866,    588,   -537,     95,     96,     97,     98,     99,
+		   362,    101,   -483,   -482,   -481,    105,     40,   -480,
+		   108,     41,  -1082,    111,    112,    113,    114,    225,
+		   611,    612,    613,    614,    135,    616,    396,    397,
+		   619,    131,     42,    622,    623,    624,    127,      0,
+		   627,   -794,   -411,   -794,      0,    632,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  -272,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,   -166,   -165,  32767,  32767,  32767,  32767,
+		  -164,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    397,  32767,    396,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    386,
+		     0,    386,    386,    386,    386,    386,    386,    386,
+		   223,    386,    386,    386,  32767,    385,    385,    385,
+		   385,    385,  32767,    384,  32767,    383,    383,  32767,
+		   382,    382,  32767,    381,    381,    381,    381,    381,
+		   135,    206,   1641,    381,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -160,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1148,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -257,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   -910,   -910,  32767,  32767,
+		     0,  32767,      0,  32767,      0,  32767,      0,  32767,
+		   147,  32767,      0,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    143,  32767,    144,  32767,    145,
+		 32767,    146,  32767,      0,  32767,    148,  32767,    149,
+		 32767,  32767,  32767,   -160,  32767,  32767,  32767,  32767,
+		 32767,  32767,     15,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   145,  32767,    144,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   -148,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2009,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,    135,   -918,  32767,
+		   151,  32767,  32767,      0,      1,      2,      3,      4,
+		   133,      5,      6,      7,      8,      9,     10,     11,
+		 32767,  32767,  -1248,  32767,     13,    154,    188,    188,
+		 32767,  32767,  32767,  32767,  32767,    155,     16,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1853,  -1054,     18,
+		 -1052,  -1051,  -1036,     22,  32767,    157,  32767,     28,
+		    23,   1077,    673,     25,  -2930,      0,  32767,  32767,
+		 32767,  32767,  32767,     27,  32767,    155,  32767,    154,
+		 32767,  32767,    -62,     28,    -42,     30,  -1051,     32,
+		 -1050,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     34,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    129,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    672,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,   -156,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -155,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		    73,  32767,  32767,  32767,  32767,     74,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    675,
+		 32767,  32767,  32767,  32767,  32767,     75,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    165,  32767,  32767,  32767,    166,    167,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    170,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    689,    690,    691,    692,    693,    694,    695,
+		   696,    697,    698,    699,    700,    701,    702,    703,
+		   704,    705,    706,    707,    708,    709,    710,    711,
+		   712,    713,    714,    715,    716,    717,    718,    719,
+		   720,    721,    722,   -304,   -303,   -302,   -301,   -300,
+		  -299,   -298,   -297,    930,   -295,   -294,   -293,   -292,
+		  -291,   -290,   -289,   -288,   -287,   -286,   -285,   -284,
+		  -283,   -282,   -281,   -280,   -279,   -278,   -277,   -276,
+		  -275,    753,    754,    755,    646,    757,   -712,  -1765,
+		   952,   -712,   2244,   -712,   2245,    765,    766,    767,
+		   768,    125,    770,    771,    772,    773,    774,    775,
+		   603,    777,    778,    779,    780,    781,    782,    783,
+		   784,   2011,    786,    787,    788,    789,    790,    791,
+		   792,    793,    794,    795,    796,    797,    798,    799,
+		   800,    801,    802,    803,    804,    805,    806,    603,
+		   603,    809,    603,    811,    603,    603,    814,    815,
+		   816,    817,    435,    819,    820,    821,   3539,    823,
+		   603,   -468,    603,   -468,    603,    603,    589,    831,
+		   603,    603,    603,    835,    836,    837,    838,    839,
+		   840,    841,    842,    843,    844,    845,    846,    847,
+		   848,    849,    850,    851,    852,   1239,    854,    855,
+		   856,    857,    858,    859,    860,   1024,    862,    863,
+		   864,    865,    866,    867,    868,    869,    870,    871,
+		   872,    873,    874,    875,    876,    877,    878,    879,
+		   880,    881,    882,    883,    884,   1131,   1061,   -373,
+		   888,    889,    890,   1065,   1065,    893,   1066,    895,
+		   896,    897,    898,    899,    900,   -148,    902,    603,
+		   603,   -166,    906,   -164,    908,   -162,   -161,   -146,
+		   912,    913,    914,    915,   -145,    917,   1971,   -745,
+		   920,  -2035,    922,    923,    937,    925,    926,    927,
+		   928,  -1227,    930,    931,    932,    933,    934,    935,
+		   936,    866,    938,   -143,    940,   -142,   -141,    943,
+		  -140,  32767,    945,    946,    947,    948,    949,    950,
+		   951,    952,    953,    954,    955,    956,    957,    958,
+		   959,    960,    961,    -65,    -64,    -63,    -62,    -61,
+		   -60,    -59,    -58,   1169,    -56,    -55,    -54,    -53,
+		   -52,    -51,    -50,    -49,    -48,    -47,    -46,    -45,
+		   -44,    -43,    -42,    -41,    -40,    -39,    -38,    -37,
+		   -36,    992,    993,    994,    885,    996,   -473,  -1526,
+		  1191,   -473,   2483,   -473,   2484,   1004,   1005,   1006,
+		  1007,    364,   1009,   1010,   1011,   1012,   1013,   1014,
+		   842,   1016,   1017,   1018,   1019,   1020,   1021,   1022,
+		  1023,   2250,   1025,   1026,   1027,   1028,   1029,   1030,
+		  1031,   1032,   1033,   1034,   1035,   1036,   1037,   1038,
+		  1039,   1040,   1041,   1042,   1043,   1044,   1045,    842,
+		   842,   1048,    842,   1050,    842,    842,   1053,   1054,
+		  1055,   1056,    674,   1058,   1059,   1060,   3778,   1062,
+		   842,   -229,    842,   -229,    842,    842,    828,   1070,
+		   842,    842,    842,   1074,   1075,   1076,   1077,   1078,
+		  1079,   1080,   1081,   1082,   1083,   1084,   1085,   1086,
+		  1087,   1088,   1089,   1090,   1091,   1478,   1093,   1094,
+		  1095,   1096,   1097,   1098,   1099,   1263,   1101,   1102,
+		  1103,   1104,   1105,   1106,   1107,   1108,   1109,   1110,
+		  1111,   1112,   1113,   1114,   1115,   1116,   1117,   1118,
+		  1119,   1120,   1121,   1122,   1123,   1370,   1300,   -134,
+		  1127,   1128,   1129,   1304,   1304,   1132,   1305,   1134,
+		  1135,   1136,   1137,   1138,   1139,     91,   1141,    842,
+		   842,     73,   1145,     75,   1147,     77,     78,     93,
+		  1151,   1152,   1153,   1154,     94,   1156,   2210,   -506,
+		  1159,  -1796,   1161,   1162,   1176,   1164,   1165,   1166,
+		  1167,   -988,   1169,   1170,   1171,   1172,   1173,   1174,
+		  1175,   1105,   1177,     96,   1179,     97,     98,   1182,
+		    99,   1184,   1185,   1186,   1187,   1188,   1189,   1190,
+		  1191,   1192,   1193,   1194,   1195,   1196,   1197,   1198,
+		  1199,   1200,      0,    174,    175,    176,    177,    178,
+		   179,    180,    181,   1408,    183,    184,    185,    186,
+		   187,    188,    189,    190,    191,    192,    193,    194,
+		   195,    196,    197,    198,    199,    200,    201,    202,
+		   203,      0,      0,    206,      0,    208,      0,      0,
+		   211,    212,    213,    214,   -168,    216,    217,    218,
+		  2936,    220,      0,  -1071,      0,  -1071,      0,      0,
+		   -14,    228,      0,      0,      0,    232,    233,    234,
+		   235,    236,    237,    238,    239,    240,    241,    242,
+		   243,    244,    245,    246,    247,    248,    249,    636,
+		   251,    252,    253,    254,    255,    256,    257,    421,
+		   259,    260,    261,    262,    263,    264,    265,    266,
+		   267,    268,    269,    270,    271,    272,    273,    274,
+		   275,    276,    277,    278,    279,    280,    281,    528,
+		   458,   -976,    285,    286,    287,    462,    462,    290,
+		   463,    292,    293,    294,    295,    296,    297,   -751,
+		   299,      0,      0,   -769,    303,   -767,    305,   -765,
+		  -764,   -749,    309,    310,    311,    312,   -748,    314,
+		  1368,  -1348,    317,  -2638,    319,    320,    334,    322,
+		   323,    324,    325,  -1830,    327,    328,    329,    330,
+		   331,    332,    333,    263,    335,   -746,    337,   -745,
+		  -744,    340,   -743,    342,    343,    344,    345,    346,
+		   347,    348,    349,    350,    351,    352,    353,    354,
+		   355,    356,    357,    358,      0,      0,      0,   1453,
+		     0,   1126,    495,    495,    495,    495,    495,    233,
+		   495,   1080,   1080,   1080,    495,    561,   1082,    495,
+		   563,   1687,    495,    495,    495,    495,    385,      0,
+		     0,      0,      0,    480,      0,    221,    221,      0,
+		   489,    579,      0,      0,      0,    498,    626,      0,
+		  1422,   1040,   1424,    631,      0,      0,      0,      0,
+		     0,   -262,      0,    585,    585,    585,      0,     66,
+		   587,      0,     68,   1192,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,    669,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    670,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    142,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    115,    116,    117,    118,    119,    120,
+		   121,    122,    123,    124,    125,    126,    127,    128,
+		   129,    130,    131,    132,    133,    134,    135,    136,
+		   137,    138,    139,    140,    141,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   -199,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,   1027,   1027,   1027,   1027,   1027,
+		  1027,   1027,   1027,      0,      0,      0,    110,      0,
+		  1470,   2524,   -192,   1473,  -1482,   1475,  -1481,      0,
+		     0,      0,      0,    644,      0,      0,      0,      0,
+		     0,      0,    173,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -1226,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    204,    205,      0,    207,      0,    209,    210,
+		     0,      0,      0,      0,    383,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 0;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 17 + c;
+	}
+	return h[a % 2463] + h[b % 2463];
+}
+
+/* Hash lookup information for NFC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFC_QC = {
+	UnicodeNormProps_NFC_QC,
+	NFC_QC_hash_func,
+	1231
+};
+
 static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x00A0, UNICODE_NORM_QC_NO},
 	{0x00A8, UNICODE_NORM_QC_NO},
@@ -6165,3 +6514,1262 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = {
 	{0x2FA1C, UNICODE_NORM_QC_NO},
 	{0x2FA1D, UNICODE_NORM_QC_NO},
 };
+
+/* Perfect hash function for NFKC_QC */
+static int
+NFKC_QC_hash_func(const void *key)
+{
+	static const int16 h[9837] = {
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,  -2472,
+		 -2472,  -2472,  -2472,  -2472,  -2472,  32767,  32767,  32767,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  -2475,
+		 -2475,  -2475,  -2475,  -2475,  -2475,  -2475,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    865,    865,    865,    865,    865,    865,    865,
+		   865,    865,    865,    865,  -2255,  32767,  -5207,  32767,
+		 -5207,    860,    860,    860,    860,    860,    860,    860,
+		   860,    860,   4250,    861,    861,    861,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		  3339,   3339,   3339,   3339,   3339,   3339,   3339,   3339,
+		 32767,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,   3338,   3338,   3338,   3338,   3338,   3338,   3338,
+		  3338,      9,     10,  32767,     11,     12,      0,  32767,
+		     0,   2913,   2914,   2915,   2916,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2917,  32767,   2918,   -100,
+		  2919,   2920,   2921,    840,    840,    840,   2922,      0,
+		     0,      0,      0,      0,   2206,      0,   2923,      0,
+		  2924,   2925,   2926,      0,      0,      0,  -2590,      0,
+		     0,      0,      0,      0,      0,      0,   2934,      0,
+		  2474,   2931,   2932,      0,      0,      0,      0,      0,
+		    14,    805,      0,      0,   2933,      0,   2934,      0,
+		  2935,   2936,      0,      0,      0,     16,     17,      0,
+		     0,      0,      0,      0,      0,      0,      0,     18,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   -790,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1675,      0,      0,     19,      0,  -1679,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -1694,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,     20,     21,     22,     23,     24,     25,
+		    26,     27,     28,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,     29,     30,     31,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    724,   2668,    724,   4350,  -2633,  -2633,
+		  2533,   2534,   2535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   2518,   2519,   2520,   1431,     45,     46,
+		 32767,  32767,     47,     48,     49,     50,     51,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -3011,     53,  -1125,  -3010,  -3010,
+		 32767,  -3334,  -1123,  -3011,     60,     61,     62,     63,
+		 32767,  32767,     64,  32767,     65,  32767,     66,     67,
+		 32767,  32767,  32767,  32767,  32767,  32767,   2268,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,     69,     70,
+		    71,     72,     73,     74,  32767,  32767,  32767,  32767,
+		    75,     76,  32767,     77,    281,  32767,  32767,  32767,
+		 32767,  32767,  32767,    811,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   1341,   1342,   1343,   1344,   1345,
+		  1346,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,     86,
+		 32767,  32767,  32767,  32767,  32767,   4550,  32767,  32767,
+		 32767,   1135,  32767,  32767,  32767,  32767,  32767,   1130,
+		  3016,  32767,   3017,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    677,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2858,   2859,    651,   2861,   -438,
+		  2863,   2864,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -5305,  -5305,  -5305,  32767,  -5306,
+		 -5306,  32767,  32767,  32767,   2871,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3022,   3023,    680,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -272,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4308,   4309,   4310,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4311,   4312,   4313,
+		  4314,   4315,   4316,   4317,   4318,   4319,   4320,   4321,
+		  4322,   4323,   4324,   4325,   4326,   4307,   4307,   4307,
+		  4307,   4307,   4307,   4307,   4307,   4307,   4336,   4337,
+		  4338,   4339,   4340,   4341,   4342,   4343,   4344,   4345,
+		  4346,   4347,   4348,   4349,   4350,   4351,   4352,   4353,
+		  4354,  32767,  32767,  32767,  32767,   4355,   4356,   4357,
+		  4358,   4359,   4360,   4361,   4362,   4363,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4364,   4365,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   2202,      0,      0,      0,     59,      0,
+		     0,     35,      0,      0,      0,   3549,      0,      0,
+		     0,      0,      0,   3394,      0,      0,   3399,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2012,
+		     0,      0,      0,      0,     87,   2022,      0,   7490,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  2255,      0,   2256,   2256,   2256,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  -1759,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   4767,      0,      0,   4772,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,   5977,      0,
+		   892,  32767,      0,  32767,  32767,      0,      0,  32767,
+		 32767,   2344,   4834,   4835,   4836,  32767,      0,   4840,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,  32767,      0,  32767,      0,      0,      0,  32767,
+		 32767,  32767,  32767,   3261,   3262,  32767,   3007,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    106,    107,    108,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    109,    110,    111,    112,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  -2344,
+		 -2344,      0,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -1642,   1469,  -1641,   1469,  -1640,   1469,
+		  1469,   1457,   1469,   1469,   1469,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -3359,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4103,
+		 -1478,      0,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,  -4254,  -2433,  -4254,  -4254,  -4254,  -3658,
+		 -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,  -4254,
+		 -4254,  -4254,      0,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,   -678,   -677,   -676,   -675,
+		  -674,   -673,   -672,  -4253,    314,  -4253,  -4253,  -4253,
+		 -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,  -4253,
+		 -4253,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1464,   1465,   1466,   1467,
+		  1468,   1469,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    827,    828,    829,  -2469,  -2469,   -260,      0,
+		     0,  32767,      0,  32767,      0,      0,  32767,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  3575,   3576,   3577,   3578,   3579,   3580,   3581,      0,
+		  4567,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,   2201,   4411,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -3338,      0,      0,      0,
+		     0,      0,      0,      0,  -3337,      0,  -3336,      0,
+		     0,      0,      0,  -3335,      0,      0,  -3334,  -3333,
+		 -3332,  -3331,      0,      0,  -3330,      0,      0,  32767,
+		     0,      0,     13,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3073,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -2556,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3074,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2355,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -488,   -488,   -488,   -302,  -3067,  -3067,
+		 -3067,  -3067,   -488,   -488,   -488,   -488,   2999,   -488,
+		  2999,   -488,   -488,   -488,  -3067,  -3067,  -3067,   -488,
+		  -488,  -3067,  -3067,  -3067,   -488,   -488,   -488,   2463,
+		  -488,   -488,   -488,   -301,   2465,   -488,   2466,   2467,
+		 -3600,   -493,  -3599,   -488,  -3598,   -488,  -3597,   -488,
+		  -488,   -500,   -488,   -488,   -488,   -488,   -488,   2470,
+		  2471,   2472,   -488,   -488,   -254,   -488,   -488,   -488,
+		  -488,   -488,   -104,   -488,   -488,   -488,   -102,   -101,
+		  -100,    -99,    -98,    -97,    -96,    -95,    -94,    -93,
+		   -92,   -488,   -488,   -488,   -488,   -488,   -488,   -488,
+		  -488,   -488,  -2194,  -2194,  -2194,  -2194,  -2194,  -2194,
+		 -2194,  -2194,  -2194,  -2194,   5211,   3269,   5213,   3269,
+		  6895,    -88,    -88,   5078,   5079,   5080,   1773,    -92,
+		   -92,   1773,   1773,   1773,   1773,   1773,   1773,   5072,
+		  5073,   2865,   5075,   1776,   5077,   5078,   1778,   1778,
+		  6942,   6943,   1778,   1778,   1778,   5086,   6952,   6953,
+		  5089,   5090,   5091,   5092,   5093,   5094,   5095,   5096,
+		  4007,   5098,   2333,   2334,   2335,   2336,   2337,  -3066,
+		 -3066,  -3066,   2341,  -3066,  -3066,   2344,   2345,   2346,
+		  5114,    317,   2349,    848,    849,    850,   2353,    852,
+		   853,    854,    855,    856,    857,    858,    859,    860,
+		   861,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		   692,    692,    692,    692,    692,    692,    692,    692,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   3093,   3094,   3095,   3096,   3097,   3098,   3099,
+		  3100,   3101,   3102,    901,   3104,   3105,   3106,   3048,
+		  3108,   3109,   3075,   3111,   3112,   3113,   -435,   3115,
+		  3116,   3117,   3118,   3119,   -274,   3121,   3122,   -276,
+		  3124,   3125,   3126,   3127,   3128,   3129,   3130,   3131,
+		  1120,   3133,   3134,   3135,   3136,   3050,   1116,   3139,
+		 -4350,   3141,   3142,   3143,   3144,   3145,   3146,   3147,
+		  3148,   3149,   3150,   3151,   3152,   3153,   3154,   3155,
+		  3156,    902,   3158,    903,    904,    905,   3162,   3163,
+		  3164,   3165,   3166,   3167,   3168,   3169,   3170,   3171,
+		  3172,   3173,   3174,   3175,   3176,   3177,  32767,   3178,
+		  3179,   3180,   3181,   3182,   3183,   4943,   3185,   3186,
+		  3187,   3188,   3189,   3190,   3191,   3192,   3193,   3194,
+		  3195,   3196,   3197,   3198,   3199,   3200,   3201,   3202,
+		  3203,   3204,   3205,   3206,   3207,   3208,   3209,   3210,
+		  3211,   3212,   3213,   3214,   3215,   3216,   3217,   3218,
+		  3219,   3220,   3221,   3222,   3223,  -1543,   3225,   3226,
+		 -1545,   3228,   3229,   3230,   3231,   3232,   3233,   3234,
+		  3235,   3236,   3237,   3238,   3239,   3240,   3241,   3242,
+		  3243,   3244,   3245,   3246,   3247,   3248,  -1251,  -2728,
+		  3250,  32767,  32767,   3251,    906,    907,   3252,   3253,
+		 32767,  32767,    910,  -1579,  -1579,  -1579,  32767,   3258,
+		 -1581,   3260,   3261,   3262,   3263,   3264,   3265,   3266,
+		  3267,   3268,   3269,  32767,   3270,  32767,   3271,   3272,
+		  3273,   3274,   3275,   3276,   3277,  32767,   3278,   3279,
+		  3280,   3281,   3282,   3283,   3284,   3285,   3286,   3287,
+		  3288,   3289,   3290,   3291,   3292,   3293,   3294,   3295,
+		  3296,   3297,   3298,   3299,   3300,   3301,   3302,   3303,
+		  3304,   3305,   3306,   3307,   3308,   3309,   3310,   3311,
+		  3312,   3313,   3314,   3315,   3316,   3317,   3318,   3319,
+		  3320,   3321,   3322,   3323,   3324,   3325,   3326,   3327,
+		  3328,   3329,   3330,   3331,   3332,   3333,   3334,   3335,
+		  3336,  32767,   3337,   3338,   3339,   3340,   3341,   3342,
+		     0,   3343,   3344,   3345,   3346,  32767,  32767,   3347,
+		  3348,   3349,   3350,   3351,   3352,   3353,   3354,  32767,
+		  3355,   3356,   3357,   3358,   3359,   3360,   3361,  32767,
+		  3362,   3363,   3364,   3365,   3366,   3367,   3368,   3369,
+		  3370,   3371,   3372,   3373,   3374,   3375,   3376,   3377,
+		  3378,   3379,   3380,   3381,   3382,   3383,   3384,   3385,
+		  3386,   3387,   3388,   3389,      0,   3390,   3391,   3392,
+		   915,    916,    917,    918,    919,    920,    921,    922,
+		   923,    924,    925,    926,    927,    928,    929,    930,
+		   931,    932,    933,    934,    935,    936,    937,    938,
+		   939,    940,    941,    942,    943,    944,    945,    946,
+		   947,    948,    949,    950,    951,    952,    953,    954,
+		   955,    956,    957,    958,    959,    960,    961,    962,
+		   963,    964,    965,    966,    967,    968,    969,    970,
+		   971,    972,    973,    974,    975,    976,   3449,   3450,
+		  3451,   3452,   3453,   3454,   3455,   3456,   3457,   3458,
+		  3459,   3460,   3461,   3462,   3463,   3464,   3465,   3466,
+		  3467,   3468,   3469,   3470,   3471,   3472,   3473,   3474,
+		  3475,   3476,   3477,   3478,   3479,   3480,   3481,   3482,
+		  3483,   3484,   3485,   3486,   3487,   3488,   3489,   3490,
+		  3491,   3492,   3493,   3494,   3495,   3496,   3497,   3498,
+		  3499,   3500,   3501,   3502,   3503,   3504,   3505,   3506,
+		  3507,   3508,   3509,   3510,   3511,   3512,   3513,   3514,
+		  3515,   3516,   3517,   3518,   3519,   3520,   3521,   3522,
+		  3523,   3524,   3525,   3526,   3527,   3528,   3529,   3530,
+		  3531,   3532,   3533,   3534,   3535,   3536,   3537,   3538,
+		  3539,   3540,   3541,   3542,   3543,   3544,   3545,   3546,
+		  3547,   3548,   3549,   3550,   3551,   3552,   3553,   3554,
+		  3555,   3556,   3557,   3558,   3559,   3560,   3561,   3562,
+		  3563,   3564,   3565,   3566,   3567,   3568,   3569,   3570,
+		  3571,   3572,   3573,   3574,   3575,   3576,   3577,   6056,
+		  6057,   6058,  32767,   3581,   3582,   3583,   3584,   3585,
+		  4157,   4158,   4159,   3589,   4162,  -4510,  -1558,  -1557,
+		 -1556,  -1742,  -4507,  -1553,  -4506,  -4506,   1562,  -1544,
+		  1563,  -1547,   1564,  -1545,   1565,  -1543,  -1542,  -1529,
+		 -1540,  -1539,  -1538,  -1537,  -1536,  -4493,  -4493,  -4493,
+		 -1532,  -1531,  -1764,  -1529,   3622,  -1528,  -1527,  -1526,
+		 -1909,  -1524,  -1523,  -1522,  -1907,  -1907,  -1907,  -1907,
+		 -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1907,  -1510,
+		 -1509,   1071,   1072,   1073,   1074,   1075,   1076,   1077,
+		  1078,   1079,   1080,   1081,   1082,   1083,   1084,   1085,
+		  1086,   1087,   1088,   1089,   1090,   3663,   3664,   3665,
+		  3666,   3667,   3668,   3669,   3670,   3671,   3672,   3673,
+		  3674,   1095,   1096,   1097,   1098,   1099,   1100,   1101,
+		  3682,   1103,   3684,   1105,   3686,   3687,   3688,   1109,
+		  1110,   1111,   3692,   1113,   1114,   1115,   1116,   1117,
+		  1118,   1119,   3700,   1121,   3702,   3703,   3704,   1125,
+		  1126,   1127,  -1809,  -1809,  -1809,  -1809,  -1809,  -1809,
+		  3720,   3721,   3722,   3717,   3718,   3719,   3720,   1140,
+		  1141,   1142,   1143,  -1802,   1145,   1146,   1147,   1148,
+		  3730,  -1797,   3732,   1152,   3734,   3735,   1155,   1156,
+		  3738,   3739,   3740,   3741,   3742,   3743,  -1785,  -1785,
+		 -1785,  -1779,  -1324,   1168,   1169,   1170,   1171,   1172,
+		  3752,   3753,   1175,   1176,   1177,    992,   3758,   3759,
+		  3760,   3761,   1183,   1184,   1185,   1186,  -2300,   1188,
+		 -2298,   1190,   1191,   1192,   3772,   3773,   3774,   1196,
+		  1197,   3777,   3778,   3779,   1201,   1202,   1203,  -1747,
+		  1205,   1206,   1207,   1021,  -1744,   1210,  -1743,  -1743,
+		  4325,   1219,   4326,   1216,   4327,   1218,   4328,   1220,
+		  1221,   1234,   1223,   1224,   1225,   1226,   1227,  -1730,
+		 -1730,  -1730,   1231,   1232,    999,   1234,   1235,   1236,
+		  1237,   1238,    855,   1240,   1241,   1242,    857,    857,
+		   857,    857,    857,    857,    857,    857,    857,    857,
+		   857,   1254,   1255,   1256,   1257,   1258,   1259,   1260,
+		  1261,   1262,   2969,   2970,   2971,   2972,   2973,   2974,
+		  2975,   2976,   2977,   2978,  -4426,  -2483,  -4426,  -2481,
+		 -6106,    878,    879,  -4286,  -4286,  -4286,   -978,    888,
+		   889,   -975,   -974,   -973,   -972,   -971,   -970,  -4268,
+		 -4268,  -2059,  -4268,   -968,  -4268,  -4268,   -967,   -966,
+		 -6129,  -6129,   -963,   -962,   -961,  -4268,  -6133,  -6133,
+		 -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,  -4268,
+		 -3178,  -4268,  -1502,  -1502,  -1502,  -1502,  -1502,   3902,
+		  3903,   3904,  -1502,   3906,   3907,  -1502,  -1502,  -1502,
+		 -4269,    529,  -1502,      0,      0,      0,  -1502,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    170,    171,    172,    173,    174,    175,    176,
+		   177,    178,    179,    180,    181,    182,    183,    184,
+		   185,    186,    187,    188,    189,    190,    191,    192,
+		   193,    194,    195,    196,    197,    198,    199,    200,
+		   201,    202,    203,    204,    205,    206,    207,    208,
+		   209,    210,    211,    212,    213,    214,    215,    216,
+		   217,    218,    219,  -3194,    221,    222,    223,    224,
+		 -1657,    226,    227,  -1657,    229,    230,  -1655,    555,
+		 -1655,    234,    235,    236,    732,    238,    239,    240,
+		   241,    242,    243,  -1655,    245,    246,    247,    248,
+		 -1655,    250,  -1655,    252,  -1655,  -1655,  -1655,  -1655,
+		 -1655,  -1655,    259,  -1655,  -1655,  -1655,  -1655,    264,
+		 -1655,    266,  -1655,    268,  -1655,  -3620,    271,    272,
+		 -1655,    274,    275,  -1655,    277,  -1655,  -1655,    280,
+		 -1655,    282,   5746,   5747,   5748,   5749,  -1655,    288,
+		 -1655,    290,  -3335,   3649,   3650,  -1515,  -1515,  -1515,
+		  1793,   3659,   3660,   1796,   1797,   1798,   1799,   1800,
+		  1801,  -1497,  -1497,    712,  -1497,   1803,  -1497,  -1497,
+		  1804,   1805,  -3358,  -3358,   1808,   1809,   1810,  -1497,
+		 -3362,  -3362,  -1497,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,  -1497,   -407,  -1497,  -1497,  -1497,  -1497,  -1497,
+		 -1497,   3667,   3668,  -1497,  -1497,  -1497,   1811,   3677,
+		  3678,  32767,   1814,  32767,   1815,  32767,  32767,   1816,
+		  1817,  32767,  32767,  32767,   1818,   1819,   1820,   1821,
+		 -3342,  -3342,   1824,   1825,   1826,   1827,   1828,   1829,
+		  1830,   1831,   1832,   1833,   1834,   1835,   1836,   1837,
+		  1838,   1839,   1840,   1841,   1842,   1843,   1844,   1845,
+		  1846,   1847,   1848,   1849,   1850,   1851,   1852,   1853,
+		  1854,   1855,   1856,   1857,   1858,   1859,   1860,   1861,
+		  1862,   1863,   1864,   1865,   1866,   1867,   1868,   1869,
+		  1870,   1871,   1872,   1873,   1874,   1875,   1876,  -1537,
+		  1878,   1879,   1880,   1881,      0,   1883,   1884,      0,
+		   529,      0,      0,   2210,      0,   1889,   1890,   1891,
+		  2387,   1893,   1894,   1895,   1896,   1897,   1898,      0,
+		  1900,   1901,   1902,   1903,      0,   1905,      0,   1907,
+		     0,      0,      0,      0,      0,      0,   1914,      0,
+		     0,      0,      0,   1919,      0,   1921,      0,   1923,
+		     0,  -1965,   1926,   1927,      0,   1929,   1930,      0,
+		  1932,      0,      0,   1935,      0,   1937,   7401,   7402,
+		  7403,   7404,      0,   1943,      0,   1945,   1946,      0,
+		  1948,      0,      0,   1951,   1952,   1953,   1954,      0,
+		  1956,   1957,   1958,   1959,   1960,   1961,   1962,      0,
+		  1964,   1965,   1966,   1967,      0,   1969,   1970,   1971,
+		  1972,      0,   1974,      0,   1976,   1977,   1978,   1979,
+		  1980,   1981,   1982,   1983,   1984,   1985,      0,   1987,
+		  1988,   1989,   1990,   1991,    566,    566,    566,   5141,
+		  5142,    566,    566,    566,    566,    566,    566,    566,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   8673,   5722,   5722,   5722,      0,   8676,
+		  5723,   8677,   8678,   2611,   5718,   2612,   5723,   2613,
+		  5723,   2614,   5723,   5723,   5711,   5723,   5723,   5723,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,    895,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,    151,   2776,   4254,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1821,      0,
+		     0,      0,    596,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -2856,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -2901,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -1025,  32767,  32767,  32767,
+		 32767,  -2910,  32767,  32767,  32767,  32767,    157,  32767,
+		 32767,  32767,  32767,    158,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2359,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    160,  32767,    161,    162,    163,    164,
+		   165,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   898,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1428,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1254,  32767,  32767,  32767,
+		 32767,   1250,  32767,  32767,  32767,  32767,   1246,  32767,
+		 32767,  32767,  32767,   1243,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1231,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1842,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  3177,   1235,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4323,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    174,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1830,   -112,   1832,   -112,   3514,  -3469,
+		 -3469,   1697,   1698,   1699,  -1608,  -3473,  -3473,  -1608,
+		 -1608,  -1608,  -1608,  -1608,  -1608,   1691,   1692,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -1623,  -1623,  -1623,   3541,   3542,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,  -1623,
+		 -1623,  -1623,  -1623,  -1623,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -766,   2253,   2254,   2255,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1531,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -173,   -173,   -173,   -173,   -173,
+		  -173,   -173,   -173,   -173,   -173,   -173,   -173,   3241,
+		  -173,   -173,   -173,   -173,   1709,   -173,   -173,   1712,
+		  -173,   -173,   1713,   -496,   1715,   -173,   -173,   -173,
+		  -668,   -173,   -173,   -173,   -173,   -173,   -173,   1726,
+		  -173,   -173,   -173,   -173,   1731,   -173,   1733,   -173,
+		  1735,   1736,   1737,   1738,   1739,   1740,   -173,   1742,
+		  1743,   1744,   1745,   -173,   1747,   -173,   1749,   -173,
+		  1751,   3717,   -173,   -173,   1755,   -173,   -173,   1758,
+		  -173,   1760,   1761,   -173,   1763,   -173,  -5636,  -5636,
+		 -5636,  -5636,   1769,   -173,   1771,   -173,   3453,  -3530,
+		 -3530,   1636,   1637,   1638,  -1669,  -3534,  -3534,  -1669,
+		 -1669,  -1669,  -1669,  -1669,  -1669,   1630,   1631,   -577,
+		  1633,  -1666,   1635,   1636,  -1664,  -1664,   3500,   3501,
+		 -1664,  -1664,  -1664,   1644,   3510,   3511,   1647,   1648,
+		  1649,   1650,   1651,   1652,   1653,   1654,    565,   1656,
+		  1657,   1658,   1659,   1660,   1661,  -3502,  -3502,   1664,
+		  1665,   1666,   1667,   1668,   1669,   1670,   1671,   1672,
+		  1673,   1674,   1675,   1676,   1677,   1678,   1679,   1680,
+		  1681,   1682,   1683,   1684,   1685,   1686,   1687,   1688,
+		  1689,   1690,   1691,   1692,   1693,   1694,   1695,   1696,
+		  1697,   1698,   1699,   1700,   1701,   1702,   1703,   1704,
+		  1705,   1706,   1707,   1708,   1709,   1710,   1711,   1712,
+		  1713,   1714,   1715,   1716,  -1697,   1718,   1719,   1720,
+		  1721,   -160,   1723,   1724,   -160,   1726,   1727,   -158,
+		  2052,   -158,   1731,   1732,   1733,   2229,   1735,   1736,
+		  1737,   1738,   1739,   1740,   -158,   1742,   1743,   1744,
+		  1745,   -158,   1747,   -158,   1749,   -158,   -158,   -158,
+		  -158,   -158,   -158,   1756,   -158,   -158,   -158,   -158,
+		  1761,   -158,   1763,   -158,   1765,   -158,  -2123,   1768,
+		  1769,   -158,   1771,   1772,   -158,   1774,   -158,   -158,
+		  1777,   -158,   1779,   7243,   7244,   7245,   7246,   -158,
+		  1785,   -158,   1787,  -1838,   5146,   5147,    -18,    -18,
+		   -18,   3290,   5156,   5157,   3293,   3294,   3295,   3296,
+		  3297,   3298,      0,      0,   2209,      0,   3300,      0,
+		     0,   3301,   3302,  -1861,  -1861,   3305,   3306,   3307,
+		     0,  -1865,  -1865,      0,      0,      0,      0,      0,
+		     0,      0,      0,   1090,      0,      0,      0,      0,
+		     0,      0,   5164,   5165,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   3414,      0,      0,      0,      0,   1882,      0,
+		     0,   1885,      0,      0,   1886,   -323,   1888,      0,
+		     0,      0,   -495,      0,      0,      0,      0,      0,
+		     0,   1899,      0,      0,      0,      0,   1904,      0,
+		  1906,      0,   1908,   1909,   1910,   1911,   1912,   1913,
+		     0,   1915,   1916,   1917,   1918,      0,   1920,      0,
+		  1922,      0,   1924,   3890,      0,      0,   1928,      0,
+		     0,   1931,      0,   1933,   1934,      0,   1936,      0,
+		 -5463,  -5463,  -5463,  -5463,   1942,      0,   1944,      0,
+		     0,   1947,      0,   1949,   1950,      0,      0,      0,
+		     0,   1955,      0,      0,      0,      0,      0,      0,
+		     0,   1963,      0,      0,      0,      0,   1968,      0,
+		     0,      0,      0,   1973,      0,   1975,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1986,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,    527,    527,    527,    527,      0,
+		   528,    528,    528,    528,    528,    528,    528,    528,
+		   528,    528,    528,   1998,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1999,   2000,   2001,   2002,   2003,  32767,  32767,  32767,
+		 32767,  32767,   2004,  32767,   2005,   2006,   2007,   2008,
+		  2009,   2010,   2011,   2012,   2013,   2014,   2015,   2016,
+		  2017,   2018,   2019,   2020,   2021,   2022,   2023,   2024,
+		  2025,   2026,   1200,   1200,  32767,   4498,   4499,   2291,
+		  2032,   2033,  32767,   2034,  32767,   2035,   2036,  32767,
+		  2037,   2038,  32767,   2039,   2040,   2041,   2042,   2043,
+		  2044,   2045,   2046,   2047,   2048,   2049,   2050,   2051,
+		  2052,   2053,   2054,   2055,   2056,   2057,   2058,   2059,
+		  2060,   2061,   2062,   2063,   2064,   2065,   2066,   2067,
+		  2068,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,  -1506,
+		  2076,  -2490,   2078,   2079,   2080,   2081,   2082,   2083,
+		  2084,   2085,   2086,   2087,   2088,   2089,   2090,   2091,
+		  2092,   2093,   2094,   2095,   -105,  -2314,   2098,   2099,
+		  2100,   2101,   2102,   2103,   2104,   2105,   2106,   2107,
+		  2108,   2109,   2110,   2111,   2112,   2113,   2114,   2115,
+		  2116,   2117,   2118,   2119,   2120,   5459,   2122,   2123,
+		  2124,   2125,   2126,   2127,   2128,   5466,   2130,   5467,
+		  2132,   2133,   2134,   2135,   5471,   2137,   2138,   5473,
+		  5473,   5473,   5473,   2143,   2144,   5475,   2146,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2147,   2148,   2149,   2150,   2151,   2152,   2153,   2154,
+		  2155,   2156,   2157,   2158,   2159,   2160,   2161,   2162,
+		  2163,   2164,   2165,   2166,   2167,   2168,   2169,   2170,
+		  2171,   2172,   2173,   2174,   2175,   2176,   2177,   2178,
+		  2179,   2180,   2181,   2182,   2183,   2184,   2185,   2186,
+		  2187,   2188,   2189,   2190,   2191,  32767,   -726,   2293,
+		  -725,   -725,   -725,   1357,   1358,   1359,   -722,   2201,
+		  2202,   2203,   2204,   2205,      0,   2207,   -715,   2209,
+		  -714,   -714,   -714,   2213,   2214,   2215,   4806,   2217,
+		  2218,   2219,   2220,   2221,   2222,   2223,   -710,   2225,
+		  -248,   -704,   -704,   2229,   2230,   2231,   2232,   2233,
+		  2220,   1430,   2236,   2237,   -695,   2239,   -694,   2241,
+		  -693,   -693,   2244,   2245,   2246,   2231,   2231,   2249,
+		  2250,   2251,   2252,   2253,   2254,   2255,   2256,   2239,
+		  2258,   2259,   2260,   2261,   2262,   2263,   2264,   2265,
+		  2266,   2267,   2268,   2269,   2270,   2271,   2272,   2273,
+		  2274,   2275,   2276,   2277,   2278,   2279,   2280,   2281,
+		  2282,   2283,   2284,   2285,   2286,   2287,   2288,   2289,
+		  2290,   2291,   2292,   2293,   3084,   2295,   2296,   2297,
+		  2298,   2299,   2300,   2301,   2302,   2303,   2304,   2305,
+		  2306,   2307,   3983,   2309,   2310,   2292,   2312,   3992,
+		  2314,   2315,   2316,   2317,   2318,   2319,   2320,   2321,
+		  2322,   2323,   2324,   2325,   2326,   2327,   2328,   4023,
+		  2330,   2331,   2332,   2333,   2334,   2335,   2336,   2337,
+		  2338,   2339,   2340,   2341,   2342,   2343,   2344,   2345,
+		  2346,   2347,   2348,   2349,   2350,   2351,   2352,   2353,
+		  2354,   2355,   2356,   2357,   2358,   2359,   2360,   2361,
+		  2362,   2363,   2364,   2365,   2366,   2367,   2368,   2369,
+		  2370,   2371,   2372,   2373,   2374,   2375,   2376,   2377,
+		  2378,   2379,   2360,   2360,   2360,   2360,   2360,   2360,
+		  2360,   2360,   2360,   2389,   2390,   2391,   2392,   2393,
+		  2394,   2395,   2396,   2397,   2398,   2399,   2400,   2401,
+		  2402,   2403,   2404,   2405,   2406,   2407,   2408,   2409,
+		  2410,   2411,   2412,   2413,   2414,   2415,   2416,   2417,
+		  2418,   2419,   2420,   2421,   2422,   2423,   2424,   2425,
+		  2426,   2427,   2428,   2429,   2430,   2431,   2432,   2433,
+		  2434,   2435,   2436,   2437,   2438,   2439,   2440,   2441,
+		  2442,   2443,   2444,   2445,   2446,   2447,  32767,   2448,
+		  2449,   2450,   2451,   2452,   2453,   2454,   2455,   2456,
+		  2457,   2458,   2459,   2460,   2461,   2462,   2463,   2464,
+		  2465,   2466,   2467,   2468,   2469,   2470,   2471,   2472,
+		  2473,   2474,   2475,   2476,   2477,   2478,   2479,   2480,
+		  2481,   2482,   2483,   2484,   2485,   2486,   2487,   2488,
+		  2489,   2490,   2491,   2492,   2493,   2494,   2495,   2496,
+		  2497,   2498,   2499,   2500,   2501,   2502,   2503,   2504,
+		  2505,   2506,   2507,   2508,   2509,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2510,
+		  2511,   2512,   2513,   3266,   3266,   3266,   3266,   2518,
+		  3267,   3267,   3267,   2522,   3268,   3268,   3268,   3268,
+		  3268,   3268,   3268,   6682,   3268,   3268,   3268,   2534,
+		  5151,   3269,   2537,   2538,   3271,   3271,   5157,   2948,
+		  5159,   2544,   2545,   3273,   2778,   3273,   2549,   3274,
+		  2551,   3275,   2553,   5175,   2555,   3277,   3277,   3277,
+		  5181,   2560,   5184,   3278,   5186,   2564,   5189,   5190,
+		  5191,   5192,   3279,   5194,   5195,   2572,   5198,  32767,
+		 32767,   3278,   5200,   3278,   2577,   2578,   2579,   2580,
+		  5210,   3282,   3282,   5213,   3282,   2586,   2587,   2588,
+		  2589,   2590,   2591,  -2175,  -2175,  -2175,   5230,   3288,
+		  5232,   3288,   6914,    -69,    -69,   5097,   5098,   5099,
+		  1792,    -73,    -73,   1792,   1792,   1792,   1792,   1792,
+		  1792,   5091,   5092,   2884,   5094,   1795,   5096,   5097,
+		  1797,   1797,   6961,   6962,   1797,   1797,   1797,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2578,   2578,   2578,   2578,   2578,
+		  2578,    872,    872,    872,    872,    872,    872,    872,
+		   872,    872,    872,   8277,   6335,   8279,   6335,   9961,
+		  2978,   2978,   8144,   8145,   8146,   4839,   2974,   2974,
+		  4839,   4839,   4839,   4839,   4839,   4839,   8138,   8139,
+		  5931,   8141,   4842,   8143,   8144,   4844,   4844,  10008,
+		 10009,   4844,   4844,   4844,   8152,  10018,  10019,   8155,
+		  8156,   8157,   8158,   8159,   8160,   8161,   8162,   7073,
+		  8164,   5399,   5400,   5401,   5402,   5403,      0,      0,
+		     0,   5407,      0,      0,   5410,   5411,   5412,   8180,
+		  3383,   5415,   3914,   3915,   3916,   5419,   3918,   3919,
+		  3920,   3921,   3922,   3923,   3924,   3925,   3926,   3927,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   3758,   3758,   3758,   3758,   3758,   3758,
+		  3758,   3758,   7172,   3758,   3758,   3758,   3758,   5640,
+		  3758,   3758,   5643,   3758,   3758,   5644,   3435,   5646,
+		  3758,   3758,   3758,   3263,   3758,   3758,   3758,   3758,
+		  3758,   3758,   5657,   3758,   3758,   3758,   3758,   5662,
+		  3758,   5664,   3758,   5666,   5667,   5668,   5669,   5670,
+		  5671,   3758,   5673,   5674,   5675,   5676,   3758,   5678,
+		  3758,   5680,   3758,   5682,   7648,   3758,   3758,   5686,
+		  3758,   3758,   5689,   3758,   5691,   5692,   3758,  -1707,
+		 -1707,  -1707,  -1707,  -1707,  -1707,   5698,   3756,   5700,
+		  3756,   7382,    399,    399,   5565,   5566,   5567,   2260,
+		   395,    395,   2260,   2260,   2260,   2260,   2260,   2260,
+		  5559,   5560,   3352,   5562,   2263,   5564,   5565,   2265,
+		  2265,   7429,   7430,   2265,   2265,   2265,   5573,   7439,
+		  7440,   5576,   5577,   5578,   5579,   5580,   5581,   5582,
+		  5583,   4494,   5585,   2820,   2821,   2822,   2823,   2824,
+		 -2579,  -2579,  -2579,   2828,  -2579,  -2579,   2831,   2832,
+		  2833,   5601,    804,   2836,   1335,   1336,   1337,   2840,
+		  1339,   1340,   1341,   1342,   1343,   1344,   1345,   1346,
+		  1347,   1348,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   1179,   1179,   1179,   1179,
+		  1179,   1179,   1179,   1179,   4593,   1179,   1179,   1179,
+		  1179,   3061,   1179,   1179,   3064,   1179,   1179,   3065,
+		   856,   3067,   1179,   1179,   1179,    684,   1179,   1179,
+		  1179,   1179,   1179,   1179,   3078,   1179,   1179,   1179,
+		  1179,   3083,   1179,   3085,   1179,   3087,   3088,   3089,
+		  3090,   3091,   3092,   1179,   3094,   3095,   3096,   3097,
+		  1179,   3099,   1179,   3101,   1179,   3103,   5069,   1179,
+		  1179,   3107,   1179,   1179,   3110,   1179,   3112,   3113,
+		  1179,   3115,   1179,  -4284,  -4284,  -4284,  -4284,   3121,
+		  1179,   3123,   1179,   4805,  -2178,  -2178,   2988,   2989,
+		  2990,   -317,  -2182,  -2182,   -317,   -317,   -317,   -317,
+		  -317,   -317,   2982,   2983,    775,   2985,   -314,   2987,
+		  2988,   -312,   -312,   4852,   4853,   -312,   -312,   -312,
+		  2996,   4862,   4863,   2999,   3000,   3001,   3002,   3003,
+		  3004,   3005,   3006,   1917,   3008,   3009,   3010,   3011,
+		  3012,   3013,  -2150,  -2150,   3016,   3017,   3018,   3019,
+		  3020,   3021,   3022,   3023,   3024,   3025,   3026,   3027,
+		  3028,   3029,   3030,   3031,   3032,   3033,   3034,   3035,
+		 32767,  32767,  32767,   3036,   3037,   3038,   3039,   3040,
+		  3041,  32767,  32767,   3042,   3043,   3044,   3045,   3046,
+		  3047,  32767,  32767,   3048,   3049,   3050,   3051,   3052,
+		  3053,  32767,  32767,   3054,   3055,   3056,  32767,  32767,
+		 32767,   -357,   3058,   3059,   3060,   3061,   1180,   3063,
+		     0,   1179,   3065,   3066,   1181,   3391,   1181,   3070,
+		     0,      0,      0,      0,  32767,      0,      0,  32767,
+		     0,  32767,      0,      0,  -4973,  32767,  32767,  -7368,
+		 -2202,  -2201,  -2200,  -5507,  -7372,  -7372,  -5507,  -5507,
+		 -5507,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,  32767,      0,
+		  -203,  -2234,   -732,   -732,   -732,  -2234,   -732,   -732,
+		 -2763,  -1261,  -1261,  -1261,  -2763,  -1261,  -1261,  -1261,
+		 -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1261,  -1091,
+		 -1090,  -1089,  -1088,  -1087,  32767,  32767,  -1086,  -1085,
+		 -1084,  -1083,  -1082,  -1081,  -1080,  -1079,  -1078,  -1077,
+		 -1076,  -1075,  32767,  -1074,  -1073,  -1072,  -1071,  -1070,
+		 -1069,  -1068,  -1067,  -1066,  -1065,  -1064,  -1063,  -1062,
+		 -1061,  -1060,  -1059,  -1058,  -1057,  -1056,  32767,  -1055,
+		 -1054,  -1053,  -1052,      0,  32767,  32767,  32767,  -1051,
+		 -1050,  -4463,  32767,  -1048,  32767,  -1047,  -2928,  -1045,
+		 -1044,  -2928,  -1042,  -1041,  -2926,   -716,  -2926,  -1037,
+		 -1036,  -1035,   -539,  -1033,  -1032,  -1031,  -1030,  -1029,
+		 -1028,  -2926,  -1026,  -1025,  -1024,  -1023,  -2926,  -1021,
+		 -2926,  -1019,  -2926,  -2926,  -2926,  -2926,  -2926,  -2926,
+		 -1012,  -2926,  -2926,  -2926,  -2926,  -1007,  -2926,  -1005,
+		 -2926,  -1003,  -2926,  -4891,  -1000,   -999,  -2926,   -997,
+		  -996,  -2926,   -994,  -2926,  -2926,   -991,   4475,   4476,
+		  4477,   4478,   4479,   4480,  -2924,   -981,  -2924,   -979,
+		 -4604,   2380,   2381,  -2784,  -2784,  -2784,    524,   2390,
+		  2391,    527,    528,    529,    530,    531,    532,  -2766,
+		 -2766,   -557,  -2766,    534,  -2766,  -2766,    535,    536,
+		 -4627,  -4627,    539,    540,    541,  -2766,  -4631,  -4631,
+		 -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,  -2766,
+		 -1676,  -2766,      0,      0,      0,      0,      0,   5404,
+		  5405,   5406,      0,   5408,   5409,      0,      0,      0,
+		 -2767,   2031,      0,   1502,   1502,   1502,      0,   1502,
+		  1502,   1502,   1502,   1502,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    224,    225,    226,  32767,    227,    228,    229,
+		   230,    231,    232,    233,    234,    235,    236,     67,
+		 32767,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,     66,     66,     66,     66,     66,
+		    66,     66,     66,  32767,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		    65,     65,     65,     65,     65,     65,     65,     65,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -271,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1940,     18,   1942,   3908,     18,     18,   1946,     18,
+		    18,   1949,     18,   1951,   1952,     18,   1954,     18,
+		 -5445,  -5445,  -5445,  -5445,   1960,     18,   1962,     18,
+		  3644,  -3339,  -3339,   1827,   1828,   1829,  -1478,  -3343,
+		 -3343,  -1478,  -1478,  -1478,  -1478,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   1340,   1341,
+		  1342,   1343,   1344,   1345,   1346,   1347,   1348,   1349,
+		 -2064,   1351,   1352,   1353,   1354,  32767,   1355,   1356,
+		 32767,      0,  32767,  32767,   1679,  32767,   1357,   1358,
+		  1359,   1855,   1361,   1362,   1363,   1364,   1365,   1366,
+		 32767,   1367,   1368,   1369,   1370,  32767,   1371,  32767,
+		  1372,  32767,  32767,  32767,  32767,  32767,  32767,   1373,
+		 32767,  32767,  32767,  32767,   1374,  32767,   1375,  32767,
+		  1376,  32767,  -2513,   1378,   1379,  32767,   1380,   1381,
+		 32767,   1382,  32767,  32767,   1383,  32767,   1384,  32767,
+		  6848,  32767,   6849,  32767,   1387,  32767,   1388,   1389,
+		 32767,   1390,  32767,  32767,   1391,   1392,   1393,   1394,
+		 32767,   1395,   1396,   1397,   1398,   1399,   1400,   1401,
+		 32767,   1402,   1403,   1404,   1405,  32767,   1406,   1407,
+		  1408,   1409,  32767,   1410,  32767,   1411,   1412,   1413,
+		  1414,   1415,   1416,   1417,   1418,   1419,   1420,  32767,
+		  1421,   1422,   1423,   1424,   1425,      0,      0,      0,
+		  4575,   4576,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   -571,   -571,
+		  -571,      0,   -572,   8101,   5150,   5150,   5150,   5337,
+		  8103,   5150,   8104,   8105,   2038,   5145,   2039,   5150,
+		  2040,   5150,   2041,   5150,   5150,   5138,   5150,   5150,
+		  5150,   5150,   5150,   8108,   8109,   8110,   5150,   5150,
+		  5384,   5150,      0,   5151,   5151,   5151,   5535,   5151,
+		  5151,   5151,   5537,   5538,   5539,   5540,   5541,   5542,
+		  5543,   5544,   5545,   5546,   5547,   5151,   5151,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,   2572,   2572,   2572,   2572,   2572,
+		  2572,   2572,   2572,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2580,
+		  2580,   2580,   2580,   2580,   2580,   2580,      0,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		     0,   2580,   2580,   2580,   2580,   2580,   2580,   2580,
+		     0,   2580,      0,      0,      0,   2580,   2580,   2580,
+		  5517,   5518,   5519,   5520,   5521,   5522,     -6,     -6,
+		    -6,      0,      0,      0,      0,   2581,   2581,   2581,
+		  2581,   5527,   2581,   2581,   2581,   2581,      0,   5528,
+		     0,   2581,      0,      0,   2581,   2581,      0,      0,
+		     0,      0,      0,      0,   5529,   5530,   5531,  32767,
+		 32767,   2579,   2579,   2579,   2579,   2579,      0,      0,
+		  2579,   2579,   2579,   2765,      0,      0,      0,      0,
+		  2579,   2579,   2579,   2579,   6066,   2579,   6066,   2579,
+		  2579,   2579,      0,      0,      0,   2579,   2579,      0,
+		     0,      0,   2579,   2579,   2579,   5530,   2579,   2579,
+		  2579,   2766,   5532,   2579,   5533,   5534,   -533,   2574,
+		  -532,   2579,   -531,   2579,   -530,   2579,   2579,   2567,
+		  2579,   2579,   2579,   2579,   2579,   5537,   5538,   5539,
+		  2579,   2579,   2813,   2579,   2579,   2579,   2579,   2579,
+		  2963,   2579,   2579,   2579,   2965,   2966,   2967,   2968,
+		  2969,   2970,   2971,   2972,   2973,   2974,   2975,   2579,
+		  2579,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,    331,  32767,    332,  -2580,  -2580,  -2580,
+		 -2580,      0,      0,      0,      0,      0,      0,      0,
+		 -2580,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,  -2580,      0,      0,      0,      0,      0,
+		     0,      0,  -2580,      0,  -2580,  -2580,  -2580,      0,
+		     0,      0,   2937,   2938,   2939,   2940,   2941,   2942,
+		 -2586,  -2586,  -2586,  -2580,  -2125,  -2581,  -2581,      0,
+		     0,      0,      0,   2946,      0,      0,      0,      0,
+		 -2581,   2947,  -2581,      0,  -2581,  -2581,      0,      0,
+		 -2581,  -2581,  -2581,  -2581,  -2581,  -2581,   2948,   2949,
+		  2950,   2945,   2491,      0,      0,      0,      0,      0,
+		 -2579,  -2579,      0,      0,      0,    186,  -2579,  -2579,
+		 -2579,  -2579,      0,      0,      0,      0,   3487,      0,
+		  3487,      0,      0,      0,  -2579,  -2579,  -2579,      0,
+		     0,  -2579,  -2579,  -2579,      0,      0,      0,   2951,
+		     0,      0,      0,    187,   2953,      0,   2954,   2955,
+		 -3112,     -5,  -3111,      0,  -3110,      0,  -3109,      0,
+		     0,    -12,      0,      0,      0,      0,      0,   2958,
+		  2959,   2960,      0,      0,    234,      0,      0,      0,
+		     0,      0,    384,      0,      0,      0,    386,    387,
+		   388,    389,    390,    391,    392,    393,    394,    395,
+		   396,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  -1706,  -1706,  -1706,      0,      0,      0,
+		     0,    385,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,    397,
+		   398,    399,    400,    401,    402,    403,    404,    405,
+		  2112,   2113,   2114,    409,    410,    411,    412,  32767,
+		   413,    414,    415,    416,    417,    418,    419,    420,
+		   421,    422,    423,    424,    425,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -1688,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,   -752,   -751,   -750,   -749,      0,   -748,   -747,
+		  -746,      0,   -745,   -744,   -743,   -742,   -741,   -740,
+		  -739,  -4152,   -737,   -736,   -735,      0,  -2616,   -733,
+		     0,      0,   -732,   -731,  -2616,   -406,  -2616,      0,
+		     0,   -727,   -231,   -725,      0,   -724,      0,   -723,
+		     0,  -2621,      0,   -721,   -720,   -719,  -2622,      0,
+		 -2623,   -716,  -2623,      0,  -2624,  -2624,  -2624,  -2624,
+		  -710,  -2624,  -2624,      0,  -2625,   -706,  -2625,   -704,
+		 -2625,   -702,      0,      0,      0,      0,  -2629,   -700,
+		  -699,  -2629,   -697,      0,      0,      0,      0,      0,
+		     0,   4767,   4768,   4769,  -2635,   -692,  -2635,   -690,
+		 -4315,   2669,   2670,  -2495,  -2495,  -2495,    813,   2679,
+		  2680,    816,    817,    818,    819,    820,    821,  -2477,
+		 -2477,   -268,  -2477,    823,  -2477,  -2477,    824,    825,
+		 -4338,  -4338,    828,    829,    830,  -2477,  -4342,  -4342,
+		 -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,  -2477,
+		 -1387,      0,      0,  32767,  32767,      0,      0,      0,
+		     0,      0,  -2486,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1756,   1757,   1758,
+		  1759,  -5645,  -3702,  -5645,  -3700,  -7325,   -341,   -340,
+		 -5505,  -5505,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    532,    533,
+		 32767,    534,    535,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -781,   1084,   1084,   1084,   1084,
+		  1084,   1084,   4383,   4384,   2176,   4386,   1087,   4388,
+		  4389,   1089,   1089,   6253,   6254,   1089,   1089,   1089,
+		  4397,   6263,   6264,   4400,   4401,   4402,   4403,   4404,
+		  4405,   4406,   4407,   3318,   4409,   4410,   4411,   4412,
+		  4413,   4414,   -749,   -749,   4417,   4418,   4419,   4420,
+		  4421,   4422,   4423,   4424,   4425,   4426,   4427,   4428,
+		  4429,   4430,   4431,   4432,   4433,   4434,   4435,   4436,
+		  4437,   4438,   4439,   4440,   4441,   4442,   4443,   4444,
+		  4445,   4446,   4447,   4448,   4449,   4450,   4451,   4452,
+		  4453,   4454,   4455,   4456,   4457,   4458,   4459,   4460,
+		  4461,   4462,   4463,   4464,   4465,   4466,   4467,   4468,
+		  4469,   1056,   4471,   4472,   4473,   4474,   2593,   4476,
+		  4477,   2593,   4479,   4480,   2595,   4805,   2595,   4484,
+		  4485,   4486,   4982,   4488,   4489,   4490,   4491,   4492,
+		  4493,   2595,   4495,   4496,   4497,   4498,   2595,   4500,
+		  2595,   4502,   2595,   2595,   2595,   2595,   2595,   2595,
+		  4509,   2595,   2595,   2595,   2595,   4514,   2595,   4516,
+		  2595,   4518,   2595,    630,   4521,   4522,   2595,   4524,
+		  4525,   2595,   4527,   2595,   2595,   4530,   2595,   4532,
+		  9996,   9997,   9998,   9999,   2595,   4538,   2595,   4540,
+		  4541,   2595,   4543,   2595,   2595,   4546,   4547,   4548,
+		  4549,   2595,   4551,   4552,   4553,   4554,   4555,   4556,
+		  4557,   2595,   4559,   4560,   4561,   4562,   2595,   4564,
+		  4565,   4566,   4567,   2595,   4569,   2595,   4571,   4572,
+		  4573,   4574,   4575,   4576,   4577,   4578,   4579,   4580,
+		  2595,   4582,   4583,   4584,   4585,   4586,   4587,   4588,
+		  4589,   4590,   4591,   4592,   4593,   4594,   4595,   4596,
+		  4597,   4598,   4599,   4600,   4601,   4602,   4603,   4604,
+		  4605,   4606,   4607,   4608,   4609,   4610,   4611,   4612,
+		  4613,   4614,   4615,   4089,   4090,   4091,   4092,   4620,
+		  4093,   4094,   4095,   4096,   4097,   4098,   4099,   4100,
+		  4101,   4102,   4103,   4104,   2765,   2765,   2765,   2765,
+		  2765,   2765,   2765,   2765,   2765,   2765,   6179,   2765,
+		  2765,   2765,   2765,   4647,   2765,   2765,   4650,   4122,
+		  4652,   4653,   2444,   4655,   2767,   2767,   2767,   2272,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4666,   2767,
+		  2767,   2767,   2767,   4671,   2767,   4673,   2767,   4675,
+		  4676,   4677,   4678,   4679,   4680,   2767,   4682,   4683,
+		  4684,   4685,   2767,   4687,   2767,   4689,   2767,   4691,
+		  6657,   2767,   2767,   4695,   2767,   2767,   4698,   2767,
+		  4700,   4701,   2767,   4703,   2767,  -2696,  -2696,  -2696,
+		 -2696,   4709,   2767,   4711,   2767,   2767,   4714,   2767,
+		  4716,   4717,   2767,   2767,   2767,   2767,   4722,   2767,
+		  2767,   2767,   2767,   2767,   2767,   2767,   4730,   2767,
+		  2767,   2767,   2767,   4735,   2767,   2767,   2767,   2767,
+		  4740,   2767,   4742,   2767,   2767,   2767,   2767,   2767,
+		  2767,   2767,   2767,   2767,   2767,   4753,   2767,   2767,
+		  2767,   2767,   2767,   4193,   4194,   4195,   -379,   -379,
+		  4198,   4199,   4200,   4201,   4202,   4203,   4204,   4771,
+		  4772,   4773,   4774,   4775,   4776,   4777,   4778,   4779,
+		  4780,  -3892,   -940,   -939,   -938,   4785,  -3890,   -936,
+		 -3889,  -3889,   2179,   -927,   2180,   -930,   2181,   -928,
+		  2182,   -926,   -925,   -912,   -923,   -922,   -921,   4803,
+		  4804,   4805,   4806,   4807,   4808,   4809,   4810,   4811,
+		  4812,   4813,   4814,   4815,   4816,   4817,   4818,   4819,
+		  3925,   4821,   4822,   4823,   4824,   4825,   4826,   4827,
+		  4828,   4829,   4830,   4831,   4832,   4833,   4834,   4835,
+		  4836,   4837,   4838,   4839,   4840,   4841,   4842,   4843,
+		  4844,   4845,   4846,   4847,   4848,   4849,   4850,   4851,
+		  4852,   4853,   4854,   4855,   4856,   4857,   4858,   4859,
+		  4860,   4710,   2086,    609,   4864,   4865,   4866,   4867,
+		  4868,   4869,   4870,   4871,   4872,   3052,   4874,   4875,
+		  4876,   4281,   4878,   4879,   4880,   4881,   4882,   4883,
+		  4884,   4885,   4886,   4887,    634,   4888,   4889,   4890,
+		  4891,   4892,   4893,   4894,   4895,   4896,   1322,   1322,
+		  1322,   1322,   1322,   1322,   1322,   4904,    338,   4906,
+		  4907,   4908,   4909,   4910,   4911,   4912,   4913,   4914,
+		  4915,   4916,   4917,    665,    666,    667,    668,    669,
+		   670,    671,    672,    673,    674,    675,    676,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,      0,      0,      0,   2478,  32767,   2477,
+		  2477,   2477,   2477,   2477,  32767,   2476,  32767,  32767,
+		 32767,   2473,   2473,   2473,   2473,   2473,   2473,   2473,
+		 32767,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,   2472,   2472,   2472,   2472,   2472,
+		  2472,   2472,   2472,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -2478,  -2478,  -2478,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 9837] + h[b % 9837];
+}
+
+/* Hash lookup information for NFKC_QC */
+static const unicode_norm_info UnicodeNormInfo_NFKC_QC = {
+	UnicodeNormProps_NFKC_QC,
+	NFKC_QC_hash_func,
+	4918
+};
diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl
index e8e5097c09..2da2824830 100644
--- a/src/common/unicode/generate-unicode_normprops_table.pl
+++ b/src/common/unicode/generate-unicode_normprops_table.pl
@@ -9,6 +9,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my %data;
 
 print
@@ -18,13 +22,25 @@ print <<EOS;
 #include "common/unicode_norm.h"
 
 /*
- * We use a bit field here to save space.
+ * Normalization quick check entry for codepoint.  We use a bit field
+ * here to save space.
  */
 typedef struct
 {
 	unsigned int codepoint:21;
 	signed int	quickcheck:4;	/* really UnicodeNormalizationQC */
-}			pg_unicode_normprops;
+} pg_unicode_normprops;
+
+/* Typedef for hash function on quick check table */
+typedef int (*qc_hash_func) (const void *key);
+
+/* Information for quick check lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_normprops *normprops;
+	qc_hash_func	hash;
+	int		num_normprops;
+} unicode_norm_info;
 EOS
 
 foreach my $line (<ARGV>)
@@ -66,6 +82,7 @@ foreach my $prop (sort keys %data)
 	  "static const pg_unicode_normprops UnicodeNormProps_${prop}[] = {\n";
 
 	my %subdata = %{ $data{$prop} };
+	my @cp_packed;
 	foreach my $cp (sort { $a <=> $b } keys %subdata)
 	{
 		my $qc;
@@ -82,7 +99,27 @@ foreach my $prop (sort keys %data)
 			die;
 		}
 		printf "\t{0x%04X, %s},\n", $cp, $qc;
+
+		# Save the bytes as a string in network order.
+		push @cp_packed, pack('N', $cp);
 	}
 
 	print "};\n";
+
+	# Emit the definition of the perfect hash function.
+	my $funcname = $prop . '_hash_func';
+	my $f        = PerfectHash::generate_hash_function(\@cp_packed, $funcname,
+		fixed_key_length => 4);
+	printf "\n/* Perfect hash function for %s */", $prop;
+	print "\nstatic $f\n";
+
+	# Emit the structure that wraps the hash lookup information into
+	# one variable.
+	printf "/* Hash lookup information for %s */", $prop;
+	printf "\nstatic const unicode_norm_info ";
+	printf "UnicodeNormInfo_%s = {\n", $prop;
+	printf "\tUnicodeNormProps_%s,\n", $prop;
+	printf "\t%s,\n",                  $funcname;
+	printf "\t%d\n",                   scalar @cp_packed;
+	printf "};\n";
 }
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ab5ce59345..5d951fc2e0 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -465,15 +465,32 @@ get_canonical_class(pg_wchar ch)
 		return entry->comb_class;
 }
 
-static int
-qc_compare(const void *p1, const void *p2)
+static const pg_unicode_normprops *
+qc_hash_lookup(pg_wchar ch, const unicode_norm_info * norminfo)
 {
-	uint32		v1,
-				v2;
+	int			h;
+	uint32		hashkey;
 
-	v1 = ((const pg_unicode_normprops *) p1)->codepoint;
-	v2 = ((const pg_unicode_normprops *) p2)->codepoint;
-	return (v1 - v2);
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = htonl(ch);
+	h = norminfo->hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= norminfo->num_normprops)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (ch != norminfo->normprops[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &norminfo->normprops[h];
 }
 
 /*
@@ -482,26 +499,15 @@ qc_compare(const void *p1, const void *p2)
 static UnicodeNormalizationQC
 qc_is_allowed(UnicodeNormalizationForm form, pg_wchar ch)
 {
-	pg_unicode_normprops key;
-	pg_unicode_normprops *found = NULL;
-
-	key.codepoint = ch;
+	const pg_unicode_normprops *found = NULL;
 
 	switch (form)
 	{
 		case UNICODE_NFC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFC_QC,
-							lengthof(UnicodeNormProps_NFC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFC_QC);
 			break;
 		case UNICODE_NFKC:
-			found = bsearch(&key,
-							UnicodeNormProps_NFKC_QC,
-							lengthof(UnicodeNormProps_NFKC_QC),
-							sizeof(pg_unicode_normprops),
-							qc_compare);
+			found = qc_hash_lookup(ch, &UnicodeNormInfo_NFKC_QC);
 			break;
 		default:
 			Assert(false);
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index bfe103f195..e629c18be2 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,6 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
+# This uses hash functions generated by PerfectHash.pm, whose format looks
+# worse with pgindent.
+src/include/common/unicode_normprops_table\.h$
+#
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
 # (but include files at the top level of the ecpg/test/ directory).
 src/interfaces/ecpg/test/.*/

Attachment: signature.asc
Description: PGP signature

Reply via email to