Browse Source

Plan 9 from Bell Labs 2013-05-01

David du Colombier 11 years ago
parent
commit
83d6593e6c

+ 1 - 1
386/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long	uintptr;
 typedef unsigned long	uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef union FPdbleword FPdbleword;
 typedef union FPdbleword FPdbleword;
 typedef long		jmp_buf[2];
 typedef long		jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
amd64/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long long uintptr;
 typedef unsigned long long uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef union FPdbleword FPdbleword;
 typedef union FPdbleword FPdbleword;
 typedef uintptr		jmp_buf[2];
 typedef uintptr		jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
arm/include/u.h

@@ -9,7 +9,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long	uintptr;
 typedef unsigned long	uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef 	union FPdbleword FPdbleword;
 typedef 	union FPdbleword FPdbleword;
 typedef long	jmp_buf[2];
 typedef long	jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 0 - 8
dist/replica/plan9.proto

@@ -31,12 +31,6 @@ usr	- sys sys
 # architectures owned by sys
 # architectures owned by sys
 386	- sys sys
 386	- sys sys
 	+	- sys sys
 	+	- sys sys
-68000	- sys sys
-	+	- sys sys
-68020	- sys sys
-	+	- sys sys
-alpha	- sys sys
-	+	- sys sys
 amd64	- sys sys
 amd64	- sys sys
 	+	- sys sys
 	+	- sys sys
 arm	- sys sys
 arm	- sys sys
@@ -49,8 +43,6 @@ power64	- sys sys
 	+	- sys sys
 	+	- sys sys
 sparc	- sys sys
 sparc	- sys sys
 	+	- sys sys
 	+	- sys sys
-sparc64	- sys sys
-	+	- sys sys
 
 
 # everything else is owned by sys
 # everything else is owned by sys
 acme	- sys sys
 acme	- sys sys

+ 0 - 8
dist/replica/plan9binary.proto

@@ -31,12 +31,6 @@ usr	- sys sys
 # architectures owned by sys
 # architectures owned by sys
 386	- sys sys
 386	- sys sys
 	+	- sys sys
 	+	- sys sys
-68000	- sys sys
-	+	- sys sys
-68020	- sys sys
-	+	- sys sys
-alpha	- sys sys
-	+	- sys sys
 amd64	- sys sys
 amd64	- sys sys
 	+	- sys sys
 	+	- sys sys
 arm	- sys sys
 arm	- sys sys
@@ -49,8 +43,6 @@ power64	- sys sys
 	+	- sys sys
 	+	- sys sys
 sparc	- sys sys
 sparc	- sys sys
 	+	- sys sys
 	+	- sys sys
-sparc64	- sys sys
-	+	- sys sys
 
 
 # everything else is owned by sys
 # everything else is owned by sys
 acme	- sys sys
 acme	- sys sys

+ 1 - 1
mips/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long	uintptr;
 typedef unsigned long	uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef 	union FPdbleword FPdbleword;
 typedef 	union FPdbleword FPdbleword;
 typedef long	jmp_buf[2];
 typedef long	jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
power/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long	uintptr;
 typedef unsigned long	uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef union FPdbleword FPdbleword;
 typedef union FPdbleword FPdbleword;
 typedef long		jmp_buf[2];
 typedef long		jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
power64/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long long uintptr;
 typedef unsigned long long uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef 	union FPdbleword FPdbleword;
 typedef 	union FPdbleword FPdbleword;
 typedef uintptr	jmp_buf[2];
 typedef uintptr	jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
sparc/include/u.h

@@ -8,7 +8,7 @@ typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
 typedef unsigned long	uintptr;
 typedef unsigned long	uintptr;
 typedef unsigned long	usize;
 typedef unsigned long	usize;
-typedef	ushort		Rune;
+typedef	uint		Rune;
 typedef 	union FPdbleword FPdbleword;
 typedef 	union FPdbleword FPdbleword;
 typedef long	jmp_buf[2];
 typedef long	jmp_buf[2];
 #define	JMPBUFSP	0
 #define	JMPBUFSP	0

+ 1 - 1
sys/include/ape/limits.h

@@ -3,7 +3,7 @@
 /* 8 bit chars (signed), 16 bit shorts, 32 bit ints/longs */
 /* 8 bit chars (signed), 16 bit shorts, 32 bit ints/longs */
 
 
 #define CHAR_BIT	8
 #define CHAR_BIT	8
-#define MB_LEN_MAX	3
+#define MB_LEN_MAX	4
 
 
 #define UCHAR_MAX	0xff
 #define UCHAR_MAX	0xff
 #define USHRT_MAX	0xffff
 #define USHRT_MAX	0xffff

+ 1 - 1
sys/include/ape/stdlib.h

@@ -6,7 +6,7 @@
 
 
 #define EXIT_FAILURE 1
 #define EXIT_FAILURE 1
 #define EXIT_SUCCESS 0
 #define EXIT_SUCCESS 0
-#define MB_CUR_MAX 3
+#define MB_CUR_MAX 4
 #define RAND_MAX 32767
 #define RAND_MAX 32767
 
 
 typedef struct { int quot, rem; } div_t;
 typedef struct { int quot, rem; } div_t;

+ 1 - 1
sys/include/ape/u.h

@@ -12,7 +12,7 @@ typedef unsigned int	uint;
 typedef   signed char	schar;
 typedef   signed char	schar;
 typedef	long long	vlong;
 typedef	long long	vlong;
 typedef	unsigned long long uvlong;
 typedef	unsigned long long uvlong;
-typedef	ushort		Rune;
+typedef	unsigned int		Rune;
 typedef 	union FPdbleword FPdbleword;
 typedef 	union FPdbleword FPdbleword;
 typedef	char*	p9va_list;
 typedef	char*	p9va_list;
 
 

+ 4 - 3
sys/include/ape/utf.h

@@ -7,14 +7,15 @@
 extern "C" { 
 extern "C" { 
 #endif
 #endif
 
 
-typedef unsigned short Rune;	/* 16 bits */
+typedef unsigned int Rune;	/* 32 bits */
 
 
 enum
 enum
 {
 {
-	UTFmax		= 3,		/* maximum bytes per rune */
+	UTFmax		= 4,		/* maximum bytes per rune */
 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
-	Runeerror	= 0x80,		/* decoding error in UTF */
+	Runeerror	= 0xFFFD,	/* decoding error in UTF */
+	Runemax		= 0x10FFFF,	/* 21-bit rune */
 };
 };
 
 
 /*
 /*

+ 1 - 1
sys/include/bio.h

@@ -7,7 +7,7 @@ typedef	struct	Biobufhdr	Biobufhdr;
 enum
 enum
 {
 {
 	Bsize		= 8*1024,
 	Bsize		= 8*1024,
-	Bungetsize	= 4,		/* space for ungetc */
+	Bungetsize	= UTFmax+1,		/* space for ungetc */
 	Bmagic		= 0x314159,
 	Bmagic		= 0x314159,
 	Beof		= -1,
 	Beof		= -1,
 	Bbad		= -2,
 	Bbad		= -2,

+ 6 - 4
sys/include/libc.h

@@ -41,12 +41,12 @@ extern	int	tokenize(char*, char**, int);
 
 
 enum
 enum
 {
 {
-	UTFmax		= 3,		/* maximum bytes per rune */
+	UTFmax		= 4,		/* maximum bytes per rune */
 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
-	Runemax		= 0xFFFF,	/* largest 16-bit character */
-	Runemask	= 0xFFFF,	/* bits used by runes (see grep) */
+	Runemax		= 0x10FFFF,	/* 21-bit rune */
+	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
 };
 };
 
 
 /*
 /*
@@ -80,12 +80,14 @@ extern	Rune*	runestrstr(Rune*, Rune*);
 extern	Rune	tolowerrune(Rune);
 extern	Rune	tolowerrune(Rune);
 extern	Rune	totitlerune(Rune);
 extern	Rune	totitlerune(Rune);
 extern	Rune	toupperrune(Rune);
 extern	Rune	toupperrune(Rune);
+extern	Rune tobaserune(Rune);
 extern	int	isalpharune(Rune);
 extern	int	isalpharune(Rune);
+extern	int	isbaserune(Rune);
+extern	int	isdigitrune(Rune);
 extern	int	islowerrune(Rune);
 extern	int	islowerrune(Rune);
 extern	int	isspacerune(Rune);
 extern	int	isspacerune(Rune);
 extern	int	istitlerune(Rune);
 extern	int	istitlerune(Rune);
 extern	int	isupperrune(Rune);
 extern	int	isupperrune(Rune);
-extern	int	isdigitrune(Rune);
 
 
 /*
 /*
  * malloc
  * malloc

+ 0 - 1
sys/lib/dist/setup

@@ -16,7 +16,6 @@ if (! test -e $dist/web.protect/plan9.iso) {
 	echo import web.protect failed: $dist/web.protect/plan9.iso missing \
 	echo import web.protect failed: $dist/web.protect/plan9.iso missing \
 		>[1=2]
 		>[1=2]
 
 
-	9fs outfsother
 	bind /n/outfsother/web.protect $dist/web.protect	# HACK
 	bind /n/outfsother/web.protect $dist/web.protect	# HACK
 	if (! test -e $dist/web.protect/plan9.iso) {
 	if (! test -e $dist/web.protect/plan9.iso) {
 		echo bind outfsother failed: $dist/web.protect/plan9.iso \
 		echo bind outfsother failed: $dist/web.protect/plan9.iso \

+ 2 - 2
sys/man/1/tr

@@ -62,9 +62,9 @@ character whose
 value is given by those digits.
 value is given by those digits.
 The character sequence
 The character sequence
 .L \ex
 .L \ex
-followed by 1, 2, 3, or 4 hexadecimal digits stands
+followed by 1 to 6 hexadecimal digits stands
 for the character whose
 for the character whose
-16-bit value is given by those digits.
+21-bit value is given by those digits.
 A 
 A 
 .L \e
 .L \e
 followed by any other character stands
 followed by any other character stands

+ 1 - 1
sys/man/2/bio

@@ -257,7 +257,7 @@ Otherwise, a zero is returned.
 calls
 calls
 .I Bputc
 .I Bputc
 to output the low order
 to output the low order
-16 bits of
+21 bits of
 .I c
 .I c
 as a rune
 as a rune
 in
 in

+ 1 - 1
sys/man/2/rune

@@ -54,7 +54,7 @@ bytes starting at
 and returns the number of bytes copied.
 and returns the number of bytes copied.
 .BR UTFmax ,
 .BR UTFmax ,
 defined as
 defined as
-.B 3
+.B 4
 in
 in
 .BR <libc.h> ,
 .BR <libc.h> ,
 is the maximum number of bytes required to represent a rune.
 is the maximum number of bytes required to represent a rune.

+ 1 - 1
sys/man/3/cons

@@ -51,7 +51,7 @@ and a backspace
 the previous non-kill, non-erase character from the input buffer.
 the previous non-kill, non-erase character from the input buffer.
 Killing and erasing only delete characters back to, but not including,
 Killing and erasing only delete characters back to, but not including,
 the last newline.
 the last newline.
-Characters typed at the keyboard actually produce 16-bit runes (see
+Characters typed at the keyboard actually produce 21-bit runes (see
 .IR utf (6)),
 .IR utf (6)),
 but the runes are translated into the variable-length
 but the runes are translated into the variable-length
 .SM UTF
 .SM UTF

+ 10 - 8
sys/man/6/utf

@@ -7,7 +7,7 @@ based on the Unicode Standard and on the ISO multibyte
 .SM UTF-8
 .SM UTF-8
 encoding (Universal Character
 encoding (Universal Character
 Set Transformation Format, 8 bits wide).
 Set Transformation Format, 8 bits wide).
-The Unicode Standard represents its characters in 16
+The Unicode Standard represents its characters in 21
 bits;
 bits;
 .SM UTF-8
 .SM UTF-8
 represents such
 represents such
@@ -19,7 +19,7 @@ is shortened to
 .PP
 .PP
 In Plan 9, a
 In Plan 9, a
 .I rune
 .I rune
-is a 16-bit quantity representing a Unicode character.
+is a 21-bit quantity representing a Unicode character.
 Internally, programs may store characters as runes.
 Internally, programs may store characters as runes.
 However, any external manifestation of textual information,
 However, any external manifestation of textual information,
 in files or at the interface between programs, uses a
 in files or at the interface between programs, uses a
@@ -65,19 +65,21 @@ a rune x is converted to a multibyte
 sequence
 sequence
 as follows:
 as follows:
 .PP
 .PP
-01.   x in [00000000.0bbbbbbb] → 0bbbbbbb
+01.   x in [000000.00000000.0bbbbbbb] → 0bbbbbbb
 .br
 .br
-10.   x in [00000bbb.bbbbbbbb] → 110bbbbb, 10bbbbbb
+10.   x in [000000.00000bbb.bbbbbbbb] → 110bbbbb, 10bbbbbb
 .br
 .br
-11.   x in [bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb
+11.   x in [000000.bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb
+.br
+100. x in [bbbbbb.bbbbbbbb.bbbbbbbb] → 1110bbbb, 10bbbbbb, 10bbbbbb, 10bbbbbb
 .br
 .br
 .PP
 .PP
 Conversion 01 provides a one-byte sequence that spans the
 Conversion 01 provides a one-byte sequence that spans the
 .SM ASCII
 .SM ASCII
 character set in a compatible way.
 character set in a compatible way.
-Conversions 10 and 11 represent higher-valued characters
-as sequences of two or three bytes with the high bit set.
-Plan 9 does not support the 4, 5, and 6 byte sequences proposed by X-Open.
+Conversions 10, 11 and 100 represent higher-valued characters
+as sequences of two, three or four bytes with the high bit set.
+Plan 9 does not support the 5 and 6 byte sequences proposed by X-Open.
 When there are multiple ways to encode a value, for example rune 0,
 When there are multiple ways to encode a value, for example rune 0,
 the shortest encoding is used.
 the shortest encoding is used.
 .PP
 .PP

+ 19 - 14
sys/src/9/port/latin1.c

@@ -1,5 +1,5 @@
-#include <u.h>
-
+#include	"u.h"
+#include	"../port/lib.h"
 /*
 /*
  * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
  * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
  * prefix of latintab[j].ld only when j<i.
  * prefix of latintab[j].ld only when j<i.
@@ -15,23 +15,23 @@ struct cvlist
 };
 };
 
 
 /*
 /*
- * Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
+ * Given n characters k[0]..k[n-1], find the rune or return -1 for failure.
  */
  */
 long
 long
-unicode(Rune *k)
+unicode(Rune *k, int n)
 {
 {
-	long i, c;
+	long c;
+	Rune *r;
 
 
-	k++;	/* skip 'X' */
 	c = 0;
 	c = 0;
-	for(i=0; i<4; i++,k++){
+	for(r = &k[1]; r<&k[n]; r++){		/* +1 to skip [Xx] */
 		c <<= 4;
 		c <<= 4;
-		if('0'<=*k && *k<='9')
-			c += *k-'0';
-		else if('a'<=*k && *k<='f')
-			c += 10 + *k-'a';
-		else if('A'<=*k && *k<='F')
-			c += 10 + *k-'A';
+		if('0'<=*r && *r<='9')
+			c += *r-'0';
+		else if('a'<=*r && *r<='f')
+			c += 10 + *r-'a';
+		else if('A'<=*r && *r<='F')
+			c += 10 + *r-'A';
 		else
 		else
 			return -1;
 			return -1;
 	}
 	}
@@ -52,9 +52,14 @@ latin1(Rune *k, int n)
 
 
 	if(k[0] == 'X')
 	if(k[0] == 'X')
 		if(n>=5)
 		if(n>=5)
-			return unicode(k);
+			return unicode(k, 5);
 		else
 		else
 			return -5;
 			return -5;
+	if(k[0] == 'x')
+		if(n>=UTFmax*2+1)
+			return unicode(k, UTFmax*2+1);
+		else
+			return -(UTFmax+1);
 	for(l=latintab; l->ld!=0; l++)
 	for(l=latintab; l->ld!=0; l++)
 		if(k[0] == l->ld[0]){
 		if(k[0] == l->ld[0]){
 			if(n == 1)
 			if(n == 1)

+ 6 - 4
sys/src/9/port/lib.h

@@ -35,10 +35,12 @@ extern	int	cistrncmp(char*, char*, int);
 
 
 enum
 enum
 {
 {
-	UTFmax		= 3,	/* maximum bytes per rune */
-	Runesync	= 0x80,	/* cannot represent part of a UTF sequence */
-	Runeself	= 0x80,	/* rune and UTF sequences are the same (<) */
-	Runeerror	= 0x80,	/* decoding error in UTF */
+	UTFmax		= 4,		/* maximum bytes per rune */
+	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
+	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
+	Runeerror	= 0xFFFD,	/* decoding error in UTF */
+	Runemax		= 0x10FFFF,	/* 24 bit rune */
+	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
 };
 };
 
 
 /*
 /*

+ 74 - 56
sys/src/ape/lib/ap/gen/mbwc.c

@@ -1,4 +1,5 @@
 #include <stdlib.h>
 #include <stdlib.h>
+#include <limits.h>
 
 
 /*
 /*
  * Use the FSS-UTF transformation proposed by posix.
  * Use the FSS-UTF transformation proposed by posix.
@@ -7,67 +8,80 @@
  *	Tx	10xxxxxx	6 free bits
  *	Tx	10xxxxxx	6 free bits
  *	T1	110xxxxx	5 free bits
  *	T1	110xxxxx	5 free bits
  *	T2	1110xxxx	4 free bits
  *	T2	1110xxxx	4 free bits
+ *	T3	11110xxx	3 free bits
+ *	T4	111110xx	2 free bits
+ *	T5	1111110x	1 free bit
  *
  *
  *	Encoding is as follows.
  *	Encoding is as follows.
  *	From hex	Thru hex	Sequence		Bits
  *	From hex	Thru hex	Sequence		Bits
- *	00000000	0000007F	T0			7
+ *	00000000	0000007F	T0				7
  *	00000080	000007FF	T1 Tx			11
  *	00000080	000007FF	T1 Tx			11
- *	00000800	0000FFFF	T2 Tx Tx		16
+ *	00000800	0000FFFF	T2 Tx Tx			16
+ *	00010000	001FFFFF	T3 Tx Tx Tx		21
+ *	00200000	03FFFFFF	T4 Tx Tx Tx Tx		26
+ *	04000000	7FFFFFFF	T5 Tx Tx  Tx Tx Tx	31
  */
  */
+int
+mbtowc(wchar_t *pwc, const char *s, size_t n);
 
 
 int
 int
 mblen(const char *s, size_t n)
 mblen(const char *s, size_t n)
 {
 {
-
 	return mbtowc(0, s, n);
 	return mbtowc(0, s, n);
 }
 }
 
 
+enum {
+	C0MSK = 0x7F,
+	C1MSK = 0x7FF,
+	T1 = 0xC0,
+	T2 = 0xE0,
+	NT1BITS = 11,
+	NSHFT = 5,
+	NCSHFT = NSHFT + 1,
+	WCHARMSK = (1<< (8*MB_LEN_MAX - 1)) - 1,
+};
+
 int
 int
 mbtowc(wchar_t *pwc, const char *s, size_t n)
 mbtowc(wchar_t *pwc, const char *s, size_t n)
 {
 {
-	int c, c1, c2;
-	long l;
+	unsigned long long c[MB_LEN_MAX];
+	unsigned long long l, m, wm, b;
+	int i;
 
 
 	if(!s)
 	if(!s)
 		return 0;
 		return 0;
 
 
 	if(n < 1)
 	if(n < 1)
 		goto bad;
 		goto bad;
-	c = s[0] & 0xff;
-	if((c & 0x80) == 0x00) {
+
+	c[0] = s[0] & 0xff;		/* first one is special */
+	if((c[0] & 0x80) == 0x00) {
 		if(pwc)
 		if(pwc)
-			*pwc = c;
-		if(c == 0)
+			*pwc = c[0];
+		if(c[0] == 0)
 			return 0;
 			return 0;
 		return 1;
 		return 1;
 	}
 	}
 
 
-	if(n < 2)
-		goto bad;
-	c1 = (s[1] ^ 0x80) & 0xff;
-	if((c1 & 0xC0) != 0x00)
-		goto bad;
-	if((c & 0xE0) == 0xC0) {
-		l = ((c << 6) | c1) & 0x7FF;
-		if(l < 0x080)
+	m = T2;
+	b = m^0x20;
+	l = c[0];
+	wm = C1MSK;
+	for(i = 1; i < MB_LEN_MAX + 1; i++){
+		if(n < i+1)
 			goto bad;
 			goto bad;
-		if(pwc)
-			*pwc = l;
-		return 2;
-	}
-
-	if(n < 3)
-		goto bad;
-	c2 = (s[2] ^ 0x80) & 0xff;
-	if((c2 & 0xC0) != 0x00)
-		goto bad;
-	if((c & 0xF0) == 0xE0) {
-		l = ((((c << 6) | c1) << 6) | c2) & 0xFFFF;
-		if(l < 0x0800)
+		c[i] = (s[i] ^ 0x80) & 0xff;
+		l = (l << NCSHFT) | c[i];
+		if((c[i] & 0xC0) != 0x00)
 			goto bad;
 			goto bad;
-		if(pwc)
-			*pwc = l;
-		return 3;
+		if((c[0] & m) == b) {
+			if(pwc)
+				*pwc = l & wm;
+			return i + 1;
+		}
+		b = m;
+		m = (m >> 1) | 0x80;
+		wm = (wm << NSHFT) | wm;
 	}
 	}
 
 
 	/*
 	/*
@@ -81,27 +95,32 @@ bad:
 int
 int
 wctomb(char *s, wchar_t wchar)
 wctomb(char *s, wchar_t wchar)
 {
 {
-	long c;
+	unsigned long long c, maxc, m;
+	int i, j;
 
 
 	if(!s)
 	if(!s)
 		return 0;
 		return 0;
 
 
-	c = wchar & 0xFFFF;
-	if(c < 0x80) {
+	maxc = 0x80;
+	c = wchar & WCHARMSK;
+	if(c < maxc) {
 		s[0] = c;
 		s[0] = c;
 		return 1;
 		return 1;
 	}
 	}
 
 
-	if(c < 0x800) {
-		s[0] = 0xC0 | (c >> 6);
-		s[1] = 0x80 | (c & 0x3F);
-		return 2;
+	m = T1;
+	for(i = 2; i < MB_LEN_MAX + 1; i++){
+		maxc <<= 4;
+		if(c < maxc || i == MB_LEN_MAX){
+			s[0] = m | (c >> ((i - 1) * NCSHFT));
+			for(j = i - 1; j >= 1; j--){
+				s[i - j] = 0x80|((c>>(6 * (j - 1)))&0x3f);
+			}
+			return i;
+		}
+		m = (m >> 1) | 0x80;
 	}
 	}
-
-	s[0] = 0xE0 |  (c >> 12);
-	s[1] = 0x80 | ((c >> 6) & 0x3F);
-	s[2] = 0x80 |  (c & 0x3F);
-	return 3;
+	return MB_LEN_MAX;
 }
 }
 
 
 size_t
 size_t
@@ -117,7 +136,7 @@ mbstowcs(wchar_t *pwcs, const char *s, size_t n)
 				break;
 				break;
 			s++;
 			s++;
 		} else {
 		} else {
-			d = mbtowc(pwcs, s, 3);
+			d = mbtowc(pwcs, s, MB_LEN_MAX);
 			if(d <= 0)
 			if(d <= 0)
 				return (size_t)((d<0) ? -1 : i);
 				return (size_t)((d<0) ? -1 : i);
 			s += d;
 			s += d;
@@ -133,10 +152,10 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 	int i, d;
 	int i, d;
 	long c;
 	long c;
 	char *p, *pe;
 	char *p, *pe;
-	char buf[3];
+	char buf[MB_LEN_MAX];
 
 
 	p = s;
 	p = s;
-	pe = p+n-3;
+	pe = p+n-MB_LEN_MAX;
 	while(p < pe) {
 	while(p < pe) {
 		c = *pwcs++;
 		c = *pwcs++;
 		if(c < 0x80)
 		if(c < 0x80)
@@ -146,15 +165,15 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 		if(c == 0)
 		if(c == 0)
 			return p-s;
 			return p-s;
 	}
 	}
-	while(p < pe+3) {
+	while(p < pe+MB_LEN_MAX) {
 		c = *pwcs++;
 		c = *pwcs++;
 		d = wctomb(buf, c);
 		d = wctomb(buf, c);
-		if(p+d <= pe+3) {
-			*p++ = buf[0];
-			if(d > 1) {
-				*p++ = buf[2];
-				if(d > 2)
-					*p++ = buf[3];
+		if(p+d <= pe+MB_LEN_MAX) {
+			*p++ = buf[0];		/* first one is special */
+			for(i = 2; i < MB_LEN_MAX + 1; i++){
+				if(d <= i -1)
+					break;
+				*p++ = buf[i];
 			}
 			}
 		}
 		}
 		if(c == 0)
 		if(c == 0)
@@ -162,4 +181,3 @@ wcstombs(char *s, const wchar_t *pwcs, size_t n)
 	}
 	}
 	return p-s;
 	return p-s;
 }
 }
-

+ 74 - 23
sys/src/ape/lib/utf/rune.c

@@ -23,27 +23,33 @@ enum
 	Bit2	= 5,
 	Bit2	= 5,
 	Bit3	= 4,
 	Bit3	= 4,
 	Bit4	= 3,
 	Bit4	= 3,
+	Bit5	= 2,
 
 
 	T1	= ((1<<(Bit1+1))-1) ^ 0xFF,	/* 0000 0000 */
 	T1	= ((1<<(Bit1+1))-1) ^ 0xFF,	/* 0000 0000 */
 	Tx	= ((1<<(Bitx+1))-1) ^ 0xFF,	/* 1000 0000 */
 	Tx	= ((1<<(Bitx+1))-1) ^ 0xFF,	/* 1000 0000 */
 	T2	= ((1<<(Bit2+1))-1) ^ 0xFF,	/* 1100 0000 */
 	T2	= ((1<<(Bit2+1))-1) ^ 0xFF,	/* 1100 0000 */
 	T3	= ((1<<(Bit3+1))-1) ^ 0xFF,	/* 1110 0000 */
 	T3	= ((1<<(Bit3+1))-1) ^ 0xFF,	/* 1110 0000 */
 	T4	= ((1<<(Bit4+1))-1) ^ 0xFF,	/* 1111 0000 */
 	T4	= ((1<<(Bit4+1))-1) ^ 0xFF,	/* 1111 0000 */
+	T5	= ((1<<(Bit5+1))-1) ^ 0xFF,	/* 1111 1000 */
 
 
-	Rune1	= (1<<(Bit1+0*Bitx))-1,		/* 0000 0000 0111 1111 */
-	Rune2	= (1<<(Bit2+1*Bitx))-1,		/* 0000 0111 1111 1111 */
-	Rune3	= (1<<(Bit3+2*Bitx))-1,		/* 1111 1111 1111 1111 */
+	Rune1	= (1<<(Bit1+0*Bitx))-1,		/* 0000 0000 0000 0000 0111 1111 */
+	Rune2	= (1<<(Bit2+1*Bitx))-1,		/* 0000 0000 0000 0111 1111 1111 */
+	Rune3	= (1<<(Bit3+2*Bitx))-1,		/* 0000 0000 1111 1111 1111 1111 */
+	Rune4	= (1<<(Bit4+3*Bitx))-1,		/* 0001 1111 1111 1111 1111 1111 */
 
 
 	Maskx	= (1<<Bitx)-1,			/* 0011 1111 */
 	Maskx	= (1<<Bitx)-1,			/* 0011 1111 */
 	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
 	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
 
 
+	SurrogateMin	= 0xD800,
+	SurrogateMax	= 0xDFFF,
+
 	Bad	= Runeerror,
 	Bad	= Runeerror,
 };
 };
 
 
 int
 int
 chartorune(Rune *rune, char *str)
 chartorune(Rune *rune, char *str)
 {
 {
-	int c, c1, c2;
+	int c, c1, c2, c3;
 	long l;
 	long l;
 
 
 	/*
 	/*
@@ -58,7 +64,7 @@ chartorune(Rune *rune, char *str)
 
 
 	/*
 	/*
 	 * two character sequence
 	 * two character sequence
-	 *	0080-07FF => T2 Tx
+	 *	00080-007FF => T2 Tx
 	 */
 	 */
 	c1 = *(uchar*)(str+1) ^ Tx;
 	c1 = *(uchar*)(str+1) ^ Tx;
 	if(c1 & Testx)
 	if(c1 & Testx)
@@ -75,19 +81,41 @@ chartorune(Rune *rune, char *str)
 
 
 	/*
 	/*
 	 * three character sequence
 	 * three character sequence
-	 *	0800-FFFF => T3 Tx Tx
+	 *	00800-0FFFF => T3 Tx Tx
 	 */
 	 */
 	c2 = *(uchar*)(str+2) ^ Tx;
 	c2 = *(uchar*)(str+2) ^ Tx;
+
 	if(c2 & Testx)
 	if(c2 & Testx)
 		goto bad;
 		goto bad;
 	if(c < T4) {
 	if(c < T4) {
 		l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
 		l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
 		if(l <= Rune2)
 		if(l <= Rune2)
 			goto bad;
 			goto bad;
+		if (SurrogateMin <= l && l <= SurrogateMax)
+			goto bad;
 		*rune = l;
 		*rune = l;
 		return 3;
 		return 3;
 	}
 	}
 
 
+	/*
+	 * four character sequence
+	 *	10000-10FFFF => T4 Tx Tx Tx
+	 */
+	if(UTFmax >= 4) {
+		c3 = *(uchar*)(str+3) ^ Tx;
+		if(c3 & Testx)
+			goto bad;
+		if(c < T5) {
+			l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
+			if(l <= Rune3)
+				goto bad;
+			if(l > Runemax)
+				goto bad;
+			*rune = l;
+			return 4;
+		}
+	}
+
 	/*
 	/*
 	 * bad decoding
 	 * bad decoding
 	 */
 	 */
@@ -120,15 +148,37 @@ runetochar(char *str, Rune *rune)
 		str[1] = Tx | (c & Maskx);
 		str[1] = Tx | (c & Maskx);
 		return 2;
 		return 2;
 	}
 	}
