From ed51e0bfa6269df197773e03f14bd13f4a373331 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 15 Oct 2020 13:20:41 -0400
Subject: [PATCH v2 2/2] Speed up unicode recomposition.

Similar to decomposition, use a perfect hash function for speed.
The performance increase is much higher in this casebecause the
former implementation used linear search. This makes normalizing
to NFC and NFKC 50-75x faster in the backend, while adding only
6kB to the binary. While this is small, keep out of the frontend
since its use is not performance critical.
---
 .../unicode/generate-unicode_norm_table.pl    |  104 ++
 src/common/unicode_norm.c                     |   32 +-
 src/include/common/unicode_norm_table.h       | 1219 +++++++++++++++++
 3 files changed, 1353 insertions(+), 2 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 05eec2bf21..fda0198639 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -104,6 +104,7 @@ typedef struct
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -111,6 +112,13 @@ typedef struct
 	int		num_decomps;
 } pg_unicode_decompinfo;
 
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -129,6 +137,8 @@ HEADER
 my $decomp_index  = 0;
 my $decomp_string = "";
 my @dec_cp_packed;
+my $main_index = 0;
+my @rec_info;
 
 my $last_code = $characters[-1]->{code};
 foreach my $char (@characters)
@@ -190,6 +200,18 @@ foreach my $char (@characters)
 				}
 			}
 		}
+
+		# Save info for recomposeable codepoints.
+		# XXX This must match the DECOMPOSITION_NO_COMPOSE C macro above!
+		# See the inverse lookup in recompose_code() found in
+		# common/unicode_norm.c.
+		if (!($flags =~ /DECOMP_COMPAT/ || $flags =~ /DECOMP_NO_COMPOSE/))
+		{
+			push @rec_info, {code => $code,
+							 main_index => $main_index,
+							 first => $first_decomp,
+							 second => $decomp_elts[0]};
+		}
 	}
 
 	if ($decomp_size == 0)
@@ -228,6 +250,8 @@ foreach my $char (@characters)
 
 	print $OUTPUT "\t/* $comment */" if ($comment ne "");
 	print $OUTPUT "\n";
+
+	$main_index++;
 }
 print $OUTPUT "\n};\n\n";
 
@@ -259,4 +283,84 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 };
 HEADER
 
+# Find the lowest codepoint that decomposes to each recomposeable
+# code pair and create a mapping to it.
+my $recomp_string = "";
+my @rec_cp_packed;
+my %seenit;
+foreach my $rec (sort recomp_sort @rec_info)
+{
+	# The hashkey is a 64 bit integer containing the bytes from
+	# both codepoints.
+	my $hashkey = (hex($rec->{first}) << 32) | hex($rec->{second});
+	next if $seenit{$hashkey};
+
+	# Save the hash key bytes as a string in network order
+	push @rec_cp_packed, pack('Q>', $hashkey);
+
+	# Append inverse lookup element
+	$recomp_string .= sprintf "\t/* %s + %s -> %s */ %s,\n",
+		$rec->{first},
+		$rec->{second},
+		$rec->{code},
+		$rec->{main_index};
+
+	$seenit{$hashkey} = 1;
+}
+
+# Remove trailing comma and newline
+substr($recomp_string, -2) = "";
+
+# Emit the inverse lookup array containing indexes into UnicodeDecompMain
+my $num_recomps = scalar @rec_cp_packed;
+print $OUTPUT <<HEADER;
+/* inverse lookup array  */
+static const uint16 RecompInverseLookup[$num_recomps] =
+{
+$recomp_string
+};
+HEADER
+
+# Emit the definition of the recomp hash function.
+my $rec_funcname = 'Recomp_hash_func';
+my $rec_func        = PerfectHash::generate_hash_function(\@rec_cp_packed, $rec_funcname,
+	fixed_key_length => 8);
+print $OUTPUT "\n/* Perfect hash function for recomposition */\n";
+print $OUTPUT "static $rec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OUTPUT <<HEADER;
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	$rec_funcname,
+	$num_recomps
+};
+HEADER
+
 close $OUTPUT;
+
+sub recomp_sort
+{
+	my $a1 = hex($a->{first});
+	my $b1 = hex($b->{first});
+
+	my $a2 = hex($a->{second});
+	my $b2 = hex($b->{second});
+
+	# First sort by first code point
+	return -1 if $a1 < $b1;
+	return 1 if $a1 > $b1;
+
+	# Then the second
+	return -1 if $a2 < $b2;
+	return 1 if $a2 > $b2;
+
+	# Finally by index into UnicodeDecompMain
+	return -1 if $a->{main_index} < $b->{main_index};
+	return 1 if $a->{main_index} > $b->{main_index};
+
+	die "found duplicate entries";
+}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index ee12aa6789..0b0d6b51b9 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -226,7 +226,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 	}
 	else
 	{
-		int			i;
+		const pg_unicode_decomposition *entry;
 
 		/*
 		 * Do an inverse lookup of the decomposition tables to see if anything
@@ -234,9 +234,36 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 		 * sub-table of size two, because the start character has already been
 		 * recomposed partially.
 		 */
+#ifndef FRONTEND
+
+		int			h, inv_lookup_index;
+		uint64		hashkey;
+		pg_unicode_recompinfo recompinfo = UnicodeRecompInfo;
+
+		hashkey = pg_hton64(((uint64) start << 32) | (uint64) code);
+		h = recompinfo.hash(&hashkey);
+
+		/* An out-of-range result implies no match */
+		if (h < 0 || h >= recompinfo.num_recomps)
+			return false;
+
+		inv_lookup_index = recompinfo.inverse_lookup[h];
+		entry = &UnicodeDecompMain[inv_lookup_index];
+
+		if (start == UnicodeDecomp_codepoints[entry->dec_index] &&
+			code == UnicodeDecomp_codepoints[entry->dec_index + 1])
+		{
+			*result = entry->codepoint;
+			return true;
+		}
+
+#else
+
+		int			i;
+
 		for (i = 0; i < lengthof(UnicodeDecompMain); i++)
 		{
-			const pg_unicode_decomposition *entry = &UnicodeDecompMain[i];
+			entry = &UnicodeDecompMain[i];
 
 			if (DECOMPOSITION_SIZE(entry) != 2)
 				continue;
@@ -251,6 +278,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 				return true;
 			}
 		}
+#endif
 	}
 
 	return false;
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 25cf16f47e..aff5581d05 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -29,6 +29,7 @@ typedef struct
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -36,6 +37,13 @@ typedef struct
 	int		num_decomps;
 } pg_unicode_decompinfo;
 
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -10628,3 +10636,1214 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 	Decomp_hash_func,
 	6604
 };