+	/*
+	 * If the Rune is out of range or a surrogate half, convert it to the error rune.
+	 * Do this test here because the error rune encodes to three bytes.
+	 * Doing it earlier would duplicate work, since an out of range
+	 * Rune wouldn't have fit in one or two bytes.
+	 */
+	if (c > Runemax)
+		c = Runeerror;
+	if (SurrogateMin <= c && c <= SurrogateMax)
+		c = Runeerror;
 
 
 	/*
 	/*
 	 * three character sequence
 	 * three character sequence
 	 *	0800-FFFF => T3 Tx Tx
 	 *	0800-FFFF => T3 Tx Tx
 	 */
 	 */
-	str[0] = T3 |  (c >> 2*Bitx);
-	str[1] = Tx | ((c >> 1*Bitx) & Maskx);
-	str[2] = Tx |  (c & Maskx);
-	return 3;
+	if (c <= Rune3) {
+		str[0] = T3 |  (c >> 2*Bitx);
+		str[1] = Tx | ((c >> 1*Bitx) & Maskx);
+		str[2] = Tx |  (c & Maskx);
+		return 3;
+	}
+
+	/*
+	 * four character sequence (21-bit value)
+	 *     10000-1FFFFF => T4 Tx Tx Tx
+	 */
+	str[0] = T4 | (c >> 3*Bitx);
+	str[1] = Tx | ((c >> 2*Bitx) & Maskx);
+	str[2] = Tx | ((c >> 1*Bitx) & Maskx);
+	str[3] = Tx | (c & Maskx);
+	return 4;
 }
 }
 
 
 int
 int
@@ -151,11 +201,12 @@ runenlen(Rune *r, int nrune)
 		c = *r++;
 		c = *r++;
 		if(c <= Rune1)
 		if(c <= Rune1)
 			nb++;
 			nb++;
-		else
-		if(c <= Rune2)
+		else if(c <= Rune2)
 			nb += 2;
 			nb += 2;
+		else if(c <= Rune3)
+ 			nb += 3;
 		else
 		else
-			nb += 3;
+			nb += 4;
 	}
 	}
 	return nb;
 	return nb;
 }
 }
@@ -164,14 +215,14 @@ int
 fullrune(char *str, int n)
 fullrune(char *str, int n)
 {
 {
 	int c;
 	int c;
-
-	if(n > 0) {
-		c = *(uchar*)str;
-		if(c < Tx)
-			return 1;
-		if(n > 1)
-			if(c < T3 || n > 2)
-				return 1;
-	}
-	return 0;
+	if(n <= 0)
+		return 0;
+	c = *(uchar*)str;
+	if(c < Tx)
+		return 1;
+	if(c < T3)
+		return n >= 2;
+	if(c < T4)
+		return n >= 3;
+	return n >= 4;
 }
 }

+ 2 - 2
sys/src/cmd/cc/lex.c

@@ -1070,7 +1070,7 @@ loop:
 		 */
 		 */
 		i = 2;
 		i = 2;
 		if(longflg)
 		if(longflg)