+/* inverse lookup array  */
+static const uint16 RecompInverseLookup[941] =
+{
+	/* 003C + 0338 -> 226E */ 1823,
+	/* 003D + 0338 -> 2260 */ 1820,
+	/* 003E + 0338 -> 226F */ 1824,
+	/* 0041 + 0300 -> 00C0 */ 14,
+	/* 0041 + 0301 -> 00C1 */ 15,
+	/* 0041 + 0302 -> 00C2 */ 16,
+	/* 0041 + 0303 -> 00C3 */ 17,
+	/* 0041 + 0304 -> 0100 */ 67,
+	/* 0041 + 0306 -> 0102 */ 69,
+	/* 0041 + 0307 -> 0226 */ 270,
+	/* 0041 + 0308 -> 00C4 */ 18,
+	/* 0041 + 0309 -> 1EA2 */ 1278,
+	/* 0041 + 030A -> 00C5 */ 19,
+	/* 0041 + 030C -> 01CD */ 194,
+	/* 0041 + 030F -> 0200 */ 240,
+	/* 0041 + 0311 -> 0202 */ 242,
+	/* 0041 + 0323 -> 1EA0 */ 1276,
+	/* 0041 + 0325 -> 1E00 */ 1120,
+	/* 0041 + 0328 -> 0104 */ 71,
+	/* 0042 + 0307 -> 1E02 */ 1122,
+	/* 0042 + 0323 -> 1E04 */ 1124,
+	/* 0042 + 0331 -> 1E06 */ 1126,
+	/* 0043 + 0301 -> 0106 */ 73,
+	/* 0043 + 0302 -> 0108 */ 75,
+	/* 0043 + 0307 -> 010A */ 77,
+	/* 0043 + 030C -> 010C */ 79,
+	/* 0043 + 0327 -> 00C7 */ 20,
+	/* 0044 + 0307 -> 1E0A */ 1130,
+	/* 0044 + 030C -> 010E */ 81,
+	/* 0044 + 0323 -> 1E0C */ 1132,
+	/* 0044 + 0327 -> 1E10 */ 1136,
+	/* 0044 + 032D -> 1E12 */ 1138,
+	/* 0044 + 0331 -> 1E0E */ 1134,
+	/* 0045 + 0300 -> 00C8 */ 21,
+	/* 0045 + 0301 -> 00C9 */ 22,
+	/* 0045 + 0302 -> 00CA */ 23,
+	/* 0045 + 0303 -> 1EBC */ 1304,
+	/* 0045 + 0304 -> 0112 */ 83,
+	/* 0045 + 0306 -> 0114 */ 85,
+	/* 0045 + 0307 -> 0116 */ 87,
+	/* 0045 + 0308 -> 00CB */ 24,
+	/* 0045 + 0309 -> 1EBA */ 1302,
+	/* 0045 + 030C -> 011A */ 91,
+	/* 0045 + 030F -> 0204 */ 244,
+	/* 0045 + 0311 -> 0206 */ 246,
+	/* 0045 + 0323 -> 1EB8 */ 1300,
+	/* 0045 + 0327 -> 0228 */ 272,
+	/* 0045 + 0328 -> 0118 */ 89,
+	/* 0045 + 032D -> 1E18 */ 1144,
+	/* 0045 + 0330 -> 1E1A */ 1146,
+	/* 0046 + 0307 -> 1E1E */ 1150,
+	/* 0047 + 0301 -> 01F4 */ 230,
+	/* 0047 + 0302 -> 011C */ 93,
+	/* 0047 + 0304 -> 1E20 */ 1152,
+	/* 0047 + 0306 -> 011E */ 95,
+	/* 0047 + 0307 -> 0120 */ 97,
+	/* 0047 + 030C -> 01E6 */ 216,
+	/* 0047 + 0327 -> 0122 */ 99,
+	/* 0048 + 0302 -> 0124 */ 101,
+	/* 0048 + 0307 -> 1E22 */ 1154,
+	/* 0048 + 0308 -> 1E26 */ 1158,
+	/* 0048 + 030C -> 021E */ 268,
+	/* 0048 + 0323 -> 1E24 */ 1156,
+	/* 0048 + 0327 -> 1E28 */ 1160,
+	/* 0048 + 032E -> 1E2A */ 1162,
+	/* 0049 + 0300 -> 00CC */ 25,
+	/* 0049 + 0301 -> 00CD */ 26,
+	/* 0049 + 0302 -> 00CE */ 27,
+	/* 0049 + 0303 -> 0128 */ 103,
+	/* 0049 + 0304 -> 012A */ 105,
+	/* 0049 + 0306 -> 012C */ 107,
+	/* 0049 + 0307 -> 0130 */ 111,
+	/* 0049 + 0308 -> 00CF */ 28,
+	/* 0049 + 0309 -> 1EC8 */ 1316,
+	/* 0049 + 030C -> 01CF */ 196,
+	/* 0049 + 030F -> 0208 */ 248,
+	/* 0049 + 0311 -> 020A */ 250,
+	/* 0049 + 0323 -> 1ECA */ 1318,
+	/* 0049 + 0328 -> 012E */ 109,
+	/* 0049 + 0330 -> 1E2C */ 1164,
+	/* 004A + 0302 -> 0134 */ 114,
+	/* 004B + 0301 -> 1E30 */ 1168,
+	/* 004B + 030C -> 01E8 */ 218,
+	/* 004B + 0323 -> 1E32 */ 1170,
+	/* 004B + 0327 -> 0136 */ 116,
+	/* 004B + 0331 -> 1E34 */ 1172,
+	/* 004C + 0301 -> 0139 */ 118,
+	/* 004C + 030C -> 013D */ 122,
+	/* 004C + 0323 -> 1E36 */ 1174,
+	/* 004C + 0327 -> 013B */ 120,
+	/* 004C + 032D -> 1E3C */ 1180,
+	/* 004C + 0331 -> 1E3A */ 1178,
+	/* 004D + 0301 -> 1E3E */ 1182,
+	/* 004D + 0307 -> 1E40 */ 1184,
+	/* 004D + 0323 -> 1E42 */ 1186,
+	/* 004E + 0300 -> 01F8 */ 232,
+	/* 004E + 0301 -> 0143 */ 126,
+	/* 004E + 0303 -> 00D1 */ 29,
+	/* 004E + 0307 -> 1E44 */ 1188,
+	/* 004E + 030C -> 0147 */ 130,
+	/* 004E + 0323 -> 1E46 */ 1190,
+	/* 004E + 0327 -> 0145 */ 128,
+	/* 004E + 032D -> 1E4A */ 1194,
+	/* 004E + 0331 -> 1E48 */ 1192,
+	/* 004F + 0300 -> 00D2 */ 30,
+	/* 004F + 0301 -> 00D3 */ 31,
+	/* 004F + 0302 -> 00D4 */ 32,
+	/* 004F + 0303 -> 00D5 */ 33,
+	/* 004F + 0304 -> 014C */ 133,
+	/* 004F + 0306 -> 014E */ 135,
+	/* 004F + 0307 -> 022E */ 278,
+	/* 004F + 0308 -> 00D6 */ 34,
+	/* 004F + 0309 -> 1ECE */ 1322,
+	/* 004F + 030B -> 0150 */ 137,
+	/* 004F + 030C -> 01D1 */ 198,
+	/* 004F + 030F -> 020C */ 252,
+	/* 004F + 0311 -> 020E */ 254,
+	/* 004F + 031B -> 01A0 */ 181,
+	/* 004F + 0323 -> 1ECC */ 1320,
+	/* 004F + 0328 -> 01EA */ 220,
+	/* 0050 + 0301 -> 1E54 */ 1204,
+	/* 0050 + 0307 -> 1E56 */ 1206,
+	/* 0052 + 0301 -> 0154 */ 139,
+	/* 0052 + 0307 -> 1E58 */ 1208,
+	/* 0052 + 030C -> 0158 */ 143,
+	/* 0052 + 030F -> 0210 */ 256,
+	/* 0052 + 0311 -> 0212 */ 258,
+	/* 0052 + 0323 -> 1E5A */ 1210,
+	/* 0052 + 0327 -> 0156 */ 141,
+	/* 0052 + 0331 -> 1E5E */ 1214,
+	/* 0053 + 0301 -> 015A */ 145,
+	/* 0053 + 0302 -> 015C */ 147,
+	/* 0053 + 0307 -> 1E60 */ 1216,
+	/* 0053 + 030C -> 0160 */ 151,
+	/* 0053 + 0323 -> 1E62 */ 1218,
+	/* 0053 + 0326 -> 0218 */ 264,
+	/* 0053 + 0327 -> 015E */ 149,
+	/* 0054 + 0307 -> 1E6A */ 1226,
+	/* 0054 + 030C -> 0164 */ 155,
+	/* 0054 + 0323 -> 1E6C */ 1228,
+	/* 0054 + 0326 -> 021A */ 266,
+	/* 0054 + 0327 -> 0162 */ 153,
+	/* 0054 + 032D -> 1E70 */ 1232,
+	/* 0054 + 0331 -> 1E6E */ 1230,
+	/* 0055 + 0300 -> 00D9 */ 35,
+	/* 0055 + 0301 -> 00DA */ 36,
+	/* 0055 + 0302 -> 00DB */ 37,
+	/* 0055 + 0303 -> 0168 */ 157,
+	/* 0055 + 0304 -> 016A */ 159,
+	/* 0055 + 0306 -> 016C */ 161,
+	/* 0055 + 0308 -> 00DC */ 38,
+	/* 0055 + 0309 -> 1EE6 */ 1346,
+	/* 0055 + 030A -> 016E */ 163,
+	/* 0055 + 030B -> 0170 */ 165,
+	/* 0055 + 030C -> 01D3 */ 200,
+	/* 0055 + 030F -> 0214 */ 260,
+	/* 0055 + 0311 -> 0216 */ 262,
+	/* 0055 + 031B -> 01AF */ 183,
+	/* 0055 + 0323 -> 1EE4 */ 1344,
+	/* 0055 + 0324 -> 1E72 */ 1234,
+	/* 0055 + 0328 -> 0172 */ 167,
+	/* 0055 + 032D -> 1E76 */ 1238,
+	/* 0055 + 0330 -> 1E74 */ 1236,
+	/* 0056 + 0303 -> 1E7C */ 1244,
+	/* 0056 + 0323 -> 1E7E */ 1246,
+	/* 0057 + 0300 -> 1E80 */ 1248,
+	/* 0057 + 0301 -> 1E82 */ 1250,
+	/* 0057 + 0302 -> 0174 */ 169,
+	/* 0057 + 0307 -> 1E86 */ 1254,
+	/* 0057 + 0308 -> 1E84 */ 1252,
+	/* 0057 + 0323 -> 1E88 */ 1256,
+	/* 0058 + 0307 -> 1E8A */ 1258,
+	/* 0058 + 0308 -> 1E8C */ 1260,
+	/* 0059 + 0300 -> 1EF2 */ 1358,
+	/* 0059 + 0301 -> 00DD */ 39,
+	/* 0059 + 0302 -> 0176 */ 171,
+	/* 0059 + 0303 -> 1EF8 */ 1364,
+	/* 0059 + 0304 -> 0232 */ 282,
+	/* 0059 + 0307 -> 1E8E */ 1262,
+	/* 0059 + 0308 -> 0178 */ 173,
+	/* 0059 + 0309 -> 1EF6 */ 1362,
+	/* 0059 + 0323 -> 1EF4 */ 1360,
+	/* 005A + 0301 -> 0179 */ 174,
+	/* 005A + 0302 -> 1E90 */ 1264,
+	/* 005A + 0307 -> 017B */ 176,
+	/* 005A + 030C -> 017D */ 178,
+	/* 005A + 0323 -> 1E92 */ 1266,
+	/* 005A + 0331 -> 1E94 */ 1268,
+	/* 0061 + 0300 -> 00E0 */ 40,
+	/* 0061 + 0301 -> 00E1 */ 41,
+	/* 0061 + 0302 -> 00E2 */ 42,
+	/* 0061 + 0303 -> 00E3 */ 43,
+	/* 0061 + 0304 -> 0101 */ 68,
+	/* 0061 + 0306 -> 0103 */ 70,
+	/* 0061 + 0307 -> 0227 */ 271,
+	/* 0061 + 0308 -> 00E4 */ 44,
+	/* 0061 + 0309 -> 1EA3 */ 1279,
+	/* 0061 + 030A -> 00E5 */ 45,
+	/* 0061 + 030C -> 01CE */ 195,
+	/* 0061 + 030F -> 0201 */ 241,
+	/* 0061 + 0311 -> 0203 */ 243,
+	/* 0061 + 0323 -> 1EA1 */ 1277,
+	/* 0061 + 0325 -> 1E01 */ 1121,
+	/* 0061 + 0328 -> 0105 */ 72,
+	/* 0062 + 0307 -> 1E03 */ 1123,
+	/* 0062 + 0323 -> 1E05 */ 1125,
+	/* 0062 + 0331 -> 1E07 */ 1127,
+	/* 0063 + 0301 -> 0107 */ 74,
+	/* 0063 + 0302 -> 0109 */ 76,
+	/* 0063 + 0307 -> 010B */ 78,
+	/* 0063 + 030C -> 010D */ 80,
+	/* 0063 + 0327 -> 00E7 */ 46,
+	/* 0064 + 0307 -> 1E0B */ 1131,
+	/* 0064 + 030C -> 010F */ 82,
+	/* 0064 + 0323 -> 1E0D */ 1133,
+	/* 0064 + 0327 -> 1E11 */ 1137,
+	/* 0064 + 032D -> 1E13 */ 1139,
+	/* 0064 + 0331 -> 1E0F */ 1135,
+	/* 0065 + 0300 -> 00E8 */ 47,
+	/* 0065 + 0301 -> 00E9 */ 48,
+	/* 0065 + 0302 -> 00EA */ 49,
+	/* 0065 + 0303 -> 1EBD */ 1305,
+	/* 0065 + 0304 -> 0113 */ 84,
+	/* 0065 + 0306 -> 0115 */ 86,
+	/* 0065 + 0307 -> 0117 */ 88,
+	/* 0065 + 0308 -> 00EB */ 50,
+	/* 0065 + 0309 -> 1EBB */ 1303,
+	/* 0065 + 030C -> 011B */ 92,
+	/* 0065 + 030F -> 0205 */ 245,
+	/* 0065 + 0311 -> 0207 */ 247,
+	/* 0065 + 0323 -> 1EB9 */ 1301,
+	/* 0065 + 0327 -> 0229 */ 273,
+	/* 0065 + 0328 -> 0119 */ 90,
+	/* 0065 + 032D -> 1E19 */ 1145,
+	/* 0065 + 0330 -> 1E1B */ 1147,
+	/* 0066 + 0307 -> 1E1F */ 1151,
+	/* 0067 + 0301 -> 01F5 */ 231,
+	/* 0067 + 0302 -> 011D */ 94,
+	/* 0067 + 0304 -> 1E21 */ 1153,
+	/* 0067 + 0306 -> 011F */ 96,
+	/* 0067 + 0307 -> 0121 */ 98,
+	/* 0067 + 030C -> 01E7 */ 217,
+	/* 0067 + 0327 -> 0123 */ 100,
+	/* 0068 + 0302 -> 0125 */ 102,
+	/* 0068 + 0307 -> 1E23 */ 1155,
+	/* 0068 + 0308 -> 1E27 */ 1159,
+	/* 0068 + 030C -> 021F */ 269,
+	/* 0068 + 0323 -> 1E25 */ 1157,
+	/* 0068 + 0327 -> 1E29 */ 1161,
+	/* 0068 + 032E -> 1E2B */ 1163,
+	/* 0068 + 0331 -> 1E96 */ 1270,
+	/* 0069 + 0300 -> 00EC */ 51,
+	/* 0069 + 0301 -> 00ED */ 52,
+	/* 0069 + 0302 -> 00EE */ 53,
+	/* 0069 + 0303 -> 0129 */ 104,
+	/* 0069 + 0304 -> 012B */ 106,
+	/* 0069 + 0306 -> 012D */ 108,
+	/* 0069 + 0308 -> 00EF */ 54,
+	/* 0069 + 0309 -> 1EC9 */ 1317,
+	/* 0069 + 030C -> 01D0 */ 197,
+	/* 0069 + 030F -> 0209 */ 249,
+	/* 0069 + 0311 -> 020B */ 251,
+	/* 0069 + 0323 -> 1ECB */ 1319,
+	/* 0069 + 0328 -> 012F */ 110,
+	/* 0069 + 0330 -> 1E2D */ 1165,
+	/* 006A + 0302 -> 0135 */ 115,
+	/* 006A + 030C -> 01F0 */ 226,
+	/* 006B + 0301 -> 1E31 */ 1169,
+	/* 006B + 030C -> 01E9 */ 219,
+	/* 006B + 0323 -> 1E33 */ 1171,
+	/* 006B + 0327 -> 0137 */ 117,
+	/* 006B + 0331 -> 1E35 */ 1173,
+	/* 006C + 0301 -> 013A */ 119,
+	/* 006C + 030C -> 013E */ 123,
+	/* 006C + 0323 -> 1E37 */ 1175,
+	/* 006C + 0327 -> 013C */ 121,
+	/* 006C + 032D -> 1E3D */ 1181,
+	/* 006C + 0331 -> 1E3B */ 1179,
+	/* 006D + 0301 -> 1E3F */ 1183,
+	/* 006D + 0307 -> 1E41 */ 1185,
+	/* 006D + 0323 -> 1E43 */ 1187,
+	/* 006E + 0300 -> 01F9 */ 233,
+	/* 006E + 0301 -> 0144 */ 127,
+	/* 006E + 0303 -> 00F1 */ 55,
+	/* 006E + 0307 -> 1E45 */ 1189,
+	/* 006E + 030C -> 0148 */ 131,
+	/* 006E + 0323 -> 1E47 */ 1191,
+	/* 006E + 0327 -> 0146 */ 129,
+	/* 006E + 032D -> 1E4B */ 1195,
+	/* 006E + 0331 -> 1E49 */ 1193,
+	/* 006F + 0300 -> 00F2 */ 56,
+	/* 006F + 0301 -> 00F3 */ 57,
+	/* 006F + 0302 -> 00F4 */ 58,
+	/* 006F + 0303 -> 00F5 */ 59,
+	/* 006F + 0304 -> 014D */ 134,
+	/* 006F + 0306 -> 014F */ 136,
+	/* 006F + 0307 -> 022F */ 279,
+	/* 006F + 0308 -> 00F6 */ 60,
+	/* 006F + 0309 -> 1ECF */ 1323,
+	/* 006F + 030B -> 0151 */ 138,
+	/* 006F + 030C -> 01D2 */ 199,
+	/* 006F + 030F -> 020D */ 253,
+	/* 006F + 0311 -> 020F */ 255,
+	/* 006F + 031B -> 01A1 */ 182,
+	/* 006F + 0323 -> 1ECD */ 1321,
+	/* 006F + 0328 -> 01EB */ 221,
+	/* 0070 + 0301 -> 1E55 */ 1205,
+	/* 0070 + 0307 -> 1E57 */ 1207,
+	/* 0072 + 0301 -> 0155 */ 140,
+	/* 0072 + 0307 -> 1E59 */ 1209,
+	/* 0072 + 030C -> 0159 */ 144,
+	/* 0072 + 030F -> 0211 */ 257,
+	/* 0072 + 0311 -> 0213 */ 259,
+	/* 0072 + 0323 -> 1E5B */ 1211,
+	/* 0072 + 0327 -> 0157 */ 142,
+	/* 0072 + 0331 -> 1E5F */ 1215,
+	/* 0073 + 0301 -> 015B */ 146,
+	/* 0073 + 0302 -> 015D */ 148,
+	/* 0073 + 0307 -> 1E61 */ 1217,
+	/* 0073 + 030C -> 0161 */ 152,
+	/* 0073 + 0323 -> 1E63 */ 1219,
+	/* 0073 + 0326 -> 0219 */ 265,
+	/* 0073 + 0327 -> 015F */ 150,
+	/* 0074 + 0307 -> 1E6B */ 1227,
+	/* 0074 + 0308 -> 1E97 */ 1271,
+	/* 0074 + 030C -> 0165 */ 156,
+	/* 0074 + 0323 -> 1E6D */ 1229,
+	/* 0074 + 0326 -> 021B */ 267,
+	/* 0074 + 0327 -> 0163 */ 154,
+	/* 0074 + 032D -> 1E71 */ 1233,
+	/* 0074 + 0331 -> 1E6F */ 1231,
+	/* 0075 + 0300 -> 00F9 */ 61,
+	/* 0075 + 0301 -> 00FA */ 62,
+	/* 0075 + 0302 -> 00FB */ 63,
+	/* 0075 + 0303 -> 0169 */ 158,
+	/* 0075 + 0304 -> 016B */ 160,
+	/* 0075 + 0306 -> 016D */ 162,
+	/* 0075 + 0308 -> 00FC */ 64,
+	/* 0075 + 0309 -> 1EE7 */ 1347,
+	/* 0075 + 030A -> 016F */ 164,
+	/* 0075 + 030B -> 0171 */ 166,
+	/* 0075 + 030C -> 01D4 */ 201,
+	/* 0075 + 030F -> 0215 */ 261,
+	/* 0075 + 0311 -> 0217 */ 263,
+	/* 0075 + 031B -> 01B0 */ 184,
+	/* 0075 + 0323 -> 1EE5 */ 1345,
+	/* 0075 + 0324 -> 1E73 */ 1235,
+	/* 0075 + 0328 -> 0173 */ 168,
+	/* 0075 + 032D -> 1E77 */ 1239,
+	/* 0075 + 0330 -> 1E75 */ 1237,
+	/* 0076 + 0303 -> 1E7D */ 1245,
+	/* 0076 + 0323 -> 1E7F */ 1247,
+	/* 0077 + 0300 -> 1E81 */ 1249,
+	/* 0077 + 0301 -> 1E83 */ 1251,
+	/* 0077 + 0302 -> 0175 */ 170,
+	/* 0077 + 0307 -> 1E87 */ 1255,
+	/* 0077 + 0308 -> 1E85 */ 1253,
+	/* 0077 + 030A -> 1E98 */ 1272,
+	/* 0077 + 0323 -> 1E89 */ 1257,
+	/* 0078 + 0307 -> 1E8B */ 1259,
+	/* 0078 + 0308 -> 1E8D */ 1261,
+	/* 0079 + 0300 -> 1EF3 */ 1359,
+	/* 0079 + 0301 -> 00FD */ 65,
+	/* 0079 + 0302 -> 0177 */ 172,
+	/* 0079 + 0303 -> 1EF9 */ 1365,
+	/* 0079 + 0304 -> 0233 */ 283,
+	/* 0079 + 0307 -> 1E8F */ 1263,
+	/* 0079 + 0308 -> 00FF */ 66,
+	/* 0079 + 0309 -> 1EF7 */ 1363,
+	/* 0079 + 030A -> 1E99 */ 1273,
+	/* 0079 + 0323 -> 1EF5 */ 1361,
+	/* 007A + 0301 -> 017A */ 175,
+	/* 007A + 0302 -> 1E91 */ 1265,
+	/* 007A + 0307 -> 017C */ 177,
+	/* 007A + 030C -> 017E */ 179,
+	/* 007A + 0323 -> 1E93 */ 1267,
+	/* 007A + 0331 -> 1E95 */ 1269,
+	/* 00A8 + 0300 -> 1FED */ 1584,
+	/* 00A8 + 0301 -> 0385 */ 419,
+	/* 00A8 + 0342 -> 1FC1 */ 1544,
+	/* 00C2 + 0300 -> 1EA6 */ 1282,
+	/* 00C2 + 0301 -> 1EA4 */ 1280,
+	/* 00C2 + 0303 -> 1EAA */ 1286,
+	/* 00C2 + 0309 -> 1EA8 */ 1284,
+	/* 00C4 + 0304 -> 01DE */ 210,
+	/* 00C5 + 0301 -> 01FA */ 234,
+	/* 00C6 + 0301 -> 01FC */ 236,
+	/* 00C6 + 0304 -> 01E2 */ 214,
+	/* 00C7 + 0301 -> 1E08 */ 1128,
+	/* 00CA + 0300 -> 1EC0 */ 1308,
+	/* 00CA + 0301 -> 1EBE */ 1306,
+	/* 00CA + 0303 -> 1EC4 */ 1312,
+	/* 00CA + 0309 -> 1EC2 */ 1310,
+	/* 00CF + 0301 -> 1E2E */ 1166,
+	/* 00D4 + 0300 -> 1ED2 */ 1326,
+	/* 00D4 + 0301 -> 1ED0 */ 1324,
+	/* 00D4 + 0303 -> 1ED6 */ 1330,
+	/* 00D4 + 0309 -> 1ED4 */ 1328,
+	/* 00D5 + 0301 -> 1E4C */ 1196,
+	/* 00D5 + 0304 -> 022C */ 276,
+	/* 00D5 + 0308 -> 1E4E */ 1198,
+	/* 00D6 + 0304 -> 022A */ 274,
+	/* 00D8 + 0301 -> 01FE */ 238,
+	/* 00DC + 0300 -> 01DB */ 208,
+	/* 00DC + 0301 -> 01D7 */ 204,
+	/* 00DC + 0304 -> 01D5 */ 202,
+	/* 00DC + 030C -> 01D9 */ 206,
+	/* 00E2 + 0300 -> 1EA7 */ 1283,
+	/* 00E2 + 0301 -> 1EA5 */ 1281,
+	/* 00E2 + 0303 -> 1EAB */ 1287,
+	/* 00E2 + 0309 -> 1EA9 */ 1285,
+	/* 00E4 + 0304 -> 01DF */ 211,
+	/* 00E5 + 0301 -> 01FB */ 235,
+	/* 00E6 + 0301 -> 01FD */ 237,
+	/* 00E6 + 0304 -> 01E3 */ 215,
+	/* 00E7 + 0301 -> 1E09 */ 1129,
+	/* 00EA + 0300 -> 1EC1 */ 1309,
+	/* 00EA + 0301 -> 1EBF */ 1307,
+	/* 00EA + 0303 -> 1EC5 */ 1313,
+	/* 00EA + 0309 -> 1EC3 */ 1311,
+	/* 00EF + 0301 -> 1E2F */ 1167,
+	/* 00F4 + 0300 -> 1ED3 */ 1327,
+	/* 00F4 + 0301 -> 1ED1 */ 1325,
+	/* 00F4 + 0303 -> 1ED7 */ 1331,
+	/* 00F4 + 0309 -> 1ED5 */ 1329,
+	/* 00F5 + 0301 -> 1E4D */ 1197,
+	/* 00F5 + 0304 -> 022D */ 277,
+	/* 00F5 + 0308 -> 1E4F */ 1199,
+	/* 00F6 + 0304 -> 022B */ 275,
+	/* 00F8 + 0301 -> 01FF */ 239,
+	/* 00FC + 0300 -> 01DC */ 209,
+	/* 00FC + 0301 -> 01D8 */ 205,
+	/* 00FC + 0304 -> 01D6 */ 203,
+	/* 00FC + 030C -> 01DA */ 207,
+	/* 0102 + 0300 -> 1EB0 */ 1292,
+	/* 0102 + 0301 -> 1EAE */ 1290,
+	/* 0102 + 0303 -> 1EB4 */ 1296,
+	/* 0102 + 0309 -> 1EB2 */ 1294,
+	/* 0103 + 0300 -> 1EB1 */ 1293,
+	/* 0103 + 0301 -> 1EAF */ 1291,
+	/* 0103 + 0303 -> 1EB5 */ 1297,
+	/* 0103 + 0309 -> 1EB3 */ 1295,
+	/* 0112 + 0300 -> 1E14 */ 1140,
+	/* 0112 + 0301 -> 1E16 */ 1142,
+	/* 0113 + 0300 -> 1E15 */ 1141,
+	/* 0113 + 0301 -> 1E17 */ 1143,
+	/* 014C + 0300 -> 1E50 */ 1200,
+	/* 014C + 0301 -> 1E52 */ 1202,
+	/* 014D + 0300 -> 1E51 */ 1201,
+	/* 014D + 0301 -> 1E53 */ 1203,
+	/* 015A + 0307 -> 1E64 */ 1220,
+	/* 015B + 0307 -> 1E65 */ 1221,
+	/* 0160 + 0307 -> 1E66 */ 1222,
+	/* 0161 + 0307 -> 1E67 */ 1223,
+	/* 0168 + 0301 -> 1E78 */ 1240,
+	/* 0169 + 0301 -> 1E79 */ 1241,
+	/* 016A + 0308 -> 1E7A */ 1242,
+	/* 016B + 0308 -> 1E7B */ 1243,
+	/* 017F + 0307 -> 1E9B */ 1275,
+	/* 01A0 + 0300 -> 1EDC */ 1336,
+	/* 01A0 + 0301 -> 1EDA */ 1334,
+	/* 01A0 + 0303 -> 1EE0 */ 1340,
+	/* 01A0 + 0309 -> 1EDE */ 1338,
+	/* 01A0 + 0323 -> 1EE2 */ 1342,
+	/* 01A1 + 0300 -> 1EDD */ 1337,
+	/* 01A1 + 0301 -> 1EDB */ 1335,
+	/* 01A1 + 0303 -> 1EE1 */ 1341,
+	/* 01A1 + 0309 -> 1EDF */ 1339,
+	/* 01A1 + 0323 -> 1EE3 */ 1343,
+	/* 01AF + 0300 -> 1EEA */ 1350,
+	/* 01AF + 0301 -> 1EE8 */ 1348,
+	/* 01AF + 0303 -> 1EEE */ 1354,
+	/* 01AF + 0309 -> 1EEC */ 1352,
+	/* 01AF + 0323 -> 1EF0 */ 1356,
+	/* 01B0 + 0300 -> 1EEB */ 1351,
+	/* 01B0 + 0301 -> 1EE9 */ 1349,
+	/* 01B0 + 0303 -> 1EEF */ 1355,
+	/* 01B0 + 0309 -> 1EED */ 1353,
+	/* 01B0 + 0323 -> 1EF1 */ 1357,
+	/* 01B7 + 030C -> 01EE */ 224,
+	/* 01EA + 0304 -> 01EC */ 222,
+	/* 01EB + 0304 -> 01ED */ 223,
+	/* 0226 + 0304 -> 01E0 */ 212,
+	/* 0227 + 0304 -> 01E1 */ 213,
+	/* 0228 + 0306 -> 1E1C */ 1148,
+	/* 0229 + 0306 -> 1E1D */ 1149,
+	/* 022E + 0304 -> 0230 */ 280,
+	/* 022F + 0304 -> 0231 */ 281,
+	/* 0292 + 030C -> 01EF */ 225,
+	/* 0391 + 0300 -> 1FBA */ 1537,
+	/* 0391 + 0301 -> 0386 */ 420,
+	/* 0391 + 0304 -> 1FB9 */ 1536,
+	/* 0391 + 0306 -> 1FB8 */ 1535,
+	/* 0391 + 0313 -> 1F08 */ 1374,
+	/* 0391 + 0314 -> 1F09 */ 1375,
+	/* 0391 + 0345 -> 1FBC */ 1539,
+	/* 0395 + 0300 -> 1FC8 */ 1550,
+	/* 0395 + 0301 -> 0388 */ 422,
+	/* 0395 + 0313 -> 1F18 */ 1388,
+	/* 0395 + 0314 -> 1F19 */ 1389,
+	/* 0397 + 0300 -> 1FCA */ 1552,
+	/* 0397 + 0301 -> 0389 */ 423,
+	/* 0397 + 0313 -> 1F28 */ 1402,
+	/* 0397 + 0314 -> 1F29 */ 1403,
+	/* 0397 + 0345 -> 1FCC */ 1554,
+	/* 0399 + 0300 -> 1FDA */ 1566,
+	/* 0399 + 0301 -> 038A */ 424,
+	/* 0399 + 0304 -> 1FD9 */ 1565,
+	/* 0399 + 0306 -> 1FD8 */ 1564,
+	/* 0399 + 0308 -> 03AA */ 429,
+	/* 0399 + 0313 -> 1F38 */ 1418,
+	/* 0399 + 0314 -> 1F39 */ 1419,
+	/* 039F + 0300 -> 1FF8 */ 1592,
+	/* 039F + 0301 -> 038C */ 425,
+	/* 039F + 0313 -> 1F48 */ 1432,
+	/* 039F + 0314 -> 1F49 */ 1433,
+	/* 03A1 + 0314 -> 1FEC */ 1583,
+	/* 03A5 + 0300 -> 1FEA */ 1581,
+	/* 03A5 + 0301 -> 038E */ 426,
+	/* 03A5 + 0304 -> 1FE9 */ 1580,
+	/* 03A5 + 0306 -> 1FE8 */ 1579,
+	/* 03A5 + 0308 -> 03AB */ 430,
+	/* 03A5 + 0314 -> 1F59 */ 1446,
+	/* 03A9 + 0300 -> 1FFA */ 1594,
+	/* 03A9 + 0301 -> 038F */ 427,
+	/* 03A9 + 0313 -> 1F68 */ 1458,
+	/* 03A9 + 0314 -> 1F69 */ 1459,
+	/* 03A9 + 0345 -> 1FFC */ 1596,
+	/* 03AC + 0345 -> 1FB4 */ 1532,
+	/* 03AE + 0345 -> 1FC4 */ 1547,
+	/* 03B1 + 0300 -> 1F70 */ 1466,
+	/* 03B1 + 0301 -> 03AC */ 431,
+	/* 03B1 + 0304 -> 1FB1 */ 1529,
+	/* 03B1 + 0306 -> 1FB0 */ 1528,
+	/* 03B1 + 0313 -> 1F00 */ 1366,
+	/* 03B1 + 0314 -> 1F01 */ 1367,
+	/* 03B1 + 0342 -> 1FB6 */ 1533,
+	/* 03B1 + 0345 -> 1FB3 */ 1531,
+	/* 03B5 + 0300 -> 1F72 */ 1468,
+	/* 03B5 + 0301 -> 03AD */ 432,
+	/* 03B5 + 0313 -> 1F10 */ 1382,
+	/* 03B5 + 0314 -> 1F11 */ 1383,
+	/* 03B7 + 0300 -> 1F74 */ 1470,
+	/* 03B7 + 0301 -> 03AE */ 433,
+	/* 03B7 + 0313 -> 1F20 */ 1394,
+	/* 03B7 + 0314 -> 1F21 */ 1395,
+	/* 03B7 + 0342 -> 1FC6 */ 1548,
+	/* 03B7 + 0345 -> 1FC3 */ 1546,
+	/* 03B9 + 0300 -> 1F76 */ 1472,
+	/* 03B9 + 0301 -> 03AF */ 434,
+	/* 03B9 + 0304 -> 1FD1 */ 1559,
+	/* 03B9 + 0306 -> 1FD0 */ 1558,
+	/* 03B9 + 0308 -> 03CA */ 436,
+	/* 03B9 + 0313 -> 1F30 */ 1410,
+	/* 03B9 + 0314 -> 1F31 */ 1411,
+	/* 03B9 + 0342 -> 1FD6 */ 1562,
+	/* 03BF + 0300 -> 1F78 */ 1474,
+	/* 03BF + 0301 -> 03CC */ 438,
+	/* 03BF + 0313 -> 1F40 */ 1426,
+	/* 03BF + 0314 -> 1F41 */ 1427,
+	/* 03C1 + 0313 -> 1FE4 */ 1575,
+	/* 03C1 + 0314 -> 1FE5 */ 1576,
+	/* 03C5 + 0300 -> 1F7A */ 1476,
+	/* 03C5 + 0301 -> 03CD */ 439,
+	/* 03C5 + 0304 -> 1FE1 */ 1572,
+	/* 03C5 + 0306 -> 1FE0 */ 1571,
+	/* 03C5 + 0308 -> 03CB */ 437,
+	/* 03C5 + 0313 -> 1F50 */ 1438,
+	/* 03C5 + 0314 -> 1F51 */ 1439,
+	/* 03C5 + 0342 -> 1FE6 */ 1577,
+	/* 03C9 + 0300 -> 1F7C */ 1478,
+	/* 03C9 + 0301 -> 03CE */ 440,
+	/* 03C9 + 0313 -> 1F60 */ 1450,
+	/* 03C9 + 0314 -> 1F61 */ 1451,
+	/* 03C9 + 0342 -> 1FF6 */ 1590,
+	/* 03C9 + 0345 -> 1FF3 */ 1588,
+	/* 03CA + 0300 -> 1FD2 */ 1560,
+	/* 03CA + 0301 -> 0390 */ 428,
+	/* 03CA + 0342 -> 1FD7 */ 1563,
+	/* 03CB + 0300 -> 1FE2 */ 1573,
+	/* 03CB + 0301 -> 03B0 */ 435,
+	/* 03CB + 0342 -> 1FE7 */ 1578,
+	/* 03CE + 0345 -> 1FF4 */ 1589,
+	/* 03D2 + 0301 -> 03D3 */ 444,
+	/* 03D2 + 0308 -> 03D4 */ 445,
+	/* 0406 + 0308 -> 0407 */ 457,
+	/* 0410 + 0306 -> 04D0 */ 479,
+	/* 0410 + 0308 -> 04D2 */ 481,
+	/* 0413 + 0301 -> 0403 */ 456,
+	/* 0415 + 0300 -> 0400 */ 454,
+	/* 0415 + 0306 -> 04D6 */ 483,
+	/* 0415 + 0308 -> 0401 */ 455,
+	/* 0416 + 0306 -> 04C1 */ 477,
+	/* 0416 + 0308 -> 04DC */ 487,
+	/* 0417 + 0308 -> 04DE */ 489,
+	/* 0418 + 0300 -> 040D */ 459,
+	/* 0418 + 0304 -> 04E2 */ 491,
+	/* 0418 + 0306 -> 0419 */ 461,
+	/* 0418 + 0308 -> 04E4 */ 493,
+	/* 041A + 0301 -> 040C */ 458,
+	/* 041E + 0308 -> 04E6 */ 495,
+	/* 0423 + 0304 -> 04EE */ 501,
+	/* 0423 + 0306 -> 040E */ 460,
+	/* 0423 + 0308 -> 04F0 */ 503,
+	/* 0423 + 030B -> 04F2 */ 505,
+	/* 0427 + 0308 -> 04F4 */ 507,
+	/* 042B + 0308 -> 04F8 */ 509,
+	/* 042D + 0308 -> 04EC */ 499,
+	/* 0430 + 0306 -> 04D1 */ 480,
+	/* 0430 + 0308 -> 04D3 */ 482,
+	/* 0433 + 0301 -> 0453 */ 465,
+	/* 0435 + 0300 -> 0450 */ 463,
+	/* 0435 + 0306 -> 04D7 */ 484,
+	/* 0435 + 0308 -> 0451 */ 464,
+	/* 0436 + 0306 -> 04C2 */ 478,
+	/* 0436 + 0308 -> 04DD */ 488,
+	/* 0437 + 0308 -> 04DF */ 490,
+	/* 0438 + 0300 -> 045D */ 468,
+	/* 0438 + 0304 -> 04E3 */ 492,
+	/* 0438 + 0306 -> 0439 */ 462,
+	/* 0438 + 0308 -> 04E5 */ 494,
+	/* 043A + 0301 -> 045C */ 467,
+	/* 043E + 0308 -> 04E7 */ 496,
+	/* 0443 + 0304 -> 04EF */ 502,
+	/* 0443 + 0306 -> 045E */ 469,
+	/* 0443 + 0308 -> 04F1 */ 504,
+	/* 0443 + 030B -> 04F3 */ 506,
+	/* 0447 + 0308 -> 04F5 */ 508,
+	/* 044B + 0308 -> 04F9 */ 510,
+	/* 044D + 0308 -> 04ED */ 500,
+	/* 0456 + 0308 -> 0457 */ 466,
+	/* 0474 + 030F -> 0476 */ 470,
+	/* 0475 + 030F -> 0477 */ 471,
+	/* 04D8 + 0308 -> 04DA */ 485,
+	/* 04D9 + 0308 -> 04DB */ 486,
+	/* 04E8 + 0308 -> 04EA */ 497,
+	/* 04E9 + 0308 -> 04EB */ 498,
+	/* 0627 + 0653 -> 0622 */ 574,
+	/* 0627 + 0654 -> 0623 */ 575,
+	/* 0627 + 0655 -> 0625 */ 577,
+	/* 0648 + 0654 -> 0624 */ 576,
+	/* 064A + 0654 -> 0626 */ 578,
+	/* 06C1 + 0654 -> 06C2 */ 606,
+	/* 06D2 + 0654 -> 06D3 */ 607,
+	/* 06D5 + 0654 -> 06C0 */ 605,
+	/* 0928 + 093C -> 0929 */ 733,
+	/* 0930 + 093C -> 0931 */ 734,
+	/* 0933 + 093C -> 0934 */ 735,
+	/* 09C7 + 09BE -> 09CB */ 751,
+	/* 09C7 + 09D7 -> 09CC */ 752,
+	/* 0B47 + 0B3E -> 0B4B */ 770,
+	/* 0B47 + 0B56 -> 0B48 */ 769,
+	/* 0B47 + 0B57 -> 0B4C */ 771,
+	/* 0B92 + 0BD7 -> 0B94 */ 775,
+	/* 0BC6 + 0BBE -> 0BCA */ 776,
+	/* 0BC6 + 0BD7 -> 0BCC */ 778,
+	/* 0BC7 + 0BBE -> 0BCB */ 777,
+	/* 0C46 + 0C56 -> 0C48 */ 780,
+	/* 0CBF + 0CD5 -> 0CC0 */ 785,
+	/* 0CC6 + 0CC2 -> 0CCA */ 788,
+	/* 0CC6 + 0CD5 -> 0CC7 */ 786,
+	/* 0CC6 + 0CD6 -> 0CC8 */ 787,
+	/* 0CCA + 0CD5 -> 0CCB */ 789,
+	/* 0D46 + 0D3E -> 0D4A */ 793,
+	/* 0D46 + 0D57 -> 0D4C */ 795,
+	/* 0D47 + 0D3E -> 0D4B */ 794,
+	/* 0DD9 + 0DCA -> 0DDA */ 798,
+	/* 0DD9 + 0DCF -> 0DDC */ 799,
+	/* 0DD9 + 0DDF -> 0DDE */ 801,
+	/* 0DDC + 0DCA -> 0DDD */ 800,
+	/* 1025 + 102E -> 1026 */ 859,
+	/* 1B05 + 1B35 -> 1B06 */ 904,
+	/* 1B07 + 1B35 -> 1B08 */ 905,
+	/* 1B09 + 1B35 -> 1B0A */ 906,
+	/* 1B0B + 1B35 -> 1B0C */ 907,
+	/* 1B0D + 1B35 -> 1B0E */ 908,
+	/* 1B11 + 1B35 -> 1B12 */ 909,
+	/* 1B3A + 1B35 -> 1B3B */ 911,
+	/* 1B3C + 1B35 -> 1B3D */ 912,
+	/* 1B3E + 1B35 -> 1B40 */ 913,
+	/* 1B3F + 1B35 -> 1B41 */ 914,
+	/* 1B42 + 1B35 -> 1B43 */ 915,
+	/* 1E36 + 0304 -> 1E38 */ 1176,
+	/* 1E37 + 0304 -> 1E39 */ 1177,
+	/* 1E5A + 0304 -> 1E5C */ 1212,
+	/* 1E5B + 0304 -> 1E5D */ 1213,
+	/* 1E62 + 0307 -> 1E68 */ 1224,
+	/* 1E63 + 0307 -> 1E69 */ 1225,
+	/* 1EA0 + 0302 -> 1EAC */ 1288,
+	/* 1EA0 + 0306 -> 1EB6 */ 1298,
+	/* 1EA1 + 0302 -> 1EAD */ 1289,
+	/* 1EA1 + 0306 -> 1EB7 */ 1299,
+	/* 1EB8 + 0302 -> 1EC6 */ 1314,
+	/* 1EB9 + 0302 -> 1EC7 */ 1315,
+	/* 1ECC + 0302 -> 1ED8 */ 1332,
+	/* 1ECD + 0302 -> 1ED9 */ 1333,
+	/* 1F00 + 0300 -> 1F02 */ 1368,
+	/* 1F00 + 0301 -> 1F04 */ 1370,
+	/* 1F00 + 0342 -> 1F06 */ 1372,
+	/* 1F00 + 0345 -> 1F80 */ 1480,
+	/* 1F01 + 0300 -> 1F03 */ 1369,
+	/* 1F01 + 0301 -> 1F05 */ 1371,
+	/* 1F01 + 0342 -> 1F07 */ 1373,
+	/* 1F01 + 0345 -> 1F81 */ 1481,
+	/* 1F02 + 0345 -> 1F82 */ 1482,
+	/* 1F03 + 0345 -> 1F83 */ 1483,
+	/* 1F04 + 0345 -> 1F84 */ 1484,
+	/* 1F05 + 0345 -> 1F85 */ 1485,
+	/* 1F06 + 0345 -> 1F86 */ 1486,
+	/* 1F07 + 0345 -> 1F87 */ 1487,
+	/* 1F08 + 0300 -> 1F0A */ 1376,
+	/* 1F08 + 0301 -> 1F0C */ 1378,
+	/* 1F08 + 0342 -> 1F0E */ 1380,
+	/* 1F08 + 0345 -> 1F88 */ 1488,
+	/* 1F09 + 0300 -> 1F0B */ 1377,
+	/* 1F09 + 0301 -> 1F0D */ 1379,
+	/* 1F09 + 0342 -> 1F0F */ 1381,
+	/* 1F09 + 0345 -> 1F89 */ 1489,
+	/* 1F0A + 0345 -> 1F8A */ 1490,
+	/* 1F0B + 0345 -> 1F8B */ 1491,
+	/* 1F0C + 0345 -> 1F8C */ 1492,
+	/* 1F0D + 0345 -> 1F8D */ 1493,
+	/* 1F0E + 0345 -> 1F8E */ 1494,
+	/* 1F0F + 0345 -> 1F8F */ 1495,
+	/* 1F10 + 0300 -> 1F12 */ 1384,
+	/* 1F10 + 0301 -> 1F14 */ 1386,
+	/* 1F11 + 0300 -> 1F13 */ 1385,
+	/* 1F11 + 0301 -> 1F15 */ 1387,
+	/* 1F18 + 0300 -> 1F1A */ 1390,
+	/* 1F18 + 0301 -> 1F1C */ 1392,
+	/* 1F19 + 0300 -> 1F1B */ 1391,
+	/* 1F19 + 0301 -> 1F1D */ 1393,
+	/* 1F20 + 0300 -> 1F22 */ 1396,
+	/* 1F20 + 0301 -> 1F24 */ 1398,
+	/* 1F20 + 0342 -> 1F26 */ 1400,
+	/* 1F20 + 0345 -> 1F90 */ 1496,
+	/* 1F21 + 0300 -> 1F23 */ 1397,
+	/* 1F21 + 0301 -> 1F25 */ 1399,
+	/* 1F21 + 0342 -> 1F27 */ 1401,
+	/* 1F21 + 0345 -> 1F91 */ 1497,
+	/* 1F22 + 0345 -> 1F92 */ 1498,
+	/* 1F23 + 0345 -> 1F93 */ 1499,
+	/* 1F24 + 0345 -> 1F94 */ 1500,
+	/* 1F25 + 0345 -> 1F95 */ 1501,
+	/* 1F26 + 0345 -> 1F96 */ 1502,
+	/* 1F27 + 0345 -> 1F97 */ 1503,
+	/* 1F28 + 0300 -> 1F2A */ 1404,
+	/* 1F28 + 0301 -> 1F2C */ 1406,
+	/* 1F28 + 0342 -> 1F2E */ 1408,
+	/* 1F28 + 0345 -> 1F98 */ 1504,
+	/* 1F29 + 0300 -> 1F2B */ 1405,
+	/* 1F29 + 0301 -> 1F2D */ 1407,
+	/* 1F29 + 0342 -> 1F2F */ 1409,
+	/* 1F29 + 0345 -> 1F99 */ 1505,
+	/* 1F2A + 0345 -> 1F9A */ 1506,
+	/* 1F2B + 0345 -> 1F9B */ 1507,
+	/* 1F2C + 0345 -> 1F9C */ 1508,
+	/* 1F2D + 0345 -> 1F9D */ 1509,
+	/* 1F2E + 0345 -> 1F9E */ 1510,
+	/* 1F2F + 0345 -> 1F9F */ 1511,
+	/* 1F30 + 0300 -> 1F32 */ 1412,
+	/* 1F30 + 0301 -> 1F34 */ 1414,
+	/* 1F30 + 0342 -> 1F36 */ 1416,
+	/* 1F31 + 0300 -> 1F33 */ 1413,
+	/* 1F31 + 0301 -> 1F35 */ 1415,
+	/* 1F31 + 0342 -> 1F37 */ 1417,
+	/* 1F38 + 0300 -> 1F3A */ 1420,
+	/* 1F38 + 0301 -> 1F3C */ 1422,
+	/* 1F38 + 0342 -> 1F3E */ 1424,
+	/* 1F39 + 0300 -> 1F3B */ 1421,
+	/* 1F39 + 0301 -> 1F3D */ 1423,
+	/* 1F39 + 0342 -> 1F3F */ 1425,
+	/* 1F40 + 0300 -> 1F42 */ 1428,
+	/* 1F40 + 0301 -> 1F44 */ 1430,
+	/* 1F41 + 0300 -> 1F43 */ 1429,
+	/* 1F41 + 0301 -> 1F45 */ 1431,
+	/* 1F48 + 0300 -> 1F4A */ 1434,
+	/* 1F48 + 0301 -> 1F4C */ 1436,
+	/* 1F49 + 0300 -> 1F4B */ 1435,
+	/* 1F49 + 0301 -> 1F4D */ 1437,
+	/* 1F50 + 0300 -> 1F52 */ 1440,
+	/* 1F50 + 0301 -> 1F54 */ 1442,
+	/* 1F50 + 0342 -> 1F56 */ 1444,
+	/* 1F51 + 0300 -> 1F53 */ 1441,
+	/* 1F51 + 0301 -> 1F55 */ 1443,
+	/* 1F51 + 0342 -> 1F57 */ 1445,
+	/* 1F59 + 0300 -> 1F5B */ 1447,
+	/* 1F59 + 0301 -> 1F5D */ 1448,
+	/* 1F59 + 0342 -> 1F5F */ 1449,
+	/* 1F60 + 0300 -> 1F62 */ 1452,
+	/* 1F60 + 0301 -> 1F64 */ 1454,
+	/* 1F60 + 0342 -> 1F66 */ 1456,
+	/* 1F60 + 0345 -> 1FA0 */ 1512,
+	/* 1F61 + 0300 -> 1F63 */ 1453,
+	/* 1F61 + 0301 -> 1F65 */ 1455,
+	/* 1F61 + 0342 -> 1F67 */ 1457,
+	/* 1F61 + 0345 -> 1FA1 */ 1513,
+	/* 1F62 + 0345 -> 1FA2 */ 1514,
+	/* 1F63 + 0345 -> 1FA3 */ 1515,
+	/* 1F64 + 0345 -> 1FA4 */ 1516,
+	/* 1F65 + 0345 -> 1FA5 */ 1517,
+	/* 1F66 + 0345 -> 1FA6 */ 1518,
+	/* 1F67 + 0345 -> 1FA7 */ 1519,
+	/* 1F68 + 0300 -> 1F6A */ 1460,
+	/* 1F68 + 0301 -> 1F6C */ 1462,
+	/* 1F68 + 0342 -> 1F6E */ 1464,
+	/* 1F68 + 0345 -> 1FA8 */ 1520,
+	/* 1F69 + 0300 -> 1F6B */ 1461,
+	/* 1F69 + 0301 -> 1F6D */ 1463,
+	/* 1F69 + 0342 -> 1F6F */ 1465,
+	/* 1F69 + 0345 -> 1FA9 */ 1521,
+	/* 1F6A + 0345 -> 1FAA */ 1522,
+	/* 1F6B + 0345 -> 1FAB */ 1523,
+	/* 1F6C + 0345 -> 1FAC */ 1524,
+	/* 1F6D + 0345 -> 1FAD */ 1525,
+	/* 1F6E + 0345 -> 1FAE */ 1526,
+	/* 1F6F + 0345 -> 1FAF */ 1527,
+	/* 1F70 + 0345 -> 1FB2 */ 1530,
+	/* 1F74 + 0345 -> 1FC2 */ 1545,
+	/* 1F7C + 0345 -> 1FF2 */ 1587,
+	/* 1FB6 + 0345 -> 1FB7 */ 1534,
+	/* 1FBF + 0300 -> 1FCD */ 1555,
+	/* 1FBF + 0301 -> 1FCE */ 1556,
+	/* 1FBF + 0342 -> 1FCF */ 1557,
+	/* 1FC6 + 0345 -> 1FC7 */ 1549,
+	/* 1FF6 + 0345 -> 1FF7 */ 1591,
+	/* 1FFE + 0300 -> 1FDD */ 1568,
+	/* 1FFE + 0301 -> 1FDE */ 1569,
+	/* 1FFE + 0342 -> 1FDF */ 1570,
+	/* 2190 + 0338 -> 219A */ 1801,
+	/* 2192 + 0338 -> 219B */ 1802,
+	/* 2194 + 0338 -> 21AE */ 1803,
+	/* 21D0 + 0338 -> 21CD */ 1804,
+	/* 21D2 + 0338 -> 21CF */ 1806,
+	/* 21D4 + 0338 -> 21CE */ 1805,
+	/* 2203 + 0338 -> 2204 */ 1807,
+	/* 2208 + 0338 -> 2209 */ 1808,
+	/* 220B + 0338 -> 220C */ 1809,
+	/* 2223 + 0338 -> 2224 */ 1810,
+	/* 2225 + 0338 -> 2226 */ 1811,
+	/* 223C + 0338 -> 2241 */ 1816,
+	/* 2243 + 0338 -> 2244 */ 1817,
+	/* 2245 + 0338 -> 2247 */ 1818,
+	/* 2248 + 0338 -> 2249 */ 1819,
+	/* 224D + 0338 -> 226D */ 1822,
+	/* 2261 + 0338 -> 2262 */ 1821,
+	/* 2264 + 0338 -> 2270 */ 1825,
+	/* 2265 + 0338 -> 2271 */ 1826,
+	/* 2272 + 0338 -> 2274 */ 1827,
+	/* 2273 + 0338 -> 2275 */ 1828,
+	/* 2276 + 0338 -> 2278 */ 1829,
+	/* 2277 + 0338 -> 2279 */ 1830,
+	/* 227A + 0338 -> 2280 */ 1831,
+	/* 227B + 0338 -> 2281 */ 1832,
+	/* 227C + 0338 -> 22E0 */ 1841,
+	/* 227D + 0338 -> 22E1 */ 1842,
+	/* 2282 + 0338 -> 2284 */ 1833,
+	/* 2283 + 0338 -> 2285 */ 1834,
+	/* 2286 + 0338 -> 2288 */ 1835,
+	/* 2287 + 0338 -> 2289 */ 1836,
+	/* 2291 + 0338 -> 22E2 */ 1843,
+	/* 2292 + 0338 -> 22E3 */ 1844,
+	/* 22A2 + 0338 -> 22AC */ 1837,
+	/* 22A8 + 0338 -> 22AD */ 1838,
+	/* 22A9 + 0338 -> 22AE */ 1839,
+	/* 22AB + 0338 -> 22AF */ 1840,
+	/* 22B2 + 0338 -> 22EA */ 1845,
+	/* 22B3 + 0338 -> 22EB */ 1846,
+	/* 22B4 + 0338 -> 22EC */ 1847,
+	/* 22B5 + 0338 -> 22ED */ 1848,
+	/* 3046 + 3099 -> 3094 */ 2286,
+	/* 304B + 3099 -> 304C */ 2261,
+	/* 304D + 3099 -> 304E */ 2262,
+	/* 304F + 3099 -> 3050 */ 2263,
+	/* 3051 + 3099 -> 3052 */ 2264,
+	/* 3053 + 3099 -> 3054 */ 2265,
+	/* 3055 + 3099 -> 3056 */ 2266,
+	/* 3057 + 3099 -> 3058 */ 2267,
+	/* 3059 + 3099 -> 305A */ 2268,
+	/* 305B + 3099 -> 305C */ 2269,
+	/* 305D + 3099 -> 305E */ 2270,
+	/* 305F + 3099 -> 3060 */ 2271,
+	/* 3061 + 3099 -> 3062 */ 2272,
+	/* 3064 + 3099 -> 3065 */ 2273,
+	/* 3066 + 3099 -> 3067 */ 2274,
+	/* 3068 + 3099 -> 3069 */ 2275,
+	/* 306F + 3099 -> 3070 */ 2276,
+	/* 306F + 309A -> 3071 */ 2277,
+	/* 3072 + 3099 -> 3073 */ 2278,
+	/* 3072 + 309A -> 3074 */ 2279,
+	/* 3075 + 3099 -> 3076 */ 2280,
+	/* 3075 + 309A -> 3077 */ 2281,
+	/* 3078 + 3099 -> 3079 */ 2282,
+	/* 3078 + 309A -> 307A */ 2283,
+	/* 307B + 3099 -> 307C */ 2284,
+	/* 307B + 309A -> 307D */ 2285,
+	/* 309D + 3099 -> 309E */ 2291,
+	/* 30A6 + 3099 -> 30F4 */ 2318,
+	/* 30AB + 3099 -> 30AC */ 2293,
+	/* 30AD + 3099 -> 30AE */ 2294,
+	/* 30AF + 3099 -> 30B0 */ 2295,
+	/* 30B1 + 3099 -> 30B2 */ 2296,
+	/* 30B3 + 3099 -> 30B4 */ 2297,
+	/* 30B5 + 3099 -> 30B6 */ 2298,
+	/* 30B7 + 3099 -> 30B8 */ 2299,
+	/* 30B9 + 3099 -> 30BA */ 2300,
+	/* 30BB + 3099 -> 30BC */ 2301,
+	/* 30BD + 3099 -> 30BE */ 2302,
+	/* 30BF + 3099 -> 30C0 */ 2303,
+	/* 30C1 + 3099 -> 30C2 */ 2304,
+	/* 30C4 + 3099 -> 30C5 */ 2305,
+	/* 30C6 + 3099 -> 30C7 */ 2306,
+	/* 30C8 + 3099 -> 30C9 */ 2307,
+	/* 30CF + 3099 -> 30D0 */ 2308,
+	/* 30CF + 309A -> 30D1 */ 2309,
+	/* 30D2 + 3099 -> 30D3 */ 2310,
+	/* 30D2 + 309A -> 30D4 */ 2311,
+	/* 30D5 + 3099 -> 30D6 */ 2312,
+	/* 30D5 + 309A -> 30D7 */ 2313,
+	/* 30D8 + 3099 -> 30D9 */ 2314,
+	/* 30D8 + 309A -> 30DA */ 2315,
+	/* 30DB + 3099 -> 30DC */ 2316,
+	/* 30DB + 309A -> 30DD */ 2317,
+	/* 30EF + 3099 -> 30F7 */ 2319,
+	/* 30F0 + 3099 -> 30F8 */ 2320,
+	/* 30F1 + 3099 -> 30F9 */ 2321,
+	/* 30F2 + 3099 -> 30FA */ 2322,
+	/* 30FD + 3099 -> 30FE */ 2323,
+	/* 11099 + 110BA -> 1109A */ 4588,
+	/* 1109B + 110BA -> 1109C */ 4589,
+	/* 110A5 + 110BA -> 110AB */ 4590,
+	/* 11131 + 11127 -> 1112E */ 4596,
+	/* 11132 + 11127 -> 1112F */ 4597,
+	/* 11347 + 1133E -> 1134B */ 4609,
+	/* 11347 + 11357 -> 1134C */ 4610,
+	/* 114B9 + 114B0 -> 114BC */ 4628,
+	/* 114B9 + 114BA -> 114BB */ 4627,
+	/* 114B9 + 114BD -> 114BE */ 4629,
+	/* 115B8 + 115AF -> 115BA */ 4632,
+	/* 115B9 + 115AF -> 115BB */ 4633,
+	/* 11935 + 11930 -> 11938 */ 4642
+};
+
+/* Perfect hash function for recomposition */
+static int
+Recomp_hash_func(const void *key)
+{
+	static const int16 h[1883] = {
+		   772,    773,    621,  32767,  32767,    387,    653,    196,
+		 32767,  32767,    855,    463,    -19,    651,  32767,  32767,
+		 32767,    364,  32767,  32767,   -108,  32767,  32767,  32767,
+		 32767,      0,   -568,  32767,  32767,  32767,      0,      0,
+		     0,   -103,    364,      0,    210,    732,      0,      0,
+		  -506,      0,      0,      0,  32767,  32767,      0,  32767,
+		   407,   -140,  32767,    409,  32767,    772,      0,     86,
+		   842,    934,  32767,  32767,   -499,   -355,  32767,  32767,
+		   532,    138,    174,   -243,    860,   1870,    742,  32767,
+		 32767,    339,  32767,   1290,      0,  32767,  32767,      0,
+		  -449,  -1386,   1633,    560,    561,  32767,   1219,   1004,
+		   139,   -804,  32767,   -179,    141,    579,   1586,  32767,
+		 32767,  32767,    142,    199,  32767,  32767,    143,      0,
+		 32767,  32767,    314,    896,  32767,  32767,    428,    129,
+		   286,    -58,      0,     68,  32767,      0,    244,   -566,
+		 32767,  32767,  32767,    246,  32767,  32767,      0,  32767,
+		 32767,    271,   -108,    928,  32767,    715,  32767,  32767,
+		  -211,   -497,  32767,      0,   1055,   1339,  32767,      0,
+		 32767,  32767,   -968,   -144,  32767,  32767,    248,  32767,
+		  -161,  32767,  32767,    282,  32767,   -372,      0,      2,
+		  -137,   1116,  32767,    687,  32767,    459,    913,      0,
+		   461,    879,   -816,    443,  32767,  32767,    462,   1089,
+		 32767,   1054,      0,    314,    447,    -26,    480,  32767,
+		    64,      0,      0,    112,  32767,     66,      0,    646,
+		   603,     22,   -292,      0,    710,    475,  32767,     24,
+		  -781,  32767,  32767,  32767,    281,    307,  32767,   1289,
+		 32767,      0,   1064,   -149,    454,    118,  32767,  32767,
+		     0,  32767,   -126,      0,  32767,  32767,    858,  32767,
+		 32767,  32767,   1029,    886,    665,    209,      0,     26,
+		   359,      0,      0,   -108,   -508,   -603,    894,    906,
+		 32767,  32767,     14,      0,      0,    534,    984,    876,
+		 32767,    -93,    110,   -367,    167,    843,  32767,  32767,
+		  -947,   -290,    169,      0,      0,  32767,    -42,    564,
+		     0,   -927,  32767,    817,  32767,  32767,  32767,    110,
+		     0,  32767,  32767,    -38,  32767,  32767,   -101,    694,
+		  -142,    190,    191,   1288,  32767,   -687,    194,   -579,
+		   534,   -452,      0,    -72,    536,    765,    823,    266,
+		  -259,    684,    767,  32767,    654,  32767,  32767,     64,
+		   920,  32767,  32767,  32767,      0,   1653,      0,      0,
+		 32767,  32767,   -452,   -222,    855,      0,  32767,  -1153,
+		   127,    490,    449,    863,  32767,   -144,  32767,   -379,
+		   545,  32767,  32767,  32767,    530,  32767,  32767,   1331,
+		   611,   -612,    332,    545,    -73,      0,    604,    201,
+		 32767,   -279,    338,    836,    340,    408,  32767,    -60,
+		  -358,  32767,    343,     69,    707,      0,   -129,    582,
+		 32767,      0,  32767,     96,    392,    490,    639,    157,
+		    -4,    406,  32767,  32767,   -571,   1077,    546,  32767,
+		   551,      0,      0,      0,  32767,  32767,    348,  32767,
+		   498,   -181,      0,   -433,   1057,    260,      0,  32767,
+		 32767,    397,  32767,    816,   -130,  32767,    624,      0,
+		     0,  32767,  32767,  32767,    485,      0,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,  32767,  32767,   1222,
+		  -230,  32767,    797,   -538,  32767,    974,  32767,  32767,
+		   831,     70,   -658,    145,      0,    147,      0,  32767,
+		  1295,  32767,      0,      0,    895,      0,      0,   -385,
+		   491,   -287,  32767,   -587,  32767,  32767,  32767,    813,
+		  -471,    -13,  32767,  32767,  32767,      0,    203,    411,
+		   470,      0,   -546,   -179,    146,      0,      0,  32767,
+		  -468,  32767,      0,      0,  32767,  32767,  32767,    211,
+		 32767,  32767,      0,  32767,      0,     52,  32767,      0,
+		 32767,      0,    692,    990,  32767,  32767,  32767,     56,
+		  -507,    784,    951,      0,  32767,      0,    697,  32767,
+		   187,      0,  32767,  32767,    430,   1209,    682,  32767,
+		   130,      0,    -25,      0,  -1006,      0,  32767,    214,
+		   433,     22,      0,  -1119,  32767,    285,  32767,  32767,
+		 32767,    216,  32767,  32767,  32767,    217,    527,  32767,
+		 32767,  32767,    829,    485,    419,    717,    620,    731,
+		 32767,    470,      0,   -145,   -620,   1162,   -644,    848,
+		   287,   -632,  32767,  32767,  32767,  32767,    381,  32767,
+		   510,    511,   -554,     -2,  32767,      0,      0,    698,
+		 32767,  32767,    436,   1154,  32767,    463,  32767,  32767,
+		   627,    517,  32767,  32767,    854,    579,    723,    396,
+		   110,    -42,    354,  32767,    664,  32767,  32767,      0,
+		     0,  32767,     65,   -163,     67,    140,     69,    341,
+		    70,     71,    402,     73,    623,    544,    624,    417,
+		 -1375,    648,  32767,    -26,    904,      0,    548,      0,
+		     0,  32767,  32767,    855,  32767,    488,   -524,    599,
+		   130,    131,  32767,  32767,    542,  -1110,   -324,   -462,
+		 32767,   -405,   -440,      0,      0,    629,    850,      0,
+		   741,    257,    258,  32767,  32767,      0,  32767,    923,
+		     0,  32767,      0,  32767,   1559,  32767,  32767,  32767,
+		   671,  32767,    134,  32767,  32767,   -336,   -104,    576,
+		   577,    829,  32767,  32767,    762,    902,  32767,      0,
+		 32767,      0,   1506,    887,  32767,    636,    601,   2465,
+		   426,      0,    236,    317,    427,    968,  32767,   -975,
+		  -559,   -343,    341,  32767,    937,    241,      0,  32767,
+		 32767,    547,  32767,  32767,  32767,  32767,  32767,    789,
+		     0,  32767,  32767,  32767,      0,      0,      0,  32767,
+		  -192,    859,   1185,   1153,     69,  32767,  32767,  32767,
+		  -539,  32767,  32767,      0,  32767,  32767,  32767,  32767,
+		   640,    578,  32767,  32767,   -766,  32767,  32767,  32767,
+		 32767,   1050,   -572,  32767,  32767,  32767,  32767,   1268,
+		 32767,  32767,  32767,    754,  32767,  32767,   1640,    179,
+		   804,  32767,  32767,  32767,  32767,      0,    684,    943,
+		  1006,  32767,  32767,    652,      0,  32767,   1041,  32767,
+		   718,    791,  32767,    274,    697,  32767,  32767,      0,
+		 32767,  32767,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    735,
+		     0,  32767,  32767,  32767,    275,    358,    688,  32767,
+		 32767,  32767,    548,    -87,    770,  32767,    -42,      0,
+		   551,  32767,    691,    222,  32767,  32767,  32767,  32767,
+		     0,   1273,    403,   -121,    806,    553,    554,    163,
+		 32767,  32767,    892,    825,  32767,  32767,   -490,  32767,
+		 32767,  32767,  32767,  32767,   -109,    744,    910,  32767,
+		    91,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		  1521,     50,    701,  32767,  32767,  32767,  32767,    164,
+		   658,  32767,    288,      0,  32767,      0,     51,      0,
+		 32767,  32767,  32767,  32767,    555,   1547,  32767,  32767,
+		   595,    585,    429,  32767,    -80,  32767,   1258,      0,
+		   540,    486,   -434,    865,      0,    192,      0,    884,
+		     0,      0,      0,    175,    555,      0,  32767,  32767,
+		     0,  32767,   -566,    866,    591,  32767,  32767,  32767,
+		 32767,  32767,    496,    495,   -215,  32767,    849,   -772,
+		 32767,  32767,    502,    178,    483,  32767,    912,    793,
+		   794,      0,  32767,  32767,  32767,   -556,    499,    838,
+		 32767,  32767,   -506,    331,      0,      0,  -1096,    512,
+		   880,      0,    774,   -338,    649,  32767,    270,  32767,
+		 32767,   -624,    328,    459,  32767,  32767,  32767,  32767,
+		   329,   -201,   -835,    813,   -879,    560,      0,   -212,
+		  -114,     35,   -494,     37,    523,    653,    751,   -653,
+		  -743,  32767,   1356,    818,  32767,  32767,    856,      0,
+		    44,    902,      0,      0,      0,      0,  32767,    -26,
+		   526,    795,    456,  32767,    104,   -209,   -341,    133,
+		  -372,      0,     45,    110,    111,      0,    511,     47,
+		   114,  32767,  32767,     93,     48,    116,  -1031,   -279,
+		 32767,    192,      0,  32767,    453,    415,      0,   -190,
+		 32767,    471,    240,    175,     29,    665,    684,      0,
+		   -11,    -95,   -344,  32767,    245,    148,      0,    530,
+		     0,   1185,   -615,   -712,    693,    784,  32767,      0,
+		  -776,  32767,  32767,   -813,      0,      0,      0,    207,
+		   208,  32767,    674,  32767,    742,   -289,    249,  32767,
+		   520,    929,    -50,    781,      0,   -778,  32767,      0,
+		   302,  32767,    720,   -465,      0,  32767,  32767,  32767,
+		     0,      0,  32767,    833,    328,    806,  32767,   -403,
+		     0,  32767,    -77,  32767,      0,    441,    930,  32767,
+		   643,      0,  32767,   1938,      0,   1334,    381,  32767,
+		   216,  32767,  32767,      0,  32767,    484,    383,      0,
+		   242,    395,      0,  32767,  32767,  32767,   -781,    355,
+		   356,  32767,    292,    706,  32767,  32767,  32767,  32767,
+		 32767,   -410,  32767,  32767,    782,  32767,    189,  32767,
+		 32767,    943,      0,   -212,    407,    335,      0,    135,
+		 32767,    616,      0,   -497,      0,    -67,    853,  32767,
+		   700,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,    459,    -48,  32767,     58,      0,
+		  -856,   1017,  32767,     59,    916,   -731,  32767,    940,
+		  -855,    347,    650,      0,    678,  32767,      0,  32767,
+		 32767,    530,  32767,      0,    -80,  32767,   -730,  32767,
+		  1214,    799,     58,    651,    841,      0,      0,   -589,
+		 -1530,   -478,    651,    652,     93,    576,  -1215,  32767,
+		   125,  32767,   1279,  32767,  32767,      0,  32767,      0,
+		  -367,    416,  -1236,  32767,    418,  32767,    815,    558,
+		   559,    781,    419,  32767,    739,  32767,      0,  32767,
+		   128,    570,   1349,   -298,    -66,      0,    147,   -488,
+		 32767,    590,    189,    274,    524,  32767,   1082,   -209,
+		 32767,    423,  32767,  32767,    975,    573,  32767,    424,
+		 32767,  32767,   1241,  32767,  32767,  32767,  32767,  32767,
+		   612,    391,  32767,      0,   -803,   1004,   -561,  32767,
+		 32767,    735,    870,  32767,      0,  32767,  32767,   -123,
+		    99,    210,    600,   1294,    109,   1053,  32767,    307,
+		   834,  32767,      0,   1651,  32767,    644,  32767,  32767,
+		     0,  32767,   -801,    385,    379,  32767,   -368,  32767,
+		 32767,    830,      0,  32767,  32767,    739,    371,    372,
+		  -275,  32767,  32767,    331,   -780,  32767,      0,   1229,
+		 -1462,    913,    266,    827,    125,  32767,  32767,  32767,
+		   393,  32767,    631,    -33,   -883,   -661,   -204,      6,
+		   -19,    257,      8,      9,    118,    519,    615,   -541,
+		  -893,      0,  32767,      0,   1156,     15,    900,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1022,    376,      0,
+		 32767,  32767,   -972,    676,    840,   -661,    631,     58,
+		     0,     17,  32767,      0,   -799,     82,      0,  32767,
+		 32767,    680,  32767,    905,      0,      0,  32767,  32767,
+		     0,      0,  32767,      0,    828,    386,    802,      0,
+		   146,      0,    148,  32767,  -1146,      0,    150,    151,
+		  -743,    153,    154,  32767,  32767,    442,  32767,    743,
+		     0,      0,    746,      0,  32767,  32767,  32767,     98,
+		 32767,    157,      0,    696,      0,  32767,  32767,   -294,
+		 32767,    158,    159,  32767,      0,  32767,    160,  32767,
+		   933,  32767,  32767,    -50,    759,    824,    162,    672,
+		 32767,    356,      0,    356,  32767,  32767,      0,      0,
+		   656,    692,    253,    254,   -374,    102,    256,  32767,
+		     0,      0,  32767,  32767,    259,  32767,     63,    260,
+		   510,    261,  32767,      0,  32767,   1061,  32767,    521,
+		 32767,  32767,  32767,  32767,  32767,  32767,    316,    317,
+		   846,      0,  32767,   -500,    318,      0,  32767,  32767,
+		   263,      0,    790,    872,  32767,  32767,  32767,   2171,
+		   264,  32767,  32767,  32767,  32767,    486,    334,    465,
+		 32767,    466,  32767,    444,    606,  32767,      0,    445,
+		   320,   -317,      0,    520,    322,    718,  32767,  32767,
+		 32767,      0,   1013,  32767,  32767,  32767,  32767,  32767,
+		 32767,    611,  32767,      0,      0,  32767,  32767,   -120,
+		   156,    613,      0,      0,  32767,    -68,  32767,    622,
+		 32767,  32767,  32767,  32767,  32767,    455,  32767,  32767,
+		 32767,    403,    533,      0,   -161,    405,     95,     96,
+		 32767,     97,  32767,      0,     29,      0,  32767,  32767,
+		    30,  32767,     99,  32767,  32767,      0,    161,  32767,
+		    97,      0,     32,  32767,  32767,      0,      0,    315,
+		 32767,  32767,    414,    966,      0,    585,  32767,  32767,
+		  -616,   -256,    171,    172,    666,    101,    562,    563,
+		 32767,     95,      0,      0,   1492,    390,   -251,    103,
+		 32767,      0,  32767,    188,   1487,  32767,      0,      0,
+		   586,    668,   -126,      0,      0,  32767,  32767,    204,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    656,  32767,  32767,
+		   599,      0,    222,  32767,      0,   1368,   -412,    435,
+		 32767,    936,  32767,    -17,  32767,    832,  32767,    437,
+		     0,   -518,    787,  32767,    864,   -449,      0,    636,
+		   713,    206,    592,    572,      0,    483,   -139,  32767,
+		 32767,    180,    818,  32767,  32767,   1304,      0,  32767,
+		   274,      0,      0,      0,      0,    705,  32767,  32767,
+		 32767,      0,   -272,      0,    502,    503,    319,      0,
+		 32767,      0,     13,  32767,  32767,      0,  32767,    270,
+		   737,      0,  32767,  32767,  32767,    901,  32767,    616,
+		   180,  32767,    721,    353,  32767,      0,  32767,  32767,
+		  -199,      0,    280,    788,  32767,    940,  32767,     51,
+		     0,    400,     53,      0,     54,   -637,      0,   -453,
+		     0,      0,      0,    380,      0,  32767,    504,      0,
+		  2049,      0,   -964,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,    798,  32767,  32767,  32767,      0,
+		   538,    488,      0,  32767,   -528,     57,    819,  32767,
+		 32767,   1244,      0,    488,    739,    908,  32767,  32767,
+		     0,  32767,  32767,      0,     55,    533,      0,  32767,
+		   814,      0,  32767,    458,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    776,    777,    920,      0,
+		     0,    755,  32767,      0,  32767,  32767,      0,  32767,
+		    55,   -954,      0,    372,    166,    218,    165,    857,
+		   221,    675,      0,    223,    224,   -155,    226,  32767,
+		  1851,    227,  32767,  32767,   1192,      0,    229,      0,
+		   -72,      0,    865,      0,      0,   -330,      0,    683,
+		 32767,   -550,   -196,    725,   -573,    293,    102,  32767,
+		  -589,    296,    297,    298,    231,   -256,    300,  32767,
+		 32767,    301,    233,    868,  32767,    234,      0,    811,
+		  1187,  32767,  32767,      0,  32767,    518,      0,    361,
+		   362,    466,      0,    365,  32767,   -179,    366,    367,
+		   874,    369,    305,      0,  32767,      0,  32767,      0,
+		 32767,   2000,   1215,    451,    652,      0,      0,    799,
+		 32767,  32767,  32767,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 8;
+	uint32		a = 0;
+	uint32		b = 0;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 17 + c;
+	}
+	return h[a % 1883] + h[b % 1883];
+}
+
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	Recomp_hash_func,
+	941
+};
-- 
2.22.0