-			i = 4;
+			i = 6;
 		l = 0;
 		l = 0;
 		for(; i>0; i--) {
 		for(; i>0; i--) {
 			c = getc();
 			c = getc();
@@ -1100,7 +1100,7 @@ loop:
 		 */
 		 */
 		i = 2;
 		i = 2;
 		if(longflg)
 		if(longflg)
-			i = 5;
+			i = 8;
 		l = c - '0';
 		l = c - '0';
 		for(; i>0; i--) {
 		for(; i>0; i--) {
 			c = getc();
 			c = getc();

+ 20 - 0
sys/src/cmd/page/pdfprolog.c

@@ -0,0 +1,20 @@
+"/Page null def\n"
+"/Page# 0 def\n"
+"/PDFSave null def\n"
+"/DSCPageCount 0 def\n"
+"/DoPDFPage {dup /Page# exch store pdfgetpage pdfshowpage } def\n"
+"\n"
+"/pdfshowpage_mysetpage {	% <pagedict> pdfshowpage_mysetpage <pagedict>\n"
+"  dup /CropBox pget {\n"
+"      boxrect\n"
+"      2 array astore /PageSize exch 4 2 roll\n"
+"      4 index /Rotate pget {\n"
+"        dup 0 lt {360 add} if 90 idiv {exch neg} repeat\n"
+"      } if\n"
+"      exch neg exch 2 array astore /PageOffset exch\n"
+"      << 5 1 roll >> setpagedevice\n"
+"  } if\n"
+"} bind def\n"
+"\n"
+"GS_PDF_ProcSet begin\n"
+"pdfdict begin\n"

+ 1 - 1
sys/src/cmd/tcs/plan9.h

@@ -1,4 +1,4 @@
-typedef unsigned short Rune;		/* 16 bits */
+typedef unsigned long Rune;		/* 21 bits */
 typedef unsigned char uchar;
 typedef unsigned char uchar;
 #define		Runeerror	0x80	/* decoding error in UTF */
 #define		Runeerror	0x80	/* decoding error in UTF */
 #define		Runeself	0x80	/* rune and UTF sequences are the same (<) */
 #define		Runeself	0x80	/* rune and UTF sequences are the same (<) */

+ 89 - 85
sys/src/libc/port/rune.c

@@ -1,26 +1,24 @@
 #include	<u.h>
 #include	<u.h>
 #include	<libc.h>
 #include	<libc.h>
 
 
+#define Bit(i) (7-(i))
+/* N 0's preceded by i 1's, T(Bit(2)) is 1100 0000 */
+#define T(i) (((1 << (Bit(i)+1))-1) ^ 0xFF)
+/* 0000 0000 0000 0111 1111 1111 */
+#define	RuneX(i) ((1 << (Bit(i) + ((i)-1)*Bitx))-1)
+
 enum
 enum
 {
 {
-	Bit1	= 7,
-	Bitx	= 6,
-	Bit2	= 5,
-	Bit3	= 4,
-	Bit4	= 3,
+	Bitx	= Bit(1),
 
 
-	T1	= ((1<<(Bit1+1))-1) ^ 0xFF,	/* 0000 0000 */
-	Tx	= ((1<<(Bitx+1))-1) ^ 0xFF,	/* 1000 0000 */
-	T2	= ((1<<(Bit2+1))-1) ^ 0xFF,	/* 1100 0000 */
-	T3	= ((1<<(Bit3+1))-1) ^ 0xFF,	/* 1110 0000 */
-	T4	= ((1<<(Bit4+1))-1) ^ 0xFF,	/* 1111 0000 */
+	Tx	= T(1),			/* 1000 0000 */
+	Rune1 = (1<<(Bit(0)+0*Bitx))-1,	/* 0000 0000 0000 0000 0111 1111 */
 
 
-	Rune1	= (1<<(Bit1+0*Bitx))-1,		/* 0000 0000 0111 1111 */
-	Rune2	= (1<<(Bit2+1*Bitx))-1,		/* 0000 0111 1111 1111 */
-	Rune3	= (1<<(Bit3+2*Bitx))-1,		/* 1111 1111 1111 1111 */
+	Maskx	= (1<<Bitx)-1,		/* 0011 1111 */
+	Testx	= Maskx ^ 0xFF,		/* 1100 0000 */
 
 
-	Maskx	= (1<<Bitx)-1,			/* 0011 1111 */
-	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
+	SurrogateMin	= 0xD800,
+	SurrogateMax	= 0xDFFF,
 
 
 	Bad	= Runeerror,
 	Bad	= Runeerror,
 };
 };
@@ -28,49 +26,42 @@ enum
 int
 int
 chartorune(Rune *rune, char *str)
 chartorune(Rune *rune, char *str)
 {
 {
-	int c, c1, c2;
-	long l;
+	int c[UTFmax], i;
+	Rune l;
 
 
 	/*
 	/*
-	 * one character sequence
+	 * N character sequence
 	 *	00000-0007F => T1
 	 *	00000-0007F => T1
+	 *	00080-007FF => T2 Tx
+	 *	00800-0FFFF => T3 Tx Tx
+	 *	10000-10FFFF => T4 Tx Tx Tx
 	 */
 	 */
-	c = *(uchar*)str;
-	if(c < Tx) {
-		*rune = c;
-		return 1;
-	}
 
 
-	/*
-	 * two character sequence
-	 *	0080-07FF => T2 Tx
-	 */
-	c1 = *(uchar*)(str+1) ^ Tx;
-	if(c1 & Testx)
-		goto bad;
-	if(c < T3) {
-		if(c < T2)
-			goto bad;
-		l = ((c << Bitx) | c1) & Rune2;
-		if(l <= Rune1)
-			goto bad;
-		*rune = l;
-		return 2;
+	c[0] = *(uchar*)(str);
+	if(c[0] < Tx){
+		*rune = c[0];
+		return 1;
 	}
 	}
+	l = c[0];
 
 
-	/*
-	 * three character sequence
-	 *	0800-FFFF => T3 Tx Tx
-	 */
-	c2 = *(uchar*)(str+2) ^ Tx;
-	if(c2 & Testx)
-		goto bad;
-	if(c < T4) {
-		l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
-		if(l <= Rune2)
+	for(i = 1; i < UTFmax; i++) {
+		c[i] = *(uchar*)(str+i);
+		c[i] ^= Tx;
+		if(c[i] & Testx)
 			goto bad;
 			goto bad;
-		*rune = l;
-		return 3;
+		l = (l << Bitx) | c[i];
+		if(c[0] < T(i + 2)) {
+			l &= RuneX(i + 1);
+			if(i == 1) {
+				if(c[0] < T(2) || l <= Rune1)
+					goto bad;
+			} else if(l <= RuneX(i) || l > Runemax)
+				goto bad;
+			if (i == 2 && SurrogateMin <= l && l <= SurrogateMax)
+				goto bad;
+			*rune = l;
+			return i + 1;
+		}
 	}
 	}
 
 
 	/*
 	/*
@@ -84,12 +75,9 @@ bad:
 int
 int
 runetochar(char *str, Rune *rune)
 runetochar(char *str, Rune *rune)
 {
 {
-	long c;
+	int i, j;
+	Rune c;
 
 
-	/*
-	 * one character sequence
-	 *	00000-0007F => 00-7F
-	 */
 	c = *rune;
 	c = *rune;
 	if(c <= Rune1) {
 	if(c <= Rune1) {
 		str[0] = c;
 		str[0] = c;
@@ -97,23 +85,35 @@ runetochar(char *str, Rune *rune)
 	}
 	}
 
 
 	/*
 	/*
+	 * one character sequence
+	 *	00000-0007F => 00-7F
 	 * two character sequence
 	 * two character sequence
 	 *	0080-07FF => T2 Tx
 	 *	0080-07FF => T2 Tx
-	 */
-	if(c <= Rune2) {
-		str[0] = T2 | (c >> 1*Bitx);
-		str[1] = Tx | (c & Maskx);
-		return 2;
-	}
-
-	/*
 	 * three character sequence
 	 * three character sequence
 	 *	0800-FFFF => T3 Tx Tx
 	 *	0800-FFFF => T3 Tx Tx
+	 * four character sequence (21-bit value)
+	 *     10000-1FFFFF => T4 Tx Tx Tx
+	 * If the Rune is out of range or a surrogate half,
+	 * convert it to the error rune.
+	 * Do this test when i==3 because the error rune encodes to three bytes.
+	 * Doing it earlier would duplicate work, since an out of range
+	 * Rune wouldn't have fit in one or two bytes.
 	 */
 	 */
-	str[0] = T3 |  (c >> 2*Bitx);
-	str[1] = Tx | ((c >> 1*Bitx) & Maskx);
-	str[2] = Tx |  (c & Maskx);
-	return 3;
+	for(i = 2; i < UTFmax + 1; i++){
+		if(i == 3){
+			if(c > Runemax)
+				c = Runeerror;
+			if(SurrogateMin <= c && c <= SurrogateMax)
+				c = Runeerror;
+		}
+		if (c <= RuneX(i) || i == UTFmax ) {
+			str[0] = T(i) |  (c >> (i - 1)*Bitx);
+			for(j = 1; j < i; j++)
+				str[j] = Tx | ((c >> (i - j - 1)*Bitx) & Maskx);
+			return i;
+		}
+	}
+	return UTFmax;
 }
 }
 
 
 int
 int
@@ -129,18 +129,21 @@ runelen(long c)
 int
 int
 runenlen(Rune *r, int nrune)
 runenlen(Rune *r, int nrune)
 {
 {
-	int nb, c;
+	int nb, i;
+	Rune c;
 
 
 	nb = 0;
 	nb = 0;
 	while(nrune--) {
 	while(nrune--) {
 		c = *r++;
 		c = *r++;
-		if(c <= Rune1)
+		if(c <= Rune1){
 			nb++;
 			nb++;
-		else
-		if(c <= Rune2)
-			nb += 2;
-		else
-			nb += 3;
+		} else {
+			for(i = 2; i < UTFmax + 1; i++)
+				if(c <= RuneX(i) || i == UTFmax){
+					nb += i;
+					break;
+				}
+		}
 	}
 	}
 	return nb;
 	return nb;
 }
 }
@@ -148,15 +151,16 @@ runenlen(Rune *r, int nrune)
 int
 int
 fullrune(char *str, int n)
 fullrune(char *str, int n)
 {
 {
-	int c;
-
-	if(n > 0) {
-		c = *(uchar*)str;
-		if(c < Tx)
-			return 1;
-		if(n > 1)
-			if(c < T3 || n > 2)
-				return 1;
-	}
-	return 0;
+	int  i;
+	Rune c;
+
+	if(n <= 0)
+		return 0;
+	c = *(uchar*)str;
+	if(c < Tx)
+		return 1;
+	for(i = 3; i < UTFmax + 1; i++)
+		if(c < T(i))
+			return n >= i - 1;
+	return n >= UTFmax;
 }
 }

+ 551 - 553
sys/src/libc/port/runebase.c

@@ -1252,8 +1252,7 @@ static Rune	_base2[] =
 	0xfa69,	0x97ff,	/* 響 響 */
 	0xfa69,	0x97ff,	/* 響 響 */
 	0xfa6a,	0x983b,	/* 頻 頻 */
 	0xfa6a,	0x983b,	/* 頻 頻 */
 	0xfa6b,	0x6075,	/* 恵 恵 */
 	0xfa6b,	0x6075,	/* 恵 恵 */
-#ifdef UNICODE4
-	0xfa6c,	0x242ee,	/* 𤋮 ���� */
+	0xfa6c,	0x242ee,	/* 𤋮 𤋮 */
 	0xfa6d,	0x8218,	/* 舘 舘 */
 	0xfa6d,	0x8218,	/* 舘 舘 */
 	0xfa70,	0x4e26,	/* 並 並 */
 	0xfa70,	0x4e26,	/* 並 並 */
 	0xfa71,	0x51b5,	/* 况 况 */
 	0xfa71,	0x51b5,	/* 况 况 */
@@ -1350,15 +1349,15 @@ static Rune	_base2[] =
 	0xfacc,	0x983b,	/* 頻 頻 */
 	0xfacc,	0x983b,	/* 頻 頻 */
 	0xfacd,	0x9b12,	/* 鬒 鬒 */
 	0xfacd,	0x9b12,	/* 鬒 鬒 */
 	0xface,	0x9f9c,	/* 龜 龜 */
 	0xface,	0x9f9c,	/* 龜 龜 */
-	0xfacf,	0x2284a,	/* 𢡊 ���� */
-	0xfad0,	0x22844,	/* 𢡄 ���� */
-	0xfad1,	0x233d5,	/* 𣏕 ���� */
+	0xfacf,	0x2284a,	/* 𢡊 𢡊 */
+	0xfad0,	0x22844,	/* 𢡄 𢡄 */
+	0xfad1,	0x233d5,	/* 𣏕 𣏕 */
 	0xfad2,	0x3b9d,	/* 㮝 㮝 */
 	0xfad2,	0x3b9d,	/* 㮝 㮝 */
 	0xfad3,	0x4018,	/* 䀘 䀘 */
 	0xfad3,	0x4018,	/* 䀘 䀘 */
 	0xfad4,	0x4039,	/* 䀹 䀹 */
 	0xfad4,	0x4039,	/* 䀹 䀹 */
-	0xfad5,	0x25249,	/* 𥉉 ���� */
-	0xfad6,	0x25cd0,	/* 𥳐 ���� */
-	0xfad7,	0x27ed3,	/* 𧻓 ���� */
+	0xfad5,	0x25249,	/* 𥉉 𥉉 */
+	0xfad6,	0x25cd0,	/* 𥳐 𥳐 */
+	0xfad7,	0x27ed3,	/* 𧻓 𧻓 */
 	0xfad8,	0x9f43,	/* 齃 齃 */
 	0xfad8,	0x9f43,	/* 齃 齃 */
 	0xfad9,	0x9f8e,	/* 龎 龎 */
 	0xfad9,	0x9f8e,	/* 龎 龎 */
 	0xfb1d,	0x05d9,	/* יִ י */
 	0xfb1d,	0x05d9,	/* יִ י */
@@ -1395,551 +1394,550 @@ static Rune	_base2[] =
 	0xfb4c,	0x05d1,	/* בֿ ב */
 	0xfb4c,	0x05d1,	/* בֿ ב */
 	0xfb4d,	0x05db,	/* כֿ כ */
 	0xfb4d,	0x05db,	/* כֿ כ */
 	0xfb4e,	0x05e4,	/* פֿ פ */
 	0xfb4e,	0x05e4,	/* פֿ פ */
-	0x1109a,	0x11099,	/* ���� ���� */
-	0x1109c,	0x1109b,	/* ���� ���� */
-	0x110ab,	0x110a5,	/* ���� ���� */
-	0x2f800,	0x4e3d,	/* ���� 丽 */
-	0x2f801,	0x4e38,	/* ���� 丸 */
-	0x2f802,	0x4e41,	/* ���� 乁 */
-	0x2f803,	0x20122,	/* ���� ���� */
-	0x2f804,	0x4f60,	/* ���� 你 */
-	0x2f805,	0x4fae,	/* ���� 侮 */
-	0x2f806,	0x4fbb,	/* ���� 侻 */
-	0x2f807,	0x5002,	/* ���� 倂 */
-	0x2f808,	0x507a,	/* ���� 偺 */
-	0x2f809,	0x5099,	/* ���� 備 */
-	0x2f80a,	0x50e7,	/* ���� 僧 */
-	0x2f80b,	0x50cf,	/* ���� 像 */
-	0x2f80c,	0x349e,	/* ���� 㒞 */
-	0x2f80d,	0x2063a,	/* ���� ���� */
-	0x2f80e,	0x514d,	/* ���� 免 */
-	0x2f80f,	0x5154,	/* ���� 兔 */
-	0x2f810,	0x5164,	/* ���� 兤 */
-	0x2f811,	0x5177,	/* ���� 具 */
-	0x2f812,	0x2051c,	/* ���� ���� */
-	0x2f813,	0x34b9,	/* ���� 㒹 */
-	0x2f814,	0x5167,	/* ���� 內 */
-	0x2f815,	0x518d,	/* ���� 再 */
-	0x2f816,	0x2054b,	/* ���� ���� */
-	0x2f817,	0x5197,	/* ���� 冗 */
-	0x2f818,	0x51a4,	/* ���� 冤 */
-	0x2f819,	0x4ecc,	/* ���� 仌 */
-	0x2f81a,	0x51ac,	/* ���� 冬 */
-	0x2f81b,	0x51b5,	/* ���� 况 */
-	0x2f81c,	0x291df,	/* ���� ���� */
-	0x2f81d,	0x51f5,	/* ���� 凵 */
-	0x2f81e,	0x5203,	/* ���� 刃 */
-	0x2f81f,	0x34df,	/* ���� 㓟 */
-	0x2f820,	0x523b,	/* ���� 刻 */
-	0x2f821,	0x5246,	/* ���� 剆 */
-	0x2f822,	0x5272,	/* ���� 割 */
-	0x2f823,	0x5277,	/* ���� 剷 */
-	0x2f824,	0x3515,	/* ���� 㔕 */
-	0x2f825,	0x52c7,	/* ���� 勇 */
-	0x2f826,	0x52c9,	/* ���� 勉 */
-	0x2f827,	0x52e4,	/* ���� 勤 */
-	0x2f828,	0x52fa,	/* ���� 勺 */
-	0x2f829,	0x5305,	/* ���� 包 */
-	0x2f82a,	0x5306,	/* ���� 匆 */
-	0x2f82b,	0x5317,	/* ���� 北 */
-	0x2f82c,	0x5349,	/* ���� 卉 */
-	0x2f82d,	0x5351,	/* ���� 卑 */
-	0x2f82e,	0x535a,	/* ���� 博 */
-	0x2f82f,	0x5373,	/* ���� 即 */
-	0x2f830,	0x537d,	/* ���� 卽 */
-	0x2f831,	0x537f,	/* ���� 卿 */
-	0x2f832,	0x537f,	/* ���� 卿 */
-	0x2f833,	0x537f,	/* ���� 卿 */
-	0x2f834,	0x20a2c,	/* ���� ���� */
-	0x2f835,	0x7070,	/* ���� 灰 */
-	0x2f836,	0x53ca,	/* ���� 及 */
-	0x2f837,	0x53df,	/* ���� 叟 */
-	0x2f838,	0x20b63,	/* ���� ���� */
-	0x2f839,	0x53eb,	/* ���� 叫 */
-	0x2f83a,	0x53f1,	/* ���� 叱 */
-	0x2f83b,	0x5406,	/* ���� 吆 */
-	0x2f83c,	0x549e,	/* ���� 咞 */
-	0x2f83d,	0x5438,	/* ���� 吸 */
-	0x2f83e,	0x5448,	/* ���� 呈 */
-	0x2f83f,	0x5468,	/* ���� 周 */
-	0x2f840,	0x54a2,	/* ���� 咢 */
-	0x2f841,	0x54f6,	/* ���� 哶 */
-	0x2f842,	0x5510,	/* ���� 唐 */
-	0x2f843,	0x5553,	/* ���� 啓 */
-	0x2f844,	0x5563,	/* ���� 啣 */
-	0x2f845,	0x5584,	/* ���� 善 */
-	0x2f846,	0x5584,	/* ���� 善 */
-	0x2f847,	0x5599,	/* ���� 喙 */
-	0x2f848,	0x55ab,	/* ���� 喫 */
-	0x2f849,	0x55b3,	/* ���� 喳 */
-	0x2f84a,	0x55c2,	/* ���� 嗂 */
-	0x2f84b,	0x5716,	/* ���� 圖 */
-	0x2f84c,	0x5606,	/* ���� 嘆 */
-	0x2f84d,	0x5717,	/* ���� 圗 */
-	0x2f84e,	0x5651,	/* ���� 噑 */
-	0x2f84f,	0x5674,	/* ���� 噴 */
-	0x2f850,	0x5207,	/* ���� 切 */
-	0x2f851,	0x58ee,	/* ���� 壮 */
-	0x2f852,	0x57ce,	/* ���� 城 */
-	0x2f853,	0x57f4,	/* ���� 埴 */
-	0x2f854,	0x580d,	/* ���� 堍 */
-	0x2f855,	0x578b,	/* ���� 型 */
-	0x2f856,	0x5832,	/* ���� 堲 */
-	0x2f857,	0x5831,	/* ���� 報 */
-	0x2f858,	0x58ac,	/* ���� 墬 */
-	0x2f859,	0x214e4,	/* ���� ���� */
-	0x2f85a,	0x58f2,	/* ���� 売 */
-	0x2f85b,	0x58f7,	/* ���� 壷 */
-	0x2f85c,	0x5906,	/* ���� 夆 */
-	0x2f85d,	0x591a,	/* ���� 多 */
-	0x2f85e,	0x5922,	/* ���� 夢 */
-	0x2f85f,	0x5962,	/* ���� 奢 */
-	0x2f860,	0x216a8,	/* ���� ���� */
-	0x2f861,	0x216ea,	/* ���� ���� */
-	0x2f862,	0x59ec,	/* ���� 姬 */
-	0x2f863,	0x5a1b,	/* ���� 娛 */
-	0x2f864,	0x5a27,	/* ���� 娧 */
-	0x2f865,	0x59d8,	/* ���� 姘 */
-	0x2f866,	0x5a66,	/* ���� 婦 */
-	0x2f867,	0x36ee,	/* ���� 㛮 */
-	0x2f868,	0x36fc,	/* ���� 㛼 */
-	0x2f869,	0x5b08,	/* ���� 嬈 */
-	0x2f86a,	0x5b3e,	/* ���� 嬾 */
-	0x2f86b,	0x5b3e,	/* ���� 嬾 */
-	0x2f86c,	0x219c8,	/* ���� ���� */
-	0x2f86d,	0x5bc3,	/* ���� 寃 */
-	0x2f86e,	0x5bd8,	/* ���� 寘 */
-	0x2f86f,	0x5be7,	/* ���� 寧 */
-	0x2f870,	0x5bf3,	/* ���� 寳 */
-	0x2f871,	0x21b18,	/* ���� ���� */
-	0x2f872,	0x5bff,	/* ���� 寿 */
-	0x2f873,	0x5c06,	/* ���� 将 */
-	0x2f874,	0x5f53,	/* ���� 当 */
-	0x2f875,	0x5c22,	/* ���� 尢 */
-	0x2f876,	0x3781,	/* ���� 㞁 */
-	0x2f877,	0x5c60,	/* ���� 屠 */
-	0x2f878,	0x5c6e,	/* ���� 屮 */
-	0x2f879,	0x5cc0,	/* ���� 峀 */
-	0x2f87a,	0x5c8d,	/* ���� 岍 */
-	0x2f87b,	0x21de4,	/* ���� ���� */
-	0x2f87c,	0x5d43,	/* ���� 嵃 */
-	0x2f87d,	0x21de6,	/* ���� ���� */
-	0x2f87e,	0x5d6e,	/* ���� 嵮 */
-	0x2f87f,	0x5d6b,	/* ���� 嵫 */
-	0x2f880,	0x5d7c,	/* ���� 嵼 */
-	0x2f881,	0x5de1,	/* ���� 巡 */
-	0x2f882,	0x5de2,	/* ���� 巢 */
-	0x2f883,	0x382f,	/* ���� 㠯 */
-	0x2f884,	0x5dfd,	/* ���� 巽 */
-	0x2f885,	0x5e28,	/* ���� 帨 */
-	0x2f886,	0x5e3d,	/* ���� 帽 */
-	0x2f887,	0x5e69,	/* ���� 幩 */
-	0x2f888,	0x3862,	/* ���� 㡢 */
-	0x2f889,	0x22183,	/* ���� ���� */
-	0x2f88a,	0x387c,	/* ���� 㡼 */
-	0x2f88b,	0x5eb0,	/* ���� 庰 */
-	0x2f88c,	0x5eb3,	/* ���� 庳 */
-	0x2f88d,	0x5eb6,	/* ���� 庶 */
-	0x2f88e,	0x5eca,	/* ���� 廊 */
-	0x2f88f,	0x2a392,	/* ���� ���� */
-	0x2f890,	0x5efe,	/* ���� 廾 */
-	0x2f891,	0x22331,	/* ���� ���� */
-	0x2f892,	0x22331,	/* ���� ���� */
-	0x2f893,	0x8201,	/* ���� 舁 */
-	0x2f894,	0x5f22,	/* ���� 弢 */
-	0x2f895,	0x5f22,	/* ���� 弢 */
-	0x2f896,	0x38c7,	/* ���� 㣇 */
-	0x2f897,	0x232b8,	/* ���� ���� */
-	0x2f898,	0x261da,	/* ���� ���� */
-	0x2f899,	0x5f62,	/* ���� 形 */
-	0x2f89a,	0x5f6b,	/* ���� 彫 */
-	0x2f89b,	0x38e3,	/* ���� 㣣 */
-	0x2f89c,	0x5f9a,	/* ���� 徚 */
-	0x2f89d,	0x5fcd,	/* ���� 忍 */
-	0x2f89e,	0x5fd7,	/* ���� 志 */
-	0x2f89f,	0x5ff9,	/* ���� 忹 */
-	0x2f8a0,	0x6081,	/* ���� 悁 */
-	0x2f8a1,	0x393a,	/* ���� 㤺 */
-	0x2f8a2,	0x391c,	/* ���� 㤜 */
-	0x2f8a3,	0x6094,	/* ���� 悔 */
-	0x2f8a4,	0x226d4,	/* ���� ���� */
-	0x2f8a5,	0x60c7,	/* ���� 惇 */
-	0x2f8a6,	0x6148,	/* ���� 慈 */
-	0x2f8a7,	0x614c,	/* ���� 慌 */
-	0x2f8a8,	0x614e,	/* ���� 慎 */
-	0x2f8a9,	0x614c,	/* ���� 慌 */
-	0x2f8aa,	0x617a,	/* ���� 慺 */
-	0x2f8ab,	0x618e,	/* ���� 憎 */
-	0x2f8ac,	0x61b2,	/* ���� 憲 */
-	0x2f8ad,	0x61a4,	/* ���� 憤 */
-	0x2f8ae,	0x61af,	/* ���� 憯 */
-	0x2f8af,	0x61de,	/* ���� 懞 */
-	0x2f8b0,	0x61f2,	/* ���� 懲 */
-	0x2f8b1,	0x61f6,	/* ���� 懶 */
-	0x2f8b2,	0x6210,	/* ���� 成 */
-	0x2f8b3,	0x621b,	/* ���� 戛 */
-	0x2f8b4,	0x625d,	/* ���� 扝 */
-	0x2f8b5,	0x62b1,	/* ���� 抱 */
-	0x2f8b6,	0x62d4,	/* ���� 拔 */
-	0x2f8b7,	0x6350,	/* ���� 捐 */
-	0x2f8b8,	0x22b0c,	/* ���� ���� */
-	0x2f8b9,	0x633d,	/* ���� 挽 */
-	0x2f8ba,	0x62fc,	/* ���� 拼 */
-	0x2f8bb,	0x6368,	/* ���� 捨 */
-	0x2f8bc,	0x6383,	/* ���� 掃 */
-	0x2f8bd,	0x63e4,	/* ���� 揤 */
-	0x2f8be,	0x22bf1,	/* ���� ���� */
-	0x2f8bf,	0x6422,	/* ���� 搢 */
-	0x2f8c0,	0x63c5,	/* ���� 揅 */
-	0x2f8c1,	0x63a9,	/* ���� 掩 */
-	0x2f8c2,	0x3a2e,	/* ���� 㨮 */
-	0x2f8c3,	0x6469,	/* ���� 摩 */
-	0x2f8c4,	0x647e,	/* ���� 摾 */
-	0x2f8c5,	0x649d,	/* ���� 撝 */
-	0x2f8c6,	0x6477,	/* ���� 摷 */
-	0x2f8c7,	0x3a6c,	/* ���� 㩬 */
-	0x2f8c8,	0x654f,	/* ���� 敏 */
-	0x2f8c9,	0x656c,	/* ���� 敬 */
-	0x2f8ca,	0x2300a,	/* ���� ���� */
-	0x2f8cb,	0x65e3,	/* ���� 旣 */
-	0x2f8cc,	0x66f8,	/* ���� 書 */
-	0x2f8cd,	0x6649,	/* ���� 晉 */
-	0x2f8ce,	0x3b19,	/* ���� 㬙 */
-	0x2f8cf,	0x6691,	/* ���� 暑 */
-	0x2f8d0,	0x3b08,	/* ���� 㬈 */
-	0x2f8d1,	0x3ae4,	/* ���� 㫤 */
-	0x2f8d2,	0x5192,	/* ���� 冒 */
-	0x2f8d3,	0x5195,	/* ���� 冕 */
-	0x2f8d4,	0x6700,	/* ���� 最 */
-	0x2f8d5,	0x669c,	/* ���� 暜 */
-	0x2f8d6,	0x80ad,	/* ���� 肭 */
-	0x2f8d7,	0x43d9,	/* ���� 䏙 */
-	0x2f8d8,	0x6717,	/* ���� 朗 */
-	0x2f8d9,	0x671b,	/* ���� 望 */
-	0x2f8da,	0x6721,	/* ���� 朡 */
-	0x2f8db,	0x675e,	/* ���� 杞 */
-	0x2f8dc,	0x6753,	/* ���� 杓 */
-	0x2f8dd,	0x233c3,	/* ���� ���� */
-	0x2f8de,	0x3b49,	/* ���� 㭉 */
-	0x2f8df,	0x67fa,	/* ���� 柺 */
-	0x2f8e0,	0x6785,	/* ���� 枅 */
-	0x2f8e1,	0x6852,	/* ���� 桒 */
-	0x2f8e2,	0x6885,	/* ���� 梅 */
-	0x2f8e3,	0x2346d,	/* ���� ���� */
-	0x2f8e4,	0x688e,	/* ���� 梎 */
-	0x2f8e5,	0x681f,	/* ���� 栟 */
-	0x2f8e6,	0x6914,	/* ���� 椔 */
-	0x2f8e7,	0x3b9d,	/* ���� 㮝 */
-	0x2f8e8,	0x6942,	/* ���� 楂 */
-	0x2f8e9,	0x69a3,	/* ���� 榣 */
-	0x2f8ea,	0x69ea,	/* ���� 槪 */
-	0x2f8eb,	0x6aa8,	/* ���� 檨 */
-	0x2f8ec,	0x236a3,	/* ���� ���� */
-	0x2f8ed,	0x6adb,	/* ���� 櫛 */
-	0x2f8ee,	0x3c18,	/* ���� 㰘 */
-	0x2f8ef,	0x6b21,	/* ���� 次 */
-	0x2f8f0,	0x238a7,	/* ���� ���� */
-	0x2f8f1,	0x6b54,	/* ���� 歔 */
-	0x2f8f2,	0x3c4e,	/* ���� 㱎 */
-	0x2f8f3,	0x6b72,	/* ���� 歲 */
-	0x2f8f4,	0x6b9f,	/* ���� 殟 */
-	0x2f8f5,	0x6bba,	/* ���� 殺 */
-	0x2f8f6,	0x6bbb,	/* ���� 殻 */
-	0x2f8f7,	0x23a8d,	/* ���� ���� */
-	0x2f8f8,	0x21d0b,	/* ���� ���� */
-	0x2f8f9,	0x23afa,	/* ���� ���� */
-	0x2f8fa,	0x6c4e,	/* ���� 汎 */
-	0x2f8fb,	0x23cbc,	/* ���� ���� */
-	0x2f8fc,	0x6cbf,	/* ���� 沿 */
-	0x2f8fd,	0x6ccd,	/* ���� 泍 */
-	0x2f8fe,	0x6c67,	/* ���� 汧 */
-	0x2f8ff,	0x6d16,	/* ���� 洖 */
-	0x2f900,	0x6d3e,	/* ���� 派 */
-	0x2f901,	0x6d77,	/* ���� 海 */
-	0x2f902,	0x6d41,	/* ���� 流 */
-	0x2f903,	0x6d69,	/* ���� 浩 */
-	0x2f904,	0x6d78,	/* ���� 浸 */
-	0x2f905,	0x6d85,	/* ���� 涅 */
-	0x2f906,	0x23d1e,	/* ���� ���� */
-	0x2f907,	0x6d34,	/* ���� 洴 */
-	0x2f908,	0x6e2f,	/* ���� 港 */
-	0x2f909,	0x6e6e,	/* ���� 湮 */
-	0x2f90a,	0x3d33,	/* ���� 㴳 */
-	0x2f90b,	0x6ecb,	/* ���� 滋 */
-	0x2f90c,	0x6ec7,	/* ���� 滇 */
-	0x2f90d,	0x23ed1,	/* ���� ���� */
-	0x2f90e,	0x6df9,	/* ���� 淹 */
-	0x2f90f,	0x6f6e,	/* ���� 潮 */
-	0x2f910,	0x23f5e,	/* ���� ���� */
-	0x2f911,	0x23f8e,	/* ���� ���� */
-	0x2f912,	0x6fc6,	/* ���� 濆 */
-	0x2f913,	0x7039,	/* ���� 瀹 */
-	0x2f914,	0x701e,	/* ���� 瀞 */
-	0x2f915,	0x701b,	/* ���� 瀛 */
-	0x2f916,	0x3d96,	/* ���� 㶖 */
-	0x2f917,	0x704a,	/* ���� 灊 */
-	0x2f918,	0x707d,	/* ���� 災 */
-	0x2f919,	0x7077,	/* ���� 灷 */
-	0x2f91a,	0x70ad,	/* ���� 炭 */
-	0x2f91b,	0x20525,	/* ���� ���� */
-	0x2f91c,	0x7145,	/* ���� 煅 */
-	0x2f91d,	0x24263,	/* ���� ���� */
-	0x2f91e,	0x719c,	/* ���� 熜 */
-	0x2f91f,	0x243ab,	/* ���� ���� */
-	0x2f920,	0x7228,	/* ���� 爨 */
-	0x2f921,	0x7235,	/* ���� 爵 */
-	0x2f922,	0x7250,	/* ���� 牐 */
-	0x2f923,	0x24608,	/* ���� ���� */
-	0x2f924,	0x7280,	/* ���� 犀 */
-	0x2f925,	0x7295,	/* ���� 犕 */
-	0x2f926,	0x24735,	/* ���� ���� */
-	0x2f927,	0x24814,	/* ���� ���� */
-	0x2f928,	0x737a,	/* ���� 獺 */
-	0x2f929,	0x738b,	/* ���� 王 */
-	0x2f92a,	0x3eac,	/* ���� 㺬 */
-	0x2f92b,	0x73a5,	/* ���� 玥 */
-	0x2f92c,	0x3eb8,	/* ���� 㺸 */
-	0x2f92d,	0x3eb8,	/* ���� 㺸 */
-	0x2f92e,	0x7447,	/* ���� 瑇 */
-	0x2f92f,	0x745c,	/* ���� 瑜 */
-	0x2f930,	0x7471,	/* ���� 瑱 */
-	0x2f931,	0x7485,	/* ���� 璅 */
-	0x2f932,	0x74ca,	/* ���� 瓊 */
-	0x2f933,	0x3f1b,	/* ���� 㼛 */
-	0x2f934,	0x7524,	/* ���� 甤 */
-	0x2f935,	0x24c36,	/* ���� ���� */
-	0x2f936,	0x753e,	/* ���� 甾 */
-	0x2f937,	0x24c92,	/* ���� ���� */
-	0x2f938,	0x7570,	/* ���� 異 */
-	0x2f939,	0x2219f,	/* ���� ���� */
-	0x2f93a,	0x7610,	/* ���� 瘐 */
-	0x2f93b,	0x24fa1,	/* ���� ���� */
-	0x2f93c,	0x24fb8,	/* ���� ���� */
-	0x2f93d,	0x25044,	/* ���� ���� */
-	0x2f93e,	0x3ffc,	/* ���� 㿼 */
-	0x2f93f,	0x4008,	/* ���� 䀈 */
-	0x2f940,	0x76f4,	/* ���� 直 */
-	0x2f941,	0x250f3,	/* ���� ���� */
-	0x2f942,	0x250f2,	/* ���� ���� */
-	0x2f943,	0x25119,	/* ���� ���� */
-	0x2f944,	0x25133,	/* ���� ���� */
-	0x2f945,	0x771e,	/* ���� 眞 */
-	0x2f946,	0x771f,	/* ���� 真 */
-	0x2f947,	0x771f,	/* ���� 真 */
-	0x2f948,	0x774a,	/* ���� 睊 */
-	0x2f949,	0x4039,	/* ���� 䀹 */
-	0x2f94a,	0x778b,	/* ���� 瞋 */
-	0x2f94b,	0x4046,	/* ���� 䁆 */
-	0x2f94c,	0x4096,	/* ���� 䂖 */
-	0x2f94d,	0x2541d,	/* ���� ���� */
-	0x2f94e,	0x784e,	/* ���� 硎 */
-	0x2f94f,	0x788c,	/* ���� 碌 */
-	0x2f950,	0x78cc,	/* ���� 磌 */
-	0x2f951,	0x40e3,	/* ���� 䃣 */
-	0x2f952,	0x25626,	/* ���� ���� */
-	0x2f953,	0x7956,	/* ���� 祖 */
-	0x2f954,	0x2569a,	/* ���� ���� */
-	0x2f955,	0x256c5,	/* ���� ���� */
-	0x2f956,	0x798f,	/* ���� 福 */
-	0x2f957,	0x79eb,	/* ���� 秫 */
-	0x2f958,	0x412f,	/* ���� 䄯 */
-	0x2f959,	0x7a40,	/* ���� 穀 */
-	0x2f95a,	0x7a4a,	/* ���� 穊 */
-	0x2f95b,	0x7a4f,	/* ���� 穏 */
-	0x2f95c,	0x2597c,	/* ���� ���� */
-	0x2f95d,	0x25aa7,	/* ���� ���� */
-	0x2f95e,	0x25aa7,	/* ���� ���� */
-	0x2f95f,	0x7aee,	/* ���� 竮 */
-	0x2f960,	0x4202,	/* ���� 䈂 */
-	0x2f961,	0x25bab,	/* ���� ���� */
-	0x2f962,	0x7bc6,	/* ���� 篆 */
-	0x2f963,	0x7bc9,	/* ���� 築 */
-	0x2f964,	0x4227,	/* ���� 䈧 */
-	0x2f965,	0x25c80,	/* ���� ���� */
-	0x2f966,	0x7cd2,	/* ���� 糒 */
-	0x2f967,	0x42a0,	/* ���� 䊠 */
-	0x2f968,	0x7ce8,	/* ���� 糨 */
-	0x2f969,	0x7ce3,	/* ���� 糣 */
-	0x2f96a,	0x7d00,	/* ���� 紀 */
-	0x2f96b,	0x25f86,	/* ���� ���� */
-	0x2f96c,	0x7d63,	/* ���� 絣 */
-	0x2f96d,	0x4301,	/* ���� 䌁 */
-	0x2f96e,	0x7dc7,	/* ���� 緇 */
-	0x2f96f,	0x7e02,	/* ���� 縂 */
-	0x2f970,	0x7e45,	/* ���� 繅 */
-	0x2f971,	0x4334,	/* ���� 䌴 */
-	0x2f972,	0x26228,	/* ���� ���� */
-	0x2f973,	0x26247,	/* ���� ���� */
-	0x2f974,	0x4359,	/* ���� 䍙 */
-	0x2f975,	0x262d9,	/* ���� ���� */
-	0x2f976,	0x7f7a,	/* ���� 罺 */
-	0x2f977,	0x2633e,	/* ���� ���� */
-	0x2f978,	0x7f95,	/* ���� 羕 */
-	0x2f979,	0x7ffa,	/* ���� 翺 */
-	0x2f97a,	0x8005,	/* ���� 者 */
-	0x2f97b,	0x264da,	/* ���� ���� */
-	0x2f97c,	0x26523,	/* ���� ���� */
-	0x2f97d,	0x8060,	/* ���� 聠 */
-	0x2f97e,	0x265a8,	/* ���� ���� */
-	0x2f97f,	0x8070,	/* ���� 聰 */
-	0x2f980,	0x2335f,	/* ���� ���� */
-	0x2f981,	0x43d5,	/* ���� 䏕 */
-	0x2f982,	0x80b2,	/* ���� 育 */
-	0x2f983,	0x8103,	/* ���� 脃 */
-	0x2f984,	0x440b,	/* ���� 䐋 */
-	0x2f985,	0x813e,	/* ���� 脾 */
-	0x2f986,	0x5ab5,	/* ���� 媵 */
-	0x2f987,	0x267a7,	/* ���� ���� */
-	0x2f988,	0x267b5,	/* ���� ���� */
-	0x2f989,	0x23393,	/* ���� ���� */
-	0x2f98a,	0x2339c,	/* ���� ���� */
-	0x2f98b,	0x8201,	/* ���� 舁 */
-	0x2f98c,	0x8204,	/* ���� 舄 */
-	0x2f98d,	0x8f9e,	/* ���� 辞 */
-	0x2f98e,	0x446b,	/* ���� 䑫 */
-	0x2f98f,	0x8291,	/* ���� 芑 */
-	0x2f990,	0x828b,	/* ���� 芋 */
-	0x2f991,	0x829d,	/* ���� 芝 */
-	0x2f992,	0x52b3,	/* ���� 劳 */
-	0x2f993,	0x82b1,	/* ���� 花 */
-	0x2f994,	0x82b3,	/* ���� 芳 */
-	0x2f995,	0x82bd,	/* ���� 芽 */
-	0x2f996,	0x82e6,	/* ���� 苦 */
-	0x2f997,	0x26b3c,	/* ���� ���� */
-	0x2f998,	0x82e5,	/* ���� 若 */
-	0x2f999,	0x831d,	/* ���� 茝 */
-	0x2f99a,	0x8363,	/* ���� 荣 */
-	0x2f99b,	0x83ad,	/* ���� 莭 */
-	0x2f99c,	0x8323,	/* ���� 茣 */
-	0x2f99d,	0x83bd,	/* ���� 莽 */
-	0x2f99e,	0x83e7,	/* ���� 菧 */
-	0x2f99f,	0x8457,	/* ���� 著 */
-	0x2f9a0,	0x8353,	/* ���� 荓 */
-	0x2f9a1,	0x83ca,	/* ���� 菊 */
-	0x2f9a2,	0x83cc,	/* ���� 菌 */
-	0x2f9a3,	0x83dc,	/* ���� 菜 */
-	0x2f9a4,	0x26c36,	/* ���� ���� */
-	0x2f9a5,	0x26d6b,	/* ���� ���� */
-	0x2f9a6,	0x26cd5,	/* ���� ���� */
-	0x2f9a7,	0x452b,	/* ���� 䔫 */
-	0x2f9a8,	0x84f1,	/* ���� 蓱 */
-	0x2f9a9,	0x84f3,	/* ���� 蓳 */
-	0x2f9aa,	0x8516,	/* ���� 蔖 */
-	0x2f9ab,	0x273ca,	/* ���� ���� */
-	0x2f9ac,	0x8564,	/* ���� 蕤 */
-	0x2f9ad,	0x26f2c,	/* ���� ���� */
-	0x2f9ae,	0x455d,	/* ���� 䕝 */
-	0x2f9af,	0x4561,	/* ���� 䕡 */
-	0x2f9b0,	0x26fb1,	/* ���� ���� */
-	0x2f9b1,	0x270d2,	/* ���� ���� */
-	0x2f9b2,	0x456b,	/* ���� 䕫 */
-	0x2f9b3,	0x8650,	/* ���� 虐 */
-	0x2f9b4,	0x865c,	/* ���� 虜 */
-	0x2f9b5,	0x8667,	/* ���� 虧 */
-	0x2f9b6,	0x8669,	/* ���� 虩 */
-	0x2f9b7,	0x86a9,	/* ���� 蚩 */
-	0x2f9b8,	0x8688,	/* ���� 蚈 */
-	0x2f9b9,	0x870e,	/* ���� 蜎 */
-	0x2f9ba,	0x86e2,	/* ���� 蛢 */
-	0x2f9bb,	0x8779,	/* ���� 蝹 */
-	0x2f9bc,	0x8728,	/* ���� 蜨 */
-	0x2f9bd,	0x876b,	/* ���� 蝫 */
-	0x2f9be,	0x8786,	/* ���� 螆 */
-	0x2f9bf,	0x45d7,	/* ���� 䗗 */
-	0x2f9c0,	0x87e1,	/* ���� 蟡 */
-	0x2f9c1,	0x8801,	/* ���� 蠁 */
-	0x2f9c2,	0x45f9,	/* ���� 䗹 */
-	0x2f9c3,	0x8860,	/* ���� 衠 */
-	0x2f9c4,	0x8863,	/* ���� 衣 */
-	0x2f9c5,	0x27667,	/* ���� ���� */
-	0x2f9c6,	0x88d7,	/* ���� 裗 */
-	0x2f9c7,	0x88de,	/* ���� 裞 */
-	0x2f9c8,	0x4635,	/* ���� 䘵 */
-	0x2f9c9,	0x88fa,	/* ���� 裺 */
-	0x2f9ca,	0x34bb,	/* ���� 㒻 */
-	0x2f9cb,	0x278ae,	/* ���� ���� */
-	0x2f9cc,	0x27966,	/* ���� ���� */
-	0x2f9cd,	0x46be,	/* ���� 䚾 */
-	0x2f9ce,	0x46c7,	/* ���� 䛇 */
-	0x2f9cf,	0x8aa0,	/* ���� 誠 */
-	0x2f9d0,	0x8aed,	/* ���� 諭 */
-	0x2f9d1,	0x8b8a,	/* ���� 變 */
-	0x2f9d2,	0x8c55,	/* ���� 豕 */
-	0x2f9d3,	0x27ca8,	/* ���� ���� */
-	0x2f9d4,	0x8cab,	/* ���� 貫 */
-	0x2f9d5,	0x8cc1,	/* ���� 賁 */
-	0x2f9d6,	0x8d1b,	/* ���� 贛 */
-	0x2f9d7,	0x8d77,	/* ���� 起 */
-	0x2f9d8,	0x27f2f,	/* ���� ���� */
-	0x2f9d9,	0x20804,	/* ���� ���� */
-	0x2f9da,	0x8dcb,	/* ���� 跋 */
-	0x2f9db,	0x8dbc,	/* ���� 趼 */
-	0x2f9dc,	0x8df0,	/* ���� 跰 */
-	0x2f9dd,	0x208de,	/* ���� ���� */
-	0x2f9de,	0x8ed4,	/* ���� 軔 */
-	0x2f9df,	0x8f38,	/* ���� 輸 */
-	0x2f9e0,	0x285d2,	/* ���� ���� */
-	0x2f9e1,	0x285ed,	/* ���� ���� */
-	0x2f9e2,	0x9094,	/* ���� 邔 */
-	0x2f9e3,	0x90f1,	/* ���� 郱 */
-	0x2f9e4,	0x9111,	/* ���� 鄑 */
-	0x2f9e5,	0x2872e,	/* ���� ���� */
-	0x2f9e6,	0x911b,	/* ���� 鄛 */
-	0x2f9e7,	0x9238,	/* ���� 鈸 */
-	0x2f9e8,	0x92d7,	/* ���� 鋗 */
-	0x2f9e9,	0x92d8,	/* ���� 鋘 */
-	0x2f9ea,	0x927c,	/* ���� 鉼 */
-	0x2f9eb,	0x93f9,	/* ���� 鏹 */
-	0x2f9ec,	0x9415,	/* ���� 鐕 */
-	0x2f9ed,	0x28bfa,	/* ���� ���� */
-	0x2f9ee,	0x958b,	/* ���� 開 */
-	0x2f9ef,	0x4995,	/* ���� 䦕 */
-	0x2f9f0,	0x95b7,	/* ���� 閷 */
-	0x2f9f1,	0x28d77,	/* ���� ���� */
-	0x2f9f2,	0x49e6,	/* ���� 䧦 */
-	0x2f9f3,	0x96c3,	/* ���� 雃 */
-	0x2f9f4,	0x5db2,	/* ���� 嶲 */
-	0x2f9f5,	0x9723,	/* ���� 霣 */
-	0x2f9f6,	0x29145,	/* ���� ���� */
-	0x2f9f7,	0x2921a,	/* ���� ���� */
-	0x2f9f8,	0x4a6e,	/* ���� 䩮 */
-	0x2f9f9,	0x4a76,	/* ���� 䩶 */
-	0x2f9fa,	0x97e0,	/* ���� 韠 */
-	0x2f9fb,	0x2940a,	/* ���� ���� */
-	0x2f9fc,	0x4ab2,	/* ���� 䪲 */
-	0x2f9fd,	0x29496,	/* ���� ���� */
-	0x2f9fe,	0x980b,	/* ���� 頋 */
-	0x2f9ff,	0x980b,	/* ���� 頋 */
-	0x2fa00,	0x9829,	/* ���� 頩 */
-	0x2fa01,	0x295b6,	/* ���� ���� */
-	0x2fa02,	0x98e2,	/* ���� 飢 */
-	0x2fa03,	0x4b33,	/* ���� 䬳 */
-	0x2fa04,	0x9929,	/* ���� 餩 */
-	0x2fa05,	0x99a7,	/* ���� 馧 */
-	0x2fa06,	0x99c2,	/* ���� 駂 */
-	0x2fa07,	0x99fe,	/* ���� 駾 */
-	0x2fa08,	0x4bce,	/* ���� 䯎 */
-	0x2fa09,	0x29b30,	/* ���� ���� */
-	0x2fa0a,	0x9b12,	/* ���� 鬒 */
-	0x2fa0b,	0x9c40,	/* ���� 鱀 */
-	0x2fa0c,	0x9cfd,	/* ���� 鳽 */
-	0x2fa0d,	0x4cce,	/* ���� 䳎 */
-	0x2fa0e,	0x4ced,	/* ���� 䳭 */
-	0x2fa0f,	0x9d67,	/* ���� 鵧 */
-	0x2fa10,	0x2a0ce,	/* ���� ���� */
-	0x2fa11,	0x4cf8,	/* ���� 䳸 */
-	0x2fa12,	0x2a105,	/* ���� ���� */
-	0x2fa13,	0x2a20e,	/* ���� ���� */
-	0x2fa14,	0x2a291,	/* ���� ���� */
-	0x2fa15,	0x9ebb,	/* ���� 麻 */
-	0x2fa16,	0x4d56,	/* ���� 䵖 */
-	0x2fa17,	0x9ef9,	/* ���� 黹 */
-	0x2fa18,	0x9efe,	/* ���� 黾 */
-	0x2fa19,	0x9f05,	/* ���� 鼅 */
-	0x2fa1a,	0x9f0f,	/* ���� 鼏 */
-	0x2fa1b,	0x9f16,	/* ���� 鼖 */
-	0x2fa1c,	0x9f3b,	/* ���� 鼻 */
-#endif
+	0x1109a,	0x11099,	/* 𑂚 𑂙 */
+	0x1109c,	0x1109b,	/* 𑂜 𑂛 */
+	0x110ab,	0x110a5,	/* 𑂫 𑂥 */
+	0x2f800,	0x4e3d,	/* 丽 丽 */
+	0x2f801,	0x4e38,	/* 丸 丸 */
+	0x2f802,	0x4e41,	/* 乁 乁 */
+	0x2f803,	0x20122,	/* 𠄢 𠄢 */
+	0x2f804,	0x4f60,	/* 你 你 */
+	0x2f805,	0x4fae,	/* 侮 侮 */
+	0x2f806,	0x4fbb,	/* 侻 侻 */
+	0x2f807,	0x5002,	/* 倂 倂 */
+	0x2f808,	0x507a,	/* 偺 偺 */
+	0x2f809,	0x5099,	/* 備 備 */
+	0x2f80a,	0x50e7,	/* 僧 僧 */
+	0x2f80b,	0x50cf,	/* 像 像 */
+	0x2f80c,	0x349e,	/* 㒞 㒞 */
+	0x2f80d,	0x2063a,	/* 𠘺 𠘺 */
+	0x2f80e,	0x514d,	/* 免 免 */
+	0x2f80f,	0x5154,	/* 兔 兔 */
+	0x2f810,	0x5164,	/* 兤 兤 */
+	0x2f811,	0x5177,	/* 具 具 */
+	0x2f812,	0x2051c,	/* 𠔜 𠔜 */
+	0x2f813,	0x34b9,	/* 㒹 㒹 */
+	0x2f814,	0x5167,	/* 內 內 */
+	0x2f815,	0x518d,	/* 再 再 */
+	0x2f816,	0x2054b,	/* 𠕋 𠕋 */
+	0x2f817,	0x5197,	/* 冗 冗 */
+	0x2f818,	0x51a4,	/* 冤 冤 */
+	0x2f819,	0x4ecc,	/* 仌 仌 */
+	0x2f81a,	0x51ac,	/* 冬 冬 */
+	0x2f81b,	0x51b5,	/* 况 况 */
+	0x2f81c,	0x291df,	/* 𩇟 𩇟 */
+	0x2f81d,	0x51f5,	/* 凵 凵 */
+	0x2f81e,	0x5203,	/* 刃 刃 */
+	0x2f81f,	0x34df,	/* 㓟 㓟 */
+	0x2f820,	0x523b,	/* 刻 刻 */
+	0x2f821,	0x5246,	/* 剆 剆 */
+	0x2f822,	0x5272,	/* 割 割 */
+	0x2f823,	0x5277,	/* 剷 剷 */
+	0x2f824,	0x3515,	/* 㔕 㔕 */
+	0x2f825,	0x52c7,	/* 勇 勇 */
+	0x2f826,	0x52c9,	/* 勉 勉 */
+	0x2f827,	0x52e4,	/* 勤 勤 */
+	0x2f828,	0x52fa,	/* 勺 勺 */
+	0x2f829,	0x5305,	/* 包 包 */
+	0x2f82a,	0x5306,	/* 匆 匆 */
+	0x2f82b,	0x5317,	/* 北 北 */
+	0x2f82c,	0x5349,	/* 卉 卉 */
+	0x2f82d,	0x5351,	/* 卑 卑 */
+	0x2f82e,	0x535a,	/* 博 博 */
+	0x2f82f,	0x5373,	/* 即 即 */
+	0x2f830,	0x537d,	/* 卽 卽 */
+	0x2f831,	0x537f,	/* 卿 卿 */
+	0x2f832,	0x537f,	/* 卿 卿 */
+	0x2f833,	0x537f,	/* 卿 卿 */
+	0x2f834,	0x20a2c,	/* 𠨬 𠨬 */
+	0x2f835,	0x7070,	/* 灰 灰 */
+	0x2f836,	0x53ca,	/* 及 及 */
+	0x2f837,	0x53df,	/* 叟 叟 */
+	0x2f838,	0x20b63,	/* 𠭣 𠭣 */
+	0x2f839,	0x53eb,	/* 叫 叫 */
+	0x2f83a,	0x53f1,	/* 叱 叱 */
+	0x2f83b,	0x5406,	/* 吆 吆 */
+	0x2f83c,	0x549e,	/* 咞 咞 */
+	0x2f83d,	0x5438,	/* 吸 吸 */
+	0x2f83e,	0x5448,	/* 呈 呈 */
+	0x2f83f,	0x5468,	/* 周 周 */
+	0x2f840,	0x54a2,	/* 咢 咢 */
+	0x2f841,	0x54f6,	/* 哶 哶 */
+	0x2f842,	0x5510,	/* 唐 唐 */
+	0x2f843,	0x5553,	/* 啓 啓 */
+	0x2f844,	0x5563,	/* 啣 啣 */
+	0x2f845,	0x5584,	/* 善 善 */
+	0x2f846,	0x5584,	/* 善 善 */
+	0x2f847,	0x5599,	/* 喙 喙 */
+	0x2f848,	0x55ab,	/* 喫 喫 */
+	0x2f849,	0x55b3,	/* 喳 喳 */
+	0x2f84a,	0x55c2,	/* 嗂 嗂 */
+	0x2f84b,	0x5716,	/* 圖 圖 */
+	0x2f84c,	0x5606,	/* 嘆 嘆 */
+	0x2f84d,	0x5717,	/* 圗 圗 */
+	0x2f84e,	0x5651,	/* 噑 噑 */
+	0x2f84f,	0x5674,	/* 噴 噴 */
+	0x2f850,	0x5207,	/* 切 切 */
+	0x2f851,	0x58ee,	/* 壮 壮 */
+	0x2f852,	0x57ce,	/* 城 城 */
+	0x2f853,	0x57f4,	/* 埴 埴 */
+	0x2f854,	0x580d,	/* 堍 堍 */
+	0x2f855,	0x578b,	/* 型 型 */
+	0x2f856,	0x5832,	/* 堲 堲 */
+	0x2f857,	0x5831,	/* 報 報 */
+	0x2f858,	0x58ac,	/* 墬 墬 */
+	0x2f859,	0x214e4,	/* 𡓤 𡓤 */
+	0x2f85a,	0x58f2,	/* 売 売 */
+	0x2f85b,	0x58f7,	/* 壷 壷 */
+	0x2f85c,	0x5906,	/* 夆 夆 */
+	0x2f85d,	0x591a,	/* 多 多 */
+	0x2f85e,	0x5922,	/* 夢 夢 */
+	0x2f85f,	0x5962,	/* 奢 奢 */
+	0x2f860,	0x216a8,	/* 𡚨 𡚨 */
+	0x2f861,	0x216ea,	/* 𡛪 𡛪 */
+	0x2f862,	0x59ec,	/* 姬 姬 */
+	0x2f863,	0x5a1b,	/* 娛 娛 */
+	0x2f864,	0x5a27,	/* 娧 娧 */
+	0x2f865,	0x59d8,	/* 姘 姘 */
+	0x2f866,	0x5a66,	/* 婦 婦 */
+	0x2f867,	0x36ee,	/* 㛮 㛮 */
+	0x2f868,	0x36fc,	/* 㛼 㛼 */
+	0x2f869,	0x5b08,	/* 嬈 嬈 */
+	0x2f86a,	0x5b3e,	/* 嬾 嬾 */
+	0x2f86b,	0x5b3e,	/* 嬾 嬾 */
+	0x2f86c,	0x219c8,	/* 𡧈 𡧈 */
+	0x2f86d,	0x5bc3,	/* 寃 寃 */
+	0x2f86e,	0x5bd8,	/* 寘 寘 */
+	0x2f86f,	0x5be7,	/* 寧 寧 */
+	0x2f870,	0x5bf3,	/* 寳 寳 */
+	0x2f871,	0x21b18,	/* 𡬘 𡬘 */
+	0x2f872,	0x5bff,	/* 寿 寿 */
+	0x2f873,	0x5c06,	/* 将 将 */
+	0x2f874,	0x5f53,	/* 当 当 */
+	0x2f875,	0x5c22,	/* 尢 尢 */
+	0x2f876,	0x3781,	/* 㞁 㞁 */
+	0x2f877,	0x5c60,	/* 屠 屠 */
+	0x2f878,	0x5c6e,	/* 屮 屮 */
+	0x2f879,	0x5cc0,	/* 峀 峀 */
+	0x2f87a,	0x5c8d,	/* 岍 岍 */
+	0x2f87b,	0x21de4,	/* 𡷤 𡷤 */
+	0x2f87c,	0x5d43,	/* 嵃 嵃 */
+	0x2f87d,	0x21de6,	/* 𡷦 𡷦 */
+	0x2f87e,	0x5d6e,	/* 嵮 嵮 */
+	0x2f87f,	0x5d6b,	/* 嵫 嵫 */
+	0x2f880,	0x5d7c,	/* 嵼 嵼 */
+	0x2f881,	0x5de1,	/* 巡 巡 */
+	0x2f882,	0x5de2,	/* 巢 巢 */
+	0x2f883,	0x382f,	/* 㠯 㠯 */
+	0x2f884,	0x5dfd,	/* 巽 巽 */
+	0x2f885,	0x5e28,	/* 帨 帨 */
+	0x2f886,	0x5e3d,	/* 帽 帽 */
+	0x2f887,	0x5e69,	/* 幩 幩 */
+	0x2f888,	0x3862,	/* 㡢 㡢 */
+	0x2f889,	0x22183,	/* 𢆃 𢆃 */
+	0x2f88a,	0x387c,	/* 㡼 㡼 */
+	0x2f88b,	0x5eb0,	/* 庰 庰 */
+	0x2f88c,	0x5eb3,	/* 庳 庳 */
+	0x2f88d,	0x5eb6,	/* 庶 庶 */
+	0x2f88e,	0x5eca,	/* 廊 廊 */
+	0x2f88f,	0x2a392,	/* 𪎒 𪎒 */
+	0x2f890,	0x5efe,	/* 廾 廾 */
+	0x2f891,	0x22331,	/* 𢌱 𢌱 */
+	0x2f892,	0x22331,	/* 𢌱 𢌱 */
+	0x2f893,	0x8201,	/* 舁 舁 */
+	0x2f894,	0x5f22,	/* 弢 弢 */
+	0x2f895,	0x5f22,	/* 弢 弢 */
+	0x2f896,	0x38c7,	/* 㣇 㣇 */
+	0x2f897,	0x232b8,	/* 𣊸 𣊸 */
+	0x2f898,	0x261da,	/* 𦇚 𦇚 */
+	0x2f899,	0x5f62,	/* 形 形 */
+	0x2f89a,	0x5f6b,	/* 彫 彫 */
+	0x2f89b,	0x38e3,	/* 㣣 㣣 */
+	0x2f89c,	0x5f9a,	/* 徚 徚 */
+	0x2f89d,	0x5fcd,	/* 忍 忍 */
+	0x2f89e,	0x5fd7,	/* 志 志 */
+	0x2f89f,	0x5ff9,	/* 忹 忹 */
+	0x2f8a0,	0x6081,	/* 悁 悁 */
+	0x2f8a1,	0x393a,	/* 㤺 㤺 */
+	0x2f8a2,	0x391c,	/* 㤜 㤜 */
+	0x2f8a3,	0x6094,	/* 悔 悔 */
+	0x2f8a4,	0x226d4,	/* 𢛔 𢛔 */
+	0x2f8a5,	0x60c7,	/* 惇 惇 */
+	0x2f8a6,	0x6148,	/* 慈 慈 */
+	0x2f8a7,	0x614c,	/* 慌 慌 */
+	0x2f8a8,	0x614e,	/* 慎 慎 */
+	0x2f8a9,	0x614c,	/* 慌 慌 */
+	0x2f8aa,	0x617a,	/* 慺 慺 */
+	0x2f8ab,	0x618e,	/* 憎 憎 */
+	0x2f8ac,	0x61b2,	/* 憲 憲 */
+	0x2f8ad,	0x61a4,	/* 憤 憤 */
+	0x2f8ae,	0x61af,	/* 憯 憯 */
+	0x2f8af,	0x61de,	/* 懞 懞 */
+	0x2f8b0,	0x61f2,	/* 懲 懲 */
+	0x2f8b1,	0x61f6,	/* 懶 懶 */
+	0x2f8b2,	0x6210,	/* 成 成 */
+	0x2f8b3,	0x621b,	/* 戛 戛 */
+	0x2f8b4,	0x625d,	/* 扝 扝 */
+	0x2f8b5,	0x62b1,	/* 抱 抱 */
+	0x2f8b6,	0x62d4,	/* 拔 拔 */
+	0x2f8b7,	0x6350,	/* 捐 捐 */
+	0x2f8b8,	0x22b0c,	/* 𢬌 𢬌 */
+	0x2f8b9,	0x633d,	/* 挽 挽 */
+	0x2f8ba,	0x62fc,	/* 拼 拼 */
+	0x2f8bb,	0x6368,	/* 捨 捨 */
+	0x2f8bc,	0x6383,	/* 掃 掃 */
+	0x2f8bd,	0x63e4,	/* 揤 揤 */
+	0x2f8be,	0x22bf1,	/* 𢯱 𢯱 */
+	0x2f8bf,	0x6422,	/* 搢 搢 */
+	0x2f8c0,	0x63c5,	/* 揅 揅 */
+	0x2f8c1,	0x63a9,	/* 掩 掩 */
+	0x2f8c2,	0x3a2e,	/* 㨮 㨮 */
+	0x2f8c3,	0x6469,	/* 摩 摩 */
+	0x2f8c4,	0x647e,	/* 摾 摾 */
+	0x2f8c5,	0x649d,	/* 撝 撝 */
+	0x2f8c6,	0x6477,	/* 摷 摷 */
+	0x2f8c7,	0x3a6c,	/* 㩬 㩬 */
+	0x2f8c8,	0x654f,	/* 敏 敏 */
+	0x2f8c9,	0x656c,	/* 敬 敬 */
+	0x2f8ca,	0x2300a,	/* 𣀊 𣀊 */
+	0x2f8cb,	0x65e3,	/* 旣 旣 */
+	0x2f8cc,	0x66f8,	/* 書 書 */
+	0x2f8cd,	0x6649,	/* 晉 晉 */
+	0x2f8ce,	0x3b19,	/* 㬙 㬙 */
+	0x2f8cf,	0x6691,	/* 暑 暑 */
+	0x2f8d0,	0x3b08,	/* 㬈 㬈 */
+	0x2f8d1,	0x3ae4,	/* 㫤 㫤 */
+	0x2f8d2,	0x5192,	/* 冒 冒 */
+	0x2f8d3,	0x5195,	/* 冕 冕 */
+	0x2f8d4,	0x6700,	/* 最 最 */
+	0x2f8d5,	0x669c,	/* 暜 暜 */
+	0x2f8d6,	0x80ad,	/* 肭 肭 */
+	0x2f8d7,	0x43d9,	/* 䏙 䏙 */
+	0x2f8d8,	0x6717,	/* 朗 朗 */
+	0x2f8d9,	0x671b,	/* 望 望 */
+	0x2f8da,	0x6721,	/* 朡 朡 */
+	0x2f8db,	0x675e,	/* 杞 杞 */
+	0x2f8dc,	0x6753,	/* 杓 杓 */
+	0x2f8dd,	0x233c3,	/* 𣏃 𣏃 */
+	0x2f8de,	0x3b49,	/* 㭉 㭉 */
+	0x2f8df,	0x67fa,	/* 柺 柺 */
+	0x2f8e0,	0x6785,	/* 枅 枅 */
+	0x2f8e1,	0x6852,	/* 桒 桒 */
+	0x2f8e2,	0x6885,	/* 梅 梅 */
+	0x2f8e3,	0x2346d,	/* 𣑭 𣑭 */
+	0x2f8e4,	0x688e,	/* 梎 梎 */
+	0x2f8e5,	0x681f,	/* 栟 栟 */
+	0x2f8e6,	0x6914,	/* 椔 椔 */
+	0x2f8e7,	0x3b9d,	/* 㮝 㮝 */
+	0x2f8e8,	0x6942,	/* 楂 楂 */
+	0x2f8e9,	0x69a3,	/* 榣 榣 */
+	0x2f8ea,	0x69ea,	/* 槪 槪 */
+	0x2f8eb,	0x6aa8,	/* 檨 檨 */
+	0x2f8ec,	0x236a3,	/* 𣚣 𣚣 */
+	0x2f8ed,	0x6adb,	/* 櫛 櫛 */
+	0x2f8ee,	0x3c18,	/* 㰘 㰘 */
+	0x2f8ef,	0x6b21,	/* 次 次 */
+	0x2f8f0,	0x238a7,	/* 𣢧 𣢧 */
+	0x2f8f1,	0x6b54,	/* 歔 歔 */
+	0x2f8f2,	0x3c4e,	/* 㱎 㱎 */
+	0x2f8f3,	0x6b72,	/* 歲 歲 */
+	0x2f8f4,	0x6b9f,	/* 殟 殟 */
+	0x2f8f5,	0x6bba,	/* 殺 殺 */
+	0x2f8f6,	0x6bbb,	/* 殻 殻 */
+	0x2f8f7,	0x23a8d,	/* 𣪍 𣪍 */
+	0x2f8f8,	0x21d0b,	/* 𡴋 𡴋 */
+	0x2f8f9,	0x23afa,	/* 𣫺 𣫺 */
+	0x2f8fa,	0x6c4e,	/* 汎 汎 */
+	0x2f8fb,	0x23cbc,	/* 𣲼 𣲼 */
+	0x2f8fc,	0x6cbf,	/* 沿 沿 */
+	0x2f8fd,	0x6ccd,	/* 泍 泍 */
+	0x2f8fe,	0x6c67,	/* 汧 汧 */
+	0x2f8ff,	0x6d16,	/* 洖 洖 */
+	0x2f900,	0x6d3e,	/* 派 派 */
+	0x2f901,	0x6d77,	/* 海 海 */
+	0x2f902,	0x6d41,	/* 流 流 */
+	0x2f903,	0x6d69,	/* 浩 浩 */
+	0x2f904,	0x6d78,	/* 浸 浸 */
+	0x2f905,	0x6d85,	/* 涅 涅 */
+	0x2f906,	0x23d1e,	/* 𣴞 𣴞 */
+	0x2f907,	0x6d34,	/* 洴 洴 */
+	0x2f908,	0x6e2f,	/* 港 港 */
+	0x2f909,	0x6e6e,	/* 湮 湮 */
+	0x2f90a,	0x3d33,	/* 㴳 㴳 */
+	0x2f90b,	0x6ecb,	/* 滋 滋 */
+	0x2f90c,	0x6ec7,	/* 滇 滇 */
+	0x2f90d,	0x23ed1,	/* 𣻑 𣻑 */
+	0x2f90e,	0x6df9,	/* 淹 淹 */
+	0x2f90f,	0x6f6e,	/* 潮 潮 */
+	0x2f910,	0x23f5e,	/* 𣽞 𣽞 */
+	0x2f911,	0x23f8e,	/* 𣾎 𣾎 */
+	0x2f912,	0x6fc6,	/* 濆 濆 */
+	0x2f913,	0x7039,	/* 瀹 瀹 */
+	0x2f914,	0x701e,	/* 瀞 瀞 */
+	0x2f915,	0x701b,	/* 瀛 瀛 */
+	0x2f916,	0x3d96,	/* 㶖 㶖 */
+	0x2f917,	0x704a,	/* 灊 灊 */
+	0x2f918,	0x707d,	/* 災 災 */
+	0x2f919,	0x7077,	/* 灷 灷 */
+	0x2f91a,	0x70ad,	/* 炭 炭 */
+	0x2f91b,	0x20525,	/* 𠔥 𠔥 */
+	0x2f91c,	0x7145,	/* 煅 煅 */
+	0x2f91d,	0x24263,	/* 𤉣 𤉣 */
+	0x2f91e,	0x719c,	/* 熜 熜 */
+	0x2f91f,	0x243ab,	/* 𤎫 𤎫 */
+	0x2f920,	0x7228,	/* 爨 爨 */
+	0x2f921,	0x7235,	/* 爵 爵 */
+	0x2f922,	0x7250,	/* 牐 牐 */
+	0x2f923,	0x24608,	/* 𤘈 𤘈 */
+	0x2f924,	0x7280,	/* 犀 犀 */
+	0x2f925,	0x7295,	/* 犕 犕 */
+	0x2f926,	0x24735,	/* 𤜵 𤜵 */
+	0x2f927,	0x24814,	/* 𤠔 𤠔 */
+	0x2f928,	0x737a,	/* 獺 獺 */
+	0x2f929,	0x738b,	/* 王 王 */
+	0x2f92a,	0x3eac,	/* 㺬 㺬 */
+	0x2f92b,	0x73a5,	/* 玥 玥 */
+	0x2f92c,	0x3eb8,	/* 㺸 㺸 */
+	0x2f92d,	0x3eb8,	/* 㺸 㺸 */
+	0x2f92e,	0x7447,	/* 瑇 瑇 */
+	0x2f92f,	0x745c,	/* 瑜 瑜 */
+	0x2f930,	0x7471,	/* 瑱 瑱 */
+	0x2f931,	0x7485,	/* 璅 璅 */
+	0x2f932,	0x74ca,	/* 瓊 瓊 */
+	0x2f933,	0x3f1b,	/* 㼛 㼛 */
+	0x2f934,	0x7524,	/* 甤 甤 */
+	0x2f935,	0x24c36,	/* 𤰶 𤰶 */
+	0x2f936,	0x753e,	/* 甾 甾 */
+	0x2f937,	0x24c92,	/* 𤲒 𤲒 */
+	0x2f938,	0x7570,	/* 異 異 */
+	0x2f939,	0x2219f,	/* 𢆟 𢆟 */
+	0x2f93a,	0x7610,	/* 瘐 瘐 */
+	0x2f93b,	0x24fa1,	/* 𤾡 𤾡 */
+	0x2f93c,	0x24fb8,	/* 𤾸 𤾸 */
+	0x2f93d,	0x25044,	/* 𥁄 𥁄 */
+	0x2f93e,	0x3ffc,	/* 㿼 㿼 */
+	0x2f93f,	0x4008,	/* 䀈 䀈 */
+	0x2f940,	0x76f4,	/* 直 直 */
+	0x2f941,	0x250f3,	/* 𥃳 𥃳 */
+	0x2f942,	0x250f2,	/* 𥃲 𥃲 */
+	0x2f943,	0x25119,	/* 𥄙 𥄙 */
+	0x2f944,	0x25133,	/* 𥄳 𥄳 */
+	0x2f945,	0x771e,	/* 眞 眞 */
+	0x2f946,	0x771f,	/* 真 真 */
+	0x2f947,	0x771f,	/* 真 真 */
+	0x2f948,	0x774a,	/* 睊 睊 */
+	0x2f949,	0x4039,	/* 䀹 䀹 */
+	0x2f94a,	0x778b,	/* 瞋 瞋 */
+	0x2f94b,	0x4046,	/* 䁆 䁆 */
+	0x2f94c,	0x4096,	/* 䂖 䂖 */
+	0x2f94d,	0x2541d,	/* 𥐝 𥐝 */
+	0x2f94e,	0x784e,	/* 硎 硎 */
+	0x2f94f,	0x788c,	/* 碌 碌 */
+	0x2f950,	0x78cc,	/* 磌 磌 */
+	0x2f951,	0x40e3,	/* 䃣 䃣 */
+	0x2f952,	0x25626,	/* 𥘦 𥘦 */
+	0x2f953,	0x7956,	/* 祖 祖 */
+	0x2f954,	0x2569a,	/* 𥚚 𥚚 */
+	0x2f955,	0x256c5,	/* 𥛅 𥛅 */
+	0x2f956,	0x798f,	/* 福 福 */
+	0x2f957,	0x79eb,	/* 秫 秫 */
+	0x2f958,	0x412f,	/* 䄯 䄯 */
+	0x2f959,	0x7a40,	/* 穀 穀 */
+	0x2f95a,	0x7a4a,	/* 穊 穊 */
+	0x2f95b,	0x7a4f,	/* 穏 穏 */
+	0x2f95c,	0x2597c,	/* 𥥼 𥥼 */
+	0x2f95d,	0x25aa7,	/* 𥪧 𥪧 */
+	0x2f95e,	0x25aa7,	/* 𥪧 𥪧 */
+	0x2f95f,	0x7aee,	/* 竮 竮 */
+	0x2f960,	0x4202,	/* 䈂 䈂 */
+	0x2f961,	0x25bab,	/* 𥮫 𥮫 */
+	0x2f962,	0x7bc6,	/* 篆 篆 */
+	0x2f963,	0x7bc9,	/* 築 築 */
+	0x2f964,	0x4227,	/* 䈧 䈧 */
+	0x2f965,	0x25c80,	/* 𥲀 𥲀 */
+	0x2f966,	0x7cd2,	/* 糒 糒 */
+	0x2f967,	0x42a0,	/* 䊠 䊠 */
+	0x2f968,	0x7ce8,	/* 糨 糨 */
+	0x2f969,	0x7ce3,	/* 糣 糣 */
+	0x2f96a,	0x7d00,	/* 紀 紀 */
+	0x2f96b,	0x25f86,	/* 𥾆 𥾆 */
+	0x2f96c,	0x7d63,	/* 絣 絣 */
+	0x2f96d,	0x4301,	/* 䌁 䌁 */
+	0x2f96e,	0x7dc7,	/* 緇 緇 */
+	0x2f96f,	0x7e02,	/* 縂 縂 */
+	0x2f970,	0x7e45,	/* 繅 繅 */
+	0x2f971,	0x4334,	/* 䌴 䌴 */
+	0x2f972,	0x26228,	/* 𦈨 𦈨 */
+	0x2f973,	0x26247,	/* 𦉇 𦉇 */
+	0x2f974,	0x4359,	/* 䍙 䍙 */
+	0x2f975,	0x262d9,	/* 𦋙 𦋙 */
+	0x2f976,	0x7f7a,	/* 罺 罺 */
+	0x2f977,	0x2633e,	/* 𦌾 𦌾 */
+	0x2f978,	0x7f95,	/* 羕 羕 */
+	0x2f979,	0x7ffa,	/* 翺 翺 */
+	0x2f97a,	0x8005,	/* 者 者 */
+	0x2f97b,	0x264da,	/* 𦓚 𦓚 */
+	0x2f97c,	0x26523,	/* 𦔣 𦔣 */
+	0x2f97d,	0x8060,	/* 聠 聠 */
+	0x2f97e,	0x265a8,	/* 𦖨 𦖨 */
+	0x2f97f,	0x8070,	/* 聰 聰 */
+	0x2f980,	0x2335f,	/* 𣍟 𣍟 */
+	0x2f981,	0x43d5,	/* 䏕 䏕 */
+	0x2f982,	0x80b2,	/* 育 育 */
+	0x2f983,	0x8103,	/* 脃 脃 */
+	0x2f984,	0x440b,	/* 䐋 䐋 */
+	0x2f985,	0x813e,	/* 脾 脾 */
+	0x2f986,	0x5ab5,	/* 媵 媵 */
+	0x2f987,	0x267a7,	/* 𦞧 𦞧 */
+	0x2f988,	0x267b5,	/* 𦞵 𦞵 */
+	0x2f989,	0x23393,	/* 𣎓 𣎓 */
+	0x2f98a,	0x2339c,	/* 𣎜 𣎜 */
+	0x2f98b,	0x8201,	/* 舁 舁 */
+	0x2f98c,	0x8204,	/* 舄 舄 */
+	0x2f98d,	0x8f9e,	/* 辞 辞 */
+	0x2f98e,	0x446b,	/* 䑫 䑫 */
+	0x2f98f,	0x8291,	/* 芑 芑 */
+	0x2f990,	0x828b,	/* 芋 芋 */
+	0x2f991,	0x829d,	/* 芝 芝 */
+	0x2f992,	0x52b3,	/* 劳 劳 */
+	0x2f993,	0x82b1,	/* 花 花 */
+	0x2f994,	0x82b3,	/* 芳 芳 */
+	0x2f995,	0x82bd,	/* 芽 芽 */
+	0x2f996,	0x82e6,	/* 苦 苦 */
+	0x2f997,	0x26b3c,	/* 𦬼 𦬼 */
+	0x2f998,	0x82e5,	/* 若 若 */
+	0x2f999,	0x831d,	/* 茝 茝 */
+	0x2f99a,	0x8363,	/* 荣 荣 */
+	0x2f99b,	0x83ad,	/* 莭 莭 */
+	0x2f99c,	0x8323,	/* 茣 茣 */
+	0x2f99d,	0x83bd,	/* 莽 莽 */
+	0x2f99e,	0x83e7,	/* 菧 菧 */
+	0x2f99f,	0x8457,	/* 著 著 */
+	0x2f9a0,	0x8353,	/* 荓 荓 */
+	0x2f9a1,	0x83ca,	/* 菊 菊 */
+	0x2f9a2,	0x83cc,	/* 菌 菌 */
+	0x2f9a3,	0x83dc,	/* 菜 菜 */
+	0x2f9a4,	0x26c36,	/* 𦰶 𦰶 */
+	0x2f9a5,	0x26d6b,	/* 𦵫 𦵫 */
+	0x2f9a6,	0x26cd5,	/* 𦳕 𦳕 */
+	0x2f9a7,	0x452b,	/* 䔫 䔫 */
+	0x2f9a8,	0x84f1,	/* 蓱 蓱 */
+	0x2f9a9,	0x84f3,	/* 蓳 蓳 */
+	0x2f9aa,	0x8516,	/* 蔖 蔖 */
+	0x2f9ab,	0x273ca,	/* 𧏊 𧏊 */
+	0x2f9ac,	0x8564,	/* 蕤 蕤 */
+	0x2f9ad,	0x26f2c,	/* 𦼬 𦼬 */
+	0x2f9ae,	0x455d,	/* 䕝 䕝 */
+	0x2f9af,	0x4561,	/* 䕡 䕡 */
+	0x2f9b0,	0x26fb1,	/* 𦾱 𦾱 */
+	0x2f9b1,	0x270d2,	/* 𧃒 𧃒 */
+	0x2f9b2,	0x456b,	/* 䕫 䕫 */
+	0x2f9b3,	0x8650,	/* 虐 虐 */
+	0x2f9b4,	0x865c,	/* 虜 虜 */
+	0x2f9b5,	0x8667,	/* 虧 虧 */
+	0x2f9b6,	0x8669,	/* 虩 虩 */
+	0x2f9b7,	0x86a9,	/* 蚩 蚩 */
+	0x2f9b8,	0x8688,	/* 蚈 蚈 */
+	0x2f9b9,	0x870e,	/* 蜎 蜎 */
+	0x2f9ba,	0x86e2,	/* 蛢 蛢 */
+	0x2f9bb,	0x8779,	/* 蝹 蝹 */
+	0x2f9bc,	0x8728,	/* 蜨 蜨 */
+	0x2f9bd,	0x876b,	/* 蝫 蝫 */
+	0x2f9be,	0x8786,	/* 螆 螆 */
+	0x2f9bf,	0x45d7,	/* 䗗 䗗 */
+	0x2f9c0,	0x87e1,	/* 蟡 蟡 */
+	0x2f9c1,	0x8801,	/* 蠁 蠁 */
+	0x2f9c2,	0x45f9,	/* 䗹 䗹 */
+	0x2f9c3,	0x8860,	/* 衠 衠 */
+	0x2f9c4,	0x8863,	/* 衣 衣 */
+	0x2f9c5,	0x27667,	/* 𧙧 𧙧 */
+	0x2f9c6,	0x88d7,	/* 裗 裗 */
+	0x2f9c7,	0x88de,	/* 裞 裞 */
+	0x2f9c8,	0x4635,	/* 䘵 䘵 */
+	0x2f9c9,	0x88fa,	/* 裺 裺 */
+	0x2f9ca,	0x34bb,	/* 㒻 㒻 */
+	0x2f9cb,	0x278ae,	/* 𧢮 𧢮 */
+	0x2f9cc,	0x27966,	/* 𧥦 𧥦 */
+	0x2f9cd,	0x46be,	/* 䚾 䚾 */
+	0x2f9ce,	0x46c7,	/* 䛇 䛇 */
+	0x2f9cf,	0x8aa0,	/* 誠 誠 */
+	0x2f9d0,	0x8aed,	/* 諭 諭 */
+	0x2f9d1,	0x8b8a,	/* 變 變 */
+	0x2f9d2,	0x8c55,	/* 豕 豕 */
+	0x2f9d3,	0x27ca8,	/* 𧲨 𧲨 */
+	0x2f9d4,	0x8cab,	/* 貫 貫 */
+	0x2f9d5,	0x8cc1,	/* 賁 賁 */
+	0x2f9d6,	0x8d1b,	/* 贛 贛 */
+	0x2f9d7,	0x8d77,	/* 起 起 */
+	0x2f9d8,	0x27f2f,	/* 𧼯 𧼯 */
+	0x2f9d9,	0x20804,	/* 𠠄 𠠄 */
+	0x2f9da,	0x8dcb,	/* 跋 跋 */
+	0x2f9db,	0x8dbc,	/* 趼 趼 */
+	0x2f9dc,	0x8df0,	/* 跰 跰 */
+	0x2f9dd,	0x208de,	/* 𠣞 𠣞 */
+	0x2f9de,	0x8ed4,	/* 軔 軔 */
+	0x2f9df,	0x8f38,	/* 輸 輸 */
+	0x2f9e0,	0x285d2,	/* 𨗒 𨗒 */
+	0x2f9e1,	0x285ed,	/* 𨗭 𨗭 */
+	0x2f9e2,	0x9094,	/* 邔 邔 */
+	0x2f9e3,	0x90f1,	/* 郱 郱 */
+	0x2f9e4,	0x9111,	/* 鄑 鄑 */
+	0x2f9e5,	0x2872e,	/* 𨜮 𨜮 */
+	0x2f9e6,	0x911b,	/* 鄛 鄛 */
+	0x2f9e7,	0x9238,	/* 鈸 鈸 */
+	0x2f9e8,	0x92d7,	/* 鋗 鋗 */
+	0x2f9e9,	0x92d8,	/* 鋘 鋘 */
+	0x2f9ea,	0x927c,	/* 鉼 鉼 */
+	0x2f9eb,	0x93f9,	/* 鏹 鏹 */
+	0x2f9ec,	0x9415,	/* 鐕 鐕 */
+	0x2f9ed,	0x28bfa,	/* 𨯺 𨯺 */
+	0x2f9ee,	0x958b,	/* 開 開 */
+	0x2f9ef,	0x4995,	/* 䦕 䦕 */
+	0x2f9f0,	0x95b7,	/* 閷 閷 */
+	0x2f9f1,	0x28d77,	/* 𨵷 𨵷 */
+	0x2f9f2,	0x49e6,	/* 䧦 䧦 */
+	0x2f9f3,	0x96c3,	/* 雃 雃 */
+	0x2f9f4,	0x5db2,	/* 嶲 嶲 */
+	0x2f9f5,	0x9723,	/* 霣 霣 */
+	0x2f9f6,	0x29145,	/* 𩅅 𩅅 */
+	0x2f9f7,	0x2921a,	/* 𩈚 𩈚 */
+	0x2f9f8,	0x4a6e,	/* 䩮 䩮 */
+	0x2f9f9,	0x4a76,	/* 䩶 䩶 */
+	0x2f9fa,	0x97e0,	/* 韠 韠 */
+	0x2f9fb,	0x2940a,	/* 𩐊 𩐊 */
+	0x2f9fc,	0x4ab2,	/* 䪲 䪲 */
+	0x2f9fd,	0x29496,	/* 𩒖 𩒖 */
+	0x2f9fe,	0x980b,	/* 頋 頋 */
+	0x2f9ff,	0x980b,	/* 頋 頋 */
+	0x2fa00,	0x9829,	/* 頩 頩 */
+	0x2fa01,	0x295b6,	/* 𩖶 𩖶 */
+	0x2fa02,	0x98e2,	/* 飢 飢 */
+	0x2fa03,	0x4b33,	/* 䬳 䬳 */
+	0x2fa04,	0x9929,	/* 餩 餩 */
+	0x2fa05,	0x99a7,	/* 馧 馧 */
+	0x2fa06,	0x99c2,	/* 駂 駂 */
+	0x2fa07,	0x99fe,	/* 駾 駾 */
+	0x2fa08,	0x4bce,	/* 䯎 䯎 */
+	0x2fa09,	0x29b30,	/* 𩬰 𩬰 */
+	0x2fa0a,	0x9b12,	/* 鬒 鬒 */
+	0x2fa0b,	0x9c40,	/* 鱀 鱀 */
+	0x2fa0c,	0x9cfd,	/* 鳽 鳽 */
+	0x2fa0d,	0x4cce,	/* 䳎 䳎 */
+	0x2fa0e,	0x4ced,	/* 䳭 䳭 */
+	0x2fa0f,	0x9d67,	/* 鵧 鵧 */
+	0x2fa10,	0x2a0ce,	/* 𪃎 𪃎 */
+	0x2fa11,	0x4cf8,	/* 䳸 䳸 */
+	0x2fa12,	0x2a105,	/* 𪄅 𪄅 */
+	0x2fa13,	0x2a20e,	/* 𪈎 𪈎 */
+	0x2fa14,	0x2a291,	/* 𪊑 𪊑 */
+	0x2fa15,	0x9ebb,	/* 麻 麻 */
+	0x2fa16,	0x4d56,	/* 䵖 䵖 */
+	0x2fa17,	0x9ef9,	/* 黹 黹 */
+	0x2fa18,	0x9efe,	/* 黾 黾 */
+	0x2fa19,	0x9f05,	/* 鼅 鼅 */
+	0x2fa1a,	0x9f0f,	/* 鼏 鼏 */
+	0x2fa1b,	0x9f16,	/* 鼖 鼖 */
+	0x2fa1c,	0x9f3b,	/* 鼻 鼻 */
 };
 };
 
 
 Rune
 Rune

+ 2 - 1177
sys/src/libc/port/runetype.c

@@ -1,1181 +1,6 @@
 #include	<u.h>
 #include	<u.h>
 #include	<libc.h>
 #include	<libc.h>
 
 
-/*
- * alpha ranges -
- *	only covers ranges not in lower||upper
- */
-static
-Rune	_alpha2[] =
-{
-	0x00d8,	0x00f6,	/* Ø - ö */
-	0x00f8,	0x01f5,	/* ø - ǵ */
-	0x0250,	0x02a8,	/* ɐ - ʨ */
-	0x038e,	0x03a1,	/* Ύ - Ρ */
-	0x03a3,	0x03ce,	/* Σ - ώ */
-	0x03d0,	0x03d6,	/* ϐ - ϖ */
-	0x03e2,	0x03f3,	/* Ϣ - ϳ */
-	0x0490,	0x04c4,	/* Ґ - ӄ */
-	0x0561,	0x0587,	/* ա - և */
-	0x05d0,	0x05ea,	/* א - ת */
-	0x05f0,	0x05f2,	/* װ - ײ */
-	0x0621,	0x063a,	/* ء - غ */
-	0x0640,	0x064a,	/* ـ - ي */
-	0x0671,	0x06b7,	/* ٱ - ڷ */
-	0x06ba,	0x06be,	/* ں - ھ */
-	0x06c0,	0x06ce,	/* ۀ - ێ */
-	0x06d0,	0x06d3,	/* ې - ۓ */
-	0x0905,	0x0939,	/* अ - ह */
-	0x0958,	0x0961,	/* क़ - ॡ */
-	0x0985,	0x098c,	/* অ - ঌ */
-	0x098f,	0x0990,	/* এ - ঐ */
-	0x0993,	0x09a8,	/* ও - ন */
-	0x09aa,	0x09b0,	/* প - র */
-	0x09b6,	0x09b9,	/* শ - হ */
-	0x09dc,	0x09dd,	/* ড় - ঢ় */
-	0x09df,	0x09e1,	/* য় - ৡ */
-	0x09f0,	0x09f1,	/* ৰ - ৱ */
-	0x0a05,	0x0a0a,	/* ਅ - ਊ */
-	0x0a0f,	0x0a10,	/* ਏ - ਐ */
-	0x0a13,	0x0a28,	/* ਓ - ਨ */
-	0x0a2a,	0x0a30,	/* ਪ - ਰ */
-	0x0a32,	0x0a33,	/* ਲ - ਲ਼ */
-	0x0a35,	0x0a36,	/* ਵ - ਸ਼ */
-	0x0a38,	0x0a39,	/* ਸ - ਹ */
-	0x0a59,	0x0a5c,	/* ਖ਼ - ੜ */
-	0x0a85,	0x0a8b,	/* અ - ઋ */
-	0x0a8f,	0x0a91,	/* એ - ઑ */
-	0x0a93,	0x0aa8,	/* ઓ - ન */
-	0x0aaa,	0x0ab0,	/* પ - ર */
-	0x0ab2,	0x0ab3,	/* લ - ળ */
-	0x0ab5,	0x0ab9,	/* વ - હ */
-	0x0b05,	0x0b0c,	/* ଅ - ଌ */
-	0x0b0f,	0x0b10,	/* ଏ - ଐ */
-	0x0b13,	0x0b28,	/* ଓ - ନ */
-	0x0b2a,	0x0b30,	/* ପ - ର */
-	0x0b32,	0x0b33,	/* ଲ - ଳ */
-	0x0b36,	0x0b39,	/* ଶ - ହ */
-	0x0b5c,	0x0b5d,	/* ଡ଼ - ଢ଼ */
-	0x0b5f,	0x0b61,	/* ୟ - ୡ */
-	0x0b85,	0x0b8a,	/* அ - ஊ */
-	0x0b8e,	0x0b90,	/* எ - ஐ */
-	0x0b92,	0x0b95,	/* ஒ - க */
-	0x0b99,	0x0b9a,	/* ங - ச */
-	0x0b9e,	0x0b9f,	/* ஞ - ட */
-	0x0ba3,	0x0ba4,	/* ண - த */
-	0x0ba8,	0x0baa,	/* ந - ப */
-	0x0bae,	0x0bb5,	/* ம - வ */
-	0x0bb7,	0x0bb9,	/* ஷ - ஹ */
-	0x0c05,	0x0c0c,	/* అ - ఌ */
-	0x0c0e,	0x0c10,	/* ఎ - ఐ */
-	0x0c12,	0x0c28,	/* ఒ - న */
-	0x0c2a,	0x0c33,	/* ప - ళ */
-	0x0c35,	0x0c39,	/* వ - హ */
-	0x0c60,	0x0c61,	/* ౠ - ౡ */
-	0x0c85,	0x0c8c,	/* ಅ - ಌ */
-	0x0c8e,	0x0c90,	/* ಎ - ಐ */
-	0x0c92,	0x0ca8,	/* ಒ - ನ */
-	0x0caa,	0x0cb3,	/* ಪ - ಳ */
-	0x0cb5,	0x0cb9,	/* ವ - ಹ */
-	0x0ce0,	0x0ce1,	/* ೠ - ೡ */
-	0x0d05,	0x0d0c,	/* അ - ഌ */
-	0x0d0e,	0x0d10,	/* എ - ഐ */
-	0x0d12,	0x0d28,	/* ഒ - ന */
-	0x0d2a,	0x0d39,	/* പ - ഹ */
-	0x0d60,	0x0d61,	/* ൠ - ൡ */
-	0x0e01,	0x0e30,	/* ก - ะ */
-	0x0e32,	0x0e33,	/* า - ำ */
-	0x0e40,	0x0e46,	/* เ - ๆ */
-	0x0e5a,	0x0e5b,	/* ๚ - ๛ */
-	0x0e81,	0x0e82,	/* ກ - ຂ */
-	0x0e87,	0x0e88,	/* ງ - ຈ */
-	0x0e94,	0x0e97,	/* ດ - ທ */
-	0x0e99,	0x0e9f,	/* ນ - ຟ */
-	0x0ea1,	0x0ea3,	/* ມ - ຣ */
-	0x0eaa,	0x0eab,	/* ສ - ຫ */
-	0x0ead,	0x0eae,	/* ອ - ຮ */
-	0x0eb2,	0x0eb3,	/* າ - ຳ */
-	0x0ec0,	0x0ec4,	/* ເ - ໄ */
-	0x0edc,	0x0edd,	/* ໜ - ໝ */
-	0x0f18,	0x0f19,	/* ༘ - ༙ */
-	0x0f40,	0x0f47,	/* ཀ - ཇ */
-	0x0f49,	0x0f69,	/* ཉ - ཀྵ */
-	0x10d0,	0x10f6,	/* ა - ჶ */
-	0x1100,	0x1159,	/* ᄀ - ᅙ */
-	0x115f,	0x11a2,	/* ᅟ - ᆢ */
-	0x11a8,	0x11f9,	/* ᆨ - ᇹ */
-	0x1e00,	0x1e9b,	/* Ḁ - ẛ */
-	0x1f50,	0x1f57,	/* ὐ - ὗ */
-	0x1f80,	0x1fb4,	/* ᾀ - ᾴ */
-	0x1fb6,	0x1fbc,	/* ᾶ - ᾼ */
-	0x1fc2,	0x1fc4,	/* ῂ - ῄ */
-	0x1fc6,	0x1fcc,	/* ῆ - ῌ */
-	0x1fd0,	0x1fd3,	/* ῐ - ΐ */
-	0x1fd6,	0x1fdb,	/* ῖ - Ί */
-	0x1fe0,	0x1fec,	/* ῠ - Ῥ */
-	0x1ff2,	0x1ff4,	/* ῲ - ῴ */
-	0x1ff6,	0x1ffc,	/* ῶ - ῼ */
-	0x210a,	0x2113,	/* ℊ - ℓ */
-	0x2115,	0x211d,	/* ℕ - ℝ */
-	0x2120,	0x2122,	/* ℠ - ™ */
-	0x212a,	0x2131,	/* K - ℱ */
-	0x2133,	0x2138,	/* ℳ - ℸ */
-	0x3041,	0x3094,	/* ぁ - ゔ */
-	0x30a1,	0x30fa,	/* ァ - ヺ */
-	0x3105,	0x312c,	/* ㄅ - ㄬ */
-	0x3131,	0x318e,	/* ㄱ - ㆎ */
-	0x3192,	0x319f,	/* ㆒ - ㆟ */
-	0x3260,	0x327b,	/* ㉠ - ㉻ */
-	0x328a,	0x32b0,	/* ㊊ - ㊰ */
-	0x32d0,	0x32fe,	/* ㋐ - ㋾ */
-	0x3300,	0x3357,	/* ㌀ - ㍗ */
-	0x3371,	0x3376,	/* ㍱ - ㍶ */
-	0x337b,	0x3394,	/* ㍻ - ㎔ */
-	0x3399,	0x339e,	/* ㎙ - ㎞ */
-	0x33a9,	0x33ad,	/* ㎩ - ㎭ */
-	0x33b0,	0x33c1,	/* ㎰ - ㏁ */
-	0x33c3,	0x33c5,	/* ㏃ - ㏅ */
-	0x33c7,	0x33d7,	/* ㏇ - ㏗ */
-	0x33d9,	0x33dd,	/* ㏙ - ㏝ */
-	0x4e00,	0x9fff,	/* 一 - 鿿 */
-	0xac00,	0xd7a3,	/* 가 - 힣 */
-	0xf900,	0xfb06,	/* 豈 - st */
-	0xfb13,	0xfb17,	/* ﬓ - ﬗ */
-	0xfb1f,	0xfb28,	/* ײַ - ﬨ */
-	0xfb2a,	0xfb36,	/* שׁ - זּ */
-	0xfb38,	0xfb3c,	/* טּ - לּ */
-	0xfb40,	0xfb41,	/* נּ - סּ */
-	0xfb43,	0xfb44,	/* ףּ - פּ */
-	0xfb46,	0xfbb1,	/* צּ - ﮱ */
-	0xfbd3,	0xfd3d,	/* ﯓ - ﴽ */
-	0xfd50,	0xfd8f,	/* ﵐ - ﶏ */
-	0xfd92,	0xfdc7,	/* ﶒ - ﷇ */
-	0xfdf0,	0xfdf9,	/* ﷰ - ﷹ */
-	0xfe70,	0xfe72,	/* ﹰ - ﹲ */
-	0xfe76,	0xfefc,	/* ﹶ - ﻼ */
-	0xff66,	0xff6f,	/* ヲ - ッ */
-	0xff71,	0xff9d,	/* ア - ン */
-	0xffa0,	0xffbe,	/* ᅠ - ᄒ */
-	0xffc2,	0xffc7,	/* ᅡ - ᅦ */
-	0xffca,	0xffcf,	/* ᅧ - ᅬ */
-	0xffd2,	0xffd7,	/* ᅭ - ᅲ */
-	0xffda,	0xffdc,	/* ᅳ - ᅵ */
-};
+Rune*_runebsearch(Rune c, Rune *t, int n, int ne);
 
 
-/*
- * alpha singlets -
- *	only covers ranges not in lower||upper
- */
-static
-Rune	_alpha1[] =
-{
-	0x00aa,	/* ª */
-	0x00b5,	/* µ */
-	0x00ba,	/* º */
-	0x03da,	/* Ϛ */
-	0x03dc,	/* Ϝ */
-	0x03de,	/* Ϟ */
-	0x03e0,	/* Ϡ */
-	0x06d5,	/* ە */
-	0x09b2,	/* ল */
-	0x0a5e,	/* ਫ਼ */
-	0x0a8d,	/* ઍ */
-	0x0ae0,	/* ૠ */
-	0x0b9c,	/* ஜ */
-	0x0cde,	/* ೞ */
-	0x0e4f,	/* ๏ */
-	0x0e84,	/* ຄ */
-	0x0e8a,	/* ຊ */
-	0x0e8d,	/* ຍ */
-	0x0ea5,	/* ລ */
-	0x0ea7,	/* ວ */
-	0x0eb0,	/* ະ */
-	0x0ebd,	/* ຽ */
-	0x1fbe,	/* ι */
-	0x207f,	/* ⁿ */
-	0x20a8,	/* ₨ */
-	0x2102,	/* ℂ */
-	0x2107,	/* ℇ */
-	0x2124,	/* ℤ */
-	0x2126,	/* Ω */
-	0x2128,	/* ℨ */
-	0xfb3e,	/* מּ */
-	0xfe74,	/* ﹴ */
-};
-
-/*
- * space ranges
- */
-static
-Rune	_space2[] =
-{
-	0x0009,	0x000a,	/* tab and newline */
-	0x0020,	0x0020,	/* space */
-	0x0085, 0x0085,
-	0x00a0,	0x00a0,	/*   */
-	0x1680, 0x1680,
-	0x180e, 0x180e,
-	0x2000,	0x200b,	/*   - ​ */
-	0x2028,	0x2029,	/* 
 - 
 */
-	0x202f, 0x202f,
-	0x205f, 0x205f,
-	0x3000,	0x3000,	/*   */
-	0xfeff,	0xfeff,	/*  */
-};
-
-/*
- * lower case ranges
- *	3rd col is conversion excess 500
- */
-static
-Rune	_toupper2[] =
-{
-	0x0061,	0x007a, 468,	/* a-z A-Z */
-	0x00e0,	0x00f6, 468,	/* à-ö À-Ö */
-	0x00f8,	0x00fe, 468,	/* ø-þ Ø-Þ */
-	0x0256,	0x0257, 295,	/* ɖ-ɗ Ɖ-Ɗ */
-	0x0258,	0x0259, 298,	/* ɘ-ə Ǝ-Ə */
-	0x028a,	0x028b, 283,	/* ʊ-ʋ Ʊ-Ʋ */
-	0x03ad,	0x03af, 463,	/* έ-ί Έ-Ί */
-	0x03b1,	0x03c1, 468,	/* α-ρ Α-Ρ */
-	0x03c3,	0x03cb, 468,	/* σ-ϋ Σ-Ϋ */
-	0x03cd,	0x03ce, 437,	/* ύ-ώ Ύ-Ώ */
-	0x0430,	0x044f, 468,	/* а-я А-Я */
-	0x0451,	0x045c, 420,	/* ё-ќ Ё-Ќ */
-	0x045e,	0x045f, 420,	/* ў-џ Ў-Џ */
-	0x0561,	0x0586, 452,	/* ա-ֆ Ա-Ֆ */
-	0x1f00,	0x1f07, 508,	/* ἀ-ἇ Ἀ-Ἇ */
-	0x1f10,	0x1f15, 508,	/* ἐ-ἕ Ἐ-Ἕ */
-	0x1f20,	0x1f27, 508,	/* ἠ-ἧ Ἠ-Ἧ */
-	0x1f30,	0x1f37, 508,	/* ἰ-ἷ Ἰ-Ἷ */
-	0x1f40,	0x1f45, 508,	/* ὀ-ὅ Ὀ-Ὅ */
-	0x1f60,	0x1f67, 508,	/* ὠ-ὧ Ὠ-Ὧ */
-	0x1f70,	0x1f71, 574,	/* ὰ-ά Ὰ-Ά */
-	0x1f72,	0x1f75, 586,	/* ὲ-ή Ὲ-Ή */
-	0x1f76,	0x1f77, 600,	/* ὶ-ί Ὶ-Ί */
-	0x1f78,	0x1f79, 628,	/* ὸ-ό Ὸ-Ό */
-	0x1f7a,	0x1f7b, 612,	/* ὺ-ύ Ὺ-Ύ */
-	0x1f7c,	0x1f7d, 626,	/* ὼ-ώ Ὼ-Ώ */
-	0x1f80,	0x1f87, 508,	/* ᾀ-ᾇ ᾈ-ᾏ */
-	0x1f90,	0x1f97, 508,	/* ᾐ-ᾗ ᾘ-ᾟ */
-	0x1fa0,	0x1fa7, 508,	/* ᾠ-ᾧ ᾨ-ᾯ */
-	0x1fb0,	0x1fb1, 508,	/* ᾰ-ᾱ Ᾰ-Ᾱ */
-	0x1fd0,	0x1fd1, 508,	/* ῐ-ῑ Ῐ-Ῑ */
-	0x1fe0,	0x1fe1, 508,	/* ῠ-ῡ Ῠ-Ῡ */
-	0x2170,	0x217f, 484,	/* ⅰ-ⅿ Ⅰ-Ⅿ */
-	0x24d0,	0x24e9, 474,	/* ⓐ-ⓩ Ⓐ-Ⓩ */
-	0xff41,	0xff5a, 468,	/* a-z A-Z */
-};
-
-/*
- * lower case singlets
- *	2nd col is conversion excess 500
- */
-static
-Rune	_toupper1[] =
-{
-	0x00ff, 621,	/* ÿ Ÿ */
-	0x0101, 499,	/* ā Ā */
-	0x0103, 499,	/* ă Ă */
-	0x0105, 499,	/* ą Ą */
-	0x0107, 499,	/* ć Ć */
-	0x0109, 499,	/* ĉ Ĉ */
-	0x010b, 499,	/* ċ Ċ */
-	0x010d, 499,	/* č Č */
-	0x010f, 499,	/* ď Ď */
-	0x0111, 499,	/* đ Đ */
-	0x0113, 499,	/* ē Ē */
-	0x0115, 499,	/* ĕ Ĕ */
-	0x0117, 499,	/* ė Ė */
-	0x0119, 499,	/* ę Ę */
-	0x011b, 499,	/* ě Ě */
-	0x011d, 499,	/* ĝ Ĝ */
-	0x011f, 499,	/* ğ Ğ */
-	0x0121, 499,	/* ġ Ġ */
-	0x0123, 499,	/* ģ Ģ */
-	0x0125, 499,	/* ĥ Ĥ */
-	0x0127, 499,	/* ħ Ħ */
-	0x0129, 499,	/* ĩ Ĩ */
-	0x012b, 499,	/* ī Ī */
-	0x012d, 499,	/* ĭ Ĭ */
-	0x012f, 499,	/* į Į */
-	0x0131, 268,	/* ı I */
-	0x0133, 499,	/* ij IJ */
-	0x0135, 499,	/* ĵ Ĵ */
-	0x0137, 499,	/* ķ Ķ */
-	0x013a, 499,	/* ĺ Ĺ */
-	0x013c, 499,	/* ļ Ļ */
-	0x013e, 499,	/* ľ Ľ */
-	0x0140, 499,	/* ŀ Ŀ */
-	0x0142, 499,	/* ł Ł */
-	0x0144, 499,	/* ń Ń */
-	0x0146, 499,	/* ņ Ņ */
-	0x0148, 499,	/* ň Ň */
-	0x014b, 499,	/* ŋ Ŋ */
-	0x014d, 499,	/* ō Ō */
-	0x014f, 499,	/* ŏ Ŏ */
-	0x0151, 499,	/* ő Ő */
-	0x0153, 499,	/* œ Œ */
-	0x0155, 499,	/* ŕ Ŕ */
-	0x0157, 499,	/* ŗ Ŗ */
-	0x0159, 499,	/* ř Ř */
-	0x015b, 499,	/* ś Ś */
-	0x015d, 499,	/* ŝ Ŝ */
-	0x015f, 499,	/* ş Ş */
-	0x0161, 499,	/* š Š */
-	0x0163, 499,	/* ţ Ţ */
-	0x0165, 499,	/* ť Ť */
-	0x0167, 499,	/* ŧ Ŧ */
-	0x0169, 499,	/* ũ Ũ */
-	0x016b, 499,	/* ū Ū */
-	0x016d, 499,	/* ŭ Ŭ */
-	0x016f, 499,	/* ů Ů */
-	0x0171, 499,	/* ű Ű */
-	0x0173, 499,	/* ų Ų */
-	0x0175, 499,	/* ŵ Ŵ */
-	0x0177, 499,	/* ŷ Ŷ */
-	0x017a, 499,	/* ź Ź */
-	0x017c, 499,	/* ż Ż */
-	0x017e, 499,	/* ž Ž */
-	0x017f, 200,	/* ſ S */
-	0x0183, 499,	/* ƃ Ƃ */
-	0x0185, 499,	/* ƅ Ƅ */
-	0x0188, 499,	/* ƈ Ƈ */
-	0x018c, 499,	/* ƌ Ƌ */
-	0x0192, 499,	/* ƒ Ƒ */
-	0x0199, 499,	/* ƙ Ƙ */
-	0x01a1, 499,	/* ơ Ơ */
-	0x01a3, 499,	/* ƣ Ƣ */
-	0x01a5, 499,	/* ƥ Ƥ */
-	0x01a8, 499,	/* ƨ Ƨ */
-	0x01ad, 499,	/* ƭ Ƭ */
-	0x01b0, 499,	/* ư Ư */
-	0x01b4, 499,	/* ƴ Ƴ */
-	0x01b6, 499,	/* ƶ Ƶ */
-	0x01b9, 499,	/* ƹ Ƹ */
-	0x01bd, 499,	/* ƽ Ƽ */
-	0x01c5, 499,	/* Dž DŽ */
-	0x01c6, 498,	/* dž DŽ */
-	0x01c8, 499,	/* Lj LJ */
-	0x01c9, 498,	/* lj LJ */
-	0x01cb, 499,	/* Nj NJ */
-	0x01cc, 498,	/* nj NJ */
-	0x01ce, 499,	/* ǎ Ǎ */
-	0x01d0, 499,	/* ǐ Ǐ */
-	0x01d2, 499,	/* ǒ Ǒ */
-	0x01d4, 499,	/* ǔ Ǔ */
-	0x01d6, 499,	/* ǖ Ǖ */
-	0x01d8, 499,	/* ǘ Ǘ */
-	0x01da, 499,	/* ǚ Ǚ */
-	0x01dc, 499,	/* ǜ Ǜ */
-	0x01df, 499,	/* ǟ Ǟ */
-	0x01e1, 499,	/* ǡ Ǡ */
-	0x01e3, 499,	/* ǣ Ǣ */
-	0x01e5, 499,	/* ǥ Ǥ */
-	0x01e7, 499,	/* ǧ Ǧ */
-	0x01e9, 499,	/* ǩ Ǩ */
-	0x01eb, 499,	/* ǫ Ǫ */
-	0x01ed, 499,	/* ǭ Ǭ */
-	0x01ef, 499,	/* ǯ Ǯ */
-	0x01f2, 499,	/* Dz DZ */
-	0x01f3, 498,	/* dz DZ */
-	0x01f5, 499,	/* ǵ Ǵ */
-	0x01fb, 499,	/* ǻ Ǻ */
-	0x01fd, 499,	/* ǽ Ǽ */
-	0x01ff, 499,	/* ǿ Ǿ */
-	0x0201, 499,	/* ȁ Ȁ */
-	0x0203, 499,	/* ȃ Ȃ */
-	0x0205, 499,	/* ȅ Ȅ */
-	0x0207, 499,	/* ȇ Ȇ */
-	0x0209, 499,	/* ȉ Ȉ */
-	0x020b, 499,	/* ȋ Ȋ */
-	0x020d, 499,	/* ȍ Ȍ */
-	0x020f, 499,	/* ȏ Ȏ */
-	0x0211, 499,	/* ȑ Ȑ */
-	0x0213, 499,	/* ȓ Ȓ */
-	0x0215, 499,	/* ȕ Ȕ */
-	0x0217, 499,	/* ȗ Ȗ */
-	0x0253, 290,	/* ɓ Ɓ */
-	0x0254, 294,	/* ɔ Ɔ */
-	0x025b, 297,	/* ɛ Ɛ */
-	0x0260, 295,	/* ɠ Ɠ */
-	0x0263, 293,	/* ɣ Ɣ */
-	0x0268, 291,	/* ɨ Ɨ */
-	0x0269, 289,	/* ɩ Ɩ */
-	0x026f, 289,	/* ɯ Ɯ */
-	0x0272, 287,	/* ɲ Ɲ */
-	0x0283, 282,	/* ʃ Ʃ */
-	0x0288, 282,	/* ʈ Ʈ */
-	0x0292, 281,	/* ʒ Ʒ */
-	0x03ac, 462,	/* ά Ά */
-	0x03cc, 436,	/* ό Ό */
-	0x03d0, 438,	/* ϐ Β */
-	0x03d1, 443,	/* ϑ Θ */
-	0x03d5, 453,	/* ϕ Φ */
-	0x03d6, 446,	/* ϖ Π */
-	0x03e3, 499,	/* ϣ Ϣ */
-	0x03e5, 499,	/* ϥ Ϥ */
-	0x03e7, 499,	/* ϧ Ϧ */
-	0x03e9, 499,	/* ϩ Ϩ */
-	0x03eb, 499,	/* ϫ Ϫ */
-	0x03ed, 499,	/* ϭ Ϭ */
-	0x03ef, 499,	/* ϯ Ϯ */
-	0x03f0, 414,	/* ϰ Κ */
-	0x03f1, 420,	/* ϱ Ρ */
-	0x0461, 499,	/* ѡ Ѡ */
-	0x0463, 499,	/* ѣ Ѣ */
-	0x0465, 499,	/* ѥ Ѥ */
-	0x0467, 499,	/* ѧ Ѧ */
-	0x0469, 499,	/* ѩ Ѩ */
-	0x046b, 499,	/* ѫ Ѫ */
-	0x046d, 499,	/* ѭ Ѭ */
-	0x046f, 499,	/* ѯ Ѯ */
-	0x0471, 499,	/* ѱ Ѱ */
-	0x0473, 499,	/* ѳ Ѳ */
-	0x0475, 499,	/* ѵ Ѵ */
-	0x0477, 499,	/* ѷ Ѷ */
-	0x0479, 499,	/* ѹ Ѹ */
-	0x047b, 499,	/* ѻ Ѻ */
-	0x047d, 499,	/* ѽ Ѽ */
-	0x047f, 499,	/* ѿ Ѿ */
-	0x0481, 499,	/* ҁ Ҁ */
-	0x0491, 499,	/* ґ Ґ */
-	0x0493, 499,	/* ғ Ғ */
-	0x0495, 499,	/* ҕ Ҕ */
-	0x0497, 499,	/* җ Җ */
-	0x0499, 499,	/* ҙ Ҙ */
-	0x049b, 499,	/* қ Қ */
-	0x049d, 499,	/* ҝ Ҝ */
-	0x049f, 499,	/* ҟ Ҟ */
-	0x04a1, 499,	/* ҡ Ҡ */
-	0x04a3, 499,	/* ң Ң */
-	0x04a5, 499,	/* ҥ Ҥ */
-	0x04a7, 499,	/* ҧ Ҧ */
-	0x04a9, 499,	/* ҩ Ҩ */
-	0x04ab, 499,	/* ҫ Ҫ */
-	0x04ad, 499,	/* ҭ Ҭ */
-	0x04af, 499,	/* ү Ү */
-	0x04b1, 499,	/* ұ Ұ */
-	0x04b3, 499,	/* ҳ Ҳ */
-	0x04b5, 499,	/* ҵ Ҵ */
-	0x04b7, 499,	/* ҷ Ҷ */
-	0x04b9, 499,	/* ҹ Ҹ */
-	0x04bb, 499,	/* һ Һ */
-	0x04bd, 499,	/* ҽ Ҽ */
-	0x04bf, 499,	/* ҿ Ҿ */
-	0x04c2, 499,	/* ӂ Ӂ */
-	0x04c4, 499,	/* ӄ Ӄ */
-	0x04c8, 499,	/* ӈ Ӈ */
-	0x04cc, 499,	/* ӌ Ӌ */
-	0x04d1, 499,	/* ӑ Ӑ */
-	0x04d3, 499,	/* ӓ Ӓ */
-	0x04d5, 499,	/* ӕ Ӕ */
-	0x04d7, 499,	/* ӗ Ӗ */
-	0x04d9, 499,	/* ә Ә */
-	0x04db, 499,	/* ӛ Ӛ */
-	0x04dd, 499,	/* ӝ Ӝ */
-	0x04df, 499,	/* ӟ Ӟ */
-	0x04e1, 499,	/* ӡ Ӡ */
-	0x04e3, 499,	/* ӣ Ӣ */
-	0x04e5, 499,	/* ӥ Ӥ */
-	0x04e7, 499,	/* ӧ Ӧ */
-	0x04e9, 499,	/* ө Ө */
-	0x04eb, 499,	/* ӫ Ӫ */
-	0x04ef, 499,	/* ӯ Ӯ */
-	0x04f1, 499,	/* ӱ Ӱ */
-	0x04f3, 499,	/* ӳ Ӳ */
-	0x04f5, 499,	/* ӵ Ӵ */
-	0x04f9, 499,	/* ӹ Ӹ */
-	0x1e01, 499,	/* ḁ Ḁ */
-	0x1e03, 499,	/* ḃ Ḃ */
-	0x1e05, 499,	/* ḅ Ḅ */
-	0x1e07, 499,	/* ḇ Ḇ */
-	0x1e09, 499,	/* ḉ Ḉ */
-	0x1e0b, 499,	/* ḋ Ḋ */
-	0x1e0d, 499,	/* ḍ Ḍ */
-	0x1e0f, 499,	/* ḏ Ḏ */
-	0x1e11, 499,	/* ḑ Ḑ */
-	0x1e13, 499,	/* ḓ Ḓ */
-	0x1e15, 499,	/* ḕ Ḕ */
-	0x1e17, 499,	/* ḗ Ḗ */
-	0x1e19, 499,	/* ḙ Ḙ */
-	0x1e1b, 499,	/* ḛ Ḛ */
-	0x1e1d, 499,	/* ḝ Ḝ */
-	0x1e1f, 499,	/* ḟ Ḟ */
-	0x1e21, 499,	/* ḡ Ḡ */
-	0x1e23, 499,	/* ḣ Ḣ */
-	0x1e25, 499,	/* ḥ Ḥ */
-	0x1e27, 499,	/* ḧ Ḧ */
-	0x1e29, 499,	/* ḩ Ḩ */
-	0x1e2b, 499,	/* ḫ Ḫ */
-	0x1e2d, 499,	/* ḭ Ḭ */
-	0x1e2f, 499,	/* ḯ Ḯ */
-	0x1e31, 499,	/* ḱ Ḱ */
-	0x1e33, 499,	/* ḳ Ḳ */
-	0x1e35, 499,	/* ḵ Ḵ */
-	0x1e37, 499,	/* ḷ Ḷ */
-	0x1e39, 499,	/* ḹ Ḹ */
-	0x1e3b, 499,	/* ḻ Ḻ */
-	0x1e3d, 499,	/* ḽ Ḽ */
-	0x1e3f, 499,	/* ḿ Ḿ */
-	0x1e41, 499,	/* ṁ Ṁ */
-	0x1e43, 499,	/* ṃ Ṃ */
-	0x1e45, 499,	/* ṅ Ṅ */
-	0x1e47, 499,	/* ṇ Ṇ */
-	0x1e49, 499,	/* ṉ Ṉ */
-	0x1e4b, 499,	/* ṋ Ṋ */
-	0x1e4d, 499,	/* ṍ Ṍ */
-	0x1e4f, 499,	/* ṏ Ṏ */
-	0x1e51, 499,	/* ṑ Ṑ */
-	0x1e53, 499,	/* ṓ Ṓ */
-	0x1e55, 499,	/* ṕ Ṕ */
-	0x1e57, 499,	/* ṗ Ṗ */
-	0x1e59, 499,	/* ṙ Ṙ */
-	0x1e5b, 499,	/* ṛ Ṛ */
-	0x1e5d, 499,	/* ṝ Ṝ */
-	0x1e5f, 499,	/* ṟ Ṟ */
-	0x1e61, 499,	/* ṡ Ṡ */
-	0x1e63, 499,	/* ṣ Ṣ */
-	0x1e65, 499,	/* ṥ Ṥ */
-	0x1e67, 499,	/* ṧ Ṧ */
-	0x1e69, 499,	/* ṩ Ṩ */
-	0x1e6b, 499,	/* ṫ Ṫ */
-	0x1e6d, 499,	/* ṭ Ṭ */
-	0x1e6f, 499,	/* ṯ Ṯ */
-	0x1e71, 499,	/* ṱ Ṱ */
-	0x1e73, 499,	/* ṳ Ṳ */
-	0x1e75, 499,	/* ṵ Ṵ */
-	0x1e77, 499,	/* ṷ Ṷ */
-	0x1e79, 499,	/* ṹ Ṹ */
-	0x1e7b, 499,	/* ṻ Ṻ */
-	0x1e7d, 499,	/* ṽ Ṽ */
-	0x1e7f, 499,	/* ṿ Ṿ */
-	0x1e81, 499,	/* ẁ Ẁ */
-	0x1e83, 499,	/* ẃ Ẃ */
-	0x1e85, 499,	/* ẅ Ẅ */
-	0x1e87, 499,	/* ẇ Ẇ */
-	0x1e89, 499,	/* ẉ Ẉ */
-	0x1e8b, 499,	/* ẋ Ẋ */
-	0x1e8d, 499,	/* ẍ Ẍ */
-	0x1e8f, 499,	/* ẏ Ẏ */
-	0x1e91, 499,	/* ẑ Ẑ */
-	0x1e93, 499,	/* ẓ Ẓ */
-	0x1e95, 499,	/* ẕ Ẕ */
-	0x1ea1, 499,	/* ạ Ạ */
-	0x1ea3, 499,	/* ả Ả */
-	0x1ea5, 499,	/* ấ Ấ */
-	0x1ea7, 499,	/* ầ Ầ */
-	0x1ea9, 499,	/* ẩ Ẩ */
-	0x1eab, 499,	/* ẫ Ẫ */
-	0x1ead, 499,	/* ậ Ậ */
-	0x1eaf, 499,	/* ắ Ắ */
-	0x1eb1, 499,	/* ằ Ằ */
-	0x1eb3, 499,	/* ẳ Ẳ */
-	0x1eb5, 499,	/* ẵ Ẵ */
-	0x1eb7, 499,	/* ặ Ặ */
-	0x1eb9, 499,	/* ẹ Ẹ */
-	0x1ebb, 499,	/* ẻ Ẻ */
-	0x1ebd, 499,	/* ẽ Ẽ */
-	0x1ebf, 499,	/* ế Ế */
-	0x1ec1, 499,	/* ề Ề */
-	0x1ec3, 499,	/* ể Ể */
-	0x1ec5, 499,	/* ễ Ễ */
-	0x1ec7, 499,	/* ệ Ệ */
-	0x1ec9, 499,	/* ỉ Ỉ */
-	0x1ecb, 499,	/* ị Ị */
-	0x1ecd, 499,	/* ọ Ọ */
-	0x1ecf, 499,	/* ỏ Ỏ */
-	0x1ed1, 499,	/* ố Ố */
-	0x1ed3, 499,	/* ồ Ồ */
-	0x1ed5, 499,	/* ổ Ổ */
-	0x1ed7, 499,	/* ỗ Ỗ */
-	0x1ed9, 499,	/* ộ Ộ */
-	0x1edb, 499,	/* ớ Ớ */
-	0x1edd, 499,	/* ờ Ờ */
-	0x1edf, 499,	/* ở Ở */
-	0x1ee1, 499,	/* ỡ Ỡ */
-	0x1ee3, 499,	/* ợ Ợ */
-	0x1ee5, 499,	/* ụ Ụ */
-	0x1ee7, 499,	/* ủ Ủ */
-	0x1ee9, 499,	/* ứ Ứ */
-	0x1eeb, 499,	/* ừ Ừ */
-	0x1eed, 499,	/* ử Ử */
-	0x1eef, 499,	/* ữ Ữ */
-	0x1ef1, 499,	/* ự Ự */
-	0x1ef3, 499,	/* ỳ Ỳ */
-	0x1ef5, 499,	/* ỵ Ỵ */
-	0x1ef7, 499,	/* ỷ Ỷ */
-	0x1ef9, 499,	/* ỹ Ỹ */
-	0x1f51, 508,	/* ὑ Ὑ */
-	0x1f53, 508,	/* ὓ Ὓ */
-	0x1f55, 508,	/* ὕ Ὕ */
-	0x1f57, 508,	/* ὗ Ὗ */
-	0x1fb3, 509,	/* ᾳ ᾼ */
-	0x1fc3, 509,	/* ῃ ῌ */
-	0x1fe5, 507,	/* ῥ Ῥ */
-	0x1ff3, 509,	/* ῳ ῼ */
-};
-
-static Rune __isdigitr[] = {
-	0x0030, 0x0039,
-	0x0660, 0x0669,
-	0x06f0, 0x06f9,
-	0x07c0, 0x07c9,
-	0x0966, 0x096f,
-	0x09e6, 0x09ef,
-	0x0a66, 0x0a6f,
-	0x0ae6, 0x0aef,
-	0x0b66, 0x0b6f,
-	0x0be6, 0x0bef,
-	0x0c66, 0x0c6f,
-	0x0ce6, 0x0cef,
-	0x0d66, 0x0d6f,
-	0x0e50, 0x0e59,
-	0x0ed0, 0x0ed9,
-	0x0f20, 0x0f29,
-	0x1040, 0x1049,
-	0x17e0, 0x17e9,
-	0x1810, 0x1819,
-	0x1946, 0x194f,
-	0x19d0, 0x19d9,
-	0x1b50, 0x1b59,
-	0xff10, 0xff19,
-	0x104a0, 0x104a9,
-	0x1d7ce, 0x1d7ff,
-};
-
-/*
- * upper case ranges
- *	3rd col is conversion excess 500
- */
-static
-Rune	_tolower2[] =
-{
-	0x0041,	0x005a, 532,	/* A-Z a-z */
-	0x00c0,	0x00d6, 532,	/* À-Ö à-ö */
-	0x00d8,	0x00de, 532,	/* Ø-Þ ø-þ */
-	0x0189,	0x018a, 705,	/* Ɖ-Ɗ ɖ-ɗ */
-	0x018e,	0x018f, 702,	/* Ǝ-Ə ɘ-ə */
-	0x01b1,	0x01b2, 717,	/* Ʊ-Ʋ ʊ-ʋ */
-	0x0388,	0x038a, 537,	/* Έ-Ί έ-ί */
-	0x038e,	0x038f, 563,	/* Ύ-Ώ ύ-ώ */
-	0x0391,	0x03a1, 532,	/* Α-Ρ α-ρ */
-	0x03a3,	0x03ab, 532,	/* Σ-Ϋ σ-ϋ */
-	0x0401,	0x040c, 580,	/* Ё-Ќ ё-ќ */
-	0x040e,	0x040f, 580,	/* Ў-Џ ў-џ */
-	0x0410,	0x042f, 532,	/* А-Я а-я */
-	0x0531,	0x0556, 548,	/* Ա-Ֆ ա-ֆ */
-	0x10a0,	0x10c5, 548,	/* Ⴀ-Ⴥ ა-ჵ */
-	0x1f08,	0x1f0f, 492,	/* Ἀ-Ἇ ἀ-ἇ */
-	0x1f18,	0x1f1d, 492,	/* Ἐ-Ἕ ἐ-ἕ */
-	0x1f28,	0x1f2f, 492,	/* Ἠ-Ἧ ἠ-ἧ */
-	0x1f38,	0x1f3f, 492,	/* Ἰ-Ἷ ἰ-ἷ */
-	0x1f48,	0x1f4d, 492,	/* Ὀ-Ὅ ὀ-ὅ */
-	0x1f68,	0x1f6f, 492,	/* Ὠ-Ὧ ὠ-ὧ */
-	0x1f88,	0x1f8f, 492,	/* ᾈ-ᾏ ᾀ-ᾇ */
-	0x1f98,	0x1f9f, 492,	/* ᾘ-ᾟ ᾐ-ᾗ */
-	0x1fa8,	0x1faf, 492,	/* ᾨ-ᾯ ᾠ-ᾧ */
-	0x1fb8,	0x1fb9, 492,	/* Ᾰ-Ᾱ ᾰ-ᾱ */
-	0x1fba,	0x1fbb, 426,	/* Ὰ-Ά ὰ-ά */
-	0x1fc8,	0x1fcb, 414,	/* Ὲ-Ή ὲ-ή */
-	0x1fd8,	0x1fd9, 492,	/* Ῐ-Ῑ ῐ-ῑ */
-	0x1fda,	0x1fdb, 400,	/* Ὶ-Ί ὶ-ί */
-	0x1fe8,	0x1fe9, 492,	/* Ῠ-Ῡ ῠ-ῡ */
-	0x1fea,	0x1feb, 388,	/* Ὺ-Ύ ὺ-ύ */
-	0x1ff8,	0x1ff9, 372,	/* Ὸ-Ό ὸ-ό */
-	0x1ffa,	0x1ffb, 374,	/* Ὼ-Ώ ὼ-ώ */
-	0x2160,	0x216f, 516,	/* Ⅰ-Ⅿ ⅰ-ⅿ */
-	0x24b6,	0x24cf, 526,	/* Ⓐ-Ⓩ ⓐ-ⓩ */
-	0xff21,	0xff3a, 532,	/* A-Z a-z */
-};
-
-/*
- * upper case singlets
- *	2nd col is conversion excess 500
- */
-static
-Rune	_tolower1[] =
-{
-	0x0100, 501,	/* Ā ā */
-	0x0102, 501,	/* Ă ă */
-	0x0104, 501,	/* Ą ą */
-	0x0106, 501,	/* Ć ć */
-	0x0108, 501,	/* Ĉ ĉ */
-	0x010a, 501,	/* Ċ ċ */
-	0x010c, 501,	/* Č č */
-	0x010e, 501,	/* Ď ď */
-	0x0110, 501,	/* Đ đ */
-	0x0112, 501,	/* Ē ē */
-	0x0114, 501,	/* Ĕ ĕ */
-	0x0116, 501,	/* Ė ė */
-	0x0118, 501,	/* Ę ę */
-	0x011a, 501,	/* Ě ě */
-	0x011c, 501,	/* Ĝ ĝ */
-	0x011e, 501,	/* Ğ ğ */
-	0x0120, 501,	/* Ġ ġ */
-	0x0122, 501,	/* Ģ ģ */
-	0x0124, 501,	/* Ĥ ĥ */
-	0x0126, 501,	/* Ħ ħ */
-	0x0128, 501,	/* Ĩ ĩ */
-	0x012a, 501,	/* Ī ī */
-	0x012c, 501,	/* Ĭ ĭ */
-	0x012e, 501,	/* Į į */
-	0x0130, 301,	/* İ i */
-	0x0132, 501,	/* IJ ij */
-	0x0134, 501,	/* Ĵ ĵ */
-	0x0136, 501,	/* Ķ ķ */
-	0x0139, 501,	/* Ĺ ĺ */
-	0x013b, 501,	/* Ļ ļ */
-	0x013d, 501,	/* Ľ ľ */
-	0x013f, 501,	/* Ŀ ŀ */
-	0x0141, 501,	/* Ł ł */
-	0x0143, 501,	/* Ń ń */
-	0x0145, 501,	/* Ņ ņ */
-	0x0147, 501,	/* Ň ň */
-	0x014a, 501,	/* Ŋ ŋ */
-	0x014c, 501,	/* Ō ō */
-	0x014e, 501,	/* Ŏ ŏ */
-	0x0150, 501,	/* Ő ő */
-	0x0152, 501,	/* Œ œ */
-	0x0154, 501,	/* Ŕ ŕ */
-	0x0156, 501,	/* Ŗ ŗ */
-	0x0158, 501,	/* Ř ř */
-	0x015a, 501,	/* Ś ś */
-	0x015c, 501,	/* Ŝ ŝ */
-	0x015e, 501,	/* Ş ş */
-	0x0160, 501,	/* Š š */
-	0x0162, 501,	/* Ţ ţ */
-	0x0164, 501,	/* Ť ť */
-	0x0166, 501,	/* Ŧ ŧ */
-	0x0168, 501,	/* Ũ ũ */
-	0x016a, 501,	/* Ū ū */
-	0x016c, 501,	/* Ŭ ŭ */
-	0x016e, 501,	/* Ů ů */
-	0x0170, 501,	/* Ű ű */
-	0x0172, 501,	/* Ų ų */
-	0x0174, 501,	/* Ŵ ŵ */
-	0x0176, 501,	/* Ŷ ŷ */
-	0x0178, 379,	/* Ÿ ÿ */
-	0x0179, 501,	/* Ź ź */
-	0x017b, 501,	/* Ż ż */
-	0x017d, 501,	/* Ž ž */
-	0x0181, 710,	/* Ɓ ɓ */
-	0x0182, 501,	/* Ƃ ƃ */
-	0x0184, 501,	/* Ƅ ƅ */
-	0x0186, 706,	/* Ɔ ɔ */
-	0x0187, 501,	/* Ƈ ƈ */
-	0x018b, 501,	/* Ƌ ƌ */
-	0x0190, 703,	/* Ɛ ɛ */
-	0x0191, 501,	/* Ƒ ƒ */
-	0x0193, 705,	/* Ɠ ɠ */
-	0x0194, 707,	/* Ɣ ɣ */
-	0x0196, 711,	/* Ɩ ɩ */
-	0x0197, 709,	/* Ɨ ɨ */
-	0x0198, 501,	/* Ƙ ƙ */
-	0x019c, 711,	/* Ɯ ɯ */
-	0x019d, 713,	/* Ɲ ɲ */
-	0x01a0, 501,	/* Ơ ơ */
-	0x01a2, 501,	/* Ƣ ƣ */
-	0x01a4, 501,	/* Ƥ ƥ */
-	0x01a7, 501,	/* Ƨ ƨ */
-	0x01a9, 718,	/* Ʃ ʃ */
-	0x01ac, 501,	/* Ƭ ƭ */
-	0x01ae, 718,	/* Ʈ ʈ */
-	0x01af, 501,	/* Ư ư */
-	0x01b3, 501,	/* Ƴ ƴ */
-	0x01b5, 501,	/* Ƶ ƶ */
-	0x01b7, 719,	/* Ʒ ʒ */
-	0x01b8, 501,	/* Ƹ ƹ */
-	0x01bc, 501,	/* Ƽ ƽ */
-	0x01c4, 502,	/* DŽ dž */
-	0x01c5, 501,	/* Dž dž */
-	0x01c7, 502,	/* LJ lj */
-	0x01c8, 501,	/* Lj lj */
-	0x01ca, 502,	/* NJ nj */
-	0x01cb, 501,	/* Nj nj */
-	0x01cd, 501,	/* Ǎ ǎ */
-	0x01cf, 501,	/* Ǐ ǐ */
-	0x01d1, 501,	/* Ǒ ǒ */
-	0x01d3, 501,	/* Ǔ ǔ */
-	0x01d5, 501,	/* Ǖ ǖ */
-	0x01d7, 501,	/* Ǘ ǘ */
-	0x01d9, 501,	/* Ǚ ǚ */
-	0x01db, 501,	/* Ǜ ǜ */
-	0x01de, 501,	/* Ǟ ǟ */
-	0x01e0, 501,	/* Ǡ ǡ */
-	0x01e2, 501,	/* Ǣ ǣ */
-	0x01e4, 501,	/* Ǥ ǥ */
-	0x01e6, 501,	/* Ǧ ǧ */
-	0x01e8, 501,	/* Ǩ ǩ */
-	0x01ea, 501,	/* Ǫ ǫ */
-	0x01ec, 501,	/* Ǭ ǭ */
-	0x01ee, 501,	/* Ǯ ǯ */
-	0x01f1, 502,	/* DZ dz */
-	0x01f2, 501,	/* Dz dz */
-	0x01f4, 501,	/* Ǵ ǵ */
-	0x01fa, 501,	/* Ǻ ǻ */
-	0x01fc, 501,	/* Ǽ ǽ */
-	0x01fe, 501,	/* Ǿ ǿ */
-	0x0200, 501,	/* Ȁ ȁ */
-	0x0202, 501,	/* Ȃ ȃ */
-	0x0204, 501,	/* Ȅ ȅ */
-	0x0206, 501,	/* Ȇ ȇ */
-	0x0208, 501,	/* Ȉ ȉ */
-	0x020a, 501,	/* Ȋ ȋ */
-	0x020c, 501,	/* Ȍ ȍ */
-	0x020e, 501,	/* Ȏ ȏ */
-	0x0210, 501,	/* Ȑ ȑ */
-	0x0212, 501,	/* Ȓ ȓ */
-	0x0214, 501,	/* Ȕ ȕ */
-	0x0216, 501,	/* Ȗ ȗ */
-	0x0386, 538,	/* Ά ά */
-	0x038c, 564,	/* Ό ό */
-	0x03e2, 501,	/* Ϣ ϣ */
-	0x03e4, 501,	/* Ϥ ϥ */
-	0x03e6, 501,	/* Ϧ ϧ */
-	0x03e8, 501,	/* Ϩ ϩ */
-	0x03ea, 501,	/* Ϫ ϫ */
-	0x03ec, 501,	/* Ϭ ϭ */
-	0x03ee, 501,	/* Ϯ ϯ */
-	0x0460, 501,	/* Ѡ ѡ */
-	0x0462, 501,	/* Ѣ ѣ */
-	0x0464, 501,	/* Ѥ ѥ */
-	0x0466, 501,	/* Ѧ ѧ */
-	0x0468, 501,	/* Ѩ ѩ */
-	0x046a, 501,	/* Ѫ ѫ */
-	0x046c, 501,	/* Ѭ ѭ */
-	0x046e, 501,	/* Ѯ ѯ */
-	0x0470, 501,	/* Ѱ ѱ */
-	0x0472, 501,	/* Ѳ ѳ */
-	0x0474, 501,	/* Ѵ ѵ */
-	0x0476, 501,	/* Ѷ ѷ */
-	0x0478, 501,	/* Ѹ ѹ */
-	0x047a, 501,	/* Ѻ ѻ */
-	0x047c, 501,	/* Ѽ ѽ */
-	0x047e, 501,	/* Ѿ ѿ */
-	0x0480, 501,	/* Ҁ ҁ */
-	0x0490, 501,	/* Ґ ґ */
-	0x0492, 501,	/* Ғ ғ */
-	0x0494, 501,	/* Ҕ ҕ */
-	0x0496, 501,	/* Җ җ */
-	0x0498, 501,	/* Ҙ ҙ */
-	0x049a, 501,	/* Қ қ */
-	0x049c, 501,	/* Ҝ ҝ */
-	0x049e, 501,	/* Ҟ ҟ */
-	0x04a0, 501,	/* Ҡ ҡ */
-	0x04a2, 501,	/* Ң ң */
-	0x04a4, 501,	/* Ҥ ҥ */
-	0x04a6, 501,	/* Ҧ ҧ */
-	0x04a8, 501,	/* Ҩ ҩ */
-	0x04aa, 501,	/* Ҫ ҫ */
-	0x04ac, 501,	/* Ҭ ҭ */
-	0x04ae, 501,	/* Ү ү */
-	0x04b0, 501,	/* Ұ ұ */
-	0x04b2, 501,	/* Ҳ ҳ */
-	0x04b4, 501,	/* Ҵ ҵ */
-	0x04b6, 501,	/* Ҷ ҷ */
-	0x04b8, 501,	/* Ҹ ҹ */
-	0x04ba, 501,	/* Һ һ */
-	0x04bc, 501,	/* Ҽ ҽ */
-	0x04be, 501,	/* Ҿ ҿ */
-	0x04c1, 501,	/* Ӂ ӂ */
-	0x04c3, 501,	/* Ӄ ӄ */
-	0x04c7, 501,	/* Ӈ ӈ */
-	0x04cb, 501,	/* Ӌ ӌ */
-	0x04d0, 501,	/* Ӑ ӑ */
-	0x04d2, 501,	/* Ӓ ӓ */
-	0x04d4, 501,	/* Ӕ ӕ */
-	0x04d6, 501,	/* Ӗ ӗ */
-	0x04d8, 501,	/* Ә ә */
-	0x04da, 501,	/* Ӛ ӛ */
-	0x04dc, 501,	/* Ӝ ӝ */
-	0x04de, 501,	/* Ӟ ӟ */
-	0x04e0, 501,	/* Ӡ ӡ */
-	0x04e2, 501,	/* Ӣ ӣ */
-	0x04e4, 501,	/* Ӥ ӥ */
-	0x04e6, 501,	/* Ӧ ӧ */
-	0x04e8, 501,	/* Ө ө */
-	0x04ea, 501,	/* Ӫ ӫ */
-	0x04ee, 501,	/* Ӯ ӯ */
-	0x04f0, 501,	/* Ӱ ӱ */
-	0x04f2, 501,	/* Ӳ ӳ */
-	0x04f4, 501,	/* Ӵ ӵ */
-	0x04f8, 501,	/* Ӹ ӹ */
-	0x1e00, 501,	/* Ḁ ḁ */
-	0x1e02, 501,	/* Ḃ ḃ */
-	0x1e04, 501,	/* Ḅ ḅ */
-	0x1e06, 501,	/* Ḇ ḇ */
-	0x1e08, 501,	/* Ḉ ḉ */
-	0x1e0a, 501,	/* Ḋ ḋ */
-	0x1e0c, 501,	/* Ḍ ḍ */
-	0x1e0e, 501,	/* Ḏ ḏ */
-	0x1e10, 501,	/* Ḑ ḑ */
-	0x1e12, 501,	/* Ḓ ḓ */
-	0x1e14, 501,	/* Ḕ ḕ */
-	0x1e16, 501,	/* Ḗ ḗ */
-	0x1e18, 501,	/* Ḙ ḙ */
-	0x1e1a, 501,	/* Ḛ ḛ */
-	0x1e1c, 501,	/* Ḝ ḝ */
-	0x1e1e, 501,	/* Ḟ ḟ */
-	0x1e20, 501,	/* Ḡ ḡ */
-	0x1e22, 501,	/* Ḣ ḣ */
-	0x1e24, 501,	/* Ḥ ḥ */
-	0x1e26, 501,	/* Ḧ ḧ */
-	0x1e28, 501,	/* Ḩ ḩ */
-	0x1e2a, 501,	/* Ḫ ḫ */
-	0x1e2c, 501,	/* Ḭ ḭ */
-	0x1e2e, 501,	/* Ḯ ḯ */
-	0x1e30, 501,	/* Ḱ ḱ */
-	0x1e32, 501,	/* Ḳ ḳ */
-	0x1e34, 501,	/* Ḵ ḵ */
-	0x1e36, 501,	/* Ḷ ḷ */
-	0x1e38, 501,	/* Ḹ ḹ */
-	0x1e3a, 501,	/* Ḻ ḻ */
-	0x1e3c, 501,	/* Ḽ ḽ */
-	0x1e3e, 501,	/* Ḿ ḿ */
-	0x1e40, 501,	/* Ṁ ṁ */
-	0x1e42, 501,	/* Ṃ ṃ */
-	0x1e44, 501,	/* Ṅ ṅ */
-	0x1e46, 501,	/* Ṇ ṇ */
-	0x1e48, 501,	/* Ṉ ṉ */
-	0x1e4a, 501,	/* Ṋ ṋ */
-	0x1e4c, 501,	/* Ṍ ṍ */
-	0x1e4e, 501,	/* Ṏ ṏ */
-	0x1e50, 501,	/* Ṑ ṑ */
-	0x1e52, 501,	/* Ṓ ṓ */
-	0x1e54, 501,	/* Ṕ ṕ */
-	0x1e56, 501,	/* Ṗ ṗ */
-	0x1e58, 501,	/* Ṙ ṙ */
-	0x1e5a, 501,	/* Ṛ ṛ */
-	0x1e5c, 501,	/* Ṝ ṝ */
-	0x1e5e, 501,	/* Ṟ ṟ */
-	0x1e60, 501,	/* Ṡ ṡ */
-	0x1e62, 501,	/* Ṣ ṣ */
-	0x1e64, 501,	/* Ṥ ṥ */
-	0x1e66, 501,	/* Ṧ ṧ */
-	0x1e68, 501,	/* Ṩ ṩ */
-	0x1e6a, 501,	/* Ṫ ṫ */
-	0x1e6c, 501,	/* Ṭ ṭ */
-	0x1e6e, 501,	/* Ṯ ṯ */
-	0x1e70, 501,	/* Ṱ ṱ */
-	0x1e72, 501,	/* Ṳ ṳ */
-	0x1e74, 501,	/* Ṵ ṵ */
-	0x1e76, 501,	/* Ṷ ṷ */
-	0x1e78, 501,	/* Ṹ ṹ */
-	0x1e7a, 501,	/* Ṻ ṻ */
-	0x1e7c, 501,	/* Ṽ ṽ */
-	0x1e7e, 501,	/* Ṿ ṿ */
-	0x1e80, 501,	/* Ẁ ẁ */
-	0x1e82, 501,	/* Ẃ ẃ */
-	0x1e84, 501,	/* Ẅ ẅ */
-	0x1e86, 501,	/* Ẇ ẇ */
-	0x1e88, 501,	/* Ẉ ẉ */
-	0x1e8a, 501,	/* Ẋ ẋ */
-	0x1e8c, 501,	/* Ẍ ẍ */
-	0x1e8e, 501,	/* Ẏ ẏ */
-	0x1e90, 501,	/* Ẑ ẑ */
-	0x1e92, 501,	/* Ẓ ẓ */
-	0x1e94, 501,	/* Ẕ ẕ */
-	0x1ea0, 501,	/* Ạ ạ */
-	0x1ea2, 501,	/* Ả ả */
-	0x1ea4, 501,	/* Ấ ấ */
-	0x1ea6, 501,	/* Ầ ầ */
-	0x1ea8, 501,	/* Ẩ ẩ */
-	0x1eaa, 501,	/* Ẫ ẫ */
-	0x1eac, 501,	/* Ậ ậ */
-	0x1eae, 501,	/* Ắ ắ */
-	0x1eb0, 501,	/* Ằ ằ */
-	0x1eb2, 501,	/* Ẳ ẳ */
-	0x1eb4, 501,	/* Ẵ ẵ */
-	0x1eb6, 501,	/* Ặ ặ */
-	0x1eb8, 501,	/* Ẹ ẹ */
-	0x1eba, 501,	/* Ẻ ẻ */
-	0x1ebc, 501,	/* Ẽ ẽ */
-	0x1ebe, 501,	/* Ế ế */
-	0x1ec0, 501,	/* Ề ề */
-	0x1ec2, 501,	/* Ể ể */
-	0x1ec4, 501,	/* Ễ ễ */
-	0x1ec6, 501,	/* Ệ ệ */
-	0x1ec8, 501,	/* Ỉ ỉ */
-	0x1eca, 501,	/* Ị ị */
-	0x1ecc, 501,	/* Ọ ọ */
-	0x1ece, 501,	/* Ỏ ỏ */
-	0x1ed0, 501,	/* Ố ố */
-	0x1ed2, 501,	/* Ồ ồ */
-	0x1ed4, 501,	/* Ổ ổ */
-	0x1ed6, 501,	/* Ỗ ỗ */
-	0x1ed8, 501,	/* Ộ ộ */
-	0x1eda, 501,	/* Ớ ớ */
-	0x1edc, 501,	/* Ờ ờ */
-	0x1ede, 501,	/* Ở ở */
-	0x1ee0, 501,	/* Ỡ ỡ */
-	0x1ee2, 501,	/* Ợ ợ */
-	0x1ee4, 501,	/* Ụ ụ */
-	0x1ee6, 501,	/* Ủ ủ */
-	0x1ee8, 501,	/* Ứ ứ */
-	0x1eea, 501,	/* Ừ ừ */
-	0x1eec, 501,	/* Ử ử */
-	0x1eee, 501,	/* Ữ ữ */
-	0x1ef0, 501,	/* Ự ự */
-	0x1ef2, 501,	/* Ỳ ỳ */
-	0x1ef4, 501,	/* Ỵ ỵ */
-	0x1ef6, 501,	/* Ỷ ỷ */
-	0x1ef8, 501,	/* Ỹ ỹ */
-	0x1f59, 492,	/* Ὑ ὑ */
-	0x1f5b, 492,	/* Ὓ ὓ */
-	0x1f5d, 492,	/* Ὕ ὕ */
-	0x1f5f, 492,	/* Ὗ ὗ */
-	0x1fbc, 491,	/* ᾼ ᾳ */
-	0x1fcc, 491,	/* ῌ ῃ */
-	0x1fec, 493,	/* Ῥ ῥ */
-	0x1ffc, 491,	/* ῼ ῳ */
-};
-
-/*
- * title characters are those between
- * upper and lower case. ie DZ Dz dz
- */
-static
-Rune	_totitle1[] =
-{
-	0x01c4, 501,	/* DŽ Dž */
-	0x01c6, 499,	/* dž Dž */
-	0x01c7, 501,	/* LJ Lj */
-	0x01c9, 499,	/* lj Lj */
-	0x01ca, 501,	/* NJ Nj */
-	0x01cc, 499,	/* nj Nj */
-	0x01f1, 501,	/* DZ Dz */
-	0x01f3, 499,	/* dz Dz */
-};
-
-static
-Rune*
-bsearch(Rune c, Rune *t, int n, int ne)
-{
-	Rune *p;
-	int m;
-
-	while(n > 1) {
-		m = n/2;
-		p = t + m*ne;
-		if(c >= p[0]) {
-			t = p;
-			n = n-m;
-		} else
-			n = m;
-	}
-	if(n && c >= t[0])
-		return t;
-	return 0;
-}
-
-Rune
-tolowerrune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return c + p[2] - 500;
-	p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 500;
-	return c;
-}
-
-Rune
-toupperrune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return c + p[2] - 500;
-	p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 500;
-	return c;
-}
-
-Rune
-totitlerune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _totitle1, nelem(_totitle1)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 500;
-	return c;
-}
-
-int
-islowerrune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-int
-isupperrune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-int
-isalpharune(Rune c)
-{
-	Rune *p;
-
-	if(isupperrune(c) || islowerrune(c))
-		return 1;
-	p = bsearch(c, _alpha2, nelem(_alpha2)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = bsearch(c, _alpha1, nelem(_alpha1), 1);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-int
-istitlerune(Rune c)
-{
-	return isupperrune(c) && islowerrune(c);
-}
-
-int
-isspacerune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, _space2, nelem(_space2)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	return 0;
-}
-
-int
-isdigitrune(Rune c)
-{
-	Rune *p;
-
-	p = bsearch(c, __isdigitr, nelem(__isdigitr)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	return 0;
-}
+#include "runetypebody-6.2.0.h"

+ 1641 - 0
sys/src/libc/port/runetypebody-6.2.0.h

@@ -0,0 +1,1641 @@
+/* generated automatically by mkrunetype.c in Go from UnicodeData-6.2.0.txt
+ *  with s/rbsearch/_runebsearch/g
+ */
+
+static Rune __isspacer[] = {
+	0x0009, 0x000d,
+	0x0020, 0x0020,
+	0x0085, 0x0085,
+	0x00a0, 0x00a0,
+	0x1680, 0x1680,
+	0x180e, 0x180e,
+	0x2000, 0x200a,
+	0x2028, 0x2029,
+	0x202f, 0x202f,
+	0x205f, 0x205f,
+	0x3000, 0x3000,
+	0xfeff, 0xfeff,
+};
+
+int
+isspacerune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __isspacer, nelem(__isspacer)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	return 0;
+}
+
+static Rune __isdigitr[] = {
+	0x0030, 0x0039,
+	0x0660, 0x0669,
+	0x06f0, 0x06f9,
+	0x07c0, 0x07c9,
+	0x0966, 0x096f,
+	0x09e6, 0x09ef,
+	0x0a66, 0x0a6f,
+	0x0ae6, 0x0aef,
+	0x0b66, 0x0b6f,
+	0x0be6, 0x0bef,
+	0x0c66, 0x0c6f,
+	0x0ce6, 0x0cef,
+	0x0d66, 0x0d6f,
+	0x0e50, 0x0e59,
+	0x0ed0, 0x0ed9,
+	0x0f20, 0x0f29,
+	0x1040, 0x1049,
+	0x1090, 0x1099,
+	0x17e0, 0x17e9,
+	0x1810, 0x1819,
+	0x1946, 0x194f,
+	0x19d0, 0x19d9,
+	0x1a80, 0x1a89,
+	0x1a90, 0x1a99,
+	0x1b50, 0x1b59,
+	0x1bb0, 0x1bb9,
+	0x1c40, 0x1c49,
+	0x1c50, 0x1c59,
+	0xa620, 0xa629,
+	0xa8d0, 0xa8d9,
+	0xa900, 0xa909,
+	0xa9d0, 0xa9d9,
+	0xaa50, 0xaa59,
+	0xabf0, 0xabf9,
+	0xff10, 0xff19,
+	0x104a0, 0x104a9,
+	0x11066, 0x1106f,
+	0x110f0, 0x110f9,
+	0x11136, 0x1113f,
+	0x111d0, 0x111d9,
+	0x116c0, 0x116c9,
+	0x1d7ce, 0x1d7ff,
+};
+
+int
+isdigitrune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __isdigitr, nelem(__isdigitr)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	return 0;
+}
+
+static Rune __isalphar[] = {
+	0x0041, 0x005a,
+	0x0061, 0x007a,
+	0x00c0, 0x00d6,
+	0x00d8, 0x00f6,
+	0x00f8, 0x02c1,
+	0x02c6, 0x02d1,
+	0x02e0, 0x02e4,
+	0x0370, 0x0374,
+	0x0376, 0x0377,
+	0x037a, 0x037d,
+	0x0388, 0x038a,
+	0x038e, 0x03a1,
+	0x03a3, 0x03f5,
+	0x03f7, 0x0481,
+	0x048a, 0x0527,
+	0x0531, 0x0556,
+	0x0561, 0x0587,
+	0x05d0, 0x05ea,
+	0x05f0, 0x05f2,
+	0x0620, 0x064a,
+	0x066e, 0x066f,
+	0x0671, 0x06d3,
+	0x06e5, 0x06e6,
+	0x06ee, 0x06ef,
+	0x06fa, 0x06fc,
+	0x0712, 0x072f,
+	0x074d, 0x07a5,
+	0x07ca, 0x07ea,
+	0x07f4, 0x07f5,
+	0x0800, 0x0815,
+	0x0840, 0x0858,
+	0x08a2, 0x08ac,
+	0x0904, 0x0939,
+	0x0958, 0x0961,
+	0x0971, 0x0977,
+	0x0979, 0x097f,
+	0x0985, 0x098c,
+	0x098f, 0x0990,
+	0x0993, 0x09a8,
+	0x09aa, 0x09b0,
+	0x09b6, 0x09b9,
+	0x09dc, 0x09dd,
+	0x09df, 0x09e1,
+	0x09f0, 0x09f1,
+	0x0a05, 0x0a0a,
+	0x0a0f, 0x0a10,
+	0x0a13, 0x0a28,
+	0x0a2a, 0x0a30,
+	0x0a32, 0x0a33,
+	0x0a35, 0x0a36,
+	0x0a38, 0x0a39,
+	0x0a59, 0x0a5c,
+	0x0a72, 0x0a74,
+	0x0a85, 0x0a8d,
+	0x0a8f, 0x0a91,
+	0x0a93, 0x0aa8,
+	0x0aaa, 0x0ab0,
+	0x0ab2, 0x0ab3,
+	0x0ab5, 0x0ab9,
+	0x0ae0, 0x0ae1,
+	0x0b05, 0x0b0c,
+	0x0b0f, 0x0b10,
+	0x0b13, 0x0b28,
+	0x0b2a, 0x0b30,
+	0x0b32, 0x0b33,
+	0x0b35, 0x0b39,
+	0x0b5c, 0x0b5d,
+	0x0b5f, 0x0b61,
+	0x0b85, 0x0b8a,
+	0x0b8e, 0x0b90,
+	0x0b92, 0x0b95,
+	0x0b99, 0x0b9a,
+	0x0b9e, 0x0b9f,
+	0x0ba3, 0x0ba4,
+	0x0ba8, 0x0baa,
+	0x0bae, 0x0bb9,
+	0x0c05, 0x0c0c,
+	0x0c0e, 0x0c10,
+	0x0c12, 0x0c28,
+	0x0c2a, 0x0c33,
+	0x0c35, 0x0c39,
+	0x0c58, 0x0c59,
+	0x0c60, 0x0c61,
+	0x0c85, 0x0c8c,
+	0x0c8e, 0x0c90,
+	0x0c92, 0x0ca8,
+	0x0caa, 0x0cb3,
+	0x0cb5, 0x0cb9,
+	0x0ce0, 0x0ce1,
+	0x0cf1, 0x0cf2,
+	0x0d05, 0x0d0c,
+	0x0d0e, 0x0d10,
+	0x0d12, 0x0d3a,
+	0x0d60, 0x0d61,
+	0x0d7a, 0x0d7f,
+	0x0d85, 0x0d96,
+	0x0d9a, 0x0db1,
+	0x0db3, 0x0dbb,
+	0x0dc0, 0x0dc6,
+	0x0e01, 0x0e30,
+	0x0e32, 0x0e33,
+	0x0e40, 0x0e46,
+	0x0e81, 0x0e82,
+	0x0e87, 0x0e88,
+	0x0e94, 0x0e97,
+	0x0e99, 0x0e9f,
+	0x0ea1, 0x0ea3,
+	0x0eaa, 0x0eab,
+	0x0ead, 0x0eb0,
+	0x0eb2, 0x0eb3,
+	0x0ec0, 0x0ec4,
+	0x0edc, 0x0edf,
+	0x0f40, 0x0f47,
+	0x0f49, 0x0f6c,
+	0x0f88, 0x0f8c,
+	0x1000, 0x102a,
+	0x1050, 0x1055,
+	0x105a, 0x105d,
+	0x1065, 0x1066,
+	0x106e, 0x1070,
+	0x1075, 0x1081,
+	0x10a0, 0x10c5,
+	0x10d0, 0x10fa,
+	0x10fc, 0x1248,
+	0x124a, 0x124d,
+	0x1250, 0x1256,
+	0x125a, 0x125d,
+	0x1260, 0x1288,
+	0x128a, 0x128d,
+	0x1290, 0x12b0,
+	0x12b2, 0x12b5,
+	0x12b8, 0x12be,
+	0x12c2, 0x12c5,
+	0x12c8, 0x12d6,
+	0x12d8, 0x1310,
+	0x1312, 0x1315,
+	0x1318, 0x135a,
+	0x1380, 0x138f,
+	0x13a0, 0x13f4,
+	0x1401, 0x166c,
+	0x166f, 0x167f,
+	0x1681, 0x169a,
+	0x16a0, 0x16ea,
+	0x1700, 0x170c,
+	0x170e, 0x1711,
+	0x1720, 0x1731,
+	0x1740, 0x1751,
+	0x1760, 0x176c,
+	0x176e, 0x1770,
+	0x1780, 0x17b3,
+	0x1820, 0x1877,
+	0x1880, 0x18a8,
+	0x18b0, 0x18f5,
+	0x1900, 0x191c,
+	0x1950, 0x196d,
+	0x1970, 0x1974,
+	0x1980, 0x19ab,
+	0x19c1, 0x19c7,
+	0x1a00, 0x1a16,
+	0x1a20, 0x1a54,
+	0x1b05, 0x1b33,
+	0x1b45, 0x1b4b,
+	0x1b83, 0x1ba0,
+	0x1bae, 0x1baf,
+	0x1bba, 0x1be5,
+	0x1c00, 0x1c23,
+	0x1c4d, 0x1c4f,
+	0x1c5a, 0x1c7d,
+	0x1ce9, 0x1cec,
+	0x1cee, 0x1cf1,
+	0x1cf5, 0x1cf6,
+	0x1d00, 0x1dbf,
+	0x1e00, 0x1f15,
+	0x1f18, 0x1f1d,
+	0x1f20, 0x1f45,
+	0x1f48, 0x1f4d,
+	0x1f50, 0x1f57,
+	0x1f5f, 0x1f7d,
+	0x1f80, 0x1fb4,
+	0x1fb6, 0x1fbc,
+	0x1fc2, 0x1fc4,
+	0x1fc6, 0x1fcc,
+	0x1fd0, 0x1fd3,
+	0x1fd6, 0x1fdb,
+	0x1fe0, 0x1fec,
+	0x1ff2, 0x1ff4,
+	0x1ff6, 0x1ffc,
+	0x2090, 0x209c,
+	0x210a, 0x2113,
+	0x2119, 0x211d,
+	0x212a, 0x212d,
+	0x212f, 0x2139,
+	0x213c, 0x213f,
+	0x2145, 0x2149,
+	0x2183, 0x2184,
+	0x2c00, 0x2c2e,
+	0x2c30, 0x2c5e,
+	0x2c60, 0x2ce4,
+	0x2ceb, 0x2cee,
+	0x2cf2, 0x2cf3,
+	0x2d00, 0x2d25,
+	0x2d30, 0x2d67,
+	0x2d80, 0x2d96,
+	0x2da0, 0x2da6,
+	0x2da8, 0x2dae,
+	0x2db0, 0x2db6,
+	0x2db8, 0x2dbe,
+	0x2dc0, 0x2dc6,
+	0x2dc8, 0x2dce,
+	0x2dd0, 0x2dd6,
+	0x2dd8, 0x2dde,
+	0x3005, 0x3006,
+	0x3031, 0x3035,
+	0x303b, 0x303c,
+	0x3041, 0x3096,
+	0x309d, 0x309f,
+	0x30a1, 0x30fa,
+	0x30fc, 0x30ff,
+	0x3105, 0x312d,
+	0x3131, 0x318e,
+	0x31a0, 0x31ba,
+	0x31f0, 0x31ff,
+	0x3400, 0x4db5,
+	0x4e00, 0x9fcc,
+	0xa000, 0xa48c,
+	0xa4d0, 0xa4fd,
+	0xa500, 0xa60c,
+	0xa610, 0xa61f,
+	0xa62a, 0xa62b,
+	0xa640, 0xa66e,
+	0xa67f, 0xa697,
+	0xa6a0, 0xa6e5,
+	0xa717, 0xa71f,
+	0xa722, 0xa788,
+	0xa78b, 0xa78e,
+	0xa790, 0xa793,
+	0xa7a0, 0xa7aa,
+	0xa7f8, 0xa801,
+	0xa803, 0xa805,
+	0xa807, 0xa80a,
+	0xa80c, 0xa822,
+	0xa840, 0xa873,
+	0xa882, 0xa8b3,
+	0xa8f2, 0xa8f7,
+	0xa90a, 0xa925,
+	0xa930, 0xa946,
+	0xa960, 0xa97c,
+	0xa984, 0xa9b2,
+	0xaa00, 0xaa28,
+	0xaa40, 0xaa42,
+	0xaa44, 0xaa4b,
+	0xaa60, 0xaa76,
+	0xaa80, 0xaaaf,
+	0xaab5, 0xaab6,
+	0xaab9, 0xaabd,
+	0xaadb, 0xaadd,
+	0xaae0, 0xaaea,
+	0xaaf2, 0xaaf4,
+	0xab01, 0xab06,
+	0xab09, 0xab0e,
+	0xab11, 0xab16,
+	0xab20, 0xab26,
+	0xab28, 0xab2e,
+	0xabc0, 0xabe2,
+	0xac00, 0xd7a3,
+	0xd7b0, 0xd7c6,
+	0xd7cb, 0xd7fb,
+	0xf900, 0xfa6d,
+	0xfa70, 0xfad9,
+	0xfb00, 0xfb06,
+	0xfb13, 0xfb17,
+	0xfb1f, 0xfb28,
+	0xfb2a, 0xfb36,
+	0xfb38, 0xfb3c,
+	0xfb40, 0xfb41,
+	0xfb43, 0xfb44,
+	0xfb46, 0xfbb1,
+	0xfbd3, 0xfd3d,
+	0xfd50, 0xfd8f,
+	0xfd92, 0xfdc7,
+	0xfdf0, 0xfdfb,
+	0xfe70, 0xfe74,
+	0xfe76, 0xfefc,
+	0xff21, 0xff3a,
+	0xff41, 0xff5a,
+	0xff66, 0xffbe,
+	0xffc2, 0xffc7,
+	0xffca, 0xffcf,
+	0xffd2, 0xffd7,
+	0xffda, 0xffdc,
+	0x10000, 0x1000b,
+	0x1000d, 0x10026,
+	0x10028, 0x1003a,
+	0x1003c, 0x1003d,
+	0x1003f, 0x1004d,
+	0x10050, 0x1005d,
+	0x10080, 0x100fa,
+	0x10280, 0x1029c,
+	0x102a0, 0x102d0,
+	0x10300, 0x1031e,
+	0x10330, 0x10340,
+	0x10342, 0x10349,
+	0x10380, 0x1039d,
+	0x103a0, 0x103c3,
+	0x103c8, 0x103cf,
+	0x10400, 0x1049d,
+	0x10800, 0x10805,
+	0x1080a, 0x10835,
+	0x10837, 0x10838,
+	0x1083f, 0x10855,
+	0x10900, 0x10915,
+	0x10920, 0x10939,
+	0x10980, 0x109b7,
+	0x109be, 0x109bf,
+	0x10a10, 0x10a13,
+	0x10a15, 0x10a17,
+	0x10a19, 0x10a33,
+	0x10a60, 0x10a7c,
+	0x10b00, 0x10b35,
+	0x10b40, 0x10b55,
+	0x10b60, 0x10b72,
+	0x10c00, 0x10c48,
+	0x11003, 0x11037,
+	0x11083, 0x110af,
+	0x110d0, 0x110e8,
+	0x11103, 0x11126,
+	0x11183, 0x111b2,
+	0x111c1, 0x111c4,
+	0x11680, 0x116aa,
+	0x12000, 0x1236e,
+	0x13000, 0x1342e,
+	0x16800, 0x16a38,
+	0x16f00, 0x16f44,
+	0x16f93, 0x16f9f,
+	0x1b000, 0x1b001,
+	0x1d400, 0x1d454,
+	0x1d456, 0x1d49c,
+	0x1d49e, 0x1d49f,
+	0x1d4a5, 0x1d4a6,
+	0x1d4a9, 0x1d4ac,
+	0x1d4ae, 0x1d4b9,
+	0x1d4bd, 0x1d4c3,
+	0x1d4c5, 0x1d505,
+	0x1d507, 0x1d50a,
+	0x1d50d, 0x1d514,
+	0x1d516, 0x1d51c,
+	0x1d51e, 0x1d539,
+	0x1d53b, 0x1d53e,
+	0x1d540, 0x1d544,
+	0x1d54a, 0x1d550,
+	0x1d552, 0x1d6a5,
+	0x1d6a8, 0x1d6c0,
+	0x1d6c2, 0x1d6da,
+	0x1d6dc, 0x1d6fa,
+	0x1d6fc, 0x1d714,
+	0x1d716, 0x1d734,
+	0x1d736, 0x1d74e,
+	0x1d750, 0x1d76e,
+	0x1d770, 0x1d788,
+	0x1d78a, 0x1d7a8,
+	0x1d7aa, 0x1d7c2,
+	0x1d7c4, 0x1d7cb,
+	0x1ee00, 0x1ee03,
+	0x1ee05, 0x1ee1f,
+	0x1ee21, 0x1ee22,
+	0x1ee29, 0x1ee32,
+	0x1ee34, 0x1ee37,
+	0x1ee4d, 0x1ee4f,
+	0x1ee51, 0x1ee52,
+	0x1ee61, 0x1ee62,
+	0x1ee67, 0x1ee6a,
+	0x1ee6c, 0x1ee72,
+	0x1ee74, 0x1ee77,
+	0x1ee79, 0x1ee7c,
+	0x1ee80, 0x1ee89,
+	0x1ee8b, 0x1ee9b,
+	0x1eea1, 0x1eea3,
+	0x1eea5, 0x1eea9,
+	0x1eeab, 0x1eebb,
+	0x20000, 0x2a6d6,
+	0x2a700, 0x2b734,
+	0x2b740, 0x2b81d,
+	0x2f800, 0x2fa1d,
+};
+
+static Rune __isalphas[] = {
+	0x00aa,
+	0x00b5,
+	0x00ba,
+	0x02ec,
+	0x02ee,
+	0x0386,
+	0x038c,
+	0x0559,
+	0x06d5,
+	0x06ff,
+	0x0710,
+	0x07b1,
+	0x07fa,
+	0x081a,
+	0x0824,
+	0x0828,
+	0x08a0,
+	0x093d,
+	0x0950,
+	0x09b2,
+	0x09bd,
+	0x09ce,
+	0x0a5e,
+	0x0abd,
+	0x0ad0,
+	0x0b3d,
+	0x0b71,
+	0x0b83,
+	0x0b9c,
+	0x0bd0,
+	0x0c3d,
+	0x0cbd,
+	0x0cde,
+	0x0d3d,
+	0x0d4e,
+	0x0dbd,
+	0x0e84,
+	0x0e8a,
+	0x0e8d,
+	0x0ea5,
+	0x0ea7,
+	0x0ebd,
+	0x0ec6,
+	0x0f00,
+	0x103f,
+	0x1061,
+	0x108e,
+	0x10c7,
+	0x10cd,
+	0x1258,
+	0x12c0,
+	0x17d7,
+	0x17dc,
+	0x18aa,
+	0x1aa7,
+	0x1f59,
+	0x1f5b,
+	0x1f5d,
+	0x1fbe,
+	0x2071,
+	0x207f,
+	0x2102,
+	0x2107,
+	0x2115,
+	0x2124,
+	0x2126,
+	0x2128,
+	0x214e,
+	0x2d27,
+	0x2d2d,
+	0x2d6f,
+	0x2e2f,
+	0xa8fb,
+	0xa9cf,
+	0xaa7a,
+	0xaab1,
+	0xaac0,
+	0xaac2,
+	0xfb1d,
+	0xfb3e,
+	0x10808,
+	0x1083c,
+	0x10a00,
+	0x16f50,
+	0x1d4a2,
+	0x1d4bb,
+	0x1d546,
+	0x1ee24,
+	0x1ee27,
+	0x1ee39,
+	0x1ee3b,
+	0x1ee42,
+	0x1ee47,
+	0x1ee49,
+	0x1ee4b,
+	0x1ee54,
+	0x1ee57,
+	0x1ee59,
+	0x1ee5b,
+	0x1ee5d,
+	0x1ee5f,
+	0x1ee64,
+	0x1ee7e,
+};
+
+int
+isalpharune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __isalphar, nelem(__isalphar)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	p = _runebsearch(c, __isalphas, nelem(__isalphas), 1);
+	if(p && c == p[0])
+		return 1;
+	return 0;
+}
+
+static Rune __isupperr[] = {
+	0x0041, 0x005a,
+	0x00c0, 0x00d6,
+	0x00d8, 0x00de,
+	0x0178, 0x0179,
+	0x0181, 0x0182,
+	0x0186, 0x0187,
+	0x0189, 0x018b,
+	0x018e, 0x0191,
+	0x0193, 0x0194,
+	0x0196, 0x0198,
+	0x019c, 0x019d,
+	0x019f, 0x01a0,
+	0x01a6, 0x01a7,
+	0x01ae, 0x01af,
+	0x01b1, 0x01b3,
+	0x01b7, 0x01b8,
+	0x01f6, 0x01f8,
+	0x023a, 0x023b,
+	0x023d, 0x023e,
+	0x0243, 0x0246,
+	0x0388, 0x038a,
+	0x038e, 0x038f,
+	0x0391, 0x03a1,
+	0x03a3, 0x03ab,
+	0x03d2, 0x03d4,
+	0x03f9, 0x03fa,
+	0x03fd, 0x042f,
+	0x04c0, 0x04c1,
+	0x0531, 0x0556,
+	0x10a0, 0x10c5,
+	0x1f08, 0x1f0f,
+	0x1f18, 0x1f1d,
+	0x1f28, 0x1f2f,
+	0x1f38, 0x1f3f,
+	0x1f48, 0x1f4d,
+	0x1f68, 0x1f6f,
+	0x1f88, 0x1f8f,
+	0x1f98, 0x1f9f,
+	0x1fa8, 0x1faf,
+	0x1fb8, 0x1fbc,
+	0x1fc8, 0x1fcc,
+	0x1fd8, 0x1fdb,
+	0x1fe8, 0x1fec,
+	0x1ff8, 0x1ffc,
+	0x210b, 0x210d,
+	0x2110, 0x2112,
+	0x2119, 0x211d,
+	0x212a, 0x212d,
+	0x2130, 0x2133,
+	0x213e, 0x213f,
+	0x2160, 0x216f,
+	0x24b6, 0x24cf,
+	0x2c00, 0x2c2e,
+	0x2c62, 0x2c64,
+	0x2c6d, 0x2c70,
+	0x2c7e, 0x2c80,
+	0xa77d, 0xa77e,
+	0xff21, 0xff3a,
+	0x10400, 0x10427,
+	0x1d400, 0x1d419,
+	0x1d434, 0x1d44d,
+	0x1d468, 0x1d481,
+	0x1d49e, 0x1d49f,
+	0x1d4a5, 0x1d4a6,
+	0x1d4a9, 0x1d4ac,
+	0x1d4ae, 0x1d4b5,
+	0x1d4d0, 0x1d4e9,
+	0x1d504, 0x1d505,
+	0x1d507, 0x1d50a,
+	0x1d50d, 0x1d514,
+	0x1d516, 0x1d51c,
+	0x1d538, 0x1d539,
+	0x1d53b, 0x1d53e,
+	0x1d540, 0x1d544,
+	0x1d54a, 0x1d550,
+	0x1d56c, 0x1d585,
+	0x1d5a0, 0x1d5b9,
+	0x1d5d4, 0x1d5ed,
+	0x1d608, 0x1d621,
+	0x1d63c, 0x1d655,
+	0x1d670, 0x1d689,
+	0x1d6a8, 0x1d6c0,
+	0x1d6e2, 0x1d6fa,
+	0x1d71c, 0x1d734,
+	0x1d756, 0x1d76e,
+	0x1d790, 0x1d7a8,
+};
+
+static Rune __isupperp[] = {
+	0x0100, 0x0136,
+	0x0139, 0x0147,
+	0x014a, 0x0176,
+	0x017b, 0x017d,
+	0x01a2, 0x01a4,
+	0x01cd, 0x01db,
+	0x01de, 0x01ee,
+	0x01fa, 0x0232,
+	0x0248, 0x024e,
+	0x0370, 0x0372,
+	0x03d8, 0x03ee,
+	0x0460, 0x0480,
+	0x048a, 0x04be,
+	0x04c3, 0x04cd,
+	0x04d0, 0x0526,
+	0x1e00, 0x1e94,
+	0x1e9e, 0x1efe,
+	0x1f59, 0x1f5f,
+	0x2124, 0x2128,
+	0x2c67, 0x2c6b,
+	0x2c82, 0x2ce2,
+	0x2ceb, 0x2ced,
+	0xa640, 0xa66c,
+	0xa680, 0xa696,
+	0xa722, 0xa72e,
+	0xa732, 0xa76e,
+	0xa779, 0xa77b,
+	0xa780, 0xa786,
+	0xa78b, 0xa78d,
+	0xa790, 0xa792,
+	0xa7a0, 0xa7aa,
+};
+
+static Rune __isuppers[] = {
+	0x0184,
+	0x01a9,
+	0x01ac,
+	0x01b5,
+	0x01bc,
+	0x01c4,
+	0x01c7,
+	0x01ca,
+	0x01f1,
+	0x01f4,
+	0x0241,
+	0x0376,
+	0x0386,
+	0x038c,
+	0x03cf,
+	0x03f4,
+	0x03f7,
+	0x10c7,
+	0x10cd,
+	0x2102,
+	0x2107,
+	0x2115,
+	0x2145,
+	0x2183,
+	0x2c60,
+	0x2c72,
+	0x2c75,
+	0x2cf2,
+	0x1d49c,
+	0x1d4a2,
+	0x1d546,
+	0x1d7ca,
+};
+
+int
+isupperrune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __isupperr, nelem(__isupperr)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	p = _runebsearch(c, __isupperp, nelem(__isupperp)/2, 2);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return 1;
+	p = _runebsearch(c, __isuppers, nelem(__isuppers), 1);
+	if(p && c == p[0])
+		return 1;
+	return 0;
+}
+
+static Rune __islowerr[] = {
+	0x0061, 0x007a,
+	0x00df, 0x00f6,
+	0x00f8, 0x00ff,
+	0x0137, 0x0138,
+	0x0148, 0x0149,
+	0x017e, 0x0180,
+	0x018c, 0x018d,
+	0x0199, 0x019b,
+	0x01aa, 0x01ab,
+	0x01b9, 0x01ba,
+	0x01bd, 0x01bf,
+	0x01dc, 0x01dd,
+	0x01ef, 0x01f0,
+	0x0233, 0x0239,
+	0x023f, 0x0240,
+	0x024f, 0x0293,
+	0x0295, 0x02af,
+	0x037b, 0x037d,
+	0x03ac, 0x03ce,
+	0x03d0, 0x03d1,
+	0x03d5, 0x03d7,
+	0x03ef, 0x03f3,
+	0x03fb, 0x03fc,
+	0x0430, 0x045f,
+	0x04ce, 0x04cf,
+	0x0561, 0x0587,
+	0x1d00, 0x1d2b,
+	0x1d6b, 0x1d77,
+	0x1d79, 0x1d9a,
+	0x1e95, 0x1e9d,
+	0x1eff, 0x1f07,
+	0x1f10, 0x1f15,
+	0x1f20, 0x1f27,
+	0x1f30, 0x1f37,
+	0x1f40, 0x1f45,
+	0x1f50, 0x1f57,
+	0x1f60, 0x1f67,
+	0x1f70, 0x1f7d,
+	0x1f80, 0x1f87,
+	0x1f90, 0x1f97,
+	0x1fa0, 0x1fa7,
+	0x1fb0, 0x1fb4,
+	0x1fb6, 0x1fb7,
+	0x1fc2, 0x1fc4,
+	0x1fc6, 0x1fc7,
+	0x1fd0, 0x1fd3,
+	0x1fd6, 0x1fd7,
+	0x1fe0, 0x1fe7,
+	0x1ff2, 0x1ff4,
+	0x1ff6, 0x1ff7,
+	0x210e, 0x210f,
+	0x213c, 0x213d,
+	0x2146, 0x2149,
+	0x2170, 0x217f,
+	0x24d0, 0x24e9,
+	0x2c30, 0x2c5e,
+	0x2c65, 0x2c66,
+	0x2c73, 0x2c74,
+	0x2c76, 0x2c7b,
+	0x2ce3, 0x2ce4,
+	0x2d00, 0x2d25,
+	0xa72f, 0xa731,
+	0xa771, 0xa778,
+	0xfb00, 0xfb06,
+	0xfb13, 0xfb17,
+	0xff41, 0xff5a,
+	0x10428, 0x1044f,
+	0x1d41a, 0x1d433,
+	0x1d44e, 0x1d454,
+	0x1d456, 0x1d467,
+	0x1d482, 0x1d49b,
+	0x1d4b6, 0x1d4b9,
+	0x1d4bd, 0x1d4c3,
+	0x1d4c5, 0x1d4cf,
+	0x1d4ea, 0x1d503,
+	0x1d51e, 0x1d537,
+	0x1d552, 0x1d56b,
+	0x1d586, 0x1d59f,
+	0x1d5ba, 0x1d5d3,
+	0x1d5ee, 0x1d607,
+	0x1d622, 0x1d63b,
+	0x1d656, 0x1d66f,
+	0x1d68a, 0x1d6a5,
+	0x1d6c2, 0x1d6da,
+	0x1d6dc, 0x1d6e1,
+	0x1d6fc, 0x1d714,
+	0x1d716, 0x1d71b,
+	0x1d736, 0x1d74e,
+	0x1d750, 0x1d755,
+	0x1d770, 0x1d788,
+	0x1d78a, 0x1d78f,
+	0x1d7aa, 0x1d7c2,
+	0x1d7c4, 0x1d7c9,
+};
+
+static Rune __islowerp[] = {
+	0x0101, 0x0135,
+	0x013a, 0x0146,
+	0x014b, 0x0177,
+	0x017a, 0x017c,
+	0x0183, 0x0185,
+	0x01a1, 0x01a5,
+	0x01b4, 0x01b6,
+	0x01cc, 0x01da,
+	0x01df, 0x01ed,
+	0x01f3, 0x01f5,
+	0x01f9, 0x0231,
+	0x0247, 0x024d,
+	0x0371, 0x0373,
+	0x03d9, 0x03ed,
+	0x0461, 0x0481,
+	0x048b, 0x04bf,
+	0x04c2, 0x04cc,
+	0x04d1, 0x0527,
+	0x1e01, 0x1e93,
+	0x1e9f, 0x1efd,
+	0x2c68, 0x2c6c,
+	0x2c81, 0x2ce1,
+	0x2cec, 0x2cee,
+	0xa641, 0xa66d,
+	0xa681, 0xa697,
+	0xa723, 0xa72d,
+	0xa733, 0xa76f,
+	0xa77a, 0xa77c,
+	0xa77f, 0xa787,
+	0xa78c, 0xa78e,
+	0xa791, 0xa793,
+	0xa7a1, 0xa7a9,
+};
+
+static Rune __islowers[] = {
+	0x00b5,
+	0x0188,
+	0x0192,
+	0x0195,
+	0x019e,
+	0x01a8,
+	0x01ad,
+	0x01b0,
+	0x01c6,
+	0x01c9,
+	0x023c,
+	0x0242,
+	0x0377,
+	0x0390,
+	0x03f5,
+	0x03f8,
+	0x1fbe,
+	0x210a,
+	0x2113,
+	0x212f,
+	0x2134,
+	0x2139,
+	0x214e,
+	0x2184,
+	0x2c61,
+	0x2c71,
+	0x2cf3,
+	0x2d27,
+	0x2d2d,
+	0xa7fa,
+	0x1d4bb,
+	0x1d7cb,
+};
+
+int
+islowerrune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __islowerr, nelem(__islowerr)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	p = _runebsearch(c, __islowerp, nelem(__islowerp)/2, 2);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return 1;
+	p = _runebsearch(c, __islowers, nelem(__islowers), 1);
+	if(p && c == p[0])
+		return 1;
+	return 0;
+}
+
+static Rune __istitler[] = {
+	0x0041, 0x005a,
+	0x00c0, 0x00d6,
+	0x00d8, 0x00de,
+	0x0178, 0x0179,
+	0x0181, 0x0182,
+	0x0186, 0x0187,
+	0x0189, 0x018b,
+	0x018e, 0x0191,
+	0x0193, 0x0194,
+	0x0196, 0x0198,
+	0x019c, 0x019d,
+	0x019f, 0x01a0,
+	0x01a6, 0x01a7,
+	0x01ae, 0x01af,
+	0x01b1, 0x01b3,
+	0x01b7, 0x01b8,
+	0x01f6, 0x01f8,
+	0x023a, 0x023b,
+	0x023d, 0x023e,
+	0x0243, 0x0246,
+	0x0388, 0x038a,
+	0x038e, 0x038f,
+	0x0391, 0x03a1,
+	0x03a3, 0x03ab,
+	0x03f9, 0x03fa,
+	0x03fd, 0x042f,
+	0x04c0, 0x04c1,
+	0x0531, 0x0556,
+	0x10a0, 0x10c5,
+	0x1f08, 0x1f0f,
+	0x1f18, 0x1f1d,
+	0x1f28, 0x1f2f,
+	0x1f38, 0x1f3f,
+	0x1f48, 0x1f4d,
+	0x1f68, 0x1f6f,
+	0x1f88, 0x1f8f,
+	0x1f98, 0x1f9f,
+	0x1fa8, 0x1faf,
+	0x1fb8, 0x1fbc,
+	0x1fc8, 0x1fcc,
+	0x1fd8, 0x1fdb,
+	0x1fe8, 0x1fec,
+	0x1ff8, 0x1ffc,
+	0x2160, 0x216f,
+	0x24b6, 0x24cf,
+	0x2c00, 0x2c2e,
+	0x2c62, 0x2c64,
+	0x2c6d, 0x2c70,
+	0x2c7e, 0x2c80,
+	0xa77d, 0xa77e,
+	0xff21, 0xff3a,
+	0x10400, 0x10427,
+};
+
+static Rune __istitlep[] = {
+	0x0100, 0x012e,
+	0x0132, 0x0136,
+	0x0139, 0x0147,
+	0x014a, 0x0176,
+	0x017b, 0x017d,
+	0x01a2, 0x01a4,
+	0x01cb, 0x01db,
+	0x01de, 0x01ee,
+	0x01f2, 0x01f4,
+	0x01fa, 0x0232,
+	0x0248, 0x024e,
+	0x0370, 0x0372,
+	0x03d8, 0x03ee,
+	0x0460, 0x0480,
+	0x048a, 0x04be,
+	0x04c3, 0x04cd,
+	0x04d0, 0x0526,
+	0x1e00, 0x1e94,
+	0x1ea0, 0x1efe,
+	0x1f59, 0x1f5f,
+	0x2c67, 0x2c6b,
+	0x2c82, 0x2ce2,
+	0x2ceb, 0x2ced,
+	0xa640, 0xa66c,
+	0xa680, 0xa696,
+	0xa722, 0xa72e,
+	0xa732, 0xa76e,
+	0xa779, 0xa77b,
+	0xa780, 0xa786,
+	0xa78b, 0xa78d,
+	0xa790, 0xa792,
+	0xa7a0, 0xa7aa,
+};
+
+static Rune __istitles[] = {
+	0x0184,
+	0x01a9,
+	0x01ac,
+	0x01b5,
+	0x01bc,
+	0x01c5,
+	0x01c8,
+	0x0241,
+	0x0376,
+	0x0386,
+	0x038c,
+	0x03cf,
+	0x03f7,
+	0x10c7,
+	0x10cd,
+	0x2132,
+	0x2183,
+	0x2c60,
+	0x2c72,
+	0x2c75,
+	0x2cf2,
+};
+
+int
+istitlerune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __istitler, nelem(__istitler)/2, 2);
+	if(p && c >= p[0] && c <= p[1])
+		return 1;
+	p = _runebsearch(c, __istitlep, nelem(__istitlep)/2, 2);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return 1;
+	p = _runebsearch(c, __istitles, nelem(__istitles), 1);
+	if(p && c == p[0])
+		return 1;
+	return 0;
+}
+
+static Rune __toupperr[] = {
+	0x0061, 0x007a, 1048544,
+	0x00e0, 0x00f6, 1048544,
+	0x00f8, 0x00fe, 1048544,
+	0x023f, 0x0240, 1059391,
+	0x0256, 0x0257, 1048371,
+	0x028a, 0x028b, 1048359,
+	0x037b, 0x037d, 1048706,
+	0x03ad, 0x03af, 1048539,
+	0x03b1, 0x03c1, 1048544,
+	0x03c3, 0x03cb, 1048544,
+	0x03cd, 0x03ce, 1048513,
+	0x0430, 0x044f, 1048544,
+	0x0450, 0x045f, 1048496,
+	0x0561, 0x0586, 1048528,
+	0x1f00, 0x1f07, 1048584,
+	0x1f10, 0x1f15, 1048584,
+	0x1f20, 0x1f27, 1048584,
+	0x1f30, 0x1f37, 1048584,
+	0x1f40, 0x1f45, 1048584,
+	0x1f60, 0x1f67, 1048584,
+	0x1f70, 0x1f71, 1048650,
+	0x1f72, 0x1f75, 1048662,
+	0x1f76, 0x1f77, 1048676,
+	0x1f78, 0x1f79, 1048704,
+	0x1f7a, 0x1f7b, 1048688,
+	0x1f7c, 0x1f7d, 1048702,
+	0x1f80, 0x1f87, 1048584,
+	0x1f90, 0x1f97, 1048584,
+	0x1fa0, 0x1fa7, 1048584,
+	0x1fb0, 0x1fb1, 1048584,
+	0x1fd0, 0x1fd1, 1048584,
+	0x1fe0, 0x1fe1, 1048584,
+	0x2170, 0x217f, 1048560,
+	0x24d0, 0x24e9, 1048550,
+	0x2c30, 0x2c5e, 1048528,
+	0x2d00, 0x2d25, 1041312,
+	0xff41, 0xff5a, 1048544,
+	0x10428, 0x1044f, 1048536,
+};
+
+static Rune __toupperp[] = {
+	0x0101, 0x012f, 1048575,
+	0x0133, 0x0137, 1048575,
+	0x013a, 0x0148, 1048575,
+	0x014b, 0x0177, 1048575,
+	0x017a, 0x017e, 1048575,
+	0x0183, 0x0185, 1048575,
+	0x01a1, 0x01a5, 1048575,
+	0x01b4, 0x01b6, 1048575,
+	0x01ce, 0x01dc, 1048575,
+	0x01df, 0x01ef, 1048575,
+	0x01f9, 0x021f, 1048575,
+	0x0223, 0x0233, 1048575,
+	0x0247, 0x024f, 1048575,
+	0x0371, 0x0373, 1048575,
+	0x03d9, 0x03ef, 1048575,
+	0x0461, 0x0481, 1048575,
+	0x048b, 0x04bf, 1048575,
+	0x04c2, 0x04ce, 1048575,
+	0x04d1, 0x0527, 1048575,
+	0x1e01, 0x1e95, 1048575,
+	0x1ea1, 0x1eff, 1048575,
+	0x1f51, 0x1f57, 1048584,
+	0x2c68, 0x2c6c, 1048575,
+	0x2c81, 0x2ce3, 1048575,
+	0x2cec, 0x2cee, 1048575,
+	0xa641, 0xa66d, 1048575,
+	0xa681, 0xa697, 1048575,
+	0xa723, 0xa72f, 1048575,
+	0xa733, 0xa76f, 1048575,
+	0xa77a, 0xa77c, 1048575,
+	0xa77f, 0xa787, 1048575,
+	0xa791, 0xa793, 1048575,
+	0xa7a1, 0xa7a9, 1048575,
+};
+
+static Rune __touppers[] = {
+	0x00b5, 1049319,
+	0x00ff, 1048697,
+	0x0131, 1048344,
+	0x017f, 1048276,
+	0x0180, 1048771,
+	0x0188, 1048575,
+	0x018c, 1048575,
+	0x0192, 1048575,
+	0x0195, 1048673,
+	0x0199, 1048575,
+	0x019a, 1048739,
+	0x019e, 1048706,
+	0x01a8, 1048575,
+	0x01ad, 1048575,
+	0x01b0, 1048575,
+	0x01b9, 1048575,
+	0x01bd, 1048575,
+	0x01bf, 1048632,
+	0x01c5, 1048575,
+	0x01c6, 1048574,
+	0x01c8, 1048575,
+	0x01c9, 1048574,
+	0x01cb, 1048575,
+	0x01cc, 1048574,
+	0x01dd, 1048497,
+	0x01f2, 1048575,
+	0x01f3, 1048574,
+	0x01f5, 1048575,
+	0x023c, 1048575,
+	0x0242, 1048575,
+	0x0250, 1059359,
+	0x0251, 1059356,
+	0x0252, 1059358,
+	0x0253, 1048366,
+	0x0254, 1048370,
+	0x0259, 1048374,
+	0x025b, 1048373,
+	0x0260, 1048371,
+	0x0263, 1048369,
+	0x0265, 1090856,
+	0x0266, 1090884,
+	0x0268, 1048367,
+	0x0269, 1048365,
+	0x026b, 1059319,
+	0x026f, 1048365,
+	0x0271, 1059325,
+	0x0272, 1048363,
+	0x0275, 1048362,
+	0x027d, 1059303,
+	0x0280, 1048358,
+	0x0283, 1048358,
+	0x0288, 1048358,
+	0x0289, 1048507,
+	0x028c, 1048505,
+	0x0292, 1048357,
+	0x0345, 1048660,
+	0x0377, 1048575,
+	0x03ac, 1048538,
+	0x03c2, 1048545,
+	0x03cc, 1048512,
+	0x03d0, 1048514,
+	0x03d1, 1048519,
+	0x03d5, 1048529,
+	0x03d6, 1048522,
+	0x03d7, 1048568,
+	0x03f0, 1048490,
+	0x03f1, 1048496,
+	0x03f2, 1048583,
+	0x03f5, 1048480,
+	0x03f8, 1048575,
+	0x03fb, 1048575,
+	0x04cf, 1048561,
+	0x1d79, 1083908,
+	0x1d7d, 1052390,
+	0x1e9b, 1048517,
+	0x1fb3, 1048585,
+	0x1fbe, 1041371,
+	0x1fc3, 1048585,
+	0x1fe5, 1048583,
+	0x1ff3, 1048585,
+	0x214e, 1048548,
+	0x2184, 1048575,
+	0x2c61, 1048575,
+	0x2c65, 1037781,
+	0x2c66, 1037784,
+	0x2c73, 1048575,
+	0x2c76, 1048575,
+	0x2cf3, 1048575,
+	0x2d27, 1041312,
+	0x2d2d, 1041312,
+	0xa78c, 1048575,
+};
+
+Rune
+toupperrune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __toupperr, nelem(__toupperr)/3, 3);
+	if(p && c >= p[0] && c <= p[1])
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __toupperp, nelem(__toupperp)/3, 3);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __touppers, nelem(__touppers)/2, 2);
+	if(p && c == p[0])
+		return c + p[1] - 1048576;
+	return c;
+}
+
+static Rune __tolowerr[] = {
+	0x0041, 0x005a, 1048608,
+	0x00c0, 0x00d6, 1048608,
+	0x00d8, 0x00de, 1048608,
+	0x0189, 0x018a, 1048781,
+	0x01b1, 0x01b2, 1048793,
+	0x0388, 0x038a, 1048613,
+	0x038e, 0x038f, 1048639,
+	0x0391, 0x03a1, 1048608,
+	0x03a3, 0x03ab, 1048608,
+	0x03fd, 0x03ff, 1048446,
+	0x0400, 0x040f, 1048656,
+	0x0410, 0x042f, 1048608,
+	0x0531, 0x0556, 1048624,
+	0x10a0, 0x10c5, 1055840,
+	0x1f08, 0x1f0f, 1048568,
+	0x1f18, 0x1f1d, 1048568,
+	0x1f28, 0x1f2f, 1048568,
+	0x1f38, 0x1f3f, 1048568,
+	0x1f48, 0x1f4d, 1048568,
+	0x1f68, 0x1f6f, 1048568,
+	0x1f88, 0x1f8f, 1048568,
+	0x1f98, 0x1f9f, 1048568,
+	0x1fa8, 0x1faf, 1048568,
+	0x1fb8, 0x1fb9, 1048568,
+	0x1fba, 0x1fbb, 1048502,
+	0x1fc8, 0x1fcb, 1048490,
+	0x1fd8, 0x1fd9, 1048568,
+	0x1fda, 0x1fdb, 1048476,
+	0x1fe8, 0x1fe9, 1048568,
+	0x1fea, 0x1feb, 1048464,
+	0x1ff8, 0x1ff9, 1048448,
+	0x1ffa, 0x1ffb, 1048450,
+	0x2160, 0x216f, 1048592,
+	0x24b6, 0x24cf, 1048602,
+	0x2c00, 0x2c2e, 1048624,
+	0x2c7e, 0x2c7f, 1037761,
+	0xff21, 0xff3a, 1048608,
+	0x10400, 0x10427, 1048616,
+};
+
+static Rune __tolowerp[] = {
+	0x0100, 0x012e, 1048577,
+	0x0132, 0x0136, 1048577,
+	0x0139, 0x0147, 1048577,
+	0x014a, 0x0176, 1048577,
+	0x017b, 0x017d, 1048577,
+	0x01a2, 0x01a4, 1048577,
+	0x01b3, 0x01b5, 1048577,
+	0x01cd, 0x01db, 1048577,
+	0x01de, 0x01ee, 1048577,
+	0x01f8, 0x021e, 1048577,
+	0x0222, 0x0232, 1048577,
+	0x0248, 0x024e, 1048577,
+	0x0370, 0x0372, 1048577,
+	0x03d8, 0x03ee, 1048577,
+	0x0460, 0x0480, 1048577,
+	0x048a, 0x04be, 1048577,
+	0x04c3, 0x04cd, 1048577,
+	0x04d0, 0x0526, 1048577,
+	0x1e00, 0x1e94, 1048577,
+	0x1ea0, 0x1efe, 1048577,
+	0x1f59, 0x1f5f, 1048568,
+	0x2c67, 0x2c6b, 1048577,
+	0x2c80, 0x2ce2, 1048577,
+	0x2ceb, 0x2ced, 1048577,
+	0xa640, 0xa66c, 1048577,
+	0xa680, 0xa696, 1048577,
+	0xa722, 0xa72e, 1048577,
+	0xa732, 0xa76e, 1048577,
+	0xa779, 0xa77b, 1048577,
+	0xa780, 0xa786, 1048577,
+	0xa790, 0xa792, 1048577,
+	0xa7a0, 0xa7a8, 1048577,
+};
+
+static Rune __tolowers[] = {
+	0x0130, 1048377,
+	0x0178, 1048455,
+	0x0179, 1048577,
+	0x0181, 1048786,
+	0x0182, 1048577,
+	0x0184, 1048577,
+	0x0186, 1048782,
+	0x0187, 1048577,
+	0x018b, 1048577,
+	0x018e, 1048655,
+	0x018f, 1048778,
+	0x0190, 1048779,
+	0x0191, 1048577,
+	0x0193, 1048781,
+	0x0194, 1048783,
+	0x0196, 1048787,
+	0x0197, 1048785,
+	0x0198, 1048577,
+	0x019c, 1048787,
+	0x019d, 1048789,
+	0x019f, 1048790,
+	0x01a0, 1048577,
+	0x01a6, 1048794,
+	0x01a7, 1048577,
+	0x01a9, 1048794,
+	0x01ac, 1048577,
+	0x01ae, 1048794,
+	0x01af, 1048577,
+	0x01b7, 1048795,
+	0x01b8, 1048577,
+	0x01bc, 1048577,
+	0x01c4, 1048578,
+	0x01c5, 1048577,
+	0x01c7, 1048578,
+	0x01c8, 1048577,
+	0x01ca, 1048578,
+	0x01cb, 1048577,
+	0x01f1, 1048578,
+	0x01f2, 1048577,
+	0x01f4, 1048577,
+	0x01f6, 1048479,
+	0x01f7, 1048520,
+	0x0220, 1048446,
+	0x023a, 1059371,
+	0x023b, 1048577,
+	0x023d, 1048413,
+	0x023e, 1059368,
+	0x0241, 1048577,
+	0x0243, 1048381,
+	0x0244, 1048645,
+	0x0245, 1048647,
+	0x0246, 1048577,
+	0x0376, 1048577,
+	0x0386, 1048614,
+	0x038c, 1048640,
+	0x03cf, 1048584,
+	0x03f4, 1048516,
+	0x03f7, 1048577,
+	0x03f9, 1048569,
+	0x03fa, 1048577,
+	0x04c0, 1048591,
+	0x04c1, 1048577,
+	0x10c7, 1055840,
+	0x10cd, 1055840,
+	0x1e9e, 1040961,
+	0x1fbc, 1048567,
+	0x1fcc, 1048567,
+	0x1fec, 1048569,
+	0x1ffc, 1048567,
+	0x2126, 1041059,
+	0x212a, 1040193,
+	0x212b, 1040314,
+	0x2132, 1048604,
+	0x2183, 1048577,
+	0x2c60, 1048577,
+	0x2c62, 1037833,
+	0x2c63, 1044762,
+	0x2c64, 1037849,
+	0x2c6d, 1037796,
+	0x2c6e, 1037827,
+	0x2c6f, 1037793,
+	0x2c70, 1037794,
+	0x2c72, 1048577,
+	0x2c75, 1048577,
+	0x2cf2, 1048577,
+	0xa77d, 1013244,
+	0xa77e, 1048577,
+	0xa78b, 1048577,
+	0xa78d, 1006296,
+	0xa7aa, 1006268,
+};
+
+Rune
+tolowerrune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __tolowerr, nelem(__tolowerr)/3, 3);
+	if(p && c >= p[0] && c <= p[1])
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __tolowerp, nelem(__tolowerp)/3, 3);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __tolowers, nelem(__tolowers)/2, 2);
+	if(p && c == p[0])
+		return c + p[1] - 1048576;
+	return c;
+}
+
+static Rune __totitler[] = {
+	0x0061, 0x007a, 1048544,
+	0x00e0, 0x00f6, 1048544,
+	0x00f8, 0x00fe, 1048544,
+	0x023f, 0x0240, 1059391,
+	0x0256, 0x0257, 1048371,
+	0x028a, 0x028b, 1048359,
+	0x037b, 0x037d, 1048706,
+	0x03ad, 0x03af, 1048539,
+	0x03b1, 0x03c1, 1048544,
+	0x03c3, 0x03cb, 1048544,
+	0x03cd, 0x03ce, 1048513,
+	0x0430, 0x044f, 1048544,
+	0x0450, 0x045f, 1048496,
+	0x0561, 0x0586, 1048528,
+	0x1f00, 0x1f07, 1048584,
+	0x1f10, 0x1f15, 1048584,
+	0x1f20, 0x1f27, 1048584,
+	0x1f30, 0x1f37, 1048584,
+	0x1f40, 0x1f45, 1048584,
+	0x1f60, 0x1f67, 1048584,
+	0x1f70, 0x1f71, 1048650,
+	0x1f72, 0x1f75, 1048662,
+	0x1f76, 0x1f77, 1048676,
+	0x1f78, 0x1f79, 1048704,
+	0x1f7a, 0x1f7b, 1048688,
+	0x1f7c, 0x1f7d, 1048702,
+	0x1f80, 0x1f87, 1048584,
+	0x1f90, 0x1f97, 1048584,
+	0x1fa0, 0x1fa7, 1048584,
+	0x1fb0, 0x1fb1, 1048584,
+	0x1fd0, 0x1fd1, 1048584,
+	0x1fe0, 0x1fe1, 1048584,
+	0x2170, 0x217f, 1048560,
+	0x24d0, 0x24e9, 1048550,
+	0x2c30, 0x2c5e, 1048528,
+	0x2d00, 0x2d25, 1041312,
+	0xff41, 0xff5a, 1048544,
+	0x10428, 0x1044f, 1048536,
+};
+
+static Rune __totitlep[] = {
+	0x0101, 0x012f, 1048575,
+	0x0133, 0x0137, 1048575,
+	0x013a, 0x0148, 1048575,
+	0x014b, 0x0177, 1048575,
+	0x017a, 0x017e, 1048575,
+	0x0183, 0x0185, 1048575,
+	0x01a1, 0x01a5, 1048575,
+	0x01b4, 0x01b6, 1048575,
+	0x01cc, 0x01dc, 1048575,
+	0x01df, 0x01ef, 1048575,
+	0x01f3, 0x01f5, 1048575,
+	0x01f9, 0x021f, 1048575,
+	0x0223, 0x0233, 1048575,
+	0x0247, 0x024f, 1048575,
+	0x0371, 0x0373, 1048575,
+	0x03d9, 0x03ef, 1048575,
+	0x0461, 0x0481, 1048575,
+	0x048b, 0x04bf, 1048575,
+	0x04c2, 0x04ce, 1048575,
+	0x04d1, 0x0527, 1048575,
+	0x1e01, 0x1e95, 1048575,
+	0x1ea1, 0x1eff, 1048575,
+	0x1f51, 0x1f57, 1048584,
+	0x2c68, 0x2c6c, 1048575,
+	0x2c81, 0x2ce3, 1048575,
+	0x2cec, 0x2cee, 1048575,
+	0xa641, 0xa66d, 1048575,
+	0xa681, 0xa697, 1048575,
+	0xa723, 0xa72f, 1048575,
+	0xa733, 0xa76f, 1048575,
+	0xa77a, 0xa77c, 1048575,
+	0xa77f, 0xa787, 1048575,
+	0xa791, 0xa793, 1048575,
+	0xa7a1, 0xa7a9, 1048575,
+};
+
+static Rune __totitles[] = {
+	0x00b5, 1049319,
+	0x00ff, 1048697,
+	0x0131, 1048344,
+	0x017f, 1048276,
+	0x0180, 1048771,
+	0x0188, 1048575,
+	0x018c, 1048575,
+	0x0192, 1048575,
+	0x0195, 1048673,
+	0x0199, 1048575,
+	0x019a, 1048739,
+	0x019e, 1048706,
+	0x01a8, 1048575,
+	0x01ad, 1048575,
+	0x01b0, 1048575,
+	0x01b9, 1048575,
+	0x01bd, 1048575,
+	0x01bf, 1048632,
+	0x01c4, 1048577,
+	0x01c6, 1048575,
+	0x01c7, 1048577,
+	0x01c9, 1048575,
+	0x01ca, 1048577,
+	0x01dd, 1048497,
+	0x01f1, 1048577,
+	0x023c, 1048575,
+	0x0242, 1048575,
+	0x0250, 1059359,
+	0x0251, 1059356,
+	0x0252, 1059358,
+	0x0253, 1048366,
+	0x0254, 1048370,
+	0x0259, 1048374,
+	0x025b, 1048373,
+	0x0260, 1048371,
+	0x0263, 1048369,
+	0x0265, 1090856,
+	0x0266, 1090884,
+	0x0268, 1048367,
+	0x0269, 1048365,
+	0x026b, 1059319,
+	0x026f, 1048365,
+	0x0271, 1059325,
+	0x0272, 1048363,
+	0x0275, 1048362,
+	0x027d, 1059303,
+	0x0280, 1048358,
+	0x0283, 1048358,
+	0x0288, 1048358,
+	0x0289, 1048507,
+	0x028c, 1048505,
+	0x0292, 1048357,
+	0x0345, 1048660,
+	0x0377, 1048575,
+	0x03ac, 1048538,
+	0x03c2, 1048545,
+	0x03cc, 1048512,
+	0x03d0, 1048514,
+	0x03d1, 1048519,
+	0x03d5, 1048529,
+	0x03d6, 1048522,
+	0x03d7, 1048568,
+	0x03f0, 1048490,
+	0x03f1, 1048496,
+	0x03f2, 1048583,
+	0x03f5, 1048480,
+	0x03f8, 1048575,
+	0x03fb, 1048575,
+	0x04cf, 1048561,
+	0x1d79, 1083908,
+	0x1d7d, 1052390,
+	0x1e9b, 1048517,
+	0x1fb3, 1048585,
+	0x1fbe, 1041371,
+	0x1fc3, 1048585,
+	0x1fe5, 1048583,
+	0x1ff3, 1048585,
+	0x214e, 1048548,
+	0x2184, 1048575,
+	0x2c61, 1048575,
+	0x2c65, 1037781,
+	0x2c66, 1037784,
+	0x2c73, 1048575,
+	0x2c76, 1048575,
+	0x2cf3, 1048575,
+	0x2d27, 1041312,
+	0x2d2d, 1041312,
+	0xa78c, 1048575,
+};
+
+Rune
+totitlerune(Rune c)
+{
+	Rune *p;
+
+	p = _runebsearch(c, __totitler, nelem(__totitler)/3, 3);
+	if(p && c >= p[0] && c <= p[1])
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __totitlep, nelem(__totitlep)/3, 3);
+	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
+		return c + p[2] - 1048576;
+	p = _runebsearch(c, __totitles, nelem(__totitles)/2, 2);
+	if(p && c == p[0])
+		return c + p[1] - 1048576;
+	return c;
+}
+