diff --git a/Makefile b/Makefile index 86f56355c..ca5793a38 100644 --- a/Makefile +++ b/Makefile @@ -152,6 +152,7 @@ include tool/build/emucrt/emucrt.mk include tool/build/emubin/emubin.mk include tool/build/build.mk include examples/examples.mk +include examples/pyapp/pyapp.mk include tool/decode/lib/decodelib.mk include tool/decode/decode.mk include tool/hash/hash.mk diff --git a/build/definitions.mk b/build/definitions.mk index e431d373f..b86775fca 100644 --- a/build/definitions.mk +++ b/build/definitions.mk @@ -168,7 +168,7 @@ DEFAULT_LDFLAGS = \ --gc-sections \ --build-id=none \ --no-dynamic-linker \ - -z max-page-size=0x1000 --cref -Map=$@.map + -z max-page-size=0x1000 ZIPOBJ_FLAGS = \ -b$(IMAGE_BASE_VIRTUAL) diff --git a/build/rules.mk b/build/rules.mk index 5a5d21f23..78fe90ef6 100644 --- a/build/rules.mk +++ b/build/rules.mk @@ -63,6 +63,7 @@ o/$(MODE)/%.o: o/$(MODE)/%.cc ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx o/$(MODE)/%.lds: %.lds ; @$(COMPILE) -APREPROCESS $(PREPROCESS.lds) $(OUTPUT_OPTION) $< o/$(MODE)/%.h.ok: %.h ; @$(COMPILE) -ACHECK.h $(COMPILE.c) -x c -g0 -o $@ $< o/$(MODE)/%.h.okk: %.h ; @$(COMPILE) -ACHECK.h $(COMPILE.cxx) -x c++ -g0 -o $@ $< +o/$(MODE)/%.cxx.o: %.c ; @$(COMPILE) -AOBJECTIFY.cxx $(OBJECTIFY.cxx) -x c++ $(OUTPUT_OPTION) $< o/$(MODE)/%.o: %.greg.c ; @$(COMPILE) -AOBJECTIFY.greg $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $< o/$(MODE)/%.greg.o: %.greg.c ; @$(COMPILE) -AOBJECTIFY.greg $(OBJECTIFY.greg.c) $(OUTPUT_OPTION) $< o/$(MODE)/%.ansi.o: %.ansi.c ; @$(COMPILE) -AOBJECTIFY.ansi $(OBJECTIFY.ansi.c) $(OUTPUT_OPTION) $< diff --git a/examples/pyapp/pyapp.mk b/examples/pyapp/pyapp.mk new file mode 100644 index 000000000..298236fc6 --- /dev/null +++ b/examples/pyapp/pyapp.mk @@ -0,0 +1,116 @@ +#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ +#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘ +# +# SYNOPSIS +# +# Actually Portable Python Tutorial +# +# DESCRIPTION +# +# This tutorial demonstrates how to compile Python apps as tiny +# static multiplatform APE executables as small as 1.9m in size +# using Cosmopolitan, which is a BSD-style multitenant codebase +# +# GETTING STARTED +# +# # run these commands after cloning the cosmo repo on linux +# $ make -j8 o//examples/pyapp/pyapp.com +# $ o//examples/pyapp/pyapp.com +# cosmopolitan is cool! +# +# HOW IT WORKS +# +# $ pyobj.com -m -o pyapp.o pyapp.py +# $ ld -static -nostdlib -T o//ape/ape.lds ape.o crt.o \ +# pyapp.o \ +# cosmopolitan-python-stage2.a \ +# cosmopolitan-sqlite3.a \ +# cosmopolitan-linenoise.a \ +# cosmopolitan-bzip2.a \ +# cosmopolitan-python-stage1.a \ +# cosmopolitan.a +# $ ./pyapp.com +# cosmopolitan is cool! +# +# NOTES +# +# If you enjoy this tutorial, let us know jtunney@gmail.com. If +# you're building something cool, then we can we can add you to +# our .gitowners file which grants you commit access so you can +# indepnedently maintain your package, as part of the mono-repo + +PKGS += PYAPP +PYAPP = $(PYAPP_DEPS) o/$(MODE)/examples/pyapp/pyapp.a +PYAPP_COMS = o/$(MODE)/examples/pyapp/pyapp.com +PYAPP_BINS = $(PYAPP_COMS) $(PYAPP_COMS:%=%.dbg) + +# Specify our Cosmopolitan library dependencies +# +# - THIRD_PARTY_PYTHON_STAGE1 plus THIRD_PARTY_PYTHON_STAGE2 will +# define the Python CAPI and supported standard library modules +# +PYAPP_DIRECTDEPS = \ + THIRD_PARTY_PYTHON_STAGE2 + +# Compute the transitive closure of dependencies. There's dozens of +# other static libraries we need, in order to build a static binary +# such as fmt.a, runtime.a, str.a etc. This magic statement figures +# them all out and arranges them in the correct order. +PYAPP_DEPS := $(call uniq,$(foreach x,$(PYAPP_DIRECTDEPS),$($(x)))) + +# # Asks PYOBJ.COM to turn our Python source into an ELF object which +# # contains (a) embedded zip file artifacts of our .py file and .pyc +# # which it it compiled; and (b) statically analyzed listings of our +# # python namespaces and imports that GNU ld will use for tree shake +# # NOTE: This code can be commented out since it's in build/rules.mk +# o/$(MODE)/examples/pyapp/pyapp.o: examples/pyapp/pyapp.py o/$(MODE)/third_party/python/pyobj +# o/$(MODE)/third_party/python/pyobj $(PYFLAGS) -o $@ $< + +# We need to define how the repository source code path gets mapped +# into an APE ZIP file path. By convention, we place Python modules +# in `.python/` (which is accessible via open() system calls, using +# the synthetic path `"/zip/.python/"`) which means that if we want +# to turn `pyapp/pyapp.py` into `.python/pyapp.py` so it's imported +# using `import pyapp` then we can simply append to PYOBJ.COM flags +# flags above asking it to strip one directory component and prefix +# Lastly be sure that whenever you use this variable override trick +# you only do it to .o files, since otherwise it'll ruin everything +# Passing -m to PYOBJ.COM causes a C main() function to get yoinked +# and it means our Python module can no longer be used as a library +o/$(MODE)/examples/pyapp/pyapp.o: PYFLAGS += -m -C2 -P.python + +# Asks PACKAGE.COM to sanity check our DIRECTDEPS and symbol graph. +# This program functions as an incremental linker. It also provides +# enhancements to the object code that GCC generated similar to LTO +# so be certain that your .com.dbg rule depends on the .pkg output! +o/$(MODE)/examples/pyapp/pyapp.pkg: \ + o/$(MODE)/examples/pyapp/pyapp.o \ + $(foreach x,$(PYAPP_DIRECTDEPS),$($(x)_A).pkg) + +# Ask GNU LD to link our APE executable within an ELF binary shell. +# The CRT and APE dependencies are special dependencies that define +# your _start() / WinMain() entrpoints as well as APE linker script +o/$(MODE)/examples/pyapp/pyapp.com.dbg: \ + $(PYAPP_DEPS) \ + o/$(MODE)/examples/pyapp/pyapp.pkg \ + o/$(MODE)/examples/pyapp/pyapp.o \ + $(CRT) \ + $(APE) + $(LINK) $(LINKARGS) -o $@ + +# # Unwrap the APE .COM binary, that's embedded within the linked file +# # NOTE: This line can be commented out, since it's in build/rules.mk +# o/$(MODE)/examples/pyapp/pyapp.com: \ +# o/$(MODE)/examples/pyapp/pyapp.com.dbg +# $(OBJCOPY) -S -O binary $< $@ + +# Ensure that build config changes will invalidate build artifacts. +o/$(MODE)/examples/pyapp/pyapp.o: \ + examples/pyapp/pyapp.mk + +# By convention we want to be able to say `make -j8 o//examples/pyapp` +# and have it build all targets the package defines. +.PHONY: o/$(MODE)/examples/pyapp +o/$(MODE)/examples/pyapp: \ + o/$(MODE)/examples/pyapp/pyapp.com \ + o/$(MODE)/examples/pyapp/pyapp.com.dbg diff --git a/examples/pyapp/pyapp.py b/examples/pyapp/pyapp.py new file mode 100644 index 000000000..de50ae2fa --- /dev/null +++ b/examples/pyapp/pyapp.py @@ -0,0 +1,4 @@ +def main(): + print('cosmopolitan is cool!') +if __name__ == '__main__': + main() diff --git a/examples/unbourne.c b/examples/unbourne.c index a75b15bf2..18310c9c6 100644 --- a/examples/unbourne.c +++ b/examples/unbourne.c @@ -5745,7 +5745,7 @@ retry: linenoiseSetFreeHintsCallback(free); linenoiseSetHintsCallback(ShellHint); linenoiseSetCompletionCallback(ShellCompletion); - if ((p = ezlinenoise(getprompt(NULL), "unbourne"))) { + if ((p = ezlinenoise("$ ", "unbourne"))) { nr = min(strlen(p), IBUFSIZ - 2); memcpy(buf, p, nr); buf[nr++] = '\n'; diff --git a/libc/calls/lseek.c b/libc/calls/lseek.c index 50ff252a3..e391f3bef 100644 --- a/libc/calls/lseek.c +++ b/libc/calls/lseek.c @@ -20,6 +20,7 @@ #include "libc/calls/calls.h" #include "libc/calls/internal.h" #include "libc/dce.h" +#include "libc/log/backtrace.internal.h" #include "libc/zipos/zipos.internal.h" /** diff --git a/libc/calls/readansi.c b/libc/calls/readansi.c index 27706e4a1..094800f95 100644 --- a/libc/calls/readansi.c +++ b/libc/calls/readansi.c @@ -31,9 +31,16 @@ * * "a" ALFA * "\316\261" ALPHA - * "\033[A" CURSOR UP - * "\033[38;5;202m" ORANGERED + * "\e[38;5;202m" ORANGERED + * "\e[A" UP + * "\e\e[A" ALT-UP + * "\001" CTRL-ALFA + * "\e\001" ALT-CTRL-ALFA * "\eOP" PF1 + * "\000" NUL + * "\e]rm -rf /\e\\" OSC + * "\302\233A" UP + * "\300\200" NUL * * This routine generalizes to ascii, utf-8, chorded modifier keys, * function keys, color codes, c0/c1 control codes, cursor movement, @@ -44,15 +51,7 @@ * can cause the stream to go out of sync. This function recovers such * events by ignoring continuation bytes at the beginning of each read. * - * String control sequences, e.g. "\e_hello\e\\" currently are not - * tokenized as a single read. Lastly note, this function has limited - * support for UNICODE representations of C0/C1 control codes, e.g. - * - * "\000" NUL - * "\300\200" NUL - * "\302\233A" CURSOR UP - * - * @param buf is guaranteed to receive a NUL terminator if size>0 + * @param p is guaranteed to receive a NUL terminator if n>0 * @return number of bytes read (helps differentiate "\0" vs. "") * @see examples/ttyinfo.c * @see ANSI X3.64-1979 @@ -60,81 +59,198 @@ * @see FIPS-86 * @see ECMA-48 */ -ssize_t readansi(int fd, char *buf, size_t size) { +ssize_t readansi(int fd, char *p, size_t n) { wint_t x; - uint8_t c; - int i, j, rc; - enum { kAscii, kUtf8, kEsc, kCsi, kSs } t; - if (size) buf[0] = 0; - for (j = i = 0, t = kAscii;;) { - if (i + 2 >= size) return enomem(); - if ((rc = read(fd, &c, 1)) != 1) return rc; - buf[i++] = c; - buf[i] = 0; + ssize_t rc; + int e, i, j; + unsigned char c; + enum { kAscii, kUtf8, kEsc, kCsi1, kCsi2, kSs, kNf, kStr, kStr2, kDone } t; + e = errno; + t = kAscii; + x = i = j = 0; + if (n) p[0] = 0; + do { + for (;;) { + if (n) { + rc = read(fd, &c, 1); + } else { + rc = read(fd, 0, 0); + } + if (rc == -1 && errno == EINTR) { + if (!i) { + return -1; + } + } else if (rc == -1) { + return -1; + } else if (!rc) { + if (!i) { + errno = e; + return 0; + } else { + return eilseq(); + } + } else { + break; + } + } + if (i + 1 < n) { + p[i] = c; + p[i + 1] = 0; + } else if (i < n) { + p[i] = 0; + } + ++i; switch (t) { + Whoopsie: + if (n) p[0] = c; + t = kAscii; + i = 1; + /* fallthrough */ case kAscii: if (c < 0200) { if (c == '\e') { t = kEsc; } else { - return i; + t = kDone; } } else if (c >= 0300) { t = kUtf8; x = ThomPikeByte(c); j = ThomPikeLen(c) - 1; + } else { + /* ignore overlong sequences */ } break; case kUtf8: - x = ThomPikeMerge(x, c); - if (!--j) { - switch (x) { - case '\e': - t = kEsc; - break; - case 0x9b: - t = kCsi; - break; - default: - return i; + if ((c & 0300) == 0200) { + x = ThomPikeMerge(x, c); + if (!--j) { + switch (x) { + case '\e': + t = kEsc; /* parsed but not canonicalized */ + break; + case 0x9b: + t = kCsi1; /* unusual but legal */ + break; + case 0x8e: + case 0x8f: + t = kSs; /* unusual but legal */ + break; + case 0x90: /* DCS (Device Control String) */ + case 0x98: /* SOS (Start of String) */ + case 0x9d: /* OSC (Operating System Command) */ + case 0x9e: /* PM (Privacy Message) */ + case 0x9f: /* APC (Application Program Command) */ + t = kStr; + break; + default: + t = kDone; + break; + } } + } else { + goto Whoopsie; /* ignore underlong sequences if not eof */ } break; case kEsc: - switch (c) { - case '[': - t = kCsi; - break; - case 'N': - case 'O': - t = kSs; - break; - case '\e': - case 0x20 ... 0x2F: - break; - default: - return i; - } - break; - case kCsi: - switch (c) { - case '[': - case ':': - case ';': - case '<': - case '=': - case '>': - case '?': - case '0' ... '9': - break; - default: - return i; + if (0x20 <= c && c <= 0x2f) { + t = kNf; + } else if (0x30 <= c && c <= 0x3f) { /* Fp */ + t = kDone; + } else if (0x20 <= c && c <= 0x5F) { /* Fe */ + switch (c) { + case '[': + t = kCsi1; + break; + case 'N': /* SS2 */ + case 'O': /* SS3 */ + t = kSs; + break; + case 'P': /* DCS (Device Control String) */ + case 'X': /* SOS (Start of String) */ + case ']': /* DCS (Operating System Command) */ + case '^': /* PM (Privacy Message) */ + case '_': /* DCS (Application Program Command) */ + t = kStr; + break; + case '\\': + goto Whoopsie; + default: + t = kDone; + break; + } + } else if (0x60 <= c && c <= 0x7e) { /* Fs */ + t = kDone; + } else if (c == '\e') { + if (i < 3) { + t = kEsc; /* alt chording */ + } else { + t = kDone; /* esc mashing */ + i = 1; + } + } else { + t = kDone; } break; case kSs: - return i; + t = kDone; + break; + case kNf: + if (0x30 <= c && c <= 0x7e) { + t = kDone; + } else if (!(0x20 <= c && c <= 0x2f)) { + goto Whoopsie; + } + break; + case kCsi1: + if (0x20 <= c && c <= 0x2f) { + t = kCsi2; + } else if (c == '[' && i == 3) { + /* linux function keys */ + } else if (0x40 <= c && c <= 0x7e) { + t = kDone; + } else if (!(0x30 <= c && c <= 0x3f)) { + goto Whoopsie; + } + break; + case kCsi2: + if (0x40 <= c && c <= 0x7e) { + t = kDone; + } else if (!(0x20 <= c && c <= 0x2f)) { + goto Whoopsie; + } + break; + case kStr: + switch (c) { + case '\a': + t = kDone; + break; + case '\e': /* ESC */ + case 0302: /* C1 (UTF-8) */ + t = kStr2; + break; + default: + break; + } + break; + case kStr2: + switch (c) { + case '\a': + t = kDone; + break; + case '\\': /* ST (ASCII) */ + case 0234: /* ST (UTF-8) */ + t = kDone; + break; + default: + t = kStr; + break; + } + break; default: unreachable; } - } + } while (t != kDone); + errno = e; + return i; } diff --git a/libc/runtime/ftracer.c b/libc/runtime/ftracer.c index f3c58f250..e1e0b255d 100644 --- a/libc/runtime/ftracer.c +++ b/libc/runtime/ftracer.c @@ -104,6 +104,7 @@ privileged noasan void ftracer(void) { p = mempcpy(p, symbol, symbolsize); *p++ = ' '; p += uint64toarray_radix10((stamp - laststamp) / 3.3, p); + *p++ = '\r'; *p++ = '\n'; write(2, g_buf, p - g_buf); } diff --git a/libc/stdio/getdelim.c b/libc/stdio/getdelim.c index 4667ecc13..9fc4a52a3 100644 --- a/libc/stdio/getdelim.c +++ b/libc/stdio/getdelim.c @@ -46,7 +46,7 @@ ssize_t getdelim(char **s, size_t *n, int delim, FILE *f) { f->state = errno = EBADF; return -1; } - if (f->beg > f->end || f->bufmode == _IONBF) { + if (f->beg > f->end) { f->state = errno = EINVAL; return -1; } diff --git a/libc/str/iswlower.c b/libc/str/iswlower.c index 4e7769aa9..5173701c0 100644 --- a/libc/str/iswlower.c +++ b/libc/str/iswlower.c @@ -22,2135 +22,497 @@ * Returns nonzero if c is lowercase letter. */ int iswlower(wint_t c) { - if (isascii(c)) return islower(c); - switch (c) { - case u'µ': // MICRO SIGN (0x00b5) - case u'ß': // LATIN SMALL SHARP S (0x00df) - case u'à': // LATIN SMALL A W/ GRAVE (0x00e0) - case u'á': // LATIN SMALL A W/ ACUTE (0x00e1) - case u'â': // LATIN SMALL A W/ CIRCUMFLEX (0x00e2) - case u'ã': // LATIN SMALL A W/ TILDE (0x00e3) - case u'ä': // LATIN SMALL A W/ DIAERESIS (0x00e4) - case u'å': // LATIN SMALL A W/ RING ABOVE (0x00e5) - case u'æ': // LATIN SMALL AE (0x00e6) - case u'ç': // LATIN SMALL C W/ CEDILLA (0x00e7) - case u'è': // LATIN SMALL E W/ GRAVE (0x00e8) - case u'é': // LATIN SMALL E W/ ACUTE (0x00e9) - case u'ê': // LATIN SMALL E W/ CIRCUMFLEX (0x00ea) - case u'ë': // LATIN SMALL E W/ DIAERESIS (0x00eb) - case u'ì': // LATIN SMALL I W/ GRAVE (0x00ec) - case u'í': // LATIN SMALL I W/ ACUTE (0x00ed) - case u'î': // LATIN SMALL I W/ CIRCUMFLEX (0x00ee) - case u'ï': // LATIN SMALL I W/ DIAERESIS (0x00ef) - case u'ð': // LATIN SMALL ETH (0x00f0) - case u'ñ': // LATIN SMALL N W/ TILDE (0x00f1) - case u'ò': // LATIN SMALL O W/ GRAVE (0x00f2) - case u'ó': // LATIN SMALL O W/ ACUTE (0x00f3) - case u'ô': // LATIN SMALL O W/ CIRCUMFLEX (0x00f4) - case u'õ': // LATIN SMALL O W/ TILDE (0x00f5) - case u'ö': // LATIN SMALL O W/ DIAERESIS (0x00f6) - case u'ø': // LATIN SMALL O W/ STROKE (0x00f8) - case u'ù': // LATIN SMALL U W/ GRAVE (0x00f9) - case u'ú': // LATIN SMALL U W/ ACUTE (0x00fa) - case u'û': // LATIN SMALL U W/ CIRCUMFLEX (0x00fb) - case u'ü': // LATIN SMALL U W/ DIAERESIS (0x00fc) - case u'ý': // LATIN SMALL Y W/ ACUTE (0x00fd) - case u'þ': // LATIN SMALL THORN (0x00fe) - case u'ÿ': // LATIN SMALL Y W/ DIAERESIS (0x00ff) - case u'ā': // LATIN SMALL A W/ MACRON (0x0101) - case u'ă': // LATIN SMALL A W/ BREVE (0x0103) - case u'ą': // LATIN SMALL A W/ OGONEK (0x0105) - case u'ć': // LATIN SMALL C W/ ACUTE (0x0107) - case u'ĉ': // LATIN SMALL C W/ CIRCUMFLEX (0x0109) - case u'ċ': // LATIN SMALL C W/ DOT ABOVE (0x010b) - case u'č': // LATIN SMALL C W/ CARON (0x010d) - case u'ď': // LATIN SMALL D W/ CARON (0x010f) - case u'đ': // LATIN SMALL D W/ STROKE (0x0111) - case u'ē': // LATIN SMALL E W/ MACRON (0x0113) - case u'ĕ': // LATIN SMALL E W/ BREVE (0x0115) - case u'ė': // LATIN SMALL E W/ DOT ABOVE (0x0117) - case u'ę': // LATIN SMALL E W/ OGONEK (0x0119) - case u'ě': // LATIN SMALL E W/ CARON (0x011b) - case u'ĝ': // LATIN SMALL G W/ CIRCUMFLEX (0x011d) - case u'ğ': // LATIN SMALL G W/ BREVE (0x011f) - case u'ġ': // LATIN SMALL G W/ DOT ABOVE (0x0121) - case u'ģ': // LATIN SMALL G W/ CEDILLA (0x0123) - case u'ĥ': // LATIN SMALL H W/ CIRCUMFLEX (0x0125) - case u'ħ': // LATIN SMALL H W/ STROKE (0x0127) - case u'ĩ': // LATIN SMALL I W/ TILDE (0x0129) - case u'ī': // LATIN SMALL I W/ MACRON (0x012b) - case u'ĭ': // LATIN SMALL I W/ BREVE (0x012d) - case u'į': // LATIN SMALL I W/ OGONEK (0x012f) - case u'ı': // LATIN SMALL DOTLESS I (0x0131) - case u'ij': // LATIN SMALL LIGATURE IJ (0x0133) - case u'ĵ': // LATIN SMALL J W/ CIRCUMFLEX (0x0135) - case u'ķ': // LATIN SMALL K W/ CEDILLA (0x0137) - case u'ĸ': // LATIN SMALL KRA (0x0138) - case u'ĺ': // LATIN SMALL L W/ ACUTE (0x013a) - case u'ļ': // LATIN SMALL L W/ CEDILLA (0x013c) - case u'ľ': // LATIN SMALL L W/ CARON (0x013e) - case u'ŀ': // LATIN SMALL L W/ MIDDLE DOT (0x0140) - case u'ł': // LATIN SMALL L W/ STROKE (0x0142) - case u'ń': // LATIN SMALL N W/ ACUTE (0x0144) - case u'ņ': // LATIN SMALL N W/ CEDILLA (0x0146) - case u'ň': // LATIN SMALL N W/ CARON (0x0148) - case u'ʼn': // LATIN SMALL N PRECEDED BY APOSTROPHE (0x0149) - case u'ŋ': // LATIN SMALL ENG (0x014b) - case u'ō': // LATIN SMALL O W/ MACRON (0x014d) - case u'ŏ': // LATIN SMALL O W/ BREVE (0x014f) - case u'ő': // LATIN SMALL O W/ DOUBLE ACUTE (0x0151) - case u'œ': // LATIN SMALL LIGATURE OE (0x0153) - case u'ŕ': // LATIN SMALL R W/ ACUTE (0x0155) - case u'ŗ': // LATIN SMALL R W/ CEDILLA (0x0157) - case u'ř': // LATIN SMALL R W/ CARON (0x0159) - case u'ś': // LATIN SMALL S W/ ACUTE (0x015b) - case u'ŝ': // LATIN SMALL S W/ CIRCUMFLEX (0x015d) - case u'ş': // LATIN SMALL S W/ CEDILLA (0x015f) - case u'š': // LATIN SMALL S W/ CARON (0x0161) - case u'ţ': // LATIN SMALL T W/ CEDILLA (0x0163) - case u'ť': // LATIN SMALL T W/ CARON (0x0165) - case u'ŧ': // LATIN SMALL T W/ STROKE (0x0167) - case u'ũ': // LATIN SMALL U W/ TILDE (0x0169) - case u'ū': // LATIN SMALL U W/ MACRON (0x016b) - case u'ŭ': // LATIN SMALL U W/ BREVE (0x016d) - case u'ů': // LATIN SMALL U W/ RING ABOVE (0x016f) - case u'ű': // LATIN SMALL U W/ DOUBLE ACUTE (0x0171) - case u'ų': // LATIN SMALL U W/ OGONEK (0x0173) - case u'ŵ': // LATIN SMALL W W/ CIRCUMFLEX (0x0175) - case u'ŷ': // LATIN SMALL Y W/ CIRCUMFLEX (0x0177) - case u'ź': // LATIN SMALL Z W/ ACUTE (0x017a) - case u'ż': // LATIN SMALL Z W/ DOT ABOVE (0x017c) - case u'ž': // LATIN SMALL Z W/ CARON (0x017e) - case u'ſ': // LATIN SMALL LONG S (0x017f) - case u'ƀ': // LATIN SMALL B W/ STROKE (0x0180) - case u'ƃ': // LATIN SMALL B W/ TOPBAR (0x0183) - case u'ƅ': // LATIN SMALL TONE SIX (0x0185) - case u'ƈ': // LATIN SMALL C W/ HOOK (0x0188) - case u'ƌ': // LATIN SMALL D W/ TOPBAR (0x018c) - case u'ƍ': // LATIN SMALL TURNED DELTA (0x018d) - case u'ƒ': // LATIN SMALL F W/ HOOK (0x0192) - case u'ƕ': // LATIN SMALL HV (0x0195) - case u'ƙ': // LATIN SMALL K W/ HOOK (0x0199) - case u'ƚ': // LATIN SMALL L W/ BAR (0x019a) - case u'ƛ': // LATIN SMALL LAMBDA W/ STROKE (0x019b) - case u'ƞ': // LATIN SMALL N W/ LONG RIGHT LEG (0x019e) - case u'ơ': // LATIN SMALL O W/ HORN (0x01a1) - case u'ƣ': // LATIN SMALL OI (0x01a3) - case u'ƥ': // LATIN SMALL P W/ HOOK (0x01a5) - case u'ƨ': // LATIN SMALL TONE TWO (0x01a8) - case u'ƪ': // LATIN LETTER REVERSED ESH LOOP (0x01aa) - case u'ƫ': // LATIN SMALL T W/ PALATAL HOOK (0x01ab) - case u'ƭ': // LATIN SMALL T W/ HOOK (0x01ad) - case u'ư': // LATIN SMALL U W/ HORN (0x01b0) - case u'ƴ': // LATIN SMALL Y W/ HOOK (0x01b4) - case u'ƶ': // LATIN SMALL Z W/ STROKE (0x01b6) - case u'ƹ': // LATIN SMALL EZH REVERSED (0x01b9) - case u'ƺ': // LATIN SMALL EZH W/ TAIL (0x01ba) - case u'ƽ': // LATIN SMALL TONE FIVE (0x01bd) - case u'ƾ': // LATIN LETTER INVERTED GLOTTAL STOP W/ STROKE (0x01be) - case u'ƿ': // LATIN LETTER WYNN (0x01bf) - case u'dž': // LATIN SMALL DZ W/ CARON (0x01c6) - case u'lj': // LATIN SMALL LJ (0x01c9) - case u'nj': // LATIN SMALL NJ (0x01cc) - case u'ǎ': // LATIN SMALL A W/ CARON (0x01ce) - case u'ǐ': // LATIN SMALL I W/ CARON (0x01d0) - case u'ǒ': // LATIN SMALL O W/ CARON (0x01d2) - case u'ǔ': // LATIN SMALL U W/ CARON (0x01d4) - case u'ǖ': // LATIN SMALL U W/ DIAERESIS AND MACRON (0x01d6) - case u'ǘ': // LATIN SMALL U W/ DIAERESIS AND ACUTE (0x01d8) - case u'ǚ': // LATIN SMALL U W/ DIAERESIS AND CARON (0x01da) - case u'ǜ': // LATIN SMALL U W/ DIAERESIS AND GRAVE (0x01dc) - case u'ǝ': // LATIN SMALL TURNED E (0x01dd) - case u'ǟ': // LATIN SMALL A W/ DIAERESIS AND MACRON (0x01df) - case u'ǡ': // LATIN SMALL A W/ DOT ABOVE AND MACRON (0x01e1) - case u'ǣ': // LATIN SMALL AE W/ MACRON (0x01e3) - case u'ǥ': // LATIN SMALL G W/ STROKE (0x01e5) - case u'ǧ': // LATIN SMALL G W/ CARON (0x01e7) - case u'ǩ': // LATIN SMALL K W/ CARON (0x01e9) - case u'ǫ': // LATIN SMALL O W/ OGONEK (0x01eb) - case u'ǭ': // LATIN SMALL O W/ OGONEK AND MACRON (0x01ed) - case u'ǯ': // LATIN SMALL EZH W/ CARON (0x01ef) - case u'ǰ': // LATIN SMALL J W/ CARON (0x01f0) - case u'dz': // LATIN SMALL DZ (0x01f3) - case u'ǵ': // LATIN SMALL G W/ ACUTE (0x01f5) - case u'ǹ': // LATIN SMALL N W/ GRAVE (0x01f9) - case u'ǻ': // LATIN SMALL A W/ RING ABOVE AND ACUTE (0x01fb) - case u'ǽ': // LATIN SMALL AE W/ ACUTE (0x01fd) - case u'ǿ': // LATIN SMALL O W/ STROKE AND ACUTE (0x01ff) - case u'ȁ': // LATIN SMALL A W/ DOUBLE GRAVE (0x0201) - case u'ȃ': // LATIN SMALL A W/ INVERTED BREVE (0x0203) - case u'ȅ': // LATIN SMALL E W/ DOUBLE GRAVE (0x0205) - case u'ȇ': // LATIN SMALL E W/ INVERTED BREVE (0x0207) - case u'ȉ': // LATIN SMALL I W/ DOUBLE GRAVE (0x0209) - case u'ȋ': // LATIN SMALL I W/ INVERTED BREVE (0x020b) - case u'ȍ': // LATIN SMALL O W/ DOUBLE GRAVE (0x020d) - case u'ȏ': // LATIN SMALL O W/ INVERTED BREVE (0x020f) - case u'ȑ': // LATIN SMALL R W/ DOUBLE GRAVE (0x0211) - case u'ȓ': // LATIN SMALL R W/ INVERTED BREVE (0x0213) - case u'ȕ': // LATIN SMALL U W/ DOUBLE GRAVE (0x0215) - case u'ȗ': // LATIN SMALL U W/ INVERTED BREVE (0x0217) - case u'ș': // LATIN SMALL S W/ COMMA BELOW (0x0219) - case u'ț': // LATIN SMALL T W/ COMMA BELOW (0x021b) - case u'ȝ': // LATIN SMALL YOGH (0x021d) - case u'ȟ': // LATIN SMALL H W/ CARON (0x021f) - case u'ȡ': // LATIN SMALL D W/ CURL (0x0221) - case u'ȣ': // LATIN SMALL OU (0x0223) - case u'ȥ': // LATIN SMALL Z W/ HOOK (0x0225) - case u'ȧ': // LATIN SMALL A W/ DOT ABOVE (0x0227) - case u'ȩ': // LATIN SMALL E W/ CEDILLA (0x0229) - case u'ȫ': // LATIN SMALL O W/ DIAERESIS AND MACRON (0x022b) - case u'ȭ': // LATIN SMALL O W/ TILDE AND MACRON (0x022d) - case u'ȯ': // LATIN SMALL O W/ DOT ABOVE (0x022f) - case u'ȱ': // LATIN SMALL O W/ DOT ABOVE AND MACRON (0x0231) - case u'ȳ': // LATIN SMALL Y W/ MACRON (0x0233) - case u'ȴ': // LATIN SMALL L W/ CURL (0x0234) - case u'ȵ': // LATIN SMALL N W/ CURL (0x0235) - case u'ȶ': // LATIN SMALL T W/ CURL (0x0236) - case u'ȷ': // LATIN SMALL DOTLESS J (0x0237) - case u'ȸ': // LATIN SMALL DB DIGRAPH (0x0238) - case u'ȹ': // LATIN SMALL QP DIGRAPH (0x0239) - case u'ȼ': // LATIN SMALL C W/ STROKE (0x023c) - case u'ȿ': // LATIN SMALL S W/ SWASH TAIL (0x023f) - case u'ɀ': // LATIN SMALL Z W/ SWASH TAIL (0x0240) - case u'ɂ': // LATIN SMALL GLOTTAL STOP (0x0242) - case u'ɇ': // LATIN SMALL E W/ STROKE (0x0247) - case u'ɉ': // LATIN SMALL J W/ STROKE (0x0249) - case u'ɋ': // LATIN SMALL Q W/ HOOK TAIL (0x024b) - case u'ɍ': // LATIN SMALL R W/ STROKE (0x024d) - case u'ɏ': // LATIN SMALL Y W/ STROKE (0x024f) - case u'ɐ': // LATIN SMALL TURNED A (0x0250) - case u'ɑ': // LATIN SMALL ALPHA (0x0251) - case u'ɒ': // LATIN SMALL TURNED ALPHA (0x0252) - case u'ɓ': // LATIN SMALL B W/ HOOK (0x0253) - case u'ɔ': // LATIN SMALL OPEN O (0x0254) - case u'ɕ': // LATIN SMALL C W/ CURL (0x0255) - case u'ɖ': // LATIN SMALL D W/ TAIL (0x0256) - case u'ɗ': // LATIN SMALL D W/ HOOK (0x0257) - case u'ɘ': // LATIN SMALL REVERSED E (0x0258) - case u'ə': // LATIN SMALL SCHWA (0x0259) - case u'ɚ': // LATIN SMALL SCHWA W/ HOOK (0x025a) - case u'ɛ': // LATIN SMALL OPEN E (0x025b) - case u'ɜ': // LATIN SMALL REVERSED OPEN E (0x025c) - case u'ɝ': // LATIN SMALL REVERSED OPEN E W/ HOOK (0x025d) - case u'ɞ': // LATIN SMALL CLOSED REVERSED OPEN E (0x025e) - case u'ɟ': // LATIN SMALL DOTLESS J W/ STROKE (0x025f) - case u'ɠ': // LATIN SMALL G W/ HOOK (0x0260) - case u'ɡ': // LATIN SMALL SCRIPT G (0x0261) - case u'ɢ': // LATIN LETTER SMALL CAPITAL G (0x0262) - case u'ɣ': // LATIN SMALL GAMMA (0x0263) - case u'ɤ': // LATIN SMALL RAMS HORN (0x0264) - case u'ɥ': // LATIN SMALL TURNED H (0x0265) - case u'ɦ': // LATIN SMALL H W/ HOOK (0x0266) - case u'ɧ': // LATIN SMALL HENG W/ HOOK (0x0267) - case u'ɨ': // LATIN SMALL I W/ STROKE (0x0268) - case u'ɩ': // LATIN SMALL IOTA (0x0269) - case u'ɪ': // LATIN LETTER SMALL CAPITAL I (0x026a) - case u'ɫ': // LATIN SMALL L W/ MIDDLE TILDE (0x026b) - case u'ɬ': // LATIN SMALL L W/ BELT (0x026c) - case u'ɭ': // LATIN SMALL L W/ RETROFLEX HOOK (0x026d) - case u'ɮ': // LATIN SMALL LEZH (0x026e) - case u'ɯ': // LATIN SMALL TURNED M (0x026f) - case u'ɰ': // LATIN SMALL TURNED M W/ LONG LEG (0x0270) - case u'ɱ': // LATIN SMALL M W/ HOOK (0x0271) - case u'ɲ': // LATIN SMALL N W/ LEFT HOOK (0x0272) - case u'ɳ': // LATIN SMALL N W/ RETROFLEX HOOK (0x0273) - case u'ɴ': // LATIN LETTER SMALL CAPITAL N (0x0274) - case u'ɵ': // LATIN SMALL BARRED O (0x0275) - case u'ɶ': // LATIN LETTER SMALL CAPITAL OE (0x0276) - case u'ɷ': // LATIN SMALL CLOSED OMEGA (0x0277) - case u'ɸ': // LATIN SMALL PHI (0x0278) - case u'ɹ': // LATIN SMALL TURNED R (0x0279) - case u'ɺ': // LATIN SMALL TURNED R W/ LONG LEG (0x027a) - case u'ɻ': // LATIN SMALL TURNED R W/ HOOK (0x027b) - case u'ɼ': // LATIN SMALL R W/ LONG LEG (0x027c) - case u'ɽ': // LATIN SMALL R W/ TAIL (0x027d) - case u'ɾ': // LATIN SMALL R W/ FISHHOOK (0x027e) - case u'ɿ': // LATIN SMALL REVERSED R W/ FISHHOOK (0x027f) - case u'ʀ': // LATIN LETTER SMALL CAPITAL R (0x0280) - case u'ʁ': // LATIN LETTER SMALL CAPITAL INVERTED R (0x0281) - case u'ʂ': // LATIN SMALL S W/ HOOK (0x0282) - case u'ʃ': // LATIN SMALL ESH (0x0283) - case u'ʄ': // LATIN SMALL DOTLESS J W/ STROKE AND HOOK (0x0284) - case u'ʅ': // LATIN SMALL SQUAT REVERSED ESH (0x0285) - case u'ʆ': // LATIN SMALL ESH W/ CURL (0x0286) - case u'ʇ': // LATIN SMALL TURNED T (0x0287) - case u'ʈ': // LATIN SMALL T W/ RETROFLEX HOOK (0x0288) - case u'ʉ': // LATIN SMALL U BAR (0x0289) - case u'ʊ': // LATIN SMALL UPSILON (0x028a) - case u'ʋ': // LATIN SMALL V W/ HOOK (0x028b) - case u'ʌ': // LATIN SMALL TURNED V (0x028c) - case u'ʍ': // LATIN SMALL TURNED W (0x028d) - case u'ʎ': // LATIN SMALL TURNED Y (0x028e) - case u'ʏ': // LATIN LETTER SMALL CAPITAL Y (0x028f) - case u'ʐ': // LATIN SMALL Z W/ RETROFLEX HOOK (0x0290) - case u'ʑ': // LATIN SMALL Z W/ CURL (0x0291) - case u'ʒ': // LATIN SMALL EZH (0x0292) - case u'ʓ': // LATIN SMALL EZH W/ CURL (0x0293) - case u'ʕ': // LATIN LETTER PHARYNGEAL VOICED FRICATIVE (0x0295) - case u'ʖ': // LATIN LETTER INVERTED GLOTTAL STOP (0x0296) - case u'ʗ': // LATIN LETTER STRETCHED C (0x0297) - case u'ʘ': // LATIN LETTER BILABIAL CLICK (0x0298) - case u'ʙ': // LATIN LETTER SMALL CAPITAL B (0x0299) - case u'ʚ': // LATIN SMALL CLOSED OPEN E (0x029a) - case u'ʛ': // LATIN LETTER SMALL CAPITAL G W/ HOOK (0x029b) - case u'ʜ': // LATIN LETTER SMALL CAPITAL H (0x029c) - case u'ʝ': // LATIN SMALL J W/ CROSSED-TAIL (0x029d) - case u'ʞ': // LATIN SMALL TURNED K (0x029e) - case u'ʟ': // LATIN LETTER SMALL CAPITAL L (0x029f) - case u'ʠ': // LATIN SMALL Q W/ HOOK (0x02a0) - case u'ʡ': // LATIN LETTER GLOTTAL STOP W/ STROKE (0x02a1) - case u'ʢ': // LATIN LETTER REVERSED GLOTTAL STOP W/ STROKE (0x02a2) - case u'ʣ': // LATIN SMALL DZ DIGRAPH (0x02a3) - case u'ʤ': // LATIN SMALL DEZH DIGRAPH (0x02a4) - case u'ʥ': // LATIN SMALL DZ DIGRAPH W/ CURL (0x02a5) - case u'ʦ': // LATIN SMALL TS DIGRAPH (0x02a6) - case u'ʧ': // LATIN SMALL TESH DIGRAPH (0x02a7) - case u'ʨ': // LATIN SMALL TC DIGRAPH W/ CURL (0x02a8) - case u'ʩ': // LATIN SMALL FENG DIGRAPH (0x02a9) - case u'ʪ': // LATIN SMALL LS DIGRAPH (0x02aa) - case u'ʫ': // LATIN SMALL LZ DIGRAPH (0x02ab) - case u'ʬ': // LATIN LETTER BILABIAL PERCUSSIVE (0x02ac) - case u'ʭ': // LATIN LETTER BIDENTAL PERCUSSIVE (0x02ad) - case u'ʮ': // LATIN SMALL TURNED H W/ FISHHOOK (0x02ae) - case u'ʯ': // LATIN SMALL TURNED H W/ FISHHOOK AND TAIL (0x02af) - case u'ͱ': // GREEK SMALL HETA (0x0371) - case u'ͳ': // GREEK SMALL ARCHAIC SAMPI (0x0373) - case u'ͷ': // GREEK SMALL PAMPHYLIAN DIGAMMA (0x0377) - case u'ͻ': // GREEK SMALL REVERSED LUNATE SIGMA SYMBOL (0x037b) - case u'ͼ': // GREEK SMALL DOTTED LUNATE SIGMA SYMBOL (0x037c) - case u'ͽ': // GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL (0x037d) - case u'ΐ': // GREEK SMALL IOTA W/ DIALYTIKA AND TONOS (0x0390) - case u'ά': // GREEK SMALL ALPHA W/ TONOS (0x03ac) - case u'έ': // GREEK SMALL EPSILON W/ TONOS (0x03ad) - case u'ή': // GREEK SMALL ETA W/ TONOS (0x03ae) - case u'ί': // GREEK SMALL IOTA W/ TONOS (0x03af) - case u'ΰ': // GREEK SMALL UPSILON W/ DIALYTIKA AND TONOS (0x03b0) - case u'α': // GREEK SMALL ALPHA (0x03b1) - case u'β': // GREEK SMALL BETA (0x03b2) - case u'γ': // GREEK SMALL GAMMA (0x03b3) - case u'δ': // GREEK SMALL DELTA (0x03b4) - case u'ε': // GREEK SMALL EPSILON (0x03b5) - case u'ζ': // GREEK SMALL ZETA (0x03b6) - case u'η': // GREEK SMALL ETA (0x03b7) - case u'θ': // GREEK SMALL THETA (0x03b8) - case u'ι': // GREEK SMALL IOTA (0x03b9) - case u'κ': // GREEK SMALL KAPPA (0x03ba) - case u'λ': // GREEK SMALL LAMDA (0x03bb) - case u'μ': // GREEK SMALL MU (0x03bc) - case u'ν': // GREEK SMALL NU (0x03bd) - case u'ξ': // GREEK SMALL XI (0x03be) - case u'ο': // GREEK SMALL OMICRON (0x03bf) - case u'π': // GREEK SMALL PI (0x03c0) - case u'ρ': // GREEK SMALL RHO (0x03c1) - case u'ς': // GREEK SMALL FINAL SIGMA (0x03c2) - case u'σ': // GREEK SMALL SIGMA (0x03c3) - case u'τ': // GREEK SMALL TAU (0x03c4) - case u'υ': // GREEK SMALL UPSILON (0x03c5) - case u'φ': // GREEK SMALL PHI (0x03c6) - case u'χ': // GREEK SMALL CHI (0x03c7) - case u'ψ': // GREEK SMALL PSI (0x03c8) - case u'ω': // GREEK SMALL OMEGA (0x03c9) - case u'ϊ': // GREEK SMALL IOTA W/ DIALYTIKA (0x03ca) - case u'ϋ': // GREEK SMALL UPSILON W/ DIALYTIKA (0x03cb) - case u'ό': // GREEK SMALL OMICRON W/ TONOS (0x03cc) - case u'ύ': // GREEK SMALL UPSILON W/ TONOS (0x03cd) - case u'ώ': // GREEK SMALL OMEGA W/ TONOS (0x03ce) - case u'ϐ': // GREEK BETA SYMBOL (0x03d0) - case u'ϑ': // GREEK THETA SYMBOL (0x03d1) - case u'ϕ': // GREEK PHI SYMBOL (0x03d5) - case u'ϖ': // GREEK PI SYMBOL (0x03d6) - case u'ϗ': // GREEK KAI SYMBOL (0x03d7) - case u'ϙ': // GREEK SMALL ARCHAIC KOPPA (0x03d9) - case u'ϛ': // GREEK SMALL STIGMA (0x03db) - case u'ϝ': // GREEK SMALL DIGAMMA (0x03dd) - case u'ϟ': // GREEK SMALL KOPPA (0x03df) - case u'ϡ': // GREEK SMALL SAMPI (0x03e1) - case u'ϣ': // COPTIC SMALL SHEI (0x03e3) - case u'ϥ': // COPTIC SMALL FEI (0x03e5) - case u'ϧ': // COPTIC SMALL KHEI (0x03e7) - case u'ϩ': // COPTIC SMALL HORI (0x03e9) - case u'ϫ': // COPTIC SMALL GANGIA (0x03eb) - case u'ϭ': // COPTIC SMALL SHIMA (0x03ed) - case u'ϯ': // COPTIC SMALL DEI (0x03ef) - case u'ϰ': // GREEK KAPPA SYMBOL (0x03f0) - case u'ϱ': // GREEK RHO SYMBOL (0x03f1) - case u'ϲ': // GREEK LUNATE SIGMA SYMBOL (0x03f2) - case u'ϳ': // GREEK LETTER YOT (0x03f3) - case u'ϵ': // GREEK LUNATE EPSILON SYMBOL (0x03f5) - case u'ϸ': // GREEK SMALL SHO (0x03f8) - case u'ϻ': // GREEK SMALL SAN (0x03fb) - case u'ϼ': // GREEK RHO W/ STROKE SYMBOL (0x03fc) - case u'а': // CYRILLIC SMALL A (0x0430) - case u'б': // CYRILLIC SMALL BE (0x0431) - case u'в': // CYRILLIC SMALL VE (0x0432) - case u'г': // CYRILLIC SMALL GHE (0x0433) - case u'д': // CYRILLIC SMALL DE (0x0434) - case u'е': // CYRILLIC SMALL IE (0x0435) - case u'ж': // CYRILLIC SMALL ZHE (0x0436) - case u'з': // CYRILLIC SMALL ZE (0x0437) - case u'и': // CYRILLIC SMALL I (0x0438) - case u'й': // CYRILLIC SMALL SHORT I (0x0439) - case u'к': // CYRILLIC SMALL KA (0x043a) - case u'л': // CYRILLIC SMALL EL (0x043b) - case u'м': // CYRILLIC SMALL EM (0x043c) - case u'н': // CYRILLIC SMALL EN (0x043d) - case u'о': // CYRILLIC SMALL O (0x043e) - case u'п': // CYRILLIC SMALL PE (0x043f) - case u'р': // CYRILLIC SMALL ER (0x0440) - case u'с': // CYRILLIC SMALL ES (0x0441) - case u'т': // CYRILLIC SMALL TE (0x0442) - case u'у': // CYRILLIC SMALL U (0x0443) - case u'ф': // CYRILLIC SMALL EF (0x0444) - case u'х': // CYRILLIC SMALL HA (0x0445) - case u'ц': // CYRILLIC SMALL TSE (0x0446) - case u'ч': // CYRILLIC SMALL CHE (0x0447) - case u'ш': // CYRILLIC SMALL SHA (0x0448) - case u'щ': // CYRILLIC SMALL SHCHA (0x0449) - case u'ъ': // CYRILLIC SMALL HARD SIGN (0x044a) - case u'ы': // CYRILLIC SMALL YERU (0x044b) - case u'ь': // CYRILLIC SMALL SOFT SIGN (0x044c) - case u'э': // CYRILLIC SMALL E (0x044d) - case u'ю': // CYRILLIC SMALL YU (0x044e) - case u'я': // CYRILLIC SMALL YA (0x044f) - case u'ѐ': // CYRILLIC SMALL IE W/ GRAVE (0x0450) - case u'ё': // CYRILLIC SMALL IO (0x0451) - case u'ђ': // CYRILLIC SMALL DJE (0x0452) - case u'ѓ': // CYRILLIC SMALL GJE (0x0453) - case u'є': // CYRILLIC SMALL UKRAINIAN IE (0x0454) - case u'ѕ': // CYRILLIC SMALL DZE (0x0455) - case u'і': // CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I (0x0456) - case u'ї': // CYRILLIC SMALL YI (0x0457) - case u'ј': // CYRILLIC SMALL JE (0x0458) - case u'љ': // CYRILLIC SMALL LJE (0x0459) - case u'њ': // CYRILLIC SMALL NJE (0x045a) - case u'ћ': // CYRILLIC SMALL TSHE (0x045b) - case u'ќ': // CYRILLIC SMALL KJE (0x045c) - case u'ѝ': // CYRILLIC SMALL I W/ GRAVE (0x045d) - case u'ў': // CYRILLIC SMALL SHORT U (0x045e) - case u'џ': // CYRILLIC SMALL DZHE (0x045f) - case u'ѡ': // CYRILLIC SMALL OMEGA (0x0461) - case u'ѣ': // CYRILLIC SMALL YAT (0x0463) - case u'ѥ': // CYRILLIC SMALL IOTIFIED E (0x0465) - case u'ѧ': // CYRILLIC SMALL LITTLE YUS (0x0467) - case u'ѩ': // CYRILLIC SMALL IOTIFIED LITTLE YUS (0x0469) - case u'ѫ': // CYRILLIC SMALL BIG YUS (0x046b) - case u'ѭ': // CYRILLIC SMALL IOTIFIED BIG YUS (0x046d) - case u'ѯ': // CYRILLIC SMALL KSI (0x046f) - case u'ѱ': // CYRILLIC SMALL PSI (0x0471) - case u'ѳ': // CYRILLIC SMALL FITA (0x0473) - case u'ѵ': // CYRILLIC SMALL IZHITSA (0x0475) - case u'ѷ': // CYRILLIC SMALL IZHITSA W/ DOUBLE GRAVE ACCENT (0x0477) - case u'ѹ': // CYRILLIC SMALL UK (0x0479) - case u'ѻ': // CYRILLIC SMALL ROUND OMEGA (0x047b) - case u'ѽ': // CYRILLIC SMALL OMEGA W/ TITLO (0x047d) - case u'ѿ': // CYRILLIC SMALL OT (0x047f) - case u'ҁ': // CYRILLIC SMALL KOPPA (0x0481) - case u'ҋ': // CYRILLIC SMALL SHORT I W/ TAIL (0x048b) - case u'ҍ': // CYRILLIC SMALL SEMISOFT SIGN (0x048d) - case u'ҏ': // CYRILLIC SMALL ER W/ TICK (0x048f) - case u'ґ': // CYRILLIC SMALL GHE W/ UPTURN (0x0491) - case u'ғ': // CYRILLIC SMALL GHE W/ STROKE (0x0493) - case u'ҕ': // CYRILLIC SMALL GHE W/ MIDDLE HOOK (0x0495) - case u'җ': // CYRILLIC SMALL ZHE W/ DESCENDER (0x0497) - case u'ҙ': // CYRILLIC SMALL ZE W/ DESCENDER (0x0499) - case u'қ': // CYRILLIC SMALL KA W/ DESCENDER (0x049b) - case u'ҝ': // CYRILLIC SMALL KA W/ VERTICAL STROKE (0x049d) - case u'ҟ': // CYRILLIC SMALL KA W/ STROKE (0x049f) - case u'ҡ': // CYRILLIC SMALL BASHKIR KA (0x04a1) - case u'ң': // CYRILLIC SMALL EN W/ DESCENDER (0x04a3) - case u'ҥ': // CYRILLIC SMALL LIGATURE EN GHE (0x04a5) - case u'ҧ': // CYRILLIC SMALL PE W/ MIDDLE HOOK (0x04a7) - case u'ҩ': // CYRILLIC SMALL ABKHASIAN HA (0x04a9) - case u'ҫ': // CYRILLIC SMALL ES W/ DESCENDER (0x04ab) - case u'ҭ': // CYRILLIC SMALL TE W/ DESCENDER (0x04ad) - case u'ү': // CYRILLIC SMALL STRAIGHT U (0x04af) - case u'ұ': // CYRILLIC SMALL STRAIGHT U W/ STROKE (0x04b1) - case u'ҳ': // CYRILLIC SMALL HA W/ DESCENDER (0x04b3) - case u'ҵ': // CYRILLIC SMALL LIGATURE TE TSE (0x04b5) - case u'ҷ': // CYRILLIC SMALL CHE W/ DESCENDER (0x04b7) - case u'ҹ': // CYRILLIC SMALL CHE W/ VERTICAL STROKE (0x04b9) - case u'һ': // CYRILLIC SMALL SHHA (0x04bb) - case u'ҽ': // CYRILLIC SMALL ABKHASIAN CHE (0x04bd) - case u'ҿ': // CYRILLIC SMALL ABKHASIAN CHE W/ DESCENDER (0x04bf) - case u'ӂ': // CYRILLIC SMALL ZHE W/ BREVE (0x04c2) - case u'ӄ': // CYRILLIC SMALL KA W/ HOOK (0x04c4) - case u'ӆ': // CYRILLIC SMALL EL W/ TAIL (0x04c6) - case u'ӈ': // CYRILLIC SMALL EN W/ HOOK (0x04c8) - case u'ӊ': // CYRILLIC SMALL EN W/ TAIL (0x04ca) - case u'ӌ': // CYRILLIC SMALL KHAKASSIAN CHE (0x04cc) - case u'ӎ': // CYRILLIC SMALL EM W/ TAIL (0x04ce) - case u'ӏ': // CYRILLIC SMALL PALOCHKA (0x04cf) - case u'ӑ': // CYRILLIC SMALL A W/ BREVE (0x04d1) - case u'ӓ': // CYRILLIC SMALL A W/ DIAERESIS (0x04d3) - case u'ӕ': // CYRILLIC SMALL LIGATURE A IE (0x04d5) - case u'ӗ': // CYRILLIC SMALL IE W/ BREVE (0x04d7) - case u'ә': // CYRILLIC SMALL SCHWA (0x04d9) - case u'ӛ': // CYRILLIC SMALL SCHWA W/ DIAERESIS (0x04db) - case u'ӝ': // CYRILLIC SMALL ZHE W/ DIAERESIS (0x04dd) - case u'ӟ': // CYRILLIC SMALL ZE W/ DIAERESIS (0x04df) - case u'ӡ': // CYRILLIC SMALL ABKHASIAN DZE (0x04e1) - case u'ӣ': // CYRILLIC SMALL I W/ MACRON (0x04e3) - case u'ӥ': // CYRILLIC SMALL I W/ DIAERESIS (0x04e5) - case u'ӧ': // CYRILLIC SMALL O W/ DIAERESIS (0x04e7) - case u'ө': // CYRILLIC SMALL BARRED O (0x04e9) - case u'ӫ': // CYRILLIC SMALL BARRED O W/ DIAERESIS (0x04eb) - case u'ӭ': // CYRILLIC SMALL E W/ DIAERESIS (0x04ed) - case u'ӯ': // CYRILLIC SMALL U W/ MACRON (0x04ef) - case u'ӱ': // CYRILLIC SMALL U W/ DIAERESIS (0x04f1) - case u'ӳ': // CYRILLIC SMALL U W/ DOUBLE ACUTE (0x04f3) - case u'ӵ': // CYRILLIC SMALL CHE W/ DIAERESIS (0x04f5) - case u'ӷ': // CYRILLIC SMALL GHE W/ DESCENDER (0x04f7) - case u'ӹ': // CYRILLIC SMALL YERU W/ DIAERESIS (0x04f9) - case u'ӻ': // CYRILLIC SMALL GHE W/ STROKE AND HOOK (0x04fb) - case u'ӽ': // CYRILLIC SMALL HA W/ HOOK (0x04fd) - case u'ӿ': // CYRILLIC SMALL HA W/ STROKE (0x04ff) - case u'ԁ': // CYRILLIC SMALL KOMI DE (0x0501) - case u'ԃ': // CYRILLIC SMALL KOMI DJE (0x0503) - case u'ԅ': // CYRILLIC SMALL KOMI ZJE (0x0505) - case u'ԇ': // CYRILLIC SMALL KOMI DZJE (0x0507) - case u'ԉ': // CYRILLIC SMALL KOMI LJE (0x0509) - case u'ԋ': // CYRILLIC SMALL KOMI NJE (0x050b) - case u'ԍ': // CYRILLIC SMALL KOMI SJE (0x050d) - case u'ԏ': // CYRILLIC SMALL KOMI TJE (0x050f) - case u'ԑ': // CYRILLIC SMALL REVERSED ZE (0x0511) - case u'ԓ': // CYRILLIC SMALL EL W/ HOOK (0x0513) - case u'ԕ': // CYRILLIC SMALL LHA (0x0515) - case u'ԗ': // CYRILLIC SMALL RHA (0x0517) - case u'ԙ': // CYRILLIC SMALL YAE (0x0519) - case u'ԛ': // CYRILLIC SMALL QA (0x051b) - case u'ԝ': // CYRILLIC SMALL WE (0x051d) - case u'ԟ': // CYRILLIC SMALL ALEUT KA (0x051f) - case u'ԡ': // CYRILLIC SMALL EL W/ MIDDLE HOOK (0x0521) - case u'ԣ': // CYRILLIC SMALL EN W/ MIDDLE HOOK (0x0523) - case u'ԥ': // CYRILLIC SMALL PE W/ DESCENDER (0x0525) - case u'ԧ': // CYRILLIC SMALL SHHA W/ DESCENDER (0x0527) - case u'ԩ': // CYRILLIC SMALL EN W/ LEFT HOOK (0x0529) - case u'ԫ': // CYRILLIC SMALL DZZHE (0x052b) - case u'ԭ': // CYRILLIC SMALL DCHE (0x052d) - case u'ԯ': // CYRILLIC SMALL EL W/ DESCENDER (0x052f) - case u'ՠ': // ARMENIAN SMALL TURNED AYB (0x0560) - case u'ա': // ARMENIAN SMALL AYB (0x0561) - case u'բ': // ARMENIAN SMALL BEN (0x0562) - case u'գ': // ARMENIAN SMALL GIM (0x0563) - case u'դ': // ARMENIAN SMALL DA (0x0564) - case u'ե': // ARMENIAN SMALL ECH (0x0565) - case u'զ': // ARMENIAN SMALL ZA (0x0566) - case u'է': // ARMENIAN SMALL EH (0x0567) - case u'ը': // ARMENIAN SMALL ET (0x0568) - case u'թ': // ARMENIAN SMALL TO (0x0569) - case u'ժ': // ARMENIAN SMALL ZHE (0x056a) - case u'ի': // ARMENIAN SMALL INI (0x056b) - case u'լ': // ARMENIAN SMALL LIWN (0x056c) - case u'խ': // ARMENIAN SMALL XEH (0x056d) - case u'ծ': // ARMENIAN SMALL CA (0x056e) - case u'կ': // ARMENIAN SMALL KEN (0x056f) - case u'հ': // ARMENIAN SMALL HO (0x0570) - case u'ձ': // ARMENIAN SMALL JA (0x0571) - case u'ղ': // ARMENIAN SMALL GHAD (0x0572) - case u'ճ': // ARMENIAN SMALL CHEH (0x0573) - case u'մ': // ARMENIAN SMALL MEN (0x0574) - case u'յ': // ARMENIAN SMALL YI (0x0575) - case u'ն': // ARMENIAN SMALL NOW (0x0576) - case u'շ': // ARMENIAN SMALL SHA (0x0577) - case u'ո': // ARMENIAN SMALL VO (0x0578) - case u'չ': // ARMENIAN SMALL CHA (0x0579) - case u'պ': // ARMENIAN SMALL PEH (0x057a) - case u'ջ': // ARMENIAN SMALL JHEH (0x057b) - case u'ռ': // ARMENIAN SMALL RA (0x057c) - case u'ս': // ARMENIAN SMALL SEH (0x057d) - case u'վ': // ARMENIAN SMALL VEW (0x057e) - case u'տ': // ARMENIAN SMALL TIWN (0x057f) - case u'ր': // ARMENIAN SMALL REH (0x0580) - case u'ց': // ARMENIAN SMALL CO (0x0581) - case u'ւ': // ARMENIAN SMALL YIWN (0x0582) - case u'փ': // ARMENIAN SMALL PIWR (0x0583) - case u'ք': // ARMENIAN SMALL KEH (0x0584) - case u'օ': // ARMENIAN SMALL OH (0x0585) - case u'ֆ': // ARMENIAN SMALL FEH (0x0586) - case u'և': // ARMENIAN SMALL LIGATURE ECH YIWN (0x0587) - case u'ֈ': // ARMENIAN SMALL YI W/ STROKE (0x0588) - case u'ა': // GEORGIAN LETTER AN (0x10d0) - case u'ბ': // GEORGIAN LETTER BAN (0x10d1) - case u'გ': // GEORGIAN LETTER GAN (0x10d2) - case u'დ': // GEORGIAN LETTER DON (0x10d3) - case u'ე': // GEORGIAN LETTER EN (0x10d4) - case u'ვ': // GEORGIAN LETTER VIN (0x10d5) - case u'ზ': // GEORGIAN LETTER ZEN (0x10d6) - case u'თ': // GEORGIAN LETTER TAN (0x10d7) - case u'ი': // GEORGIAN LETTER IN (0x10d8) - case u'კ': // GEORGIAN LETTER KAN (0x10d9) - case u'ლ': // GEORGIAN LETTER LAS (0x10da) - case u'მ': // GEORGIAN LETTER MAN (0x10db) - case u'ნ': // GEORGIAN LETTER NAR (0x10dc) - case u'ო': // GEORGIAN LETTER ON (0x10dd) - case u'პ': // GEORGIAN LETTER PAR (0x10de) - case u'ჟ': // GEORGIAN LETTER ZHAR (0x10df) - case u'რ': // GEORGIAN LETTER RAE (0x10e0) - case u'ს': // GEORGIAN LETTER SAN (0x10e1) - case u'ტ': // GEORGIAN LETTER TAR (0x10e2) - case u'უ': // GEORGIAN LETTER UN (0x10e3) - case u'ფ': // GEORGIAN LETTER PHAR (0x10e4) - case u'ქ': // GEORGIAN LETTER KHAR (0x10e5) - case u'ღ': // GEORGIAN LETTER GHAN (0x10e6) - case u'ყ': // GEORGIAN LETTER QAR (0x10e7) - case u'შ': // GEORGIAN LETTER SHIN (0x10e8) - case u'ჩ': // GEORGIAN LETTER CHIN (0x10e9) - case u'ც': // GEORGIAN LETTER CAN (0x10ea) - case u'ძ': // GEORGIAN LETTER JIL (0x10eb) - case u'წ': // GEORGIAN LETTER CIL (0x10ec) - case u'ჭ': // GEORGIAN LETTER CHAR (0x10ed) - case u'ხ': // GEORGIAN LETTER XAN (0x10ee) - case u'ჯ': // GEORGIAN LETTER JHAN (0x10ef) - case u'ჰ': // GEORGIAN LETTER HAE (0x10f0) - case u'ჱ': // GEORGIAN LETTER HE (0x10f1) - case u'ჲ': // GEORGIAN LETTER HIE (0x10f2) - case u'ჳ': // GEORGIAN LETTER WE (0x10f3) - case u'ჴ': // GEORGIAN LETTER HAR (0x10f4) - case u'ჵ': // GEORGIAN LETTER HOE (0x10f5) - case u'ჶ': // GEORGIAN LETTER FI (0x10f6) - case u'ჷ': // GEORGIAN LETTER YN (0x10f7) - case u'ჸ': // GEORGIAN LETTER ELIFI (0x10f8) - case u'ჹ': // GEORGIAN LETTER TURNED GAN (0x10f9) - case u'ჺ': // GEORGIAN LETTER AIN (0x10fa) - case u'ჽ': // GEORGIAN LETTER AEN (0x10fd) - case u'ჾ': // GEORGIAN LETTER HARD SIGN (0x10fe) - case u'ჿ': // GEORGIAN LETTER LABIAL SIGN (0x10ff) - case u'ᏸ': // CHEROKEE SMALL YE (0x13f8) - case u'ᏹ': // CHEROKEE SMALL YI (0x13f9) - case u'ᏺ': // CHEROKEE SMALL YO (0x13fa) - case u'ᏻ': // CHEROKEE SMALL YU (0x13fb) - case u'ᏼ': // CHEROKEE SMALL YV (0x13fc) - case u'ᏽ': // CHEROKEE SMALL MV (0x13fd) - case u'ᲀ': // CYRILLIC SMALL ROUNDED VE (0x1c80) - case u'ᲁ': // CYRILLIC SMALL LONG-LEGGED DE (0x1c81) - case u'ᲂ': // CYRILLIC SMALL NARROW O (0x1c82) - case u'ᲃ': // CYRILLIC SMALL WIDE ES (0x1c83) - case u'ᲄ': // CYRILLIC SMALL TALL TE (0x1c84) - case u'ᲅ': // CYRILLIC SMALL THREE-LEGGED TE (0x1c85) - case u'ᲆ': // CYRILLIC SMALL TALL HARD SIGN (0x1c86) - case u'ᲇ': // CYRILLIC SMALL TALL YAT (0x1c87) - case u'ᲈ': // CYRILLIC SMALL UNBLENDED UK (0x1c88) - case u'ᴀ': // LATIN LETTER SMALL CAPITAL A (0x1d00) - case u'ᴁ': // LATIN LETTER SMALL CAPITAL AE (0x1d01) - case u'ᴂ': // LATIN SMALL TURNED AE (0x1d02) - case u'ᴃ': // LATIN LETTER SMALL CAPITAL BARRED B (0x1d03) - case u'ᴄ': // LATIN LETTER SMALL CAPITAL C (0x1d04) - case u'ᴅ': // LATIN LETTER SMALL CAPITAL D (0x1d05) - case u'ᴆ': // LATIN LETTER SMALL CAPITAL ETH (0x1d06) - case u'ᴇ': // LATIN LETTER SMALL CAPITAL E (0x1d07) - case u'ᴈ': // LATIN SMALL TURNED OPEN E (0x1d08) - case u'ᴉ': // LATIN SMALL TURNED I (0x1d09) - case u'ᴊ': // LATIN LETTER SMALL CAPITAL J (0x1d0a) - case u'ᴋ': // LATIN LETTER SMALL CAPITAL K (0x1d0b) - case u'ᴌ': // LATIN LETTER SMALL CAPITAL L W/ STROKE (0x1d0c) - case u'ᴍ': // LATIN LETTER SMALL CAPITAL M (0x1d0d) - case u'ᴎ': // LATIN LETTER SMALL CAPITAL REVERSED N (0x1d0e) - case u'ᴏ': // LATIN LETTER SMALL CAPITAL O (0x1d0f) - case u'ᴐ': // LATIN LETTER SMALL CAPITAL OPEN O (0x1d10) - case u'ᴑ': // LATIN SMALL SIDEWAYS O (0x1d11) - case u'ᴒ': // LATIN SMALL SIDEWAYS OPEN O (0x1d12) - case u'ᴓ': // LATIN SMALL SIDEWAYS O W/ STROKE (0x1d13) - case u'ᴔ': // LATIN SMALL TURNED OE (0x1d14) - case u'ᴕ': // LATIN LETTER SMALL CAPITAL OU (0x1d15) - case u'ᴖ': // LATIN SMALL TOP HALF O (0x1d16) - case u'ᴗ': // LATIN SMALL BOTTOM HALF O (0x1d17) - case u'ᴘ': // LATIN LETTER SMALL CAPITAL P (0x1d18) - case u'ᴙ': // LATIN LETTER SMALL CAPITAL REVERSED R (0x1d19) - case u'ᴚ': // LATIN LETTER SMALL CAPITAL TURNED R (0x1d1a) - case u'ᴛ': // LATIN LETTER SMALL CAPITAL T (0x1d1b) - case u'ᴜ': // LATIN LETTER SMALL CAPITAL U (0x1d1c) - case u'ᴝ': // LATIN SMALL SIDEWAYS U (0x1d1d) - case u'ᴞ': // LATIN SMALL SIDEWAYS DIAERESIZED U (0x1d1e) - case u'ᴟ': // LATIN SMALL SIDEWAYS TURNED M (0x1d1f) - case u'ᴠ': // LATIN LETTER SMALL CAPITAL V (0x1d20) - case u'ᴡ': // LATIN LETTER SMALL CAPITAL W (0x1d21) - case u'ᴢ': // LATIN LETTER SMALL CAPITAL Z (0x1d22) - case u'ᴣ': // LATIN LETTER SMALL CAPITAL EZH (0x1d23) - case u'ᴤ': // LATIN LETTER VOICED LARYNGEAL SPIRANT (0x1d24) - case u'ᴥ': // LATIN LETTER AIN (0x1d25) - case u'ᴦ': // GREEK LETTER SMALL CAPITAL GAMMA (0x1d26) - case u'ᴧ': // GREEK LETTER SMALL CAPITAL LAMDA (0x1d27) - case u'ᴨ': // GREEK LETTER SMALL CAPITAL PI (0x1d28) - case u'ᴩ': // GREEK LETTER SMALL CAPITAL RHO (0x1d29) - case u'ᴪ': // GREEK LETTER SMALL CAPITAL PSI (0x1d2a) - case u'ᴫ': // CYRILLIC LETTER SMALL CAPITAL EL (0x1d2b) - case u'ᵫ': // LATIN SMALL UE (0x1d6b) - case u'ᵬ': // LATIN SMALL B W/ MIDDLE TILDE (0x1d6c) - case u'ᵭ': // LATIN SMALL D W/ MIDDLE TILDE (0x1d6d) - case u'ᵮ': // LATIN SMALL F W/ MIDDLE TILDE (0x1d6e) - case u'ᵯ': // LATIN SMALL M W/ MIDDLE TILDE (0x1d6f) - case u'ᵰ': // LATIN SMALL N W/ MIDDLE TILDE (0x1d70) - case u'ᵱ': // LATIN SMALL P W/ MIDDLE TILDE (0x1d71) - case u'ᵲ': // LATIN SMALL R W/ MIDDLE TILDE (0x1d72) - case u'ᵳ': // LATIN SMALL R W/ FISHHOOK AND MIDDLE TILDE (0x1d73) - case u'ᵴ': // LATIN SMALL S W/ MIDDLE TILDE (0x1d74) - case u'ᵵ': // LATIN SMALL T W/ MIDDLE TILDE (0x1d75) - case u'ᵶ': // LATIN SMALL Z W/ MIDDLE TILDE (0x1d76) - case u'ᵷ': // LATIN SMALL TURNED G (0x1d77) - case u'ᵹ': // LATIN SMALL INSULAR G (0x1d79) - case u'ᵺ': // LATIN SMALL TH W/ STRIKETHROUGH (0x1d7a) - case u'ᵻ': // LATIN SMALL CAPITAL LETTER I W/ STROKE (0x1d7b) - case u'ᵼ': // LATIN SMALL IOTA W/ STROKE (0x1d7c) - case u'ᵽ': // LATIN SMALL P W/ STROKE (0x1d7d) - case u'ᵾ': // LATIN SMALL CAPITAL LETTER U W/ STROKE (0x1d7e) - case u'ᵿ': // LATIN SMALL UPSILON W/ STROKE (0x1d7f) - case u'ᶀ': // LATIN SMALL B W/ PALATAL HOOK (0x1d80) - case u'ᶁ': // LATIN SMALL D W/ PALATAL HOOK (0x1d81) - case u'ᶂ': // LATIN SMALL F W/ PALATAL HOOK (0x1d82) - case u'ᶃ': // LATIN SMALL G W/ PALATAL HOOK (0x1d83) - case u'ᶄ': // LATIN SMALL K W/ PALATAL HOOK (0x1d84) - case u'ᶅ': // LATIN SMALL L W/ PALATAL HOOK (0x1d85) - case u'ᶆ': // LATIN SMALL M W/ PALATAL HOOK (0x1d86) - case u'ᶇ': // LATIN SMALL N W/ PALATAL HOOK (0x1d87) - case u'ᶈ': // LATIN SMALL P W/ PALATAL HOOK (0x1d88) - case u'ᶉ': // LATIN SMALL R W/ PALATAL HOOK (0x1d89) - case u'ᶊ': // LATIN SMALL S W/ PALATAL HOOK (0x1d8a) - case u'ᶋ': // LATIN SMALL ESH W/ PALATAL HOOK (0x1d8b) - case u'ᶌ': // LATIN SMALL V W/ PALATAL HOOK (0x1d8c) - case u'ᶍ': // LATIN SMALL X W/ PALATAL HOOK (0x1d8d) - case u'ᶎ': // LATIN SMALL Z W/ PALATAL HOOK (0x1d8e) - case u'ᶏ': // LATIN SMALL A W/ RETROFLEX HOOK (0x1d8f) - case u'ᶐ': // LATIN SMALL ALPHA W/ RETROFLEX HOOK (0x1d90) - case u'ᶑ': // LATIN SMALL D W/ HOOK AND TAIL (0x1d91) - case u'ᶒ': // LATIN SMALL E W/ RETROFLEX HOOK (0x1d92) - case u'ᶓ': // LATIN SMALL OPEN E W/ RETROFLEX HOOK (0x1d93) - case u'ᶔ': // LATIN SMALL REVERSED OPEN E W/ RETROFLEX HOOK (0x1d94) - case u'ᶕ': // LATIN SMALL SCHWA W/ RETROFLEX HOOK (0x1d95) - case u'ᶖ': // LATIN SMALL I W/ RETROFLEX HOOK (0x1d96) - case u'ᶗ': // LATIN SMALL OPEN O W/ RETROFLEX HOOK (0x1d97) - case u'ᶘ': // LATIN SMALL ESH W/ RETROFLEX HOOK (0x1d98) - case u'ᶙ': // LATIN SMALL U W/ RETROFLEX HOOK (0x1d99) - case u'ᶚ': // LATIN SMALL EZH W/ RETROFLEX HOOK (0x1d9a) - case u'ḁ': // LATIN SMALL A W/ RING BELOW (0x1e01) - case u'ḃ': // LATIN SMALL B W/ DOT ABOVE (0x1e03) - case u'ḅ': // LATIN SMALL B W/ DOT BELOW (0x1e05) - case u'ḇ': // LATIN SMALL B W/ LINE BELOW (0x1e07) - case u'ḉ': // LATIN SMALL C W/ CEDILLA AND ACUTE (0x1e09) - case u'ḋ': // LATIN SMALL D W/ DOT ABOVE (0x1e0b) - case u'ḍ': // LATIN SMALL D W/ DOT BELOW (0x1e0d) - case u'ḏ': // LATIN SMALL D W/ LINE BELOW (0x1e0f) - case u'ḑ': // LATIN SMALL D W/ CEDILLA (0x1e11) - case u'ḓ': // LATIN SMALL D W/ CIRCUMFLEX BELOW (0x1e13) - case u'ḕ': // LATIN SMALL E W/ MACRON AND GRAVE (0x1e15) - case u'ḗ': // LATIN SMALL E W/ MACRON AND ACUTE (0x1e17) - case u'ḙ': // LATIN SMALL E W/ CIRCUMFLEX BELOW (0x1e19) - case u'ḛ': // LATIN SMALL E W/ TILDE BELOW (0x1e1b) - case u'ḝ': // LATIN SMALL E W/ CEDILLA AND BREVE (0x1e1d) - case u'ḟ': // LATIN SMALL F W/ DOT ABOVE (0x1e1f) - case u'ḡ': // LATIN SMALL G W/ MACRON (0x1e21) - case u'ḣ': // LATIN SMALL H W/ DOT ABOVE (0x1e23) - case u'ḥ': // LATIN SMALL H W/ DOT BELOW (0x1e25) - case u'ḧ': // LATIN SMALL H W/ DIAERESIS (0x1e27) - case u'ḩ': // LATIN SMALL H W/ CEDILLA (0x1e29) - case u'ḫ': // LATIN SMALL H W/ BREVE BELOW (0x1e2b) - case u'ḭ': // LATIN SMALL I W/ TILDE BELOW (0x1e2d) - case u'ḯ': // LATIN SMALL I W/ DIAERESIS AND ACUTE (0x1e2f) - case u'ḱ': // LATIN SMALL K W/ ACUTE (0x1e31) - case u'ḳ': // LATIN SMALL K W/ DOT BELOW (0x1e33) - case u'ḵ': // LATIN SMALL K W/ LINE BELOW (0x1e35) - case u'ḷ': // LATIN SMALL L W/ DOT BELOW (0x1e37) - case u'ḹ': // LATIN SMALL L W/ DOT BELOW AND MACRON (0x1e39) - case u'ḻ': // LATIN SMALL L W/ LINE BELOW (0x1e3b) - case u'ḽ': // LATIN SMALL L W/ CIRCUMFLEX BELOW (0x1e3d) - case u'ḿ': // LATIN SMALL M W/ ACUTE (0x1e3f) - case u'ṁ': // LATIN SMALL M W/ DOT ABOVE (0x1e41) - case u'ṃ': // LATIN SMALL M W/ DOT BELOW (0x1e43) - case u'ṅ': // LATIN SMALL N W/ DOT ABOVE (0x1e45) - case u'ṇ': // LATIN SMALL N W/ DOT BELOW (0x1e47) - case u'ṉ': // LATIN SMALL N W/ LINE BELOW (0x1e49) - case u'ṋ': // LATIN SMALL N W/ CIRCUMFLEX BELOW (0x1e4b) - case u'ṍ': // LATIN SMALL O W/ TILDE AND ACUTE (0x1e4d) - case u'ṏ': // LATIN SMALL O W/ TILDE AND DIAERESIS (0x1e4f) - case u'ṑ': // LATIN SMALL O W/ MACRON AND GRAVE (0x1e51) - case u'ṓ': // LATIN SMALL O W/ MACRON AND ACUTE (0x1e53) - case u'ṕ': // LATIN SMALL P W/ ACUTE (0x1e55) - case u'ṗ': // LATIN SMALL P W/ DOT ABOVE (0x1e57) - case u'ṙ': // LATIN SMALL R W/ DOT ABOVE (0x1e59) - case u'ṛ': // LATIN SMALL R W/ DOT BELOW (0x1e5b) - case u'ṝ': // LATIN SMALL R W/ DOT BELOW AND MACRON (0x1e5d) - case u'ṟ': // LATIN SMALL R W/ LINE BELOW (0x1e5f) - case u'ṡ': // LATIN SMALL S W/ DOT ABOVE (0x1e61) - case u'ṣ': // LATIN SMALL S W/ DOT BELOW (0x1e63) - case u'ṥ': // LATIN SMALL S W/ ACUTE AND DOT ABOVE (0x1e65) - case u'ṧ': // LATIN SMALL S W/ CARON AND DOT ABOVE (0x1e67) - case u'ṩ': // LATIN SMALL S W/ DOT BELOW AND DOT ABOVE (0x1e69) - case u'ṫ': // LATIN SMALL T W/ DOT ABOVE (0x1e6b) - case u'ṭ': // LATIN SMALL T W/ DOT BELOW (0x1e6d) - case u'ṯ': // LATIN SMALL T W/ LINE BELOW (0x1e6f) - case u'ṱ': // LATIN SMALL T W/ CIRCUMFLEX BELOW (0x1e71) - case u'ṳ': // LATIN SMALL U W/ DIAERESIS BELOW (0x1e73) - case u'ṵ': // LATIN SMALL U W/ TILDE BELOW (0x1e75) - case u'ṷ': // LATIN SMALL U W/ CIRCUMFLEX BELOW (0x1e77) - case u'ṹ': // LATIN SMALL U W/ TILDE AND ACUTE (0x1e79) - case u'ṻ': // LATIN SMALL U W/ MACRON AND DIAERESIS (0x1e7b) - case u'ṽ': // LATIN SMALL V W/ TILDE (0x1e7d) - case u'ṿ': // LATIN SMALL V W/ DOT BELOW (0x1e7f) - case u'ẁ': // LATIN SMALL W W/ GRAVE (0x1e81) - case u'ẃ': // LATIN SMALL W W/ ACUTE (0x1e83) - case u'ẅ': // LATIN SMALL W W/ DIAERESIS (0x1e85) - case u'ẇ': // LATIN SMALL W W/ DOT ABOVE (0x1e87) - case u'ẉ': // LATIN SMALL W W/ DOT BELOW (0x1e89) - case u'ẋ': // LATIN SMALL X W/ DOT ABOVE (0x1e8b) - case u'ẍ': // LATIN SMALL X W/ DIAERESIS (0x1e8d) - case u'ẏ': // LATIN SMALL Y W/ DOT ABOVE (0x1e8f) - case u'ẑ': // LATIN SMALL Z W/ CIRCUMFLEX (0x1e91) - case u'ẓ': // LATIN SMALL Z W/ DOT BELOW (0x1e93) - case u'ẕ': // LATIN SMALL Z W/ LINE BELOW (0x1e95) - case u'ẖ': // LATIN SMALL H W/ LINE BELOW (0x1e96) - case u'ẗ': // LATIN SMALL T W/ DIAERESIS (0x1e97) - case u'ẘ': // LATIN SMALL W W/ RING ABOVE (0x1e98) - case u'ẙ': // LATIN SMALL Y W/ RING ABOVE (0x1e99) - case u'ẚ': // LATIN SMALL A W/ RIGHT HALF RING (0x1e9a) - case u'ẛ': // LATIN SMALL LONG S W/ DOT ABOVE (0x1e9b) - case u'ẜ': // LATIN SMALL LONG S W/ DIAGONAL STROKE (0x1e9c) - case u'ẝ': // LATIN SMALL LONG S W/ HIGH STROKE (0x1e9d) - case u'ẟ': // LATIN SMALL DELTA (0x1e9f) - case u'ạ': // LATIN SMALL A W/ DOT BELOW (0x1ea1) - case u'ả': // LATIN SMALL A W/ HOOK ABOVE (0x1ea3) - case u'ấ': // LATIN SMALL A W/ CIRCUMFLEX AND ACUTE (0x1ea5) - case u'ầ': // LATIN SMALL A W/ CIRCUMFLEX AND GRAVE (0x1ea7) - case u'ẩ': // LATIN SMALL A W/ CIRCUMFLEX AND HOOK ABOVE (0x1ea9) - case u'ẫ': // LATIN SMALL A W/ CIRCUMFLEX AND TILDE (0x1eab) - case u'ậ': // LATIN SMALL A W/ CIRCUMFLEX AND DOT BELOW (0x1ead) - case u'ắ': // LATIN SMALL A W/ BREVE AND ACUTE (0x1eaf) - case u'ằ': // LATIN SMALL A W/ BREVE AND GRAVE (0x1eb1) - case u'ẳ': // LATIN SMALL A W/ BREVE AND HOOK ABOVE (0x1eb3) - case u'ẵ': // LATIN SMALL A W/ BREVE AND TILDE (0x1eb5) - case u'ặ': // LATIN SMALL A W/ BREVE AND DOT BELOW (0x1eb7) - case u'ẹ': // LATIN SMALL E W/ DOT BELOW (0x1eb9) - case u'ẻ': // LATIN SMALL E W/ HOOK ABOVE (0x1ebb) - case u'ẽ': // LATIN SMALL E W/ TILDE (0x1ebd) - case u'ế': // LATIN SMALL E W/ CIRCUMFLEX AND ACUTE (0x1ebf) - case u'ề': // LATIN SMALL E W/ CIRCUMFLEX AND GRAVE (0x1ec1) - case u'ể': // LATIN SMALL E W/ CIRCUMFLEX AND HOOK ABOVE (0x1ec3) - case u'ễ': // LATIN SMALL E W/ CIRCUMFLEX AND TILDE (0x1ec5) - case u'ệ': // LATIN SMALL E W/ CIRCUMFLEX AND DOT BELOW (0x1ec7) - case u'ỉ': // LATIN SMALL I W/ HOOK ABOVE (0x1ec9) - case u'ị': // LATIN SMALL I W/ DOT BELOW (0x1ecb) - case u'ọ': // LATIN SMALL O W/ DOT BELOW (0x1ecd) - case u'ỏ': // LATIN SMALL O W/ HOOK ABOVE (0x1ecf) - case u'ố': // LATIN SMALL O W/ CIRCUMFLEX AND ACUTE (0x1ed1) - case u'ồ': // LATIN SMALL O W/ CIRCUMFLEX AND GRAVE (0x1ed3) - case u'ổ': // LATIN SMALL O W/ CIRCUMFLEX AND HOOK ABOVE (0x1ed5) - case u'ỗ': // LATIN SMALL O W/ CIRCUMFLEX AND TILDE (0x1ed7) - case u'ộ': // LATIN SMALL O W/ CIRCUMFLEX AND DOT BELOW (0x1ed9) - case u'ớ': // LATIN SMALL O W/ HORN AND ACUTE (0x1edb) - case u'ờ': // LATIN SMALL O W/ HORN AND GRAVE (0x1edd) - case u'ở': // LATIN SMALL O W/ HORN AND HOOK ABOVE (0x1edf) - case u'ỡ': // LATIN SMALL O W/ HORN AND TILDE (0x1ee1) - case u'ợ': // LATIN SMALL O W/ HORN AND DOT BELOW (0x1ee3) - case u'ụ': // LATIN SMALL U W/ DOT BELOW (0x1ee5) - case u'ủ': // LATIN SMALL U W/ HOOK ABOVE (0x1ee7) - case u'ứ': // LATIN SMALL U W/ HORN AND ACUTE (0x1ee9) - case u'ừ': // LATIN SMALL U W/ HORN AND GRAVE (0x1eeb) - case u'ử': // LATIN SMALL U W/ HORN AND HOOK ABOVE (0x1eed) - case u'ữ': // LATIN SMALL U W/ HORN AND TILDE (0x1eef) - case u'ự': // LATIN SMALL U W/ HORN AND DOT BELOW (0x1ef1) - case u'ỳ': // LATIN SMALL Y W/ GRAVE (0x1ef3) - case u'ỵ': // LATIN SMALL Y W/ DOT BELOW (0x1ef5) - case u'ỷ': // LATIN SMALL Y W/ HOOK ABOVE (0x1ef7) - case u'ỹ': // LATIN SMALL Y W/ TILDE (0x1ef9) - case u'ỻ': // LATIN SMALL MIDDLE-WELSH LL (0x1efb) - case u'ỽ': // LATIN SMALL MIDDLE-WELSH V (0x1efd) - case u'ỿ': // LATIN SMALL Y W/ LOOP (0x1eff) - case u'ἀ': // GREEK SMALL ALPHA W/ PSILI (0x1f00) - case u'ἁ': // GREEK SMALL ALPHA W/ DASIA (0x1f01) - case u'ἂ': // GREEK SMALL ALPHA W/ PSILI AND VARIA (0x1f02) - case u'ἃ': // GREEK SMALL ALPHA W/ DASIA AND VARIA (0x1f03) - case u'ἄ': // GREEK SMALL ALPHA W/ PSILI AND OXIA (0x1f04) - case u'ἅ': // GREEK SMALL ALPHA W/ DASIA AND OXIA (0x1f05) - case u'ἆ': // GREEK SMALL ALPHA W/ PSILI AND PERISPOMENI (0x1f06) - case u'ἇ': // GREEK SMALL ALPHA W/ DASIA AND PERISPOMENI (0x1f07) - case u'ἐ': // GREEK SMALL EPSILON W/ PSILI (0x1f10) - case u'ἑ': // GREEK SMALL EPSILON W/ DASIA (0x1f11) - case u'ἒ': // GREEK SMALL EPSILON W/ PSILI AND VARIA (0x1f12) - case u'ἓ': // GREEK SMALL EPSILON W/ DASIA AND VARIA (0x1f13) - case u'ἔ': // GREEK SMALL EPSILON W/ PSILI AND OXIA (0x1f14) - case u'ἕ': // GREEK SMALL EPSILON W/ DASIA AND OXIA (0x1f15) - case u'ἠ': // GREEK SMALL ETA W/ PSILI (0x1f20) - case u'ἡ': // GREEK SMALL ETA W/ DASIA (0x1f21) - case u'ἢ': // GREEK SMALL ETA W/ PSILI AND VARIA (0x1f22) - case u'ἣ': // GREEK SMALL ETA W/ DASIA AND VARIA (0x1f23) - case u'ἤ': // GREEK SMALL ETA W/ PSILI AND OXIA (0x1f24) - case u'ἥ': // GREEK SMALL ETA W/ DASIA AND OXIA (0x1f25) - case u'ἦ': // GREEK SMALL ETA W/ PSILI AND PERISPOMENI (0x1f26) - case u'ἧ': // GREEK SMALL ETA W/ DASIA AND PERISPOMENI (0x1f27) - case u'ἰ': // GREEK SMALL IOTA W/ PSILI (0x1f30) - case u'ἱ': // GREEK SMALL IOTA W/ DASIA (0x1f31) - case u'ἲ': // GREEK SMALL IOTA W/ PSILI AND VARIA (0x1f32) - case u'ἳ': // GREEK SMALL IOTA W/ DASIA AND VARIA (0x1f33) - case u'ἴ': // GREEK SMALL IOTA W/ PSILI AND OXIA (0x1f34) - case u'ἵ': // GREEK SMALL IOTA W/ DASIA AND OXIA (0x1f35) - case u'ἶ': // GREEK SMALL IOTA W/ PSILI AND PERISPOMENI (0x1f36) - case u'ἷ': // GREEK SMALL IOTA W/ DASIA AND PERISPOMENI (0x1f37) - case u'ὀ': // GREEK SMALL OMICRON W/ PSILI (0x1f40) - case u'ὁ': // GREEK SMALL OMICRON W/ DASIA (0x1f41) - case u'ὂ': // GREEK SMALL OMICRON W/ PSILI AND VARIA (0x1f42) - case u'ὃ': // GREEK SMALL OMICRON W/ DASIA AND VARIA (0x1f43) - case u'ὄ': // GREEK SMALL OMICRON W/ PSILI AND OXIA (0x1f44) - case u'ὅ': // GREEK SMALL OMICRON W/ DASIA AND OXIA (0x1f45) - case u'ὐ': // GREEK SMALL UPSILON W/ PSILI (0x1f50) - case u'ὑ': // GREEK SMALL UPSILON W/ DASIA (0x1f51) - case u'ὒ': // GREEK SMALL UPSILON W/ PSILI AND VARIA (0x1f52) - case u'ὓ': // GREEK SMALL UPSILON W/ DASIA AND VARIA (0x1f53) - case u'ὔ': // GREEK SMALL UPSILON W/ PSILI AND OXIA (0x1f54) - case u'ὕ': // GREEK SMALL UPSILON W/ DASIA AND OXIA (0x1f55) - case u'ὖ': // GREEK SMALL UPSILON W/ PSILI AND PERISPOMENI (0x1f56) - case u'ὗ': // GREEK SMALL UPSILON W/ DASIA AND PERISPOMENI (0x1f57) - case u'ὠ': // GREEK SMALL OMEGA W/ PSILI (0x1f60) - case u'ὡ': // GREEK SMALL OMEGA W/ DASIA (0x1f61) - case u'ὢ': // GREEK SMALL OMEGA W/ PSILI AND VARIA (0x1f62) - case u'ὣ': // GREEK SMALL OMEGA W/ DASIA AND VARIA (0x1f63) - case u'ὤ': // GREEK SMALL OMEGA W/ PSILI AND OXIA (0x1f64) - case u'ὥ': // GREEK SMALL OMEGA W/ DASIA AND OXIA (0x1f65) - case u'ὦ': // GREEK SMALL OMEGA W/ PSILI AND PERISPOMENI (0x1f66) - case u'ὧ': // GREEK SMALL OMEGA W/ DASIA AND PERISPOMENI (0x1f67) - case u'ὰ': // GREEK SMALL ALPHA W/ VARIA (0x1f70) - case u'ά': // GREEK SMALL ALPHA W/ OXIA (0x1f71) - case u'ὲ': // GREEK SMALL EPSILON W/ VARIA (0x1f72) - case u'έ': // GREEK SMALL EPSILON W/ OXIA (0x1f73) - case u'ὴ': // GREEK SMALL ETA W/ VARIA (0x1f74) - case u'ή': // GREEK SMALL ETA W/ OXIA (0x1f75) - case u'ὶ': // GREEK SMALL IOTA W/ VARIA (0x1f76) - case u'ί': // GREEK SMALL IOTA W/ OXIA (0x1f77) - case u'ὸ': // GREEK SMALL OMICRON W/ VARIA (0x1f78) - case u'ό': // GREEK SMALL OMICRON W/ OXIA (0x1f79) - case u'ὺ': // GREEK SMALL UPSILON W/ VARIA (0x1f7a) - case u'ύ': // GREEK SMALL UPSILON W/ OXIA (0x1f7b) - case u'ὼ': // GREEK SMALL OMEGA W/ VARIA (0x1f7c) - case u'ώ': // GREEK SMALL OMEGA W/ OXIA (0x1f7d) - case u'ᾀ': // GREEK SMALL ALPHA W/ PSILI YPOGEGRAMMENI (0x1f80) - case u'ᾁ': // GREEK SMALL ALPHA W/ DASIA YPOGEGRAMMENI (0x1f81) - case u'ᾂ': // GREEK SMALL ALPHA W/ PSILI VARIA YPOGEGRAMMENI (0x1f82) - case u'ᾃ': // GREEK SMALL ALPHA W/ DASIA VARIA YPOGEGRAMMENI (0x1f83) - case u'ᾄ': // GREEK SMALL ALPHA W/ PSILI OXIA YPOGEGRAMMENI (0x1f84) - case u'ᾅ': // GREEK SMALL ALPHA W/ DASIA OXIA YPOGEGRAMMENI (0x1f85) - case u'ᾆ': // GREEK SMALL ALPHA W/ PSILI PERISPOMENI YPOGEGRAMMENI (0x1f86) - case u'ᾇ': // GREEK SMALL ALPHA W/ DASIA PERISPOMENI YPOGEGRAMMENI (0x1f87) - case u'ᾐ': // GREEK SMALL ETA W/ PSILI YPOGEGRAMMENI (0x1f90) - case u'ᾑ': // GREEK SMALL ETA W/ DASIA YPOGEGRAMMENI (0x1f91) - case u'ᾒ': // GREEK SMALL ETA W/ PSILI VARIA YPOGEGRAMMENI 0x1f92) - case u'ᾓ': // GREEK SMALL ETA W/ DASIA VARIA YPOGEGRAMMENI 0x1f93) - case u'ᾔ': // GREEK SMALL ETA W/ PSILI OXIA YPOGEGRAMMENI 0x1f94) - case u'ᾕ': // GREEK SMALL ETA W/ DASIA OXIA YPOGEGRAMMENI 0x1f95) - case u'ᾖ': // GREEK SMALL ETA W/ PSILI PERISPOMENI YPOGEGRAMMENI (0x1f96) - case u'ᾗ': // GREEK SMALL ETA W/ DASIA PERISPOMENI YPOGEGRAMMENI (0x1f97) - case u'ᾠ': // GREEK SMALL OMEGA W/ PSILI YPOGEGRAMMENI (0x1fa0) - case u'ᾡ': // GREEK SMALL OMEGA W/ DASIA YPOGEGRAMMENI (0x1fa1) - case u'ᾢ': // GREEK SMALL OMEGA W/ PSILI VARIA YPOGEGRAMMENI (0x1fa2) - case u'ᾣ': // GREEK SMALL OMEGA W/ DASIA VARIA YPOGEGRAMMENI (0x1fa3) - case u'ᾤ': // GREEK SMALL OMEGA W/ PSILI OXIA YPOGEGRAMMENI (0x1fa4) - case u'ᾥ': // GREEK SMALL OMEGA W/ DASIA OXIA YPOGEGRAMMENI (0x1fa5) - case u'ᾦ': // GREEK SMALL OMEGA W/ PSILI PERISPOMENI YPOGEGRAMMENI (0x1fa6) - case u'ᾧ': // GREEK SMALL OMEGA W/ DASIA PERISPOMENI YPOGEGRAMMENI (0x1fa7) - case u'ᾰ': // GREEK SMALL ALPHA W/ VRACHY (0x1fb0) - case u'ᾱ': // GREEK SMALL ALPHA W/ MACRON (0x1fb1) - case u'ᾲ': // GREEK SMALL ALPHA W/ VARIA YPOGEGRAMMENI (0x1fb2) - case u'ᾳ': // GREEK SMALL ALPHA W/ YPOGEGRAMMENI (0x1fb3) - case u'ᾴ': // GREEK SMALL ALPHA W/ OXIA AND YPOGEGRAMMENI (0x1fb4) - case u'ᾶ': // GREEK SMALL ALPHA W/ PERISPOMENI (0x1fb6) - case u'ᾷ': // GREEK SMALL ALPHA W/ PERISPOMENI AND YPOGEGRAMMENI (0x1fb7) - case u'ι': // GREEK PROSGEGRAMMENI (0x1fbe) - case u'ῂ': // GREEK SMALL ETA W/ VARIA AND YPOGEGRAMMENI (0x1fc2) - case u'ῃ': // GREEK SMALL ETA W/ YPOGEGRAMMENI (0x1fc3) - case u'ῄ': // GREEK SMALL ETA W/ OXIA AND YPOGEGRAMMENI (0x1fc4) - case u'ῆ': // GREEK SMALL ETA W/ PERISPOMENI (0x1fc6) - case u'ῇ': // GREEK SMALL ETA W/ PERISPOMENI AND YPOGEGRAMMENI (0x1fc7) - case u'ῐ': // GREEK SMALL IOTA W/ VRACHY (0x1fd0) - case u'ῑ': // GREEK SMALL IOTA W/ MACRON (0x1fd1) - case u'ῒ': // GREEK SMALL IOTA W/ DIALYTIKA AND VARIA (0x1fd2) - case u'ΐ': // GREEK SMALL IOTA W/ DIALYTIKA AND OXIA (0x1fd3) - case u'ῖ': // GREEK SMALL IOTA W/ PERISPOMENI (0x1fd6) - case u'ῗ': // GREEK SMALL IOTA W/ DIALYTIKA AND PERISPOMENI (0x1fd7) - case u'ῠ': // GREEK SMALL UPSILON W/ VRACHY (0x1fe0) - case u'ῡ': // GREEK SMALL UPSILON W/ MACRON (0x1fe1) - case u'ῢ': // GREEK SMALL UPSILON W/ DIALYTIKA AND VARIA (0x1fe2) - case u'ΰ': // GREEK SMALL UPSILON W/ DIALYTIKA AND OXIA (0x1fe3) - case u'ῤ': // GREEK SMALL RHO W/ PSILI (0x1fe4) - case u'ῥ': // GREEK SMALL RHO W/ DASIA (0x1fe5) - case u'ῦ': // GREEK SMALL UPSILON W/ PERISPOMENI (0x1fe6) - case u'ῧ': // GREEK SMALL UPSILON W/ DIALYTIKA AND PERISPOMENI (0x1fe7) - case u'ῲ': // GREEK SMALL OMEGA W/ VARIA AND YPOGEGRAMMENI (0x1ff2) - case u'ῳ': // GREEK SMALL OMEGA W/ YPOGEGRAMMENI (0x1ff3) - case u'ῴ': // GREEK SMALL OMEGA W/ OXIA AND YPOGEGRAMMENI (0x1ff4) - case u'ῶ': // GREEK SMALL OMEGA W/ PERISPOMENI (0x1ff6) - case u'ῷ': // GREEK SMALL OMEGA W/ PERISPOMENI AND YPOGEGRAMMENI (0x1ff7) - case u'ℊ': // SCRIPT SMALL G (0x210a) - case u'ℎ': // PLANCK CONSTANT (0x210e) - case u'ℏ': // PLANCK CONSTANT OVER TWO PI (0x210f) - case u'ℓ': // SCRIPT SMALL L (0x2113) - case u'ℯ': // SCRIPT SMALL E (0x212f) - case u'ℴ': // SCRIPT SMALL O (0x2134) - case u'ℹ': // INFORMATION SOURCE (0x2139) - case u'ℼ': // DOUBLE-STRUCK SMALL PI (0x213c) - case u'ℽ': // DOUBLE-STRUCK SMALL GAMMA (0x213d) - case u'ⅆ': // DOUBLE-STRUCK ITALIC SMALL D (0x2146) - case u'ⅇ': // DOUBLE-STRUCK ITALIC SMALL E (0x2147) - case u'ⅈ': // DOUBLE-STRUCK ITALIC SMALL I (0x2148) - case u'ⅉ': // DOUBLE-STRUCK ITALIC SMALL J (0x2149) - case u'ⅎ': // TURNED SMALL F (0x214e) - case u'ↄ': // LATIN SMALL REVERSED C (0x2184) - case u'ⰰ': // GLAGOLITIC SMALL AZU (0x2c30) - case u'ⰱ': // GLAGOLITIC SMALL BUKY (0x2c31) - case u'ⰲ': // GLAGOLITIC SMALL VEDE (0x2c32) - case u'ⰳ': // GLAGOLITIC SMALL GLAGOLI (0x2c33) - case u'ⰴ': // GLAGOLITIC SMALL DOBRO (0x2c34) - case u'ⰵ': // GLAGOLITIC SMALL YESTU (0x2c35) - case u'ⰶ': // GLAGOLITIC SMALL ZHIVETE (0x2c36) - case u'ⰷ': // GLAGOLITIC SMALL DZELO (0x2c37) - case u'ⰸ': // GLAGOLITIC SMALL ZEMLJA (0x2c38) - case u'ⰹ': // GLAGOLITIC SMALL IZHE (0x2c39) - case u'ⰺ': // GLAGOLITIC SMALL INITIAL IZHE (0x2c3a) - case u'ⰻ': // GLAGOLITIC SMALL I (0x2c3b) - case u'ⰼ': // GLAGOLITIC SMALL DJERVI (0x2c3c) - case u'ⰽ': // GLAGOLITIC SMALL KAKO (0x2c3d) - case u'ⰾ': // GLAGOLITIC SMALL LJUDIJE (0x2c3e) - case u'ⰿ': // GLAGOLITIC SMALL MYSLITE (0x2c3f) - case u'ⱀ': // GLAGOLITIC SMALL NASHI (0x2c40) - case u'ⱁ': // GLAGOLITIC SMALL ONU (0x2c41) - case u'ⱂ': // GLAGOLITIC SMALL POKOJI (0x2c42) - case u'ⱃ': // GLAGOLITIC SMALL RITSI (0x2c43) - case u'ⱄ': // GLAGOLITIC SMALL SLOVO (0x2c44) - case u'ⱅ': // GLAGOLITIC SMALL TVRIDO (0x2c45) - case u'ⱆ': // GLAGOLITIC SMALL UKU (0x2c46) - case u'ⱇ': // GLAGOLITIC SMALL FRITU (0x2c47) - case u'ⱈ': // GLAGOLITIC SMALL HERU (0x2c48) - case u'ⱉ': // GLAGOLITIC SMALL OTU (0x2c49) - case u'ⱊ': // GLAGOLITIC SMALL PE (0x2c4a) - case u'ⱋ': // GLAGOLITIC SMALL SHTA (0x2c4b) - case u'ⱌ': // GLAGOLITIC SMALL TSI (0x2c4c) - case u'ⱍ': // GLAGOLITIC SMALL CHRIVI (0x2c4d) - case u'ⱎ': // GLAGOLITIC SMALL SHA (0x2c4e) - case u'ⱏ': // GLAGOLITIC SMALL YERU (0x2c4f) - case u'ⱐ': // GLAGOLITIC SMALL YERI (0x2c50) - case u'ⱑ': // GLAGOLITIC SMALL YATI (0x2c51) - case u'ⱒ': // GLAGOLITIC SMALL SPIDERY HA (0x2c52) - case u'ⱓ': // GLAGOLITIC SMALL YU (0x2c53) - case u'ⱔ': // GLAGOLITIC SMALL SMALL YUS (0x2c54) - case u'ⱕ': // GLAGOLITIC SMALL SMALL YUS W/ TAIL (0x2c55) - case u'ⱖ': // GLAGOLITIC SMALL YO (0x2c56) - case u'ⱗ': // GLAGOLITIC SMALL IOTATED SMALL YUS (0x2c57) - case u'ⱘ': // GLAGOLITIC SMALL BIG YUS (0x2c58) - case u'ⱙ': // GLAGOLITIC SMALL IOTATED BIG YUS (0x2c59) - case u'ⱚ': // GLAGOLITIC SMALL FITA (0x2c5a) - case u'ⱛ': // GLAGOLITIC SMALL IZHITSA (0x2c5b) - case u'ⱜ': // GLAGOLITIC SMALL SHTAPIC (0x2c5c) - case u'ⱝ': // GLAGOLITIC SMALL TROKUTASTI A (0x2c5d) - case u'ⱞ': // GLAGOLITIC SMALL LATINATE MYSLITE (0x2c5e) - case u'ⱡ': // LATIN SMALL L W/ DOUBLE BAR (0x2c61) - case u'ⱥ': // LATIN SMALL A W/ STROKE (0x2c65) - case u'ⱦ': // LATIN SMALL T W/ DIAGONAL STROKE (0x2c66) - case u'ⱨ': // LATIN SMALL H W/ DESCENDER (0x2c68) - case u'ⱪ': // LATIN SMALL K W/ DESCENDER (0x2c6a) - case u'ⱬ': // LATIN SMALL Z W/ DESCENDER (0x2c6c) - case u'ⱱ': // LATIN SMALL V W/ RIGHT HOOK (0x2c71) - case u'ⱳ': // LATIN SMALL W W/ HOOK (0x2c73) - case u'ⱴ': // LATIN SMALL V W/ CURL (0x2c74) - case u'ⱶ': // LATIN SMALL HALF H (0x2c76) - case u'ⱷ': // LATIN SMALL TAILLESS PHI (0x2c77) - case u'ⱸ': // LATIN SMALL E W/ NOTCH (0x2c78) - case u'ⱹ': // LATIN SMALL TURNED R W/ TAIL (0x2c79) - case u'ⱺ': // LATIN SMALL O W/ LOW RING INSIDE (0x2c7a) - case u'ⱻ': // LATIN LETTER SMALL CAPITAL TURNED E (0x2c7b) - case u'ⲁ': // COPTIC SMALL ALFA (0x2c81) - case u'ⲃ': // COPTIC SMALL VIDA (0x2c83) - case u'ⲅ': // COPTIC SMALL GAMMA (0x2c85) - case u'ⲇ': // COPTIC SMALL DALDA (0x2c87) - case u'ⲉ': // COPTIC SMALL EIE (0x2c89) - case u'ⲋ': // COPTIC SMALL SOU (0x2c8b) - case u'ⲍ': // COPTIC SMALL ZATA (0x2c8d) - case u'ⲏ': // COPTIC SMALL HATE (0x2c8f) - case u'ⲑ': // COPTIC SMALL THETHE (0x2c91) - case u'ⲓ': // COPTIC SMALL IAUDA (0x2c93) - case u'ⲕ': // COPTIC SMALL KAPA (0x2c95) - case u'ⲗ': // COPTIC SMALL LAULA (0x2c97) - case u'ⲙ': // COPTIC SMALL MI (0x2c99) - case u'ⲛ': // COPTIC SMALL NI (0x2c9b) - case u'ⲝ': // COPTIC SMALL KSI (0x2c9d) - case u'ⲟ': // COPTIC SMALL O (0x2c9f) - case u'ⲡ': // COPTIC SMALL PI (0x2ca1) - case u'ⲣ': // COPTIC SMALL RO (0x2ca3) - case u'ⲥ': // COPTIC SMALL SIMA (0x2ca5) - case u'ⲧ': // COPTIC SMALL TAU (0x2ca7) - case u'ⲩ': // COPTIC SMALL UA (0x2ca9) - case u'ⲫ': // COPTIC SMALL FI (0x2cab) - case u'ⲭ': // COPTIC SMALL KHI (0x2cad) - case u'ⲯ': // COPTIC SMALL PSI (0x2caf) - case u'ⲱ': // COPTIC SMALL OOU (0x2cb1) - case u'ⲳ': // COPTIC SMALL DIALECT-P ALEF (0x2cb3) - case u'ⲵ': // COPTIC SMALL OLD COPTIC AIN (0x2cb5) - case u'ⲷ': // COPTIC SMALL CRYPTOGRAMMIC EIE (0x2cb7) - case u'ⲹ': // COPTIC SMALL DIALECT-P KAPA (0x2cb9) - case u'ⲻ': // COPTIC SMALL DIALECT-P NI (0x2cbb) - case u'ⲽ': // COPTIC SMALL CRYPTOGRAMMIC NI (0x2cbd) - case u'ⲿ': // COPTIC SMALL OLD COPTIC OOU (0x2cbf) - case u'ⳁ': // COPTIC SMALL SAMPI (0x2cc1) - case u'ⳃ': // COPTIC SMALL CROSSED SHEI (0x2cc3) - case u'ⳅ': // COPTIC SMALL OLD COPTIC SHEI (0x2cc5) - case u'ⳇ': // COPTIC SMALL OLD COPTIC ESH (0x2cc7) - case u'ⳉ': // COPTIC SMALL AKHMIMIC KHEI (0x2cc9) - case u'ⳋ': // COPTIC SMALL DIALECT-P HORI (0x2ccb) - case u'ⳍ': // COPTIC SMALL OLD COPTIC HORI (0x2ccd) - case u'ⳏ': // COPTIC SMALL OLD COPTIC HA (0x2ccf) - case u'ⳑ': // COPTIC SMALL L-SHAPED HA (0x2cd1) - case u'ⳓ': // COPTIC SMALL OLD COPTIC HEI (0x2cd3) - case u'ⳕ': // COPTIC SMALL OLD COPTIC HAT (0x2cd5) - case u'ⳗ': // COPTIC SMALL OLD COPTIC GANGIA (0x2cd7) - case u'ⳙ': // COPTIC SMALL OLD COPTIC DJA (0x2cd9) - case u'ⳛ': // COPTIC SMALL OLD COPTIC SHIMA (0x2cdb) - case u'ⳝ': // COPTIC SMALL OLD NUBIAN SHIMA (0x2cdd) - case u'ⳟ': // COPTIC SMALL OLD NUBIAN NGI (0x2cdf) - case u'ⳡ': // COPTIC SMALL OLD NUBIAN NYI (0x2ce1) - case u'ⳣ': // COPTIC SMALL OLD NUBIAN WAU (0x2ce3) - case u'ⳤ': // COPTIC SYMBOL KAI (0x2ce4) - case u'ⳬ': // COPTIC SMALL CRYPTOGRAMMIC SHEI (0x2cec) - case u'ⳮ': // COPTIC SMALL CRYPTOGRAMMIC GANGIA (0x2cee) - case u'ⳳ': // COPTIC SMALL BOHAIRIC KHEI (0x2cf3) - case u'ⴀ': // GEORGIAN SMALL AN (0x2d00) - case u'ⴁ': // GEORGIAN SMALL BAN (0x2d01) - case u'ⴂ': // GEORGIAN SMALL GAN (0x2d02) - case u'ⴃ': // GEORGIAN SMALL DON (0x2d03) - case u'ⴄ': // GEORGIAN SMALL EN (0x2d04) - case u'ⴅ': // GEORGIAN SMALL VIN (0x2d05) - case u'ⴆ': // GEORGIAN SMALL ZEN (0x2d06) - case u'ⴇ': // GEORGIAN SMALL TAN (0x2d07) - case u'ⴈ': // GEORGIAN SMALL IN (0x2d08) - case u'ⴉ': // GEORGIAN SMALL KAN (0x2d09) - case u'ⴊ': // GEORGIAN SMALL LAS (0x2d0a) - case u'ⴋ': // GEORGIAN SMALL MAN (0x2d0b) - case u'ⴌ': // GEORGIAN SMALL NAR (0x2d0c) - case u'ⴍ': // GEORGIAN SMALL ON (0x2d0d) - case u'ⴎ': // GEORGIAN SMALL PAR (0x2d0e) - case u'ⴏ': // GEORGIAN SMALL ZHAR (0x2d0f) - case u'ⴐ': // GEORGIAN SMALL RAE (0x2d10) - case u'ⴑ': // GEORGIAN SMALL SAN (0x2d11) - case u'ⴒ': // GEORGIAN SMALL TAR (0x2d12) - case u'ⴓ': // GEORGIAN SMALL UN (0x2d13) - case u'ⴔ': // GEORGIAN SMALL PHAR (0x2d14) - case u'ⴕ': // GEORGIAN SMALL KHAR (0x2d15) - case u'ⴖ': // GEORGIAN SMALL GHAN (0x2d16) - case u'ⴗ': // GEORGIAN SMALL QAR (0x2d17) - case u'ⴘ': // GEORGIAN SMALL SHIN (0x2d18) - case u'ⴙ': // GEORGIAN SMALL CHIN (0x2d19) - case u'ⴚ': // GEORGIAN SMALL CAN (0x2d1a) - case u'ⴛ': // GEORGIAN SMALL JIL (0x2d1b) - case u'ⴜ': // GEORGIAN SMALL CIL (0x2d1c) - case u'ⴝ': // GEORGIAN SMALL CHAR (0x2d1d) - case u'ⴞ': // GEORGIAN SMALL XAN (0x2d1e) - case u'ⴟ': // GEORGIAN SMALL JHAN (0x2d1f) - case u'ⴠ': // GEORGIAN SMALL HAE (0x2d20) - case u'ⴡ': // GEORGIAN SMALL HE (0x2d21) - case u'ⴢ': // GEORGIAN SMALL HIE (0x2d22) - case u'ⴣ': // GEORGIAN SMALL WE (0x2d23) - case u'ⴤ': // GEORGIAN SMALL HAR (0x2d24) - case u'ⴥ': // GEORGIAN SMALL HOE (0x2d25) - case u'ⴧ': // GEORGIAN SMALL YN (0x2d27) - case u'ⴭ': // GEORGIAN SMALL AEN (0x2d2d) - case u'ꙁ': // CYRILLIC SMALL ZEMLYA (0xa641) - case u'ꙃ': // CYRILLIC SMALL DZELO (0xa643) - case u'ꙅ': // CYRILLIC SMALL REVERSED DZE (0xa645) - case u'ꙇ': // CYRILLIC SMALL IOTA (0xa647) - case u'ꙉ': // CYRILLIC SMALL DJERV (0xa649) - case u'ꙋ': // CYRILLIC SMALL MONOGRAPH UK (0xa64b) - case u'ꙍ': // CYRILLIC SMALL BROAD OMEGA (0xa64d) - case u'ꙏ': // CYRILLIC SMALL NEUTRAL YER (0xa64f) - case u'ꙑ': // CYRILLIC SMALL YERU W/ BACK YER (0xa651) - case u'ꙓ': // CYRILLIC SMALL IOTIFIED YAT (0xa653) - case u'ꙕ': // CYRILLIC SMALL REVERSED YU (0xa655) - case u'ꙗ': // CYRILLIC SMALL IOTIFIED A (0xa657) - case u'ꙙ': // CYRILLIC SMALL CLOSED LITTLE YUS (0xa659) - case u'ꙛ': // CYRILLIC SMALL BLENDED YUS (0xa65b) - case u'ꙝ': // CYRILLIC SMALL IOTIFIED CLOSED LITTLE YUS (0xa65d) - case u'ꙟ': // CYRILLIC SMALL YN (0xa65f) - case u'ꙡ': // CYRILLIC SMALL REVERSED TSE (0xa661) - case u'ꙣ': // CYRILLIC SMALL SOFT DE (0xa663) - case u'ꙥ': // CYRILLIC SMALL SOFT EL (0xa665) - case u'ꙧ': // CYRILLIC SMALL SOFT EM (0xa667) - case u'ꙩ': // CYRILLIC SMALL MONOCULAR O (0xa669) - case u'ꙫ': // CYRILLIC SMALL BINOCULAR O (0xa66b) - case u'ꙭ': // CYRILLIC SMALL DOUBLE MONOCULAR O (0xa66d) - case 0xa681: // CYRILLIC SMALL DWE (0xa681) - case 0xa683: // CYRILLIC SMALL DZWE (0xa683) - case 0xa685: // CYRILLIC SMALL ZHWE (0xa685) - case 0xa687: // CYRILLIC SMALL CCHE (0xa687) - case 0xa689: // CYRILLIC SMALL DZZE (0xa689) - case 0xa68b: // CYRILLIC SMALL TE W/ MIDDLE HOOK (0xa68b) - case 0xa68d: // CYRILLIC SMALL TWE (0xa68d) - case 0xa68f: // CYRILLIC SMALL TSWE (0xa68f) - case 0xa691: // CYRILLIC SMALL TSSE (0xa691) - case 0xa693: // CYRILLIC SMALL TCHE (0xa693) - case 0xa695: // CYRILLIC SMALL HWE (0xa695) - case 0xa697: // CYRILLIC SMALL SHWE (0xa697) - case 0xa699: // CYRILLIC SMALL DOUBLE O (0xa699) - case 0xa69b: // CYRILLIC SMALL CROSSED O (0xa69b) - case u'ꜣ': // LATIN SMALL EGYPTOLOGICAL ALEF (0xa723) - case u'ꜥ': // LATIN SMALL EGYPTOLOGICAL AIN (0xa725) - case u'ꜧ': // LATIN SMALL HENG (0xa727) - case u'ꜩ': // LATIN SMALL TZ (0xa729) - case u'ꜫ': // LATIN SMALL TRESILLO (0xa72b) - case u'ꜭ': // LATIN SMALL CUATRILLO (0xa72d) - case u'ꜯ': // LATIN SMALL CUATRILLO W/ COMMA (0xa72f) - case u'ꜰ': // LATIN LETTER SMALL CAPITAL F (0xa730) - case u'ꜱ': // LATIN LETTER SMALL CAPITAL S (0xa731) - case u'ꜳ': // LATIN SMALL AA (0xa733) - case u'ꜵ': // LATIN SMALL AO (0xa735) - case u'ꜷ': // LATIN SMALL AU (0xa737) - case u'ꜹ': // LATIN SMALL AV (0xa739) - case u'ꜻ': // LATIN SMALL AV W/ HORIZONTAL BAR (0xa73b) - case u'ꜽ': // LATIN SMALL AY (0xa73d) - case u'ꜿ': // LATIN SMALL REVERSED C W/ DOT (0xa73f) - case u'ꝁ': // LATIN SMALL K W/ STROKE (0xa741) - case u'ꝃ': // LATIN SMALL K W/ DIAGONAL STROKE (0xa743) - case u'ꝅ': // LATIN SMALL K W/ STROKE AND DIAGONAL STROKE (0xa745) - case u'ꝇ': // LATIN SMALL BROKEN L (0xa747) - case u'ꝉ': // LATIN SMALL L W/ HIGH STROKE (0xa749) - case u'ꝋ': // LATIN SMALL O W/ LONG STROKE OVERLAY (0xa74b) - case u'ꝍ': // LATIN SMALL O W/ LOOP (0xa74d) - case u'ꝏ': // LATIN SMALL OO (0xa74f) - case u'ꝑ': // LATIN SMALL P W/ STROKE THROUGH DESCENDER (0xa751) - case u'ꝓ': // LATIN SMALL P W/ FLOURISH (0xa753) - case u'ꝕ': // LATIN SMALL P W/ SQUIRREL TAIL (0xa755) - case u'ꝗ': // LATIN SMALL Q W/ STROKE THROUGH DESCENDER (0xa757) - case u'ꝙ': // LATIN SMALL Q W/ DIAGONAL STROKE (0xa759) - case u'ꝛ': // LATIN SMALL R ROTUNDA (0xa75b) - case u'ꝝ': // LATIN SMALL RUM ROTUNDA (0xa75d) - case u'ꝟ': // LATIN SMALL V W/ DIAGONAL STROKE (0xa75f) - case u'ꝡ': // LATIN SMALL VY (0xa761) - case u'ꝣ': // LATIN SMALL VISIGOTHIC Z (0xa763) - case u'ꝥ': // LATIN SMALL THORN W/ STROKE (0xa765) - case u'ꝧ': // LATIN SMALL THORN W/ STROKE THROUGH DESCENDER (0xa767) - case u'ꝩ': // LATIN SMALL VEND (0xa769) - case u'ꝫ': // LATIN SMALL ET (0xa76b) - case u'ꝭ': // LATIN SMALL IS (0xa76d) - case u'ꝯ': // LATIN SMALL CON (0xa76f) - case u'ꝱ': // LATIN SMALL DUM (0xa771) - case u'ꝲ': // LATIN SMALL LUM (0xa772) - case u'ꝳ': // LATIN SMALL MUM (0xa773) - case u'ꝴ': // LATIN SMALL NUM (0xa774) - case u'ꝵ': // LATIN SMALL RUM (0xa775) - case u'ꝶ': // LATIN LETTER SMALL CAPITAL RUM (0xa776) - case u'ꝷ': // LATIN SMALL TUM (0xa777) - case u'ꝸ': // LATIN SMALL UM (0xa778) - case u'ꝺ': // LATIN SMALL INSULAR D (0xa77a) - case u'ꝼ': // LATIN SMALL INSULAR F (0xa77c) - case u'ꝿ': // LATIN SMALL TURNED INSULAR G (0xa77f) - case u'ꞁ': // LATIN SMALL TURNED L (0xa781) - case u'ꞃ': // LATIN SMALL INSULAR R (0xa783) - case u'ꞅ': // LATIN SMALL INSULAR S (0xa785) - case u'ꞇ': // LATIN SMALL INSULAR T (0xa787) - case u'ꞌ': // LATIN SMALL SALTILLO (0xa78c) - case u'ꞎ': // LATIN SMALL L W/ RETROFLEX HOOK AND BELT (0xa78e) - case u'ꞑ': // LATIN SMALL N W/ DESCENDER (0xa791) - case u'ꞓ': // LATIN SMALL C W/ BAR (0xa793) - case u'ꞔ': // LATIN SMALL C W/ PALATAL HOOK (0xa794) - case u'ꞕ': // LATIN SMALL H W/ PALATAL HOOK (0xa795) - case u'ꞗ': // LATIN SMALL B W/ FLOURISH (0xa797) - case u'ꞙ': // LATIN SMALL F W/ STROKE (0xa799) - case u'ꞛ': // LATIN SMALL VOLAPUK AE (0xa79b) - case u'ꞝ': // LATIN SMALL VOLAPUK OE (0xa79d) - case u'ꞟ': // LATIN SMALL VOLAPUK UE (0xa79f) - case u'ꞡ': // LATIN SMALL G W/ OBLIQUE STROKE (0xa7a1) - case u'ꞣ': // LATIN SMALL K W/ OBLIQUE STROKE (0xa7a3) - case u'ꞥ': // LATIN SMALL N W/ OBLIQUE STROKE (0xa7a5) - case u'ꞧ': // LATIN SMALL R W/ OBLIQUE STROKE (0xa7a7) - case u'ꞩ': // LATIN SMALL S W/ OBLIQUE STROKE (0xa7a9) - case u'ꞯ': // LATIN LETTER SMALL CAPITAL Q (0xa7af) - case u'ꞵ': // LATIN SMALL BETA (0xa7b5) - case u'ꞷ': // LATIN SMALL OMEGA (0xa7b7) - case u'ꞹ': // LATIN SMALL U W/ STROKE (0xa7b9) - case u'ꞻ': // LATIN SMALL GLOTTAL A (0xa7bb) - case u'ꞽ': // LATIN SMALL GLOTTAL I (0xa7bd) - case u'ꞿ': // LATIN SMALL GLOTTAL U (0xa7bf) - case u'ꟃ': // LATIN SMALL ANGLICANA W (0xa7c3) - case u'ꟺ': // LATIN LETTER SMALL CAPITAL TURNED M (0xa7fa) - case u'ꬰ': // LATIN SMALL BARRED ALPHA (0xab30) - case u'ꬱ': // LATIN SMALL A REVERSED-SCHWA (0xab31) - case u'ꬲ': // LATIN SMALL BLACKLETTER E (0xab32) - case u'ꬳ': // LATIN SMALL BARRED E (0xab33) - case u'ꬴ': // LATIN SMALL E W/ FLOURISH (0xab34) - case u'ꬵ': // LATIN SMALL LENIS F (0xab35) - case u'ꬶ': // LATIN SMALL SCRIPT G W/ CROSSED-TAIL (0xab36) - case u'ꬷ': // LATIN SMALL L W/ INVERTED LAZY S (0xab37) - case u'ꬸ': // LATIN SMALL L W/ DOUBLE MIDDLE TILDE (0xab38) - case u'ꬹ': // LATIN SMALL L W/ MIDDLE RING (0xab39) - case u'ꬺ': // LATIN SMALL M W/ CROSSED-TAIL (0xab3a) - case u'ꬻ': // LATIN SMALL N W/ CROSSED-TAIL (0xab3b) - case u'ꬼ': // LATIN SMALL ENG W/ CROSSED-TAIL (0xab3c) - case u'ꬽ': // LATIN SMALL BLACKLETTER O (0xab3d) - case u'ꬾ': // LATIN SMALL BLACKLETTER O W/ STROKE (0xab3e) - case u'ꬿ': // LATIN SMALL OPEN O W/ STROKE (0xab3f) - case u'ꭀ': // LATIN SMALL INVERTED OE (0xab40) - case u'ꭁ': // LATIN SMALL TURNED OE W/ STROKE (0xab41) - case u'ꭂ': // LATIN SMALL TURNED OE W/ HORIZONTAL STROKE (0xab42) - case u'ꭃ': // LATIN SMALL TURNED O OPEN-O (0xab43) - case u'ꭄ': // LATIN SMALL TURNED O OPEN-O W/ STROKE (0xab44) - case u'ꭅ': // LATIN SMALL STIRRUP R (0xab45) - case u'ꭆ': // LATIN LETTER SMALL CAPITAL R W/ RIGHT LEG (0xab46) - case u'ꭇ': // LATIN SMALL R WITHOUT HANDLE (0xab47) - case u'ꭈ': // LATIN SMALL DOUBLE R (0xab48) - case u'ꭉ': // LATIN SMALL R W/ CROSSED-TAIL (0xab49) - case u'ꭊ': // LATIN SMALL DOUBLE R W/ CROSSED-TAIL (0xab4a) - case u'ꭋ': // LATIN SMALL SCRIPT R (0xab4b) - case u'ꭌ': // LATIN SMALL SCRIPT R W/ RING (0xab4c) - case u'ꭍ': // LATIN SMALL BASELINE ESH (0xab4d) - case u'ꭎ': // LATIN SMALL U W/ SHORT RIGHT LEG (0xab4e) - case u'ꭏ': // LATIN SMALL U BAR W/ SHORT RIGHT LEG (0xab4f) - case u'ꭐ': // LATIN SMALL UI (0xab50) - case u'ꭑ': // LATIN SMALL TURNED UI (0xab51) - case u'ꭒ': // LATIN SMALL U W/ LEFT HOOK (0xab52) - case u'ꭓ': // LATIN SMALL CHI (0xab53) - case u'ꭔ': // LATIN SMALL CHI W/ LOW RIGHT RING (0xab54) - case u'ꭕ': // LATIN SMALL CHI W/ LOW LEFT SERIF (0xab55) - case u'ꭖ': // LATIN SMALL X W/ LOW RIGHT RING (0xab56) - case u'ꭗ': // LATIN SMALL X W/ LONG LEFT LEG (0xab57) - case u'ꭘ': // LATIN SMALL X W/ LONG LEFT LEG AND LOW RIGHT RING (0xab58) - case u'ꭙ': // LATIN SMALL X W/ LONG LEFT LEG W/ SERIF (0xab59) - case u'ꭚ': // LATIN SMALL Y W/ SHORT RIGHT LEG (0xab5a) - case u'ꭠ': // LATIN SMALL SAKHA YAT (0xab60) - case u'ꭡ': // LATIN SMALL IOTIFIED E (0xab61) - case u'ꭢ': // LATIN SMALL OPEN OE (0xab62) - case u'ꭣ': // LATIN SMALL UO (0xab63) - case u'ꭤ': // LATIN SMALL INVERTED ALPHA (0xab64) - case u'ꭥ': // GREEK LETTER SMALL CAPITAL OMEGA (0xab65) - case u'ꭦ': // LATIN SMALL DZ DIGRAPH W/ RETROFLEX HOOK (0xab66) - case u'ꭧ': // LATIN SMALL TS DIGRAPH W/ RETROFLEX HOOK (0xab67) - case u'ꭰ': // CHEROKEE SMALL A (0xab70) - case u'ꭱ': // CHEROKEE SMALL E (0xab71) - case u'ꭲ': // CHEROKEE SMALL I (0xab72) - case u'ꭳ': // CHEROKEE SMALL O (0xab73) - case u'ꭴ': // CHEROKEE SMALL U (0xab74) - case u'ꭵ': // CHEROKEE SMALL V (0xab75) - case u'ꭶ': // CHEROKEE SMALL GA (0xab76) - case u'ꭷ': // CHEROKEE SMALL KA (0xab77) - case u'ꭸ': // CHEROKEE SMALL GE (0xab78) - case u'ꭹ': // CHEROKEE SMALL GI (0xab79) - case u'ꭺ': // CHEROKEE SMALL GO (0xab7a) - case u'ꭻ': // CHEROKEE SMALL GU (0xab7b) - case u'ꭼ': // CHEROKEE SMALL GV (0xab7c) - case u'ꭽ': // CHEROKEE SMALL HA (0xab7d) - case u'ꭾ': // CHEROKEE SMALL HE (0xab7e) - case u'ꭿ': // CHEROKEE SMALL HI (0xab7f) - case u'ꮀ': // CHEROKEE SMALL HO (0xab80) - case u'ꮁ': // CHEROKEE SMALL HU (0xab81) - case u'ꮂ': // CHEROKEE SMALL HV (0xab82) - case u'ꮃ': // CHEROKEE SMALL LA (0xab83) - case u'ꮄ': // CHEROKEE SMALL LE (0xab84) - case u'ꮅ': // CHEROKEE SMALL LI (0xab85) - case u'ꮆ': // CHEROKEE SMALL LO (0xab86) - case u'ꮇ': // CHEROKEE SMALL LU (0xab87) - case u'ꮈ': // CHEROKEE SMALL LV (0xab88) - case u'ꮉ': // CHEROKEE SMALL MA (0xab89) - case u'ꮊ': // CHEROKEE SMALL ME (0xab8a) - case u'ꮋ': // CHEROKEE SMALL MI (0xab8b) - case u'ꮌ': // CHEROKEE SMALL MO (0xab8c) - case u'ꮍ': // CHEROKEE SMALL MU (0xab8d) - case u'ꮎ': // CHEROKEE SMALL NA (0xab8e) - case u'ꮏ': // CHEROKEE SMALL HNA (0xab8f) - case u'ꮐ': // CHEROKEE SMALL NAH (0xab90) - case u'ꮑ': // CHEROKEE SMALL NE (0xab91) - case u'ꮒ': // CHEROKEE SMALL NI (0xab92) - case u'ꮓ': // CHEROKEE SMALL NO (0xab93) - case u'ꮔ': // CHEROKEE SMALL NU (0xab94) - case u'ꮕ': // CHEROKEE SMALL NV (0xab95) - case u'ꮖ': // CHEROKEE SMALL QUA (0xab96) - case u'ꮗ': // CHEROKEE SMALL QUE (0xab97) - case u'ꮘ': // CHEROKEE SMALL QUI (0xab98) - case u'ꮙ': // CHEROKEE SMALL QUO (0xab99) - case u'ꮚ': // CHEROKEE SMALL QUU (0xab9a) - case u'ꮛ': // CHEROKEE SMALL QUV (0xab9b) - case u'ꮜ': // CHEROKEE SMALL SA (0xab9c) - case u'ꮝ': // CHEROKEE SMALL S (0xab9d) - case u'ꮞ': // CHEROKEE SMALL SE (0xab9e) - case u'ꮟ': // CHEROKEE SMALL SI (0xab9f) - case u'ꮠ': // CHEROKEE SMALL SO (0xaba0) - case u'ꮡ': // CHEROKEE SMALL SU (0xaba1) - case u'ꮢ': // CHEROKEE SMALL SV (0xaba2) - case u'ꮣ': // CHEROKEE SMALL DA (0xaba3) - case u'ꮤ': // CHEROKEE SMALL TA (0xaba4) - case u'ꮥ': // CHEROKEE SMALL DE (0xaba5) - case u'ꮦ': // CHEROKEE SMALL TE (0xaba6) - case u'ꮧ': // CHEROKEE SMALL DI (0xaba7) - case u'ꮨ': // CHEROKEE SMALL TI (0xaba8) - case u'ꮩ': // CHEROKEE SMALL DO (0xaba9) - case u'ꮪ': // CHEROKEE SMALL DU (0xabaa) - case u'ꮫ': // CHEROKEE SMALL DV (0xabab) - case u'ꮬ': // CHEROKEE SMALL DLA (0xabac) - case u'ꮭ': // CHEROKEE SMALL TLA (0xabad) - case u'ꮮ': // CHEROKEE SMALL TLE (0xabae) - case u'ꮯ': // CHEROKEE SMALL TLI (0xabaf) - case u'ꮰ': // CHEROKEE SMALL TLO (0xabb0) - case u'ꮱ': // CHEROKEE SMALL TLU (0xabb1) - case u'ꮲ': // CHEROKEE SMALL TLV (0xabb2) - case u'ꮳ': // CHEROKEE SMALL TSA (0xabb3) - case u'ꮴ': // CHEROKEE SMALL TSE (0xabb4) - case u'ꮵ': // CHEROKEE SMALL TSI (0xabb5) - case u'ꮶ': // CHEROKEE SMALL TSO (0xabb6) - case u'ꮷ': // CHEROKEE SMALL TSU (0xabb7) - case u'ꮸ': // CHEROKEE SMALL TSV (0xabb8) - case u'ꮹ': // CHEROKEE SMALL WA (0xabb9) - case u'ꮺ': // CHEROKEE SMALL WE (0xabba) - case u'ꮻ': // CHEROKEE SMALL WI (0xabbb) - case u'ꮼ': // CHEROKEE SMALL WO (0xabbc) - case u'ꮽ': // CHEROKEE SMALL WU (0xabbd) - case u'ꮾ': // CHEROKEE SMALL WV (0xabbe) - case u'ꮿ': // CHEROKEE SMALL YA (0xabbf) - case u'ff': // LATIN SMALL LIGATURE FF (0xfb00) - case u'fi': // LATIN SMALL LIGATURE FI (0xfb01) - case u'fl': // LATIN SMALL LIGATURE FL (0xfb02) - case u'ffi': // LATIN SMALL LIGATURE FFI (0xfb03) - case u'ffl': // LATIN SMALL LIGATURE FFL (0xfb04) - case u'ſt': // LATIN SMALL LIGATURE LONG S T (0xfb05) - case u'st': // LATIN SMALL LIGATURE ST (0xfb06) - case u'ﬓ': // ARMENIAN SMALL LIGATURE MEN NOW (0xfb13) - case u'ﬔ': // ARMENIAN SMALL LIGATURE MEN ECH (0xfb14) - case u'ﬕ': // ARMENIAN SMALL LIGATURE MEN INI (0xfb15) - case u'ﬖ': // ARMENIAN SMALL LIGATURE VEW NOW (0xfb16) - case u'ﬗ': // ARMENIAN SMALL LIGATURE MEN XEH (0xfb17) - case u'a': // FULLWIDTH LATIN SMALL A (0xff41) - case u'b': // FULLWIDTH LATIN SMALL B (0xff42) - case u'c': // FULLWIDTH LATIN SMALL C (0xff43) - case u'd': // FULLWIDTH LATIN SMALL D (0xff44) - case u'e': // FULLWIDTH LATIN SMALL E (0xff45) - case u'f': // FULLWIDTH LATIN SMALL F (0xff46) - case u'g': // FULLWIDTH LATIN SMALL G (0xff47) - case u'h': // FULLWIDTH LATIN SMALL H (0xff48) - case u'i': // FULLWIDTH LATIN SMALL I (0xff49) - case u'j': // FULLWIDTH LATIN SMALL J (0xff4a) - case u'k': // FULLWIDTH LATIN SMALL K (0xff4b) - case u'l': // FULLWIDTH LATIN SMALL L (0xff4c) - case u'm': // FULLWIDTH LATIN SMALL M (0xff4d) - case u'n': // FULLWIDTH LATIN SMALL N (0xff4e) - case u'o': // FULLWIDTH LATIN SMALL O (0xff4f) - case u'p': // FULLWIDTH LATIN SMALL P (0xff50) - case u'q': // FULLWIDTH LATIN SMALL Q (0xff51) - case u'r': // FULLWIDTH LATIN SMALL R (0xff52) - case u's': // FULLWIDTH LATIN SMALL S (0xff53) - case u't': // FULLWIDTH LATIN SMALL T (0xff54) - case u'u': // FULLWIDTH LATIN SMALL U (0xff55) - case u'v': // FULLWIDTH LATIN SMALL V (0xff56) - case u'w': // FULLWIDTH LATIN SMALL W (0xff57) - case u'x': // FULLWIDTH LATIN SMALL X (0xff58) - case u'y': // FULLWIDTH LATIN SMALL Y (0xff59) - case u'z': // FULLWIDTH LATIN SMALL Z (0xff5a) - case L'𐐨': // DESERET SMALL LONG I (0x10428) - case L'𐐩': // DESERET SMALL LONG E (0x10429) - case L'𐐪': // DESERET SMALL LONG A (0x1042a) - case L'𐐫': // DESERET SMALL LONG AH (0x1042b) - case L'𐐬': // DESERET SMALL LONG O (0x1042c) - case L'𐐭': // DESERET SMALL LONG OO (0x1042d) - case L'𐐮': // DESERET SMALL SHORT I (0x1042e) - case L'𐐯': // DESERET SMALL SHORT E (0x1042f) - case L'𐐰': // DESERET SMALL SHORT A (0x10430) - case L'𐐱': // DESERET SMALL SHORT AH (0x10431) - case L'𐐲': // DESERET SMALL SHORT O (0x10432) - case L'𐐳': // DESERET SMALL SHORT OO (0x10433) - case L'𐐴': // DESERET SMALL AY (0x10434) - case L'𐐵': // DESERET SMALL OW (0x10435) - case L'𐐶': // DESERET SMALL WU (0x10436) - case L'𐐷': // DESERET SMALL YEE (0x10437) - case L'𐐸': // DESERET SMALL H (0x10438) - case L'𐐹': // DESERET SMALL PEE (0x10439) - case L'𐐺': // DESERET SMALL BEE (0x1043a) - case L'𐐻': // DESERET SMALL TEE (0x1043b) - case L'𐐼': // DESERET SMALL DEE (0x1043c) - case L'𐐽': // DESERET SMALL CHEE (0x1043d) - case L'𐐾': // DESERET SMALL JEE (0x1043e) - case L'𐐿': // DESERET SMALL KAY (0x1043f) - case L'𐑀': // DESERET SMALL GAY (0x10440) - case L'𐑁': // DESERET SMALL EF (0x10441) - case L'𐑂': // DESERET SMALL VEE (0x10442) - case L'𐑃': // DESERET SMALL ETH (0x10443) - case L'𐑄': // DESERET SMALL THEE (0x10444) - case L'𐑅': // DESERET SMALL ES (0x10445) - case L'𐑆': // DESERET SMALL ZEE (0x10446) - case L'𐑇': // DESERET SMALL ESH (0x10447) - case L'𐑈': // DESERET SMALL ZHEE (0x10448) - case L'𐑉': // DESERET SMALL ER (0x10449) - case L'𐑊': // DESERET SMALL EL (0x1044a) - case L'𐑋': // DESERET SMALL EM (0x1044b) - case L'𐑌': // DESERET SMALL EN (0x1044c) - case L'𐑍': // DESERET SMALL ENG (0x1044d) - case L'𐑎': // DESERET SMALL OI (0x1044e) - case L'𐑏': // DESERET SMALL EW (0x1044f) - case L'𐓘': // OSAGE SMALL A (0x104d8) - case L'𐓙': // OSAGE SMALL AI (0x104d9) - case L'𐓚': // OSAGE SMALL AIN (0x104da) - case L'𐓛': // OSAGE SMALL AH (0x104db) - case L'𐓜': // OSAGE SMALL BRA (0x104dc) - case L'𐓝': // OSAGE SMALL CHA (0x104dd) - case L'𐓞': // OSAGE SMALL EHCHA (0x104de) - case L'𐓟': // OSAGE SMALL E (0x104df) - case L'𐓠': // OSAGE SMALL EIN (0x104e0) - case L'𐓡': // OSAGE SMALL HA (0x104e1) - case L'𐓢': // OSAGE SMALL HYA (0x104e2) - case L'𐓣': // OSAGE SMALL I (0x104e3) - case L'𐓤': // OSAGE SMALL KA (0x104e4) - case L'𐓥': // OSAGE SMALL EHKA (0x104e5) - case L'𐓦': // OSAGE SMALL KYA (0x104e6) - case L'𐓧': // OSAGE SMALL LA (0x104e7) - case L'𐓨': // OSAGE SMALL MA (0x104e8) - case L'𐓩': // OSAGE SMALL NA (0x104e9) - case L'𐓪': // OSAGE SMALL O (0x104ea) - case L'𐓫': // OSAGE SMALL OIN (0x104eb) - case L'𐓬': // OSAGE SMALL PA (0x104ec) - case L'𐓭': // OSAGE SMALL EHPA (0x104ed) - case L'𐓮': // OSAGE SMALL SA (0x104ee) - case L'𐓯': // OSAGE SMALL SHA (0x104ef) - case L'𐓰': // OSAGE SMALL TA (0x104f0) - case L'𐓱': // OSAGE SMALL EHTA (0x104f1) - case L'𐓲': // OSAGE SMALL TSA (0x104f2) - case L'𐓳': // OSAGE SMALL EHTSA (0x104f3) - case L'𐓴': // OSAGE SMALL TSHA (0x104f4) - case L'𐓵': // OSAGE SMALL DHA (0x104f5) - case L'𐓶': // OSAGE SMALL U (0x104f6) - case L'𐓷': // OSAGE SMALL WA (0x104f7) - case L'𐓸': // OSAGE SMALL KHA (0x104f8) - case L'𐓹': // OSAGE SMALL GHA (0x104f9) - case L'𐓺': // OSAGE SMALL ZA (0x104fa) - case L'𐓻': // OSAGE SMALL ZHA (0x104fb) - case L'𐳀': // OLD HUNGARIAN SMALL A (0x10cc0) - case L'𐳁': // OLD HUNGARIAN SMALL AA (0x10cc1) - case L'𐳂': // OLD HUNGARIAN SMALL EB (0x10cc2) - case L'𐳃': // OLD HUNGARIAN SMALL AMB (0x10cc3) - case L'𐳄': // OLD HUNGARIAN SMALL EC (0x10cc4) - case L'𐳅': // OLD HUNGARIAN SMALL ENC (0x10cc5) - case L'𐳆': // OLD HUNGARIAN SMALL ECS (0x10cc6) - case L'𐳇': // OLD HUNGARIAN SMALL ED (0x10cc7) - case L'𐳈': // OLD HUNGARIAN SMALL AND (0x10cc8) - case L'𐳉': // OLD HUNGARIAN SMALL E (0x10cc9) - case L'𐳊': // OLD HUNGARIAN SMALL CLOSE E (0x10cca) - case L'𐳋': // OLD HUNGARIAN SMALL EE (0x10ccb) - case L'𐳌': // OLD HUNGARIAN SMALL EF (0x10ccc) - case L'𐳍': // OLD HUNGARIAN SMALL EG (0x10ccd) - case L'𐳎': // OLD HUNGARIAN SMALL EGY (0x10cce) - case L'𐳏': // OLD HUNGARIAN SMALL EH (0x10ccf) - case L'𐳐': // OLD HUNGARIAN SMALL I (0x10cd0) - case L'𐳑': // OLD HUNGARIAN SMALL II (0x10cd1) - case L'𐳒': // OLD HUNGARIAN SMALL EJ (0x10cd2) - case L'𐳓': // OLD HUNGARIAN SMALL EK (0x10cd3) - case L'𐳔': // OLD HUNGARIAN SMALL AK (0x10cd4) - case L'𐳕': // OLD HUNGARIAN SMALL UNK (0x10cd5) - case L'𐳖': // OLD HUNGARIAN SMALL EL (0x10cd6) - case L'𐳗': // OLD HUNGARIAN SMALL ELY (0x10cd7) - case L'𐳘': // OLD HUNGARIAN SMALL EM (0x10cd8) - case L'𐳙': // OLD HUNGARIAN SMALL EN (0x10cd9) - case L'𐳚': // OLD HUNGARIAN SMALL ENY (0x10cda) - case L'𐳛': // OLD HUNGARIAN SMALL O (0x10cdb) - case L'𐳜': // OLD HUNGARIAN SMALL OO (0x10cdc) - case L'𐳝': // OLD HUNGARIAN SMALL NIKOLSBURG OE (0x10cdd) - case L'𐳞': // OLD HUNGARIAN SMALL RUDIMENTA OE (0x10cde) - case L'𐳟': // OLD HUNGARIAN SMALL OEE (0x10cdf) - case L'𐳠': // OLD HUNGARIAN SMALL EP (0x10ce0) - case L'𐳡': // OLD HUNGARIAN SMALL EMP (0x10ce1) - case L'𐳢': // OLD HUNGARIAN SMALL ER (0x10ce2) - case L'𐳣': // OLD HUNGARIAN SMALL SHORT ER (0x10ce3) - case L'𐳤': // OLD HUNGARIAN SMALL ES (0x10ce4) - case L'𐳥': // OLD HUNGARIAN SMALL ESZ (0x10ce5) - case L'𐳦': // OLD HUNGARIAN SMALL ET (0x10ce6) - case L'𐳧': // OLD HUNGARIAN SMALL ENT (0x10ce7) - case L'𐳨': // OLD HUNGARIAN SMALL ETY (0x10ce8) - case L'𐳩': // OLD HUNGARIAN SMALL ECH (0x10ce9) - case L'𐳪': // OLD HUNGARIAN SMALL U (0x10cea) - case L'𐳫': // OLD HUNGARIAN SMALL UU (0x10ceb) - case L'𐳬': // OLD HUNGARIAN SMALL NIKOLSBURG UE (0x10cec) - case L'𐳭': // OLD HUNGARIAN SMALL RUDIMENTA UE (0x10ced) - case L'𐳮': // OLD HUNGARIAN SMALL EV (0x10cee) - case L'𐳯': // OLD HUNGARIAN SMALL EZ (0x10cef) - case L'𐳰': // OLD HUNGARIAN SMALL EZS (0x10cf0) - case L'𐳱': // OLD HUNGARIAN SMALL ENT-SHAPED SIGN (0x10cf1) - case L'𐳲': // OLD HUNGARIAN SMALL US (0x10cf2) - case L'𑣀': // WARANG CITI SMALL NGAA (0x118c0) - case L'𑣁': // WARANG CITI SMALL A (0x118c1) - case L'𑣂': // WARANG CITI SMALL WI (0x118c2) - case L'𑣃': // WARANG CITI SMALL YU (0x118c3) - case L'𑣄': // WARANG CITI SMALL YA (0x118c4) - case L'𑣅': // WARANG CITI SMALL YO (0x118c5) - case L'𑣆': // WARANG CITI SMALL II (0x118c6) - case L'𑣇': // WARANG CITI SMALL UU (0x118c7) - case L'𑣈': // WARANG CITI SMALL E (0x118c8) - case L'𑣉': // WARANG CITI SMALL O (0x118c9) - case L'𑣊': // WARANG CITI SMALL ANG (0x118ca) - case L'𑣋': // WARANG CITI SMALL GA (0x118cb) - case L'𑣌': // WARANG CITI SMALL KO (0x118cc) - case L'𑣍': // WARANG CITI SMALL ENY (0x118cd) - case L'𑣎': // WARANG CITI SMALL YUJ (0x118ce) - case L'𑣏': // WARANG CITI SMALL UC (0x118cf) - case L'𑣐': // WARANG CITI SMALL ENN (0x118d0) - case L'𑣑': // WARANG CITI SMALL ODD (0x118d1) - case L'𑣒': // WARANG CITI SMALL TTE (0x118d2) - case L'𑣓': // WARANG CITI SMALL NUNG (0x118d3) - case L'𑣔': // WARANG CITI SMALL DA (0x118d4) - case L'𑣕': // WARANG CITI SMALL AT (0x118d5) - case L'𑣖': // WARANG CITI SMALL AM (0x118d6) - case L'𑣗': // WARANG CITI SMALL BU (0x118d7) - case L'𑣘': // WARANG CITI SMALL PU (0x118d8) - case L'𑣙': // WARANG CITI SMALL HIYO (0x118d9) - case L'𑣚': // WARANG CITI SMALL HOLO (0x118da) - case L'𑣛': // WARANG CITI SMALL HORR (0x118db) - case L'𑣜': // WARANG CITI SMALL HAR (0x118dc) - case L'𑣝': // WARANG CITI SMALL SSUU (0x118dd) - case L'𑣞': // WARANG CITI SMALL SII (0x118de) - case L'𑣟': // WARANG CITI SMALL VIYO (0x118df) - case L'𖹠': // MEDEFAIDRIN SMALL M (0x16e60) - case L'𖹡': // MEDEFAIDRIN SMALL S (0x16e61) - case L'𖹢': // MEDEFAIDRIN SMALL V (0x16e62) - case L'𖹣': // MEDEFAIDRIN SMALL W (0x16e63) - case L'𖹤': // MEDEFAIDRIN SMALL ATIU (0x16e64) - case L'𖹥': // MEDEFAIDRIN SMALL Z (0x16e65) - case L'𖹦': // MEDEFAIDRIN SMALL KP (0x16e66) - case L'𖹧': // MEDEFAIDRIN SMALL P (0x16e67) - case L'𖹨': // MEDEFAIDRIN SMALL T (0x16e68) - case L'𖹩': // MEDEFAIDRIN SMALL G (0x16e69) - case L'𖹪': // MEDEFAIDRIN SMALL F (0x16e6a) - case L'𖹫': // MEDEFAIDRIN SMALL I (0x16e6b) - case L'𖹬': // MEDEFAIDRIN SMALL K (0x16e6c) - case L'𖹭': // MEDEFAIDRIN SMALL A (0x16e6d) - case L'𖹮': // MEDEFAIDRIN SMALL J (0x16e6e) - case L'𖹯': // MEDEFAIDRIN SMALL E (0x16e6f) - case L'𖹰': // MEDEFAIDRIN SMALL B (0x16e70) - case L'𖹱': // MEDEFAIDRIN SMALL C (0x16e71) - case L'𖹲': // MEDEFAIDRIN SMALL U (0x16e72) - case L'𖹳': // MEDEFAIDRIN SMALL YU (0x16e73) - case L'𖹴': // MEDEFAIDRIN SMALL L (0x16e74) - case L'𖹵': // MEDEFAIDRIN SMALL Q (0x16e75) - case L'𖹶': // MEDEFAIDRIN SMALL HP (0x16e76) - case L'𖹷': // MEDEFAIDRIN SMALL NY (0x16e77) - case L'𖹸': // MEDEFAIDRIN SMALL X (0x16e78) - case L'𖹹': // MEDEFAIDRIN SMALL D (0x16e79) - case L'𖹺': // MEDEFAIDRIN SMALL OE (0x16e7a) - case L'𖹻': // MEDEFAIDRIN SMALL N (0x16e7b) - case L'𖹼': // MEDEFAIDRIN SMALL R (0x16e7c) - case L'𖹽': // MEDEFAIDRIN SMALL O (0x16e7d) - case L'𖹾': // MEDEFAIDRIN SMALL AI (0x16e7e) - case L'𖹿': // MEDEFAIDRIN SMALL Y (0x16e7f) - case L'𝐚': // MATHEMATICAL BOLD SMALL A (0x1d41a) - case L'𝐛': // MATHEMATICAL BOLD SMALL B (0x1d41b) - case L'𝐜': // MATHEMATICAL BOLD SMALL C (0x1d41c) - case L'𝐝': // MATHEMATICAL BOLD SMALL D (0x1d41d) - case L'𝐞': // MATHEMATICAL BOLD SMALL E (0x1d41e) - case L'𝐟': // MATHEMATICAL BOLD SMALL F (0x1d41f) - case L'𝐠': // MATHEMATICAL BOLD SMALL G (0x1d420) - case L'𝐡': // MATHEMATICAL BOLD SMALL H (0x1d421) - case L'𝐢': // MATHEMATICAL BOLD SMALL I (0x1d422) - case L'𝐣': // MATHEMATICAL BOLD SMALL J (0x1d423) - case L'𝐤': // MATHEMATICAL BOLD SMALL K (0x1d424) - case L'𝐥': // MATHEMATICAL BOLD SMALL L (0x1d425) - case L'𝐦': // MATHEMATICAL BOLD SMALL M (0x1d426) - case L'𝐧': // MATHEMATICAL BOLD SMALL N (0x1d427) - case L'𝐨': // MATHEMATICAL BOLD SMALL O (0x1d428) - case L'𝐩': // MATHEMATICAL BOLD SMALL P (0x1d429) - case L'𝐪': // MATHEMATICAL BOLD SMALL Q (0x1d42a) - case L'𝐫': // MATHEMATICAL BOLD SMALL R (0x1d42b) - case L'𝐬': // MATHEMATICAL BOLD SMALL S (0x1d42c) - case L'𝐭': // MATHEMATICAL BOLD SMALL T (0x1d42d) - case L'𝐮': // MATHEMATICAL BOLD SMALL U (0x1d42e) - case L'𝐯': // MATHEMATICAL BOLD SMALL V (0x1d42f) - case L'𝐰': // MATHEMATICAL BOLD SMALL W (0x1d430) - case L'𝐱': // MATHEMATICAL BOLD SMALL X (0x1d431) - case L'𝐲': // MATHEMATICAL BOLD SMALL Y (0x1d432) - case L'𝐳': // MATHEMATICAL BOLD SMALL Z (0x1d433) - case L'𝑎': // MATHEMATICAL ITALIC SMALL A (0x1d44e) - case L'𝑏': // MATHEMATICAL ITALIC SMALL B (0x1d44f) - case L'𝑐': // MATHEMATICAL ITALIC SMALL C (0x1d450) - case L'𝑑': // MATHEMATICAL ITALIC SMALL D (0x1d451) - case L'𝑒': // MATHEMATICAL ITALIC SMALL E (0x1d452) - case L'𝑓': // MATHEMATICAL ITALIC SMALL F (0x1d453) - case L'𝑔': // MATHEMATICAL ITALIC SMALL G (0x1d454) - case L'𝑖': // MATHEMATICAL ITALIC SMALL I (0x1d456) - case L'𝑗': // MATHEMATICAL ITALIC SMALL J (0x1d457) - case L'𝑘': // MATHEMATICAL ITALIC SMALL K (0x1d458) - case L'𝑙': // MATHEMATICAL ITALIC SMALL L (0x1d459) - case L'𝑚': // MATHEMATICAL ITALIC SMALL M (0x1d45a) - case L'𝑛': // MATHEMATICAL ITALIC SMALL N (0x1d45b) - case L'𝑜': // MATHEMATICAL ITALIC SMALL O (0x1d45c) - case L'𝑝': // MATHEMATICAL ITALIC SMALL P (0x1d45d) - case L'𝑞': // MATHEMATICAL ITALIC SMALL Q (0x1d45e) - case L'𝑟': // MATHEMATICAL ITALIC SMALL R (0x1d45f) - case L'𝑠': // MATHEMATICAL ITALIC SMALL S (0x1d460) - case L'𝑡': // MATHEMATICAL ITALIC SMALL T (0x1d461) - case L'𝑢': // MATHEMATICAL ITALIC SMALL U (0x1d462) - case L'𝑣': // MATHEMATICAL ITALIC SMALL V (0x1d463) - case L'𝑤': // MATHEMATICAL ITALIC SMALL W (0x1d464) - case L'𝑥': // MATHEMATICAL ITALIC SMALL X (0x1d465) - case L'𝑦': // MATHEMATICAL ITALIC SMALL Y (0x1d466) - case L'𝑧': // MATHEMATICAL ITALIC SMALL Z (0x1d467) - case L'𝒂': // MATHEMATICAL BOLD ITALIC SMALL A (0x1d482) - case L'𝒃': // MATHEMATICAL BOLD ITALIC SMALL B (0x1d483) - case L'𝒄': // MATHEMATICAL BOLD ITALIC SMALL C (0x1d484) - case L'𝒅': // MATHEMATICAL BOLD ITALIC SMALL D (0x1d485) - case L'𝒆': // MATHEMATICAL BOLD ITALIC SMALL E (0x1d486) - case L'𝒇': // MATHEMATICAL BOLD ITALIC SMALL F (0x1d487) - case L'𝒈': // MATHEMATICAL BOLD ITALIC SMALL G (0x1d488) - case L'𝒉': // MATHEMATICAL BOLD ITALIC SMALL H (0x1d489) - case L'𝒊': // MATHEMATICAL BOLD ITALIC SMALL I (0x1d48a) - case L'𝒋': // MATHEMATICAL BOLD ITALIC SMALL J (0x1d48b) - case L'𝒌': // MATHEMATICAL BOLD ITALIC SMALL K (0x1d48c) - case L'𝒍': // MATHEMATICAL BOLD ITALIC SMALL L (0x1d48d) - case L'𝒎': // MATHEMATICAL BOLD ITALIC SMALL M (0x1d48e) - case L'𝒏': // MATHEMATICAL BOLD ITALIC SMALL N (0x1d48f) - case L'𝒐': // MATHEMATICAL BOLD ITALIC SMALL O (0x1d490) - case L'𝒑': // MATHEMATICAL BOLD ITALIC SMALL P (0x1d491) - case L'𝒒': // MATHEMATICAL BOLD ITALIC SMALL Q (0x1d492) - case L'𝒓': // MATHEMATICAL BOLD ITALIC SMALL R (0x1d493) - case L'𝒔': // MATHEMATICAL BOLD ITALIC SMALL S (0x1d494) - case L'𝒕': // MATHEMATICAL BOLD ITALIC SMALL T (0x1d495) - case L'𝒖': // MATHEMATICAL BOLD ITALIC SMALL U (0x1d496) - case L'𝒗': // MATHEMATICAL BOLD ITALIC SMALL V (0x1d497) - case L'𝒘': // MATHEMATICAL BOLD ITALIC SMALL W (0x1d498) - case L'𝒙': // MATHEMATICAL BOLD ITALIC SMALL X (0x1d499) - case L'𝒚': // MATHEMATICAL BOLD ITALIC SMALL Y (0x1d49a) - case L'𝒛': // MATHEMATICAL BOLD ITALIC SMALL Z (0x1d49b) - case L'𝒶': // MATHEMATICAL SCRIPT SMALL A (0x1d4b6) - case L'𝒷': // MATHEMATICAL SCRIPT SMALL B (0x1d4b7) - case L'𝒸': // MATHEMATICAL SCRIPT SMALL C (0x1d4b8) - case L'𝒹': // MATHEMATICAL SCRIPT SMALL D (0x1d4b9) - case L'𝒻': // MATHEMATICAL SCRIPT SMALL F (0x1d4bb) - case L'𝒽': // MATHEMATICAL SCRIPT SMALL H (0x1d4bd) - case L'𝒾': // MATHEMATICAL SCRIPT SMALL I (0x1d4be) - case L'𝒿': // MATHEMATICAL SCRIPT SMALL J (0x1d4bf) - case L'𝓀': // MATHEMATICAL SCRIPT SMALL K (0x1d4c0) - case L'𝓁': // MATHEMATICAL SCRIPT SMALL L (0x1d4c1) - case L'𝓂': // MATHEMATICAL SCRIPT SMALL M (0x1d4c2) - case L'𝓃': // MATHEMATICAL SCRIPT SMALL N (0x1d4c3) - case L'𝓅': // MATHEMATICAL SCRIPT SMALL P (0x1d4c5) - case L'𝓆': // MATHEMATICAL SCRIPT SMALL Q (0x1d4c6) - case L'𝓇': // MATHEMATICAL SCRIPT SMALL R (0x1d4c7) - case L'𝓈': // MATHEMATICAL SCRIPT SMALL S (0x1d4c8) - case L'𝓉': // MATHEMATICAL SCRIPT SMALL T (0x1d4c9) - case L'𝓊': // MATHEMATICAL SCRIPT SMALL U (0x1d4ca) - case L'𝓋': // MATHEMATICAL SCRIPT SMALL V (0x1d4cb) - case L'𝓌': // MATHEMATICAL SCRIPT SMALL W (0x1d4cc) - case L'𝓍': // MATHEMATICAL SCRIPT SMALL X (0x1d4cd) - case L'𝓎': // MATHEMATICAL SCRIPT SMALL Y (0x1d4ce) - case L'𝓏': // MATHEMATICAL SCRIPT SMALL Z (0x1d4cf) - case L'𝓪': // MATHEMATICAL BOLD SCRIPT SMALL A (0x1d4ea) - case L'𝓫': // MATHEMATICAL BOLD SCRIPT SMALL B (0x1d4eb) - case L'𝓬': // MATHEMATICAL BOLD SCRIPT SMALL C (0x1d4ec) - case L'𝓭': // MATHEMATICAL BOLD SCRIPT SMALL D (0x1d4ed) - case L'𝓮': // MATHEMATICAL BOLD SCRIPT SMALL E (0x1d4ee) - case L'𝓯': // MATHEMATICAL BOLD SCRIPT SMALL F (0x1d4ef) - case L'𝓰': // MATHEMATICAL BOLD SCRIPT SMALL G (0x1d4f0) - case L'𝓱': // MATHEMATICAL BOLD SCRIPT SMALL H (0x1d4f1) - case L'𝓲': // MATHEMATICAL BOLD SCRIPT SMALL I (0x1d4f2) - case L'𝓳': // MATHEMATICAL BOLD SCRIPT SMALL J (0x1d4f3) - case L'𝓴': // MATHEMATICAL BOLD SCRIPT SMALL K (0x1d4f4) - case L'𝓵': // MATHEMATICAL BOLD SCRIPT SMALL L (0x1d4f5) - case L'𝓶': // MATHEMATICAL BOLD SCRIPT SMALL M (0x1d4f6) - case L'𝓷': // MATHEMATICAL BOLD SCRIPT SMALL N (0x1d4f7) - case L'𝓸': // MATHEMATICAL BOLD SCRIPT SMALL O (0x1d4f8) - case L'𝓹': // MATHEMATICAL BOLD SCRIPT SMALL P (0x1d4f9) - case L'𝓺': // MATHEMATICAL BOLD SCRIPT SMALL Q (0x1d4fa) - case L'𝓻': // MATHEMATICAL BOLD SCRIPT SMALL R (0x1d4fb) - case L'𝓼': // MATHEMATICAL BOLD SCRIPT SMALL S (0x1d4fc) - case L'𝓽': // MATHEMATICAL BOLD SCRIPT SMALL T (0x1d4fd) - case L'𝓾': // MATHEMATICAL BOLD SCRIPT SMALL U (0x1d4fe) - case L'𝓿': // MATHEMATICAL BOLD SCRIPT SMALL V (0x1d4ff) - case L'𝔀': // MATHEMATICAL BOLD SCRIPT SMALL W (0x1d500) - case L'𝔁': // MATHEMATICAL BOLD SCRIPT SMALL X (0x1d501) - case L'𝔂': // MATHEMATICAL BOLD SCRIPT SMALL Y (0x1d502) - case L'𝔃': // MATHEMATICAL BOLD SCRIPT SMALL Z (0x1d503) - case L'𝔞': // MATHEMATICAL FRAKTUR SMALL A (0x1d51e) - case L'𝔟': // MATHEMATICAL FRAKTUR SMALL B (0x1d51f) - case L'𝔠': // MATHEMATICAL FRAKTUR SMALL C (0x1d520) - case L'𝔡': // MATHEMATICAL FRAKTUR SMALL D (0x1d521) - case L'𝔢': // MATHEMATICAL FRAKTUR SMALL E (0x1d522) - case L'𝔣': // MATHEMATICAL FRAKTUR SMALL F (0x1d523) - case L'𝔤': // MATHEMATICAL FRAKTUR SMALL G (0x1d524) - case L'𝔥': // MATHEMATICAL FRAKTUR SMALL H (0x1d525) - case L'𝔦': // MATHEMATICAL FRAKTUR SMALL I (0x1d526) - case L'𝔧': // MATHEMATICAL FRAKTUR SMALL J (0x1d527) - case L'𝔨': // MATHEMATICAL FRAKTUR SMALL K (0x1d528) - case L'𝔩': // MATHEMATICAL FRAKTUR SMALL L (0x1d529) - case L'𝔪': // MATHEMATICAL FRAKTUR SMALL M (0x1d52a) - case L'𝔫': // MATHEMATICAL FRAKTUR SMALL N (0x1d52b) - case L'𝔬': // MATHEMATICAL FRAKTUR SMALL O (0x1d52c) - case L'𝔭': // MATHEMATICAL FRAKTUR SMALL P (0x1d52d) - case L'𝔮': // MATHEMATICAL FRAKTUR SMALL Q (0x1d52e) - case L'𝔯': // MATHEMATICAL FRAKTUR SMALL R (0x1d52f) - case L'𝔰': // MATHEMATICAL FRAKTUR SMALL S (0x1d530) - case L'𝔱': // MATHEMATICAL FRAKTUR SMALL T (0x1d531) - case L'𝔲': // MATHEMATICAL FRAKTUR SMALL U (0x1d532) - case L'𝔳': // MATHEMATICAL FRAKTUR SMALL V (0x1d533) - case L'𝔴': // MATHEMATICAL FRAKTUR SMALL W (0x1d534) - case L'𝔵': // MATHEMATICAL FRAKTUR SMALL X (0x1d535) - case L'𝔶': // MATHEMATICAL FRAKTUR SMALL Y (0x1d536) - case L'𝔷': // MATHEMATICAL FRAKTUR SMALL Z (0x1d537) - case L'𝕒': // MATHEMATICAL DOUBLE-STRUCK SMALL A (0x1d552) - case L'𝕓': // MATHEMATICAL DOUBLE-STRUCK SMALL B (0x1d553) - case L'𝕔': // MATHEMATICAL DOUBLE-STRUCK SMALL C (0x1d554) - case L'𝕕': // MATHEMATICAL DOUBLE-STRUCK SMALL D (0x1d555) - case L'𝕖': // MATHEMATICAL DOUBLE-STRUCK SMALL E (0x1d556) - case L'𝕗': // MATHEMATICAL DOUBLE-STRUCK SMALL F (0x1d557) - case L'𝕘': // MATHEMATICAL DOUBLE-STRUCK SMALL G (0x1d558) - case L'𝕙': // MATHEMATICAL DOUBLE-STRUCK SMALL H (0x1d559) - case L'𝕚': // MATHEMATICAL DOUBLE-STRUCK SMALL I (0x1d55a) - case L'𝕛': // MATHEMATICAL DOUBLE-STRUCK SMALL J (0x1d55b) - case L'𝕜': // MATHEMATICAL DOUBLE-STRUCK SMALL K (0x1d55c) - case L'𝕝': // MATHEMATICAL DOUBLE-STRUCK SMALL L (0x1d55d) - case L'𝕞': // MATHEMATICAL DOUBLE-STRUCK SMALL M (0x1d55e) - case L'𝕟': // MATHEMATICAL DOUBLE-STRUCK SMALL N (0x1d55f) - case L'𝕠': // MATHEMATICAL DOUBLE-STRUCK SMALL O (0x1d560) - case L'𝕡': // MATHEMATICAL DOUBLE-STRUCK SMALL P (0x1d561) - case L'𝕢': // MATHEMATICAL DOUBLE-STRUCK SMALL Q (0x1d562) - case L'𝕣': // MATHEMATICAL DOUBLE-STRUCK SMALL R (0x1d563) - case L'𝕤': // MATHEMATICAL DOUBLE-STRUCK SMALL S (0x1d564) - case L'𝕥': // MATHEMATICAL DOUBLE-STRUCK SMALL T (0x1d565) - case L'𝕦': // MATHEMATICAL DOUBLE-STRUCK SMALL U (0x1d566) - case L'𝕧': // MATHEMATICAL DOUBLE-STRUCK SMALL V (0x1d567) - case L'𝕨': // MATHEMATICAL DOUBLE-STRUCK SMALL W (0x1d568) - case L'𝕩': // MATHEMATICAL DOUBLE-STRUCK SMALL X (0x1d569) - case L'𝕪': // MATHEMATICAL DOUBLE-STRUCK SMALL Y (0x1d56a) - case L'𝕫': // MATHEMATICAL DOUBLE-STRUCK SMALL Z (0x1d56b) - case L'𝖆': // MATHEMATICAL BOLD FRAKTUR SMALL A (0x1d586) - case L'𝖇': // MATHEMATICAL BOLD FRAKTUR SMALL B (0x1d587) - case L'𝖈': // MATHEMATICAL BOLD FRAKTUR SMALL C (0x1d588) - case L'𝖉': // MATHEMATICAL BOLD FRAKTUR SMALL D (0x1d589) - case L'𝖊': // MATHEMATICAL BOLD FRAKTUR SMALL E (0x1d58a) - case L'𝖋': // MATHEMATICAL BOLD FRAKTUR SMALL F (0x1d58b) - case L'𝖌': // MATHEMATICAL BOLD FRAKTUR SMALL G (0x1d58c) - case L'𝖍': // MATHEMATICAL BOLD FRAKTUR SMALL H (0x1d58d) - case L'𝖎': // MATHEMATICAL BOLD FRAKTUR SMALL I (0x1d58e) - case L'𝖏': // MATHEMATICAL BOLD FRAKTUR SMALL J (0x1d58f) - case L'𝖐': // MATHEMATICAL BOLD FRAKTUR SMALL K (0x1d590) - case L'𝖑': // MATHEMATICAL BOLD FRAKTUR SMALL L (0x1d591) - case L'𝖒': // MATHEMATICAL BOLD FRAKTUR SMALL M (0x1d592) - case L'𝖓': // MATHEMATICAL BOLD FRAKTUR SMALL N (0x1d593) - case L'𝖔': // MATHEMATICAL BOLD FRAKTUR SMALL O (0x1d594) - case L'𝖕': // MATHEMATICAL BOLD FRAKTUR SMALL P (0x1d595) - case L'𝖖': // MATHEMATICAL BOLD FRAKTUR SMALL Q (0x1d596) - case L'𝖗': // MATHEMATICAL BOLD FRAKTUR SMALL R (0x1d597) - case L'𝖘': // MATHEMATICAL BOLD FRAKTUR SMALL S (0x1d598) - case L'𝖙': // MATHEMATICAL BOLD FRAKTUR SMALL T (0x1d599) - case L'𝖚': // MATHEMATICAL BOLD FRAKTUR SMALL U (0x1d59a) - case L'𝖛': // MATHEMATICAL BOLD FRAKTUR SMALL V (0x1d59b) - case L'𝖜': // MATHEMATICAL BOLD FRAKTUR SMALL W (0x1d59c) - case L'𝖝': // MATHEMATICAL BOLD FRAKTUR SMALL X (0x1d59d) - case L'𝖞': // MATHEMATICAL BOLD FRAKTUR SMALL Y (0x1d59e) - case L'𝖟': // MATHEMATICAL BOLD FRAKTUR SMALL Z (0x1d59f) - case L'𝖺': // MATHEMATICAL SANS SMALL A (0x1d5ba) - case L'𝖻': // MATHEMATICAL SANS SMALL B (0x1d5bb) - case L'𝖼': // MATHEMATICAL SANS SMALL C (0x1d5bc) - case L'𝖽': // MATHEMATICAL SANS SMALL D (0x1d5bd) - case L'𝖾': // MATHEMATICAL SANS SMALL E (0x1d5be) - case L'𝖿': // MATHEMATICAL SANS SMALL F (0x1d5bf) - case L'𝗀': // MATHEMATICAL SANS SMALL G (0x1d5c0) - case L'𝗁': // MATHEMATICAL SANS SMALL H (0x1d5c1) - case L'𝗂': // MATHEMATICAL SANS SMALL I (0x1d5c2) - case L'𝗃': // MATHEMATICAL SANS SMALL J (0x1d5c3) - case L'𝗄': // MATHEMATICAL SANS SMALL K (0x1d5c4) - case L'𝗅': // MATHEMATICAL SANS SMALL L (0x1d5c5) - case L'𝗆': // MATHEMATICAL SANS SMALL M (0x1d5c6) - case L'𝗇': // MATHEMATICAL SANS SMALL N (0x1d5c7) - case L'𝗈': // MATHEMATICAL SANS SMALL O (0x1d5c8) - case L'𝗉': // MATHEMATICAL SANS SMALL P (0x1d5c9) - case L'𝗊': // MATHEMATICAL SANS SMALL Q (0x1d5ca) - case L'𝗋': // MATHEMATICAL SANS SMALL R (0x1d5cb) - case L'𝗌': // MATHEMATICAL SANS SMALL S (0x1d5cc) - case L'𝗍': // MATHEMATICAL SANS SMALL T (0x1d5cd) - case L'𝗎': // MATHEMATICAL SANS SMALL U (0x1d5ce) - case L'𝗏': // MATHEMATICAL SANS SMALL V (0x1d5cf) - case L'𝗐': // MATHEMATICAL SANS SMALL W (0x1d5d0) - case L'𝗑': // MATHEMATICAL SANS SMALL X (0x1d5d1) - case L'𝗒': // MATHEMATICAL SANS SMALL Y (0x1d5d2) - case L'𝗓': // MATHEMATICAL SANS SMALL Z (0x1d5d3) - case L'𝗮': // MATHEMATICAL SANS BOLD SMALL A (0x1d5ee) - case L'𝗯': // MATHEMATICAL SANS BOLD SMALL B (0x1d5ef) - case L'𝗰': // MATHEMATICAL SANS BOLD SMALL C (0x1d5f0) - case L'𝗱': // MATHEMATICAL SANS BOLD SMALL D (0x1d5f1) - case L'𝗲': // MATHEMATICAL SANS BOLD SMALL E (0x1d5f2) - case L'𝗳': // MATHEMATICAL SANS BOLD SMALL F (0x1d5f3) - case L'𝗴': // MATHEMATICAL SANS BOLD SMALL G (0x1d5f4) - case L'𝗵': // MATHEMATICAL SANS BOLD SMALL H (0x1d5f5) - case L'𝗶': // MATHEMATICAL SANS BOLD SMALL I (0x1d5f6) - case L'𝗷': // MATHEMATICAL SANS BOLD SMALL J (0x1d5f7) - case L'𝗸': // MATHEMATICAL SANS BOLD SMALL K (0x1d5f8) - case L'𝗹': // MATHEMATICAL SANS BOLD SMALL L (0x1d5f9) - case L'𝗺': // MATHEMATICAL SANS BOLD SMALL M (0x1d5fa) - case L'𝗻': // MATHEMATICAL SANS BOLD SMALL N (0x1d5fb) - case L'𝗼': // MATHEMATICAL SANS BOLD SMALL O (0x1d5fc) - case L'𝗽': // MATHEMATICAL SANS BOLD SMALL P (0x1d5fd) - case L'𝗾': // MATHEMATICAL SANS BOLD SMALL Q (0x1d5fe) - case L'𝗿': // MATHEMATICAL SANS BOLD SMALL R (0x1d5ff) - case L'𝘀': // MATHEMATICAL SANS BOLD SMALL S (0x1d600) - case L'𝘁': // MATHEMATICAL SANS BOLD SMALL T (0x1d601) - case L'𝘂': // MATHEMATICAL SANS BOLD SMALL U (0x1d602) - case L'𝘃': // MATHEMATICAL SANS BOLD SMALL V (0x1d603) - case L'𝘄': // MATHEMATICAL SANS BOLD SMALL W (0x1d604) - case L'𝘅': // MATHEMATICAL SANS BOLD SMALL X (0x1d605) - case L'𝘆': // MATHEMATICAL SANS BOLD SMALL Y (0x1d606) - case L'𝘇': // MATHEMATICAL SANS BOLD SMALL Z (0x1d607) - case L'𝘢': // MATHEMATICAL SANS ITALIC SMALL A (0x1d622) - case L'𝘣': // MATHEMATICAL SANS ITALIC SMALL B (0x1d623) - case L'𝘤': // MATHEMATICAL SANS ITALIC SMALL C (0x1d624) - case L'𝘥': // MATHEMATICAL SANS ITALIC SMALL D (0x1d625) - case L'𝘦': // MATHEMATICAL SANS ITALIC SMALL E (0x1d626) - case L'𝘧': // MATHEMATICAL SANS ITALIC SMALL F (0x1d627) - case L'𝘨': // MATHEMATICAL SANS ITALIC SMALL G (0x1d628) - case L'𝘩': // MATHEMATICAL SANS ITALIC SMALL H (0x1d629) - case L'𝘪': // MATHEMATICAL SANS ITALIC SMALL I (0x1d62a) - case L'𝘫': // MATHEMATICAL SANS ITALIC SMALL J (0x1d62b) - case L'𝘬': // MATHEMATICAL SANS ITALIC SMALL K (0x1d62c) - case L'𝘭': // MATHEMATICAL SANS ITALIC SMALL L (0x1d62d) - case L'𝘮': // MATHEMATICAL SANS ITALIC SMALL M (0x1d62e) - case L'𝘯': // MATHEMATICAL SANS ITALIC SMALL N (0x1d62f) - case L'𝘰': // MATHEMATICAL SANS ITALIC SMALL O (0x1d630) - case L'𝘱': // MATHEMATICAL SANS ITALIC SMALL P (0x1d631) - case L'𝘲': // MATHEMATICAL SANS ITALIC SMALL Q (0x1d632) - case L'𝘳': // MATHEMATICAL SANS ITALIC SMALL R (0x1d633) - case L'𝘴': // MATHEMATICAL SANS ITALIC SMALL S (0x1d634) - case L'𝘵': // MATHEMATICAL SANS ITALIC SMALL T (0x1d635) - case L'𝘶': // MATHEMATICAL SANS ITALIC SMALL U (0x1d636) - case L'𝘷': // MATHEMATICAL SANS ITALIC SMALL V (0x1d637) - case L'𝘸': // MATHEMATICAL SANS ITALIC SMALL W (0x1d638) - case L'𝘹': // MATHEMATICAL SANS ITALIC SMALL X (0x1d639) - case L'𝘺': // MATHEMATICAL SANS ITALIC SMALL Y (0x1d63a) - case L'𝘻': // MATHEMATICAL SANS ITALIC SMALL Z (0x1d63b) - case L'𝙖': // MATHEMATICAL SANS BOLD ITALIC SMALL A (0x1d656) - case L'𝙗': // MATHEMATICAL SANS BOLD ITALIC SMALL B (0x1d657) - case L'𝙘': // MATHEMATICAL SANS BOLD ITALIC SMALL C (0x1d658) - case L'𝙙': // MATHEMATICAL SANS BOLD ITALIC SMALL D (0x1d659) - case L'𝙚': // MATHEMATICAL SANS BOLD ITALIC SMALL E (0x1d65a) - case L'𝙛': // MATHEMATICAL SANS BOLD ITALIC SMALL F (0x1d65b) - case L'𝙜': // MATHEMATICAL SANS BOLD ITALIC SMALL G (0x1d65c) - case L'𝙝': // MATHEMATICAL SANS BOLD ITALIC SMALL H (0x1d65d) - case L'𝙞': // MATHEMATICAL SANS BOLD ITALIC SMALL I (0x1d65e) - case L'𝙟': // MATHEMATICAL SANS BOLD ITALIC SMALL J (0x1d65f) - case L'𝙠': // MATHEMATICAL SANS BOLD ITALIC SMALL K (0x1d660) - case L'𝙡': // MATHEMATICAL SANS BOLD ITALIC SMALL L (0x1d661) - case L'𝙢': // MATHEMATICAL SANS BOLD ITALIC SMALL M (0x1d662) - case L'𝙣': // MATHEMATICAL SANS BOLD ITALIC SMALL N (0x1d663) - case L'𝙤': // MATHEMATICAL SANS BOLD ITALIC SMALL O (0x1d664) - case L'𝙥': // MATHEMATICAL SANS BOLD ITALIC SMALL P (0x1d665) - case L'𝙦': // MATHEMATICAL SANS BOLD ITALIC SMALL Q (0x1d666) - case L'𝙧': // MATHEMATICAL SANS BOLD ITALIC SMALL R (0x1d667) - case L'𝙨': // MATHEMATICAL SANS BOLD ITALIC SMALL S (0x1d668) - case L'𝙩': // MATHEMATICAL SANS BOLD ITALIC SMALL T (0x1d669) - case L'𝙪': // MATHEMATICAL SANS BOLD ITALIC SMALL U (0x1d66a) - case L'𝙫': // MATHEMATICAL SANS BOLD ITALIC SMALL V (0x1d66b) - case L'𝙬': // MATHEMATICAL SANS BOLD ITALIC SMALL W (0x1d66c) - case L'𝙭': // MATHEMATICAL SANS BOLD ITALIC SMALL X (0x1d66d) - case L'𝙮': // MATHEMATICAL SANS BOLD ITALIC SMALL Y (0x1d66e) - case L'𝙯': // MATHEMATICAL SANS BOLD ITALIC SMALL Z (0x1d66f) - case L'𝚊': // MATHEMATICAL MONOSPACE SMALL A (0x1d68a) - case L'𝚋': // MATHEMATICAL MONOSPACE SMALL B (0x1d68b) - case L'𝚌': // MATHEMATICAL MONOSPACE SMALL C (0x1d68c) - case L'𝚍': // MATHEMATICAL MONOSPACE SMALL D (0x1d68d) - case L'𝚎': // MATHEMATICAL MONOSPACE SMALL E (0x1d68e) - case L'𝚏': // MATHEMATICAL MONOSPACE SMALL F (0x1d68f) - case L'𝚐': // MATHEMATICAL MONOSPACE SMALL G (0x1d690) - case L'𝚑': // MATHEMATICAL MONOSPACE SMALL H (0x1d691) - case L'𝚒': // MATHEMATICAL MONOSPACE SMALL I (0x1d692) - case L'𝚓': // MATHEMATICAL MONOSPACE SMALL J (0x1d693) - case L'𝚔': // MATHEMATICAL MONOSPACE SMALL K (0x1d694) - case L'𝚕': // MATHEMATICAL MONOSPACE SMALL L (0x1d695) - case L'𝚖': // MATHEMATICAL MONOSPACE SMALL M (0x1d696) - case L'𝚗': // MATHEMATICAL MONOSPACE SMALL N (0x1d697) - case L'𝚘': // MATHEMATICAL MONOSPACE SMALL O (0x1d698) - case L'𝚙': // MATHEMATICAL MONOSPACE SMALL P (0x1d699) - case L'𝚚': // MATHEMATICAL MONOSPACE SMALL Q (0x1d69a) - case L'𝚛': // MATHEMATICAL MONOSPACE SMALL R (0x1d69b) - case L'𝚜': // MATHEMATICAL MONOSPACE SMALL S (0x1d69c) - case L'𝚝': // MATHEMATICAL MONOSPACE SMALL T (0x1d69d) - case L'𝚞': // MATHEMATICAL MONOSPACE SMALL U (0x1d69e) - case L'𝚟': // MATHEMATICAL MONOSPACE SMALL V (0x1d69f) - case L'𝚠': // MATHEMATICAL MONOSPACE SMALL W (0x1d6a0) - case L'𝚡': // MATHEMATICAL MONOSPACE SMALL X (0x1d6a1) - case L'𝚢': // MATHEMATICAL MONOSPACE SMALL Y (0x1d6a2) - case L'𝚣': // MATHEMATICAL MONOSPACE SMALL Z (0x1d6a3) - case L'𝚤': // MATHEMATICAL ITALIC SMALL DOTLESS I (0x1d6a4) - case L'𝚥': // MATHEMATICAL ITALIC SMALL DOTLESS J (0x1d6a5) - case L'𝛂': // MATHEMATICAL BOLD SMALL ALPHA (0x1d6c2) - case L'𝛃': // MATHEMATICAL BOLD SMALL BETA (0x1d6c3) - case L'𝛄': // MATHEMATICAL BOLD SMALL GAMMA (0x1d6c4) - case L'𝛅': // MATHEMATICAL BOLD SMALL DELTA (0x1d6c5) - case L'𝛆': // MATHEMATICAL BOLD SMALL EPSILON (0x1d6c6) - case L'𝛇': // MATHEMATICAL BOLD SMALL ZETA (0x1d6c7) - case L'𝛈': // MATHEMATICAL BOLD SMALL ETA (0x1d6c8) - case L'𝛉': // MATHEMATICAL BOLD SMALL THETA (0x1d6c9) - case L'𝛊': // MATHEMATICAL BOLD SMALL IOTA (0x1d6ca) - case L'𝛋': // MATHEMATICAL BOLD SMALL KAPPA (0x1d6cb) - case L'𝛌': // MATHEMATICAL BOLD SMALL LAMDA (0x1d6cc) - case L'𝛍': // MATHEMATICAL BOLD SMALL MU (0x1d6cd) - case L'𝛎': // MATHEMATICAL BOLD SMALL NU (0x1d6ce) - case L'𝛏': // MATHEMATICAL BOLD SMALL XI (0x1d6cf) - case L'𝛐': // MATHEMATICAL BOLD SMALL OMICRON (0x1d6d0) - case L'𝛑': // MATHEMATICAL BOLD SMALL PI (0x1d6d1) - case L'𝛒': // MATHEMATICAL BOLD SMALL RHO (0x1d6d2) - case L'𝛓': // MATHEMATICAL BOLD SMALL FINAL SIGMA (0x1d6d3) - case L'𝛔': // MATHEMATICAL BOLD SMALL SIGMA (0x1d6d4) - case L'𝛕': // MATHEMATICAL BOLD SMALL TAU (0x1d6d5) - case L'𝛖': // MATHEMATICAL BOLD SMALL UPSILON (0x1d6d6) - case L'𝛗': // MATHEMATICAL BOLD SMALL PHI (0x1d6d7) - case L'𝛘': // MATHEMATICAL BOLD SMALL CHI (0x1d6d8) - case L'𝛙': // MATHEMATICAL BOLD SMALL PSI (0x1d6d9) - case L'𝛚': // MATHEMATICAL BOLD SMALL OMEGA (0x1d6da) - case L'𝛜': // MATHEMATICAL BOLD EPSILON SYMBOL (0x1d6dc) - case L'𝛝': // MATHEMATICAL BOLD THETA SYMBOL (0x1d6dd) - case L'𝛞': // MATHEMATICAL BOLD KAPPA SYMBOL (0x1d6de) - case L'𝛟': // MATHEMATICAL BOLD PHI SYMBOL (0x1d6df) - case L'𝛠': // MATHEMATICAL BOLD RHO SYMBOL (0x1d6e0) - case L'𝛡': // MATHEMATICAL BOLD PI SYMBOL (0x1d6e1) - case L'𝛼': // MATHEMATICAL ITALIC SMALL ALPHA (0x1d6fc) - case L'𝛽': // MATHEMATICAL ITALIC SMALL BETA (0x1d6fd) - case L'𝛾': // MATHEMATICAL ITALIC SMALL GAMMA (0x1d6fe) - case L'𝛿': // MATHEMATICAL ITALIC SMALL DELTA (0x1d6ff) - case L'𝜀': // MATHEMATICAL ITALIC SMALL EPSILON (0x1d700) - case L'𝜁': // MATHEMATICAL ITALIC SMALL ZETA (0x1d701) - case L'𝜂': // MATHEMATICAL ITALIC SMALL ETA (0x1d702) - case L'𝜃': // MATHEMATICAL ITALIC SMALL THETA (0x1d703) - case L'𝜄': // MATHEMATICAL ITALIC SMALL IOTA (0x1d704) - case L'𝜅': // MATHEMATICAL ITALIC SMALL KAPPA (0x1d705) - case L'𝜆': // MATHEMATICAL ITALIC SMALL LAMDA (0x1d706) - case L'𝜇': // MATHEMATICAL ITALIC SMALL MU (0x1d707) - case L'𝜈': // MATHEMATICAL ITALIC SMALL NU (0x1d708) - case L'𝜉': // MATHEMATICAL ITALIC SMALL XI (0x1d709) - case L'𝜊': // MATHEMATICAL ITALIC SMALL OMICRON (0x1d70a) - case L'𝜋': // MATHEMATICAL ITALIC SMALL PI (0x1d70b) - case L'𝜌': // MATHEMATICAL ITALIC SMALL RHO (0x1d70c) - case L'𝜍': // MATHEMATICAL ITALIC SMALL FINAL SIGMA (0x1d70d) - case L'𝜎': // MATHEMATICAL ITALIC SMALL SIGMA (0x1d70e) - case L'𝜏': // MATHEMATICAL ITALIC SMALL TAU (0x1d70f) - case L'𝜐': // MATHEMATICAL ITALIC SMALL UPSILON (0x1d710) - case L'𝜑': // MATHEMATICAL ITALIC SMALL PHI (0x1d711) - case L'𝜒': // MATHEMATICAL ITALIC SMALL CHI (0x1d712) - case L'𝜓': // MATHEMATICAL ITALIC SMALL PSI (0x1d713) - case L'𝜔': // MATHEMATICAL ITALIC SMALL OMEGA (0x1d714) - case L'𝜖': // MATHEMATICAL ITALIC EPSILON SYMBOL (0x1d716) - case L'𝜗': // MATHEMATICAL ITALIC THETA SYMBOL (0x1d717) - case L'𝜘': // MATHEMATICAL ITALIC KAPPA SYMBOL (0x1d718) - case L'𝜙': // MATHEMATICAL ITALIC PHI SYMBOL (0x1d719) - case L'𝜚': // MATHEMATICAL ITALIC RHO SYMBOL (0x1d71a) - case L'𝜛': // MATHEMATICAL ITALIC PI SYMBOL (0x1d71b) - case L'𝜶': // MATHEMATICAL BOLD ITALIC SMALL ALPHA (0x1d736) - case L'𝜷': // MATHEMATICAL BOLD ITALIC SMALL BETA (0x1d737) - case L'𝜸': // MATHEMATICAL BOLD ITALIC SMALL GAMMA (0x1d738) - case L'𝜹': // MATHEMATICAL BOLD ITALIC SMALL DELTA (0x1d739) - case L'𝜺': // MATHEMATICAL BOLD ITALIC SMALL EPSILON (0x1d73a) - case L'𝜻': // MATHEMATICAL BOLD ITALIC SMALL ZETA (0x1d73b) - case L'𝜼': // MATHEMATICAL BOLD ITALIC SMALL ETA (0x1d73c) - case L'𝜽': // MATHEMATICAL BOLD ITALIC SMALL THETA (0x1d73d) - case L'𝜾': // MATHEMATICAL BOLD ITALIC SMALL IOTA (0x1d73e) - case L'𝜿': // MATHEMATICAL BOLD ITALIC SMALL KAPPA (0x1d73f) - case L'𝝀': // MATHEMATICAL BOLD ITALIC SMALL LAMDA (0x1d740) - case L'𝝁': // MATHEMATICAL BOLD ITALIC SMALL MU (0x1d741) - case L'𝝂': // MATHEMATICAL BOLD ITALIC SMALL NU (0x1d742) - case L'𝝃': // MATHEMATICAL BOLD ITALIC SMALL XI (0x1d743) - case L'𝝄': // MATHEMATICAL BOLD ITALIC SMALL OMICRON (0x1d744) - case L'𝝅': // MATHEMATICAL BOLD ITALIC SMALL PI (0x1d745) - case L'𝝆': // MATHEMATICAL BOLD ITALIC SMALL RHO (0x1d746) - case L'𝝇': // MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA (0x1d747) - case L'𝝈': // MATHEMATICAL BOLD ITALIC SMALL SIGMA (0x1d748) - case L'𝝉': // MATHEMATICAL BOLD ITALIC SMALL TAU (0x1d749) - case L'𝝊': // MATHEMATICAL BOLD ITALIC SMALL UPSILON (0x1d74a) - case L'𝝋': // MATHEMATICAL BOLD ITALIC SMALL PHI (0x1d74b) - case L'𝝌': // MATHEMATICAL BOLD ITALIC SMALL CHI (0x1d74c) - case L'𝝍': // MATHEMATICAL BOLD ITALIC SMALL PSI (0x1d74d) - case L'𝝎': // MATHEMATICAL BOLD ITALIC SMALL OMEGA (0x1d74e) - case L'𝝐': // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL (0x1d750) - case L'𝝑': // MATHEMATICAL BOLD ITALIC THETA SYMBOL (0x1d751) - case L'𝝒': // MATHEMATICAL BOLD ITALIC KAPPA SYMBOL (0x1d752) - case L'𝝓': // MATHEMATICAL BOLD ITALIC PHI SYMBOL (0x1d753) - case L'𝝔': // MATHEMATICAL BOLD ITALIC RHO SYMBOL (0x1d754) - case L'𝝕': // MATHEMATICAL BOLD ITALIC PI SYMBOL (0x1d755) - case L'𝝰': // MATHEMATICAL SANS BOLD SMALL ALPHA (0x1d770) - case L'𝝱': // MATHEMATICAL SANS BOLD SMALL BETA (0x1d771) - case L'𝝲': // MATHEMATICAL SANS BOLD SMALL GAMMA (0x1d772) - case L'𝝳': // MATHEMATICAL SANS BOLD SMALL DELTA (0x1d773) - case L'𝝴': // MATHEMATICAL SANS BOLD SMALL EPSILON (0x1d774) - case L'𝝵': // MATHEMATICAL SANS BOLD SMALL ZETA (0x1d775) - case L'𝝶': // MATHEMATICAL SANS BOLD SMALL ETA (0x1d776) - case L'𝝷': // MATHEMATICAL SANS BOLD SMALL THETA (0x1d777) - case L'𝝸': // MATHEMATICAL SANS BOLD SMALL IOTA (0x1d778) - case L'𝝹': // MATHEMATICAL SANS BOLD SMALL KAPPA (0x1d779) - case L'𝝺': // MATHEMATICAL SANS BOLD SMALL LAMDA (0x1d77a) - case L'𝝻': // MATHEMATICAL SANS BOLD SMALL MU (0x1d77b) - case L'𝝼': // MATHEMATICAL SANS BOLD SMALL NU (0x1d77c) - case L'𝝽': // MATHEMATICAL SANS BOLD SMALL XI (0x1d77d) - case L'𝝾': // MATHEMATICAL SANS BOLD SMALL OMICRON (0x1d77e) - case L'𝝿': // MATHEMATICAL SANS BOLD SMALL PI (0x1d77f) - case L'𝞀': // MATHEMATICAL SANS BOLD SMALL RHO (0x1d780) - case L'𝞁': // MATHEMATICAL SANS BOLD SMALL FINAL SIGMA (0x1d781) - case L'𝞂': // MATHEMATICAL SANS BOLD SMALL SIGMA (0x1d782) - case L'𝞃': // MATHEMATICAL SANS BOLD SMALL TAU (0x1d783) - case L'𝞄': // MATHEMATICAL SANS BOLD SMALL UPSILON (0x1d784) - case L'𝞅': // MATHEMATICAL SANS BOLD SMALL PHI (0x1d785) - case L'𝞆': // MATHEMATICAL SANS BOLD SMALL CHI (0x1d786) - case L'𝞇': // MATHEMATICAL SANS BOLD SMALL PSI (0x1d787) - case L'𝞈': // MATHEMATICAL SANS BOLD SMALL OMEGA (0x1d788) - case L'𝞊': // MATHEMATICAL SANS BOLD EPSILON SYMBOL (0x1d78a) - case L'𝞋': // MATHEMATICAL SANS BOLD THETA SYMBOL (0x1d78b) - case L'𝞌': // MATHEMATICAL SANS BOLD KAPPA SYMBOL (0x1d78c) - case L'𝞍': // MATHEMATICAL SANS BOLD PHI SYMBOL (0x1d78d) - case L'𝞎': // MATHEMATICAL SANS BOLD RHO SYMBOL (0x1d78e) - case L'𝞏': // MATHEMATICAL SANS BOLD PI SYMBOL (0x1d78f) - case L'𝞪': // MATHEMATICAL SANS BOLD ITALIC SMALL ALPHA (0x1d7aa) - case L'𝞫': // MATHEMATICAL SANS BOLD ITALIC SMALL BETA (0x1d7ab) - case L'𝞬': // MATHEMATICAL SANS BOLD ITALIC SMALL GAMMA (0x1d7ac) - case L'𝞭': // MATHEMATICAL SANS BOLD ITALIC SMALL DELTA (0x1d7ad) - case L'𝞮': // MATHEMATICAL SANS BOLD ITALIC SMALL EPSILON (0x1d7ae) - case L'𝞯': // MATHEMATICAL SANS BOLD ITALIC SMALL ZETA (0x1d7af) - case L'𝞰': // MATHEMATICAL SANS BOLD ITALIC SMALL ETA (0x1d7b0) - case L'𝞱': // MATHEMATICAL SANS BOLD ITALIC SMALL THETA (0x1d7b1) - case L'𝞲': // MATHEMATICAL SANS BOLD ITALIC SMALL IOTA (0x1d7b2) - case L'𝞳': // MATHEMATICAL SANS BOLD ITALIC SMALL KAPPA (0x1d7b3) - case L'𝞴': // MATHEMATICAL SANS BOLD ITALIC SMALL LAMDA (0x1d7b4) - case L'𝞵': // MATHEMATICAL SANS BOLD ITALIC SMALL MU (0x1d7b5) - case L'𝞶': // MATHEMATICAL SANS BOLD ITALIC SMALL NU (0x1d7b6) - case L'𝞷': // MATHEMATICAL SANS BOLD ITALIC SMALL XI (0x1d7b7) - case L'𝞸': // MATHEMATICAL SANS BOLD ITALIC SMALL OMICRON (0x1d7b8) - case L'𝞹': // MATHEMATICAL SANS BOLD ITALIC SMALL PI (0x1d7b9) - case L'𝞺': // MATHEMATICAL SANS BOLD ITALIC SMALL RHO (0x1d7ba) - case L'𝞻': // MATHEMATICAL SANS BOLD ITALIC SMALL FINAL SIGMA (0x1d7bb) - case L'𝞼': // MATHEMATICAL SANS BOLD ITALIC SMALL SIGMA (0x1d7bc) - case L'𝞽': // MATHEMATICAL SANS BOLD ITALIC SMALL TAU (0x1d7bd) - case L'𝞾': // MATHEMATICAL SANS BOLD ITALIC SMALL UPSILON (0x1d7be) - case L'𝞿': // MATHEMATICAL SANS BOLD ITALIC SMALL PHI (0x1d7bf) - case L'𝟀': // MATHEMATICAL SANS BOLD ITALIC SMALL CHI (0x1d7c0) - case L'𝟁': // MATHEMATICAL SANS BOLD ITALIC SMALL PSI (0x1d7c1) - case L'𝟂': // MATHEMATICAL SANS BOLD ITALIC SMALL OMEGA (0x1d7c2) - case L'𝟄': // MATHEMATICAL SANS BOLD ITALIC EPSILON SYMBOL (0x1d7c4) - case L'𝟅': // MATHEMATICAL SANS BOLD ITALIC THETA SYMBOL (0x1d7c5) - case L'𝟆': // MATHEMATICAL SANS BOLD ITALIC KAPPA SYMBOL (0x1d7c6) - case L'𝟇': // MATHEMATICAL SANS BOLD ITALIC PHI SYMBOL (0x1d7c7) - case L'𝟈': // MATHEMATICAL SANS BOLD ITALIC RHO SYMBOL (0x1d7c8) - case L'𝟉': // MATHEMATICAL SANS BOLD ITALIC PI SYMBOL (0x1d7c9) - case L'𝟋': // MATHEMATICAL BOLD SMALL DIGAMMA (0x1d7cb) - case L'𞤢': // ADLAM SMALL ALIF (0x1e922) - case L'𞤣': // ADLAM SMALL DAALI (0x1e923) - case L'𞤤': // ADLAM SMALL LAAM (0x1e924) - case L'𞤥': // ADLAM SMALL MIIM (0x1e925) - case L'𞤦': // ADLAM SMALL BA (0x1e926) - case L'𞤧': // ADLAM SMALL SINNYIIYHE (0x1e927) - case L'𞤨': // ADLAM SMALL PE (0x1e928) - case L'𞤩': // ADLAM SMALL BHE (0x1e929) - case L'𞤪': // ADLAM SMALL RA (0x1e92a) - case L'𞤫': // ADLAM SMALL E (0x1e92b) - case L'𞤬': // ADLAM SMALL FA (0x1e92c) - case L'𞤭': // ADLAM SMALL I (0x1e92d) - case L'𞤮': // ADLAM SMALL O (0x1e92e) - case L'𞤯': // ADLAM SMALL DHA (0x1e92f) - case L'𞤰': // ADLAM SMALL YHE (0x1e930) - case L'𞤱': // ADLAM SMALL WAW (0x1e931) - case L'𞤲': // ADLAM SMALL NUN (0x1e932) - case L'𞤳': // ADLAM SMALL KAF (0x1e933) - case L'𞤴': // ADLAM SMALL YA (0x1e934) - case L'𞤵': // ADLAM SMALL U (0x1e935) - case L'𞤶': // ADLAM SMALL JIIM (0x1e936) - case L'𞤷': // ADLAM SMALL CHI (0x1e937) - case L'𞤸': // ADLAM SMALL HA (0x1e938) - case L'𞤹': // ADLAM SMALL QAAF (0x1e939) - case L'𞤺': // ADLAM SMALL GA (0x1e93a) - case L'𞤻': // ADLAM SMALL NYA (0x1e93b) - case L'𞤼': // ADLAM SMALL TU (0x1e93c) - case L'𞤽': // ADLAM SMALL NHA (0x1e93d) - case L'𞤾': // ADLAM SMALL VA (0x1e93e) - case L'𞤿': // ADLAM SMALL KHA (0x1e93f) - case L'𞥀': // ADLAM SMALL GBE (0x1e940) - case L'𞥁': // ADLAM SMALL ZAL (0x1e941) - case L'𞥂': // ADLAM SMALL KPO (0x1e942) - case L'𞥃': // ADLAM SMALL SHA (0x1e943) - return 1; - default: - return 0; + int r; + if (c < 0200) { + return 'a' <= c && c <= 'z'; + } else { + if (towupper(c) != c) return 1; + switch (c) { + case 0x00df: /* ß Watin */ + case 0x0138: /* ĸ Watin-A */ + case 0x0149: /* ʼn Watin-A */ + case 0x018d: /* ƍ Watin-B */ + case 0x019b: /* ƛ Watin-B */ + case 0x01aa: /* ƪ Watin-B */ + case 0x01ab: /* ƫ Watin-B */ + case 0x01ba: /* ƺ Watin-B */ + case 0x01be: /* ƾ Watin-B */ + case 0x01f0: /* ǰ Watin-B */ + case 0x0221: /* ȡ Watin-B */ + case 0x0234: /* ȴ Watin-B */ + case 0x0235: /* ȵ Watin-B */ + case 0x0236: /* ȶ Watin-B */ + case 0x0237: /* ȷ Watin-B */ + case 0x0238: /* ȸ Watin-B */ + case 0x0239: /* ȹ Watin-B */ + case 0x0255: /* ɕ IPA */ + case 0x0258: /* ɘ IPA */ + case 0x025a: /* ɚ IPA */ + case 0x025d: /* ɝ IPA */ + case 0x025e: /* ɞ IPA */ + case 0x025f: /* ɟ IPA */ + case 0x0262: /* ɢ IPA */ + case 0x0264: /* ɤ IPA */ + case 0x0267: /* ɧ IPA */ + case 0x026d: /* ɭ IPA */ + case 0x026e: /* ɮ IPA */ + case 0x0270: /* ɰ IPA */ + case 0x0273: /* ɳ IPA */ + case 0x0274: /* ɴ IPA */ + case 0x0276: /* ɶ IPA */ + case 0x0277: /* ɷ IPA */ + case 0x0278: /* ɸ IPA */ + case 0x0279: /* ɹ IPA */ + case 0x027a: /* ɺ IPA */ + case 0x027b: /* ɻ IPA */ + case 0x027c: /* ɼ IPA */ + case 0x027e: /* ɾ IPA */ + case 0x027f: /* ɿ IPA */ + case 0x0281: /* ʁ IPA */ + case 0x0284: /* ʄ IPA */ + case 0x0285: /* ʅ IPA */ + case 0x0286: /* ʆ IPA */ + case 0x028d: /* ʍ IPA */ + case 0x028e: /* ʎ IPA */ + case 0x028f: /* ʏ IPA */ + case 0x0290: /* ʐ IPA */ + case 0x0291: /* ʑ IPA */ + case 0x0293: /* ʓ IPA */ + case 0x0295: /* ʕ IPA */ + case 0x0296: /* ʖ IPA */ + case 0x0297: /* ʗ IPA */ + case 0x0298: /* ʘ IPA */ + case 0x0299: /* ʙ IPA */ + case 0x029a: /* ʚ IPA */ + case 0x029b: /* ʛ IPA */ + case 0x029c: /* ʜ IPA */ + case 0x029f: /* ʟ IPA */ + case 0x02a0: /* ʠ IPA */ + case 0x02a1: /* ʡ IPA */ + case 0x02a2: /* ʢ IPA */ + case 0x02a3: /* ʣ IPA */ + case 0x02a4: /* ʤ IPA */ + case 0x02a5: /* ʥ IPA */ + case 0x02a6: /* ʦ IPA */ + case 0x02a7: /* ʧ IPA */ + case 0x02a8: /* ʨ IPA */ + case 0x02a9: /* ʩ IPA */ + case 0x02aa: /* ʪ IPA */ + case 0x02ab: /* ʫ IPA */ + case 0x02ac: /* ʬ IPA */ + case 0x02ad: /* ʭ IPA */ + case 0x02ae: /* ʮ IPA */ + case 0x02af: /* ʯ IPA */ + case 0x0390: /* ΐ Greek */ + case 0x03b0: /* ΰ Greek */ + case 0x03fc: /* ϼ Greek */ + case 0x0560: /* ՠ Armenian */ + case 0x0587: /* և Armenian */ + case 0x0588: /* ֈ Armenian */ + case 0x1d00: /* ᴀ Phonetic Extensions */ + case 0x1d01: /* ᴁ Phonetic Extensions */ + case 0x1d02: /* ᴂ Phonetic Extensions */ + case 0x1d03: /* ᴃ Phonetic Extensions */ + case 0x1d04: /* ᴄ Phonetic Extensions */ + case 0x1d05: /* ᴅ Phonetic Extensions */ + case 0x1d06: /* ᴆ Phonetic Extensions */ + case 0x1d07: /* ᴇ Phonetic Extensions */ + case 0x1d08: /* ᴈ Phonetic Extensions */ + case 0x1d09: /* ᴉ Phonetic Extensions */ + case 0x1d0a: /* ᴊ Phonetic Extensions */ + case 0x1d0b: /* ᴋ Phonetic Extensions */ + case 0x1d0c: /* ᴌ Phonetic Extensions */ + case 0x1d0d: /* ᴍ Phonetic Extensions */ + case 0x1d0e: /* ᴎ Phonetic Extensions */ + case 0x1d0f: /* ᴏ Phonetic Extensions */ + case 0x1d10: /* ᴐ Phonetic Extensions */ + case 0x1d11: /* ᴑ Phonetic Extensions */ + case 0x1d12: /* ᴒ Phonetic Extensions */ + case 0x1d13: /* ᴓ Phonetic Extensions */ + case 0x1d14: /* ᴔ Phonetic Extensions */ + case 0x1d15: /* ᴕ Phonetic Extensions */ + case 0x1d16: /* ᴖ Phonetic Extensions */ + case 0x1d17: /* ᴗ Phonetic Extensions */ + case 0x1d18: /* ᴘ Phonetic Extensions */ + case 0x1d19: /* ᴙ Phonetic Extensions */ + case 0x1d1a: /* ᴚ Phonetic Extensions */ + case 0x1d1b: /* ᴛ Phonetic Extensions */ + case 0x1d1c: /* ᴜ Phonetic Extensions */ + case 0x1d1d: /* ᴝ Phonetic Extensions */ + case 0x1d1e: /* ᴞ Phonetic Extensions */ + case 0x1d1f: /* ᴟ Phonetic Extensions */ + case 0x1d20: /* ᴠ Phonetic Extensions */ + case 0x1d21: /* ᴡ Phonetic Extensions */ + case 0x1d22: /* ᴢ Phonetic Extensions */ + case 0x1d23: /* ᴣ Phonetic Extensions */ + case 0x1d24: /* ᴤ Phonetic Extensions */ + case 0x1d25: /* ᴥ Phonetic Extensions */ + case 0x1d26: /* ᴦ Phonetic Extensions */ + case 0x1d27: /* ᴧ Phonetic Extensions */ + case 0x1d28: /* ᴨ Phonetic Extensions */ + case 0x1d29: /* ᴩ Phonetic Extensions */ + case 0x1d2a: /* ᴪ Phonetic Extensions */ + case 0x1d2b: /* ᴫ Phonetic Extensions */ + case 0x1d6b: /* ᵫ Phonetic Extensions */ + case 0x1d6c: /* ᵬ Phonetic Extensions */ + case 0x1d6d: /* ᵭ Phonetic Extensions */ + case 0x1d6e: /* ᵮ Phonetic Extensions */ + case 0x1d6f: /* ᵯ Phonetic Extensions */ + case 0x1d70: /* ᵰ Phonetic Extensions */ + case 0x1d71: /* ᵱ Phonetic Extensions */ + case 0x1d72: /* ᵲ Phonetic Extensions */ + case 0x1d73: /* ᵳ Phonetic Extensions */ + case 0x1d74: /* ᵴ Phonetic Extensions */ + case 0x1d75: /* ᵵ Phonetic Extensions */ + case 0x1d76: /* ᵶ Phonetic Extensions */ + case 0x1d77: /* ᵷ Phonetic Extensions */ + case 0x1d7a: /* ᵺ Phonetic Extensions */ + case 0x1d7b: /* ᵻ Phonetic Extensions */ + case 0x1d7c: /* ᵼ Phonetic Extensions */ + case 0x1d7e: /* ᵾ Phonetic Extensions */ + case 0x1d7f: /* ᵿ Phonetic Extensions */ + case 0x1d80: /* . Phonetic Extensions Supplement */ + case 0x1d81: /* . Phonetic Extensions Supplement */ + case 0x1d82: /* . Phonetic Extensions Supplement */ + case 0x1d83: /* . Phonetic Extensions Supplement */ + case 0x1d84: /* . Phonetic Extensions Supplement */ + case 0x1d85: /* . Phonetic Extensions Supplement */ + case 0x1d86: /* . Phonetic Extensions Supplement */ + case 0x1d87: /* . Phonetic Extensions Supplement */ + case 0x1d88: /* . Phonetic Extensions Supplement */ + case 0x1d89: /* . Phonetic Extensions Supplement */ + case 0x1d8a: /* . Phonetic Extensions Supplement */ + case 0x1d8b: /* . Phonetic Extensions Supplement */ + case 0x1d8c: /* . Phonetic Extensions Supplement */ + case 0x1d8d: /* . Phonetic Extensions Supplement */ + case 0x1d8f: /* . Phonetic Extensions Supplement */ + case 0x1d90: /* . Phonetic Extensions Supplement */ + case 0x1d91: /* . Phonetic Extensions Supplement */ + case 0x1d92: /* . Phonetic Extensions Supplement */ + case 0x1d93: /* . Phonetic Extensions Supplement */ + case 0x1d94: /* . Phonetic Extensions Supplement */ + case 0x1d95: /* . Phonetic Extensions Supplement */ + case 0x1d96: /* . Phonetic Extensions Supplement */ + case 0x1d97: /* . Phonetic Extensions Supplement */ + case 0x1d98: /* . Phonetic Extensions Supplement */ + case 0x1d99: /* . Phonetic Extensions Supplement */ + case 0x1d9a: /* . Phonetic Extensions Supplement */ + case 0x1e96: /* ẖ Watin-C */ + case 0x1e97: /* ẗ Watin-C */ + case 0x1e98: /* ẘ Watin-C */ + case 0x1e99: /* ẙ Watin-C */ + case 0x1e9a: /* ẚ Watin-C */ + case 0x1e9c: /* ẜ Watin-C */ + case 0x1e9d: /* ẝ Watin-C */ + case 0x1e9f: /* ẟ Watin-C */ + case 0x1f50: /* ὐ Greek2 */ + case 0x1f52: /* ὒ Greek2 */ + case 0x1f54: /* ὔ Greek2 */ + case 0x1f56: /* ὖ Greek2 */ + case 0x1fb2: /* ᾲ Greek2 */ + case 0x1fb4: /* ᾴ Greek2 */ + case 0x1fb6: /* ᾶ Greek2 */ + case 0x1fb7: /* ᾷ Greek2 */ + case 0x1fc2: /* ῂ Greek2 */ + case 0x1fc4: /* ῄ Greek2 */ + case 0x1fc6: /* ῆ Greek2 */ + case 0x1fc7: /* ῇ Greek2 */ + case 0x1fd2: /* ῒ Greek2 */ + case 0x1fd3: /* ΐ Greek2 */ + case 0x1fd6: /* ῖ Greek2 */ + case 0x1fd7: /* ῗ Greek2 */ + case 0x1fe2: /* ῢ Greek2 */ + case 0x1fe3: /* ΰ Greek2 */ + case 0x1fe4: /* ῤ Greek2 */ + case 0x1fe6: /* ῦ Greek2 */ + case 0x1fe7: /* ῧ Greek2 */ + case 0x1ff2: /* ῲ Greek2 */ + case 0x1ff4: /* ῴ Greek2 */ + case 0x1ff6: /* ῶ Greek2 */ + case 0x1ff7: /* ῷ Greek2 */ + case 0x210a: /* ℊ Letterlike */ + case 0x210e: /* ℎ Letterlike */ + case 0x210f: /* ℏ Letterlike */ + case 0x2113: /* ℓ Letterlike */ + case 0x212f: /* ℯ Letterlike */ + case 0x2134: /* ℴ Letterlike */ + case 0x2139: /* ℹ Letterlike */ + case 0x213c: /* ℼ Letterlike */ + case 0x213d: /* ℽ Letterlike */ + case 0x2146: /* ⅆ Letterlike */ + case 0x2147: /* ⅇ Letterlike */ + case 0x2148: /* ⅈ Letterlike */ + case 0x2149: /* ⅉ Letterlike */ + case 0x2c71: /* . Watin-D */ + case 0x2c74: /* . Watin-D */ + case 0x2c77: /* . Watin-D */ + case 0x2c78: /* . Watin-D */ + case 0x2c79: /* . Watin-D */ + case 0x2c7a: /* . Watin-D */ + case 0x2c7b: /* . Watin-D */ + case 0x2ce4: /* . Coptic */ + case 0xa730: /* . Latin Extended-D */ + case 0xa731: /* . Latin Extended-D */ + case 0xa771: /* . Latin Extended-D */ + case 0xa772: /* . Latin Extended-D */ + case 0xa773: /* . Latin Extended-D */ + case 0xa774: /* . Latin Extended-D */ + case 0xa775: /* . Latin Extended-D */ + case 0xa776: /* . Latin Extended-D */ + case 0xa777: /* . Latin Extended-D */ + case 0xa778: /* . Latin Extended-D */ + case 0xa78e: /* . Latin Extended-D */ + case 0xa795: /* . Latin Extended-D */ + case 0xa7af: /* . Latin Extended-D */ + case 0xa7fa: /* . Latin Extended-D */ + case 0xab30: /* . Latin Extended-E */ + case 0xab31: /* . Latin Extended-E */ + case 0xab32: /* . Latin Extended-E */ + case 0xab33: /* . Latin Extended-E */ + case 0xab34: /* . Latin Extended-E */ + case 0xab35: /* . Latin Extended-E */ + case 0xab36: /* . Latin Extended-E */ + case 0xab37: /* . Latin Extended-E */ + case 0xab38: /* . Latin Extended-E */ + case 0xab39: /* . Latin Extended-E */ + case 0xab3a: /* . Latin Extended-E */ + case 0xab3b: /* . Latin Extended-E */ + case 0xab3c: /* . Latin Extended-E */ + case 0xab3d: /* . Latin Extended-E */ + case 0xab3e: /* . Latin Extended-E */ + case 0xab3f: /* . Latin Extended-E */ + case 0xab40: /* . Latin Extended-E */ + case 0xab41: /* . Latin Extended-E */ + case 0xab42: /* . Latin Extended-E */ + case 0xab43: /* . Latin Extended-E */ + case 0xab44: /* . Latin Extended-E */ + case 0xab45: /* . Latin Extended-E */ + case 0xab46: /* . Latin Extended-E */ + case 0xab47: /* . Latin Extended-E */ + case 0xab48: /* . Latin Extended-E */ + case 0xab49: /* . Latin Extended-E */ + case 0xab4a: /* . Latin Extended-E */ + case 0xab4b: /* . Latin Extended-E */ + case 0xab4c: /* . Latin Extended-E */ + case 0xab4d: /* . Latin Extended-E */ + case 0xab4e: /* . Latin Extended-E */ + case 0xab4f: /* . Latin Extended-E */ + case 0xab50: /* . Latin Extended-E */ + case 0xab51: /* . Latin Extended-E */ + case 0xab52: /* . Latin Extended-E */ + case 0xab54: /* . Latin Extended-E */ + case 0xab55: /* . Latin Extended-E */ + case 0xab56: /* . Latin Extended-E */ + case 0xab57: /* . Latin Extended-E */ + case 0xab58: /* . Latin Extended-E */ + case 0xab59: /* . Latin Extended-E */ + case 0xab5a: /* . Latin Extended-E */ + case 0xab60: /* . Latin Extended-E */ + case 0xab61: /* . Latin Extended-E */ + case 0xab62: /* . Latin Extended-E */ + case 0xab63: /* . Latin Extended-E */ + case 0xab64: /* . Latin Extended-E */ + case 0xab65: /* . Latin Extended-E */ + case 0xab66: /* . Latin Extended-E */ + case 0xab67: /* . Latin Extended-E */ + case 0xfb00: /* . Alphabetic Presentation Forms */ + case 0xfb01: /* . Alphabetic Presentation Forms */ + case 0xfb02: /* . Alphabetic Presentation Forms */ + case 0xfb03: /* . Alphabetic Presentation Forms */ + case 0xfb04: /* . Alphabetic Presentation Forms */ + case 0xfb05: /* . Alphabetic Presentation Forms */ + case 0xfb06: /* . Alphabetic Presentation Forms */ + case 0xfb13: /* . Alphabetic Presentation Forms */ + case 0xfb14: /* . Alphabetic Presentation Forms */ + case 0xfb15: /* . Alphabetic Presentation Forms */ + case 0xfb16: /* . Alphabetic Presentation Forms */ + case 0xfb17: /* . Alphabetic Presentation Forms */ + case 0x1d44e: /* 𝑎 Math */ + case 0x1d44f: /* 𝑏 Math */ + case 0x1d450: /* 𝑐 Math */ + case 0x1d451: /* 𝑑 Math */ + case 0x1d452: /* 𝑒 Math */ + case 0x1d453: /* 𝑓 Math */ + case 0x1d454: /* 𝑔 Math */ + case 0x1d45e: /* 𝑞 Math */ + case 0x1d45f: /* 𝑟 Math */ + case 0x1d460: /* 𝑠 Math */ + case 0x1d461: /* 𝑡 Math */ + case 0x1d462: /* 𝑢 Math */ + case 0x1d463: /* 𝑣 Math */ + case 0x1d464: /* 𝑤 Math */ + case 0x1d465: /* 𝑥 Math */ + case 0x1d466: /* 𝑦 Math */ + case 0x1d467: /* 𝑧 Math */ + case 0x1d4b6: /* 𝒶 Math */ + case 0x1d4b7: /* 𝒷 Math */ + case 0x1d4b8: /* 𝒸 Math */ + case 0x1d4b9: /* 𝒹 Math */ + case 0x1d4bb: /* 𝒻 Math */ + case 0x1d4bd: /* 𝒽 Math */ + case 0x1d4be: /* 𝒾 Math */ + case 0x1d4bf: /* 𝒿 Math */ + case 0x1d4c0: /* 𝓀 Math */ + case 0x1d4c1: /* 𝓁 Math */ + case 0x1d4c2: /* 𝓂 Math */ + case 0x1d4c3: /* 𝓃 Math */ + case 0x1d4c5: /* 𝓅 Math */ + case 0x1d4c6: /* 𝓆 Math */ + case 0x1d4c7: /* 𝓇 Math */ + case 0x1d51e: /* 𝔞 Math */ + case 0x1d51f: /* 𝔟 Math */ + case 0x1d520: /* 𝔠 Math */ + case 0x1d521: /* 𝔡 Math */ + case 0x1d522: /* 𝔢 Math */ + case 0x1d523: /* 𝔣 Math */ + case 0x1d524: /* 𝔤 Math */ + case 0x1d525: /* 𝔥 Math */ + case 0x1d526: /* 𝔦 Math */ + case 0x1d52f: /* 𝔯 Math */ + case 0x1d530: /* 𝔰 Math */ + case 0x1d531: /* 𝔱 Math */ + case 0x1d532: /* 𝔲 Math */ + case 0x1d533: /* 𝔳 Math */ + case 0x1d534: /* 𝔴 Math */ + case 0x1d535: /* 𝔵 Math */ + case 0x1d536: /* 𝔶 Math */ + case 0x1d537: /* 𝔷 Math */ + case 0x1d552: /* 𝕒 Math */ + case 0x1d553: /* 𝕓 Math */ + case 0x1d554: /* 𝕔 Math */ + case 0x1d555: /* 𝕕 Math */ + case 0x1d556: /* 𝕖 Math */ + case 0x1d557: /* 𝕗 Math */ + case 0x1d558: /* 𝕘 Math */ + case 0x1d559: /* 𝕙 Math */ + case 0x1d55a: /* 𝕚 Math */ + case 0x1d55b: /* 𝕛 Math */ + case 0x1d55c: /* 𝕜 Math */ + case 0x1d55d: /* 𝕝 Math */ + case 0x1d55e: /* 𝕞 Math */ + case 0x1d55f: /* 𝕟 Math */ + case 0x1d560: /* 𝕠 Math */ + case 0x1d561: /* 𝕡 Math */ + case 0x1d562: /* 𝕢 Math */ + case 0x1d563: /* 𝕣 Math */ + case 0x1d564: /* 𝕤 Math */ + case 0x1d565: /* 𝕥 Math */ + case 0x1d566: /* 𝕦 Math */ + case 0x1d567: /* 𝕧 Math */ + case 0x1d568: /* 𝕨 Math */ + case 0x1d569: /* 𝕩 Math */ + case 0x1d56a: /* 𝕪 Math */ + case 0x1d56b: /* 𝕫 Math */ + case 0x1d656: /* 𝙖 Math */ + case 0x1d657: /* 𝙗 Math */ + case 0x1d658: /* 𝙘 Math */ + case 0x1d659: /* 𝙙 Math */ + case 0x1d65a: /* 𝙚 Math */ + case 0x1d65b: /* 𝙛 Math */ + case 0x1d65c: /* 𝙜 Math */ + case 0x1d65d: /* 𝙝 Math */ + case 0x1d65e: /* 𝙞 Math */ + case 0x1d65f: /* 𝙟 Math */ + case 0x1d660: /* 𝙠 Math */ + case 0x1d661: /* 𝙡 Math */ + case 0x1d662: /* 𝙢 Math */ + case 0x1d663: /* 𝙣 Math */ + case 0x1d664: /* 𝙤 Math */ + case 0x1d665: /* 𝙥 Math */ + case 0x1d666: /* 𝙦 Math */ + case 0x1d667: /* 𝙧 Math */ + case 0x1d668: /* 𝙨 Math */ + case 0x1d669: /* 𝙩 Math */ + case 0x1d66a: /* 𝙪 Math */ + case 0x1d66b: /* 𝙫 Math */ + case 0x1d66c: /* 𝙬 Math */ + case 0x1d66d: /* 𝙭 Math */ + case 0x1d66e: /* 𝙮 Math */ + case 0x1d66f: /* 𝙯 Math */ + case 0x1d6da: /* 𝛚 Math */ + case 0x1d6dc: /* 𝛜 Math */ + case 0x1d6dd: /* 𝛝 Math */ + case 0x1d6de: /* 𝛞 Math */ + case 0x1d6df: /* 𝛟 Math */ + case 0x1d6e0: /* 𝛠 Math */ + case 0x1d6e1: /* 𝛡 Math */ + case 0x1d70d: /* 𝜍 Math */ + case 0x1d70e: /* 𝜎 Math */ + case 0x1d70f: /* 𝜏 Math */ + case 0x1d710: /* 𝜐 Math */ + case 0x1d711: /* 𝜑 Math */ + case 0x1d712: /* 𝜒 Math */ + case 0x1d713: /* 𝜓 Math */ + case 0x1d714: /* 𝜔 Math */ + case 0x1d716: /* 𝜖 Math */ + case 0x1d717: /* 𝜗 Math */ + case 0x1d718: /* 𝜘 Math */ + case 0x1d719: /* 𝜙 Math */ + case 0x1d71a: /* 𝜚 Math */ + case 0x1d71b: /* 𝜛 Math */ + case 0x1d747: /* 𝝇 Math */ + case 0x1d748: /* 𝝈 Math */ + case 0x1d749: /* 𝝉 Math */ + case 0x1d74a: /* 𝝊 Math */ + case 0x1d74b: /* 𝝋 Math */ + case 0x1d74c: /* 𝝌 Math */ + case 0x1d74d: /* 𝝍 Math */ + case 0x1d74e: /* 𝝎 Math */ + case 0x1d750: /* 𝝐 Math */ + case 0x1d751: /* 𝝑 Math */ + case 0x1d752: /* 𝝒 Math */ + case 0x1d753: /* 𝝓 Math */ + case 0x1d754: /* 𝝔 Math */ + case 0x1d755: /* 𝝕 Math */ + case 0x1d781: /* 𝞁 Math */ + case 0x1d782: /* 𝞂 Math */ + case 0x1d783: /* 𝞃 Math */ + case 0x1d784: /* 𝞄 Math */ + case 0x1d785: /* 𝞅 Math */ + case 0x1d786: /* 𝞆 Math */ + case 0x1d787: /* 𝞇 Math */ + case 0x1d788: /* 𝞈 Math */ + case 0x1d78a: /* 𝞊 Math */ + case 0x1d78b: /* 𝞋 Math */ + case 0x1d78c: /* 𝞌 Math */ + case 0x1d78d: /* 𝞍 Math */ + case 0x1d78e: /* 𝞎 Math */ + case 0x1d78f: /* 𝞏 Math */ + case 0x1d7aa: /* 𝞪 Math */ + case 0x1d7ab: /* 𝞫 Math */ + case 0x1d7ac: /* 𝞬 Math */ + case 0x1d7ad: /* 𝞭 Math */ + case 0x1d7ae: /* 𝞮 Math */ + case 0x1d7af: /* 𝞯 Math */ + case 0x1d7b0: /* 𝞰 Math */ + case 0x1d7b1: /* 𝞱 Math */ + case 0x1d7b2: /* 𝞲 Math */ + case 0x1d7b3: /* 𝞳 Math */ + case 0x1d7b4: /* 𝞴 Math */ + case 0x1d7b5: /* 𝞵 Math */ + case 0x1d7b6: /* 𝞶 Math */ + case 0x1d7b7: /* 𝞷 Math */ + case 0x1d7b8: /* 𝞸 Math */ + case 0x1d7b9: /* 𝞹 Math */ + case 0x1d7ba: /* 𝞺 Math */ + case 0x1d7bb: /* 𝞻 Math */ + case 0x1d7bc: /* 𝞼 Math */ + case 0x1d7bd: /* 𝞽 Math */ + case 0x1d7be: /* 𝞾 Math */ + case 0x1d7bf: /* 𝞿 Math */ + case 0x1d7c0: /* 𝟀 Math */ + case 0x1d7c1: /* 𝟁 Math */ + case 0x1d7c2: /* 𝟂 Math */ + case 0x1d7c4: /* 𝟄 Math */ + case 0x1d7c5: /* 𝟅 Math */ + case 0x1d7c6: /* 𝟆 Math */ + case 0x1d7c7: /* 𝟇 Math */ + case 0x1d7c8: /* 𝟈 Math */ + case 0x1d7c9: /* 𝟉 Math */ + case 0x1d7cb: /* 𝟋 Math */ + return 1; + default: + return 0; + } } } diff --git a/libc/str/iswseparator.c b/libc/str/iswseparator.c new file mode 100644 index 000000000..9f3bc0ff3 --- /dev/null +++ b/libc/str/iswseparator.c @@ -0,0 +1,423 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +static const unsigned short kCodes[][2] = { + {0x00aa, 0x00aa}, /* 1x English */ + {0x00b2, 0x00b3}, /* 2x English Arabic */ + {0x00b5, 0x00b5}, /* 1x Greek */ + {0x00b9, 0x00ba}, /* 2x English Arabic */ + {0x00bc, 0x00be}, /* 3x Vulgar English Arabic */ + {0x00c0, 0x00d6}, /* 23x Watin */ + {0x00d8, 0x00f6}, /* 31x Watin */ + {0x0100, 0x02c1}, /* 450x Watin-AB,IPA,Spacemod */ + {0x02c6, 0x02d1}, /* 12x Spacemod */ + {0x02e0, 0x02e4}, /* 5x Spacemod */ + {0x02ec, 0x02ec}, /* 1x Spacemod */ + {0x02ee, 0x02ee}, /* 1x Spacemod */ + {0x0370, 0x0374}, /* 5x Greek */ + {0x0376, 0x0377}, /* 2x Greek */ + {0x037a, 0x037d}, /* 4x Greek */ + {0x037f, 0x037f}, /* 1x Greek */ + {0x0386, 0x0386}, /* 1x Greek */ + {0x0388, 0x038a}, /* 3x Greek */ + {0x038c, 0x038c}, /* 1x Greek */ + {0x038e, 0x03a1}, /* 20x Greek */ + {0x03a3, 0x03f5}, /* 83x Greek */ + {0x03f7, 0x0481}, /* 139x Greek */ + {0x048a, 0x052f}, /* 166x Cyrillic */ + {0x0531, 0x0556}, /* 38x Armenian */ + {0x0560, 0x0588}, /* 41x Armenian */ + {0x05d0, 0x05ea}, /* 27x Hebrew */ + {0x0620, 0x064a}, /* 43x Arabic */ + {0x0660, 0x0669}, /* 10x Arabic */ + {0x0671, 0x06d3}, /* 99x Arabic */ + {0x06ee, 0x06fc}, /* 15x Arabic */ + {0x0712, 0x072f}, /* 30x Syriac */ + {0x074d, 0x07a5}, /* 89x Syriac,Arabic2,Thaana */ + {0x07c0, 0x07ea}, /* 43x NKo */ + {0x0800, 0x0815}, /* 22x Samaritan */ + {0x0840, 0x0858}, /* 25x Mandaic */ + {0x0904, 0x0939}, /* 54x Devanagari */ + {0x0993, 0x09a8}, /* 22x Bengali */ + {0x09e6, 0x09f1}, /* 12x Bengali */ + {0x0a13, 0x0a28}, /* 22x Gurmukhi */ + {0x0a66, 0x0a6f}, /* 10x Gurmukhi */ + {0x0a93, 0x0aa8}, /* 22x Gujarati */ + {0x0b13, 0x0b28}, /* 22x Oriya */ + {0x0c92, 0x0ca8}, /* 23x Kannada */ + {0x0caa, 0x0cb3}, /* 10x Kannada */ + {0x0ce6, 0x0cef}, /* 10x Kannada */ + {0x0d12, 0x0d3a}, /* 41x Malayalam */ + {0x0d85, 0x0d96}, /* 18x Sinhala */ + {0x0d9a, 0x0db1}, /* 24x Sinhala */ + {0x0de6, 0x0def}, /* 10x Sinhala */ + {0x0e01, 0x0e30}, /* 48x Thai */ + {0x0e8c, 0x0ea3}, /* 24x Lao */ + {0x0f20, 0x0f33}, /* 20x Tibetan */ + {0x0f49, 0x0f6c}, /* 36x Tibetan */ + {0x109e, 0x10c5}, /* 40x Myanmar,Georgian */ + {0x10d0, 0x10fa}, /* 43x Georgian */ + {0x10fc, 0x1248}, /* 333x Georgian,Hangul,Ethiopic */ + {0x13a0, 0x13f5}, /* 86x Cherokee */ + {0x1401, 0x166d}, /* 621x Aboriginal */ + {0x16a0, 0x16ea}, /* 75x Runic */ + {0x1700, 0x170c}, /* 13x Tagalog */ + {0x1780, 0x17b3}, /* 52x Khmer */ + {0x1820, 0x1878}, /* 89x Mongolian */ + {0x1a00, 0x1a16}, /* 23x Buginese */ + {0x1a20, 0x1a54}, /* 53x Tai Tham */ + {0x1a80, 0x1a89}, /* 10x Tai Tham */ + {0x1a90, 0x1a99}, /* 10x Tai Tham */ + {0x1b05, 0x1b33}, /* 47x Balinese */ + {0x1b50, 0x1b59}, /* 10x Balinese */ + {0x1b83, 0x1ba0}, /* 30x Sundanese */ + {0x1bae, 0x1be5}, /* 56x Sundanese */ + {0x1c90, 0x1cba}, /* 43x Georgian2 */ + {0x1cbd, 0x1cbf}, /* 3x Georgian2 */ + {0x1e00, 0x1f15}, /* 278x Watin-C,Greek2 */ + {0x2070, 0x2071}, /* 2x Supersub */ + {0x2074, 0x2079}, /* 6x Supersub */ + {0x207f, 0x2089}, /* 11x Supersub */ + {0x2090, 0x209c}, /* 13x Supersub */ + {0x2100, 0x2117}, /* 24x Letterlike */ + {0x2119, 0x213f}, /* 39x Letterlike */ + {0x2145, 0x214a}, /* 6x Letterlike */ + {0x214c, 0x218b}, /* 64x Letterlike,Numbery */ + {0x21af, 0x21cd}, /* 31x Arrows */ + {0x21d5, 0x21f3}, /* 31x Arrows */ + {0x230c, 0x231f}, /* 20x Technical */ + {0x232b, 0x237b}, /* 81x Technical */ + {0x237d, 0x239a}, /* 30x Technical */ + {0x23b4, 0x23db}, /* 40x Technical */ + {0x23e2, 0x2426}, /* 69x Technical,ControlPictures */ + {0x2460, 0x25b6}, /* 343x Enclosed,Boxes,Blocks,Shapes */ + {0x25c2, 0x25f7}, /* 54x Shapes */ + {0x2600, 0x266e}, /* 111x Symbols */ + {0x2670, 0x2767}, /* 248x Symbols,Dingbats */ + {0x2776, 0x27bf}, /* 74x Dingbats */ + {0x2800, 0x28ff}, /* 256x Braille */ + {0x2c00, 0x2c2e}, /* 47x Glagolitic */ + {0x2c30, 0x2c5e}, /* 47x Glagolitic */ + {0x2c60, 0x2ce4}, /* 133x Watin-D */ + {0x2d00, 0x2d25}, /* 38x Georgian2 */ + {0x2d30, 0x2d67}, /* 56x Tifinagh */ + {0x2d80, 0x2d96}, /* 23x Ethiopic2 */ + {0x2e2f, 0x2e2f}, /* 1x Punctuation2 */ + {0x3005, 0x3007}, /* 3x CJK Symbols & Punctuation */ + {0x3021, 0x3029}, /* 9x CJK Symbols & Punctuation */ + {0x3031, 0x3035}, /* 5x CJK Symbols & Punctuation */ + {0x3038, 0x303c}, /* 5x CJK Symbols & Punctuation */ + {0x3041, 0x3096}, /* 86x Hiragana */ + {0x30a1, 0x30fa}, /* 90x Katakana */ + {0x3105, 0x312f}, /* 43x Bopomofo */ + {0x3131, 0x318e}, /* 94x Hangul Compatibility Jamo */ + {0x31a0, 0x31ba}, /* 27x Bopomofo Extended */ + {0x31f0, 0x31ff}, /* 16x Katakana Phonetic Extensions */ + {0x3220, 0x3229}, /* 10x Enclosed CJK Letters & Months */ + {0x3248, 0x324f}, /* 8x Enclosed CJK Letters & Months */ + {0x3251, 0x325f}, /* 15x Enclosed CJK Letters & Months */ + {0x3280, 0x3289}, /* 10x Enclosed CJK Letters & Months */ + {0x32b1, 0x32bf}, /* 15x Enclosed CJK Letters & Months */ + {0x3400, 0x4db5}, /* 6582x CJK Unified Ideographs Extension A */ + {0x4dc0, 0x9fef}, /* 21040x Yijing Hexagram, CJK Unified Ideographs */ + {0xa000, 0xa48c}, /* 1165x Yi Syllables */ + {0xa4d0, 0xa4fd}, /* 46x Lisu */ + {0xa500, 0xa60c}, /* 269x Vai */ + {0xa610, 0xa62b}, /* 28x Vai */ + {0xa6a0, 0xa6ef}, /* 80x Bamum */ + {0xa80c, 0xa822}, /* 23x Syloti Nagri */ + {0xa840, 0xa873}, /* 52x Phags-pa */ + {0xa882, 0xa8b3}, /* 50x Saurashtra */ + {0xa8d0, 0xa8d9}, /* 10x Saurashtra */ + {0xa900, 0xa925}, /* 38x Kayah Li */ + {0xa930, 0xa946}, /* 23x Rejang */ + {0xa960, 0xa97c}, /* 29x Hangul Jamo Extended-A */ + {0xa984, 0xa9b2}, /* 47x Javanese */ + {0xa9cf, 0xa9d9}, /* 11x Javanese */ + {0xaa00, 0xaa28}, /* 41x Cham */ + {0xaa50, 0xaa59}, /* 10x Cham */ + {0xabf0, 0xabf9}, /* 10x Meetei Mayek */ + {0xac00, 0xd7a3}, /* 11172x Hangul Syllables */ + {0xf900, 0xfa6d}, /* 366x CJK Compatibility Ideographs */ + {0xfa70, 0xfad9}, /* 106x CJK Compatibility Ideographs */ + {0xfb1f, 0xfb28}, /* 10x Alphabetic Presentation Forms */ + {0xfb2a, 0xfb36}, /* 13x Alphabetic Presentation Forms */ + {0xfb46, 0xfbb1}, /* 108x Alphabetic Presentation Forms */ + {0xfbd3, 0xfd3d}, /* 363x Arabic Presentation Forms-A */ + {0xfe76, 0xfefc}, /* 135x Arabic Presentation Forms-B */ + {0xff10, 0xff19}, /* 10x Dubs */ + {0xff21, 0xff3a}, /* 26x Dubs */ + {0xff41, 0xff5a}, /* 26x Dubs */ + {0xff66, 0xffbe}, /* 89x Dubs */ + {0xffc2, 0xffc7}, /* 6x Dubs */ + {0xffca, 0xffcf}, /* 6x Dubs */ + {0xffd2, 0xffd7}, /* 6x Dubs */ + {0xffda, 0xffdc}, /* 3x Dubs */ +}; + +static const unsigned kAstralCodes[][2] = { + {0x10107, 0x10133}, /* 45x Aegean */ + {0x10140, 0x10178}, /* 57x Ancient Greek Numbers */ + {0x1018a, 0x1018b}, /* 2x Ancient Greek Numbers */ + {0x10280, 0x1029c}, /* 29x Lycian */ + {0x102a0, 0x102d0}, /* 49x Carian */ + {0x102e1, 0x102fb}, /* 27x Coptic Epact Numbers */ + {0x10300, 0x10323}, /* 36x Old Italic */ + {0x1032d, 0x1034a}, /* 30x Old Italic, Gothic */ + {0x10350, 0x10375}, /* 38x Old Permic */ + {0x10380, 0x1039d}, /* 30x Ugaritic */ + {0x103a0, 0x103c3}, /* 36x Old Persian */ + {0x103c8, 0x103cf}, /* 8x Old Persian */ + {0x103d1, 0x103d5}, /* 5x Old Persian */ + {0x10400, 0x1049d}, /* 158x Deseret, Shavian, Osmanya */ + {0x104b0, 0x104d3}, /* 36x Osage */ + {0x104d8, 0x104fb}, /* 36x Osage */ + {0x10500, 0x10527}, /* 40x Elbasan */ + {0x10530, 0x10563}, /* 52x Caucasian Albanian */ + {0x10600, 0x10736}, /* 311x Linear A */ + {0x10800, 0x10805}, /* 6x Cypriot Syllabary */ + {0x1080a, 0x10835}, /* 44x Cypriot Syllabary */ + {0x10837, 0x10838}, /* 2x Cypriot Syllabary */ + {0x1083f, 0x1089e}, /* 86x Cypriot,ImperialAramaic,Palmyrene,Nabataean */ + {0x108e0, 0x108f2}, /* 19x Hatran */ + {0x108f4, 0x108f5}, /* 2x Hatran */ + {0x108fb, 0x1091b}, /* 33x Hatran */ + {0x10920, 0x10939}, /* 26x Lydian */ + {0x10980, 0x109b7}, /* 56x Meroitic Hieromarks */ + {0x109bc, 0x109cf}, /* 20x Meroitic Cursive */ + {0x109d2, 0x10a00}, /* 47x Meroitic Cursive */ + {0x10a10, 0x10a13}, /* 4x Kharoshthi */ + {0x10a15, 0x10a17}, /* 3x Kharoshthi */ + {0x10a19, 0x10a35}, /* 29x Kharoshthi */ + {0x10a40, 0x10a48}, /* 9x Kharoshthi */ + {0x10a60, 0x10a7e}, /* 31x Old South Arabian */ + {0x10a80, 0x10a9f}, /* 32x Old North Arabian */ + {0x10ac0, 0x10ac7}, /* 8x Manichaean */ + {0x10ac9, 0x10ae4}, /* 28x Manichaean */ + {0x10aeb, 0x10aef}, /* 5x Manichaean */ + {0x10b00, 0x10b35}, /* 54x Avestan */ + {0x10b40, 0x10b55}, /* 22x Inscriptional Parthian */ + {0x10b58, 0x10b72}, /* 27x Inscriptional Parthian and Pahlavi */ + {0x10b78, 0x10b91}, /* 26x Inscriptional Pahlavi, Psalter Pahlavi */ + {0x10c00, 0x10c48}, /* 73x Old Turkic */ + {0x10c80, 0x10cb2}, /* 51x Old Hungarian */ + {0x10cc0, 0x10cf2}, /* 51x Old Hungarian */ + {0x10cfa, 0x10d23}, /* 42x Old Hungarian, Hanifi Rohingya */ + {0x10d30, 0x10d39}, /* 10x Hanifi Rohingya */ + {0x10e60, 0x10e7e}, /* 31x Rumi Numeral Symbols */ + {0x10f00, 0x10f27}, /* 40x Old Sogdian */ + {0x10f30, 0x10f45}, /* 22x Sogdian */ + {0x10f51, 0x10f54}, /* 4x Sogdian */ + {0x10fe0, 0x10ff6}, /* 23x Elymaic */ + {0x11003, 0x11037}, /* 53x Brahmi */ + {0x11052, 0x1106f}, /* 30x Brahmi */ + {0x11083, 0x110af}, /* 45x Kaithi */ + {0x110d0, 0x110e8}, /* 25x Sora Sompeng */ + {0x110f0, 0x110f9}, /* 10x Sora Sompeng */ + {0x11103, 0x11126}, /* 36x Chakma */ + {0x11136, 0x1113f}, /* 10x Chakma */ + {0x11144, 0x11144}, /* 1x Chakma */ + {0x11150, 0x11172}, /* 35x Mahajani */ + {0x11176, 0x11176}, /* 1x Mahajani */ + {0x11183, 0x111b2}, /* 48x Sharada */ + {0x111c1, 0x111c4}, /* 4x Sharada */ + {0x111d0, 0x111da}, /* 11x Sharada */ + {0x111dc, 0x111dc}, /* 1x Sharada */ + {0x111e1, 0x111f4}, /* 20x Sinhala Archaic Numbers */ + {0x11200, 0x11211}, /* 18x Khojki */ + {0x11213, 0x1122b}, /* 25x Khojki */ + {0x11280, 0x11286}, /* 7x Multani */ + {0x11288, 0x11288}, /* 1x Multani */ + {0x1128a, 0x1128d}, /* 4x Multani */ + {0x1128f, 0x1129d}, /* 15x Multani */ + {0x1129f, 0x112a8}, /* 10x Multani */ + {0x112b0, 0x112de}, /* 47x Khudawadi */ + {0x112f0, 0x112f9}, /* 10x Khudawadi */ + {0x11305, 0x1130c}, /* 8x Grantha */ + {0x1130f, 0x11310}, /* 2x Grantha */ + {0x11313, 0x11328}, /* 22x Grantha */ + {0x1132a, 0x11330}, /* 7x Grantha */ + {0x11332, 0x11333}, /* 2x Grantha */ + {0x11335, 0x11339}, /* 5x Grantha */ + {0x1133d, 0x1133d}, /* 1x Grantha */ + {0x11350, 0x11350}, /* 1x Grantha */ + {0x1135d, 0x11361}, /* 5x Grantha */ + {0x11400, 0x11434}, /* 53x Newa */ + {0x11447, 0x1144a}, /* 4x Newa */ + {0x11450, 0x11459}, /* 10x Newa */ + {0x1145f, 0x1145f}, /* 1x Newa */ + {0x11480, 0x114af}, /* 48x Tirhuta */ + {0x114c4, 0x114c5}, /* 2x Tirhuta */ + {0x114c7, 0x114c7}, /* 1x Tirhuta */ + {0x114d0, 0x114d9}, /* 10x Tirhuta */ + {0x11580, 0x115ae}, /* 47x Siddham */ + {0x115d8, 0x115db}, /* 4x Siddham */ + {0x11600, 0x1162f}, /* 48x Modi */ + {0x11644, 0x11644}, /* 1x Modi */ + {0x11650, 0x11659}, /* 10x Modi */ + {0x11680, 0x116aa}, /* 43x Takri */ + {0x116b8, 0x116b8}, /* 1x Takri */ + {0x116c0, 0x116c9}, /* 10x Takri */ + {0x11700, 0x1171a}, /* 27x Ahom */ + {0x11730, 0x1173b}, /* 12x Ahom */ + {0x11800, 0x1182b}, /* 44x Dogra */ + {0x118a0, 0x118f2}, /* 83x Warang Citi */ + {0x118ff, 0x118ff}, /* 1x Warang Citi */ + {0x119a0, 0x119a7}, /* 8x Nandinagari */ + {0x119aa, 0x119d0}, /* 39x Nandinagari */ + {0x119e1, 0x119e1}, /* 1x Nandinagari */ + {0x119e3, 0x119e3}, /* 1x Nandinagari */ + {0x11a00, 0x11a00}, /* 1x Zanabazar Square */ + {0x11a0b, 0x11a32}, /* 40x Zanabazar Square */ + {0x11a3a, 0x11a3a}, /* 1x Zanabazar Square */ + {0x11a50, 0x11a50}, /* 1x Soyombo */ + {0x11a5c, 0x11a89}, /* 46x Soyombo */ + {0x11a9d, 0x11a9d}, /* 1x Soyombo */ + {0x11ac0, 0x11af8}, /* 57x Pau Cin Hau */ + {0x11c00, 0x11c08}, /* 9x Bhaiksuki */ + {0x11c0a, 0x11c2e}, /* 37x Bhaiksuki */ + {0x11c40, 0x11c40}, /* 1x Bhaiksuki */ + {0x11c50, 0x11c6c}, /* 29x Bhaiksuki */ + {0x11c72, 0x11c8f}, /* 30x Marchen */ + {0x11d00, 0x11d06}, /* 7x Masaram Gondi */ + {0x11d08, 0x11d09}, /* 2x Masaram Gondi */ + {0x11d0b, 0x11d30}, /* 38x Masaram Gondi */ + {0x11d46, 0x11d46}, /* 1x Masaram Gondi */ + {0x11d50, 0x11d59}, /* 10x Masaram Gondi */ + {0x11d60, 0x11d65}, /* 6x Gunjala Gondi */ + {0x11d67, 0x11d68}, /* 2x Gunjala Gondi */ + {0x11d6a, 0x11d89}, /* 32x Gunjala Gondi */ + {0x11d98, 0x11d98}, /* 1x Gunjala Gondi */ + {0x11da0, 0x11da9}, /* 10x Gunjala Gondi */ + {0x11ee0, 0x11ef2}, /* 19x Makasar */ + {0x11fc0, 0x11fd4}, /* 21x Tamil Supplement */ + {0x12000, 0x12399}, /* 922x Cuneiform */ + {0x12400, 0x1246e}, /* 111x Cuneiform Numbers & Punctuation */ + {0x12480, 0x12543}, /* 196x Early Dynastic Cuneiform */ + {0x13000, 0x1342e}, /* 1071x Egyptian Hieromarks */ + {0x14400, 0x14646}, /* 583x Anatolian Hieromarks */ + {0x16800, 0x16a38}, /* 569x Bamum Supplement */ + {0x16a40, 0x16a5e}, /* 31x Mro */ + {0x16a60, 0x16a69}, /* 10x Mro */ + {0x16ad0, 0x16aed}, /* 30x Bassa Vah */ + {0x16b00, 0x16b2f}, /* 48x Pahawh Hmong */ + {0x16b40, 0x16b43}, /* 4x Pahawh Hmong */ + {0x16b50, 0x16b59}, /* 10x Pahawh Hmong */ + {0x16b5b, 0x16b61}, /* 7x Pahawh Hmong */ + {0x16b63, 0x16b77}, /* 21x Pahawh Hmong */ + {0x16b7d, 0x16b8f}, /* 19x Pahawh Hmong */ + {0x16e40, 0x16e96}, /* 87x Medefaidrin */ + {0x16f00, 0x16f4a}, /* 75x Miao */ + {0x16f50, 0x16f50}, /* 1x Miao */ + {0x16f93, 0x16f9f}, /* 13x Miao */ + {0x16fe0, 0x16fe1}, /* 2x Ideographic Symbols & Punctuation */ + {0x16fe3, 0x16fe3}, /* 1x Ideographic Symbols & Punctuation */ + {0x17000, 0x187f7}, /* 6136x Tangut */ + {0x18800, 0x18af2}, /* 755x Tangut Components */ + {0x1b000, 0x1b11e}, /* 287x Kana Supplement */ + {0x1b150, 0x1b152}, /* 3x Small Kana Extension */ + {0x1b164, 0x1b167}, /* 4x Small Kana Extension */ + {0x1b170, 0x1b2fb}, /* 396x Nushu */ + {0x1bc00, 0x1bc6a}, /* 107x Duployan */ + {0x1bc70, 0x1bc7c}, /* 13x Duployan */ + {0x1bc80, 0x1bc88}, /* 9x Duployan */ + {0x1bc90, 0x1bc99}, /* 10x Duployan */ + {0x1d2e0, 0x1d2f3}, /* 20x Mayan Numerals */ + {0x1d360, 0x1d378}, /* 25x Counting Rod Numerals */ + {0x1d400, 0x1d454}, /* 85x 𝐀..𝑔 Math */ + {0x1d456, 0x1d49c}, /* 71x 𝑖..𝒜 Math */ + {0x1d49e, 0x1d49f}, /* 2x 𝒞..𝒟 Math */ + {0x1d4a2, 0x1d4a2}, /* 1x 𝒢..𝒢 Math */ + {0x1d4a5, 0x1d4a6}, /* 2x 𝒥..𝒦 Math */ + {0x1d4a9, 0x1d4ac}, /* 4x 𝒩..𝒬 Math */ + {0x1d4ae, 0x1d4b9}, /* 12x 𝒮..𝒹 Math */ + {0x1d4bb, 0x1d4bb}, /* 1x 𝒻..𝒻 Math */ + {0x1d4bd, 0x1d4c3}, /* 7x 𝒽..𝓃 Math */ + {0x1d4c5, 0x1d505}, /* 65x 𝓅..𝔅 Math */ + {0x1d507, 0x1d50a}, /* 4x 𝔇..𝔊 Math */ + {0x1d50d, 0x1d514}, /* 8x 𝔍..𝔔 Math */ + {0x1d516, 0x1d51c}, /* 7x 𝔖..𝔜 Math */ + {0x1d51e, 0x1d539}, /* 28x 𝔞..𝔹 Math */ + {0x1d53b, 0x1d53e}, /* 4x 𝔻..𝔾 Math */ + {0x1d540, 0x1d544}, /* 5x 𝕀..𝕄 Math */ + {0x1d546, 0x1d546}, /* 1x 𝕆..𝕆 Math */ + {0x1d54a, 0x1d550}, /* 7x 𝕊..𝕐 Math */ + {0x1d552, 0x1d6a5}, /* 340x 𝕒..𝚥 Math */ + {0x1d6a8, 0x1d6c0}, /* 25x 𝚨..𝛀 Math */ + {0x1d6c2, 0x1d6da}, /* 25x 𝛂..𝛚 Math */ + {0x1d6dc, 0x1d6fa}, /* 31x 𝛜..𝛺 Math */ + {0x1d6fc, 0x1d714}, /* 25x 𝛼..𝜔 Math */ + {0x1d716, 0x1d734}, /* 31x 𝜖..𝜴 Math */ + {0x1d736, 0x1d74e}, /* 25x 𝜶..𝝎 Math */ + {0x1d750, 0x1d76e}, /* 31x 𝝐..𝝮 Math */ + {0x1d770, 0x1d788}, /* 25x 𝝰..𝞈 Math */ + {0x1d78a, 0x1d7a8}, /* 31x 𝞊..𝞨 Math */ + {0x1d7aa, 0x1d7c2}, /* 25x 𝞪..𝟂 Math */ + {0x1d7c4, 0x1d7cb}, /* 8x 𝟄..𝟋 Math */ + {0x1d7ce, 0x1d9ff}, /* 562x Math, Sutton SignWriting */ + {0x1f100, 0x1f10c}, /* 13x Enclosed Alphanumeric Supplement */ + {0x20000, 0x2a6d6}, /* 42711x CJK Unified Ideographs Extension B */ + {0x2a700, 0x2b734}, /* 4149x CJK Unified Ideographs Extension C */ + {0x2b740, 0x2b81d}, /* 222x CJK Unified Ideographs Extension D */ + {0x2b820, 0x2cea1}, /* 5762x CJK Unified Ideographs Extension E */ + {0x2ceb0, 0x2ebe0}, /* 7473x CJK Unified Ideographs Extension F */ + {0x2f800, 0x2fa1d}, /* 542x CJK Compatibility Ideographs Supplement */ +}; + +/** + * Returns nonzero if 𝑐 isn't alphanumeric. + * + * Line reading interfaces generally define this operation as UNICODE + * characters that aren't in the letter category (Lu, Ll, Lt, Lm, Lo) + * and aren't in the number categorie (Nd, Nl, No). We also add a few + * other things like blocks and emoji (So). + */ +int iswseparator(wint_t c) { + int m, l, r; + if (c < 0200) { + return !(('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') || + ('a' <= c && c <= 'z')); + } + if (c <= 0xffff) { + l = 0; + r = sizeof(kCodes) / sizeof(kCodes[0]); + while (l < r) { + m = (l + r) >> 1; + if (kCodes[m][1] < c) { + l = m + 1; + } else { + r = m; + } + } + return !(kCodes[l][0] <= c && c <= kCodes[l][1]); + } else { + l = 0; + r = sizeof(kAstralCodes) / sizeof(kAstralCodes[0]); + while (l < r) { + m = (l + r) >> 1; + if (kAstralCodes[m][1] < c) { + l = m + 1; + } else { + r = m; + } + } + return !(kAstralCodes[l][0] <= c && c <= kAstralCodes[l][1]); + } +} diff --git a/libc/str/iswupper.c b/libc/str/iswupper.c index 21ff22af9..d746628c4 100644 --- a/libc/str/iswupper.c +++ b/libc/str/iswupper.c @@ -22,1772 +22,141 @@ * Returns nonzero if c is uppercase letter. */ int iswupper(wint_t c) { - if (isascii(c)) return isupper(c); - switch (c) { - case u'À': // LATIN CAPITAL A W/ GRAVE 00c0 - case u'Á': // LATIN CAPITAL A W/ ACUTE 00c1 - case u'Â': // LATIN CAPITAL A W/ CIRCUMFLEX 00c2 - case u'Ã': // LATIN CAPITAL A W/ TILDE 00c3 - case u'Ä': // LATIN CAPITAL A W/ DIAERESIS 00c4 - case u'Å': // LATIN CAPITAL A W/ RING ABOVE 00c5 - case u'Æ': // LATIN CAPITAL AE 00c6 - case u'Ç': // LATIN CAPITAL C W/ CEDILLA 00c7 - case u'È': // LATIN CAPITAL E W/ GRAVE 00c8 - case u'É': // LATIN CAPITAL E W/ ACUTE 00c9 - case u'Ê': // LATIN CAPITAL E W/ CIRCUMFLEX 00ca - case u'Ë': // LATIN CAPITAL E W/ DIAERESIS 00cb - case u'Ì': // LATIN CAPITAL I W/ GRAVE 00cc - case u'Í': // LATIN CAPITAL I W/ ACUTE 00cd - case u'Î': // LATIN CAPITAL I W/ CIRCUMFLEX 00ce - case u'Ï': // LATIN CAPITAL I W/ DIAERESIS 00cf - case u'Ð': // LATIN CAPITAL ETH 00d0 - case u'Ñ': // LATIN CAPITAL N W/ TILDE 00d1 - case u'Ò': // LATIN CAPITAL O W/ GRAVE 00d2 - case u'Ó': // LATIN CAPITAL O W/ ACUTE 00d3 - case u'Ô': // LATIN CAPITAL O W/ CIRCUMFLEX 00d4 - case u'Õ': // LATIN CAPITAL O W/ TILDE 00d5 - case u'Ö': // LATIN CAPITAL O W/ DIAERESIS 00d6 - case u'Ø': // LATIN CAPITAL O W/ STROKE 00d8 - case u'Ù': // LATIN CAPITAL U W/ GRAVE 00d9 - case u'Ú': // LATIN CAPITAL U W/ ACUTE 00da - case u'Û': // LATIN CAPITAL U W/ CIRCUMFLEX 00db - case u'Ü': // LATIN CAPITAL U W/ DIAERESIS 00dc - case u'Ý': // LATIN CAPITAL Y W/ ACUTE 00dd - case u'Þ': // LATIN CAPITAL THORN 00de - case u'Ā': // LATIN CAPITAL A W/ MACRON 0100 - case u'Ă': // LATIN CAPITAL A W/ BREVE 0102 - case u'Ą': // LATIN CAPITAL A W/ OGONEK 0104 - case u'Ć': // LATIN CAPITAL C W/ ACUTE 0106 - case u'Ĉ': // LATIN CAPITAL C W/ CIRCUMFLEX 0108 - case u'Ċ': // LATIN CAPITAL C W/ DOT ABOVE 010a - case u'Č': // LATIN CAPITAL C W/ CARON 010c - case u'Ď': // LATIN CAPITAL D W/ CARON 010e - case u'Đ': // LATIN CAPITAL D W/ STROKE 0110 - case u'Ē': // LATIN CAPITAL E W/ MACRON 0112 - case u'Ĕ': // LATIN CAPITAL E W/ BREVE 0114 - case u'Ė': // LATIN CAPITAL E W/ DOT ABOVE 0116 - case u'Ę': // LATIN CAPITAL E W/ OGONEK 0118 - case u'Ě': // LATIN CAPITAL E W/ CARON 011a - case u'Ĝ': // LATIN CAPITAL G W/ CIRCUMFLEX 011c - case u'Ğ': // LATIN CAPITAL G W/ BREVE 011e - case u'Ġ': // LATIN CAPITAL G W/ DOT ABOVE 0120 - case u'Ģ': // LATIN CAPITAL G W/ CEDILLA 0122 - case u'Ĥ': // LATIN CAPITAL H W/ CIRCUMFLEX 0124 - case u'Ħ': // LATIN CAPITAL H W/ STROKE 0126 - case u'Ĩ': // LATIN CAPITAL I W/ TILDE 0128 - case u'Ī': // LATIN CAPITAL I W/ MACRON 012a - case u'Ĭ': // LATIN CAPITAL I W/ BREVE 012c - case u'Į': // LATIN CAPITAL I W/ OGONEK 012e - case u'İ': // LATIN CAPITAL I W/ DOT ABOVE 0130 - case u'IJ': // LATIN CAPITAL LIGATURE IJ 0132 - case u'Ĵ': // LATIN CAPITAL J W/ CIRCUMFLEX 0134 - case u'Ķ': // LATIN CAPITAL K W/ CEDILLA 0136 - case u'Ĺ': // LATIN CAPITAL L W/ ACUTE 0139 - case u'Ļ': // LATIN CAPITAL L W/ CEDILLA 013b - case u'Ľ': // LATIN CAPITAL L W/ CARON 013d - case u'Ŀ': // LATIN CAPITAL L W/ MIDDLE DOT 013f - case u'Ł': // LATIN CAPITAL L W/ STROKE 0141 - case u'Ń': // LATIN CAPITAL N W/ ACUTE 0143 - case u'Ņ': // LATIN CAPITAL N W/ CEDILLA 0145 - case u'Ň': // LATIN CAPITAL N W/ CARON 0147 - case u'Ŋ': // LATIN CAPITAL ENG 014a - case u'Ō': // LATIN CAPITAL O W/ MACRON 014c - case u'Ŏ': // LATIN CAPITAL O W/ BREVE 014e - case u'Ő': // LATIN CAPITAL O W/ DOUBLE ACUTE 0150 - case u'Œ': // LATIN CAPITAL LIGATURE OE 0152 - case u'Ŕ': // LATIN CAPITAL R W/ ACUTE 0154 - case u'Ŗ': // LATIN CAPITAL R W/ CEDILLA 0156 - case u'Ř': // LATIN CAPITAL R W/ CARON 0158 - case u'Ś': // LATIN CAPITAL S W/ ACUTE 015a - case u'Ŝ': // LATIN CAPITAL S W/ CIRCUMFLEX 015c - case u'Ş': // LATIN CAPITAL S W/ CEDILLA 015e - case u'Š': // LATIN CAPITAL S W/ CARON 0160 - case u'Ţ': // LATIN CAPITAL T W/ CEDILLA 0162 - case u'Ť': // LATIN CAPITAL T W/ CARON 0164 - case u'Ŧ': // LATIN CAPITAL T W/ STROKE 0166 - case u'Ũ': // LATIN CAPITAL U W/ TILDE 0168 - case u'Ū': // LATIN CAPITAL U W/ MACRON 016a - case u'Ŭ': // LATIN CAPITAL U W/ BREVE 016c - case u'Ů': // LATIN CAPITAL U W/ RING ABOVE 016e - case u'Ű': // LATIN CAPITAL U W/ DOUBLE ACUTE 0170 - case u'Ų': // LATIN CAPITAL U W/ OGONEK 0172 - case u'Ŵ': // LATIN CAPITAL W W/ CIRCUMFLEX 0174 - case u'Ŷ': // LATIN CAPITAL Y W/ CIRCUMFLEX 0176 - case u'Ÿ': // LATIN CAPITAL Y W/ DIAERESIS 0178 - case u'Ź': // LATIN CAPITAL Z W/ ACUTE 0179 - case u'Ż': // LATIN CAPITAL Z W/ DOT ABOVE 017b - case u'Ž': // LATIN CAPITAL Z W/ CARON 017d - case u'Ɓ': // LATIN CAPITAL B W/ HOOK 0181 - case u'Ƃ': // LATIN CAPITAL B W/ TOPBAR 0182 - case u'Ƅ': // LATIN CAPITAL TONE SIX 0184 - case u'Ɔ': // LATIN CAPITAL OPEN O 0186 - case u'Ƈ': // LATIN CAPITAL C W/ HOOK 0187 - case u'Ɖ': // LATIN CAPITAL AFRICAN D 0189 - case u'Ɗ': // LATIN CAPITAL D W/ HOOK 018a - case u'Ƌ': // LATIN CAPITAL D W/ TOPBAR 018b - case u'Ǝ': // LATIN CAPITAL REVERSED E 018e - case u'Ə': // LATIN CAPITAL SCHWA 018f - case u'Ɛ': // LATIN CAPITAL OPEN E 0190 - case u'Ƒ': // LATIN CAPITAL F W/ HOOK 0191 - case u'Ɠ': // LATIN CAPITAL G W/ HOOK 0193 - case u'Ɣ': // LATIN CAPITAL GAMMA 0194 - case u'Ɩ': // LATIN CAPITAL IOTA 0196 - case u'Ɨ': // LATIN CAPITAL I W/ STROKE 0197 - case u'Ƙ': // LATIN CAPITAL K W/ HOOK 0198 - case u'Ɯ': // LATIN CAPITAL TURNED M 019c - case u'Ɲ': // LATIN CAPITAL N W/ LEFT HOOK 019d - case u'Ɵ': // LATIN CAPITAL O W/ MIDDLE TILDE 019f - case u'Ơ': // LATIN CAPITAL O W/ HORN 01a0 - case u'Ƣ': // LATIN CAPITAL OI 01a2 - case u'Ƥ': // LATIN CAPITAL P W/ HOOK 01a4 - case u'Ʀ': // LATIN LETTER YR 01a6 - case u'Ƨ': // LATIN CAPITAL TONE TWO 01a7 - case u'Ʃ': // LATIN CAPITAL ESH 01a9 - case u'Ƭ': // LATIN CAPITAL T W/ HOOK 01ac - case u'Ʈ': // LATIN CAPITAL T W/ RETROFLEX HOOK 01ae - case u'Ư': // LATIN CAPITAL U W/ HORN 01af - case u'Ʊ': // LATIN CAPITAL UPSILON 01b1 - case u'Ʋ': // LATIN CAPITAL V W/ HOOK 01b2 - case u'Ƴ': // LATIN CAPITAL Y W/ HOOK 01b3 - case u'Ƶ': // LATIN CAPITAL Z W/ STROKE 01b5 - case u'Ʒ': // LATIN CAPITAL EZH 01b7 - case u'Ƹ': // LATIN CAPITAL EZH REVERSED 01b8 - case u'Ƽ': // LATIN CAPITAL TONE FIVE 01bc - case u'DŽ': // LATIN CAPITAL DZ W/ CARON 01c4 - case u'LJ': // LATIN CAPITAL LJ 01c7 - case u'NJ': // LATIN CAPITAL NJ 01ca - case u'Ǎ': // LATIN CAPITAL A W/ CARON 01cd - case u'Ǐ': // LATIN CAPITAL I W/ CARON 01cf - case u'Ǒ': // LATIN CAPITAL O W/ CARON 01d1 - case u'Ǔ': // LATIN CAPITAL U W/ CARON 01d3 - case u'Ǖ': // LATIN CAPITAL U W/ DIAERESIS AND MACRON 01d5 - case u'Ǘ': // LATIN CAPITAL U W/ DIAERESIS AND ACUTE 01d7 - case u'Ǚ': // LATIN CAPITAL U W/ DIAERESIS AND CARON 01d9 - case u'Ǜ': // LATIN CAPITAL U W/ DIAERESIS AND GRAVE 01db - case u'Ǟ': // LATIN CAPITAL A W/ DIAERESIS AND MACRON 01de - case u'Ǡ': // LATIN CAPITAL A W/ DOT ABOVE AND MACRON 01e0 - case u'Ǣ': // LATIN CAPITAL AE W/ MACRON 01e2 - case u'Ǥ': // LATIN CAPITAL G W/ STROKE 01e4 - case u'Ǧ': // LATIN CAPITAL G W/ CARON 01e6 - case u'Ǩ': // LATIN CAPITAL K W/ CARON 01e8 - case u'Ǫ': // LATIN CAPITAL O W/ OGONEK 01ea - case u'Ǭ': // LATIN CAPITAL O W/ OGONEK AND MACRON 01ec - case u'Ǯ': // LATIN CAPITAL EZH W/ CARON 01ee - case u'DZ': // LATIN CAPITAL DZ 01f1 - case u'Ǵ': // LATIN CAPITAL G W/ ACUTE 01f4 - case u'Ƕ': // LATIN CAPITAL HWAIR 01f6 - case u'Ƿ': // LATIN CAPITAL WYNN 01f7 - case u'Ǹ': // LATIN CAPITAL N W/ GRAVE 01f8 - case u'Ǻ': // LATIN CAPITAL A W/ RING ABOVE AND ACUTE 01fa - case u'Ǽ': // LATIN CAPITAL AE W/ ACUTE 01fc - case u'Ǿ': // LATIN CAPITAL O W/ STROKE AND ACUTE 01fe - case u'Ȁ': // LATIN CAPITAL A W/ DOUBLE GRAVE 0200 - case u'Ȃ': // LATIN CAPITAL A W/ INVERTED BREVE 0202 - case u'Ȅ': // LATIN CAPITAL E W/ DOUBLE GRAVE 0204 - case u'Ȇ': // LATIN CAPITAL E W/ INVERTED BREVE 0206 - case u'Ȉ': // LATIN CAPITAL I W/ DOUBLE GRAVE 0208 - case u'Ȋ': // LATIN CAPITAL I W/ INVERTED BREVE 020a - case u'Ȍ': // LATIN CAPITAL O W/ DOUBLE GRAVE 020c - case u'Ȏ': // LATIN CAPITAL O W/ INVERTED BREVE 020e - case u'Ȑ': // LATIN CAPITAL R W/ DOUBLE GRAVE 0210 - case u'Ȓ': // LATIN CAPITAL R W/ INVERTED BREVE 0212 - case u'Ȕ': // LATIN CAPITAL U W/ DOUBLE GRAVE 0214 - case u'Ȗ': // LATIN CAPITAL U W/ INVERTED BREVE 0216 - case u'Ș': // LATIN CAPITAL S W/ COMMA BELOW 0218 - case u'Ț': // LATIN CAPITAL T W/ COMMA BELOW 021a - case u'Ȝ': // LATIN CAPITAL YOGH 021c - case u'Ȟ': // LATIN CAPITAL H W/ CARON 021e - case u'Ƞ': // LATIN CAPITAL N W/ LONG RIGHT LEG 0220 - case u'Ȣ': // LATIN CAPITAL OU 0222 - case u'Ȥ': // LATIN CAPITAL Z W/ HOOK 0224 - case u'Ȧ': // LATIN CAPITAL A W/ DOT ABOVE 0226 - case u'Ȩ': // LATIN CAPITAL E W/ CEDILLA 0228 - case u'Ȫ': // LATIN CAPITAL O W/ DIAERESIS AND MACRON 022a - case u'Ȭ': // LATIN CAPITAL O W/ TILDE AND MACRON 022c - case u'Ȯ': // LATIN CAPITAL O W/ DOT ABOVE 022e - case u'Ȱ': // LATIN CAPITAL O W/ DOT ABOVE AND MACRON 0230 - case u'Ȳ': // LATIN CAPITAL Y W/ MACRON 0232 - case u'Ⱥ': // LATIN CAPITAL A W/ STROKE 023a - case u'Ȼ': // LATIN CAPITAL C W/ STROKE 023b - case u'Ƚ': // LATIN CAPITAL L W/ BAR 023d - case u'Ⱦ': // LATIN CAPITAL T W/ DIAGONAL STROKE 023e - case u'Ɂ': // LATIN CAPITAL GLOTTAL STOP 0241 - case u'Ƀ': // LATIN CAPITAL B W/ STROKE 0243 - case u'Ʉ': // LATIN CAPITAL U BAR 0244 - case u'Ʌ': // LATIN CAPITAL TURNED V 0245 - case u'Ɇ': // LATIN CAPITAL E W/ STROKE 0246 - case u'Ɉ': // LATIN CAPITAL J W/ STROKE 0248 - case u'Ɋ': // LATIN CAPITAL SMALL Q W/ HOOK TAIL 024a - case u'Ɍ': // LATIN CAPITAL R W/ STROKE 024c - case u'Ɏ': // LATIN CAPITAL Y W/ STROKE 024e - case u'Ͱ': // GREEK CAPITAL HETA 0370 - case u'Ͳ': // GREEK CAPITAL ARCHAIC SAMPI 0372 - case u'Ͷ': // GREEK CAPITAL PAMPHYLIAN DIGAMMA 0376 - case u'Ϳ': // GREEK CAPITAL YOT 037f - case u'Ά': // GREEK CAPITAL ALPHA W/ TONOS 0386 - case u'Έ': // GREEK CAPITAL EPSILON W/ TONOS 0388 - case u'Ή': // GREEK CAPITAL ETA W/ TONOS 0389 - case u'Ί': // GREEK CAPITAL IOTA W/ TONOS 038a - case u'Ό': // GREEK CAPITAL OMICRON W/ TONOS 038c - case u'Ύ': // GREEK CAPITAL UPSILON W/ TONOS 038e - case u'Ώ': // GREEK CAPITAL OMEGA W/ TONOS 038f - case u'Α': // GREEK CAPITAL ALPHA 0391 - case u'Β': // GREEK CAPITAL BETA 0392 - case u'Γ': // GREEK CAPITAL GAMMA 0393 - case u'Δ': // GREEK CAPITAL DELTA 0394 - case u'Ε': // GREEK CAPITAL EPSILON 0395 - case u'Ζ': // GREEK CAPITAL ZETA 0396 - case u'Η': // GREEK CAPITAL ETA 0397 - case u'Θ': // GREEK CAPITAL THETA 0398 - case u'Ι': // GREEK CAPITAL IOTA 0399 - case u'Κ': // GREEK CAPITAL KAPPA 039a - case u'Λ': // GREEK CAPITAL LAMDA 039b - case u'Μ': // GREEK CAPITAL MU 039c - case u'Ν': // GREEK CAPITAL NU 039d - case u'Ξ': // GREEK CAPITAL XI 039e - case u'Ο': // GREEK CAPITAL OMICRON 039f - case u'Π': // GREEK CAPITAL PI 03a0 - case u'Ρ': // GREEK CAPITAL RHO 03a1 - case u'Σ': // GREEK CAPITAL SIGMA 03a3 - case u'Τ': // GREEK CAPITAL TAU 03a4 - case u'Υ': // GREEK CAPITAL UPSILON 03a5 - case u'Φ': // GREEK CAPITAL PHI 03a6 - case u'Χ': // GREEK CAPITAL CHI 03a7 - case u'Ψ': // GREEK CAPITAL PSI 03a8 - case u'Ω': // GREEK CAPITAL OMEGA 03a9 - case u'Ϊ': // GREEK CAPITAL IOTA W/ DIALYTIKA 03aa - case u'Ϋ': // GREEK CAPITAL UPSILON W/ DIALYTIKA 03ab - case u'Ϗ': // GREEK CAPITAL KAI SYMBOL 03cf - case u'ϒ': // GREEK UPSILON W/ HOOK SYMBOL 03d2 - case u'ϓ': // GREEK UPSILON W/ ACUTE AND HOOK SYMBOL 03d3 - case u'ϔ': // GREEK UPSILON W/ DIAERESIS AND HOOK SYMBOL 03d4 - case u'Ϙ': // GREEK LETTER ARCHAIC KOPPA 03d8 - case u'Ϛ': // GREEK LETTER STIGMA 03da - case u'Ϝ': // GREEK LETTER DIGAMMA 03dc - case u'Ϟ': // GREEK LETTER KOPPA 03de - case u'Ϡ': // GREEK LETTER SAMPI 03e0 - case u'Ϣ': // COPTIC CAPITAL SHEI 03e2 - case u'Ϥ': // COPTIC CAPITAL FEI 03e4 - case u'Ϧ': // COPTIC CAPITAL KHEI 03e6 - case u'Ϩ': // COPTIC CAPITAL HORI 03e8 - case u'Ϫ': // COPTIC CAPITAL GANGIA 03ea - case u'Ϭ': // COPTIC CAPITAL SHIMA 03ec - case u'Ϯ': // COPTIC CAPITAL DEI 03ee - case u'ϴ': // GREEK CAPITAL THETA SYMBOL 03f4 - case u'Ϸ': // GREEK CAPITAL SHO 03f7 - case u'Ϲ': // GREEK CAPITAL LUNATE SIGMA SYMBOL 03f9 - case u'Ϻ': // GREEK CAPITAL SAN 03fa - case u'Ͻ': // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL 03fd - case u'Ͼ': // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL 03fe - case u'Ͽ': // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL 03ff - case u'Ѐ': // CYRILLIC CAPITAL IE W/ GRAVE 0400 - case u'Ё': // CYRILLIC CAPITAL IO 0401 - case u'Ђ': // CYRILLIC CAPITAL DJE 0402 - case u'Ѓ': // CYRILLIC CAPITAL GJE 0403 - case u'Є': // CYRILLIC CAPITAL UKRAINIAN IE 0404 - case u'Ѕ': // CYRILLIC CAPITAL DZE 0405 - case u'І': // CYRILLIC CAPITAL BYELORUSSIAN-UKRAINIAN I 0406 - case u'Ї': // CYRILLIC CAPITAL YI 0407 - case u'Ј': // CYRILLIC CAPITAL JE 0408 - case u'Љ': // CYRILLIC CAPITAL LJE 0409 - case u'Њ': // CYRILLIC CAPITAL NJE 040a - case u'Ћ': // CYRILLIC CAPITAL TSHE 040b - case u'Ќ': // CYRILLIC CAPITAL KJE 040c - case u'Ѝ': // CYRILLIC CAPITAL I W/ GRAVE 040d - case u'Ў': // CYRILLIC CAPITAL SHORT U 040e - case u'Џ': // CYRILLIC CAPITAL DZHE 040f - case u'А': // CYRILLIC CAPITAL A 0410 - case u'Б': // CYRILLIC CAPITAL BE 0411 - case u'В': // CYRILLIC CAPITAL VE 0412 - case u'Г': // CYRILLIC CAPITAL GHE 0413 - case u'Д': // CYRILLIC CAPITAL DE 0414 - case u'Е': // CYRILLIC CAPITAL IE 0415 - case u'Ж': // CYRILLIC CAPITAL ZHE 0416 - case u'З': // CYRILLIC CAPITAL ZE 0417 - case u'И': // CYRILLIC CAPITAL I 0418 - case u'Й': // CYRILLIC CAPITAL SHORT I 0419 - case u'К': // CYRILLIC CAPITAL KA 041a - case u'Л': // CYRILLIC CAPITAL EL 041b - case u'М': // CYRILLIC CAPITAL EM 041c - case u'Н': // CYRILLIC CAPITAL EN 041d - case u'О': // CYRILLIC CAPITAL O 041e - case u'П': // CYRILLIC CAPITAL PE 041f - case u'Р': // CYRILLIC CAPITAL ER 0420 - case u'С': // CYRILLIC CAPITAL ES 0421 - case u'Т': // CYRILLIC CAPITAL TE 0422 - case u'У': // CYRILLIC CAPITAL U 0423 - case u'Ф': // CYRILLIC CAPITAL EF 0424 - case u'Х': // CYRILLIC CAPITAL HA 0425 - case u'Ц': // CYRILLIC CAPITAL TSE 0426 - case u'Ч': // CYRILLIC CAPITAL CHE 0427 - case u'Ш': // CYRILLIC CAPITAL SHA 0428 - case u'Щ': // CYRILLIC CAPITAL SHCHA 0429 - case u'Ъ': // CYRILLIC CAPITAL HARD SIGN 042a - case u'Ы': // CYRILLIC CAPITAL YERU 042b - case u'Ь': // CYRILLIC CAPITAL SOFT SIGN 042c - case u'Э': // CYRILLIC CAPITAL E 042d - case u'Ю': // CYRILLIC CAPITAL YU 042e - case u'Я': // CYRILLIC CAPITAL YA 042f - case u'Ѡ': // CYRILLIC CAPITAL OMEGA 0460 - case u'Ѣ': // CYRILLIC CAPITAL YAT 0462 - case u'Ѥ': // CYRILLIC CAPITAL IOTIFIED E 0464 - case u'Ѧ': // CYRILLIC CAPITAL LITTLE YUS 0466 - case u'Ѩ': // CYRILLIC CAPITAL IOTIFIED LITTLE YUS 0468 - case u'Ѫ': // CYRILLIC CAPITAL BIG YUS 046a - case u'Ѭ': // CYRILLIC CAPITAL IOTIFIED BIG YUS 046c - case u'Ѯ': // CYRILLIC CAPITAL KSI 046e - case u'Ѱ': // CYRILLIC CAPITAL PSI 0470 - case u'Ѳ': // CYRILLIC CAPITAL FITA 0472 - case u'Ѵ': // CYRILLIC CAPITAL IZHITSA 0474 - case u'Ѷ': // CYRILLIC CAPITAL IZHITSA W/ DOUBLE GRAVE ACCENT 0476 - case u'Ѹ': // CYRILLIC CAPITAL UK 0478 - case u'Ѻ': // CYRILLIC CAPITAL ROUND OMEGA 047a - case u'Ѽ': // CYRILLIC CAPITAL OMEGA W/ TITLO 047c - case u'Ѿ': // CYRILLIC CAPITAL OT 047e - case u'Ҁ': // CYRILLIC CAPITAL KOPPA 0480 - case u'Ҋ': // CYRILLIC CAPITAL SHORT I W/ TAIL 048a - case u'Ҍ': // CYRILLIC CAPITAL SEMISOFT SIGN 048c - case u'Ҏ': // CYRILLIC CAPITAL ER W/ TICK 048e - case u'Ґ': // CYRILLIC CAPITAL GHE W/ UPTURN 0490 - case u'Ғ': // CYRILLIC CAPITAL GHE W/ STROKE 0492 - case u'Ҕ': // CYRILLIC CAPITAL GHE W/ MIDDLE HOOK 0494 - case u'Җ': // CYRILLIC CAPITAL ZHE W/ DESCENDER 0496 - case u'Ҙ': // CYRILLIC CAPITAL ZE W/ DESCENDER 0498 - case u'Қ': // CYRILLIC CAPITAL KA W/ DESCENDER 049a - case u'Ҝ': // CYRILLIC CAPITAL KA W/ VERTICAL STROKE 049c - case u'Ҟ': // CYRILLIC CAPITAL KA W/ STROKE 049e - case u'Ҡ': // CYRILLIC CAPITAL BASHKIR KA 04a0 - case u'Ң': // CYRILLIC CAPITAL EN W/ DESCENDER 04a2 - case u'Ҥ': // CYRILLIC CAPITAL LIGATURE EN GHE 04a4 - case u'Ҧ': // CYRILLIC CAPITAL PE W/ MIDDLE HOOK 04a6 - case u'Ҩ': // CYRILLIC CAPITAL ABKHASIAN HA 04a8 - case u'Ҫ': // CYRILLIC CAPITAL ES W/ DESCENDER 04aa - case u'Ҭ': // CYRILLIC CAPITAL TE W/ DESCENDER 04ac - case u'Ү': // CYRILLIC CAPITAL STRAIGHT U 04ae - case u'Ұ': // CYRILLIC CAPITAL STRAIGHT U W/ STROKE 04b0 - case u'Ҳ': // CYRILLIC CAPITAL HA W/ DESCENDER 04b2 - case u'Ҵ': // CYRILLIC CAPITAL LIGATURE TE TSE 04b4 - case u'Ҷ': // CYRILLIC CAPITAL CHE W/ DESCENDER 04b6 - case u'Ҹ': // CYRILLIC CAPITAL CHE W/ VERTICAL STROKE 04b8 - case u'Һ': // CYRILLIC CAPITAL SHHA 04ba - case u'Ҽ': // CYRILLIC CAPITAL ABKHASIAN CHE 04bc - case u'Ҿ': // CYRILLIC CAPITAL ABKHASIAN CHE W/ DESCENDER 04be - case u'Ӏ': // CYRILLIC LETTER PALOCHKA 04c0 - case u'Ӂ': // CYRILLIC CAPITAL ZHE W/ BREVE 04c1 - case u'Ӄ': // CYRILLIC CAPITAL KA W/ HOOK 04c3 - case u'Ӆ': // CYRILLIC CAPITAL EL W/ TAIL 04c5 - case u'Ӈ': // CYRILLIC CAPITAL EN W/ HOOK 04c7 - case u'Ӊ': // CYRILLIC CAPITAL EN W/ TAIL 04c9 - case u'Ӌ': // CYRILLIC CAPITAL KHAKASSIAN CHE 04cb - case u'Ӎ': // CYRILLIC CAPITAL EM W/ TAIL 04cd - case u'Ӑ': // CYRILLIC CAPITAL A W/ BREVE 04d0 - case u'Ӓ': // CYRILLIC CAPITAL A W/ DIAERESIS 04d2 - case u'Ӕ': // CYRILLIC CAPITAL LIGATURE A IE 04d4 - case u'Ӗ': // CYRILLIC CAPITAL IE W/ BREVE 04d6 - case u'Ә': // CYRILLIC CAPITAL SCHWA 04d8 - case u'Ӛ': // CYRILLIC CAPITAL SCHWA W/ DIAERESIS 04da - case u'Ӝ': // CYRILLIC CAPITAL ZHE W/ DIAERESIS 04dc - case u'Ӟ': // CYRILLIC CAPITAL ZE W/ DIAERESIS 04de - case u'Ӡ': // CYRILLIC CAPITAL ABKHASIAN DZE 04e0 - case u'Ӣ': // CYRILLIC CAPITAL I W/ MACRON 04e2 - case u'Ӥ': // CYRILLIC CAPITAL I W/ DIAERESIS 04e4 - case u'Ӧ': // CYRILLIC CAPITAL O W/ DIAERESIS 04e6 - case u'Ө': // CYRILLIC CAPITAL BARRED O 04e8 - case u'Ӫ': // CYRILLIC CAPITAL BARRED O W/ DIAERESIS 04ea - case u'Ӭ': // CYRILLIC CAPITAL E W/ DIAERESIS 04ec - case u'Ӯ': // CYRILLIC CAPITAL U W/ MACRON 04ee - case u'Ӱ': // CYRILLIC CAPITAL U W/ DIAERESIS 04f0 - case u'Ӳ': // CYRILLIC CAPITAL U W/ DOUBLE ACUTE 04f2 - case u'Ӵ': // CYRILLIC CAPITAL CHE W/ DIAERESIS 04f4 - case u'Ӷ': // CYRILLIC CAPITAL GHE W/ DESCENDER 04f6 - case u'Ӹ': // CYRILLIC CAPITAL YERU W/ DIAERESIS 04f8 - case u'Ӻ': // CYRILLIC CAPITAL GHE W/ STROKE AND HOOK 04fa - case u'Ӽ': // CYRILLIC CAPITAL HA W/ HOOK 04fc - case u'Ӿ': // CYRILLIC CAPITAL HA W/ STROKE 04fe - case u'Ԁ': // CYRILLIC CAPITAL KOMI DE 0500 - case u'Ԃ': // CYRILLIC CAPITAL KOMI DJE 0502 - case u'Ԅ': // CYRILLIC CAPITAL KOMI ZJE 0504 - case u'Ԇ': // CYRILLIC CAPITAL KOMI DZJE 0506 - case u'Ԉ': // CYRILLIC CAPITAL KOMI LJE 0508 - case u'Ԋ': // CYRILLIC CAPITAL KOMI NJE 050a - case u'Ԍ': // CYRILLIC CAPITAL KOMI SJE 050c - case u'Ԏ': // CYRILLIC CAPITAL KOMI TJE 050e - case u'Ԑ': // CYRILLIC CAPITAL REVERSED ZE 0510 - case u'Ԓ': // CYRILLIC CAPITAL EL W/ HOOK 0512 - case u'Ԕ': // CYRILLIC CAPITAL LHA 0514 - case u'Ԗ': // CYRILLIC CAPITAL RHA 0516 - case u'Ԙ': // CYRILLIC CAPITAL YAE 0518 - case u'Ԛ': // CYRILLIC CAPITAL QA 051a - case u'Ԝ': // CYRILLIC CAPITAL WE 051c - case u'Ԟ': // CYRILLIC CAPITAL ALEUT KA 051e - case u'Ԡ': // CYRILLIC CAPITAL EL W/ MIDDLE HOOK 0520 - case u'Ԣ': // CYRILLIC CAPITAL EN W/ MIDDLE HOOK 0522 - case u'Ԥ': // CYRILLIC CAPITAL PE W/ DESCENDER 0524 - case u'Ԧ': // CYRILLIC CAPITAL SHHA W/ DESCENDER 0526 - case u'Ԩ': // CYRILLIC CAPITAL EN W/ LEFT HOOK 0528 - case u'Ԫ': // CYRILLIC CAPITAL DZZHE 052a - case u'Ԭ': // CYRILLIC CAPITAL DCHE 052c - case u'Ԯ': // CYRILLIC CAPITAL EL W/ DESCENDER 052e - case u'Ա': // ARMENIAN CAPITAL AYB 0531 - case u'Բ': // ARMENIAN CAPITAL BEN 0532 - case u'Գ': // ARMENIAN CAPITAL GIM 0533 - case u'Դ': // ARMENIAN CAPITAL DA 0534 - case u'Ե': // ARMENIAN CAPITAL ECH 0535 - case u'Զ': // ARMENIAN CAPITAL ZA 0536 - case u'Է': // ARMENIAN CAPITAL EH 0537 - case u'Ը': // ARMENIAN CAPITAL ET 0538 - case u'Թ': // ARMENIAN CAPITAL TO 0539 - case u'Ժ': // ARMENIAN CAPITAL ZHE 053a - case u'Ի': // ARMENIAN CAPITAL INI 053b - case u'Լ': // ARMENIAN CAPITAL LIWN 053c - case u'Խ': // ARMENIAN CAPITAL XEH 053d - case u'Ծ': // ARMENIAN CAPITAL CA 053e - case u'Կ': // ARMENIAN CAPITAL KEN 053f - case u'Հ': // ARMENIAN CAPITAL HO 0540 - case u'Ձ': // ARMENIAN CAPITAL JA 0541 - case u'Ղ': // ARMENIAN CAPITAL GHAD 0542 - case u'Ճ': // ARMENIAN CAPITAL CHEH 0543 - case u'Մ': // ARMENIAN CAPITAL MEN 0544 - case u'Յ': // ARMENIAN CAPITAL YI 0545 - case u'Ն': // ARMENIAN CAPITAL NOW 0546 - case u'Շ': // ARMENIAN CAPITAL SHA 0547 - case u'Ո': // ARMENIAN CAPITAL VO 0548 - case u'Չ': // ARMENIAN CAPITAL CHA 0549 - case u'Պ': // ARMENIAN CAPITAL PEH 054a - case u'Ջ': // ARMENIAN CAPITAL JHEH 054b - case u'Ռ': // ARMENIAN CAPITAL RA 054c - case u'Ս': // ARMENIAN CAPITAL SEH 054d - case u'Վ': // ARMENIAN CAPITAL VEW 054e - case u'Տ': // ARMENIAN CAPITAL TIWN 054f - case u'Ր': // ARMENIAN CAPITAL REH 0550 - case u'Ց': // ARMENIAN CAPITAL CO 0551 - case u'Ւ': // ARMENIAN CAPITAL YIWN 0552 - case u'Փ': // ARMENIAN CAPITAL PIWR 0553 - case u'Ք': // ARMENIAN CAPITAL KEH 0554 - case u'Օ': // ARMENIAN CAPITAL OH 0555 - case u'Ֆ': // ARMENIAN CAPITAL FEH 0556 - case u'Ⴀ': // GEORGIAN CAPITAL AN 10a0 - case u'Ⴁ': // GEORGIAN CAPITAL BAN 10a1 - case u'Ⴂ': // GEORGIAN CAPITAL GAN 10a2 - case u'Ⴃ': // GEORGIAN CAPITAL DON 10a3 - case u'Ⴄ': // GEORGIAN CAPITAL EN 10a4 - case u'Ⴅ': // GEORGIAN CAPITAL VIN 10a5 - case u'Ⴆ': // GEORGIAN CAPITAL ZEN 10a6 - case u'Ⴇ': // GEORGIAN CAPITAL TAN 10a7 - case u'Ⴈ': // GEORGIAN CAPITAL IN 10a8 - case u'Ⴉ': // GEORGIAN CAPITAL KAN 10a9 - case u'Ⴊ': // GEORGIAN CAPITAL LAS 10aa - case u'Ⴋ': // GEORGIAN CAPITAL MAN 10ab - case u'Ⴌ': // GEORGIAN CAPITAL NAR 10ac - case u'Ⴍ': // GEORGIAN CAPITAL ON 10ad - case u'Ⴎ': // GEORGIAN CAPITAL PAR 10ae - case u'Ⴏ': // GEORGIAN CAPITAL ZHAR 10af - case u'Ⴐ': // GEORGIAN CAPITAL RAE 10b0 - case u'Ⴑ': // GEORGIAN CAPITAL SAN 10b1 - case u'Ⴒ': // GEORGIAN CAPITAL TAR 10b2 - case u'Ⴓ': // GEORGIAN CAPITAL UN 10b3 - case u'Ⴔ': // GEORGIAN CAPITAL PHAR 10b4 - case u'Ⴕ': // GEORGIAN CAPITAL KHAR 10b5 - case u'Ⴖ': // GEORGIAN CAPITAL GHAN 10b6 - case u'Ⴗ': // GEORGIAN CAPITAL QAR 10b7 - case u'Ⴘ': // GEORGIAN CAPITAL SHIN 10b8 - case u'Ⴙ': // GEORGIAN CAPITAL CHIN 10b9 - case u'Ⴚ': // GEORGIAN CAPITAL CAN 10ba - case u'Ⴛ': // GEORGIAN CAPITAL JIL 10bb - case u'Ⴜ': // GEORGIAN CAPITAL CIL 10bc - case u'Ⴝ': // GEORGIAN CAPITAL CHAR 10bd - case u'Ⴞ': // GEORGIAN CAPITAL XAN 10be - case u'Ⴟ': // GEORGIAN CAPITAL JHAN 10bf - case u'Ⴠ': // GEORGIAN CAPITAL HAE 10c0 - case u'Ⴡ': // GEORGIAN CAPITAL HE 10c1 - case u'Ⴢ': // GEORGIAN CAPITAL HIE 10c2 - case u'Ⴣ': // GEORGIAN CAPITAL WE 10c3 - case u'Ⴤ': // GEORGIAN CAPITAL HAR 10c4 - case u'Ⴥ': // GEORGIAN CAPITAL HOE 10c5 - case u'Ⴧ': // GEORGIAN CAPITAL YN 10c7 - case u'Ⴭ': // GEORGIAN CAPITAL AEN 10cd - case u'Ꭰ': // CHEROKEE LETTER A 13a0 - case u'Ꭱ': // CHEROKEE LETTER E 13a1 - case u'Ꭲ': // CHEROKEE LETTER I 13a2 - case u'Ꭳ': // CHEROKEE LETTER O 13a3 - case u'Ꭴ': // CHEROKEE LETTER U 13a4 - case u'Ꭵ': // CHEROKEE LETTER V 13a5 - case u'Ꭶ': // CHEROKEE LETTER GA 13a6 - case u'Ꭷ': // CHEROKEE LETTER KA 13a7 - case u'Ꭸ': // CHEROKEE LETTER GE 13a8 - case u'Ꭹ': // CHEROKEE LETTER GI 13a9 - case u'Ꭺ': // CHEROKEE LETTER GO 13aa - case u'Ꭻ': // CHEROKEE LETTER GU 13ab - case u'Ꭼ': // CHEROKEE LETTER GV 13ac - case u'Ꭽ': // CHEROKEE LETTER HA 13ad - case u'Ꭾ': // CHEROKEE LETTER HE 13ae - case u'Ꭿ': // CHEROKEE LETTER HI 13af - case u'Ꮀ': // CHEROKEE LETTER HO 13b0 - case u'Ꮁ': // CHEROKEE LETTER HU 13b1 - case u'Ꮂ': // CHEROKEE LETTER HV 13b2 - case u'Ꮃ': // CHEROKEE LETTER LA 13b3 - case u'Ꮄ': // CHEROKEE LETTER LE 13b4 - case u'Ꮅ': // CHEROKEE LETTER LI 13b5 - case u'Ꮆ': // CHEROKEE LETTER LO 13b6 - case u'Ꮇ': // CHEROKEE LETTER LU 13b7 - case u'Ꮈ': // CHEROKEE LETTER LV 13b8 - case u'Ꮉ': // CHEROKEE LETTER MA 13b9 - case u'Ꮊ': // CHEROKEE LETTER ME 13ba - case u'Ꮋ': // CHEROKEE LETTER MI 13bb - case u'Ꮌ': // CHEROKEE LETTER MO 13bc - case u'Ꮍ': // CHEROKEE LETTER MU 13bd - case u'Ꮎ': // CHEROKEE LETTER NA 13be - case u'Ꮏ': // CHEROKEE LETTER HNA 13bf - case u'Ꮐ': // CHEROKEE LETTER NAH 13c0 - case u'Ꮑ': // CHEROKEE LETTER NE 13c1 - case u'Ꮒ': // CHEROKEE LETTER NI 13c2 - case u'Ꮓ': // CHEROKEE LETTER NO 13c3 - case u'Ꮔ': // CHEROKEE LETTER NU 13c4 - case u'Ꮕ': // CHEROKEE LETTER NV 13c5 - case u'Ꮖ': // CHEROKEE LETTER QUA 13c6 - case u'Ꮗ': // CHEROKEE LETTER QUE 13c7 - case u'Ꮘ': // CHEROKEE LETTER QUI 13c8 - case u'Ꮙ': // CHEROKEE LETTER QUO 13c9 - case u'Ꮚ': // CHEROKEE LETTER QUU 13ca - case u'Ꮛ': // CHEROKEE LETTER QUV 13cb - case u'Ꮜ': // CHEROKEE LETTER SA 13cc - case u'Ꮝ': // CHEROKEE LETTER S 13cd - case u'Ꮞ': // CHEROKEE LETTER SE 13ce - case u'Ꮟ': // CHEROKEE LETTER SI 13cf - case u'Ꮠ': // CHEROKEE LETTER SO 13d0 - case u'Ꮡ': // CHEROKEE LETTER SU 13d1 - case u'Ꮢ': // CHEROKEE LETTER SV 13d2 - case u'Ꮣ': // CHEROKEE LETTER DA 13d3 - case u'Ꮤ': // CHEROKEE LETTER TA 13d4 - case u'Ꮥ': // CHEROKEE LETTER DE 13d5 - case u'Ꮦ': // CHEROKEE LETTER TE 13d6 - case u'Ꮧ': // CHEROKEE LETTER DI 13d7 - case u'Ꮨ': // CHEROKEE LETTER TI 13d8 - case u'Ꮩ': // CHEROKEE LETTER DO 13d9 - case u'Ꮪ': // CHEROKEE LETTER DU 13da - case u'Ꮫ': // CHEROKEE LETTER DV 13db - case u'Ꮬ': // CHEROKEE LETTER DLA 13dc - case u'Ꮭ': // CHEROKEE LETTER TLA 13dd - case u'Ꮮ': // CHEROKEE LETTER TLE 13de - case u'Ꮯ': // CHEROKEE LETTER TLI 13df - case u'Ꮰ': // CHEROKEE LETTER TLO 13e0 - case u'Ꮱ': // CHEROKEE LETTER TLU 13e1 - case u'Ꮲ': // CHEROKEE LETTER TLV 13e2 - case u'Ꮳ': // CHEROKEE LETTER TSA 13e3 - case u'Ꮴ': // CHEROKEE LETTER TSE 13e4 - case u'Ꮵ': // CHEROKEE LETTER TSI 13e5 - case u'Ꮶ': // CHEROKEE LETTER TSO 13e6 - case u'Ꮷ': // CHEROKEE LETTER TSU 13e7 - case u'Ꮸ': // CHEROKEE LETTER TSV 13e8 - case u'Ꮹ': // CHEROKEE LETTER WA 13e9 - case u'Ꮺ': // CHEROKEE LETTER WE 13ea - case u'Ꮻ': // CHEROKEE LETTER WI 13eb - case u'Ꮼ': // CHEROKEE LETTER WO 13ec - case u'Ꮽ': // CHEROKEE LETTER WU 13ed - case u'Ꮾ': // CHEROKEE LETTER WV 13ee - case u'Ꮿ': // CHEROKEE LETTER YA 13ef - case u'Ᏸ': // CHEROKEE LETTER YE 13f0 - case u'Ᏹ': // CHEROKEE LETTER YI 13f1 - case u'Ᏺ': // CHEROKEE LETTER YO 13f2 - case u'Ᏻ': // CHEROKEE LETTER YU 13f3 - case u'Ᏼ': // CHEROKEE LETTER YV 13f4 - case u'Ᏽ': // CHEROKEE LETTER MV 13f5 - case u'Ა': // GEORGIAN MTAVRULI CAPITAL AN 1c90 - case u'Ბ': // GEORGIAN MTAVRULI CAPITAL BAN 1c91 - case u'Გ': // GEORGIAN MTAVRULI CAPITAL GAN 1c92 - case u'Დ': // GEORGIAN MTAVRULI CAPITAL DON 1c93 - case u'Ე': // GEORGIAN MTAVRULI CAPITAL EN 1c94 - case u'Ვ': // GEORGIAN MTAVRULI CAPITAL VIN 1c95 - case u'Ზ': // GEORGIAN MTAVRULI CAPITAL ZEN 1c96 - case u'Თ': // GEORGIAN MTAVRULI CAPITAL TAN 1c97 - case u'Ი': // GEORGIAN MTAVRULI CAPITAL IN 1c98 - case u'Კ': // GEORGIAN MTAVRULI CAPITAL KAN 1c99 - case u'Ლ': // GEORGIAN MTAVRULI CAPITAL LAS 1c9a - case u'Მ': // GEORGIAN MTAVRULI CAPITAL MAN 1c9b - case u'Ნ': // GEORGIAN MTAVRULI CAPITAL NAR 1c9c - case u'Ო': // GEORGIAN MTAVRULI CAPITAL ON 1c9d - case u'Პ': // GEORGIAN MTAVRULI CAPITAL PAR 1c9e - case u'Ჟ': // GEORGIAN MTAVRULI CAPITAL ZHAR 1c9f - case u'Რ': // GEORGIAN MTAVRULI CAPITAL RAE 1ca0 - case u'Ს': // GEORGIAN MTAVRULI CAPITAL SAN 1ca1 - case u'Ტ': // GEORGIAN MTAVRULI CAPITAL TAR 1ca2 - case u'Უ': // GEORGIAN MTAVRULI CAPITAL UN 1ca3 - case u'Ფ': // GEORGIAN MTAVRULI CAPITAL PHAR 1ca4 - case u'Ქ': // GEORGIAN MTAVRULI CAPITAL KHAR 1ca5 - case u'Ღ': // GEORGIAN MTAVRULI CAPITAL GHAN 1ca6 - case u'Ყ': // GEORGIAN MTAVRULI CAPITAL QAR 1ca7 - case u'Შ': // GEORGIAN MTAVRULI CAPITAL SHIN 1ca8 - case u'Ჩ': // GEORGIAN MTAVRULI CAPITAL CHIN 1ca9 - case u'Ც': // GEORGIAN MTAVRULI CAPITAL CAN 1caa - case u'Ძ': // GEORGIAN MTAVRULI CAPITAL JIL 1cab - case u'Წ': // GEORGIAN MTAVRULI CAPITAL CIL 1cac - case u'Ჭ': // GEORGIAN MTAVRULI CAPITAL CHAR 1cad - case u'Ხ': // GEORGIAN MTAVRULI CAPITAL XAN 1cae - case u'Ჯ': // GEORGIAN MTAVRULI CAPITAL JHAN 1caf - case u'Ჰ': // GEORGIAN MTAVRULI CAPITAL HAE 1cb0 - case u'Ჱ': // GEORGIAN MTAVRULI CAPITAL HE 1cb1 - case u'Ჲ': // GEORGIAN MTAVRULI CAPITAL HIE 1cb2 - case u'Ჳ': // GEORGIAN MTAVRULI CAPITAL WE 1cb3 - case u'Ჴ': // GEORGIAN MTAVRULI CAPITAL HAR 1cb4 - case u'Ჵ': // GEORGIAN MTAVRULI CAPITAL HOE 1cb5 - case u'Ჶ': // GEORGIAN MTAVRULI CAPITAL FI 1cb6 - case u'Ჷ': // GEORGIAN MTAVRULI CAPITAL YN 1cb7 - case u'Ჸ': // GEORGIAN MTAVRULI CAPITAL ELIFI 1cb8 - case u'Ჹ': // GEORGIAN MTAVRULI CAPITAL TURNED GAN 1cb9 - case u'Ჺ': // GEORGIAN MTAVRULI CAPITAL AIN 1cba - case u'Ჽ': // GEORGIAN MTAVRULI CAPITAL AEN 1cbd - case u'Ჾ': // GEORGIAN MTAVRULI CAPITAL HARD SIGN 1cbe - case u'Ჿ': // GEORGIAN MTAVRULI CAPITAL LABIAL SIGN 1cbf - case u'Ḁ': // LATIN CAPITAL A W/ RING BELOW 1e00 - case u'Ḃ': // LATIN CAPITAL B W/ DOT ABOVE 1e02 - case u'Ḅ': // LATIN CAPITAL B W/ DOT BELOW 1e04 - case u'Ḇ': // LATIN CAPITAL B W/ LINE BELOW 1e06 - case u'Ḉ': // LATIN CAPITAL C W/ CEDILLA AND ACUTE 1e08 - case u'Ḋ': // LATIN CAPITAL D W/ DOT ABOVE 1e0a - case u'Ḍ': // LATIN CAPITAL D W/ DOT BELOW 1e0c - case u'Ḏ': // LATIN CAPITAL D W/ LINE BELOW 1e0e - case u'Ḑ': // LATIN CAPITAL D W/ CEDILLA 1e10 - case u'Ḓ': // LATIN CAPITAL D W/ CIRCUMFLEX BELOW 1e12 - case u'Ḕ': // LATIN CAPITAL E W/ MACRON AND GRAVE 1e14 - case u'Ḗ': // LATIN CAPITAL E W/ MACRON AND ACUTE 1e16 - case u'Ḙ': // LATIN CAPITAL E W/ CIRCUMFLEX BELOW 1e18 - case u'Ḛ': // LATIN CAPITAL E W/ TILDE BELOW 1e1a - case u'Ḝ': // LATIN CAPITAL E W/ CEDILLA AND BREVE 1e1c - case u'Ḟ': // LATIN CAPITAL F W/ DOT ABOVE 1e1e - case u'Ḡ': // LATIN CAPITAL G W/ MACRON 1e20 - case u'Ḣ': // LATIN CAPITAL H W/ DOT ABOVE 1e22 - case u'Ḥ': // LATIN CAPITAL H W/ DOT BELOW 1e24 - case u'Ḧ': // LATIN CAPITAL H W/ DIAERESIS 1e26 - case u'Ḩ': // LATIN CAPITAL H W/ CEDILLA 1e28 - case u'Ḫ': // LATIN CAPITAL H W/ BREVE BELOW 1e2a - case u'Ḭ': // LATIN CAPITAL I W/ TILDE BELOW 1e2c - case u'Ḯ': // LATIN CAPITAL I W/ DIAERESIS AND ACUTE 1e2e - case u'Ḱ': // LATIN CAPITAL K W/ ACUTE 1e30 - case u'Ḳ': // LATIN CAPITAL K W/ DOT BELOW 1e32 - case u'Ḵ': // LATIN CAPITAL K W/ LINE BELOW 1e34 - case u'Ḷ': // LATIN CAPITAL L W/ DOT BELOW 1e36 - case u'Ḹ': // LATIN CAPITAL L W/ DOT BELOW AND MACRON 1e38 - case u'Ḻ': // LATIN CAPITAL L W/ LINE BELOW 1e3a - case u'Ḽ': // LATIN CAPITAL L W/ CIRCUMFLEX BELOW 1e3c - case u'Ḿ': // LATIN CAPITAL M W/ ACUTE 1e3e - case u'Ṁ': // LATIN CAPITAL M W/ DOT ABOVE 1e40 - case u'Ṃ': // LATIN CAPITAL M W/ DOT BELOW 1e42 - case u'Ṅ': // LATIN CAPITAL N W/ DOT ABOVE 1e44 - case u'Ṇ': // LATIN CAPITAL N W/ DOT BELOW 1e46 - case u'Ṉ': // LATIN CAPITAL N W/ LINE BELOW 1e48 - case u'Ṋ': // LATIN CAPITAL N W/ CIRCUMFLEX BELOW 1e4a - case u'Ṍ': // LATIN CAPITAL O W/ TILDE AND ACUTE 1e4c - case u'Ṏ': // LATIN CAPITAL O W/ TILDE AND DIAERESIS 1e4e - case u'Ṑ': // LATIN CAPITAL O W/ MACRON AND GRAVE 1e50 - case u'Ṓ': // LATIN CAPITAL O W/ MACRON AND ACUTE 1e52 - case u'Ṕ': // LATIN CAPITAL P W/ ACUTE 1e54 - case u'Ṗ': // LATIN CAPITAL P W/ DOT ABOVE 1e56 - case u'Ṙ': // LATIN CAPITAL R W/ DOT ABOVE 1e58 - case u'Ṛ': // LATIN CAPITAL R W/ DOT BELOW 1e5a - case u'Ṝ': // LATIN CAPITAL R W/ DOT BELOW AND MACRON 1e5c - case u'Ṟ': // LATIN CAPITAL R W/ LINE BELOW 1e5e - case u'Ṡ': // LATIN CAPITAL S W/ DOT ABOVE 1e60 - case u'Ṣ': // LATIN CAPITAL S W/ DOT BELOW 1e62 - case u'Ṥ': // LATIN CAPITAL S W/ ACUTE AND DOT ABOVE 1e64 - case u'Ṧ': // LATIN CAPITAL S W/ CARON AND DOT ABOVE 1e66 - case u'Ṩ': // LATIN CAPITAL S W/ DOT BELOW AND DOT ABOVE 1e68 - case u'Ṫ': // LATIN CAPITAL T W/ DOT ABOVE 1e6a - case u'Ṭ': // LATIN CAPITAL T W/ DOT BELOW 1e6c - case u'Ṯ': // LATIN CAPITAL T W/ LINE BELOW 1e6e - case u'Ṱ': // LATIN CAPITAL T W/ CIRCUMFLEX BELOW 1e70 - case u'Ṳ': // LATIN CAPITAL U W/ DIAERESIS BELOW 1e72 - case u'Ṵ': // LATIN CAPITAL U W/ TILDE BELOW 1e74 - case u'Ṷ': // LATIN CAPITAL U W/ CIRCUMFLEX BELOW 1e76 - case u'Ṹ': // LATIN CAPITAL U W/ TILDE AND ACUTE 1e78 - case u'Ṻ': // LATIN CAPITAL U W/ MACRON AND DIAERESIS 1e7a - case u'Ṽ': // LATIN CAPITAL V W/ TILDE 1e7c - case u'Ṿ': // LATIN CAPITAL V W/ DOT BELOW 1e7e - case u'Ẁ': // LATIN CAPITAL W W/ GRAVE 1e80 - case u'Ẃ': // LATIN CAPITAL W W/ ACUTE 1e82 - case u'Ẅ': // LATIN CAPITAL W W/ DIAERESIS 1e84 - case u'Ẇ': // LATIN CAPITAL W W/ DOT ABOVE 1e86 - case u'Ẉ': // LATIN CAPITAL W W/ DOT BELOW 1e88 - case u'Ẋ': // LATIN CAPITAL X W/ DOT ABOVE 1e8a - case u'Ẍ': // LATIN CAPITAL X W/ DIAERESIS 1e8c - case u'Ẏ': // LATIN CAPITAL Y W/ DOT ABOVE 1e8e - case u'Ẑ': // LATIN CAPITAL Z W/ CIRCUMFLEX 1e90 - case u'Ẓ': // LATIN CAPITAL Z W/ DOT BELOW 1e92 - case u'Ẕ': // LATIN CAPITAL Z W/ LINE BELOW 1e94 - case u'ẞ': // LATIN CAPITAL SHARP S 1e9e - case u'Ạ': // LATIN CAPITAL A W/ DOT BELOW 1ea0 - case u'Ả': // LATIN CAPITAL A W/ HOOK ABOVE 1ea2 - case u'Ấ': // LATIN CAPITAL A W/ CIRCUMFLEX AND ACUTE 1ea4 - case u'Ầ': // LATIN CAPITAL A W/ CIRCUMFLEX AND GRAVE 1ea6 - case u'Ẩ': // LATIN CAPITAL A W/ CIRCUMFLEX AND HOOK ABOVE 1ea8 - case u'Ẫ': // LATIN CAPITAL A W/ CIRCUMFLEX AND TILDE 1eaa - case u'Ậ': // LATIN CAPITAL A W/ CIRCUMFLEX AND DOT BELOW 1eac - case u'Ắ': // LATIN CAPITAL A W/ BREVE AND ACUTE 1eae - case u'Ằ': // LATIN CAPITAL A W/ BREVE AND GRAVE 1eb0 - case u'Ẳ': // LATIN CAPITAL A W/ BREVE AND HOOK ABOVE 1eb2 - case u'Ẵ': // LATIN CAPITAL A W/ BREVE AND TILDE 1eb4 - case u'Ặ': // LATIN CAPITAL A W/ BREVE AND DOT BELOW 1eb6 - case u'Ẹ': // LATIN CAPITAL E W/ DOT BELOW 1eb8 - case u'Ẻ': // LATIN CAPITAL E W/ HOOK ABOVE 1eba - case u'Ẽ': // LATIN CAPITAL E W/ TILDE 1ebc - case u'Ế': // LATIN CAPITAL E W/ CIRCUMFLEX AND ACUTE 1ebe - case u'Ề': // LATIN CAPITAL E W/ CIRCUMFLEX AND GRAVE 1ec0 - case u'Ể': // LATIN CAPITAL E W/ CIRCUMFLEX AND HOOK ABOVE 1ec2 - case u'Ễ': // LATIN CAPITAL E W/ CIRCUMFLEX AND TILDE 1ec4 - case u'Ệ': // LATIN CAPITAL E W/ CIRCUMFLEX AND DOT BELOW 1ec6 - case u'Ỉ': // LATIN CAPITAL I W/ HOOK ABOVE 1ec8 - case u'Ị': // LATIN CAPITAL I W/ DOT BELOW 1eca - case u'Ọ': // LATIN CAPITAL O W/ DOT BELOW 1ecc - case u'Ỏ': // LATIN CAPITAL O W/ HOOK ABOVE 1ece - case u'Ố': // LATIN CAPITAL O W/ CIRCUMFLEX AND ACUTE 1ed0 - case u'Ồ': // LATIN CAPITAL O W/ CIRCUMFLEX AND GRAVE 1ed2 - case u'Ổ': // LATIN CAPITAL O W/ CIRCUMFLEX AND HOOK ABOVE 1ed4 - case u'Ỗ': // LATIN CAPITAL O W/ CIRCUMFLEX AND TILDE 1ed6 - case u'Ộ': // LATIN CAPITAL O W/ CIRCUMFLEX AND DOT BELOW 1ed8 - case u'Ớ': // LATIN CAPITAL O W/ HORN AND ACUTE 1eda - case u'Ờ': // LATIN CAPITAL O W/ HORN AND GRAVE 1edc - case u'Ở': // LATIN CAPITAL O W/ HORN AND HOOK ABOVE 1ede - case u'Ỡ': // LATIN CAPITAL O W/ HORN AND TILDE 1ee0 - case u'Ợ': // LATIN CAPITAL O W/ HORN AND DOT BELOW 1ee2 - case u'Ụ': // LATIN CAPITAL U W/ DOT BELOW 1ee4 - case u'Ủ': // LATIN CAPITAL U W/ HOOK ABOVE 1ee6 - case u'Ứ': // LATIN CAPITAL U W/ HORN AND ACUTE 1ee8 - case u'Ừ': // LATIN CAPITAL U W/ HORN AND GRAVE 1eea - case u'Ử': // LATIN CAPITAL U W/ HORN AND HOOK ABOVE 1eec - case u'Ữ': // LATIN CAPITAL U W/ HORN AND TILDE 1eee - case u'Ự': // LATIN CAPITAL U W/ HORN AND DOT BELOW 1ef0 - case u'Ỳ': // LATIN CAPITAL Y W/ GRAVE 1ef2 - case u'Ỵ': // LATIN CAPITAL Y W/ DOT BELOW 1ef4 - case u'Ỷ': // LATIN CAPITAL Y W/ HOOK ABOVE 1ef6 - case u'Ỹ': // LATIN CAPITAL Y W/ TILDE 1ef8 - case u'Ỻ': // LATIN CAPITAL MIDDLE-WELSH LL 1efa - case u'Ỽ': // LATIN CAPITAL MIDDLE-WELSH V 1efc - case u'Ỿ': // LATIN CAPITAL Y W/ LOOP 1efe - case u'Ἀ': // GREEK CAPITAL ALPHA W/ PSILI 1f08 - case u'Ἁ': // GREEK CAPITAL ALPHA W/ DASIA 1f09 - case u'Ἂ': // GREEK CAPITAL ALPHA W/ PSILI AND VARIA 1f0a - case u'Ἃ': // GREEK CAPITAL ALPHA W/ DASIA AND VARIA 1f0b - case u'Ἄ': // GREEK CAPITAL ALPHA W/ PSILI AND OXIA 1f0c - case u'Ἅ': // GREEK CAPITAL ALPHA W/ DASIA AND OXIA 1f0d - case u'Ἆ': // GREEK CAPITAL ALPHA W/ PSILI AND PERISPOMENI 1f0e - case u'Ἇ': // GREEK CAPITAL ALPHA W/ DASIA AND PERISPOMENI 1f0f - case u'Ἐ': // GREEK CAPITAL EPSILON W/ PSILI 1f18 - case u'Ἑ': // GREEK CAPITAL EPSILON W/ DASIA 1f19 - case u'Ἒ': // GREEK CAPITAL EPSILON W/ PSILI AND VARIA 1f1a - case u'Ἓ': // GREEK CAPITAL EPSILON W/ DASIA AND VARIA 1f1b - case u'Ἔ': // GREEK CAPITAL EPSILON W/ PSILI AND OXIA 1f1c - case u'Ἕ': // GREEK CAPITAL EPSILON W/ DASIA AND OXIA 1f1d - case u'Ἠ': // GREEK CAPITAL ETA W/ PSILI 1f28 - case u'Ἡ': // GREEK CAPITAL ETA W/ DASIA 1f29 - case u'Ἢ': // GREEK CAPITAL ETA W/ PSILI AND VARIA 1f2a - case u'Ἣ': // GREEK CAPITAL ETA W/ DASIA AND VARIA 1f2b - case u'Ἤ': // GREEK CAPITAL ETA W/ PSILI AND OXIA 1f2c - case u'Ἥ': // GREEK CAPITAL ETA W/ DASIA AND OXIA 1f2d - case u'Ἦ': // GREEK CAPITAL ETA W/ PSILI AND PERISPOMENI 1f2e - case u'Ἧ': // GREEK CAPITAL ETA W/ DASIA AND PERISPOMENI 1f2f - case u'Ἰ': // GREEK CAPITAL IOTA W/ PSILI 1f38 - case u'Ἱ': // GREEK CAPITAL IOTA W/ DASIA 1f39 - case u'Ἲ': // GREEK CAPITAL IOTA W/ PSILI AND VARIA 1f3a - case u'Ἳ': // GREEK CAPITAL IOTA W/ DASIA AND VARIA 1f3b - case u'Ἴ': // GREEK CAPITAL IOTA W/ PSILI AND OXIA 1f3c - case u'Ἵ': // GREEK CAPITAL IOTA W/ DASIA AND OXIA 1f3d - case u'Ἶ': // GREEK CAPITAL IOTA W/ PSILI AND PERISPOMENI 1f3e - case u'Ἷ': // GREEK CAPITAL IOTA W/ DASIA AND PERISPOMENI 1f3f - case u'Ὀ': // GREEK CAPITAL OMICRON W/ PSILI 1f48 - case u'Ὁ': // GREEK CAPITAL OMICRON W/ DASIA 1f49 - case u'Ὂ': // GREEK CAPITAL OMICRON W/ PSILI AND VARIA 1f4a - case u'Ὃ': // GREEK CAPITAL OMICRON W/ DASIA AND VARIA 1f4b - case u'Ὄ': // GREEK CAPITAL OMICRON W/ PSILI AND OXIA 1f4c - case u'Ὅ': // GREEK CAPITAL OMICRON W/ DASIA AND OXIA 1f4d - case u'Ὑ': // GREEK CAPITAL UPSILON W/ DASIA 1f59 - case u'Ὓ': // GREEK CAPITAL UPSILON W/ DASIA AND VARIA 1f5b - case u'Ὕ': // GREEK CAPITAL UPSILON W/ DASIA AND OXIA 1f5d - case u'Ὗ': // GREEK CAPITAL UPSILON W/ DASIA AND PERISPOMENI 1f5f - case u'Ὠ': // GREEK CAPITAL OMEGA W/ PSILI 1f68 - case u'Ὡ': // GREEK CAPITAL OMEGA W/ DASIA 1f69 - case u'Ὢ': // GREEK CAPITAL OMEGA W/ PSILI AND VARIA 1f6a - case u'Ὣ': // GREEK CAPITAL OMEGA W/ DASIA AND VARIA 1f6b - case u'Ὤ': // GREEK CAPITAL OMEGA W/ PSILI AND OXIA 1f6c - case u'Ὥ': // GREEK CAPITAL OMEGA W/ DASIA AND OXIA 1f6d - case u'Ὦ': // GREEK CAPITAL OMEGA W/ PSILI AND PERISPOMENI 1f6e - case u'Ὧ': // GREEK CAPITAL OMEGA W/ DASIA AND PERISPOMENI 1f6f - case u'Ᾰ': // GREEK CAPITAL ALPHA W/ VRACHY 1fb8 - case u'Ᾱ': // GREEK CAPITAL ALPHA W/ MACRON 1fb9 - case u'Ὰ': // GREEK CAPITAL ALPHA W/ VARIA 1fba - case u'Ά': // GREEK CAPITAL ALPHA W/ OXIA 1fbb - case u'Ὲ': // GREEK CAPITAL EPSILON W/ VARIA 1fc8 - case u'Έ': // GREEK CAPITAL EPSILON W/ OXIA 1fc9 - case u'Ὴ': // GREEK CAPITAL ETA W/ VARIA 1fca - case u'Ή': // GREEK CAPITAL ETA W/ OXIA 1fcb - case u'Ῐ': // GREEK CAPITAL IOTA W/ VRACHY 1fd8 - case u'Ῑ': // GREEK CAPITAL IOTA W/ MACRON 1fd9 - case u'Ὶ': // GREEK CAPITAL IOTA W/ VARIA 1fda - case u'Ί': // GREEK CAPITAL IOTA W/ OXIA 1fdb - case u'Ῠ': // GREEK CAPITAL UPSILON W/ VRACHY 1fe8 - case u'Ῡ': // GREEK CAPITAL UPSILON W/ MACRON 1fe9 - case u'Ὺ': // GREEK CAPITAL UPSILON W/ VARIA 1fea - case u'Ύ': // GREEK CAPITAL UPSILON W/ OXIA 1feb - case u'Ῥ': // GREEK CAPITAL RHO W/ DASIA 1fec - case u'Ὸ': // GREEK CAPITAL OMICRON W/ VARIA 1ff8 - case u'Ό': // GREEK CAPITAL OMICRON W/ OXIA 1ff9 - case u'Ὼ': // GREEK CAPITAL OMEGA W/ VARIA 1ffa - case u'Ώ': // GREEK CAPITAL OMEGA W/ OXIA 1ffb - case u'ℂ': // DOUBLE-STRUCK CAPITAL C 2102 - case u'ℇ': // EULER CONSTANT 2107 - case u'ℋ': // SCRIPT CAPITAL H 210b - case u'ℌ': // BLACK-LETTER CAPITAL H 210c - case u'ℍ': // DOUBLE-STRUCK CAPITAL H 210d - case u'ℐ': // SCRIPT CAPITAL I 2110 - case u'ℑ': // BLACK-LETTER CAPITAL I 2111 - case u'ℒ': // SCRIPT CAPITAL L 2112 - case u'ℕ': // DOUBLE-STRUCK CAPITAL N 2115 - case u'ℙ': // DOUBLE-STRUCK CAPITAL P 2119 - case u'ℚ': // DOUBLE-STRUCK CAPITAL Q 211a - case u'ℛ': // SCRIPT CAPITAL R 211b - case u'ℜ': // BLACK-LETTER CAPITAL R 211c - case u'ℝ': // DOUBLE-STRUCK CAPITAL R 211d - case u'ℤ': // DOUBLE-STRUCK CAPITAL Z 2124 - case u'Ω': // OHM SIGN 2126 - case u'ℨ': // BLACK-LETTER CAPITAL Z 2128 - case u'K': // KELVIN SIGN 212a - case u'Å': // ANGSTROM SIGN 212b - case u'ℬ': // SCRIPT CAPITAL B 212c - case u'ℭ': // BLACK-LETTER CAPITAL C 212d - case u'ℰ': // SCRIPT CAPITAL E 2130 - case u'ℱ': // SCRIPT CAPITAL F 2131 - case u'Ⅎ': // TURNED CAPITAL F 2132 - case u'ℳ': // SCRIPT CAPITAL M 2133 - case u'ℾ': // DOUBLE-STRUCK CAPITAL GAMMA 213e - case u'ℿ': // DOUBLE-STRUCK CAPITAL PI 213f - case u'ⅅ': // DOUBLE-STRUCK ITALIC CAPITAL D 2145 - case u'Ↄ': // ROMAN NUMERAL REVERSED ONE HUNDRED 2183 - case u'Ⰰ': // GLAGOLITIC CAPITAL AZU 2c00 - case u'Ⰱ': // GLAGOLITIC CAPITAL BUKY 2c01 - case u'Ⰲ': // GLAGOLITIC CAPITAL VEDE 2c02 - case u'Ⰳ': // GLAGOLITIC CAPITAL GLAGOLI 2c03 - case u'Ⰴ': // GLAGOLITIC CAPITAL DOBRO 2c04 - case u'Ⰵ': // GLAGOLITIC CAPITAL YESTU 2c05 - case u'Ⰶ': // GLAGOLITIC CAPITAL ZHIVETE 2c06 - case u'Ⰷ': // GLAGOLITIC CAPITAL DZELO 2c07 - case u'Ⰸ': // GLAGOLITIC CAPITAL ZEMLJA 2c08 - case u'Ⰹ': // GLAGOLITIC CAPITAL IZHE 2c09 - case u'Ⰺ': // GLAGOLITIC CAPITAL INITIAL IZHE 2c0a - case u'Ⰻ': // GLAGOLITIC CAPITAL I 2c0b - case u'Ⰼ': // GLAGOLITIC CAPITAL DJERVI 2c0c - case u'Ⰽ': // GLAGOLITIC CAPITAL KAKO 2c0d - case u'Ⰾ': // GLAGOLITIC CAPITAL LJUDIJE 2c0e - case u'Ⰿ': // GLAGOLITIC CAPITAL MYSLITE 2c0f - case u'Ⱀ': // GLAGOLITIC CAPITAL NASHI 2c10 - case u'Ⱁ': // GLAGOLITIC CAPITAL ONU 2c11 - case u'Ⱂ': // GLAGOLITIC CAPITAL POKOJI 2c12 - case u'Ⱃ': // GLAGOLITIC CAPITAL RITSI 2c13 - case u'Ⱄ': // GLAGOLITIC CAPITAL SLOVO 2c14 - case u'Ⱅ': // GLAGOLITIC CAPITAL TVRIDO 2c15 - case u'Ⱆ': // GLAGOLITIC CAPITAL UKU 2c16 - case u'Ⱇ': // GLAGOLITIC CAPITAL FRITU 2c17 - case u'Ⱈ': // GLAGOLITIC CAPITAL HERU 2c18 - case u'Ⱉ': // GLAGOLITIC CAPITAL OTU 2c19 - case u'Ⱊ': // GLAGOLITIC CAPITAL PE 2c1a - case u'Ⱋ': // GLAGOLITIC CAPITAL SHTA 2c1b - case u'Ⱌ': // GLAGOLITIC CAPITAL TSI 2c1c - case u'Ⱍ': // GLAGOLITIC CAPITAL CHRIVI 2c1d - case u'Ⱎ': // GLAGOLITIC CAPITAL SHA 2c1e - case u'Ⱏ': // GLAGOLITIC CAPITAL YERU 2c1f - case u'Ⱐ': // GLAGOLITIC CAPITAL YERI 2c20 - case u'Ⱑ': // GLAGOLITIC CAPITAL YATI 2c21 - case u'Ⱒ': // GLAGOLITIC CAPITAL SPIDERY HA 2c22 - case u'Ⱓ': // GLAGOLITIC CAPITAL YU 2c23 - case u'Ⱔ': // GLAGOLITIC CAPITAL SMALL YUS 2c24 - case u'Ⱕ': // GLAGOLITIC CAPITAL SMALL YUS W/ TAIL 2c25 - case u'Ⱖ': // GLAGOLITIC CAPITAL YO 2c26 - case u'Ⱗ': // GLAGOLITIC CAPITAL IOTATED SMALL YUS 2c27 - case u'Ⱘ': // GLAGOLITIC CAPITAL BIG YUS 2c28 - case u'Ⱙ': // GLAGOLITIC CAPITAL IOTATED BIG YUS 2c29 - case u'Ⱚ': // GLAGOLITIC CAPITAL FITA 2c2a - case u'Ⱛ': // GLAGOLITIC CAPITAL IZHITSA 2c2b - case u'Ⱜ': // GLAGOLITIC CAPITAL SHTAPIC 2c2c - case u'Ⱝ': // GLAGOLITIC CAPITAL TROKUTASTI A 2c2d - case u'Ⱞ': // GLAGOLITIC CAPITAL LATINATE MYSLITE 2c2e - case u'Ⱡ': // LATIN CAPITAL L W/ DOUBLE BAR 2c60 - case u'Ɫ': // LATIN CAPITAL L W/ MIDDLE TILDE 2c62 - case u'Ᵽ': // LATIN CAPITAL P W/ STROKE 2c63 - case u'Ɽ': // LATIN CAPITAL R W/ TAIL 2c64 - case u'Ⱨ': // LATIN CAPITAL H W/ DESCENDER 2c67 - case u'Ⱪ': // LATIN CAPITAL K W/ DESCENDER 2c69 - case u'Ⱬ': // LATIN CAPITAL Z W/ DESCENDER 2c6b - case u'Ɑ': // LATIN CAPITAL ALPHA 2c6d - case u'Ɱ': // LATIN CAPITAL M W/ HOOK 2c6e - case u'Ɐ': // LATIN CAPITAL TURNED A 2c6f - case u'Ɒ': // LATIN CAPITAL TURNED ALPHA 2c70 - case u'Ⱳ': // LATIN CAPITAL W W/ HOOK 2c72 - case u'Ⱶ': // LATIN CAPITAL HALF H 2c75 - case u'Ȿ': // LATIN CAPITAL S W/ SWASH TAIL 2c7e - case u'Ɀ': // LATIN CAPITAL Z W/ SWASH TAIL 2c7f - case u'Ⲁ': // COPTIC CAPITAL ALFA 2c80 - case u'Ⲃ': // COPTIC CAPITAL VIDA 2c82 - case u'Ⲅ': // COPTIC CAPITAL GAMMA 2c84 - case u'Ⲇ': // COPTIC CAPITAL DALDA 2c86 - case u'Ⲉ': // COPTIC CAPITAL EIE 2c88 - case u'Ⲋ': // COPTIC CAPITAL SOU 2c8a - case u'Ⲍ': // COPTIC CAPITAL ZATA 2c8c - case u'Ⲏ': // COPTIC CAPITAL HATE 2c8e - case u'Ⲑ': // COPTIC CAPITAL THETHE 2c90 - case u'Ⲓ': // COPTIC CAPITAL IAUDA 2c92 - case u'Ⲕ': // COPTIC CAPITAL KAPA 2c94 - case u'Ⲗ': // COPTIC CAPITAL LAULA 2c96 - case u'Ⲙ': // COPTIC CAPITAL MI 2c98 - case u'Ⲛ': // COPTIC CAPITAL NI 2c9a - case u'Ⲝ': // COPTIC CAPITAL KSI 2c9c - case u'Ⲟ': // COPTIC CAPITAL O 2c9e - case u'Ⲡ': // COPTIC CAPITAL PI 2ca0 - case u'Ⲣ': // COPTIC CAPITAL RO 2ca2 - case u'Ⲥ': // COPTIC CAPITAL SIMA 2ca4 - case u'Ⲧ': // COPTIC CAPITAL TAU 2ca6 - case u'Ⲩ': // COPTIC CAPITAL UA 2ca8 - case u'Ⲫ': // COPTIC CAPITAL FI 2caa - case u'Ⲭ': // COPTIC CAPITAL KHI 2cac - case u'Ⲯ': // COPTIC CAPITAL PSI 2cae - case u'Ⲱ': // COPTIC CAPITAL OOU 2cb0 - case u'Ⲳ': // COPTIC CAPITAL DIALECT-P ALEF 2cb2 - case u'Ⲵ': // COPTIC CAPITAL OLD COPTIC AIN 2cb4 - case u'Ⲷ': // COPTIC CAPITAL CRYPTOGRAMMIC EIE 2cb6 - case u'Ⲹ': // COPTIC CAPITAL DIALECT-P KAPA 2cb8 - case u'Ⲻ': // COPTIC CAPITAL DIALECT-P NI 2cba - case u'Ⲽ': // COPTIC CAPITAL CRYPTOGRAMMIC NI 2cbc - case u'Ⲿ': // COPTIC CAPITAL OLD COPTIC OOU 2cbe - case u'Ⳁ': // COPTIC CAPITAL SAMPI 2cc0 - case u'Ⳃ': // COPTIC CAPITAL CROSSED SHEI 2cc2 - case u'Ⳅ': // COPTIC CAPITAL OLD COPTIC SHEI 2cc4 - case u'Ⳇ': // COPTIC CAPITAL OLD COPTIC ESH 2cc6 - case u'Ⳉ': // COPTIC CAPITAL AKHMIMIC KHEI 2cc8 - case u'Ⳋ': // COPTIC CAPITAL DIALECT-P HORI 2cca - case u'Ⳍ': // COPTIC CAPITAL OLD COPTIC HORI 2ccc - case u'Ⳏ': // COPTIC CAPITAL OLD COPTIC HA 2cce - case u'Ⳑ': // COPTIC CAPITAL L-SHAPED HA 2cd0 - case u'Ⳓ': // COPTIC CAPITAL OLD COPTIC HEI 2cd2 - case u'Ⳕ': // COPTIC CAPITAL OLD COPTIC HAT 2cd4 - case u'Ⳗ': // COPTIC CAPITAL OLD COPTIC GANGIA 2cd6 - case u'Ⳙ': // COPTIC CAPITAL OLD COPTIC DJA 2cd8 - case u'Ⳛ': // COPTIC CAPITAL OLD COPTIC SHIMA 2cda - case u'Ⳝ': // COPTIC CAPITAL OLD NUBIAN SHIMA 2cdc - case u'Ⳟ': // COPTIC CAPITAL OLD NUBIAN NGI 2cde - case u'Ⳡ': // COPTIC CAPITAL OLD NUBIAN NYI 2ce0 - case u'Ⳣ': // COPTIC CAPITAL OLD NUBIAN WAU 2ce2 - case u'Ⳬ': // COPTIC CAPITAL CRYPTOGRAMMIC SHEI 2ceb - case u'Ⳮ': // COPTIC CAPITAL CRYPTOGRAMMIC GANGIA 2ced - case u'Ⳳ': // COPTIC CAPITAL BOHAIRIC KHEI 2cf2 - case u'Ꙁ': // CYRILLIC CAPITAL ZEMLYA a640 - case u'Ꙃ': // CYRILLIC CAPITAL DZELO a642 - case u'Ꙅ': // CYRILLIC CAPITAL REVERSED DZE a644 - case u'Ꙇ': // CYRILLIC CAPITAL IOTA a646 - case u'Ꙉ': // CYRILLIC CAPITAL DJERV a648 - case u'Ꙋ': // CYRILLIC CAPITAL MONOGRAPH UK a64a - case u'Ꙍ': // CYRILLIC CAPITAL BROAD OMEGA a64c - case u'Ꙏ': // CYRILLIC CAPITAL NEUTRAL YER a64e - case u'Ꙑ': // CYRILLIC CAPITAL YERU W/ BACK YER a650 - case u'Ꙓ': // CYRILLIC CAPITAL IOTIFIED YAT a652 - case u'Ꙕ': // CYRILLIC CAPITAL REVERSED YU a654 - case u'Ꙗ': // CYRILLIC CAPITAL IOTIFIED A a656 - case u'Ꙙ': // CYRILLIC CAPITAL CLOSED LITTLE YUS a658 - case u'Ꙛ': // CYRILLIC CAPITAL BLENDED YUS a65a - case u'Ꙝ': // CYRILLIC CAPITAL IOTIFIED CLOSED LITTLE YUS a65c - case u'Ꙟ': // CYRILLIC CAPITAL YN a65e - case u'Ꙡ': // CYRILLIC CAPITAL REVERSED TSE a660 - case u'Ꙣ': // CYRILLIC CAPITAL SOFT DE a662 - case u'Ꙥ': // CYRILLIC CAPITAL SOFT EL a664 - case u'Ꙧ': // CYRILLIC CAPITAL SOFT EM a666 - case u'Ꙩ': // CYRILLIC CAPITAL MONOCULAR O a668 - case u'Ꙫ': // CYRILLIC CAPITAL BINOCULAR O a66a - case u'Ꙭ': // CYRILLIC CAPITAL DOUBLE MONOCULAR O a66c - case 0xa680: // CYRILLIC CAPITAL DWE a680 - case 0xa682: // CYRILLIC CAPITAL DZWE a682 - case 0xa684: // CYRILLIC CAPITAL ZHWE a684 - case 0xa686: // CYRILLIC CAPITAL CCHE a686 - case 0xa688: // CYRILLIC CAPITAL DZZE a688 - case 0xa68a: // CYRILLIC CAPITAL TE W/ MIDDLE HOOK a68a - case 0xa68c: // CYRILLIC CAPITAL TWE a68c - case 0xa68e: // CYRILLIC CAPITAL TSWE a68e - case 0xa690: // CYRILLIC CAPITAL TSSE a690 - case 0xa692: // CYRILLIC CAPITAL TCHE a692 - case 0xa694: // CYRILLIC CAPITAL HWE a694 - case 0xa696: // CYRILLIC CAPITAL SHWE a696 - case 0xa698: // CYRILLIC CAPITAL DOUBLE O a698 - case 0xa69a: // CYRILLIC CAPITAL CROSSED O a69a - case u'Ꜣ': // LATIN CAPITAL EGYPTOLOGICAL ALEF a722 - case u'Ꜥ': // LATIN CAPITAL EGYPTOLOGICAL AIN a724 - case u'Ꜧ': // LATIN CAPITAL HENG a726 - case u'Ꜩ': // LATIN CAPITAL TZ a728 - case u'Ꜫ': // LATIN CAPITAL TRESILLO a72a - case u'Ꜭ': // LATIN CAPITAL CUATRILLO a72c - case u'Ꜯ': // LATIN CAPITAL CUATRILLO W/ COMMA a72e - case u'Ꜳ': // LATIN CAPITAL AA a732 - case u'Ꜵ': // LATIN CAPITAL AO a734 - case u'Ꜷ': // LATIN CAPITAL AU a736 - case u'Ꜹ': // LATIN CAPITAL AV a738 - case u'Ꜻ': // LATIN CAPITAL AV W/ HORIZONTAL BAR a73a - case u'Ꜽ': // LATIN CAPITAL AY a73c - case u'Ꜿ': // LATIN CAPITAL REVERSED C W/ DOT a73e - case u'Ꝁ': // LATIN CAPITAL K W/ STROKE a740 - case u'Ꝃ': // LATIN CAPITAL K W/ DIAGONAL STROKE a742 - case u'Ꝅ': // LATIN CAPITAL K W/ STROKE AND DIAGONAL STROKE a744 - case u'Ꝇ': // LATIN CAPITAL BROKEN L a746 - case u'Ꝉ': // LATIN CAPITAL L W/ HIGH STROKE a748 - case u'Ꝋ': // LATIN CAPITAL O W/ LONG STROKE OVERLAY a74a - case u'Ꝍ': // LATIN CAPITAL O W/ LOOP a74c - case u'Ꝏ': // LATIN CAPITAL OO a74e - case u'Ꝑ': // LATIN CAPITAL P W/ STROKE THROUGH DESCENDER a750 - case u'Ꝓ': // LATIN CAPITAL P W/ FLOURISH a752 - case u'Ꝕ': // LATIN CAPITAL P W/ SQUIRREL TAIL a754 - case u'Ꝗ': // LATIN CAPITAL Q W/ STROKE THROUGH DESCENDER a756 - case u'Ꝙ': // LATIN CAPITAL Q W/ DIAGONAL STROKE a758 - case u'Ꝛ': // LATIN CAPITAL R ROTUNDA a75a - case u'Ꝝ': // LATIN CAPITAL RUM ROTUNDA a75c - case u'Ꝟ': // LATIN CAPITAL V W/ DIAGONAL STROKE a75e - case u'Ꝡ': // LATIN CAPITAL VY a760 - case u'Ꝣ': // LATIN CAPITAL VISIGOTHIC Z a762 - case u'Ꝥ': // LATIN CAPITAL THORN W/ STROKE a764 - case u'Ꝧ': // LATIN CAPITAL THORN W/ STROKE THROUGH DESCENDER a766 - case u'Ꝩ': // LATIN CAPITAL VEND a768 - case u'Ꝫ': // LATIN CAPITAL ET a76a - case u'Ꝭ': // LATIN CAPITAL IS a76c - case u'Ꝯ': // LATIN CAPITAL CON a76e - case u'Ꝺ': // LATIN CAPITAL INSULAR D a779 - case u'Ꝼ': // LATIN CAPITAL INSULAR F a77b - case u'Ᵹ': // LATIN CAPITAL INSULAR G a77d - case u'Ꝿ': // LATIN CAPITAL TURNED INSULAR G a77e - case u'Ꞁ': // LATIN CAPITAL TURNED L a780 - case u'Ꞃ': // LATIN CAPITAL INSULAR R a782 - case u'Ꞅ': // LATIN CAPITAL INSULAR S a784 - case u'Ꞇ': // LATIN CAPITAL INSULAR T a786 - case u'Ꞌ': // LATIN CAPITAL SALTILLO a78b - case u'Ɥ': // LATIN CAPITAL TURNED H a78d - case u'Ꞑ': // LATIN CAPITAL N W/ DESCENDER a790 - case u'Ꞓ': // LATIN CAPITAL C W/ BAR a792 - case u'Ꞗ': // LATIN CAPITAL B W/ FLOURISH a796 - case u'Ꞙ': // LATIN CAPITAL F W/ STROKE a798 - case u'Ꞛ': // LATIN CAPITAL VOLAPUK AE a79a - case u'Ꞝ': // LATIN CAPITAL VOLAPUK OE a79c - case u'Ꞟ': // LATIN CAPITAL VOLAPUK UE a79e - case u'Ꞡ': // LATIN CAPITAL G W/ OBLIQUE STROKE a7a0 - case u'Ꞣ': // LATIN CAPITAL K W/ OBLIQUE STROKE a7a2 - case u'Ꞥ': // LATIN CAPITAL N W/ OBLIQUE STROKE a7a4 - case u'Ꞧ': // LATIN CAPITAL R W/ OBLIQUE STROKE a7a6 - case u'Ꞩ': // LATIN CAPITAL S W/ OBLIQUE STROKE a7a8 - case u'Ɦ': // LATIN CAPITAL H W/ HOOK a7aa - case u'Ɜ': // LATIN CAPITAL REVERSED OPEN E a7ab - case u'Ɡ': // LATIN CAPITAL SCRIPT G a7ac - case u'Ɬ': // LATIN CAPITAL L W/ BELT a7ad - case u'Ɪ': // LATIN CAPITAL SMALL CAPITAL I a7ae - case u'Ʞ': // LATIN CAPITAL TURNED K a7b0 - case u'Ʇ': // LATIN CAPITAL TURNED T a7b1 - case u'Ʝ': // LATIN CAPITAL J W/ CROSSED-TAIL a7b2 - case u'Ꭓ': // LATIN CAPITAL CHI a7b3 - case u'Ꞵ': // LATIN CAPITAL BETA a7b4 - case u'Ꞷ': // LATIN CAPITAL OMEGA a7b6 - case u'Ꞹ': // LATIN CAPITAL U W/ STROKE a7b8 - case u'Ꞻ': // LATIN CAPITAL GLOTTAL A a7ba - case u'Ꞽ': // LATIN CAPITAL GLOTTAL I a7bc - case u'Ꞿ': // LATIN CAPITAL GLOTTAL U a7be - case u'Ꟃ': // LATIN CAPITAL ANGLICANA W a7c2 - case u'Ꞔ': // LATIN CAPITAL C W/ PALATAL HOOK a7c4 - case u'Ʂ': // LATIN CAPITAL S W/ HOOK a7c5 - case u'Ᶎ': // LATIN CAPITAL Z W/ PALATAL HOOK a7c6 - case u'A': // FULLWIDTH LATIN CAPITAL A ff21 - case u'B': // FULLWIDTH LATIN CAPITAL B ff22 - case u'C': // FULLWIDTH LATIN CAPITAL C ff23 - case u'D': // FULLWIDTH LATIN CAPITAL D ff24 - case u'E': // FULLWIDTH LATIN CAPITAL E ff25 - case u'F': // FULLWIDTH LATIN CAPITAL F ff26 - case u'G': // FULLWIDTH LATIN CAPITAL G ff27 - case u'H': // FULLWIDTH LATIN CAPITAL H ff28 - case u'I': // FULLWIDTH LATIN CAPITAL I ff29 - case u'J': // FULLWIDTH LATIN CAPITAL J ff2a - case u'K': // FULLWIDTH LATIN CAPITAL K ff2b - case u'L': // FULLWIDTH LATIN CAPITAL L ff2c - case u'M': // FULLWIDTH LATIN CAPITAL M ff2d - case u'N': // FULLWIDTH LATIN CAPITAL N ff2e - case u'O': // FULLWIDTH LATIN CAPITAL O ff2f - case u'P': // FULLWIDTH LATIN CAPITAL P ff30 - case u'Q': // FULLWIDTH LATIN CAPITAL Q ff31 - case u'R': // FULLWIDTH LATIN CAPITAL R ff32 - case u'S': // FULLWIDTH LATIN CAPITAL S ff33 - case u'T': // FULLWIDTH LATIN CAPITAL T ff34 - case u'U': // FULLWIDTH LATIN CAPITAL U ff35 - case u'V': // FULLWIDTH LATIN CAPITAL V ff36 - case u'W': // FULLWIDTH LATIN CAPITAL W ff37 - case u'X': // FULLWIDTH LATIN CAPITAL X ff38 - case u'Y': // FULLWIDTH LATIN CAPITAL Y ff39 - case u'Z': // FULLWIDTH LATIN CAPITAL Z ff3a - case L'𐐀': // DESERET CAPITAL LONG I 10400 - case L'𐐁': // DESERET CAPITAL LONG E 10401 - case L'𐐂': // DESERET CAPITAL LONG A 10402 - case L'𐐃': // DESERET CAPITAL LONG AH 10403 - case L'𐐄': // DESERET CAPITAL LONG O 10404 - case L'𐐅': // DESERET CAPITAL LONG OO 10405 - case L'𐐆': // DESERET CAPITAL SHORT I 10406 - case L'𐐇': // DESERET CAPITAL SHORT E 10407 - case L'𐐈': // DESERET CAPITAL SHORT A 10408 - case L'𐐉': // DESERET CAPITAL SHORT AH 10409 - case L'𐐊': // DESERET CAPITAL SHORT O 1040a - case L'𐐋': // DESERET CAPITAL SHORT OO 1040b - case L'𐐌': // DESERET CAPITAL AY 1040c - case L'𐐍': // DESERET CAPITAL OW 1040d - case L'𐐎': // DESERET CAPITAL WU 1040e - case L'𐐏': // DESERET CAPITAL YEE 1040f - case L'𐐐': // DESERET CAPITAL H 10410 - case L'𐐑': // DESERET CAPITAL PEE 10411 - case L'𐐒': // DESERET CAPITAL BEE 10412 - case L'𐐓': // DESERET CAPITAL TEE 10413 - case L'𐐔': // DESERET CAPITAL DEE 10414 - case L'𐐕': // DESERET CAPITAL CHEE 10415 - case L'𐐖': // DESERET CAPITAL JEE 10416 - case L'𐐗': // DESERET CAPITAL KAY 10417 - case L'𐐘': // DESERET CAPITAL GAY 10418 - case L'𐐙': // DESERET CAPITAL EF 10419 - case L'𐐚': // DESERET CAPITAL VEE 1041a - case L'𐐛': // DESERET CAPITAL ETH 1041b - case L'𐐜': // DESERET CAPITAL THEE 1041c - case L'𐐝': // DESERET CAPITAL ES 1041d - case L'𐐞': // DESERET CAPITAL ZEE 1041e - case L'𐐟': // DESERET CAPITAL ESH 1041f - case L'𐐠': // DESERET CAPITAL ZHEE 10420 - case L'𐐡': // DESERET CAPITAL ER 10421 - case L'𐐢': // DESERET CAPITAL EL 10422 - case L'𐐣': // DESERET CAPITAL EM 10423 - case L'𐐤': // DESERET CAPITAL EN 10424 - case L'𐐥': // DESERET CAPITAL ENG 10425 - case L'𐐦': // DESERET CAPITAL OI 10426 - case L'𐐧': // DESERET CAPITAL EW 10427 - case L'𐒰': // OSAGE CAPITAL A 104b0 - case L'𐒱': // OSAGE CAPITAL AI 104b1 - case L'𐒲': // OSAGE CAPITAL AIN 104b2 - case L'𐒳': // OSAGE CAPITAL AH 104b3 - case L'𐒴': // OSAGE CAPITAL BRA 104b4 - case L'𐒵': // OSAGE CAPITAL CHA 104b5 - case L'𐒶': // OSAGE CAPITAL EHCHA 104b6 - case L'𐒷': // OSAGE CAPITAL E 104b7 - case L'𐒸': // OSAGE CAPITAL EIN 104b8 - case L'𐒹': // OSAGE CAPITAL HA 104b9 - case L'𐒺': // OSAGE CAPITAL HYA 104ba - case L'𐒻': // OSAGE CAPITAL I 104bb - case L'𐒼': // OSAGE CAPITAL KA 104bc - case L'𐒽': // OSAGE CAPITAL EHKA 104bd - case L'𐒾': // OSAGE CAPITAL KYA 104be - case L'𐒿': // OSAGE CAPITAL LA 104bf - case L'𐓀': // OSAGE CAPITAL MA 104c0 - case L'𐓁': // OSAGE CAPITAL NA 104c1 - case L'𐓂': // OSAGE CAPITAL O 104c2 - case L'𐓃': // OSAGE CAPITAL OIN 104c3 - case L'𐓄': // OSAGE CAPITAL PA 104c4 - case L'𐓅': // OSAGE CAPITAL EHPA 104c5 - case L'𐓆': // OSAGE CAPITAL SA 104c6 - case L'𐓇': // OSAGE CAPITAL SHA 104c7 - case L'𐓈': // OSAGE CAPITAL TA 104c8 - case L'𐓉': // OSAGE CAPITAL EHTA 104c9 - case L'𐓊': // OSAGE CAPITAL TSA 104ca - case L'𐓋': // OSAGE CAPITAL EHTSA 104cb - case L'𐓌': // OSAGE CAPITAL TSHA 104cc - case L'𐓍': // OSAGE CAPITAL DHA 104cd - case L'𐓎': // OSAGE CAPITAL U 104ce - case L'𐓏': // OSAGE CAPITAL WA 104cf - case L'𐓐': // OSAGE CAPITAL KHA 104d0 - case L'𐓑': // OSAGE CAPITAL GHA 104d1 - case L'𐓒': // OSAGE CAPITAL ZA 104d2 - case L'𐓓': // OSAGE CAPITAL ZHA 104d3 - case L'𐲀': // OLD HUNGARIAN CAPITAL A 10c80 - case L'𐲁': // OLD HUNGARIAN CAPITAL AA 10c81 - case L'𐲂': // OLD HUNGARIAN CAPITAL EB 10c82 - case L'𐲃': // OLD HUNGARIAN CAPITAL AMB 10c83 - case L'𐲄': // OLD HUNGARIAN CAPITAL EC 10c84 - case L'𐲅': // OLD HUNGARIAN CAPITAL ENC 10c85 - case L'𐲆': // OLD HUNGARIAN CAPITAL ECS 10c86 - case L'𐲇': // OLD HUNGARIAN CAPITAL ED 10c87 - case L'𐲈': // OLD HUNGARIAN CAPITAL AND 10c88 - case L'𐲉': // OLD HUNGARIAN CAPITAL E 10c89 - case L'𐲊': // OLD HUNGARIAN CAPITAL CLOSE E 10c8a - case L'𐲋': // OLD HUNGARIAN CAPITAL EE 10c8b - case L'𐲌': // OLD HUNGARIAN CAPITAL EF 10c8c - case L'𐲍': // OLD HUNGARIAN CAPITAL EG 10c8d - case L'𐲎': // OLD HUNGARIAN CAPITAL EGY 10c8e - case L'𐲏': // OLD HUNGARIAN CAPITAL EH 10c8f - case L'𐲐': // OLD HUNGARIAN CAPITAL I 10c90 - case L'𐲑': // OLD HUNGARIAN CAPITAL II 10c91 - case L'𐲒': // OLD HUNGARIAN CAPITAL EJ 10c92 - case L'𐲓': // OLD HUNGARIAN CAPITAL EK 10c93 - case L'𐲔': // OLD HUNGARIAN CAPITAL AK 10c94 - case L'𐲕': // OLD HUNGARIAN CAPITAL UNK 10c95 - case L'𐲖': // OLD HUNGARIAN CAPITAL EL 10c96 - case L'𐲗': // OLD HUNGARIAN CAPITAL ELY 10c97 - case L'𐲘': // OLD HUNGARIAN CAPITAL EM 10c98 - case L'𐲙': // OLD HUNGARIAN CAPITAL EN 10c99 - case L'𐲚': // OLD HUNGARIAN CAPITAL ENY 10c9a - case L'𐲛': // OLD HUNGARIAN CAPITAL O 10c9b - case L'𐲜': // OLD HUNGARIAN CAPITAL OO 10c9c - case L'𐲝': // OLD HUNGARIAN CAPITAL NIKOLSBURG OE 10c9d - case L'𐲞': // OLD HUNGARIAN CAPITAL RUDIMENTA OE 10c9e - case L'𐲟': // OLD HUNGARIAN CAPITAL OEE 10c9f - case L'𐲠': // OLD HUNGARIAN CAPITAL EP 10ca0 - case L'𐲡': // OLD HUNGARIAN CAPITAL EMP 10ca1 - case L'𐲢': // OLD HUNGARIAN CAPITAL ER 10ca2 - case L'𐲣': // OLD HUNGARIAN CAPITAL SHORT ER 10ca3 - case L'𐲤': // OLD HUNGARIAN CAPITAL ES 10ca4 - case L'𐲥': // OLD HUNGARIAN CAPITAL ESZ 10ca5 - case L'𐲦': // OLD HUNGARIAN CAPITAL ET 10ca6 - case L'𐲧': // OLD HUNGARIAN CAPITAL ENT 10ca7 - case L'𐲨': // OLD HUNGARIAN CAPITAL ETY 10ca8 - case L'𐲩': // OLD HUNGARIAN CAPITAL ECH 10ca9 - case L'𐲪': // OLD HUNGARIAN CAPITAL U 10caa - case L'𐲫': // OLD HUNGARIAN CAPITAL UU 10cab - case L'𐲬': // OLD HUNGARIAN CAPITAL NIKOLSBURG UE 10cac - case L'𐲭': // OLD HUNGARIAN CAPITAL RUDIMENTA UE 10cad - case L'𐲮': // OLD HUNGARIAN CAPITAL EV 10cae - case L'𐲯': // OLD HUNGARIAN CAPITAL EZ 10caf - case L'𐲰': // OLD HUNGARIAN CAPITAL EZS 10cb0 - case L'𐲱': // OLD HUNGARIAN CAPITAL ENT-SHAPED SIGN 10cb1 - case L'𐲲': // OLD HUNGARIAN CAPITAL US 10cb2 - case L'𑢠': // WARANG CITI CAPITAL NGAA 118a0 - case L'𑢡': // WARANG CITI CAPITAL A 118a1 - case L'𑢢': // WARANG CITI CAPITAL WI 118a2 - case L'𑢣': // WARANG CITI CAPITAL YU 118a3 - case L'𑢤': // WARANG CITI CAPITAL YA 118a4 - case L'𑢥': // WARANG CITI CAPITAL YO 118a5 - case L'𑢦': // WARANG CITI CAPITAL II 118a6 - case L'𑢧': // WARANG CITI CAPITAL UU 118a7 - case L'𑢨': // WARANG CITI CAPITAL E 118a8 - case L'𑢩': // WARANG CITI CAPITAL O 118a9 - case L'𑢪': // WARANG CITI CAPITAL ANG 118aa - case L'𑢫': // WARANG CITI CAPITAL GA 118ab - case L'𑢬': // WARANG CITI CAPITAL KO 118ac - case L'𑢭': // WARANG CITI CAPITAL ENY 118ad - case L'𑢮': // WARANG CITI CAPITAL YUJ 118ae - case L'𑢯': // WARANG CITI CAPITAL UC 118af - case L'𑢰': // WARANG CITI CAPITAL ENN 118b0 - case L'𑢱': // WARANG CITI CAPITAL ODD 118b1 - case L'𑢲': // WARANG CITI CAPITAL TTE 118b2 - case L'𑢳': // WARANG CITI CAPITAL NUNG 118b3 - case L'𑢴': // WARANG CITI CAPITAL DA 118b4 - case L'𑢵': // WARANG CITI CAPITAL AT 118b5 - case L'𑢶': // WARANG CITI CAPITAL AM 118b6 - case L'𑢷': // WARANG CITI CAPITAL BU 118b7 - case L'𑢸': // WARANG CITI CAPITAL PU 118b8 - case L'𑢹': // WARANG CITI CAPITAL HIYO 118b9 - case L'𑢺': // WARANG CITI CAPITAL HOLO 118ba - case L'𑢻': // WARANG CITI CAPITAL HORR 118bb - case L'𑢼': // WARANG CITI CAPITAL HAR 118bc - case L'𑢽': // WARANG CITI CAPITAL SSUU 118bd - case L'𑢾': // WARANG CITI CAPITAL SII 118be - case L'𑢿': // WARANG CITI CAPITAL VIYO 118bf - case L'𖹀': // MEDEFAIDRIN CAPITAL M 16e40 - case L'𖹁': // MEDEFAIDRIN CAPITAL S 16e41 - case L'𖹂': // MEDEFAIDRIN CAPITAL V 16e42 - case L'𖹃': // MEDEFAIDRIN CAPITAL W 16e43 - case L'𖹄': // MEDEFAIDRIN CAPITAL ATIU 16e44 - case L'𖹅': // MEDEFAIDRIN CAPITAL Z 16e45 - case L'𖹆': // MEDEFAIDRIN CAPITAL KP 16e46 - case L'𖹇': // MEDEFAIDRIN CAPITAL P 16e47 - case L'𖹈': // MEDEFAIDRIN CAPITAL T 16e48 - case L'𖹉': // MEDEFAIDRIN CAPITAL G 16e49 - case L'𖹊': // MEDEFAIDRIN CAPITAL F 16e4a - case L'𖹋': // MEDEFAIDRIN CAPITAL I 16e4b - case L'𖹌': // MEDEFAIDRIN CAPITAL K 16e4c - case L'𖹍': // MEDEFAIDRIN CAPITAL A 16e4d - case L'𖹎': // MEDEFAIDRIN CAPITAL J 16e4e - case L'𖹏': // MEDEFAIDRIN CAPITAL E 16e4f - case L'𖹐': // MEDEFAIDRIN CAPITAL B 16e50 - case L'𖹑': // MEDEFAIDRIN CAPITAL C 16e51 - case L'𖹒': // MEDEFAIDRIN CAPITAL U 16e52 - case L'𖹓': // MEDEFAIDRIN CAPITAL YU 16e53 - case L'𖹔': // MEDEFAIDRIN CAPITAL L 16e54 - case L'𖹕': // MEDEFAIDRIN CAPITAL Q 16e55 - case L'𖹖': // MEDEFAIDRIN CAPITAL HP 16e56 - case L'𖹗': // MEDEFAIDRIN CAPITAL NY 16e57 - case L'𖹘': // MEDEFAIDRIN CAPITAL X 16e58 - case L'𖹙': // MEDEFAIDRIN CAPITAL D 16e59 - case L'𖹚': // MEDEFAIDRIN CAPITAL OE 16e5a - case L'𖹛': // MEDEFAIDRIN CAPITAL N 16e5b - case L'𖹜': // MEDEFAIDRIN CAPITAL R 16e5c - case L'𖹝': // MEDEFAIDRIN CAPITAL O 16e5d - case L'𖹞': // MEDEFAIDRIN CAPITAL AI 16e5e - case L'𖹟': // MEDEFAIDRIN CAPITAL Y 16e5f - case L'𝐀': // MATHEMATICAL BOLD CAPITAL A 1d400 - case L'𝐁': // MATHEMATICAL BOLD CAPITAL B 1d401 - case L'𝐂': // MATHEMATICAL BOLD CAPITAL C 1d402 - case L'𝐃': // MATHEMATICAL BOLD CAPITAL D 1d403 - case L'𝐄': // MATHEMATICAL BOLD CAPITAL E 1d404 - case L'𝐅': // MATHEMATICAL BOLD CAPITAL F 1d405 - case L'𝐆': // MATHEMATICAL BOLD CAPITAL G 1d406 - case L'𝐇': // MATHEMATICAL BOLD CAPITAL H 1d407 - case L'𝐈': // MATHEMATICAL BOLD CAPITAL I 1d408 - case L'𝐉': // MATHEMATICAL BOLD CAPITAL J 1d409 - case L'𝐊': // MATHEMATICAL BOLD CAPITAL K 1d40a - case L'𝐋': // MATHEMATICAL BOLD CAPITAL L 1d40b - case L'𝐌': // MATHEMATICAL BOLD CAPITAL M 1d40c - case L'𝐍': // MATHEMATICAL BOLD CAPITAL N 1d40d - case L'𝐎': // MATHEMATICAL BOLD CAPITAL O 1d40e - case L'𝐏': // MATHEMATICAL BOLD CAPITAL P 1d40f - case L'𝐐': // MATHEMATICAL BOLD CAPITAL Q 1d410 - case L'𝐑': // MATHEMATICAL BOLD CAPITAL R 1d411 - case L'𝐒': // MATHEMATICAL BOLD CAPITAL S 1d412 - case L'𝐓': // MATHEMATICAL BOLD CAPITAL T 1d413 - case L'𝐔': // MATHEMATICAL BOLD CAPITAL U 1d414 - case L'𝐕': // MATHEMATICAL BOLD CAPITAL V 1d415 - case L'𝐖': // MATHEMATICAL BOLD CAPITAL W 1d416 - case L'𝐗': // MATHEMATICAL BOLD CAPITAL X 1d417 - case L'𝐘': // MATHEMATICAL BOLD CAPITAL Y 1d418 - case L'𝐙': // MATHEMATICAL BOLD CAPITAL Z 1d419 - case L'𝐴': // MATHEMATICAL ITALIC CAPITAL A 1d434 - case L'𝐵': // MATHEMATICAL ITALIC CAPITAL B 1d435 - case L'𝐶': // MATHEMATICAL ITALIC CAPITAL C 1d436 - case L'𝐷': // MATHEMATICAL ITALIC CAPITAL D 1d437 - case L'𝐸': // MATHEMATICAL ITALIC CAPITAL E 1d438 - case L'𝐹': // MATHEMATICAL ITALIC CAPITAL F 1d439 - case L'𝐺': // MATHEMATICAL ITALIC CAPITAL G 1d43a - case L'𝐻': // MATHEMATICAL ITALIC CAPITAL H 1d43b - case L'𝐼': // MATHEMATICAL ITALIC CAPITAL I 1d43c - case L'𝐽': // MATHEMATICAL ITALIC CAPITAL J 1d43d - case L'𝐾': // MATHEMATICAL ITALIC CAPITAL K 1d43e - case L'𝐿': // MATHEMATICAL ITALIC CAPITAL L 1d43f - case L'𝑀': // MATHEMATICAL ITALIC CAPITAL M 1d440 - case L'𝑁': // MATHEMATICAL ITALIC CAPITAL N 1d441 - case L'𝑂': // MATHEMATICAL ITALIC CAPITAL O 1d442 - case L'𝑃': // MATHEMATICAL ITALIC CAPITAL P 1d443 - case L'𝑄': // MATHEMATICAL ITALIC CAPITAL Q 1d444 - case L'𝑅': // MATHEMATICAL ITALIC CAPITAL R 1d445 - case L'𝑆': // MATHEMATICAL ITALIC CAPITAL S 1d446 - case L'𝑇': // MATHEMATICAL ITALIC CAPITAL T 1d447 - case L'𝑈': // MATHEMATICAL ITALIC CAPITAL U 1d448 - case L'𝑉': // MATHEMATICAL ITALIC CAPITAL V 1d449 - case L'𝑊': // MATHEMATICAL ITALIC CAPITAL W 1d44a - case L'𝑋': // MATHEMATICAL ITALIC CAPITAL X 1d44b - case L'𝑌': // MATHEMATICAL ITALIC CAPITAL Y 1d44c - case L'𝑍': // MATHEMATICAL ITALIC CAPITAL Z 1d44d - case L'𝑨': // MATHEMATICAL BOLD ITALIC CAPITAL A 1d468 - case L'𝑩': // MATHEMATICAL BOLD ITALIC CAPITAL B 1d469 - case L'𝑪': // MATHEMATICAL BOLD ITALIC CAPITAL C 1d46a - case L'𝑫': // MATHEMATICAL BOLD ITALIC CAPITAL D 1d46b - case L'𝑬': // MATHEMATICAL BOLD ITALIC CAPITAL E 1d46c - case L'𝑭': // MATHEMATICAL BOLD ITALIC CAPITAL F 1d46d - case L'𝑮': // MATHEMATICAL BOLD ITALIC CAPITAL G 1d46e - case L'𝑯': // MATHEMATICAL BOLD ITALIC CAPITAL H 1d46f - case L'𝑰': // MATHEMATICAL BOLD ITALIC CAPITAL I 1d470 - case L'𝑱': // MATHEMATICAL BOLD ITALIC CAPITAL J 1d471 - case L'𝑲': // MATHEMATICAL BOLD ITALIC CAPITAL K 1d472 - case L'𝑳': // MATHEMATICAL BOLD ITALIC CAPITAL L 1d473 - case L'𝑴': // MATHEMATICAL BOLD ITALIC CAPITAL M 1d474 - case L'𝑵': // MATHEMATICAL BOLD ITALIC CAPITAL N 1d475 - case L'𝑶': // MATHEMATICAL BOLD ITALIC CAPITAL O 1d476 - case L'𝑷': // MATHEMATICAL BOLD ITALIC CAPITAL P 1d477 - case L'𝑸': // MATHEMATICAL BOLD ITALIC CAPITAL Q 1d478 - case L'𝑹': // MATHEMATICAL BOLD ITALIC CAPITAL R 1d479 - case L'𝑺': // MATHEMATICAL BOLD ITALIC CAPITAL S 1d47a - case L'𝑻': // MATHEMATICAL BOLD ITALIC CAPITAL T 1d47b - case L'𝑼': // MATHEMATICAL BOLD ITALIC CAPITAL U 1d47c - case L'𝑽': // MATHEMATICAL BOLD ITALIC CAPITAL V 1d47d - case L'𝑾': // MATHEMATICAL BOLD ITALIC CAPITAL W 1d47e - case L'𝑿': // MATHEMATICAL BOLD ITALIC CAPITAL X 1d47f - case L'𝒀': // MATHEMATICAL BOLD ITALIC CAPITAL Y 1d480 - case L'𝒁': // MATHEMATICAL BOLD ITALIC CAPITAL Z 1d481 - case L'𝒜': // MATHEMATICAL SCRIPT CAPITAL A 1d49c - case L'𝒞': // MATHEMATICAL SCRIPT CAPITAL C 1d49e - case L'𝒟': // MATHEMATICAL SCRIPT CAPITAL D 1d49f - case L'𝒢': // MATHEMATICAL SCRIPT CAPITAL G 1d4a2 - case L'𝒥': // MATHEMATICAL SCRIPT CAPITAL J 1d4a5 - case L'𝒦': // MATHEMATICAL SCRIPT CAPITAL K 1d4a6 - case L'𝒩': // MATHEMATICAL SCRIPT CAPITAL N 1d4a9 - case L'𝒪': // MATHEMATICAL SCRIPT CAPITAL O 1d4aa - case L'𝒫': // MATHEMATICAL SCRIPT CAPITAL P 1d4ab - case L'𝒬': // MATHEMATICAL SCRIPT CAPITAL Q 1d4ac - case L'𝒮': // MATHEMATICAL SCRIPT CAPITAL S 1d4ae - case L'𝒯': // MATHEMATICAL SCRIPT CAPITAL T 1d4af - case L'𝒰': // MATHEMATICAL SCRIPT CAPITAL U 1d4b0 - case L'𝒱': // MATHEMATICAL SCRIPT CAPITAL V 1d4b1 - case L'𝒲': // MATHEMATICAL SCRIPT CAPITAL W 1d4b2 - case L'𝒳': // MATHEMATICAL SCRIPT CAPITAL X 1d4b3 - case L'𝒴': // MATHEMATICAL SCRIPT CAPITAL Y 1d4b4 - case L'𝒵': // MATHEMATICAL SCRIPT CAPITAL Z 1d4b5 - case L'𝓐': // MATHEMATICAL BOLD SCRIPT CAPITAL A 1d4d0 - case L'𝓑': // MATHEMATICAL BOLD SCRIPT CAPITAL B 1d4d1 - case L'𝓒': // MATHEMATICAL BOLD SCRIPT CAPITAL C 1d4d2 - case L'𝓓': // MATHEMATICAL BOLD SCRIPT CAPITAL D 1d4d3 - case L'𝓔': // MATHEMATICAL BOLD SCRIPT CAPITAL E 1d4d4 - case L'𝓕': // MATHEMATICAL BOLD SCRIPT CAPITAL F 1d4d5 - case L'𝓖': // MATHEMATICAL BOLD SCRIPT CAPITAL G 1d4d6 - case L'𝓗': // MATHEMATICAL BOLD SCRIPT CAPITAL H 1d4d7 - case L'𝓘': // MATHEMATICAL BOLD SCRIPT CAPITAL I 1d4d8 - case L'𝓙': // MATHEMATICAL BOLD SCRIPT CAPITAL J 1d4d9 - case L'𝓚': // MATHEMATICAL BOLD SCRIPT CAPITAL K 1d4da - case L'𝓛': // MATHEMATICAL BOLD SCRIPT CAPITAL L 1d4db - case L'𝓜': // MATHEMATICAL BOLD SCRIPT CAPITAL M 1d4dc - case L'𝓝': // MATHEMATICAL BOLD SCRIPT CAPITAL N 1d4dd - case L'𝓞': // MATHEMATICAL BOLD SCRIPT CAPITAL O 1d4de - case L'𝓟': // MATHEMATICAL BOLD SCRIPT CAPITAL P 1d4df - case L'𝓠': // MATHEMATICAL BOLD SCRIPT CAPITAL Q 1d4e0 - case L'𝓡': // MATHEMATICAL BOLD SCRIPT CAPITAL R 1d4e1 - case L'𝓢': // MATHEMATICAL BOLD SCRIPT CAPITAL S 1d4e2 - case L'𝓣': // MATHEMATICAL BOLD SCRIPT CAPITAL T 1d4e3 - case L'𝓤': // MATHEMATICAL BOLD SCRIPT CAPITAL U 1d4e4 - case L'𝓥': // MATHEMATICAL BOLD SCRIPT CAPITAL V 1d4e5 - case L'𝓦': // MATHEMATICAL BOLD SCRIPT CAPITAL W 1d4e6 - case L'𝓧': // MATHEMATICAL BOLD SCRIPT CAPITAL X 1d4e7 - case L'𝓨': // MATHEMATICAL BOLD SCRIPT CAPITAL Y 1d4e8 - case L'𝓩': // MATHEMATICAL BOLD SCRIPT CAPITAL Z 1d4e9 - case L'𝔄': // MATHEMATICAL FRAKTUR CAPITAL A 1d504 - case L'𝔅': // MATHEMATICAL FRAKTUR CAPITAL B 1d505 - case L'𝔇': // MATHEMATICAL FRAKTUR CAPITAL D 1d507 - case L'𝔈': // MATHEMATICAL FRAKTUR CAPITAL E 1d508 - case L'𝔉': // MATHEMATICAL FRAKTUR CAPITAL F 1d509 - case L'𝔊': // MATHEMATICAL FRAKTUR CAPITAL G 1d50a - case L'𝔍': // MATHEMATICAL FRAKTUR CAPITAL J 1d50d - case L'𝔎': // MATHEMATICAL FRAKTUR CAPITAL K 1d50e - case L'𝔏': // MATHEMATICAL FRAKTUR CAPITAL L 1d50f - case L'𝔐': // MATHEMATICAL FRAKTUR CAPITAL M 1d510 - case L'𝔑': // MATHEMATICAL FRAKTUR CAPITAL N 1d511 - case L'𝔒': // MATHEMATICAL FRAKTUR CAPITAL O 1d512 - case L'𝔓': // MATHEMATICAL FRAKTUR CAPITAL P 1d513 - case L'𝔔': // MATHEMATICAL FRAKTUR CAPITAL Q 1d514 - case L'𝔖': // MATHEMATICAL FRAKTUR CAPITAL S 1d516 - case L'𝔗': // MATHEMATICAL FRAKTUR CAPITAL T 1d517 - case L'𝔘': // MATHEMATICAL FRAKTUR CAPITAL U 1d518 - case L'𝔙': // MATHEMATICAL FRAKTUR CAPITAL V 1d519 - case L'𝔚': // MATHEMATICAL FRAKTUR CAPITAL W 1d51a - case L'𝔛': // MATHEMATICAL FRAKTUR CAPITAL X 1d51b - case L'𝔜': // MATHEMATICAL FRAKTUR CAPITAL Y 1d51c - case L'𝔸': // MATHEMATICAL DOUBLE-STRUCK CAPITAL A 1d538 - case L'𝔹': // MATHEMATICAL DOUBLE-STRUCK CAPITAL B 1d539 - case L'𝔻': // MATHEMATICAL DOUBLE-STRUCK CAPITAL D 1d53b - case L'𝔼': // MATHEMATICAL DOUBLE-STRUCK CAPITAL E 1d53c - case L'𝔽': // MATHEMATICAL DOUBLE-STRUCK CAPITAL F 1d53d - case L'𝔾': // MATHEMATICAL DOUBLE-STRUCK CAPITAL G 1d53e - case L'𝕀': // MATHEMATICAL DOUBLE-STRUCK CAPITAL I 1d540 - case L'𝕁': // MATHEMATICAL DOUBLE-STRUCK CAPITAL J 1d541 - case L'𝕂': // MATHEMATICAL DOUBLE-STRUCK CAPITAL K 1d542 - case L'𝕃': // MATHEMATICAL DOUBLE-STRUCK CAPITAL L 1d543 - case L'𝕄': // MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1d544 - case L'𝕆': // MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1d546 - case L'𝕊': // MATHEMATICAL DOUBLE-STRUCK CAPITAL S 1d54a - case L'𝕋': // MATHEMATICAL DOUBLE-STRUCK CAPITAL T 1d54b - case L'𝕌': // MATHEMATICAL DOUBLE-STRUCK CAPITAL U 1d54c - case L'𝕍': // MATHEMATICAL DOUBLE-STRUCK CAPITAL V 1d54d - case L'𝕎': // MATHEMATICAL DOUBLE-STRUCK CAPITAL W 1d54e - case L'𝕏': // MATHEMATICAL DOUBLE-STRUCK CAPITAL X 1d54f - case L'𝕐': // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y 1d550 - case L'𝕬': // MATHEMATICAL BOLD FRAKTUR CAPITAL A 1d56c - case L'𝕭': // MATHEMATICAL BOLD FRAKTUR CAPITAL B 1d56d - case L'𝕮': // MATHEMATICAL BOLD FRAKTUR CAPITAL C 1d56e - case L'𝕯': // MATHEMATICAL BOLD FRAKTUR CAPITAL D 1d56f - case L'𝕰': // MATHEMATICAL BOLD FRAKTUR CAPITAL E 1d570 - case L'𝕱': // MATHEMATICAL BOLD FRAKTUR CAPITAL F 1d571 - case L'𝕲': // MATHEMATICAL BOLD FRAKTUR CAPITAL G 1d572 - case L'𝕳': // MATHEMATICAL BOLD FRAKTUR CAPITAL H 1d573 - case L'𝕴': // MATHEMATICAL BOLD FRAKTUR CAPITAL I 1d574 - case L'𝕵': // MATHEMATICAL BOLD FRAKTUR CAPITAL J 1d575 - case L'𝕶': // MATHEMATICAL BOLD FRAKTUR CAPITAL K 1d576 - case L'𝕷': // MATHEMATICAL BOLD FRAKTUR CAPITAL L 1d577 - case L'𝕸': // MATHEMATICAL BOLD FRAKTUR CAPITAL M 1d578 - case L'𝕹': // MATHEMATICAL BOLD FRAKTUR CAPITAL N 1d579 - case L'𝕺': // MATHEMATICAL BOLD FRAKTUR CAPITAL O 1d57a - case L'𝕻': // MATHEMATICAL BOLD FRAKTUR CAPITAL P 1d57b - case L'𝕼': // MATHEMATICAL BOLD FRAKTUR CAPITAL Q 1d57c - case L'𝕽': // MATHEMATICAL BOLD FRAKTUR CAPITAL R 1d57d - case L'𝕾': // MATHEMATICAL BOLD FRAKTUR CAPITAL S 1d57e - case L'𝕿': // MATHEMATICAL BOLD FRAKTUR CAPITAL T 1d57f - case L'𝖀': // MATHEMATICAL BOLD FRAKTUR CAPITAL U 1d580 - case L'𝖁': // MATHEMATICAL BOLD FRAKTUR CAPITAL V 1d581 - case L'𝖂': // MATHEMATICAL BOLD FRAKTUR CAPITAL W 1d582 - case L'𝖃': // MATHEMATICAL BOLD FRAKTUR CAPITAL X 1d583 - case L'𝖄': // MATHEMATICAL BOLD FRAKTUR CAPITAL Y 1d584 - case L'𝖅': // MATHEMATICAL BOLD FRAKTUR CAPITAL Z 1d585 - case L'𝖠': // MATHEMATICAL SANS CAPITAL A 1d5a0 - case L'𝖡': // MATHEMATICAL SANS CAPITAL B 1d5a1 - case L'𝖢': // MATHEMATICAL SANS CAPITAL C 1d5a2 - case L'𝖣': // MATHEMATICAL SANS CAPITAL D 1d5a3 - case L'𝖤': // MATHEMATICAL SANS CAPITAL E 1d5a4 - case L'𝖥': // MATHEMATICAL SANS CAPITAL F 1d5a5 - case L'𝖦': // MATHEMATICAL SANS CAPITAL G 1d5a6 - case L'𝖧': // MATHEMATICAL SANS CAPITAL H 1d5a7 - case L'𝖨': // MATHEMATICAL SANS CAPITAL I 1d5a8 - case L'𝖩': // MATHEMATICAL SANS CAPITAL J 1d5a9 - case L'𝖪': // MATHEMATICAL SANS CAPITAL K 1d5aa - case L'𝖫': // MATHEMATICAL SANS CAPITAL L 1d5ab - case L'𝖬': // MATHEMATICAL SANS CAPITAL M 1d5ac - case L'𝖭': // MATHEMATICAL SANS CAPITAL N 1d5ad - case L'𝖮': // MATHEMATICAL SANS CAPITAL O 1d5ae - case L'𝖯': // MATHEMATICAL SANS CAPITAL P 1d5af - case L'𝖰': // MATHEMATICAL SANS CAPITAL Q 1d5b0 - case L'𝖱': // MATHEMATICAL SANS CAPITAL R 1d5b1 - case L'𝖲': // MATHEMATICAL SANS CAPITAL S 1d5b2 - case L'𝖳': // MATHEMATICAL SANS CAPITAL T 1d5b3 - case L'𝖴': // MATHEMATICAL SANS CAPITAL U 1d5b4 - case L'𝖵': // MATHEMATICAL SANS CAPITAL V 1d5b5 - case L'𝖶': // MATHEMATICAL SANS CAPITAL W 1d5b6 - case L'𝖷': // MATHEMATICAL SANS CAPITAL X 1d5b7 - case L'𝖸': // MATHEMATICAL SANS CAPITAL Y 1d5b8 - case L'𝖹': // MATHEMATICAL SANS CAPITAL Z 1d5b9 - case L'𝗔': // MATHEMATICAL SANS BOLD CAPITAL A 1d5d4 - case L'𝗕': // MATHEMATICAL SANS BOLD CAPITAL B 1d5d5 - case L'𝗖': // MATHEMATICAL SANS BOLD CAPITAL C 1d5d6 - case L'𝗗': // MATHEMATICAL SANS BOLD CAPITAL D 1d5d7 - case L'𝗘': // MATHEMATICAL SANS BOLD CAPITAL E 1d5d8 - case L'𝗙': // MATHEMATICAL SANS BOLD CAPITAL F 1d5d9 - case L'𝗚': // MATHEMATICAL SANS BOLD CAPITAL G 1d5da - case L'𝗛': // MATHEMATICAL SANS BOLD CAPITAL H 1d5db - case L'𝗜': // MATHEMATICAL SANS BOLD CAPITAL I 1d5dc - case L'𝗝': // MATHEMATICAL SANS BOLD CAPITAL J 1d5dd - case L'𝗞': // MATHEMATICAL SANS BOLD CAPITAL K 1d5de - case L'𝗟': // MATHEMATICAL SANS BOLD CAPITAL L 1d5df - case L'𝗠': // MATHEMATICAL SANS BOLD CAPITAL M 1d5e0 - case L'𝗡': // MATHEMATICAL SANS BOLD CAPITAL N 1d5e1 - case L'𝗢': // MATHEMATICAL SANS BOLD CAPITAL O 1d5e2 - case L'𝗣': // MATHEMATICAL SANS BOLD CAPITAL P 1d5e3 - case L'𝗤': // MATHEMATICAL SANS BOLD CAPITAL Q 1d5e4 - case L'𝗥': // MATHEMATICAL SANS BOLD CAPITAL R 1d5e5 - case L'𝗦': // MATHEMATICAL SANS BOLD CAPITAL S 1d5e6 - case L'𝗧': // MATHEMATICAL SANS BOLD CAPITAL T 1d5e7 - case L'𝗨': // MATHEMATICAL SANS BOLD CAPITAL U 1d5e8 - case L'𝗩': // MATHEMATICAL SANS BOLD CAPITAL V 1d5e9 - case L'𝗪': // MATHEMATICAL SANS BOLD CAPITAL W 1d5ea - case L'𝗫': // MATHEMATICAL SANS BOLD CAPITAL X 1d5eb - case L'𝗬': // MATHEMATICAL SANS BOLD CAPITAL Y 1d5ec - case L'𝗭': // MATHEMATICAL SANS BOLD CAPITAL Z 1d5ed - case L'𝘈': // MATHEMATICAL SANS ITALIC CAPITAL A 1d608 - case L'𝘉': // MATHEMATICAL SANS ITALIC CAPITAL B 1d609 - case L'𝘊': // MATHEMATICAL SANS ITALIC CAPITAL C 1d60a - case L'𝘋': // MATHEMATICAL SANS ITALIC CAPITAL D 1d60b - case L'𝘌': // MATHEMATICAL SANS ITALIC CAPITAL E 1d60c - case L'𝘍': // MATHEMATICAL SANS ITALIC CAPITAL F 1d60d - case L'𝘎': // MATHEMATICAL SANS ITALIC CAPITAL G 1d60e - case L'𝘏': // MATHEMATICAL SANS ITALIC CAPITAL H 1d60f - case L'𝘐': // MATHEMATICAL SANS ITALIC CAPITAL I 1d610 - case L'𝘑': // MATHEMATICAL SANS ITALIC CAPITAL J 1d611 - case L'𝘒': // MATHEMATICAL SANS ITALIC CAPITAL K 1d612 - case L'𝘓': // MATHEMATICAL SANS ITALIC CAPITAL L 1d613 - case L'𝘔': // MATHEMATICAL SANS ITALIC CAPITAL M 1d614 - case L'𝘕': // MATHEMATICAL SANS ITALIC CAPITAL N 1d615 - case L'𝘖': // MATHEMATICAL SANS ITALIC CAPITAL O 1d616 - case L'𝘗': // MATHEMATICAL SANS ITALIC CAPITAL P 1d617 - case L'𝘘': // MATHEMATICAL SANS ITALIC CAPITAL Q 1d618 - case L'𝘙': // MATHEMATICAL SANS ITALIC CAPITAL R 1d619 - case L'𝘚': // MATHEMATICAL SANS ITALIC CAPITAL S 1d61a - case L'𝘛': // MATHEMATICAL SANS ITALIC CAPITAL T 1d61b - case L'𝘜': // MATHEMATICAL SANS ITALIC CAPITAL U 1d61c - case L'𝘝': // MATHEMATICAL SANS ITALIC CAPITAL V 1d61d - case L'𝘞': // MATHEMATICAL SANS ITALIC CAPITAL W 1d61e - case L'𝘟': // MATHEMATICAL SANS ITALIC CAPITAL X 1d61f - case L'𝘠': // MATHEMATICAL SANS ITALIC CAPITAL Y 1d620 - case L'𝘡': // MATHEMATICAL SANS ITALIC CAPITAL Z 1d621 - case L'𝘼': // MATHEMATICAL SANS BOLD ITALIC CAPITAL A 1d63c - case L'𝘽': // MATHEMATICAL SANS BOLD ITALIC CAPITAL B 1d63d - case L'𝘾': // MATHEMATICAL SANS BOLD ITALIC CAPITAL C 1d63e - case L'𝘿': // MATHEMATICAL SANS BOLD ITALIC CAPITAL D 1d63f - case L'𝙀': // MATHEMATICAL SANS BOLD ITALIC CAPITAL E 1d640 - case L'𝙁': // MATHEMATICAL SANS BOLD ITALIC CAPITAL F 1d641 - case L'𝙂': // MATHEMATICAL SANS BOLD ITALIC CAPITAL G 1d642 - case L'𝙃': // MATHEMATICAL SANS BOLD ITALIC CAPITAL H 1d643 - case L'𝙄': // MATHEMATICAL SANS BOLD ITALIC CAPITAL I 1d644 - case L'𝙅': // MATHEMATICAL SANS BOLD ITALIC CAPITAL J 1d645 - case L'𝙆': // MATHEMATICAL SANS BOLD ITALIC CAPITAL K 1d646 - case L'𝙇': // MATHEMATICAL SANS BOLD ITALIC CAPITAL L 1d647 - case L'𝙈': // MATHEMATICAL SANS BOLD ITALIC CAPITAL M 1d648 - case L'𝙉': // MATHEMATICAL SANS BOLD ITALIC CAPITAL N 1d649 - case L'𝙊': // MATHEMATICAL SANS BOLD ITALIC CAPITAL O 1d64a - case L'𝙋': // MATHEMATICAL SANS BOLD ITALIC CAPITAL P 1d64b - case L'𝙌': // MATHEMATICAL SANS BOLD ITALIC CAPITAL Q 1d64c - case L'𝙍': // MATHEMATICAL SANS BOLD ITALIC CAPITAL R 1d64d - case L'𝙎': // MATHEMATICAL SANS BOLD ITALIC CAPITAL S 1d64e - case L'𝙏': // MATHEMATICAL SANS BOLD ITALIC CAPITAL T 1d64f - case L'𝙐': // MATHEMATICAL SANS BOLD ITALIC CAPITAL U 1d650 - case L'𝙑': // MATHEMATICAL SANS BOLD ITALIC CAPITAL V 1d651 - case L'𝙒': // MATHEMATICAL SANS BOLD ITALIC CAPITAL W 1d652 - case L'𝙓': // MATHEMATICAL SANS BOLD ITALIC CAPITAL X 1d653 - case L'𝙔': // MATHEMATICAL SANS BOLD ITALIC CAPITAL Y 1d654 - case L'𝙕': // MATHEMATICAL SANS BOLD ITALIC CAPITAL Z 1d655 - case L'𝙰': // MATHEMATICAL MONOSPACE CAPITAL A 1d670 - case L'𝙱': // MATHEMATICAL MONOSPACE CAPITAL B 1d671 - case L'𝙲': // MATHEMATICAL MONOSPACE CAPITAL C 1d672 - case L'𝙳': // MATHEMATICAL MONOSPACE CAPITAL D 1d673 - case L'𝙴': // MATHEMATICAL MONOSPACE CAPITAL E 1d674 - case L'𝙵': // MATHEMATICAL MONOSPACE CAPITAL F 1d675 - case L'𝙶': // MATHEMATICAL MONOSPACE CAPITAL G 1d676 - case L'𝙷': // MATHEMATICAL MONOSPACE CAPITAL H 1d677 - case L'𝙸': // MATHEMATICAL MONOSPACE CAPITAL I 1d678 - case L'𝙹': // MATHEMATICAL MONOSPACE CAPITAL J 1d679 - case L'𝙺': // MATHEMATICAL MONOSPACE CAPITAL K 1d67a - case L'𝙻': // MATHEMATICAL MONOSPACE CAPITAL L 1d67b - case L'𝙼': // MATHEMATICAL MONOSPACE CAPITAL M 1d67c - case L'𝙽': // MATHEMATICAL MONOSPACE CAPITAL N 1d67d - case L'𝙾': // MATHEMATICAL MONOSPACE CAPITAL O 1d67e - case L'𝙿': // MATHEMATICAL MONOSPACE CAPITAL P 1d67f - case L'𝚀': // MATHEMATICAL MONOSPACE CAPITAL Q 1d680 - case L'𝚁': // MATHEMATICAL MONOSPACE CAPITAL R 1d681 - case L'𝚂': // MATHEMATICAL MONOSPACE CAPITAL S 1d682 - case L'𝚃': // MATHEMATICAL MONOSPACE CAPITAL T 1d683 - case L'𝚄': // MATHEMATICAL MONOSPACE CAPITAL U 1d684 - case L'𝚅': // MATHEMATICAL MONOSPACE CAPITAL V 1d685 - case L'𝚆': // MATHEMATICAL MONOSPACE CAPITAL W 1d686 - case L'𝚇': // MATHEMATICAL MONOSPACE CAPITAL X 1d687 - case L'𝚈': // MATHEMATICAL MONOSPACE CAPITAL Y 1d688 - case L'𝚉': // MATHEMATICAL MONOSPACE CAPITAL Z 1d689 - case L'𝚨': // MATHEMATICAL BOLD CAPITAL ALPHA 1d6a8 - case L'𝚩': // MATHEMATICAL BOLD CAPITAL BETA 1d6a9 - case L'𝚪': // MATHEMATICAL BOLD CAPITAL GAMMA 1d6aa - case L'𝚫': // MATHEMATICAL BOLD CAPITAL DELTA 1d6ab - case L'𝚬': // MATHEMATICAL BOLD CAPITAL EPSILON 1d6ac - case L'𝚭': // MATHEMATICAL BOLD CAPITAL ZETA 1d6ad - case L'𝚮': // MATHEMATICAL BOLD CAPITAL ETA 1d6ae - case L'𝚯': // MATHEMATICAL BOLD CAPITAL THETA 1d6af - case L'𝚰': // MATHEMATICAL BOLD CAPITAL IOTA 1d6b0 - case L'𝚱': // MATHEMATICAL BOLD CAPITAL KAPPA 1d6b1 - case L'𝚲': // MATHEMATICAL BOLD CAPITAL LAMDA 1d6b2 - case L'𝚳': // MATHEMATICAL BOLD CAPITAL MU 1d6b3 - case L'𝚴': // MATHEMATICAL BOLD CAPITAL NU 1d6b4 - case L'𝚵': // MATHEMATICAL BOLD CAPITAL XI 1d6b5 - case L'𝚶': // MATHEMATICAL BOLD CAPITAL OMICRON 1d6b6 - case L'𝚷': // MATHEMATICAL BOLD CAPITAL PI 1d6b7 - case L'𝚸': // MATHEMATICAL BOLD CAPITAL RHO 1d6b8 - case L'𝚹': // MATHEMATICAL BOLD CAPITAL THETA SYMBOL 1d6b9 - case L'𝚺': // MATHEMATICAL BOLD CAPITAL SIGMA 1d6ba - case L'𝚻': // MATHEMATICAL BOLD CAPITAL TAU 1d6bb - case L'𝚼': // MATHEMATICAL BOLD CAPITAL UPSILON 1d6bc - case L'𝚽': // MATHEMATICAL BOLD CAPITAL PHI 1d6bd - case L'𝚾': // MATHEMATICAL BOLD CAPITAL CHI 1d6be - case L'𝚿': // MATHEMATICAL BOLD CAPITAL PSI 1d6bf - case L'𝛀': // MATHEMATICAL BOLD CAPITAL OMEGA 1d6c0 - case L'𝛢': // MATHEMATICAL ITALIC CAPITAL ALPHA 1d6e2 - case L'𝛣': // MATHEMATICAL ITALIC CAPITAL BETA 1d6e3 - case L'𝛤': // MATHEMATICAL ITALIC CAPITAL GAMMA 1d6e4 - case L'𝛥': // MATHEMATICAL ITALIC CAPITAL DELTA 1d6e5 - case L'𝛦': // MATHEMATICAL ITALIC CAPITAL EPSILON 1d6e6 - case L'𝛧': // MATHEMATICAL ITALIC CAPITAL ZETA 1d6e7 - case L'𝛨': // MATHEMATICAL ITALIC CAPITAL ETA 1d6e8 - case L'𝛩': // MATHEMATICAL ITALIC CAPITAL THETA 1d6e9 - case L'𝛪': // MATHEMATICAL ITALIC CAPITAL IOTA 1d6ea - case L'𝛫': // MATHEMATICAL ITALIC CAPITAL KAPPA 1d6eb - case L'𝛬': // MATHEMATICAL ITALIC CAPITAL LAMDA 1d6ec - case L'𝛭': // MATHEMATICAL ITALIC CAPITAL MU 1d6ed - case L'𝛮': // MATHEMATICAL ITALIC CAPITAL NU 1d6ee - case L'𝛯': // MATHEMATICAL ITALIC CAPITAL XI 1d6ef - case L'𝛰': // MATHEMATICAL ITALIC CAPITAL OMICRON 1d6f0 - case L'𝛱': // MATHEMATICAL ITALIC CAPITAL PI 1d6f1 - case L'𝛲': // MATHEMATICAL ITALIC CAPITAL RHO 1d6f2 - case L'𝛳': // MATHEMATICAL ITALIC CAPITAL THETA SYMBOL 1d6f3 - case L'𝛴': // MATHEMATICAL ITALIC CAPITAL SIGMA 1d6f4 - case L'𝛵': // MATHEMATICAL ITALIC CAPITAL TAU 1d6f5 - case L'𝛶': // MATHEMATICAL ITALIC CAPITAL UPSILON 1d6f6 - case L'𝛷': // MATHEMATICAL ITALIC CAPITAL PHI 1d6f7 - case L'𝛸': // MATHEMATICAL ITALIC CAPITAL CHI 1d6f8 - case L'𝛹': // MATHEMATICAL ITALIC CAPITAL PSI 1d6f9 - case L'𝛺': // MATHEMATICAL ITALIC CAPITAL OMEGA 1d6fa - case L'𝜜': // MATHEMATICAL BOLD ITALIC CAPITAL ALPHA 1d71c - case L'𝜝': // MATHEMATICAL BOLD ITALIC CAPITAL BETA 1d71d - case L'𝜞': // MATHEMATICAL BOLD ITALIC CAPITAL GAMMA 1d71e - case L'𝜟': // MATHEMATICAL BOLD ITALIC CAPITAL DELTA 1d71f - case L'𝜠': // MATHEMATICAL BOLD ITALIC CAPITAL EPSILON 1d720 - case L'𝜡': // MATHEMATICAL BOLD ITALIC CAPITAL ZETA 1d721 - case L'𝜢': // MATHEMATICAL BOLD ITALIC CAPITAL ETA 1d722 - case L'𝜣': // MATHEMATICAL BOLD ITALIC CAPITAL THETA 1d723 - case L'𝜤': // MATHEMATICAL BOLD ITALIC CAPITAL IOTA 1d724 - case L'𝜥': // MATHEMATICAL BOLD ITALIC CAPITAL KAPPA 1d725 - case L'𝜦': // MATHEMATICAL BOLD ITALIC CAPITAL LAMDA 1d726 - case L'𝜧': // MATHEMATICAL BOLD ITALIC CAPITAL MU 1d727 - case L'𝜨': // MATHEMATICAL BOLD ITALIC CAPITAL NU 1d728 - case L'𝜩': // MATHEMATICAL BOLD ITALIC CAPITAL XI 1d729 - case L'𝜪': // MATHEMATICAL BOLD ITALIC CAPITAL OMICRON 1d72a - case L'𝜫': // MATHEMATICAL BOLD ITALIC CAPITAL PI 1d72b - case L'𝜬': // MATHEMATICAL BOLD ITALIC CAPITAL RHO 1d72c - case L'𝜭': // MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL 1d72d - case L'𝜮': // MATHEMATICAL BOLD ITALIC CAPITAL SIGMA 1d72e - case L'𝜯': // MATHEMATICAL BOLD ITALIC CAPITAL TAU 1d72f - case L'𝜰': // MATHEMATICAL BOLD ITALIC CAPITAL UPSILON 1d730 - case L'𝜱': // MATHEMATICAL BOLD ITALIC CAPITAL PHI 1d731 - case L'𝜲': // MATHEMATICAL BOLD ITALIC CAPITAL CHI 1d732 - case L'𝜳': // MATHEMATICAL BOLD ITALIC CAPITAL PSI 1d733 - case L'𝜴': // MATHEMATICAL BOLD ITALIC CAPITAL OMEGA 1d734 - case L'𝝖': // MATHEMATICAL SANS BOLD CAPITAL ALPHA 1d756 - case L'𝝗': // MATHEMATICAL SANS BOLD CAPITAL BETA 1d757 - case L'𝝘': // MATHEMATICAL SANS BOLD CAPITAL GAMMA 1d758 - case L'𝝙': // MATHEMATICAL SANS BOLD CAPITAL DELTA 1d759 - case L'𝝚': // MATHEMATICAL SANS BOLD CAPITAL EPSILON 1d75a - case L'𝝛': // MATHEMATICAL SANS BOLD CAPITAL ZETA 1d75b - case L'𝝜': // MATHEMATICAL SANS BOLD CAPITAL ETA 1d75c - case L'𝝝': // MATHEMATICAL SANS BOLD CAPITAL THETA 1d75d - case L'𝝞': // MATHEMATICAL SANS BOLD CAPITAL IOTA 1d75e - case L'𝝟': // MATHEMATICAL SANS BOLD CAPITAL KAPPA 1d75f - case L'𝝠': // MATHEMATICAL SANS BOLD CAPITAL LAMDA 1d760 - case L'𝝡': // MATHEMATICAL SANS BOLD CAPITAL MU 1d761 - case L'𝝢': // MATHEMATICAL SANS BOLD CAPITAL NU 1d762 - case L'𝝣': // MATHEMATICAL SANS BOLD CAPITAL XI 1d763 - case L'𝝤': // MATHEMATICAL SANS BOLD CAPITAL OMICRON 1d764 - case L'𝝥': // MATHEMATICAL SANS BOLD CAPITAL PI 1d765 - case L'𝝦': // MATHEMATICAL SANS BOLD CAPITAL RHO 1d766 - case L'𝝧': // MATHEMATICAL SANS BOLD CAPITAL THETA SYMBOL 1d767 - case L'𝝨': // MATHEMATICAL SANS BOLD CAPITAL SIGMA 1d768 - case L'𝝩': // MATHEMATICAL SANS BOLD CAPITAL TAU 1d769 - case L'𝝪': // MATHEMATICAL SANS BOLD CAPITAL UPSILON 1d76a - case L'𝝫': // MATHEMATICAL SANS BOLD CAPITAL PHI 1d76b - case L'𝝬': // MATHEMATICAL SANS BOLD CAPITAL CHI 1d76c - case L'𝝭': // MATHEMATICAL SANS BOLD CAPITAL PSI 1d76d - case L'𝝮': // MATHEMATICAL SANS BOLD CAPITAL OMEGA 1d76e - case L'𝞐': // MATHEMATICAL SANS BOLD ITALIC CAPITAL ALPHA 1d790 - case L'𝞑': // MATHEMATICAL SANS BOLD ITALIC CAPITAL BETA 1d791 - case L'𝞒': // MATHEMATICAL SANS BOLD ITALIC CAPITAL GAMMA 1d792 - case L'𝞓': // MATHEMATICAL SANS BOLD ITALIC CAPITAL DELTA 1d793 - case L'𝞔': // MATHEMATICAL SANS BOLD ITALIC CAPITAL EPSILON 1d794 - case L'𝞕': // MATHEMATICAL SANS BOLD ITALIC CAPITAL ZETA 1d795 - case L'𝞖': // MATHEMATICAL SANS BOLD ITALIC CAPITAL ETA 1d796 - case L'𝞗': // MATHEMATICAL SANS BOLD ITALIC CAPITAL THETA 1d797 - case L'𝞘': // MATHEMATICAL SANS BOLD ITALIC CAPITAL IOTA 1d798 - case L'𝞙': // MATHEMATICAL SANS BOLD ITALIC CAPITAL KAPPA 1d799 - case L'𝞚': // MATHEMATICAL SANS BOLD ITALIC CAPITAL LAMDA 1d79a - case L'𝞛': // MATHEMATICAL SANS BOLD ITALIC CAPITAL MU 1d79b - case L'𝞜': // MATHEMATICAL SANS BOLD ITALIC CAPITAL NU 1d79c - case L'𝞝': // MATHEMATICAL SANS BOLD ITALIC CAPITAL XI 1d79d - case L'𝞞': // MATHEMATICAL SANS BOLD ITALIC CAPITAL OMICRON 1d79e - case L'𝞟': // MATHEMATICAL SANS BOLD ITALIC CAPITAL PI 1d79f - case L'𝞠': // MATHEMATICAL SANS BOLD ITALIC CAPITAL RHO 1d7a0 - case L'𝞡': // MATHEMATICAL SANS BOLD ITALIC CAPITAL THETA SYMBOL 1d7a1 - case L'𝞢': // MATHEMATICAL SANS BOLD ITALIC CAPITAL SIGMA 1d7a2 - case L'𝞣': // MATHEMATICAL SANS BOLD ITALIC CAPITAL TAU 1d7a3 - case L'𝞤': // MATHEMATICAL SANS BOLD ITALIC CAPITAL UPSILON 1d7a4 - case L'𝞥': // MATHEMATICAL SANS BOLD ITALIC CAPITAL PHI 1d7a5 - case L'𝞦': // MATHEMATICAL SANS BOLD ITALIC CAPITAL CHI 1d7a6 - case L'𝞧': // MATHEMATICAL SANS BOLD ITALIC CAPITAL PSI 1d7a7 - case L'𝞨': // MATHEMATICAL SANS BOLD ITALIC CAPITAL OMEGA 1d7a8 - case L'𝟊': // MATHEMATICAL BOLD CAPITAL DIGAMMA 1d7ca - case L'𞤀': // ADLAM CAPITAL ALIF 1e900 - case L'𞤁': // ADLAM CAPITAL DAALI 1e901 - case L'𞤂': // ADLAM CAPITAL LAAM 1e902 - case L'𞤃': // ADLAM CAPITAL MIIM 1e903 - case L'𞤄': // ADLAM CAPITAL BA 1e904 - case L'𞤅': // ADLAM CAPITAL SINNYIIYHE 1e905 - case L'𞤆': // ADLAM CAPITAL PE 1e906 - case L'𞤇': // ADLAM CAPITAL BHE 1e907 - case L'𞤈': // ADLAM CAPITAL RA 1e908 - case L'𞤉': // ADLAM CAPITAL E 1e909 - case L'𞤊': // ADLAM CAPITAL FA 1e90a - case L'𞤋': // ADLAM CAPITAL I 1e90b - case L'𞤌': // ADLAM CAPITAL O 1e90c - case L'𞤍': // ADLAM CAPITAL DHA 1e90d - case L'𞤎': // ADLAM CAPITAL YHE 1e90e - case L'𞤏': // ADLAM CAPITAL WAW 1e90f - case L'𞤐': // ADLAM CAPITAL NUN 1e910 - case L'𞤑': // ADLAM CAPITAL KAF 1e911 - case L'𞤒': // ADLAM CAPITAL YA 1e912 - case L'𞤓': // ADLAM CAPITAL U 1e913 - case L'𞤔': // ADLAM CAPITAL JIIM 1e914 - case L'𞤕': // ADLAM CAPITAL CHI 1e915 - case L'𞤖': // ADLAM CAPITAL HA 1e916 - case L'𞤗': // ADLAM CAPITAL QAAF 1e917 - case L'𞤘': // ADLAM CAPITAL GA 1e918 - case L'𞤙': // ADLAM CAPITAL NYA 1e919 - case L'𞤚': // ADLAM CAPITAL TU 1e91a - case L'𞤛': // ADLAM CAPITAL NHA 1e91b - case L'𞤜': // ADLAM CAPITAL VA 1e91c - case L'𞤝': // ADLAM CAPITAL KHA 1e91d - case L'𞤞': // ADLAM CAPITAL GBE 1e91e - case L'𞤟': // ADLAM CAPITAL ZAL 1e91f - case L'𞤠': // ADLAM CAPITAL KPO 1e920 - case L'𞤡': // ADLAM CAPITAL SHA 1e921 - return 1; - default: - return 0; + int r; + if (c < 0200) { + return 'A' <= c && c <= 'Z'; + } else { + if (towlower(c) != c) return 1; + switch (c) { + case 0x03d2: /* ϒ Greek */ + case 0x03d3: /* ϓ Greek */ + case 0x03d4: /* ϔ Greek */ + case 0x2102: /* ℂ Letterlike */ + case 0x2107: /* ℇ Letterlike */ + case 0x210b: /* ℋ Letterlike */ + case 0x210c: /* ℌ Letterlike */ + case 0x210d: /* ℍ Letterlike */ + case 0x2110: /* ℐ Letterlike */ + case 0x2111: /* ℑ Letterlike */ + case 0x2112: /* ℒ Letterlike */ + case 0x2115: /* ℕ Letterlike */ + case 0x2119: /* ℙ Letterlike */ + case 0x211a: /* ℚ Letterlike */ + case 0x211b: /* ℛ Letterlike */ + case 0x211c: /* ℜ Letterlike */ + case 0x211d: /* ℝ Letterlike */ + case 0x2124: /* ℤ Letterlike */ + case 0x2128: /* ℨ Letterlike */ + case 0x212c: /* ℬ Letterlike */ + case 0x212d: /* ℭ Letterlike */ + case 0x2130: /* ℰ Letterlike */ + case 0x2131: /* ℱ Letterlike */ + case 0x2133: /* ℳ Letterlike */ + case 0x213e: /* ℾ Letterlike */ + case 0x213f: /* ℿ Letterlike */ + case 0x2145: /* ⅅ Letterlike */ + case 0x1d434: /* 𝐴 Math */ + case 0x1d435: /* 𝐵 Math */ + case 0x1d436: /* 𝐶 Math */ + case 0x1d437: /* 𝐷 Math */ + case 0x1d438: /* 𝐸 Math */ + case 0x1d439: /* 𝐹 Math */ + case 0x1d43a: /* 𝐺 Math */ + case 0x1d43b: /* 𝐻 Math */ + case 0x1d49c: /* 𝒜 Math */ + case 0x1d49e: /* 𝒞 Math */ + case 0x1d49f: /* 𝒟 Math */ + case 0x1d4a2: /* 𝒢 Math */ + case 0x1d4a5: /* 𝒥 Math */ + case 0x1d4a6: /* 𝒦 Math */ + case 0x1d4a9: /* 𝒩 Math */ + case 0x1d4aa: /* 𝒪 Math */ + case 0x1d4ab: /* 𝒫 Math */ + case 0x1d4ac: /* 𝒬 Math */ + case 0x1d504: /* 𝔄 Math */ + case 0x1d505: /* 𝔅 Math */ + case 0x1d507: /* 𝔇 Math */ + case 0x1d508: /* 𝔈 Math */ + case 0x1d509: /* 𝔉 Math */ + case 0x1d50a: /* 𝔊 Math */ + case 0x1d516: /* 𝔖 Math */ + case 0x1d517: /* 𝔗 Math */ + case 0x1d518: /* 𝔘 Math */ + case 0x1d519: /* 𝔙 Math */ + case 0x1d51a: /* 𝔚 Math */ + case 0x1d51b: /* 𝔛 Math */ + case 0x1d51c: /* 𝔜 Math */ + case 0x1d538: /* 𝔸 Math */ + case 0x1d539: /* 𝔹 Math */ + case 0x1d53b: /* 𝔻 Math */ + case 0x1d53c: /* 𝔼 Math */ + case 0x1d53d: /* 𝔽 Math */ + case 0x1d53e: /* 𝔾 Math */ + case 0x1d540: /* 𝕀 Math */ + case 0x1d541: /* 𝕁 Math */ + case 0x1d542: /* 𝕂 Math */ + case 0x1d543: /* 𝕃 Math */ + case 0x1d544: /* 𝕄 Math */ + case 0x1d546: /* 𝕆 Math */ + case 0x1d54a: /* 𝕊 Math */ + case 0x1d54b: /* 𝕋 Math */ + case 0x1d54c: /* 𝕌 Math */ + case 0x1d54d: /* 𝕍 Math */ + case 0x1d54e: /* 𝕎 Math */ + case 0x1d54f: /* 𝕏 Math */ + case 0x1d550: /* 𝕐 Math */ + case 0x1d6e3: /* 𝛣 Math */ + case 0x1d6e4: /* 𝛤 Math */ + case 0x1d6e5: /* 𝛥 Math */ + case 0x1d6e6: /* 𝛦 Math */ + case 0x1d6e7: /* 𝛧 Math */ + case 0x1d6e8: /* 𝛨 Math */ + case 0x1d6e9: /* 𝛩 Math */ + case 0x1d6ea: /* 𝛪 Math */ + case 0x1d6eb: /* 𝛫 Math */ + case 0x1d6ec: /* 𝛬 Math */ + case 0x1d6ed: /* 𝛭 Math */ + case 0x1d6ee: /* 𝛮 Math */ + case 0x1d6ef: /* 𝛯 Math */ + case 0x1d6f0: /* 𝛰 Math */ + case 0x1d6f1: /* 𝛱 Math */ + case 0x1d6f2: /* 𝛲 Math */ + case 0x1d6f3: /* 𝛳 Math */ + case 0x1d6f4: /* 𝛴 Math */ + case 0x1d6f5: /* 𝛵 Math */ + case 0x1d6f6: /* 𝛶 Math */ + case 0x1d6f7: /* 𝛷 Math */ + case 0x1d6f8: /* 𝛸 Math */ + case 0x1d6f9: /* 𝛹 Math */ + case 0x1d6fa: /* 𝛺 Math */ + case 0x1d72d: /* 𝜭 Math */ + case 0x1d72e: /* 𝜮 Math */ + case 0x1d72f: /* 𝜯 Math */ + case 0x1d730: /* 𝜰 Math */ + case 0x1d731: /* 𝜱 Math */ + case 0x1d732: /* 𝜲 Math */ + case 0x1d733: /* 𝜳 Math */ + case 0x1d734: /* 𝜴 Math */ + case 0x1d767: /* 𝝧 Math */ + case 0x1d768: /* 𝝨 Math */ + case 0x1d769: /* 𝝩 Math */ + case 0x1d76a: /* 𝝪 Math */ + case 0x1d76b: /* 𝝫 Math */ + case 0x1d76c: /* 𝝬 Math */ + case 0x1d76d: /* 𝝭 Math */ + case 0x1d76e: /* 𝝮 Math */ + case 0x1d7a1: /* 𝞡 Math */ + case 0x1d7a2: /* 𝞢 Math */ + case 0x1d7a3: /* 𝞣 Math */ + case 0x1d7a4: /* 𝞤 Math */ + case 0x1d7a5: /* 𝞥 Math */ + case 0x1d7a6: /* 𝞦 Math */ + case 0x1d7a7: /* 𝞧 Math */ + case 0x1d7a8: /* 𝞨 Math */ + case 0x1d7ca: /* 𝟊 Math */ + return 1; + default: + return 0; + } } } diff --git a/libc/str/str.h b/libc/str/str.h index 2809e8556..a1e21788f 100644 --- a/libc/str/str.h +++ b/libc/str/str.h @@ -73,6 +73,7 @@ int iswupper(wint_t); int iswxdigit(wint_t); int iswpunct(wint_t); int iswprint(wint_t); +int iswseparator(wint_t); wint_t towlower(wint_t); wint_t towupper(wint_t); diff --git a/libc/str/str.mk b/libc/str/str.mk index c59be2fb9..761c8d061 100644 --- a/libc/str/str.mk +++ b/libc/str/str.mk @@ -52,8 +52,6 @@ o//libc/str/bzero.o: \ OVERRIDE_CFLAGS += \ -O2 -o/$(MODE)/libc/str/fun3.o \ -o/$(MODE)/libc/str/sha3.o \ o/$(MODE)/libc/str/dosdatetimetounix.o: \ OVERRIDE_CFLAGS += \ -O3 @@ -76,7 +74,8 @@ o/$(MODE)/libc/str/getzipcfiletimestamps.o: \ o/$(MODE)/libc/str/iswpunct.o \ o/$(MODE)/libc/str/iswupper.o \ -o/$(MODE)/libc/str/iswlower.o: \ +o/$(MODE)/libc/str/iswlower.o \ +o/$(MODE)/libc/str/iswseparator.o: \ OVERRIDE_CFLAGS += \ -fno-jump-tables diff --git a/libc/str/towlower.c b/libc/str/towlower.c index 848f3b4c7..4b4c0ac94 100644 --- a/libc/str/towlower.c +++ b/libc/str/towlower.c @@ -16,1616 +16,161 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dce.h" #include "libc/macros.internal.h" #include "libc/str/str.h" -#include "libc/dce.h" +/* clang-format off */ -static const char16_t kUpperToLower[][2] = { - {u'À', u'à'}, // 00c0 → 00e0 - {u'Á', u'á'}, // 00c1 → 00e1 - {u'Â', u'â'}, // 00c2 → 00e2 - {u'Ã', u'ã'}, // 00c3 → 00e3 - {u'Ä', u'ä'}, // 00c4 → 00e4 - {u'Å', u'å'}, // 00c5 → 00e5 - {u'Æ', u'æ'}, // 00c6 → 00e6 - {u'Ç', u'ç'}, // 00c7 → 00e7 - {u'È', u'è'}, // 00c8 → 00e8 - {u'É', u'é'}, // 00c9 → 00e9 - {u'Ê', u'ê'}, // 00ca → 00ea - {u'Ë', u'ë'}, // 00cb → 00eb - {u'Ì', u'ì'}, // 00cc → 00ec - {u'Í', u'í'}, // 00cd → 00ed - {u'Î', u'î'}, // 00ce → 00ee - {u'Ï', u'ï'}, // 00cf → 00ef - {u'Ð', u'ð'}, // 00d0 → 00f0 - {u'Ñ', u'ñ'}, // 00d1 → 00f1 - {u'Ò', u'ò'}, // 00d2 → 00f2 - {u'Ó', u'ó'}, // 00d3 → 00f3 - {u'Ô', u'ô'}, // 00d4 → 00f4 - {u'Õ', u'õ'}, // 00d5 → 00f5 - {u'Ö', u'ö'}, // 00d6 → 00f6 - {u'Ø', u'ø'}, // 00d8 → 00f8 - {u'Ù', u'ù'}, // 00d9 → 00f9 - {u'Ú', u'ú'}, // 00da → 00fa - {u'Û', u'û'}, // 00db → 00fb - {u'Ü', u'ü'}, // 00dc → 00fc - {u'Ý', u'ý'}, // 00dd → 00fd - {u'Þ', u'þ'}, // 00de → 00fe -#ifndef TINY - {u'Ā', u'ā'}, // 0100 → 0101 - {u'Ă', u'ă'}, // 0102 → 0103 - {u'Ą', u'ą'}, // 0104 → 0105 - {u'Ć', u'ć'}, // 0106 → 0107 - {u'Ĉ', u'ĉ'}, // 0108 → 0109 - {u'Ċ', u'ċ'}, // 010a → 010b - {u'Č', u'č'}, // 010c → 010d - {u'Ď', u'ď'}, // 010e → 010f - {u'Đ', u'đ'}, // 0110 → 0111 - {u'Ē', u'ē'}, // 0112 → 0113 - {u'Ĕ', u'ĕ'}, // 0114 → 0115 - {u'Ė', u'ė'}, // 0116 → 0117 - {u'Ę', u'ę'}, // 0118 → 0119 - {u'Ě', u'ě'}, // 011a → 011b - {u'Ĝ', u'ĝ'}, // 011c → 011d - {u'Ğ', u'ğ'}, // 011e → 011f - {u'Ġ', u'ġ'}, // 0120 → 0121 - {u'Ģ', u'ģ'}, // 0122 → 0123 - {u'Ĥ', u'ĥ'}, // 0124 → 0125 - {u'Ħ', u'ħ'}, // 0126 → 0127 - {u'Ĩ', u'ĩ'}, // 0128 → 0129 - {u'Ī', u'ī'}, // 012a → 012b - {u'Ĭ', u'ĭ'}, // 012c → 012d - {u'Į', u'į'}, // 012e → 012f - {u'IJ', u'ij'}, // 0132 → 0133 - {u'Ĵ', u'ĵ'}, // 0134 → 0135 - {u'Ķ', u'ķ'}, // 0136 → 0137 - {u'Ĺ', u'ĺ'}, // 0139 → 013a - {u'Ļ', u'ļ'}, // 013b → 013c - {u'Ľ', u'ľ'}, // 013d → 013e - {u'Ŀ', u'ŀ'}, // 013f → 0140 - {u'Ł', u'ł'}, // 0141 → 0142 - {u'Ń', u'ń'}, // 0143 → 0144 - {u'Ņ', u'ņ'}, // 0145 → 0146 - {u'Ň', u'ň'}, // 0147 → 0148 - {u'Ŋ', u'ŋ'}, // 014a → 014b - {u'Ō', u'ō'}, // 014c → 014d - {u'Ŏ', u'ŏ'}, // 014e → 014f - {u'Ő', u'ő'}, // 0150 → 0151 - {u'Œ', u'œ'}, // 0152 → 0153 - {u'Ŕ', u'ŕ'}, // 0154 → 0155 - {u'Ŗ', u'ŗ'}, // 0156 → 0157 - {u'Ř', u'ř'}, // 0158 → 0159 - {u'Ś', u'ś'}, // 015a → 015b - {u'Ŝ', u'ŝ'}, // 015c → 015d - {u'Ş', u'ş'}, // 015e → 015f - {u'Š', u'š'}, // 0160 → 0161 - {u'Ţ', u'ţ'}, // 0162 → 0163 - {u'Ť', u'ť'}, // 0164 → 0165 - {u'Ŧ', u'ŧ'}, // 0166 → 0167 - {u'Ũ', u'ũ'}, // 0168 → 0169 - {u'Ū', u'ū'}, // 016a → 016b - {u'Ŭ', u'ŭ'}, // 016c → 016d - {u'Ů', u'ů'}, // 016e → 016f - {u'Ű', u'ű'}, // 0170 → 0171 - {u'Ų', u'ų'}, // 0172 → 0173 - {u'Ŵ', u'ŵ'}, // 0174 → 0175 - {u'Ŷ', u'ŷ'}, // 0176 → 0177 - {u'Ÿ', u'ÿ'}, // 0178 → 00ff - {u'Ź', u'ź'}, // 0179 → 017a - {u'Ż', u'ż'}, // 017b → 017c - {u'Ž', u'ž'}, // 017d → 017e - {u'Ɓ', u'ɓ'}, // 0181 → 0253 - {u'Ƃ', u'ƃ'}, // 0182 → 0183 - {u'Ƅ', u'ƅ'}, // 0184 → 0185 - {u'Ɔ', u'ɔ'}, // 0186 → 0254 - {u'Ƈ', u'ƈ'}, // 0187 → 0188 - {u'Ɗ', u'ɗ'}, // 018a → 0257 - {u'Ƌ', u'ƌ'}, // 018b → 018c - {u'Ǝ', u'ɘ'}, // 018e → 0258 - {u'Ə', u'ə'}, // 018f → 0259 - {u'Ɛ', u'ɛ'}, // 0190 → 025b - {u'Ƒ', u'ƒ'}, // 0191 → 0192 - {u'Ɠ', u'ɠ'}, // 0193 → 0260 - {u'Ɣ', u'ɣ'}, // 0194 → 0263 - {u'Ɩ', u'ɩ'}, // 0196 → 0269 - {u'Ɨ', u'ɨ'}, // 0197 → 0268 - {u'Ƙ', u'ƙ'}, // 0198 → 0199 - {u'Ɯ', u'ɯ'}, // 019c → 026f - {u'Ɲ', u'ɲ'}, // 019d → 0272 - {u'Ơ', u'ơ'}, // 01a0 → 01a1 - {u'Ƣ', u'ƣ'}, // 01a2 → 01a3 - {u'Ƥ', u'ƥ'}, // 01a4 → 01a5 - {u'Ƨ', u'ƨ'}, // 01a7 → 01a8 - {u'Ʃ', u'ʃ'}, // 01a9 → 0283 - {u'Ƭ', u'ƭ'}, // 01ac → 01ad - {u'Ʈ', u'ʈ'}, // 01ae → 0288 - {u'Ư', u'ư'}, // 01af → 01b0 - {u'Ʊ', u'ʊ'}, // 01b1 → 028a - {u'Ʋ', u'ʋ'}, // 01b2 → 028b - {u'Ƴ', u'ƴ'}, // 01b3 → 01b4 - {u'Ƶ', u'ƶ'}, // 01b5 → 01b6 - {u'Ʒ', u'ƹ'}, // 01b7 → 01b9 - {u'Ƹ', u'ƹ'}, // 01b8 → 01b9 - {u'Ƽ', u'ƽ'}, // 01bc → 01bd - {u'DŽ', u'dž'}, // 01c4 → 01c6 - {u'LJ', u'lj'}, // 01c7 → 01c9 - {u'NJ', u'nj'}, // 01ca → 01cc - {u'Ǎ', u'ǎ'}, // 01cd → 01ce - {u'Ǐ', u'ǐ'}, // 01cf → 01d0 - {u'Ǒ', u'ǒ'}, // 01d1 → 01d2 - {u'Ǔ', u'ǔ'}, // 01d3 → 01d4 - {u'Ǖ', u'ǖ'}, // 01d5 → 01d6 - {u'Ǘ', u'ǘ'}, // 01d7 → 01d8 - {u'Ǚ', u'ǚ'}, // 01d9 → 01da - {u'Ǜ', u'ǜ'}, // 01db → 01dc - {u'Ǟ', u'ǟ'}, // 01de → 01df - {u'Ǡ', u'ǡ'}, // 01e0 → 01e1 - {u'Ǣ', u'ǣ'}, // 01e2 → 01e3 - {u'Ǥ', u'ǥ'}, // 01e4 → 01e5 - {u'Ǧ', u'ǧ'}, // 01e6 → 01e7 - {u'Ǩ', u'ǩ'}, // 01e8 → 01e9 - {u'Ǫ', u'ǫ'}, // 01ea → 01eb - {u'Ǭ', u'ǭ'}, // 01ec → 01ed - {u'Ǯ', u'ǯ'}, // 01ee → 01ef - {u'DZ', u'dž'}, // 01f1 → 01c6 - {u'Ǵ', u'ǵ'}, // 01f4 → 01f5 - {u'Ǹ', u'ǹ'}, // 01f8 → 01f9 - {u'Ǻ', u'ǻ'}, // 01fa → 01fb - {u'Ǽ', u'ǽ'}, // 01fc → 01fd - {u'Ǿ', u'ǿ'}, // 01fe → 01ff - {u'Ȁ', u'ȁ'}, // 0200 → 0201 - {u'Ȃ', u'ȃ'}, // 0202 → 0203 - {u'Ȅ', u'ȅ'}, // 0204 → 0205 - {u'Ȇ', u'ȇ'}, // 0206 → 0207 - {u'Ȉ', u'ȉ'}, // 0208 → 0209 - {u'Ȋ', u'ȋ'}, // 020a → 020b - {u'Ȍ', u'ȍ'}, // 020c → 020d - {u'Ȏ', u'ȏ'}, // 020e → 020f - {u'Ȑ', u'ȑ'}, // 0210 → 0211 - {u'Ȓ', u'ȓ'}, // 0212 → 0213 - {u'Ȕ', u'ȕ'}, // 0214 → 0215 - {u'Ȗ', u'ȗ'}, // 0216 → 0217 - {u'Ș', u'ș'}, // 0218 → 0219 - {u'Ț', u'ț'}, // 021a → 021b - {u'Ȝ', u'ȝ'}, // 021c → 021d - {u'Ȟ', u'ȟ'}, // 021e → 021f - {u'Ƞ', u'ƞ'}, // 0220 → 019e - {u'Ȣ', u'ȣ'}, // 0222 → 0223 - {u'Ȥ', u'ȥ'}, // 0224 → 0225 - {u'Ȧ', u'ǡ'}, // 0226 → 01e1 - {u'Ȩ', u'ȩ'}, // 0228 → 0229 - {u'Ȫ', u'ȫ'}, // 022a → 022b - {u'Ȭ', u'ȭ'}, // 022c → 022d - {u'Ȯ', u'ȯ'}, // 022e → 022f - {u'Ȱ', u'ȱ'}, // 0230 → 0231 - {u'Ȳ', u'ȳ'}, // 0232 → 0233 - {u'Ⱥ', u'ⱥ'}, // 023a → 2c65 - {u'Ȼ', u'ȼ'}, // 023b → 023c - {u'Ƚ', u'ƚ'}, // 023d → 019a - {u'Ⱦ', u'ⱦ'}, // 023e → 2c66 - {u'Ɂ', u'ɂ'}, // 0241 → 0242 - {u'Ƀ', u'ƀ'}, // 0243 → 0180 - {u'Ʉ', u'ʉ'}, // 0244 → 0289 - {u'Ʌ', u'ʌ'}, // 0245 → 028c - {u'Ɇ', u'ɇ'}, // 0246 → 0247 - {u'Ɉ', u'ɉ'}, // 0248 → 0249 - {u'Ɍ', u'ɍ'}, // 024c → 024d - {u'Ɏ', u'ɏ'}, // 024e → 024f - {u'Ͱ', u'ͱ'}, // 0370 → 0371 - {u'Ͳ', u'ͳ'}, // 0372 → 0373 - {u'Ͷ', u'ͷ'}, // 0376 → 0377 - {u'Ά', u'ά'}, // 0386 → 03ac - {u'Έ', u'έ'}, // 0388 → 03ad - {u'Ή', u'ή'}, // 0389 → 03ae - {u'Ί', u'ί'}, // 038a → 03af - {u'Ό', u'ό'}, // 038c → 03cc - {u'Ύ', u'ύ'}, // 038e → 03cd - {u'Ώ', u'ώ'}, // 038f → 03ce - {u'Α', u'ά'}, // 0391 → 03ac - {u'Β', u'β'}, // 0392 → 03b2 - {u'Γ', u'γ'}, // 0393 → 03b3 - {u'Δ', u'δ'}, // 0394 → 03b4 - {u'Ε', u'έ'}, // 0395 → 03ad - {u'Ζ', u'ζ'}, // 0396 → 03b6 - {u'Η', u'ή'}, // 0397 → 03ae - {u'Θ', u'θ'}, // 0398 → 03b8 - {u'Ι', u'ΐ'}, // 0399 → 0390 - {u'Κ', u'κ'}, // 039a → 03ba - {u'Λ', u'λ'}, // 039b → 03bb - {u'Μ', u'μ'}, // 039c → 03bc - {u'Ν', u'ν'}, // 039d → 03bd - {u'Ξ', u'ξ'}, // 039e → 03be - {u'Ο', u'ο'}, // 039f → 03bf - {u'Π', u'π'}, // 03a0 → 03c0 - {u'Ρ', u'ρ'}, // 03a1 → 03c1 - {u'Σ', u'σ'}, // 03a3 → 03c3 - {u'Τ', u'τ'}, // 03a4 → 03c4 - {u'Υ', u'ΰ'}, // 03a5 → 03b0 - {u'Φ', u'φ'}, // 03a6 → 03c6 - {u'Χ', u'χ'}, // 03a7 → 03c7 - {u'Ψ', u'ψ'}, // 03a8 → 03c8 - {u'Ω', u'ω'}, // 03a9 → 03c9 - {u'Ϊ', u'ΐ'}, // 03aa → 0390 - {u'Ϋ', u'ΰ'}, // 03ab → 03b0 - {u'Ϣ', u'ϣ'}, // 03e2 → 03e3 - {u'Ϥ', u'ϥ'}, // 03e4 → 03e5 - {u'Ϧ', u'ϧ'}, // 03e6 → 03e7 - {u'Ϩ', u'ϩ'}, // 03e8 → 03e9 - {u'Ϫ', u'ϫ'}, // 03ea → 03eb - {u'Ϭ', u'ϭ'}, // 03ec → 03ed - {u'Ϯ', u'ϯ'}, // 03ee → 03ef - {u'Ϸ', u'ϸ'}, // 03f7 → 03f8 - {u'Ϻ', u'ϻ'}, // 03fa → 03fb - {u'Ͻ', u'ͻ'}, // 03fd → 037b - {u'Ͼ', u'ͼ'}, // 03fe → 037c - {u'Ͽ', u'ͽ'}, // 03ff → 037d - {u'Ѐ', u'ѐ'}, // 0400 → 0450 - {u'Ё', u'ё'}, // 0401 → 0451 - {u'Ђ', u'ђ'}, // 0402 → 0452 - {u'Ѓ', u'ѓ'}, // 0403 → 0453 - {u'Є', u'є'}, // 0404 → 0454 - {u'Ѕ', u'ѕ'}, // 0405 → 0455 - {u'І', u'і'}, // 0406 → 0456 - {u'Ї', u'ї'}, // 0407 → 0457 - {u'Ј', u'ј'}, // 0408 → 0458 - {u'Љ', u'љ'}, // 0409 → 0459 - {u'Њ', u'њ'}, // 040a → 045a - {u'Ћ', u'ћ'}, // 040b → 045b - {u'Ќ', u'ќ'}, // 040c → 045c - {u'Ѝ', u'ѝ'}, // 040d → 045d - {u'Ў', u'ў'}, // 040e → 045e - {u'Џ', u'џ'}, // 040f → 045f - {u'А', u'а'}, // 0410 → 0430 - {u'Б', u'б'}, // 0411 → 0431 - {u'В', u'в'}, // 0412 → 0432 - {u'Г', u'г'}, // 0413 → 0433 - {u'Д', u'д'}, // 0414 → 0434 - {u'Е', u'е'}, // 0415 → 0435 - {u'Ж', u'ж'}, // 0416 → 0436 - {u'З', u'з'}, // 0417 → 0437 - {u'И', u'е'}, // 0418 → 0435 - {u'Й', u'й'}, // 0419 → 0439 - {u'К', u'к'}, // 041a → 043a - {u'Л', u'л'}, // 041b → 043b - {u'М', u'м'}, // 041c → 043c - {u'Н', u'н'}, // 041d → 043d - {u'О', u'о'}, // 041e → 043e - {u'П', u'п'}, // 041f → 043f - {u'Р', u'р'}, // 0420 → 0440 - {u'С', u'с'}, // 0421 → 0441 - {u'Т', u'т'}, // 0422 → 0442 - {u'У', u'у'}, // 0423 → 0443 - {u'Ф', u'ф'}, // 0424 → 0444 - {u'Х', u'х'}, // 0425 → 0445 - {u'Ц', u'ц'}, // 0426 → 0446 - {u'Ч', u'ч'}, // 0427 → 0447 - {u'Ш', u'ш'}, // 0428 → 0448 - {u'Щ', u'щ'}, // 0429 → 0449 - {u'Ъ', u'ъ'}, // 042a → 044a - {u'Ы', u'ы'}, // 042b → 044b - {u'Ь', u'ь'}, // 042c → 044c - {u'Э', u'л'}, // 042d → 043b - {u'Ю', u'ю'}, // 042e → 044e - {u'Я', u'я'}, // 042f → 044f - {u'Ѡ', u'ѡ'}, // 0460 → 0461 - {u'Ѣ', u'ѣ'}, // 0462 → 0463 - {u'Ѥ', u'ѥ'}, // 0464 → 0465 - {u'Ѧ', u'ѧ'}, // 0466 → 0467 - {u'Ѩ', u'ѩ'}, // 0468 → 0469 - {u'Ѫ', u'ѫ'}, // 046a → 046b - {u'Ѭ', u'ѭ'}, // 046c → 046d - {u'Ѯ', u'ѯ'}, // 046e → 046f - {u'Ѱ', u'ѱ'}, // 0470 → 0471 - {u'Ѳ', u'ѳ'}, // 0472 → 0473 - {u'Ѵ', u'ѵ'}, // 0474 → 0475 - {u'Ѷ', u'ѷ'}, // 0476 → 0477 - {u'Ѹ', u'є'}, // 0478 → 0454 - {u'Ѻ', u'ѻ'}, // 047a → 047b - {u'Ѽ', u'ѽ'}, // 047c → 047d - {u'Ѿ', u'ѿ'}, // 047e → 047f - {u'Ҁ', u'ҁ'}, // 0480 → 0481 - {u'Ҋ', u'ҋ'}, // 048a → 048b - {u'Ҍ', u'ҍ'}, // 048c → 048d - {u'Ҏ', u'ҏ'}, // 048e → 048f - {u'Ґ', u'ґ'}, // 0490 → 0491 - {u'Ғ', u'ғ'}, // 0492 → 0493 - {u'Ҕ', u'ҕ'}, // 0494 → 0495 - {u'Җ', u'җ'}, // 0496 → 0497 - {u'Ҙ', u'ҙ'}, // 0498 → 0499 - {u'Қ', u'қ'}, // 049a → 049b - {u'Ҝ', u'ҝ'}, // 049c → 049d - {u'Ҟ', u'ҟ'}, // 049e → 049f - {u'Ҡ', u'ҡ'}, // 04a0 → 04a1 - {u'Ң', u'ң'}, // 04a2 → 04a3 - {u'Ҥ', u'ҥ'}, // 04a4 → 04a5 - {u'Ҧ', u'ҧ'}, // 04a6 → 04a7 - {u'Ҩ', u'ҩ'}, // 04a8 → 04a9 - {u'Ҫ', u'ҫ'}, // 04aa → 04ab - {u'Ҭ', u'ҭ'}, // 04ac → 04ad - {u'Ү', u'ү'}, // 04ae → 04af - {u'Ұ', u'ұ'}, // 04b0 → 04b1 - {u'Ҳ', u'ҳ'}, // 04b2 → 04b3 - {u'Ҵ', u'ҵ'}, // 04b4 → 04b5 - {u'Ҷ', u'ҷ'}, // 04b6 → 04b7 - {u'Ҹ', u'ҹ'}, // 04b8 → 04b9 - {u'Һ', u'һ'}, // 04ba → 04bb - {u'Ҽ', u'ҽ'}, // 04bc → 04bd - {u'Ҿ', u'ҿ'}, // 04be → 04bf - {u'Ӂ', u'ӂ'}, // 04c1 → 04c2 - {u'Ӄ', u'ӄ'}, // 04c3 → 04c4 - {u'Ӆ', u'ӆ'}, // 04c5 → 04c6 - {u'Ӈ', u'ӈ'}, // 04c7 → 04c8 - {u'Ӊ', u'ӊ'}, // 04c9 → 04ca - {u'Ӌ', u'ӌ'}, // 04cb → 04cc - {u'Ӎ', u'ӎ'}, // 04cd → 04ce - {u'Ӑ', u'ӑ'}, // 04d0 → 04d1 - {u'Ӓ', u'ӓ'}, // 04d2 → 04d3 - {u'Ӕ', u'ӕ'}, // 04d4 → 04d5 - {u'Ӗ', u'ӗ'}, // 04d6 → 04d7 - {u'Ә', u'ә'}, // 04d8 → 04d9 - {u'Ӛ', u'ӛ'}, // 04da → 04db - {u'Ӝ', u'ӝ'}, // 04dc → 04dd - {u'Ӟ', u'ӟ'}, // 04de → 04df - {u'Ӡ', u'ӡ'}, // 04e0 → 04e1 - {u'Ӣ', u'ӣ'}, // 04e2 → 04e3 - {u'Ӥ', u'ӥ'}, // 04e4 → 04e5 - {u'Ӧ', u'ӧ'}, // 04e6 → 04e7 - {u'Ө', u'ө'}, // 04e8 → 04e9 - {u'Ӫ', u'ӫ'}, // 04ea → 04eb - {u'Ӭ', u'ӭ'}, // 04ec → 04ed - {u'Ӯ', u'ӯ'}, // 04ee → 04ef - {u'Ӱ', u'ӱ'}, // 04f0 → 04f1 - {u'Ӳ', u'ӳ'}, // 04f2 → 04f3 - {u'Ӵ', u'ӵ'}, // 04f4 → 04f5 - {u'Ӷ', u'ӷ'}, // 04f6 → 04f7 - {u'Ӹ', u'ӹ'}, // 04f8 → 04f9 - {u'Ӻ', u'ӻ'}, // 04fa → 04fb - {u'Ӽ', u'ӽ'}, // 04fc → 04fd - {u'Ӿ', u'ӿ'}, // 04fe → 04ff - {u'Ԁ', u'ԁ'}, // 0500 → 0501 - {u'Ԃ', u'ԃ'}, // 0502 → 0503 - {u'Ԅ', u'ԅ'}, // 0504 → 0505 - {u'Ԇ', u'ԇ'}, // 0506 → 0507 - {u'Ԉ', u'ԉ'}, // 0508 → 0509 - {u'Ԋ', u'ԋ'}, // 050a → 050b - {u'Ԍ', u'ԍ'}, // 050c → 050d - {u'Ԏ', u'ԏ'}, // 050e → 050f - {u'Ԑ', u'ԑ'}, // 0510 → 0511 - {u'Ԓ', u'ԓ'}, // 0512 → 0513 - {u'Ԕ', u'ԕ'}, // 0514 → 0515 - {u'Ԗ', u'ԗ'}, // 0516 → 0517 - {u'Ԙ', u'ԙ'}, // 0518 → 0519 - {u'Ԛ', u'ԛ'}, // 051a → 051b - {u'Ԝ', u'ԝ'}, // 051c → 051d - {u'Ԟ', u'ԟ'}, // 051e → 051f - {u'Ԡ', u'ԡ'}, // 0520 → 0521 - {u'Ԣ', u'ԣ'}, // 0522 → 0523 - {u'Ԥ', u'ԥ'}, // 0524 → 0525 - {u'Ԧ', u'ԧ'}, // 0526 → 0527 - {u'Ԩ', u'ԩ'}, // 0528 → 0529 - {u'Ԫ', u'ԫ'}, // 052a → 052b - {u'Ԭ', u'ԭ'}, // 052c → 052d - {u'Ԯ', u'ԯ'}, // 052e → 052f - {u'Ա', u'ա'}, // 0531 → 0561 - {u'Բ', u'բ'}, // 0532 → 0562 - {u'Գ', u'գ'}, // 0533 → 0563 - {u'Դ', u'դ'}, // 0534 → 0564 - {u'Ե', u'ե'}, // 0535 → 0565 - {u'Զ', u'զ'}, // 0536 → 0566 - {u'Է', u'է'}, // 0537 → 0567 - {u'Ը', u'ը'}, // 0538 → 0568 - {u'Թ', u'թ'}, // 0539 → 0569 - {u'Ժ', u'ժ'}, // 053a → 056a - {u'Ի', u'ի'}, // 053b → 056b - {u'Լ', u'լ'}, // 053c → 056c - {u'Խ', u'խ'}, // 053d → 056d - {u'Ծ', u'ծ'}, // 053e → 056e - {u'Կ', u'կ'}, // 053f → 056f - {u'Հ', u'հ'}, // 0540 → 0570 - {u'Ձ', u'ձ'}, // 0541 → 0571 - {u'Ղ', u'ղ'}, // 0542 → 0572 - {u'Ճ', u'ճ'}, // 0543 → 0573 - {u'Մ', u'մ'}, // 0544 → 0574 - {u'Յ', u'յ'}, // 0545 → 0575 - {u'Ն', u'ն'}, // 0546 → 0576 - {u'Շ', u'շ'}, // 0547 → 0577 - {u'Ո', u'ո'}, // 0548 → 0578 - {u'Չ', u'չ'}, // 0549 → 0579 - {u'Պ', u'պ'}, // 054a → 057a - {u'Ջ', u'ջ'}, // 054b → 057b - {u'Ռ', u'ռ'}, // 054c → 057c - {u'Ս', u'ս'}, // 054d → 057d - {u'Վ', u'վ'}, // 054e → 057e - {u'Տ', u'տ'}, // 054f → 057f - {u'Ր', u'ր'}, // 0550 → 0580 - {u'Ց', u'ց'}, // 0551 → 0581 - {u'Ւ', u'ւ'}, // 0552 → 0582 - {u'Փ', u'փ'}, // 0553 → 0583 - {u'Ք', u'ք'}, // 0554 → 0584 - {u'Օ', u'օ'}, // 0555 → 0585 - {u'Ֆ', u'ֆ'}, // 0556 → 0586 - {u'Ⴀ', u'ⴀ'}, // 10a0 → 2d00 - {u'Ⴁ', u'ⴁ'}, // 10a1 → 2d01 - {u'Ⴂ', u'ⴂ'}, // 10a2 → 2d02 - {u'Ⴃ', u'ⴃ'}, // 10a3 → 2d03 - {u'Ⴄ', u'ⴄ'}, // 10a4 → 2d04 - {u'Ⴅ', u'ⴅ'}, // 10a5 → 2d05 - {u'Ⴆ', u'ⴆ'}, // 10a6 → 2d06 - {u'Ⴇ', u'ⴇ'}, // 10a7 → 2d07 - {u'Ⴈ', u'ⴈ'}, // 10a8 → 2d08 - {u'Ⴉ', u'ⴉ'}, // 10a9 → 2d09 - {u'Ⴊ', u'ⴊ'}, // 10aa → 2d0a - {u'Ⴋ', u'ⴋ'}, // 10ab → 2d0b - {u'Ⴌ', u'ⴌ'}, // 10ac → 2d0c - {u'Ⴍ', u'ⴍ'}, // 10ad → 2d0d - {u'Ⴎ', u'ⴎ'}, // 10ae → 2d0e - {u'Ⴏ', u'ⴏ'}, // 10af → 2d0f - {u'Ⴐ', u'ⴐ'}, // 10b0 → 2d10 - {u'Ⴑ', u'ⴑ'}, // 10b1 → 2d11 - {u'Ⴒ', u'ⴒ'}, // 10b2 → 2d12 - {u'Ⴓ', u'ⴓ'}, // 10b3 → 2d13 - {u'Ⴔ', u'ⴔ'}, // 10b4 → 2d14 - {u'Ⴕ', u'ⴕ'}, // 10b5 → 2d15 - {u'Ⴖ', u'ⴖ'}, // 10b6 → 2d16 - {u'Ⴗ', u'ⴗ'}, // 10b7 → 2d17 - {u'Ⴘ', u'ⴘ'}, // 10b8 → 2d18 - {u'Ⴙ', u'ⴙ'}, // 10b9 → 2d19 - {u'Ⴚ', u'ⴚ'}, // 10ba → 2d1a - {u'Ⴛ', u'ⴛ'}, // 10bb → 2d1b - {u'Ⴜ', u'ⴜ'}, // 10bc → 2d1c - {u'Ⴝ', u'ⴝ'}, // 10bd → 2d1d - {u'Ⴞ', u'ⴞ'}, // 10be → 2d1e - {u'Ⴟ', u'ⴟ'}, // 10bf → 2d1f - {u'Ⴠ', u'ⴠ'}, // 10c0 → 2d20 - {u'Ⴡ', u'ⴡ'}, // 10c1 → 2d21 - {u'Ⴢ', u'ⴢ'}, // 10c2 → 2d22 - {u'Ⴣ', u'ⴣ'}, // 10c3 → 2d23 - {u'Ⴤ', u'ⴤ'}, // 10c4 → 2d24 - {u'Ⴥ', u'ⴥ'}, // 10c5 → 2d25 - {u'Ⴧ', u'ⴧ'}, // 10c7 → 2d27 - {u'Ⴭ', u'ⴭ'}, // 10cd → 2d2d - {u'Ᏸ', u'ᏸ'}, // 13f0 → 13f8 - {u'Ᏹ', u'ᏹ'}, // 13f1 → 13f9 - {u'Ᏺ', u'ᏺ'}, // 13f2 → 13fa - {u'Ᏻ', u'ᏻ'}, // 13f3 → 13fb - {u'Ᏼ', u'ᏼ'}, // 13f4 → 13fc - {u'Ᏽ', u'ᏽ'}, // 13f5 → 13fd - {u'Ḁ', u'ḁ'}, // 1e00 → 1e01 - {u'Ḃ', u'ḃ'}, // 1e02 → 1e03 - {u'Ḅ', u'ḅ'}, // 1e04 → 1e05 - {u'Ḇ', u'ḇ'}, // 1e06 → 1e07 - {u'Ḉ', u'ḉ'}, // 1e08 → 1e09 - {u'Ḋ', u'ḋ'}, // 1e0a → 1e0b - {u'Ḍ', u'ḍ'}, // 1e0c → 1e0d - {u'Ḏ', u'ḏ'}, // 1e0e → 1e0f - {u'Ḑ', u'ḑ'}, // 1e10 → 1e11 - {u'Ḓ', u'ḓ'}, // 1e12 → 1e13 - {u'Ḕ', u'ḕ'}, // 1e14 → 1e15 - {u'Ḗ', u'ḗ'}, // 1e16 → 1e17 - {u'Ḙ', u'ḙ'}, // 1e18 → 1e19 - {u'Ḛ', u'ḛ'}, // 1e1a → 1e1b - {u'Ḝ', u'ḝ'}, // 1e1c → 1e1d - {u'Ḟ', u'ḟ'}, // 1e1e → 1e1f - {u'Ḡ', u'ḡ'}, // 1e20 → 1e21 - {u'Ḣ', u'ḣ'}, // 1e22 → 1e23 - {u'Ḥ', u'ḥ'}, // 1e24 → 1e25 - {u'Ḧ', u'ḧ'}, // 1e26 → 1e27 - {u'Ḩ', u'ḩ'}, // 1e28 → 1e29 - {u'Ḫ', u'ḫ'}, // 1e2a → 1e2b - {u'Ḭ', u'ḭ'}, // 1e2c → 1e2d - {u'Ḯ', u'ḯ'}, // 1e2e → 1e2f - {u'Ḱ', u'ḱ'}, // 1e30 → 1e31 - {u'Ḳ', u'ḳ'}, // 1e32 → 1e33 - {u'Ḵ', u'ḵ'}, // 1e34 → 1e35 - {u'Ḷ', u'ḷ'}, // 1e36 → 1e37 - {u'Ḹ', u'ḹ'}, // 1e38 → 1e39 - {u'Ḻ', u'ḻ'}, // 1e3a → 1e3b - {u'Ḽ', u'ḽ'}, // 1e3c → 1e3d - {u'Ḿ', u'ḿ'}, // 1e3e → 1e3f - {u'Ṁ', u'ṁ'}, // 1e40 → 1e41 - {u'Ṃ', u'ṃ'}, // 1e42 → 1e43 - {u'Ṅ', u'ṅ'}, // 1e44 → 1e45 - {u'Ṇ', u'ṇ'}, // 1e46 → 1e47 - {u'Ṉ', u'ṉ'}, // 1e48 → 1e49 - {u'Ṋ', u'ṋ'}, // 1e4a → 1e4b - {u'Ṍ', u'ṍ'}, // 1e4c → 1e4d - {u'Ṏ', u'ṏ'}, // 1e4e → 1e4f - {u'Ṑ', u'ṑ'}, // 1e50 → 1e51 - {u'Ṓ', u'ṓ'}, // 1e52 → 1e53 - {u'Ṕ', u'ṕ'}, // 1e54 → 1e55 - {u'Ṗ', u'ṗ'}, // 1e56 → 1e57 - {u'Ṙ', u'ṙ'}, // 1e58 → 1e59 - {u'Ṛ', u'ṛ'}, // 1e5a → 1e5b - {u'Ṝ', u'ṝ'}, // 1e5c → 1e5d - {u'Ṟ', u'ṟ'}, // 1e5e → 1e5f - {u'Ṡ', u'ṡ'}, // 1e60 → 1e61 - {u'Ṣ', u'ṣ'}, // 1e62 → 1e63 - {u'Ṥ', u'ṥ'}, // 1e64 → 1e65 - {u'Ṧ', u'ṧ'}, // 1e66 → 1e67 - {u'Ṩ', u'ṩ'}, // 1e68 → 1e69 - {u'Ṫ', u'ṫ'}, // 1e6a → 1e6b - {u'Ṭ', u'ṭ'}, // 1e6c → 1e6d - {u'Ṯ', u'ṯ'}, // 1e6e → 1e6f - {u'Ṱ', u'ṱ'}, // 1e70 → 1e71 - {u'Ṳ', u'ṳ'}, // 1e72 → 1e73 - {u'Ṵ', u'ṵ'}, // 1e74 → 1e75 - {u'Ṷ', u'ṷ'}, // 1e76 → 1e77 - {u'Ṹ', u'ṹ'}, // 1e78 → 1e79 - {u'Ṻ', u'ṻ'}, // 1e7a → 1e7b - {u'Ṽ', u'ṽ'}, // 1e7c → 1e7d - {u'Ṿ', u'ṿ'}, // 1e7e → 1e7f - {u'Ẁ', u'ẁ'}, // 1e80 → 1e81 - {u'Ẃ', u'ẃ'}, // 1e82 → 1e83 - {u'Ẅ', u'ẅ'}, // 1e84 → 1e85 - {u'Ẇ', u'ẇ'}, // 1e86 → 1e87 - {u'Ẉ', u'ẉ'}, // 1e88 → 1e89 - {u'Ẋ', u'ẋ'}, // 1e8a → 1e8b - {u'Ẍ', u'ẍ'}, // 1e8c → 1e8d - {u'Ẏ', u'ẏ'}, // 1e8e → 1e8f - {u'Ẑ', u'ẑ'}, // 1e90 → 1e91 - {u'Ẓ', u'ẓ'}, // 1e92 → 1e93 - {u'Ẕ', u'ẕ'}, // 1e94 → 1e95 - {u'ẞ', u'ß'}, // 1e9e → 00df - {u'Ạ', u'ạ'}, // 1ea0 → 1ea1 - {u'Ả', u'ả'}, // 1ea2 → 1ea3 - {u'Ấ', u'ấ'}, // 1ea4 → 1ea5 - {u'Ầ', u'ầ'}, // 1ea6 → 1ea7 - {u'Ẩ', u'ẩ'}, // 1ea8 → 1ea9 - {u'Ẫ', u'ẫ'}, // 1eaa → 1eab - {u'Ậ', u'ậ'}, // 1eac → 1ead - {u'Ắ', u'ắ'}, // 1eae → 1eaf - {u'Ằ', u'ằ'}, // 1eb0 → 1eb1 - {u'Ẳ', u'ẳ'}, // 1eb2 → 1eb3 - {u'Ẵ', u'ẵ'}, // 1eb4 → 1eb5 - {u'Ặ', u'ặ'}, // 1eb6 → 1eb7 - {u'Ẹ', u'ẹ'}, // 1eb8 → 1eb9 - {u'Ẻ', u'ẻ'}, // 1eba → 1ebb - {u'Ẽ', u'ḛ'}, // 1ebc → 1e1b - {u'Ế', u'ế'}, // 1ebe → 1ebf - {u'Ề', u'ề'}, // 1ec0 → 1ec1 - {u'Ể', u'ể'}, // 1ec2 → 1ec3 - {u'Ễ', u'ễ'}, // 1ec4 → 1ec5 - {u'Ệ', u'ệ'}, // 1ec6 → 1ec7 - {u'Ỉ', u'ỉ'}, // 1ec8 → 1ec9 - {u'Ị', u'ị'}, // 1eca → 1ecb - {u'Ọ', u'ọ'}, // 1ecc → 1ecd - {u'Ỏ', u'ỏ'}, // 1ece → 1ecf - {u'Ố', u'ố'}, // 1ed0 → 1ed1 - {u'Ồ', u'ồ'}, // 1ed2 → 1ed3 - {u'Ổ', u'ổ'}, // 1ed4 → 1ed5 - {u'Ỗ', u'ỗ'}, // 1ed6 → 1ed7 - {u'Ộ', u'ộ'}, // 1ed8 → 1ed9 - {u'Ớ', u'ớ'}, // 1eda → 1edb - {u'Ờ', u'ờ'}, // 1edc → 1edd - {u'Ở', u'ở'}, // 1ede → 1edf - {u'Ỡ', u'ỡ'}, // 1ee0 → 1ee1 - {u'Ợ', u'ợ'}, // 1ee2 → 1ee3 - {u'Ụ', u'ụ'}, // 1ee4 → 1ee5 - {u'Ủ', u'ủ'}, // 1ee6 → 1ee7 - {u'Ứ', u'ứ'}, // 1ee8 → 1ee9 - {u'Ừ', u'ừ'}, // 1eea → 1eeb - {u'Ử', u'ử'}, // 1eec → 1eed - {u'Ữ', u'ữ'}, // 1eee → 1eef - {u'Ự', u'ự'}, // 1ef0 → 1ef1 - {u'Ỳ', u'ỳ'}, // 1ef2 → 1ef3 - {u'Ỵ', u'ỵ'}, // 1ef4 → 1ef5 - {u'Ỷ', u'ỷ'}, // 1ef6 → 1ef7 - {u'Ỹ', u'ỹ'}, // 1ef8 → 1ef9 - {u'Ỻ', u'ỻ'}, // 1efa → 1efb - {u'Ỽ', u'ỽ'}, // 1efc → 1efd - {u'Ỿ', u'ỿ'}, // 1efe → 1eff - {u'Ἀ', u'ἀ'}, // 1f08 → 1f00 - {u'Ἁ', u'ἁ'}, // 1f09 → 1f01 - {u'Ἂ', u'ἂ'}, // 1f0a → 1f02 - {u'Ἃ', u'ἃ'}, // 1f0b → 1f03 - {u'Ἄ', u'ἄ'}, // 1f0c → 1f04 - {u'Ἅ', u'ἅ'}, // 1f0d → 1f05 - {u'Ἆ', u'ἆ'}, // 1f0e → 1f06 - {u'Ἇ', u'ἇ'}, // 1f0f → 1f07 - {u'Ἐ', u'ἐ'}, // 1f18 → 1f10 - {u'Ἑ', u'ἑ'}, // 1f19 → 1f11 - {u'Ἒ', u'ἒ'}, // 1f1a → 1f12 - {u'Ἓ', u'ἓ'}, // 1f1b → 1f13 - {u'Ἔ', u'ἔ'}, // 1f1c → 1f14 - {u'Ἕ', u'ἕ'}, // 1f1d → 1f15 - {u'Ἠ', u'ἠ'}, // 1f28 → 1f20 - {u'Ἡ', u'ἡ'}, // 1f29 → 1f21 - {u'Ἢ', u'ἢ'}, // 1f2a → 1f22 - {u'Ἣ', u'ἣ'}, // 1f2b → 1f23 - {u'Ἤ', u'ἤ'}, // 1f2c → 1f24 - {u'Ἥ', u'ἥ'}, // 1f2d → 1f25 - {u'Ἦ', u'ἦ'}, // 1f2e → 1f26 - {u'Ἧ', u'ἧ'}, // 1f2f → 1f27 - {u'Ἰ', u'ἰ'}, // 1f38 → 1f30 - {u'Ἱ', u'ἱ'}, // 1f39 → 1f31 - {u'Ἲ', u'ἲ'}, // 1f3a → 1f32 - {u'Ἳ', u'ἳ'}, // 1f3b → 1f33 - {u'Ἴ', u'ἴ'}, // 1f3c → 1f34 - {u'Ἵ', u'ἵ'}, // 1f3d → 1f35 - {u'Ἶ', u'ἶ'}, // 1f3e → 1f36 - {u'Ἷ', u'ἷ'}, // 1f3f → 1f37 - {u'Ὀ', u'ὀ'}, // 1f48 → 1f40 - {u'Ὁ', u'ὁ'}, // 1f49 → 1f41 - {u'Ὂ', u'ὂ'}, // 1f4a → 1f42 - {u'Ὃ', u'ὃ'}, // 1f4b → 1f43 - {u'Ὄ', u'ὄ'}, // 1f4c → 1f44 - {u'Ὅ', u'ὅ'}, // 1f4d → 1f45 - {u'Ὑ', u'ὑ'}, // 1f59 → 1f51 - {u'Ὓ', u'ὓ'}, // 1f5b → 1f53 - {u'Ὕ', u'ὕ'}, // 1f5d → 1f55 - {u'Ὗ', u'ὗ'}, // 1f5f → 1f57 - {u'Ὠ', u'ὠ'}, // 1f68 → 1f60 - {u'Ὡ', u'ὡ'}, // 1f69 → 1f61 - {u'Ὢ', u'ὢ'}, // 1f6a → 1f62 - {u'Ὣ', u'ὣ'}, // 1f6b → 1f63 - {u'Ὤ', u'ὤ'}, // 1f6c → 1f64 - {u'Ὥ', u'ὥ'}, // 1f6d → 1f65 - {u'Ὦ', u'ὦ'}, // 1f6e → 1f66 - {u'Ὧ', u'ὧ'}, // 1f6f → 1f67 - {u'Ᾰ', u'ᾰ'}, // 1fb8 → 1fb0 - {u'Ᾱ', u'ᾱ'}, // 1fb9 → 1fb1 - {u'Ὰ', u'ὰ'}, // 1fba → 1f70 - {u'Ά', u'ά'}, // 1fbb → 1f71 - {u'Ὲ', u'ὲ'}, // 1fc8 → 1f72 - {u'Έ', u'έ'}, // 1fc9 → 1f73 - {u'Ὴ', u'ὴ'}, // 1fca → 1f74 - {u'Ή', u'ή'}, // 1fcb → 1f75 - {u'Ῐ', u'ῐ'}, // 1fd8 → 1fd0 - {u'Ῑ', u'ῑ'}, // 1fd9 → 1fd1 - {u'Ὶ', u'ὶ'}, // 1fda → 1f76 - {u'Ί', u'ί'}, // 1fdb → 1f77 - {u'Ῠ', u'ῠ'}, // 1fe8 → 1fe0 - {u'Ῡ', u'ῡ'}, // 1fe9 → 1fe1 - {u'Ὺ', u'ὺ'}, // 1fea → 1f7a - {u'Ύ', u'ύ'}, // 1feb → 1f7b - {u'Ῥ', u'ῥ'}, // 1fec → 1fe5 - {u'Ὸ', u'ὸ'}, // 1ff8 → 1f78 - {u'Ό', u'ό'}, // 1ff9 → 1f79 - {u'Ὼ', u'ὼ'}, // 1ffa → 1f7c - {u'Ώ', u'ώ'}, // 1ffb → 1f7d - {u'ℒ', u'ℓ'}, // 2112 → 2113 - {u'ℙ', u'ℼ'}, // 2119 → 213c - {u'ℰ', u'ℯ'}, // 2130 → 212f - {u'Ⅎ', u'ⅎ'}, // 2132 → 214e - {u'ℾ', u'ℽ'}, // 213e → 213d - {u'ℿ', u'ℼ'}, // 213f → 213c - {u'ⅅ', u'ⅆ'}, // 2145 → 2146 - {u'Ⰰ', u'ⰰ'}, // 2c00 → 2c30 - {u'Ⰱ', u'ⰱ'}, // 2c01 → 2c31 - {u'Ⰲ', u'ⰲ'}, // 2c02 → 2c32 - {u'Ⰳ', u'ⰳ'}, // 2c03 → 2c33 - {u'Ⰴ', u'ⰴ'}, // 2c04 → 2c34 - {u'Ⰵ', u'ⰵ'}, // 2c05 → 2c35 - {u'Ⰶ', u'ⰶ'}, // 2c06 → 2c36 - {u'Ⰷ', u'ⰷ'}, // 2c07 → 2c37 - {u'Ⰸ', u'ⰸ'}, // 2c08 → 2c38 - {u'Ⰹ', u'ⰹ'}, // 2c09 → 2c39 - {u'Ⰺ', u'ⰺ'}, // 2c0a → 2c3a - {u'Ⰻ', u'ⰹ'}, // 2c0b → 2c39 - {u'Ⰼ', u'ⰼ'}, // 2c0c → 2c3c - {u'Ⰽ', u'ⰽ'}, // 2c0d → 2c3d - {u'Ⰾ', u'ⰾ'}, // 2c0e → 2c3e - {u'Ⰿ', u'ⰿ'}, // 2c0f → 2c3f - {u'Ⱀ', u'ⱀ'}, // 2c10 → 2c40 - {u'Ⱁ', u'ⱁ'}, // 2c11 → 2c41 - {u'Ⱂ', u'ⱂ'}, // 2c12 → 2c42 - {u'Ⱃ', u'ⱃ'}, // 2c13 → 2c43 - {u'Ⱄ', u'ⱄ'}, // 2c14 → 2c44 - {u'Ⱅ', u'ⱅ'}, // 2c15 → 2c45 - {u'Ⱆ', u'ⱆ'}, // 2c16 → 2c46 - {u'Ⱇ', u'ⱇ'}, // 2c17 → 2c47 - {u'Ⱈ', u'ⱈ'}, // 2c18 → 2c48 - {u'Ⱉ', u'ⱉ'}, // 2c19 → 2c49 - {u'Ⱊ', u'ⱊ'}, // 2c1a → 2c4a - {u'Ⱋ', u'ⱋ'}, // 2c1b → 2c4b - {u'Ⱌ', u'ⱌ'}, // 2c1c → 2c4c - {u'Ⱍ', u'ⱍ'}, // 2c1d → 2c4d - {u'Ⱎ', u'ⱎ'}, // 2c1e → 2c4e - {u'Ⱏ', u'ⱏ'}, // 2c1f → 2c4f - {u'Ⱐ', u'ⱐ'}, // 2c20 → 2c50 - {u'Ⱑ', u'ⱑ'}, // 2c21 → 2c51 - {u'Ⱒ', u'ⱒ'}, // 2c22 → 2c52 - {u'Ⱓ', u'ⱓ'}, // 2c23 → 2c53 - {u'Ⱔ', u'ⱔ'}, // 2c24 → 2c54 - {u'Ⱕ', u'ⱕ'}, // 2c25 → 2c55 - {u'Ⱖ', u'ⱖ'}, // 2c26 → 2c56 - {u'Ⱗ', u'ⱗ'}, // 2c27 → 2c57 - {u'Ⱘ', u'ⱘ'}, // 2c28 → 2c58 - {u'Ⱙ', u'ⱙ'}, // 2c29 → 2c59 - {u'Ⱚ', u'ⱚ'}, // 2c2a → 2c5a - {u'Ⱛ', u'ⱛ'}, // 2c2b → 2c5b - {u'Ⱜ', u'ⱜ'}, // 2c2c → 2c5c - {u'Ⱝ', u'ⱝ'}, // 2c2d → 2c5d - {u'Ⱞ', u'ⱞ'}, // 2c2e → 2c5e - {u'Ⱡ', u'ⱡ'}, // 2c60 → 2c61 - {u'Ɫ', u'ɫ'}, // 2c62 → 026b - {u'Ᵽ', u'ᵽ'}, // 2c63 → 1d7d - {u'Ɽ', u'ɽ'}, // 2c64 → 027d - {u'Ⱨ', u'ⱨ'}, // 2c67 → 2c68 - {u'Ⱪ', u'ⱪ'}, // 2c69 → 2c6a - {u'Ⱬ', u'ⱬ'}, // 2c6b → 2c6c - {u'Ɑ', u'ɑ'}, // 2c6d → 0251 - {u'Ɱ', u'ɱ'}, // 2c6e → 0271 - {u'Ɐ', u'ɐ'}, // 2c6f → 0250 - {u'Ɒ', u'ɒ'}, // 2c70 → 0252 - {u'Ⱳ', u'ⱳ'}, // 2c72 → 2c73 - {u'Ⱶ', u'ⱶ'}, // 2c75 → 2c76 - {u'Ȿ', u'ȿ'}, // 2c7e → 023f - {u'Ɀ', u'ɀ'}, // 2c7f → 0240 - {u'Ⲁ', u'ⲁ'}, // 2c80 → 2c81 - {u'Ⲃ', u'ⲃ'}, // 2c82 → 2c83 - {u'Ⲅ', u'ⲅ'}, // 2c84 → 2c85 - {u'Ⲇ', u'ⲇ'}, // 2c86 → 2c87 - {u'Ⲉ', u'ⲉ'}, // 2c88 → 2c89 - {u'Ⲋ', u'ⲋ'}, // 2c8a → 2c8b - {u'Ⲍ', u'ⲍ'}, // 2c8c → 2c8d - {u'Ⲏ', u'ⲏ'}, // 2c8e → 2c8f - {u'Ⲑ', u'ⲑ'}, // 2c90 → 2c91 - {u'Ⲓ', u'ⲓ'}, // 2c92 → 2c93 - {u'Ⲕ', u'ⲕ'}, // 2c94 → 2c95 - {u'Ⲗ', u'ⲗ'}, // 2c96 → 2c97 - {u'Ⲙ', u'ⲙ'}, // 2c98 → 2c99 - {u'Ⲛ', u'ⲛ'}, // 2c9a → 2c9b - {u'Ⲝ', u'ⲝ'}, // 2c9c → 2c9d - {u'Ⲟ', u'ⲟ'}, // 2c9e → 2c9f - {u'Ⲡ', u'ⲡ'}, // 2ca0 → 2ca1 - {u'Ⲣ', u'ⲣ'}, // 2ca2 → 2ca3 - {u'Ⲥ', u'ⲥ'}, // 2ca4 → 2ca5 - {u'Ⲧ', u'ⲧ'}, // 2ca6 → 2ca7 - {u'Ⲩ', u'ⲩ'}, // 2ca8 → 2ca9 - {u'Ⲫ', u'ⲫ'}, // 2caa → 2cab - {u'Ⲭ', u'ⲭ'}, // 2cac → 2cad - {u'Ⲯ', u'ⲯ'}, // 2cae → 2caf - {u'Ⲱ', u'ⲱ'}, // 2cb0 → 2cb1 - {u'Ⲳ', u'ⲳ'}, // 2cb2 → 2cb3 - {u'Ⲵ', u'ⲵ'}, // 2cb4 → 2cb5 - {u'Ⲷ', u'ⲷ'}, // 2cb6 → 2cb7 - {u'Ⲹ', u'ⲹ'}, // 2cb8 → 2cb9 - {u'Ⲻ', u'ⲻ'}, // 2cba → 2cbb - {u'Ⲽ', u'ⲽ'}, // 2cbc → 2cbd - {u'Ⲿ', u'ⲿ'}, // 2cbe → 2cbf - {u'Ⳁ', u'ⳁ'}, // 2cc0 → 2cc1 - {u'Ⳃ', u'ⳃ'}, // 2cc2 → 2cc3 - {u'Ⳅ', u'ⳅ'}, // 2cc4 → 2cc5 - {u'Ⳇ', u'ⳇ'}, // 2cc6 → 2cc7 - {u'Ⳉ', u'ⳉ'}, // 2cc8 → 2cc9 - {u'Ⳋ', u'ⳋ'}, // 2cca → 2ccb - {u'Ⳍ', u'ⳍ'}, // 2ccc → 2ccd - {u'Ⳏ', u'ⳏ'}, // 2cce → 2ccf - {u'Ⳑ', u'ⳑ'}, // 2cd0 → 2cd1 - {u'Ⳓ', u'ⳓ'}, // 2cd2 → 2cd3 - {u'Ⳕ', u'ⳕ'}, // 2cd4 → 2cd5 - {u'Ⳗ', u'ⳗ'}, // 2cd6 → 2cd7 - {u'Ⳙ', u'ⳙ'}, // 2cd8 → 2cd9 - {u'Ⳛ', u'ⳛ'}, // 2cda → 2cdb - {u'Ⳝ', u'ⳝ'}, // 2cdc → 2cdd - {u'Ⳟ', u'ⳟ'}, // 2cde → 2cdf - {u'Ⳡ', u'ⳡ'}, // 2ce0 → 2ce1 - {u'Ⳣ', u'ⳣ'}, // 2ce2 → 2ce3 - {u'Ⳬ', u'ⳬ'}, // 2ceb → 2cec - {u'Ⳮ', u'ⳮ'}, // 2ced → 2cee - {u'Ⳳ', u'ⳳ'}, // 2cf2 → 2cf3 - {u'Ꙁ', u'ꙁ'}, // a640 → a641 - {u'Ꙃ', u'ꙃ'}, // a642 → a643 - {u'Ꙅ', u'ꙅ'}, // a644 → a645 - {u'Ꙇ', u'ꙇ'}, // a646 → a647 - {u'Ꙉ', u'ꙉ'}, // a648 → a649 - {u'Ꙋ', u'ꙋ'}, // a64a → a64b - {u'Ꙍ', u'ꙍ'}, // a64c → a64d - {u'Ꙏ', u'ꙏ'}, // a64e → a64f - {u'Ꙑ', u'ꙑ'}, // a650 → a651 - {u'Ꙓ', u'ꙓ'}, // a652 → a653 - {u'Ꙕ', u'ꙕ'}, // a654 → a655 - {u'Ꙗ', u'ꙗ'}, // a656 → a657 - {u'Ꙙ', u'ꙙ'}, // a658 → a659 - {u'Ꙛ', u'ꙛ'}, // a65a → a65b - {u'Ꙝ', u'ꙝ'}, // a65c → a65d - {u'Ꙟ', u'ꙟ'}, // a65e → a65f - {u'Ꙡ', u'ꙡ'}, // a660 → a661 - {u'Ꙣ', u'ꙣ'}, // a662 → a663 - {u'Ꙥ', u'ꙥ'}, // a664 → a665 - {u'Ꙧ', u'ꙧ'}, // a666 → a667 - {u'Ꙩ', u'ꙩ'}, // a668 → a669 - {u'Ꙫ', u'ꙫ'}, // a66a → a66b - {u'Ꙭ', u'ꙭ'}, // a66c → a66d - {u'Ꚁ', u'ꚁ'}, // a680 → a681 - {u'Ꚃ', u'ꚃ'}, // a682 → a683 - {u'Ꚅ', u'ꚅ'}, // a684 → a685 - {u'Ꚇ', u'ꚇ'}, // a686 → a687 - {u'Ꚉ', u'ꚉ'}, // a688 → a689 - {u'Ꚋ', u'ꚋ'}, // a68a → a68b - {u'Ꚍ', u'ꚍ'}, // a68c → a68d - {u'Ꚏ', u'ꚏ'}, // a68e → a68f - {u'Ꚑ', u'ꚑ'}, // a690 → a691 - {u'Ꚓ', u'ꚓ'}, // a692 → a693 - {u'Ꚕ', u'ꚕ'}, // a694 → a695 - {u'Ꚗ', u'ꚗ'}, // a696 → a697 - {u'Ꚙ', u'ꚙ'}, // a698 → a699 - {u'Ꚛ', u'ꚛ'}, // a69a → a69b - {u'Ꜣ', u'ꜣ'}, // a722 → a723 - {u'Ꜥ', u'ꜥ'}, // a724 → a725 - {u'Ꜧ', u'ꜧ'}, // a726 → a727 - {u'Ꜩ', u'ꜩ'}, // a728 → a729 - {u'Ꜫ', u'ꜫ'}, // a72a → a72b - {u'Ꜭ', u'ꜭ'}, // a72c → a72d - {u'Ꜯ', u'ꜯ'}, // a72e → a72f - {u'Ꜳ', u'ꜳ'}, // a732 → a733 - {u'Ꜵ', u'ꜵ'}, // a734 → a735 - {u'Ꜷ', u'ꜷ'}, // a736 → a737 - {u'Ꜹ', u'ꜹ'}, // a738 → a739 - {u'Ꜻ', u'ꜻ'}, // a73a → a73b - {u'Ꜽ', u'ꜽ'}, // a73c → a73d - {u'Ꜿ', u'ꜿ'}, // a73e → a73f - {u'Ꝁ', u'ꝁ'}, // a740 → a741 - {u'Ꝃ', u'ꝃ'}, // a742 → a743 - {u'Ꝅ', u'ꝅ'}, // a744 → a745 - {u'Ꝇ', u'ꝇ'}, // a746 → a747 - {u'Ꝉ', u'ꝉ'}, // a748 → a749 - {u'Ꝋ', u'ꝋ'}, // a74a → a74b - {u'Ꝍ', u'ꝍ'}, // a74c → a74d - {u'Ꝏ', u'ꝏ'}, // a74e → a74f - {u'Ꝑ', u'ꝑ'}, // a750 → a751 - {u'Ꝓ', u'ꝓ'}, // a752 → a753 - {u'Ꝕ', u'ꝕ'}, // a754 → a755 - {u'Ꝗ', u'ꝑ'}, // a756 → a751 - {u'Ꝙ', u'ꝙ'}, // a758 → a759 - {u'Ꝛ', u'ꝛ'}, // a75a → a75b - {u'Ꝝ', u'ꝝ'}, // a75c → a75d - {u'Ꝟ', u'ꝟ'}, // a75e → a75f - {u'Ꝡ', u'ꝡ'}, // a760 → a761 - {u'Ꝣ', u'ꝣ'}, // a762 → a763 - {u'Ꝥ', u'ꝥ'}, // a764 → a765 - {u'Ꝧ', u'ꝑ'}, // a766 → a751 - {u'Ꝩ', u'ꝩ'}, // a768 → a769 - {u'Ꝫ', u'ꝫ'}, // a76a → a76b - {u'Ꝭ', u'ꝭ'}, // a76c → a76d - {u'Ꝯ', u'ꝯ'}, // a76e → a76f - {u'Ꝺ', u'ꝺ'}, // a779 → a77a - {u'Ꝼ', u'ꝼ'}, // a77b → a77c - {u'Ᵹ', u'ᵹ'}, // a77d → 1d79 - {u'Ꝿ', u'ꝿ'}, // a77e → a77f - {u'Ꞁ', u'ꞁ'}, // a780 → a781 - {u'Ꞃ', u'ꞃ'}, // a782 → a783 - {u'Ꞅ', u'ꞅ'}, // a784 → a785 - {u'Ꞇ', u'ꞇ'}, // a786 → a787 - {u'Ꞌ', u'ꞌ'}, // a78b → a78c - {u'Ɥ', u'ɥ'}, // a78d → 0265 - {u'Ꞑ', u'ꞑ'}, // a790 → a791 - {u'Ꞓ', u'ꞓ'}, // a792 → a793 - {u'Ꞗ', u'ꞗ'}, // a796 → a797 - {u'Ꞙ', u'ꞙ'}, // a798 → a799 - {u'Ꞛ', u'ꞛ'}, // a79a → a79b - {u'Ꞝ', u'ꞝ'}, // a79c → a79d - {u'Ꞟ', u'ꞟ'}, // a79e → a79f - {u'Ꞡ', u'ꞡ'}, // a7a0 → a7a1 - {u'Ꞣ', u'ꞣ'}, // a7a2 → a7a3 - {u'Ꞥ', u'ꞥ'}, // a7a4 → a7a5 - {u'Ꞧ', u'ꞧ'}, // a7a6 → a7a7 - {u'Ꞩ', u'ꞩ'}, // a7a8 → a7a9 - {u'Ɦ', u'ɦ'}, // a7aa → 0266 - {u'Ɜ', u'ɜ'}, // a7ab → 025c - {u'Ɡ', u'ɡ'}, // a7ac → 0261 - {u'Ɬ', u'ɬ'}, // a7ad → 026c - {u'Ʞ', u'ʞ'}, // a7b0 → 029e - {u'Ʇ', u'ʇ'}, // a7b1 → 0287 - {u'Ʝ', u'ʝ'}, // a7b2 → 029d - {u'Ꭓ', u'ꭓ'}, // a7b3 → ab53 - {u'Ꞵ', u'ꞵ'}, // a7b4 → a7b5 - {u'Ꞷ', u'ꞷ'}, // a7b6 → a7b7 - {u'Ꞹ', u'ꞹ'}, // a7b8 → a7b9 - {u'Ꞻ', u'ꞻ'}, // a7ba → a7bb - {u'Ꞽ', u'ꞽ'}, // a7bc → a7bd - {u'Ꞿ', u'ꞿ'}, // a7be → a7bf - {u'Ꟃ', u'ꟃ'}, // a7c2 → a7c3 - {u'Ꞔ', u'ꞔ'}, // a7c4 → a794 - {u'Ʂ', u'ʂ'}, // a7c5 → 0282 - {u'Ᶎ', u'ᶎ'}, // a7c6 → 1d8e - {u'A', u'a'}, // ff21 → ff41 - {u'B', u'b'}, // ff22 → ff42 - {u'C', u'c'}, // ff23 → ff43 - {u'D', u'd'}, // ff24 → ff44 - {u'E', u'e'}, // ff25 → ff45 - {u'F', u'f'}, // ff26 → ff46 - {u'G', u'g'}, // ff27 → ff47 - {u'H', u'h'}, // ff28 → ff48 - {u'I', u'i'}, // ff29 → ff49 - {u'J', u'j'}, // ff2a → ff4a - {u'K', u'k'}, // ff2b → ff4b - {u'L', u'l'}, // ff2c → ff4c - {u'M', u'm'}, // ff2d → ff4d - {u'N', u'n'}, // ff2e → ff4e - {u'O', u'o'}, // ff2f → ff4f - {u'P', u'p'}, // ff30 → ff50 - {u'Q', u'q'}, // ff31 → ff51 - {u'R', u'r'}, // ff32 → ff52 - {u'S', u's'}, // ff33 → ff53 - {u'T', u't'}, // ff34 → ff54 - {u'U', u'u'}, // ff35 → ff55 - {u'V', u'v'}, // ff36 → ff56 - {u'W', u'w'}, // ff37 → ff57 - {u'X', u'x'}, // ff38 → ff58 - {u'Y', u'y'}, // ff39 → ff59 - {u'Z', u'z'}, // ff3a → ff5a -#endif +static const struct { + unsigned short x; + unsigned short y; + short d; +} kLower[] = { + {0x00c0, 0x00d6, +32}, /* 23x À ..Ö → à ..ö Watin */ + {0x00d8, 0x00de, +32}, /* 7x Ø ..Þ → ø ..þ Watin */ + {0x0178, 0x0178, -121}, /* 1x Ÿ ..Ÿ → ÿ ..ÿ Watin-A */ + {0x0179, 0x0179, +1}, /* 1x Ź ..Ź → ź ..ź Watin-A */ + {0x017b, 0x017b, +1}, /* 1x Ż ..Ż → ż ..ż Watin-A */ + {0x017d, 0x017d, +1}, /* 1x Ž ..Ž → ž ..ž Watin-A */ + {0x0181, 0x0181, +210}, /* 1x Ɓ ..Ɓ → ɓ ..ɓ Watin-B */ + {0x0182, 0x0182, +1}, /* 1x Ƃ ..Ƃ → ƃ ..ƃ Watin-B */ + {0x0184, 0x0184, +1}, /* 1x Ƅ ..Ƅ → ƅ ..ƅ Watin-B */ + {0x0186, 0x0186, +206}, /* 1x Ɔ ..Ɔ → ɔ ..ɔ Watin-B */ + {0x0187, 0x0187, +1}, /* 1x Ƈ ..Ƈ → ƈ ..ƈ Watin-B */ + {0x0189, 0x018a, +205}, /* 2x Ɖ ..Ɗ → ɖ ..ɗ Watin-B */ + {0x018b, 0x018b, +1}, /* 1x Ƌ ..Ƌ → ƌ ..ƌ Watin-B */ + {0x018e, 0x018e, +79}, /* 1x Ǝ ..Ǝ → ǝ ..ǝ Watin-B */ + {0x018f, 0x018f, +202}, /* 1x Ə ..Ə → ə ..ə Watin-B */ + {0x0190, 0x0190, +203}, /* 1x Ɛ ..Ɛ → ɛ ..ɛ Watin-B */ + {0x0191, 0x0191, +1}, /* 1x Ƒ ..Ƒ → ƒ ..ƒ Watin-B */ + {0x0193, 0x0193, +205}, /* 1x Ɠ ..Ɠ → ɠ ..ɠ Watin-B */ + {0x0194, 0x0194, +207}, /* 1x Ɣ ..Ɣ → ɣ ..ɣ Watin-B */ + {0x0196, 0x0196, +211}, /* 1x Ɩ ..Ɩ → ɩ ..ɩ Watin-B */ + {0x0197, 0x0197, +209}, /* 1x Ɨ ..Ɨ → ɨ ..ɨ Watin-B */ + {0x0198, 0x0198, +1}, /* 1x Ƙ ..Ƙ → ƙ ..ƙ Watin-B */ + {0x019c, 0x019c, +211}, /* 1x Ɯ ..Ɯ → ɯ ..ɯ Watin-B */ + {0x019d, 0x019d, +213}, /* 1x Ɲ ..Ɲ → ɲ ..ɲ Watin-B */ + {0x019f, 0x019f, +214}, /* 1x Ɵ ..Ɵ → ɵ ..ɵ Watin-B */ + {0x01a0, 0x01a0, +1}, /* 1x Ơ ..Ơ → ơ ..ơ Watin-B */ + {0x01a2, 0x01a2, +1}, /* 1x Ƣ ..Ƣ → ƣ ..ƣ Watin-B */ + {0x01a4, 0x01a4, +1}, /* 1x Ƥ ..Ƥ → ƥ ..ƥ Watin-B */ + {0x01a6, 0x01a6, +218}, /* 1x Ʀ ..Ʀ → ʀ ..ʀ Watin-B */ + {0x01a7, 0x01a7, +1}, /* 1x Ƨ ..Ƨ → ƨ ..ƨ Watin-B */ + {0x01a9, 0x01a9, +218}, /* 1x Ʃ ..Ʃ → ʃ ..ʃ Watin-B */ + {0x01ac, 0x01ac, +1}, /* 1x Ƭ ..Ƭ → ƭ ..ƭ Watin-B */ + {0x01ae, 0x01ae, +218}, /* 1x Ʈ ..Ʈ → ʈ ..ʈ Watin-B */ + {0x01af, 0x01af, +1}, /* 1x Ư ..Ư → ư ..ư Watin-B */ + {0x01b1, 0x01b2, +217}, /* 2x Ʊ ..Ʋ → ʊ ..ʋ Watin-B */ + {0x01b3, 0x01b3, +1}, /* 1x Ƴ ..Ƴ → ƴ ..ƴ Watin-B */ + {0x01b5, 0x01b5, +1}, /* 1x Ƶ ..Ƶ → ƶ ..ƶ Watin-B */ + {0x01b7, 0x01b7, +219}, /* 1x Ʒ ..Ʒ → ʒ ..ʒ Watin-B */ + {0x01b8, 0x01b8, +1}, /* 1x Ƹ ..Ƹ → ƹ ..ƹ Watin-B */ + {0x01bc, 0x01bc, +1}, /* 1x Ƽ ..Ƽ → ƽ ..ƽ Watin-B */ + {0x01c4, 0x01c4, +2}, /* 1x DŽ ..DŽ → dž ..dž Watin-B */ + {0x01c5, 0x01c5, +1}, /* 1x Dž ..Dž → dž ..dž Watin-B */ + {0x01c7, 0x01c7, +2}, /* 1x LJ ..LJ → lj ..lj Watin-B */ + {0x01c8, 0x01c8, +1}, /* 1x Lj ..Lj → lj ..lj Watin-B */ + {0x01ca, 0x01ca, +2}, /* 1x NJ ..NJ → nj ..nj Watin-B */ + {0x01cb, 0x01cb, +1}, /* 1x Nj ..Nj → nj ..nj Watin-B */ + {0x01cd, 0x01cd, +1}, /* 1x Ǎ ..Ǎ → ǎ ..ǎ Watin-B */ + {0x01f1, 0x01f1, +2}, /* 1x DZ ..DZ → dz ..dz Watin-B */ + {0x01f2, 0x01f2, +1}, /* 1x Dz ..Dz → dz ..dz Watin-B */ + {0x01f4, 0x01f4, +1}, /* 1x Ǵ ..Ǵ → ǵ ..ǵ Watin-B */ + {0x01f6, 0x01f6, -97}, /* 1x Ƕ ..Ƕ → ƕ ..ƕ Watin-B */ + {0x01f7, 0x01f7, -56}, /* 1x Ƿ ..Ƿ → ƿ ..ƿ Watin-B */ + {0x0220, 0x0220, -130}, /* 1x Ƞ ..Ƞ → ƞ ..ƞ Watin-B */ + {0x023b, 0x023b, +1}, /* 1x Ȼ ..Ȼ → ȼ ..ȼ Watin-B */ + {0x023d, 0x023d, -163}, /* 1x Ƚ ..Ƚ → ƚ ..ƚ Watin-B */ + {0x0241, 0x0241, +1}, /* 1x Ɂ ..Ɂ → ɂ ..ɂ Watin-B */ + {0x0243, 0x0243, -195}, /* 1x Ƀ ..Ƀ → ƀ ..ƀ Watin-B */ + {0x0244, 0x0244, +69}, /* 1x Ʉ ..Ʉ → ʉ ..ʉ Watin-B */ + {0x0245, 0x0245, +71}, /* 1x Ʌ ..Ʌ → ʌ ..ʌ Watin-B */ + {0x0246, 0x0246, +1}, /* 1x Ɇ ..Ɇ → ɇ ..ɇ Watin-B */ + {0x0248, 0x0248, +1}, /* 1x Ɉ ..Ɉ → ɉ ..ɉ Watin-B */ + {0x024a, 0x024a, +1}, /* 1x Ɋ ..Ɋ → ɋ ..ɋ Watin-B */ + {0x024c, 0x024c, +1}, /* 1x Ɍ ..Ɍ → ɍ ..ɍ Watin-B */ + {0x024e, 0x024e, +1}, /* 1x Ɏ ..Ɏ → ɏ ..ɏ Watin-B */ + {0x0386, 0x0386, +38}, /* 1x Ά ..Ά → ά ..ά Greek */ + {0x0388, 0x038a, +37}, /* 3x Έ ..Ί → έ ..ί Greek */ + {0x038c, 0x038c, +64}, /* 1x Ό ..Ό → ό ..ό Greek */ + {0x038e, 0x038f, +63}, /* 2x Ύ ..Ώ → ύ ..ώ Greek */ + {0x0391, 0x03a1, +32}, /* 17x Α ..Ρ → α ..ρ Greek */ + {0x03a3, 0x03ab, +32}, /* 9x Σ ..Ϋ → σ ..ϋ Greek */ + {0x03dc, 0x03dc, +1}, /* 1x Ϝ ..Ϝ → ϝ ..ϝ Greek */ + {0x03f4, 0x03f4, -60}, /* 1x ϴ ..ϴ → θ ..θ Greek */ + {0x0400, 0x040f, +80}, /* 16x Ѐ ..Џ → ѐ ..џ Cyrillic */ + {0x0410, 0x042f, +32}, /* 32x А ..Я → а ..я Cyrillic */ + {0x0460, 0x0460, +1}, /* 1x Ѡ ..Ѡ → ѡ ..ѡ Cyrillic */ + {0x0462, 0x0462, +1}, /* 1x Ѣ ..Ѣ → ѣ ..ѣ Cyrillic */ + {0x0464, 0x0464, +1}, /* 1x Ѥ ..Ѥ → ѥ ..ѥ Cyrillic */ + {0x0472, 0x0472, +1}, /* 1x Ѳ ..Ѳ → ѳ ..ѳ Cyrillic */ + {0x0490, 0x0490, +1}, /* 1x Ґ ..Ґ → ґ ..ґ Cyrillic */ + {0x0498, 0x0498, +1}, /* 1x Ҙ ..Ҙ → ҙ ..ҙ Cyrillic */ + {0x049a, 0x049a, +1}, /* 1x Қ ..Қ → қ ..қ Cyrillic */ + {0x0531, 0x0556, +48}, /* 38x Ա ..Ֆ → ա ..ֆ Armenian */ + {0x10a0, 0x10c5, +7264}, /* 38x Ⴀ ..Ⴥ → ⴀ ..ⴥ Georgian */ + {0x10c7, 0x10c7, +7264}, /* 1x Ⴧ ..Ⴧ → ⴧ ..ⴧ Georgian */ + {0x10cd, 0x10cd, +7264}, /* 1x Ⴭ ..Ⴭ → ⴭ ..ⴭ Georgian */ + {0x13f0, 0x13f5, +8}, /* 6x Ᏸ ..Ᏽ → ᏸ ..ᏽ Cherokee */ + {0x1c90, 0x1cba, -3008}, /* 43x Ა ..Ჺ → ა ..ჺ Georgian2 */ + {0x1cbd, 0x1cbf, -3008}, /* 3x Ჽ ..Ჿ → ჽ ..ჿ Georgian2 */ + {0x1f08, 0x1f0f, -8}, /* 8x Ἀ ..Ἇ → ἀ ..ἇ Greek2 */ + {0x1f18, 0x1f1d, -8}, /* 6x Ἐ ..Ἕ → ἐ ..ἕ Greek2 */ + {0x1f28, 0x1f2f, -8}, /* 8x Ἠ ..Ἧ → ἠ ..ἧ Greek2 */ + {0x1f38, 0x1f3f, -8}, /* 8x Ἰ ..Ἷ → ἰ ..ἷ Greek2 */ + {0x1f48, 0x1f4d, -8}, /* 6x Ὀ ..Ὅ → ὀ ..ὅ Greek2 */ + {0x1f59, 0x1f59, -8}, /* 1x Ὑ ..Ὑ → ὑ ..ὑ Greek2 */ + {0x1f5b, 0x1f5b, -8}, /* 1x Ὓ ..Ὓ → ὓ ..ὓ Greek2 */ + {0x1f5d, 0x1f5d, -8}, /* 1x Ὕ ..Ὕ → ὕ ..ὕ Greek2 */ + {0x1f5f, 0x1f5f, -8}, /* 1x Ὗ ..Ὗ → ὗ ..ὗ Greek2 */ + {0x1f68, 0x1f6f, -8}, /* 8x Ὠ ..Ὧ → ὠ ..ὧ Greek2 */ + {0x1f88, 0x1f8f, -8}, /* 8x ᾈ ..ᾏ → ᾀ ..ᾇ Greek2 */ + {0x1f98, 0x1f9f, -8}, /* 8x ᾘ ..ᾟ → ᾐ ..ᾗ Greek2 */ + {0x1fa8, 0x1faf, -8}, /* 8x ᾨ ..ᾯ → ᾠ ..ᾧ Greek2 */ + {0x1fb8, 0x1fb9, -8}, /* 2x Ᾰ ..Ᾱ → ᾰ ..ᾱ Greek2 */ + {0x1fba, 0x1fbb, -74}, /* 2x Ὰ ..Ά → ὰ ..ά Greek2 */ + {0x1fbc, 0x1fbc, -9}, /* 1x ᾼ ..ᾼ → ᾳ ..ᾳ Greek2 */ + {0x1fc8, 0x1fcb, -86}, /* 4x Ὲ ..Ή → ὲ ..ή Greek2 */ + {0x1fcc, 0x1fcc, -9}, /* 1x ῌ ..ῌ → ῃ ..ῃ Greek2 */ + {0x1fd8, 0x1fd9, -8}, /* 2x Ῐ ..Ῑ → ῐ ..ῑ Greek2 */ + {0x1fda, 0x1fdb, -100}, /* 2x Ὶ ..Ί → ὶ ..ί Greek2 */ + {0x1fe8, 0x1fe9, -8}, /* 2x Ῠ ..Ῡ → ῠ ..ῡ Greek2 */ + {0x1fea, 0x1feb, -112}, /* 2x Ὺ ..Ύ → ὺ ..ύ Greek2 */ + {0x1fec, 0x1fec, -7}, /* 1x Ῥ ..Ῥ → ῥ ..ῥ Greek2 */ + {0x1ff8, 0x1ff9, -128}, /* 2x Ὸ ..Ό → ὸ ..ό Greek2 */ + {0x1ffa, 0x1ffb, -126}, /* 2x Ὼ ..Ώ → ὼ ..ώ Greek2 */ + {0x1ffc, 0x1ffc, -9}, /* 1x ῼ ..ῼ → ῳ ..ῳ Greek2 */ + {0x2126, 0x2126, -7517}, /* 1x Ω ..Ω → ω ..ω Letterlike */ + {0x212a, 0x212a, -8383}, /* 1x K ..K → k ..k Letterlike */ + {0x212b, 0x212b, -8262}, /* 1x Å ..Å → å ..å Letterlike */ + {0x2132, 0x2132, +28}, /* 1x Ⅎ ..Ⅎ → ⅎ ..ⅎ Letterlike */ + {0x2160, 0x216f, +16}, /* 16x Ⅰ ..Ⅿ → ⅰ ..ⅿ Numbery */ + {0x2183, 0x2183, +1}, /* 1x Ↄ ..Ↄ → ↄ ..ↄ Numbery */ + {0x24b6, 0x24cf, +26}, /* 26x Ⓐ ..Ⓩ → ⓐ ..ⓩ Enclosed */ + {0x2c00, 0x2c2e, +48}, /* 47x Ⰰ ..Ⱞ → ⰰ ..ⱞ Glagolitic */ + {0xff21, 0xff3a, +32}, /* 26x A..Z → a..z Dubs */ }; -static const char32_t kUpperToLowerAstral[][2] = { - {L'ℂ', L'𝕔'}, // 00002102 → 0001d554 - {L'ℋ', L'𝒽'}, // 0000210b → 0001d4bd - {L'ℍ', L'𝕙'}, // 0000210d → 0001d559 - {L'ℐ', L'𝒾'}, // 00002110 → 0001d4be - {L'ℕ', L'𝕟'}, // 00002115 → 0001d55f - {L'ℚ', L'𝕢'}, // 0000211a → 0001d562 - {L'ℛ', L'𝓇'}, // 0000211b → 0001d4c7 - {L'ℝ', L'𝕣'}, // 0000211d → 0001d563 - {L'ℤ', L'𝕫'}, // 00002124 → 0001d56b - {L'ℬ', L'𝒷'}, // 0000212c → 0001d4b7 - {L'ℱ', L'𝒻'}, // 00002131 → 0001d4bb - {L'ℳ', L'𝓂'}, // 00002133 → 0001d4c2 - {L'𐐀', L'𐐨'}, // 00010400 → 00010428 - {L'𐐁', L'𐐩'}, // 00010401 → 00010429 - {L'𐐂', L'𐐪'}, // 00010402 → 0001042a - {L'𐐃', L'𐐫'}, // 00010403 → 0001042b - {L'𐐄', L'𐐬'}, // 00010404 → 0001042c - {L'𐐅', L'𐐭'}, // 00010405 → 0001042d - {L'𐐆', L'𐐮'}, // 00010406 → 0001042e - {L'𐐇', L'𐐯'}, // 00010407 → 0001042f - {L'𐐈', L'𐐰'}, // 00010408 → 00010430 - {L'𐐉', L'𐐱'}, // 00010409 → 00010431 - {L'𐐊', L'𐐲'}, // 0001040a → 00010432 - {L'𐐋', L'𐐳'}, // 0001040b → 00010433 - {L'𐐌', L'𐐴'}, // 0001040c → 00010434 - {L'𐐍', L'𐐵'}, // 0001040d → 00010435 - {L'𐐎', L'𐐶'}, // 0001040e → 00010436 - {L'𐐏', L'𐐷'}, // 0001040f → 00010437 - {L'𐐐', L'𐐸'}, // 00010410 → 00010438 - {L'𐐑', L'𐐹'}, // 00010411 → 00010439 - {L'𐐒', L'𐐺'}, // 00010412 → 0001043a - {L'𐐓', L'𐐻'}, // 00010413 → 0001043b - {L'𐐔', L'𐐼'}, // 00010414 → 0001043c - {L'𐐕', L'𐐽'}, // 00010415 → 0001043d - {L'𐐖', L'𐐾'}, // 00010416 → 0001043e - {L'𐐗', L'𐐿'}, // 00010417 → 0001043f - {L'𐐘', L'𐑀'}, // 00010418 → 00010440 - {L'𐐙', L'𐑁'}, // 00010419 → 00010441 - {L'𐐚', L'𐑂'}, // 0001041a → 00010442 - {L'𐐛', L'𐑃'}, // 0001041b → 00010443 - {L'𐐜', L'𐑄'}, // 0001041c → 00010444 - {L'𐐝', L'𐑅'}, // 0001041d → 00010445 - {L'𐐞', L'𐑆'}, // 0001041e → 00010446 - {L'𐐟', L'𐑇'}, // 0001041f → 00010447 - {L'𐐠', L'𐑈'}, // 00010420 → 00010448 - {L'𐐡', L'𐑉'}, // 00010421 → 00010449 - {L'𐐢', L'𐑊'}, // 00010422 → 0001044a - {L'𐐣', L'𐑋'}, // 00010423 → 0001044b - {L'𐐤', L'𐑌'}, // 00010424 → 0001044c - {L'𐐥', L'𐑍'}, // 00010425 → 0001044d - {L'𐐦', L'𐑎'}, // 00010426 → 0001044e - {L'𐐧', L'𐑏'}, // 00010427 → 0001044f - {L'𐒰', L'𐓘'}, // 000104b0 → 000104d8 - {L'𐒱', L'𐓙'}, // 000104b1 → 000104d9 - {L'𐒲', L'𐓚'}, // 000104b2 → 000104da - {L'𐒳', L'𐓛'}, // 000104b3 → 000104db - {L'𐒴', L'𐓜'}, // 000104b4 → 000104dc - {L'𐒵', L'𐓝'}, // 000104b5 → 000104dd - {L'𐒶', L'𐓞'}, // 000104b6 → 000104de - {L'𐒷', L'𐓟'}, // 000104b7 → 000104df - {L'𐒸', L'𐓠'}, // 000104b8 → 000104e0 - {L'𐒹', L'𐓡'}, // 000104b9 → 000104e1 - {L'𐒺', L'𐓢'}, // 000104ba → 000104e2 - {L'𐒻', L'𐓣'}, // 000104bb → 000104e3 - {L'𐒼', L'𐓤'}, // 000104bc → 000104e4 - {L'𐒽', L'𐓥'}, // 000104bd → 000104e5 - {L'𐒾', L'𐓦'}, // 000104be → 000104e6 - {L'𐒿', L'𐓧'}, // 000104bf → 000104e7 - {L'𐓀', L'𐓨'}, // 000104c0 → 000104e8 - {L'𐓁', L'𐓩'}, // 000104c1 → 000104e9 - {L'𐓂', L'𐓪'}, // 000104c2 → 000104ea - {L'𐓃', L'𐓫'}, // 000104c3 → 000104eb - {L'𐓄', L'𐓬'}, // 000104c4 → 000104ec - {L'𐓅', L'𐓭'}, // 000104c5 → 000104ed - {L'𐓆', L'𐓮'}, // 000104c6 → 000104ee - {L'𐓇', L'𐓯'}, // 000104c7 → 000104ef - {L'𐓈', L'𐓰'}, // 000104c8 → 000104f0 - {L'𐓉', L'𐓱'}, // 000104c9 → 000104f1 - {L'𐓊', L'𐓲'}, // 000104ca → 000104f2 - {L'𐓋', L'𐓳'}, // 000104cb → 000104f3 - {L'𐓌', L'𐓴'}, // 000104cc → 000104f4 - {L'𐓍', L'𐓵'}, // 000104cd → 000104f5 - {L'𐓎', L'𐓶'}, // 000104ce → 000104f6 - {L'𐓏', L'𐓷'}, // 000104cf → 000104f7 - {L'𐓐', L'𐓸'}, // 000104d0 → 000104f8 - {L'𐓑', L'𐓹'}, // 000104d1 → 000104f9 - {L'𐓒', L'𐓺'}, // 000104d2 → 000104fa - {L'𐓓', L'𐓻'}, // 000104d3 → 000104fb - {L'𐲀', L'𐳀'}, // 00010c80 → 00010cc0 - {L'𐲁', L'𐳁'}, // 00010c81 → 00010cc1 - {L'𐲂', L'𐳂'}, // 00010c82 → 00010cc2 - {L'𐲃', L'𐳃'}, // 00010c83 → 00010cc3 - {L'𐲄', L'𐳄'}, // 00010c84 → 00010cc4 - {L'𐲅', L'𐳅'}, // 00010c85 → 00010cc5 - {L'𐲆', L'𐳆'}, // 00010c86 → 00010cc6 - {L'𐲇', L'𐳇'}, // 00010c87 → 00010cc7 - {L'𐲈', L'𐳈'}, // 00010c88 → 00010cc8 - {L'𐲉', L'𐳂'}, // 00010c89 → 00010cc2 - {L'𐲊', L'𐳊'}, // 00010c8a → 00010cca - {L'𐲋', L'𐳋'}, // 00010c8b → 00010ccb - {L'𐲌', L'𐳌'}, // 00010c8c → 00010ccc - {L'𐲍', L'𐳍'}, // 00010c8d → 00010ccd - {L'𐲎', L'𐳎'}, // 00010c8e → 00010cce - {L'𐲏', L'𐳏'}, // 00010c8f → 00010ccf - {L'𐲐', L'𐳐'}, // 00010c90 → 00010cd0 - {L'𐲑', L'𐳑'}, // 00010c91 → 00010cd1 - {L'𐲒', L'𐳒'}, // 00010c92 → 00010cd2 - {L'𐲓', L'𐳓'}, // 00010c93 → 00010cd3 - {L'𐲔', L'𐳔'}, // 00010c94 → 00010cd4 - {L'𐲕', L'𐳕'}, // 00010c95 → 00010cd5 - {L'𐲖', L'𐳖'}, // 00010c96 → 00010cd6 - {L'𐲗', L'𐳗'}, // 00010c97 → 00010cd7 - {L'𐲘', L'𐳘'}, // 00010c98 → 00010cd8 - {L'𐲙', L'𐳅'}, // 00010c99 → 00010cc5 - {L'𐲚', L'𐳚'}, // 00010c9a → 00010cda - {L'𐲛', L'𐳛'}, // 00010c9b → 00010cdb - {L'𐲜', L'𐳜'}, // 00010c9c → 00010cdc - {L'𐲝', L'𐳝'}, // 00010c9d → 00010cdd - {L'𐲞', L'𐳞'}, // 00010c9e → 00010cde - {L'𐲟', L'𐳟'}, // 00010c9f → 00010cdf - {L'𐲠', L'𐳠'}, // 00010ca0 → 00010ce0 - {L'𐲡', L'𐳡'}, // 00010ca1 → 00010ce1 - {L'𐲢', L'𐳢'}, // 00010ca2 → 00010ce2 - {L'𐲣', L'𐳣'}, // 00010ca3 → 00010ce3 - {L'𐲤', L'𐳤'}, // 00010ca4 → 00010ce4 - {L'𐲥', L'𐳥'}, // 00010ca5 → 00010ce5 - {L'𐲦', L'𐳦'}, // 00010ca6 → 00010ce6 - {L'𐲧', L'𐳧'}, // 00010ca7 → 00010ce7 - {L'𐲨', L'𐳨'}, // 00010ca8 → 00010ce8 - {L'𐲩', L'𐳩'}, // 00010ca9 → 00010ce9 - {L'𐲪', L'𐳕'}, // 00010caa → 00010cd5 - {L'𐲫', L'𐳫'}, // 00010cab → 00010ceb - {L'𐲬', L'𐳬'}, // 00010cac → 00010cec - {L'𐲭', L'𐳭'}, // 00010cad → 00010ced - {L'𐲮', L'𐳮'}, // 00010cae → 00010cee - {L'𐲯', L'𐳯'}, // 00010caf → 00010cef - {L'𐲰', L'𐳰'}, // 00010cb0 → 00010cf0 - {L'𐲱', L'𐳱'}, // 00010cb1 → 00010cf1 - {L'𐲲', L'𐳲'}, // 00010cb2 → 00010cf2 - {L'𑢠', L'𑣀'}, // 000118a0 → 000118c0 - {L'𑢡', L'𑣁'}, // 000118a1 → 000118c1 - {L'𑢢', L'𑣂'}, // 000118a2 → 000118c2 - {L'𑢣', L'𑣃'}, // 000118a3 → 000118c3 - {L'𑢤', L'𑣄'}, // 000118a4 → 000118c4 - {L'𑢥', L'𑣅'}, // 000118a5 → 000118c5 - {L'𑢦', L'𑣆'}, // 000118a6 → 000118c6 - {L'𑢧', L'𑣇'}, // 000118a7 → 000118c7 - {L'𑢨', L'𑣈'}, // 000118a8 → 000118c8 - {L'𑢩', L'𑣉'}, // 000118a9 → 000118c9 - {L'𑢪', L'𑣊'}, // 000118aa → 000118ca - {L'𑢫', L'𑣋'}, // 000118ab → 000118cb - {L'𑢬', L'𑣌'}, // 000118ac → 000118cc - {L'𑢭', L'𑣍'}, // 000118ad → 000118cd - {L'𑢮', L'𑣎'}, // 000118ae → 000118ce - {L'𑢯', L'𑣏'}, // 000118af → 000118cf - {L'𑢰', L'𑣐'}, // 000118b0 → 000118d0 - {L'𑢱', L'𑣑'}, // 000118b1 → 000118d1 - {L'𑢲', L'𑣒'}, // 000118b2 → 000118d2 - {L'𑢳', L'𑣓'}, // 000118b3 → 000118d3 - {L'𑢴', L'𑣔'}, // 000118b4 → 000118d4 - {L'𑢵', L'𑣕'}, // 000118b5 → 000118d5 - {L'𑢶', L'𑣖'}, // 000118b6 → 000118d6 - {L'𑢷', L'𑣗'}, // 000118b7 → 000118d7 - {L'𑢸', L'𑣘'}, // 000118b8 → 000118d8 - {L'𑢹', L'𑣙'}, // 000118b9 → 000118d9 - {L'𑢺', L'𑣚'}, // 000118ba → 000118da - {L'𑢻', L'𑣛'}, // 000118bb → 000118db - {L'𑢼', L'𑣜'}, // 000118bc → 000118dc - {L'𑢽', L'𑣝'}, // 000118bd → 000118dd - {L'𑢾', L'𑣞'}, // 000118be → 000118de - {L'𑢿', L'𑣟'}, // 000118bf → 000118df - {L'𖹀', L'𖹠'}, // 00016e40 → 00016e60 - {L'𖹁', L'𖹡'}, // 00016e41 → 00016e61 - {L'𖹂', L'𖹢'}, // 00016e42 → 00016e62 - {L'𖹃', L'𖹣'}, // 00016e43 → 00016e63 - {L'𖹄', L'𖹤'}, // 00016e44 → 00016e64 - {L'𖹅', L'𖹥'}, // 00016e45 → 00016e65 - {L'𖹆', L'𖹦'}, // 00016e46 → 00016e66 - {L'𖹇', L'𖹧'}, // 00016e47 → 00016e67 - {L'𖹈', L'𖹨'}, // 00016e48 → 00016e68 - {L'𖹉', L'𖹩'}, // 00016e49 → 00016e69 - {L'𖹊', L'𖹪'}, // 00016e4a → 00016e6a - {L'𖹋', L'𖹫'}, // 00016e4b → 00016e6b - {L'𖹌', L'𖹬'}, // 00016e4c → 00016e6c - {L'𖹍', L'𖹭'}, // 00016e4d → 00016e6d - {L'𖹎', L'𖹮'}, // 00016e4e → 00016e6e - {L'𖹏', L'𖹯'}, // 00016e4f → 00016e6f - {L'𖹐', L'𖹰'}, // 00016e50 → 00016e70 - {L'𖹑', L'𖹱'}, // 00016e51 → 00016e71 - {L'𖹒', L'𖹲'}, // 00016e52 → 00016e72 - {L'𖹓', L'𖹳'}, // 00016e53 → 00016e73 - {L'𖹔', L'𖹴'}, // 00016e54 → 00016e74 - {L'𖹕', L'𖹵'}, // 00016e55 → 00016e75 - {L'𖹖', L'𖹶'}, // 00016e56 → 00016e76 - {L'𖹗', L'𖹷'}, // 00016e57 → 00016e77 - {L'𖹘', L'𖹸'}, // 00016e58 → 00016e78 - {L'𖹙', L'𖹹'}, // 00016e59 → 00016e79 - {L'𖹚', L'𖹺'}, // 00016e5a → 00016e7a - {L'𖹛', L'𖹻'}, // 00016e5b → 00016e7b - {L'𖹜', L'𖹼'}, // 00016e5c → 00016e7c - {L'𖹝', L'𖹽'}, // 00016e5d → 00016e7d - {L'𖹞', L'𖹾'}, // 00016e5e → 00016e7e - {L'𖹟', L'𖹿'}, // 00016e5f → 00016e7f - {L'𝐀', L'𝐚'}, // 0001d400 → 0001d41a - {L'𝐁', L'𝐛'}, // 0001d401 → 0001d41b - {L'𝐂', L'𝐜'}, // 0001d402 → 0001d41c - {L'𝐃', L'𝐝'}, // 0001d403 → 0001d41d - {L'𝐄', L'𝐞'}, // 0001d404 → 0001d41e - {L'𝐅', L'𝐟'}, // 0001d405 → 0001d41f - {L'𝐆', L'𝐠'}, // 0001d406 → 0001d420 - {L'𝐇', L'𝐡'}, // 0001d407 → 0001d421 - {L'𝐈', L'𝐢'}, // 0001d408 → 0001d422 - {L'𝐉', L'𝐣'}, // 0001d409 → 0001d423 - {L'𝐊', L'𝐤'}, // 0001d40a → 0001d424 - {L'𝐋', L'𝐥'}, // 0001d40b → 0001d425 - {L'𝐌', L'𝐦'}, // 0001d40c → 0001d426 - {L'𝐍', L'𝐧'}, // 0001d40d → 0001d427 - {L'𝐎', L'𝐨'}, // 0001d40e → 0001d428 - {L'𝐏', L'𝐩'}, // 0001d40f → 0001d429 - {L'𝐐', L'𝐪'}, // 0001d410 → 0001d42a - {L'𝐑', L'𝐫'}, // 0001d411 → 0001d42b - {L'𝐒', L'𝐬'}, // 0001d412 → 0001d42c - {L'𝐓', L'𝐭'}, // 0001d413 → 0001d42d - {L'𝐔', L'𝐮'}, // 0001d414 → 0001d42e - {L'𝐕', L'𝐯'}, // 0001d415 → 0001d42f - {L'𝐖', L'𝐰'}, // 0001d416 → 0001d430 - {L'𝐗', L'𝐱'}, // 0001d417 → 0001d431 - {L'𝐘', L'𝐲'}, // 0001d418 → 0001d432 - {L'𝐙', L'𝐳'}, // 0001d419 → 0001d433 - {L'𝐴', L'𝑎'}, // 0001d434 → 0001d44e - {L'𝐵', L'𝑏'}, // 0001d435 → 0001d44f - {L'𝐶', L'𝑐'}, // 0001d436 → 0001d450 - {L'𝐷', L'𝑑'}, // 0001d437 → 0001d451 - {L'𝐸', L'𝑒'}, // 0001d438 → 0001d452 - {L'𝐹', L'𝑓'}, // 0001d439 → 0001d453 - {L'𝐺', L'𝑔'}, // 0001d43a → 0001d454 - {L'𝐼', L'𝑖'}, // 0001d43c → 0001d456 - {L'𝐽', L'𝑗'}, // 0001d43d → 0001d457 - {L'𝐾', L'𝑘'}, // 0001d43e → 0001d458 - {L'𝐿', L'𝑙'}, // 0001d43f → 0001d459 - {L'𝑀', L'𝑚'}, // 0001d440 → 0001d45a - {L'𝑁', L'𝑛'}, // 0001d441 → 0001d45b - {L'𝑂', L'𝑜'}, // 0001d442 → 0001d45c - {L'𝑃', L'𝑝'}, // 0001d443 → 0001d45d - {L'𝑄', L'𝑞'}, // 0001d444 → 0001d45e - {L'𝑅', L'𝑟'}, // 0001d445 → 0001d45f - {L'𝑆', L'𝑠'}, // 0001d446 → 0001d460 - {L'𝑇', L'𝑡'}, // 0001d447 → 0001d461 - {L'𝑈', L'𝑢'}, // 0001d448 → 0001d462 - {L'𝑉', L'𝑣'}, // 0001d449 → 0001d463 - {L'𝑊', L'𝑤'}, // 0001d44a → 0001d464 - {L'𝑋', L'𝑥'}, // 0001d44b → 0001d465 - {L'𝑌', L'𝑦'}, // 0001d44c → 0001d466 - {L'𝑍', L'𝑧'}, // 0001d44d → 0001d467 - {L'𝑨', L'𝒂'}, // 0001d468 → 0001d482 - {L'𝑩', L'𝒃'}, // 0001d469 → 0001d483 - {L'𝑪', L'𝒄'}, // 0001d46a → 0001d484 - {L'𝑫', L'𝒅'}, // 0001d46b → 0001d485 - {L'𝑬', L'𝒆'}, // 0001d46c → 0001d486 - {L'𝑭', L'𝒇'}, // 0001d46d → 0001d487 - {L'𝑮', L'𝒈'}, // 0001d46e → 0001d488 - {L'𝑯', L'𝒉'}, // 0001d46f → 0001d489 - {L'𝑰', L'𝒊'}, // 0001d470 → 0001d48a - {L'𝑱', L'𝒋'}, // 0001d471 → 0001d48b - {L'𝑲', L'𝒌'}, // 0001d472 → 0001d48c - {L'𝑳', L'𝒍'}, // 0001d473 → 0001d48d - {L'𝑴', L'𝒎'}, // 0001d474 → 0001d48e - {L'𝑵', L'𝒏'}, // 0001d475 → 0001d48f - {L'𝑶', L'𝒐'}, // 0001d476 → 0001d490 - {L'𝑷', L'𝒑'}, // 0001d477 → 0001d491 - {L'𝑸', L'𝒒'}, // 0001d478 → 0001d492 - {L'𝑹', L'𝒓'}, // 0001d479 → 0001d493 - {L'𝑺', L'𝒔'}, // 0001d47a → 0001d494 - {L'𝑻', L'𝒕'}, // 0001d47b → 0001d495 - {L'𝑼', L'𝒖'}, // 0001d47c → 0001d496 - {L'𝑽', L'𝒗'}, // 0001d47d → 0001d497 - {L'𝑾', L'𝒘'}, // 0001d47e → 0001d498 - {L'𝑿', L'𝒙'}, // 0001d47f → 0001d499 - {L'𝒀', L'𝒚'}, // 0001d480 → 0001d49a - {L'𝒁', L'𝒛'}, // 0001d481 → 0001d49b - {L'𝒜', L'𝒶'}, // 0001d49c → 0001d4b6 - {L'𝒞', L'𝒸'}, // 0001d49e → 0001d4b8 - {L'𝒟', L'𝒹'}, // 0001d49f → 0001d4b9 - {L'𝒥', L'𝒿'}, // 0001d4a5 → 0001d4bf - {L'𝒦', L'𝓀'}, // 0001d4a6 → 0001d4c0 - {L'𝒩', L'𝓃'}, // 0001d4a9 → 0001d4c3 - {L'𝒫', L'𝓅'}, // 0001d4ab → 0001d4c5 - {L'𝒬', L'𝓆'}, // 0001d4ac → 0001d4c6 - {L'𝒮', L'𝓈'}, // 0001d4ae → 0001d4c8 - {L'𝒯', L'𝓉'}, // 0001d4af → 0001d4c9 - {L'𝒰', L'𝓊'}, // 0001d4b0 → 0001d4ca - {L'𝒱', L'𝓋'}, // 0001d4b1 → 0001d4cb - {L'𝒲', L'𝓌'}, // 0001d4b2 → 0001d4cc - {L'𝒳', L'𝓍'}, // 0001d4b3 → 0001d4cd - {L'𝒴', L'𝓎'}, // 0001d4b4 → 0001d4ce - {L'𝒵', L'𝓏'}, // 0001d4b5 → 0001d4cf - {L'𝓐', L'𝓪'}, // 0001d4d0 → 0001d4ea - {L'𝓑', L'𝓫'}, // 0001d4d1 → 0001d4eb - {L'𝓒', L'𝓬'}, // 0001d4d2 → 0001d4ec - {L'𝓓', L'𝓭'}, // 0001d4d3 → 0001d4ed - {L'𝓔', L'𝓮'}, // 0001d4d4 → 0001d4ee - {L'𝓕', L'𝓯'}, // 0001d4d5 → 0001d4ef - {L'𝓖', L'𝓰'}, // 0001d4d6 → 0001d4f0 - {L'𝓗', L'𝓱'}, // 0001d4d7 → 0001d4f1 - {L'𝓘', L'𝓲'}, // 0001d4d8 → 0001d4f2 - {L'𝓙', L'𝓳'}, // 0001d4d9 → 0001d4f3 - {L'𝓚', L'𝓴'}, // 0001d4da → 0001d4f4 - {L'𝓛', L'𝓵'}, // 0001d4db → 0001d4f5 - {L'𝓜', L'𝓶'}, // 0001d4dc → 0001d4f6 - {L'𝓝', L'𝓷'}, // 0001d4dd → 0001d4f7 - {L'𝓞', L'𝓸'}, // 0001d4de → 0001d4f8 - {L'𝓟', L'𝓹'}, // 0001d4df → 0001d4f9 - {L'𝓠', L'𝓺'}, // 0001d4e0 → 0001d4fa - {L'𝓡', L'𝓻'}, // 0001d4e1 → 0001d4fb - {L'𝓢', L'𝓼'}, // 0001d4e2 → 0001d4fc - {L'𝓣', L'𝓽'}, // 0001d4e3 → 0001d4fd - {L'𝓤', L'𝓾'}, // 0001d4e4 → 0001d4fe - {L'𝓥', L'𝓿'}, // 0001d4e5 → 0001d4ff - {L'𝓦', L'𝔀'}, // 0001d4e6 → 0001d500 - {L'𝓧', L'𝔁'}, // 0001d4e7 → 0001d501 - {L'𝓨', L'𝔂'}, // 0001d4e8 → 0001d502 - {L'𝓩', L'𝔃'}, // 0001d4e9 → 0001d503 - {L'𝔄', L'𝔞'}, // 0001d504 → 0001d51e - {L'𝔅', L'𝔟'}, // 0001d505 → 0001d51f - {L'𝔇', L'𝔡'}, // 0001d507 → 0001d521 - {L'𝔈', L'𝔢'}, // 0001d508 → 0001d522 - {L'𝔉', L'𝔣'}, // 0001d509 → 0001d523 - {L'𝔊', L'𝔤'}, // 0001d50a → 0001d524 - {L'𝔍', L'𝔧'}, // 0001d50d → 0001d527 - {L'𝔎', L'𝔨'}, // 0001d50e → 0001d528 - {L'𝔏', L'𝔩'}, // 0001d50f → 0001d529 - {L'𝔐', L'𝔪'}, // 0001d510 → 0001d52a - {L'𝔑', L'𝔫'}, // 0001d511 → 0001d52b - {L'𝔒', L'𝔬'}, // 0001d512 → 0001d52c - {L'𝔓', L'𝔭'}, // 0001d513 → 0001d52d - {L'𝔔', L'𝔮'}, // 0001d514 → 0001d52e - {L'𝔖', L'𝔰'}, // 0001d516 → 0001d530 - {L'𝔗', L'𝔱'}, // 0001d517 → 0001d531 - {L'𝔘', L'𝔲'}, // 0001d518 → 0001d532 - {L'𝔙', L'𝔳'}, // 0001d519 → 0001d533 - {L'𝔚', L'𝔴'}, // 0001d51a → 0001d534 - {L'𝔛', L'𝔵'}, // 0001d51b → 0001d535 - {L'𝔜', L'𝔶'}, // 0001d51c → 0001d536 - {L'𝔸', L'𝕒'}, // 0001d538 → 0001d552 - {L'𝔹', L'𝕓'}, // 0001d539 → 0001d553 - {L'𝔻', L'𝕕'}, // 0001d53b → 0001d555 - {L'𝔼', L'𝕖'}, // 0001d53c → 0001d556 - {L'𝔽', L'𝕗'}, // 0001d53d → 0001d557 - {L'𝕀', L'𝕚'}, // 0001d540 → 0001d55a - {L'𝕁', L'𝕛'}, // 0001d541 → 0001d55b - {L'𝕂', L'𝕜'}, // 0001d542 → 0001d55c - {L'𝕃', L'𝕝'}, // 0001d543 → 0001d55d - {L'𝕄', L'𝕞'}, // 0001d544 → 0001d55e - {L'𝕆', L'𝕠'}, // 0001d546 → 0001d560 - {L'𝕊', L'𝕤'}, // 0001d54a → 0001d564 - {L'𝕋', L'𝕥'}, // 0001d54b → 0001d565 - {L'𝕌', L'𝕦'}, // 0001d54c → 0001d566 - {L'𝕍', L'𝕧'}, // 0001d54d → 0001d567 - {L'𝕎', L'𝕨'}, // 0001d54e → 0001d568 - {L'𝕏', L'𝕩'}, // 0001d54f → 0001d569 - {L'𝕐', L'𝕪'}, // 0001d550 → 0001d56a - {L'𝕬', L'𝖆'}, // 0001d56c → 0001d586 - {L'𝕭', L'𝖇'}, // 0001d56d → 0001d587 - {L'𝕮', L'𝖈'}, // 0001d56e → 0001d588 - {L'𝕯', L'𝖉'}, // 0001d56f → 0001d589 - {L'𝕰', L'𝖊'}, // 0001d570 → 0001d58a - {L'𝕱', L'𝖋'}, // 0001d571 → 0001d58b - {L'𝕲', L'𝖌'}, // 0001d572 → 0001d58c - {L'𝕳', L'𝖍'}, // 0001d573 → 0001d58d - {L'𝕴', L'𝖎'}, // 0001d574 → 0001d58e - {L'𝕵', L'𝖏'}, // 0001d575 → 0001d58f - {L'𝕶', L'𝖐'}, // 0001d576 → 0001d590 - {L'𝕷', L'𝖑'}, // 0001d577 → 0001d591 - {L'𝕸', L'𝖒'}, // 0001d578 → 0001d592 - {L'𝕹', L'𝖓'}, // 0001d579 → 0001d593 - {L'𝕺', L'𝖔'}, // 0001d57a → 0001d594 - {L'𝕻', L'𝖕'}, // 0001d57b → 0001d595 - {L'𝕼', L'𝖖'}, // 0001d57c → 0001d596 - {L'𝕽', L'𝖗'}, // 0001d57d → 0001d597 - {L'𝕾', L'𝖘'}, // 0001d57e → 0001d598 - {L'𝕿', L'𝖙'}, // 0001d57f → 0001d599 - {L'𝖀', L'𝖚'}, // 0001d580 → 0001d59a - {L'𝖁', L'𝖛'}, // 0001d581 → 0001d59b - {L'𝖂', L'𝖜'}, // 0001d582 → 0001d59c - {L'𝖃', L'𝖝'}, // 0001d583 → 0001d59d - {L'𝖄', L'𝖞'}, // 0001d584 → 0001d59e - {L'𝖅', L'𝖟'}, // 0001d585 → 0001d59f - {L'𝖠', L'𝖺'}, // 0001d5a0 → 0001d5ba - {L'𝖡', L'𝖻'}, // 0001d5a1 → 0001d5bb - {L'𝖢', L'𝖼'}, // 0001d5a2 → 0001d5bc - {L'𝖣', L'𝖽'}, // 0001d5a3 → 0001d5bd - {L'𝖤', L'𝖾'}, // 0001d5a4 → 0001d5be - {L'𝖥', L'𝖿'}, // 0001d5a5 → 0001d5bf - {L'𝖦', L'𝗀'}, // 0001d5a6 → 0001d5c0 - {L'𝖧', L'𝗁'}, // 0001d5a7 → 0001d5c1 - {L'𝖨', L'𝗂'}, // 0001d5a8 → 0001d5c2 - {L'𝖩', L'𝗃'}, // 0001d5a9 → 0001d5c3 - {L'𝖪', L'𝗄'}, // 0001d5aa → 0001d5c4 - {L'𝖫', L'𝗅'}, // 0001d5ab → 0001d5c5 - {L'𝖬', L'𝗆'}, // 0001d5ac → 0001d5c6 - {L'𝖭', L'𝗇'}, // 0001d5ad → 0001d5c7 - {L'𝖮', L'𝗈'}, // 0001d5ae → 0001d5c8 - {L'𝖯', L'𝗉'}, // 0001d5af → 0001d5c9 - {L'𝖰', L'𝗊'}, // 0001d5b0 → 0001d5ca - {L'𝖱', L'𝗋'}, // 0001d5b1 → 0001d5cb - {L'𝖲', L'𝗌'}, // 0001d5b2 → 0001d5cc - {L'𝖳', L'𝗍'}, // 0001d5b3 → 0001d5cd - {L'𝖴', L'𝗎'}, // 0001d5b4 → 0001d5ce - {L'𝖵', L'𝗏'}, // 0001d5b5 → 0001d5cf - {L'𝖶', L'𝗐'}, // 0001d5b6 → 0001d5d0 - {L'𝖷', L'𝗑'}, // 0001d5b7 → 0001d5d1 - {L'𝖸', L'𝗒'}, // 0001d5b8 → 0001d5d2 - {L'𝖹', L'𝗓'}, // 0001d5b9 → 0001d5d3 - {L'𝗔', L'𝗮'}, // 0001d5d4 → 0001d5ee - {L'𝗕', L'𝗯'}, // 0001d5d5 → 0001d5ef - {L'𝗖', L'𝗰'}, // 0001d5d6 → 0001d5f0 - {L'𝗗', L'𝗱'}, // 0001d5d7 → 0001d5f1 - {L'𝗘', L'𝗲'}, // 0001d5d8 → 0001d5f2 - {L'𝗙', L'𝗳'}, // 0001d5d9 → 0001d5f3 - {L'𝗚', L'𝗴'}, // 0001d5da → 0001d5f4 - {L'𝗛', L'𝗵'}, // 0001d5db → 0001d5f5 - {L'𝗜', L'𝗶'}, // 0001d5dc → 0001d5f6 - {L'𝗝', L'𝗷'}, // 0001d5dd → 0001d5f7 - {L'𝗞', L'𝗸'}, // 0001d5de → 0001d5f8 - {L'𝗟', L'𝗹'}, // 0001d5df → 0001d5f9 - {L'𝗠', L'𝗺'}, // 0001d5e0 → 0001d5fa - {L'𝗡', L'𝗻'}, // 0001d5e1 → 0001d5fb - {L'𝗢', L'𝗼'}, // 0001d5e2 → 0001d5fc - {L'𝗣', L'𝗽'}, // 0001d5e3 → 0001d5fd - {L'𝗤', L'𝗾'}, // 0001d5e4 → 0001d5fe - {L'𝗥', L'𝗿'}, // 0001d5e5 → 0001d5ff - {L'𝗦', L'𝘀'}, // 0001d5e6 → 0001d600 - {L'𝗧', L'𝘁'}, // 0001d5e7 → 0001d601 - {L'𝗨', L'𝘂'}, // 0001d5e8 → 0001d602 - {L'𝗩', L'𝘃'}, // 0001d5e9 → 0001d603 - {L'𝗪', L'𝘄'}, // 0001d5ea → 0001d604 - {L'𝗫', L'𝘅'}, // 0001d5eb → 0001d605 - {L'𝗬', L'𝘆'}, // 0001d5ec → 0001d606 - {L'𝗭', L'𝘇'}, // 0001d5ed → 0001d607 - {L'𝘈', L'𝘢'}, // 0001d608 → 0001d622 - {L'𝘉', L'𝘣'}, // 0001d609 → 0001d623 - {L'𝘊', L'𝘤'}, // 0001d60a → 0001d624 - {L'𝘋', L'𝘥'}, // 0001d60b → 0001d625 - {L'𝘌', L'𝘦'}, // 0001d60c → 0001d626 - {L'𝘍', L'𝘧'}, // 0001d60d → 0001d627 - {L'𝘎', L'𝘨'}, // 0001d60e → 0001d628 - {L'𝘏', L'𝘩'}, // 0001d60f → 0001d629 - {L'𝘐', L'𝘪'}, // 0001d610 → 0001d62a - {L'𝘑', L'𝘫'}, // 0001d611 → 0001d62b - {L'𝘒', L'𝘬'}, // 0001d612 → 0001d62c - {L'𝘓', L'𝘭'}, // 0001d613 → 0001d62d - {L'𝘔', L'𝘮'}, // 0001d614 → 0001d62e - {L'𝘕', L'𝘯'}, // 0001d615 → 0001d62f - {L'𝘖', L'𝘰'}, // 0001d616 → 0001d630 - {L'𝘗', L'𝘱'}, // 0001d617 → 0001d631 - {L'𝘘', L'𝘲'}, // 0001d618 → 0001d632 - {L'𝘙', L'𝘳'}, // 0001d619 → 0001d633 - {L'𝘚', L'𝘴'}, // 0001d61a → 0001d634 - {L'𝘛', L'𝘵'}, // 0001d61b → 0001d635 - {L'𝘜', L'𝘶'}, // 0001d61c → 0001d636 - {L'𝘝', L'𝘷'}, // 0001d61d → 0001d637 - {L'𝘞', L'𝘸'}, // 0001d61e → 0001d638 - {L'𝘟', L'𝘹'}, // 0001d61f → 0001d639 - {L'𝘠', L'𝘺'}, // 0001d620 → 0001d63a - {L'𝘡', L'𝘻'}, // 0001d621 → 0001d63b - {L'𝘼', L'𝒂'}, // 0001d63c → 0001d482 - {L'𝘽', L'𝒃'}, // 0001d63d → 0001d483 - {L'𝘾', L'𝒄'}, // 0001d63e → 0001d484 - {L'𝘿', L'𝒅'}, // 0001d63f → 0001d485 - {L'𝙀', L'𝒆'}, // 0001d640 → 0001d486 - {L'𝙁', L'𝒇'}, // 0001d641 → 0001d487 - {L'𝙂', L'𝒈'}, // 0001d642 → 0001d488 - {L'𝙃', L'𝒉'}, // 0001d643 → 0001d489 - {L'𝙄', L'𝒊'}, // 0001d644 → 0001d48a - {L'𝙅', L'𝒋'}, // 0001d645 → 0001d48b - {L'𝙆', L'𝒌'}, // 0001d646 → 0001d48c - {L'𝙇', L'𝒍'}, // 0001d647 → 0001d48d - {L'𝙈', L'𝒎'}, // 0001d648 → 0001d48e - {L'𝙉', L'𝒏'}, // 0001d649 → 0001d48f - {L'𝙊', L'𝒐'}, // 0001d64a → 0001d490 - {L'𝙋', L'𝒑'}, // 0001d64b → 0001d491 - {L'𝙌', L'𝒒'}, // 0001d64c → 0001d492 - {L'𝙍', L'𝒓'}, // 0001d64d → 0001d493 - {L'𝙎', L'𝒔'}, // 0001d64e → 0001d494 - {L'𝙏', L'𝒕'}, // 0001d64f → 0001d495 - {L'𝙐', L'𝒖'}, // 0001d650 → 0001d496 - {L'𝙑', L'𝒗'}, // 0001d651 → 0001d497 - {L'𝙒', L'𝒘'}, // 0001d652 → 0001d498 - {L'𝙓', L'𝒙'}, // 0001d653 → 0001d499 - {L'𝙔', L'𝒚'}, // 0001d654 → 0001d49a - {L'𝙕', L'𝒛'}, // 0001d655 → 0001d49b - {L'𝙰', L'𝚊'}, // 0001d670 → 0001d68a - {L'𝙱', L'𝚋'}, // 0001d671 → 0001d68b - {L'𝙲', L'𝚌'}, // 0001d672 → 0001d68c - {L'𝙳', L'𝚍'}, // 0001d673 → 0001d68d - {L'𝙴', L'𝚎'}, // 0001d674 → 0001d68e - {L'𝙵', L'𝚏'}, // 0001d675 → 0001d68f - {L'𝙶', L'𝚐'}, // 0001d676 → 0001d690 - {L'𝙷', L'𝚑'}, // 0001d677 → 0001d691 - {L'𝙸', L'𝚒'}, // 0001d678 → 0001d692 - {L'𝙹', L'𝚓'}, // 0001d679 → 0001d693 - {L'𝙺', L'𝚔'}, // 0001d67a → 0001d694 - {L'𝙻', L'𝚕'}, // 0001d67b → 0001d695 - {L'𝙼', L'𝚖'}, // 0001d67c → 0001d696 - {L'𝙽', L'𝚗'}, // 0001d67d → 0001d697 - {L'𝙾', L'𝚘'}, // 0001d67e → 0001d698 - {L'𝙿', L'𝚙'}, // 0001d67f → 0001d699 - {L'𝚀', L'𝚚'}, // 0001d680 → 0001d69a - {L'𝚁', L'𝚛'}, // 0001d681 → 0001d69b - {L'𝚂', L'𝚜'}, // 0001d682 → 0001d69c - {L'𝚃', L'𝚝'}, // 0001d683 → 0001d69d - {L'𝚄', L'𝚞'}, // 0001d684 → 0001d69e - {L'𝚅', L'𝚟'}, // 0001d685 → 0001d69f - {L'𝚆', L'𝚠'}, // 0001d686 → 0001d6a0 - {L'𝚇', L'𝚡'}, // 0001d687 → 0001d6a1 - {L'𝚈', L'𝚢'}, // 0001d688 → 0001d6a2 - {L'𝚉', L'𝚣'}, // 0001d689 → 0001d6a3 - {L'𝚨', L'𝛂'}, // 0001d6a8 → 0001d6c2 - {L'𝚩', L'𝛃'}, // 0001d6a9 → 0001d6c3 - {L'𝚪', L'𝛄'}, // 0001d6aa → 0001d6c4 - {L'𝚫', L'𝛅'}, // 0001d6ab → 0001d6c5 - {L'𝚬', L'𝛆'}, // 0001d6ac → 0001d6c6 - {L'𝚭', L'𝛇'}, // 0001d6ad → 0001d6c7 - {L'𝚮', L'𝛈'}, // 0001d6ae → 0001d6c8 - {L'𝚯', L'𝛉'}, // 0001d6af → 0001d6c9 - {L'𝚰', L'𝛊'}, // 0001d6b0 → 0001d6ca - {L'𝚱', L'𝛋'}, // 0001d6b1 → 0001d6cb - {L'𝚲', L'𝛌'}, // 0001d6b2 → 0001d6cc - {L'𝚳', L'𝛍'}, // 0001d6b3 → 0001d6cd - {L'𝚴', L'𝛎'}, // 0001d6b4 → 0001d6ce - {L'𝚵', L'𝛏'}, // 0001d6b5 → 0001d6cf - {L'𝚶', L'𝛐'}, // 0001d6b6 → 0001d6d0 - {L'𝚷', L'𝛑'}, // 0001d6b7 → 0001d6d1 - {L'𝚸', L'𝛒'}, // 0001d6b8 → 0001d6d2 - {L'𝚺', L'𝛔'}, // 0001d6ba → 0001d6d4 - {L'𝚻', L'𝛕'}, // 0001d6bb → 0001d6d5 - {L'𝚼', L'𝛖'}, // 0001d6bc → 0001d6d6 - {L'𝚽', L'𝛗'}, // 0001d6bd → 0001d6d7 - {L'𝚾', L'𝛘'}, // 0001d6be → 0001d6d8 - {L'𝚿', L'𝛙'}, // 0001d6bf → 0001d6d9 - {L'𝛀', L'𝛚'}, // 0001d6c0 → 0001d6da - {L'𝛢', L'𝛼'}, // 0001d6e2 → 0001d6fc - {L'𝛣', L'𝛽'}, // 0001d6e3 → 0001d6fd - {L'𝛤', L'𝛾'}, // 0001d6e4 → 0001d6fe - {L'𝛥', L'𝛿'}, // 0001d6e5 → 0001d6ff - {L'𝛦', L'𝜀'}, // 0001d6e6 → 0001d700 - {L'𝛧', L'𝜁'}, // 0001d6e7 → 0001d701 - {L'𝛨', L'𝜂'}, // 0001d6e8 → 0001d702 - {L'𝛩', L'𝜃'}, // 0001d6e9 → 0001d703 - {L'𝛪', L'𝜄'}, // 0001d6ea → 0001d704 - {L'𝛫', L'𝜅'}, // 0001d6eb → 0001d705 - {L'𝛬', L'𝜆'}, // 0001d6ec → 0001d706 - {L'𝛭', L'𝜇'}, // 0001d6ed → 0001d707 - {L'𝛮', L'𝜈'}, // 0001d6ee → 0001d708 - {L'𝛯', L'𝜉'}, // 0001d6ef → 0001d709 - {L'𝛰', L'𝜊'}, // 0001d6f0 → 0001d70a - {L'𝛱', L'𝜋'}, // 0001d6f1 → 0001d70b - {L'𝛲', L'𝜌'}, // 0001d6f2 → 0001d70c - {L'𝛳', L'𝜗'}, // 0001d6f3 → 0001d717 - {L'𝛴', L'𝜎'}, // 0001d6f4 → 0001d70e - {L'𝛵', L'𝜏'}, // 0001d6f5 → 0001d70f - {L'𝛶', L'𝜐'}, // 0001d6f6 → 0001d710 - {L'𝛷', L'𝜑'}, // 0001d6f7 → 0001d711 - {L'𝛸', L'𝜒'}, // 0001d6f8 → 0001d712 - {L'𝛹', L'𝜓'}, // 0001d6f9 → 0001d713 - {L'𝛺', L'𝜔'}, // 0001d6fa → 0001d714 - {L'𝜜', L'𝜶'}, // 0001d71c → 0001d736 - {L'𝜝', L'𝜷'}, // 0001d71d → 0001d737 - {L'𝜞', L'𝜸'}, // 0001d71e → 0001d738 - {L'𝜟', L'𝜹'}, // 0001d71f → 0001d739 - {L'𝜠', L'𝜺'}, // 0001d720 → 0001d73a - {L'𝜡', L'𝜻'}, // 0001d721 → 0001d73b - {L'𝜢', L'𝜼'}, // 0001d722 → 0001d73c - {L'𝜣', L'𝜽'}, // 0001d723 → 0001d73d - {L'𝜤', L'𝜾'}, // 0001d724 → 0001d73e - {L'𝜥', L'𝜿'}, // 0001d725 → 0001d73f - {L'𝜦', L'𝝀'}, // 0001d726 → 0001d740 - {L'𝜧', L'𝝁'}, // 0001d727 → 0001d741 - {L'𝜨', L'𝝂'}, // 0001d728 → 0001d742 - {L'𝜩', L'𝝃'}, // 0001d729 → 0001d743 - {L'𝜪', L'𝝄'}, // 0001d72a → 0001d744 - {L'𝜫', L'𝝅'}, // 0001d72b → 0001d745 - {L'𝜬', L'𝝆'}, // 0001d72c → 0001d746 - {L'𝜭', L'𝝑'}, // 0001d72d → 0001d751 - {L'𝜮', L'𝝈'}, // 0001d72e → 0001d748 - {L'𝜯', L'𝝉'}, // 0001d72f → 0001d749 - {L'𝜰', L'𝝊'}, // 0001d730 → 0001d74a - {L'𝜱', L'𝝋'}, // 0001d731 → 0001d74b - {L'𝜲', L'𝝌'}, // 0001d732 → 0001d74c - {L'𝜳', L'𝝍'}, // 0001d733 → 0001d74d - {L'𝜴', L'𝝎'}, // 0001d734 → 0001d74e - {L'𝝖', L'𝝰'}, // 0001d756 → 0001d770 - {L'𝝗', L'𝝱'}, // 0001d757 → 0001d771 - {L'𝝘', L'𝝲'}, // 0001d758 → 0001d772 - {L'𝝙', L'𝝳'}, // 0001d759 → 0001d773 - {L'𝝚', L'𝝴'}, // 0001d75a → 0001d774 - {L'𝝛', L'𝝵'}, // 0001d75b → 0001d775 - {L'𝝜', L'𝝶'}, // 0001d75c → 0001d776 - {L'𝝝', L'𝝷'}, // 0001d75d → 0001d777 - {L'𝝞', L'𝝸'}, // 0001d75e → 0001d778 - {L'𝝟', L'𝝹'}, // 0001d75f → 0001d779 - {L'𝝠', L'𝝺'}, // 0001d760 → 0001d77a - {L'𝝡', L'𝝻'}, // 0001d761 → 0001d77b - {L'𝝢', L'𝝼'}, // 0001d762 → 0001d77c - {L'𝝣', L'𝝽'}, // 0001d763 → 0001d77d - {L'𝝤', L'𝝾'}, // 0001d764 → 0001d77e - {L'𝝥', L'𝝿'}, // 0001d765 → 0001d77f - {L'𝝦', L'𝞀'}, // 0001d766 → 0001d780 - {L'𝝧', L'𝟅'}, // 0001d767 → 0001d7c5 - {L'𝝨', L'𝞂'}, // 0001d768 → 0001d782 - {L'𝝩', L'𝞃'}, // 0001d769 → 0001d783 - {L'𝝪', L'𝞄'}, // 0001d76a → 0001d784 - {L'𝝫', L'𝞅'}, // 0001d76b → 0001d785 - {L'𝝬', L'𝞆'}, // 0001d76c → 0001d786 - {L'𝝭', L'𝞇'}, // 0001d76d → 0001d787 - {L'𝝮', L'𝞈'}, // 0001d76e → 0001d788 - {L'𝞐', L'𝜶'}, // 0001d790 → 0001d736 - {L'𝞑', L'𝜷'}, // 0001d791 → 0001d737 - {L'𝞒', L'𝜸'}, // 0001d792 → 0001d738 - {L'𝞓', L'𝜹'}, // 0001d793 → 0001d739 - {L'𝞔', L'𝜺'}, // 0001d794 → 0001d73a - {L'𝞕', L'𝜻'}, // 0001d795 → 0001d73b - {L'𝞖', L'𝜼'}, // 0001d796 → 0001d73c - {L'𝞗', L'𝜽'}, // 0001d797 → 0001d73d - {L'𝞘', L'𝜾'}, // 0001d798 → 0001d73e - {L'𝞙', L'𝜿'}, // 0001d799 → 0001d73f - {L'𝞚', L'𝝀'}, // 0001d79a → 0001d740 - {L'𝞛', L'𝝁'}, // 0001d79b → 0001d741 - {L'𝞜', L'𝝂'}, // 0001d79c → 0001d742 - {L'𝞝', L'𝝃'}, // 0001d79d → 0001d743 - {L'𝞞', L'𝝄'}, // 0001d79e → 0001d744 - {L'𝞟', L'𝝅'}, // 0001d79f → 0001d745 - {L'𝞠', L'𝝆'}, // 0001d7a0 → 0001d746 - {L'𝞡', L'𝟅'}, // 0001d7a1 → 0001d7c5 - {L'𝞢', L'𝝈'}, // 0001d7a2 → 0001d748 - {L'𝞣', L'𝝉'}, // 0001d7a3 → 0001d749 - {L'𝞤', L'𝝊'}, // 0001d7a4 → 0001d74a - {L'𝞥', L'𝝋'}, // 0001d7a5 → 0001d74b - {L'𝞦', L'𝝌'}, // 0001d7a6 → 0001d74c - {L'𝞧', L'𝝍'}, // 0001d7a7 → 0001d74d - {L'𝞨', L'𝝎'}, // 0001d7a8 → 0001d74e - {L'𝟊', L'𝟋'}, // 0001d7ca → 0001d7cb - {L'𞤀', L'𞤢'}, // 0001e900 → 0001e922 - {L'𞤁', L'𞤣'}, // 0001e901 → 0001e923 - {L'𞤂', L'𞤤'}, // 0001e902 → 0001e924 - {L'𞤃', L'𞤥'}, // 0001e903 → 0001e925 - {L'𞤄', L'𞤦'}, // 0001e904 → 0001e926 - {L'𞤅', L'𞤧'}, // 0001e905 → 0001e927 - {L'𞤆', L'𞤨'}, // 0001e906 → 0001e928 - {L'𞤇', L'𞤩'}, // 0001e907 → 0001e929 - {L'𞤈', L'𞤪'}, // 0001e908 → 0001e92a - {L'𞤉', L'𞤫'}, // 0001e909 → 0001e92b - {L'𞤊', L'𞤬'}, // 0001e90a → 0001e92c - {L'𞤋', L'𞤭'}, // 0001e90b → 0001e92d - {L'𞤌', L'𞤮'}, // 0001e90c → 0001e92e - {L'𞤍', L'𞤯'}, // 0001e90d → 0001e92f - {L'𞤎', L'𞤰'}, // 0001e90e → 0001e930 - {L'𞤏', L'𞤱'}, // 0001e90f → 0001e931 - {L'𞤐', L'𞤲'}, // 0001e910 → 0001e932 - {L'𞤑', L'𞤳'}, // 0001e911 → 0001e933 - {L'𞤒', L'𞤴'}, // 0001e912 → 0001e934 - {L'𞤓', L'𞤵'}, // 0001e913 → 0001e935 - {L'𞤔', L'𞤶'}, // 0001e914 → 0001e936 - {L'𞤕', L'𞤷'}, // 0001e915 → 0001e937 - {L'𞤖', L'𞤸'}, // 0001e916 → 0001e938 - {L'𞤗', L'𞤹'}, // 0001e917 → 0001e939 - {L'𞤘', L'𞤺'}, // 0001e918 → 0001e93a - {L'𞤙', L'𞤻'}, // 0001e919 → 0001e93b - {L'𞤚', L'𞤼'}, // 0001e91a → 0001e93c - {L'𞤛', L'𞤽'}, // 0001e91b → 0001e93d - {L'𞤜', L'𞤾'}, // 0001e91c → 0001e93e - {L'𞤝', L'𞤿'}, // 0001e91d → 0001e93f - {L'𞤞', L'𞥀'}, // 0001e91e → 0001e940 - {L'𞤟', L'𞥁'}, // 0001e91f → 0001e941 - {L'𞤠', L'𞥂'}, // 0001e920 → 0001e942 - {L'𞤡', L'𞥃'}, // 0001e921 → 0001e943 +static const int kAstralLower[][3] = { + {0x10400, 0x10427, +40}, /* 40x 𐐀 ..𐐧 → 𐐨 ..𐑏 Deseret */ + {0x104b0, 0x104d3, +40}, /* 36x 𐒰 ..𐓓 → 𐓘 ..𐓻 Osage */ + {0x1d400, 0x1d419, +26}, /* 26x 𝐀 ..𝐙 → 𝐚 ..𝐳 Math */ + {0x1d43c, 0x1d44d, +26}, /* 18x 𝐼 ..𝑍 → 𝑖 ..𝑧 Math */ + {0x1d468, 0x1d481, +26}, /* 26x 𝑨 ..𝒁 → 𝒂 ..𝒛 Math */ + {0x1d4ae, 0x1d4b5, +26}, /* 8x 𝒮 ..𝒵 → 𝓈 ..𝓏 Math */ + {0x1d4d0, 0x1d4e9, +26}, /* 26x 𝓐 ..𝓩 → 𝓪 ..𝔃 Math */ + {0x1d50d, 0x1d514, +26}, /* 8x 𝔍 ..𝔔 → 𝔧 ..𝔮 Math */ + {0x1d56c, 0x1d585, +26}, /* 26x 𝕬 ..𝖅 → 𝖆 ..𝖟 Math */ + {0x1d5a0, 0x1d5b9, +26}, /* 26x 𝖠 ..𝖹 → 𝖺 ..𝗓 Math */ + {0x1d5d4, 0x1d5ed, +26}, /* 26x 𝗔 ..𝗭 → 𝗮 ..𝘇 Math */ + {0x1d608, 0x1d621, +26}, /* 26x 𝘈 ..𝘡 → 𝘢 ..𝘻 Math */ + {0x1d63c, 0x1d655, -442}, /* 26x 𝘼 ..𝙕 → 𝒂 ..𝒛 Math */ + {0x1d670, 0x1d689, +26}, /* 26x 𝙰 ..𝚉 → 𝚊 ..𝚣 Math */ + {0x1d6a8, 0x1d6b8, +26}, /* 17x 𝚨 ..𝚸 → 𝛂 ..𝛒 Math */ + {0x1d6e2, 0x1d6f2, +26}, /* 17x 𝛢 ..𝛲 → 𝛼 ..𝜌 Math */ + {0x1d71c, 0x1d72c, +26}, /* 17x 𝜜 ..𝜬 → 𝜶 ..𝝆 Math */ + {0x1d756, 0x1d766, +26}, /* 17x 𝝖 ..𝝦 → 𝝰 ..𝞀 Math */ + {0x1d790, 0x1d7a0, -90}, /* 17x 𝞐 ..𝞠 → 𝜶 ..𝝆 Math */ }; /** @@ -1633,32 +178,57 @@ static const char32_t kUpperToLowerAstral[][2] = { */ wint_t towlower(wint_t c) { int m, l, r; - if (isascii(c)) return tolower(c); - if (!IsTiny()) { - l = 0; - r = ARRAYLEN(kUpperToLowerAstral) - 1; - while (l <= r) { - m = (l + r) >> 1; - if (kUpperToLowerAstral[m][0] < c) { - l = m + 1; - } else if (kUpperToLowerAstral[m][0] > c) { - r = m - 1; + if (c < 0200) { + if ('A' <= c && c <= 'Z') { + return c + 32; + } else { + return c; + } + } else if (c <= 0xffff) { + if ((0x0100 <= c && c <= 0x0176) || /* 60x Ā..ā → ā..ŵ Watin-A */ + (0x01de <= c && c <= 0x01ee) || /* 9x Ǟ..Ǯ → ǟ..ǯ Watin-B */ + (0x01f8 <= c && c <= 0x021e) || /* 20x Ǹ..Ȟ → ǹ..ȟ Watin-B */ + (0x0222 <= c && c <= 0x0232) || /* 9x Ȣ..Ȳ → ȣ..ȳ Watin-B */ + (0x1e00 <= c && c <= 0x1eff)) { /*256x Ḁ..Ỿ → ḁ..ỿ Watin-C */ + if (c == 0x0130) return c - 199; + if (c == 0x1e9e) return c; + return c + (~c & 1); + } else if (0x01cf <= c && c <= 0x01db) { + return c + (c & 1); /* 7x Ǐ..Ǜ → ǐ..ǜ Watin-B */ + } else if (0x13a0 <= c && c <= 0x13ef) { + return c + 38864; /* 80x Ꭰ ..Ꮿ → ꭰ ..ꮿ Cherokee */ + } else { + l = 0; + r = sizeof(kLower) / sizeof(kLower[0]); + while (l < r) { + m = (l + r) >> 1; + if (kLower[m].y < c) { + l = m + 1; + } else { + r = m; + } + } + if (kLower[l].x <= c && c <= kLower[l].y) { + return c + kLower[l].d; } else { - return kUpperToLowerAstral[m][1]; + return c; } } - } - l = 0; - r = ARRAYLEN(kUpperToLower) - 1; - while (l <= r) { - m = (l + r) >> 1; - if (kUpperToLower[m][0] < c) { - l = m + 1; - } else if (kUpperToLower[m][0] > c) { - r = m - 1; + } else { + l = 0; + r = sizeof(kAstralLower) / sizeof(kAstralLower[0]); + while (l < r) { + m = (l + r) >> 1; + if (kAstralLower[m][1] < c) { + l = m + 1; + } else { + r = m; + } + } + if (kAstralLower[l][0] <= c && c <= kAstralLower[l][1]) { + return c + kAstralLower[l][2]; } else { - return kUpperToLower[m][1]; + return c; } } - return c; } diff --git a/libc/str/towupper.c b/libc/str/towupper.c index b6bab958e..4bff81d50 100644 --- a/libc/str/towupper.c +++ b/libc/str/towupper.c @@ -16,1616 +16,124 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dce.h" #include "libc/macros.internal.h" #include "libc/str/str.h" -#include "libc/dce.h" +/* clang-format off */ -static const char16_t kLowerToUpper[][2] = { - {u'ß', u'ẞ'}, // 00df → 1e9e - {u'à', u'À'}, // 00e0 → 00c0 - {u'á', u'Á'}, // 00e1 → 00c1 - {u'â', u'Â'}, // 00e2 → 00c2 - {u'ã', u'Ã'}, // 00e3 → 00c3 - {u'ä', u'Ä'}, // 00e4 → 00c4 - {u'å', u'Å'}, // 00e5 → 00c5 - {u'æ', u'Æ'}, // 00e6 → 00c6 - {u'ç', u'Ç'}, // 00e7 → 00c7 - {u'è', u'È'}, // 00e8 → 00c8 - {u'é', u'É'}, // 00e9 → 00c9 - {u'ê', u'Ê'}, // 00ea → 00ca - {u'ë', u'Ë'}, // 00eb → 00cb - {u'ì', u'Ì'}, // 00ec → 00cc - {u'í', u'Í'}, // 00ed → 00cd - {u'î', u'Î'}, // 00ee → 00ce - {u'ï', u'Ï'}, // 00ef → 00cf - {u'ð', u'Ð'}, // 00f0 → 00d0 - {u'ñ', u'Ñ'}, // 00f1 → 00d1 - {u'ò', u'Ò'}, // 00f2 → 00d2 - {u'ó', u'Ó'}, // 00f3 → 00d3 - {u'ô', u'Ô'}, // 00f4 → 00d4 - {u'õ', u'Õ'}, // 00f5 → 00d5 - {u'ö', u'Ö'}, // 00f6 → 00d6 - {u'ø', u'Ø'}, // 00f8 → 00d8 - {u'ù', u'Ù'}, // 00f9 → 00d9 - {u'ú', u'Ú'}, // 00fa → 00da - {u'û', u'Û'}, // 00fb → 00db - {u'ü', u'Ü'}, // 00fc → 00dc - {u'ý', u'Ý'}, // 00fd → 00dd - {u'þ', u'Þ'}, // 00fe → 00de - {u'ÿ', u'Ÿ'}, // 00ff → 0178 -#ifndef TINY - {u'ā', u'Ā'}, // 0101 → 0100 - {u'ă', u'Ă'}, // 0103 → 0102 - {u'ą', u'Ą'}, // 0105 → 0104 - {u'ć', u'Ć'}, // 0107 → 0106 - {u'ĉ', u'Ĉ'}, // 0109 → 0108 - {u'ċ', u'Ċ'}, // 010b → 010a - {u'č', u'Č'}, // 010d → 010c - {u'ď', u'Ď'}, // 010f → 010e - {u'đ', u'Đ'}, // 0111 → 0110 - {u'ē', u'Ē'}, // 0113 → 0112 - {u'ĕ', u'Ĕ'}, // 0115 → 0114 - {u'ė', u'Ė'}, // 0117 → 0116 - {u'ę', u'Ę'}, // 0119 → 0118 - {u'ě', u'Ě'}, // 011b → 011a - {u'ĝ', u'Ĝ'}, // 011d → 011c - {u'ğ', u'Ğ'}, // 011f → 011e - {u'ġ', u'Ġ'}, // 0121 → 0120 - {u'ģ', u'Ģ'}, // 0123 → 0122 - {u'ĥ', u'Ĥ'}, // 0125 → 0124 - {u'ħ', u'Ħ'}, // 0127 → 0126 - {u'ĩ', u'Ĩ'}, // 0129 → 0128 - {u'ī', u'Ī'}, // 012b → 012a - {u'ĭ', u'Ĭ'}, // 012d → 012c - {u'į', u'Į'}, // 012f → 012e - {u'ij', u'IJ'}, // 0133 → 0132 - {u'ĵ', u'Ĵ'}, // 0135 → 0134 - {u'ķ', u'Ķ'}, // 0137 → 0136 - {u'ĺ', u'Ĺ'}, // 013a → 0139 - {u'ļ', u'Ļ'}, // 013c → 013b - {u'ľ', u'Ľ'}, // 013e → 013d - {u'ŀ', u'Ŀ'}, // 0140 → 013f - {u'ł', u'Ł'}, // 0142 → 0141 - {u'ń', u'Ń'}, // 0144 → 0143 - {u'ņ', u'Ņ'}, // 0146 → 0145 - {u'ň', u'Ň'}, // 0148 → 0147 - {u'ŋ', u'Ŋ'}, // 014b → 014a - {u'ō', u'Ō'}, // 014d → 014c - {u'ŏ', u'Ŏ'}, // 014f → 014e - {u'ő', u'Ő'}, // 0151 → 0150 - {u'œ', u'Œ'}, // 0153 → 0152 - {u'ŕ', u'Ŕ'}, // 0155 → 0154 - {u'ŗ', u'Ŗ'}, // 0157 → 0156 - {u'ř', u'Ř'}, // 0159 → 0158 - {u'ś', u'Ś'}, // 015b → 015a - {u'ŝ', u'Ŝ'}, // 015d → 015c - {u'ş', u'Ş'}, // 015f → 015e - {u'š', u'Š'}, // 0161 → 0160 - {u'ţ', u'Ţ'}, // 0163 → 0162 - {u'ť', u'Ť'}, // 0165 → 0164 - {u'ŧ', u'Ŧ'}, // 0167 → 0166 - {u'ũ', u'Ũ'}, // 0169 → 0168 - {u'ū', u'Ū'}, // 016b → 016a - {u'ŭ', u'Ŭ'}, // 016d → 016c - {u'ů', u'Ů'}, // 016f → 016e - {u'ű', u'Ű'}, // 0171 → 0170 - {u'ų', u'Ų'}, // 0173 → 0172 - {u'ŵ', u'Ŵ'}, // 0175 → 0174 - {u'ŷ', u'Ŷ'}, // 0177 → 0176 - {u'ź', u'Ź'}, // 017a → 0179 - {u'ż', u'Ż'}, // 017c → 017b - {u'ž', u'Ž'}, // 017e → 017d - {u'ƀ', u'Ƀ'}, // 0180 → 0243 - {u'ƃ', u'Ƃ'}, // 0183 → 0182 - {u'ƅ', u'Ƅ'}, // 0185 → 0184 - {u'ƈ', u'Ƈ'}, // 0188 → 0187 - {u'ƌ', u'Ƌ'}, // 018c → 018b - {u'ƒ', u'Ƒ'}, // 0192 → 0191 - {u'ƙ', u'Ƙ'}, // 0199 → 0198 - {u'ƚ', u'Ƚ'}, // 019a → 023d - {u'ƞ', u'Ƞ'}, // 019e → 0220 - {u'ơ', u'Ơ'}, // 01a1 → 01a0 - {u'ƣ', u'Ƣ'}, // 01a3 → 01a2 - {u'ƥ', u'Ƥ'}, // 01a5 → 01a4 - {u'ƨ', u'Ƨ'}, // 01a8 → 01a7 - {u'ƭ', u'Ƭ'}, // 01ad → 01ac - {u'ư', u'Ư'}, // 01b0 → 01af - {u'ƴ', u'Ƴ'}, // 01b4 → 01b3 - {u'ƶ', u'Ƶ'}, // 01b6 → 01b5 - {u'ƹ', u'Ƹ'}, // 01b9 → 01b8 - {u'ƹ', u'Ʒ'}, // 01b9 → 01b7 - {u'ƽ', u'Ƽ'}, // 01bd → 01bc - {u'dž', u'DZ'}, // 01c6 → 01f1 - {u'dž', u'DŽ'}, // 01c6 → 01c4 - {u'lj', u'LJ'}, // 01c9 → 01c7 - {u'nj', u'NJ'}, // 01cc → 01ca - {u'ǎ', u'Ǎ'}, // 01ce → 01cd - {u'ǐ', u'Ǐ'}, // 01d0 → 01cf - {u'ǒ', u'Ǒ'}, // 01d2 → 01d1 - {u'ǔ', u'Ǔ'}, // 01d4 → 01d3 - {u'ǖ', u'Ǖ'}, // 01d6 → 01d5 - {u'ǘ', u'Ǘ'}, // 01d8 → 01d7 - {u'ǚ', u'Ǚ'}, // 01da → 01d9 - {u'ǜ', u'Ǜ'}, // 01dc → 01db - {u'ǟ', u'Ǟ'}, // 01df → 01de - {u'ǡ', u'Ȧ'}, // 01e1 → 0226 - {u'ǡ', u'Ǡ'}, // 01e1 → 01e0 - {u'ǣ', u'Ǣ'}, // 01e3 → 01e2 - {u'ǥ', u'Ǥ'}, // 01e5 → 01e4 - {u'ǧ', u'Ǧ'}, // 01e7 → 01e6 - {u'ǩ', u'Ǩ'}, // 01e9 → 01e8 - {u'ǫ', u'Ǫ'}, // 01eb → 01ea - {u'ǭ', u'Ǭ'}, // 01ed → 01ec - {u'ǯ', u'Ǯ'}, // 01ef → 01ee - {u'ǵ', u'Ǵ'}, // 01f5 → 01f4 - {u'ǹ', u'Ǹ'}, // 01f9 → 01f8 - {u'ǻ', u'Ǻ'}, // 01fb → 01fa - {u'ǽ', u'Ǽ'}, // 01fd → 01fc - {u'ǿ', u'Ǿ'}, // 01ff → 01fe - {u'ȁ', u'Ȁ'}, // 0201 → 0200 - {u'ȃ', u'Ȃ'}, // 0203 → 0202 - {u'ȅ', u'Ȅ'}, // 0205 → 0204 - {u'ȇ', u'Ȇ'}, // 0207 → 0206 - {u'ȉ', u'Ȉ'}, // 0209 → 0208 - {u'ȋ', u'Ȋ'}, // 020b → 020a - {u'ȍ', u'Ȍ'}, // 020d → 020c - {u'ȏ', u'Ȏ'}, // 020f → 020e - {u'ȑ', u'Ȑ'}, // 0211 → 0210 - {u'ȓ', u'Ȓ'}, // 0213 → 0212 - {u'ȕ', u'Ȕ'}, // 0215 → 0214 - {u'ȗ', u'Ȗ'}, // 0217 → 0216 - {u'ș', u'Ș'}, // 0219 → 0218 - {u'ț', u'Ț'}, // 021b → 021a - {u'ȝ', u'Ȝ'}, // 021d → 021c - {u'ȟ', u'Ȟ'}, // 021f → 021e - {u'ȣ', u'Ȣ'}, // 0223 → 0222 - {u'ȥ', u'Ȥ'}, // 0225 → 0224 - {u'ȩ', u'Ȩ'}, // 0229 → 0228 - {u'ȫ', u'Ȫ'}, // 022b → 022a - {u'ȭ', u'Ȭ'}, // 022d → 022c - {u'ȯ', u'Ȯ'}, // 022f → 022e - {u'ȱ', u'Ȱ'}, // 0231 → 0230 - {u'ȳ', u'Ȳ'}, // 0233 → 0232 - {u'ȼ', u'Ȼ'}, // 023c → 023b - {u'ȿ', u'Ȿ'}, // 023f → 2c7e - {u'ɀ', u'Ɀ'}, // 0240 → 2c7f - {u'ɂ', u'Ɂ'}, // 0242 → 0241 - {u'ɇ', u'Ɇ'}, // 0247 → 0246 - {u'ɉ', u'Ɉ'}, // 0249 → 0248 - {u'ɍ', u'Ɍ'}, // 024d → 024c - {u'ɏ', u'Ɏ'}, // 024f → 024e - {u'ɐ', u'Ɐ'}, // 0250 → 2c6f - {u'ɑ', u'Ɑ'}, // 0251 → 2c6d - {u'ɒ', u'Ɒ'}, // 0252 → 2c70 - {u'ɓ', u'Ɓ'}, // 0253 → 0181 - {u'ɔ', u'Ɔ'}, // 0254 → 0186 - {u'ɗ', u'Ɗ'}, // 0257 → 018a - {u'ɘ', u'Ǝ'}, // 0258 → 018e - {u'ə', u'Ə'}, // 0259 → 018f - {u'ɛ', u'Ɛ'}, // 025b → 0190 - {u'ɜ', u'Ɜ'}, // 025c → a7ab - {u'ɠ', u'Ɠ'}, // 0260 → 0193 - {u'ɡ', u'Ɡ'}, // 0261 → a7ac - {u'ɣ', u'Ɣ'}, // 0263 → 0194 - {u'ɥ', u'Ɥ'}, // 0265 → a78d - {u'ɦ', u'Ɦ'}, // 0266 → a7aa - {u'ɨ', u'Ɨ'}, // 0268 → 0197 - {u'ɩ', u'Ɩ'}, // 0269 → 0196 - {u'ɫ', u'Ɫ'}, // 026b → 2c62 - {u'ɬ', u'Ɬ'}, // 026c → a7ad - {u'ɯ', u'Ɯ'}, // 026f → 019c - {u'ɱ', u'Ɱ'}, // 0271 → 2c6e - {u'ɲ', u'Ɲ'}, // 0272 → 019d - {u'ɽ', u'Ɽ'}, // 027d → 2c64 - {u'ʂ', u'Ʂ'}, // 0282 → a7c5 - {u'ʃ', u'Ʃ'}, // 0283 → 01a9 - {u'ʇ', u'Ʇ'}, // 0287 → a7b1 - {u'ʈ', u'Ʈ'}, // 0288 → 01ae - {u'ʉ', u'Ʉ'}, // 0289 → 0244 - {u'ʊ', u'Ʊ'}, // 028a → 01b1 - {u'ʋ', u'Ʋ'}, // 028b → 01b2 - {u'ʌ', u'Ʌ'}, // 028c → 0245 - {u'ʝ', u'Ʝ'}, // 029d → a7b2 - {u'ʞ', u'Ʞ'}, // 029e → a7b0 - {u'ͱ', u'Ͱ'}, // 0371 → 0370 - {u'ͳ', u'Ͳ'}, // 0373 → 0372 - {u'ͷ', u'Ͷ'}, // 0377 → 0376 - {u'ͻ', u'Ͻ'}, // 037b → 03fd - {u'ͼ', u'Ͼ'}, // 037c → 03fe - {u'ͽ', u'Ͽ'}, // 037d → 03ff - {u'ΐ', u'Ι'}, // 0390 → 0399 - {u'ΐ', u'Ϊ'}, // 0390 → 03aa - {u'ά', u'Α'}, // 03ac → 0391 - {u'ά', u'Ά'}, // 03ac → 0386 - {u'έ', u'Έ'}, // 03ad → 0388 - {u'έ', u'Ε'}, // 03ad → 0395 - {u'ή', u'Η'}, // 03ae → 0397 - {u'ή', u'Ή'}, // 03ae → 0389 - {u'ί', u'Ί'}, // 03af → 038a - {u'ΰ', u'Υ'}, // 03b0 → 03a5 - {u'ΰ', u'Ϋ'}, // 03b0 → 03ab - {u'β', u'Β'}, // 03b2 → 0392 - {u'γ', u'Γ'}, // 03b3 → 0393 - {u'δ', u'Δ'}, // 03b4 → 0394 - {u'ζ', u'Ζ'}, // 03b6 → 0396 - {u'θ', u'Θ'}, // 03b8 → 0398 - {u'κ', u'Κ'}, // 03ba → 039a - {u'λ', u'Λ'}, // 03bb → 039b - {u'μ', u'Μ'}, // 03bc → 039c - {u'ν', u'Ν'}, // 03bd → 039d - {u'ξ', u'Ξ'}, // 03be → 039e - {u'ο', u'Ο'}, // 03bf → 039f - {u'π', u'Π'}, // 03c0 → 03a0 - {u'ρ', u'Ρ'}, // 03c1 → 03a1 - {u'σ', u'Σ'}, // 03c3 → 03a3 - {u'τ', u'Τ'}, // 03c4 → 03a4 - {u'φ', u'Φ'}, // 03c6 → 03a6 - {u'χ', u'Χ'}, // 03c7 → 03a7 - {u'ψ', u'Ψ'}, // 03c8 → 03a8 - {u'ω', u'Ω'}, // 03c9 → 03a9 - {u'ό', u'Ό'}, // 03cc → 038c - {u'ύ', u'Ύ'}, // 03cd → 038e - {u'ώ', u'Ώ'}, // 03ce → 038f - {u'ϣ', u'Ϣ'}, // 03e3 → 03e2 - {u'ϥ', u'Ϥ'}, // 03e5 → 03e4 - {u'ϧ', u'Ϧ'}, // 03e7 → 03e6 - {u'ϩ', u'Ϩ'}, // 03e9 → 03e8 - {u'ϫ', u'Ϫ'}, // 03eb → 03ea - {u'ϭ', u'Ϭ'}, // 03ed → 03ec - {u'ϯ', u'Ϯ'}, // 03ef → 03ee - {u'ϸ', u'Ϸ'}, // 03f8 → 03f7 - {u'ϻ', u'Ϻ'}, // 03fb → 03fa - {u'а', u'А'}, // 0430 → 0410 - {u'б', u'Б'}, // 0431 → 0411 - {u'в', u'В'}, // 0432 → 0412 - {u'г', u'Г'}, // 0433 → 0413 - {u'д', u'Д'}, // 0434 → 0414 - {u'е', u'Е'}, // 0435 → 0415 - {u'е', u'И'}, // 0435 → 0418 - {u'ж', u'Ж'}, // 0436 → 0416 - {u'з', u'З'}, // 0437 → 0417 - {u'й', u'Й'}, // 0439 → 0419 - {u'к', u'К'}, // 043a → 041a - {u'л', u'Л'}, // 043b → 041b - {u'л', u'Э'}, // 043b → 042d - {u'м', u'М'}, // 043c → 041c - {u'н', u'Н'}, // 043d → 041d - {u'о', u'О'}, // 043e → 041e - {u'п', u'П'}, // 043f → 041f - {u'р', u'Р'}, // 0440 → 0420 - {u'с', u'С'}, // 0441 → 0421 - {u'т', u'Т'}, // 0442 → 0422 - {u'у', u'У'}, // 0443 → 0423 - {u'ф', u'Ф'}, // 0444 → 0424 - {u'х', u'Х'}, // 0445 → 0425 - {u'ц', u'Ц'}, // 0446 → 0426 - {u'ч', u'Ч'}, // 0447 → 0427 - {u'ш', u'Ш'}, // 0448 → 0428 - {u'щ', u'Щ'}, // 0449 → 0429 - {u'ъ', u'Ъ'}, // 044a → 042a - {u'ы', u'Ы'}, // 044b → 042b - {u'ь', u'Ь'}, // 044c → 042c - {u'ю', u'Ю'}, // 044e → 042e - {u'я', u'Я'}, // 044f → 042f - {u'ѐ', u'Ѐ'}, // 0450 → 0400 - {u'ё', u'Ё'}, // 0451 → 0401 - {u'ђ', u'Ђ'}, // 0452 → 0402 - {u'ѓ', u'Ѓ'}, // 0453 → 0403 - {u'є', u'Ѹ'}, // 0454 → 0478 - {u'є', u'Є'}, // 0454 → 0404 - {u'ѕ', u'Ѕ'}, // 0455 → 0405 - {u'і', u'І'}, // 0456 → 0406 - {u'ї', u'Ї'}, // 0457 → 0407 - {u'ј', u'Ј'}, // 0458 → 0408 - {u'љ', u'Љ'}, // 0459 → 0409 - {u'њ', u'Њ'}, // 045a → 040a - {u'ћ', u'Ћ'}, // 045b → 040b - {u'ќ', u'Ќ'}, // 045c → 040c - {u'ѝ', u'Ѝ'}, // 045d → 040d - {u'ў', u'Ў'}, // 045e → 040e - {u'џ', u'Џ'}, // 045f → 040f - {u'ѡ', u'Ѡ'}, // 0461 → 0460 - {u'ѣ', u'Ѣ'}, // 0463 → 0462 - {u'ѥ', u'Ѥ'}, // 0465 → 0464 - {u'ѧ', u'Ѧ'}, // 0467 → 0466 - {u'ѩ', u'Ѩ'}, // 0469 → 0468 - {u'ѫ', u'Ѫ'}, // 046b → 046a - {u'ѭ', u'Ѭ'}, // 046d → 046c - {u'ѯ', u'Ѯ'}, // 046f → 046e - {u'ѱ', u'Ѱ'}, // 0471 → 0470 - {u'ѳ', u'Ѳ'}, // 0473 → 0472 - {u'ѵ', u'Ѵ'}, // 0475 → 0474 - {u'ѷ', u'Ѷ'}, // 0477 → 0476 - {u'ѻ', u'Ѻ'}, // 047b → 047a - {u'ѽ', u'Ѽ'}, // 047d → 047c - {u'ѿ', u'Ѿ'}, // 047f → 047e - {u'ҁ', u'Ҁ'}, // 0481 → 0480 - {u'ҋ', u'Ҋ'}, // 048b → 048a - {u'ҍ', u'Ҍ'}, // 048d → 048c - {u'ҏ', u'Ҏ'}, // 048f → 048e - {u'ґ', u'Ґ'}, // 0491 → 0490 - {u'ғ', u'Ғ'}, // 0493 → 0492 - {u'ҕ', u'Ҕ'}, // 0495 → 0494 - {u'җ', u'Җ'}, // 0497 → 0496 - {u'ҙ', u'Ҙ'}, // 0499 → 0498 - {u'қ', u'Қ'}, // 049b → 049a - {u'ҝ', u'Ҝ'}, // 049d → 049c - {u'ҟ', u'Ҟ'}, // 049f → 049e - {u'ҡ', u'Ҡ'}, // 04a1 → 04a0 - {u'ң', u'Ң'}, // 04a3 → 04a2 - {u'ҥ', u'Ҥ'}, // 04a5 → 04a4 - {u'ҧ', u'Ҧ'}, // 04a7 → 04a6 - {u'ҩ', u'Ҩ'}, // 04a9 → 04a8 - {u'ҫ', u'Ҫ'}, // 04ab → 04aa - {u'ҭ', u'Ҭ'}, // 04ad → 04ac - {u'ү', u'Ү'}, // 04af → 04ae - {u'ұ', u'Ұ'}, // 04b1 → 04b0 - {u'ҳ', u'Ҳ'}, // 04b3 → 04b2 - {u'ҵ', u'Ҵ'}, // 04b5 → 04b4 - {u'ҷ', u'Ҷ'}, // 04b7 → 04b6 - {u'ҹ', u'Ҹ'}, // 04b9 → 04b8 - {u'һ', u'Һ'}, // 04bb → 04ba - {u'ҽ', u'Ҽ'}, // 04bd → 04bc - {u'ҿ', u'Ҿ'}, // 04bf → 04be - {u'ӂ', u'Ӂ'}, // 04c2 → 04c1 - {u'ӄ', u'Ӄ'}, // 04c4 → 04c3 - {u'ӆ', u'Ӆ'}, // 04c6 → 04c5 - {u'ӈ', u'Ӈ'}, // 04c8 → 04c7 - {u'ӊ', u'Ӊ'}, // 04ca → 04c9 - {u'ӌ', u'Ӌ'}, // 04cc → 04cb - {u'ӎ', u'Ӎ'}, // 04ce → 04cd - {u'ӑ', u'Ӑ'}, // 04d1 → 04d0 - {u'ӓ', u'Ӓ'}, // 04d3 → 04d2 - {u'ӕ', u'Ӕ'}, // 04d5 → 04d4 - {u'ӗ', u'Ӗ'}, // 04d7 → 04d6 - {u'ә', u'Ә'}, // 04d9 → 04d8 - {u'ӛ', u'Ӛ'}, // 04db → 04da - {u'ӝ', u'Ӝ'}, // 04dd → 04dc - {u'ӟ', u'Ӟ'}, // 04df → 04de - {u'ӡ', u'Ӡ'}, // 04e1 → 04e0 - {u'ӣ', u'Ӣ'}, // 04e3 → 04e2 - {u'ӥ', u'Ӥ'}, // 04e5 → 04e4 - {u'ӧ', u'Ӧ'}, // 04e7 → 04e6 - {u'ө', u'Ө'}, // 04e9 → 04e8 - {u'ӫ', u'Ӫ'}, // 04eb → 04ea - {u'ӭ', u'Ӭ'}, // 04ed → 04ec - {u'ӯ', u'Ӯ'}, // 04ef → 04ee - {u'ӱ', u'Ӱ'}, // 04f1 → 04f0 - {u'ӳ', u'Ӳ'}, // 04f3 → 04f2 - {u'ӵ', u'Ӵ'}, // 04f5 → 04f4 - {u'ӷ', u'Ӷ'}, // 04f7 → 04f6 - {u'ӹ', u'Ӹ'}, // 04f9 → 04f8 - {u'ӻ', u'Ӻ'}, // 04fb → 04fa - {u'ӽ', u'Ӽ'}, // 04fd → 04fc - {u'ӿ', u'Ӿ'}, // 04ff → 04fe - {u'ԁ', u'Ԁ'}, // 0501 → 0500 - {u'ԃ', u'Ԃ'}, // 0503 → 0502 - {u'ԅ', u'Ԅ'}, // 0505 → 0504 - {u'ԇ', u'Ԇ'}, // 0507 → 0506 - {u'ԉ', u'Ԉ'}, // 0509 → 0508 - {u'ԋ', u'Ԋ'}, // 050b → 050a - {u'ԍ', u'Ԍ'}, // 050d → 050c - {u'ԏ', u'Ԏ'}, // 050f → 050e - {u'ԑ', u'Ԑ'}, // 0511 → 0510 - {u'ԓ', u'Ԓ'}, // 0513 → 0512 - {u'ԕ', u'Ԕ'}, // 0515 → 0514 - {u'ԗ', u'Ԗ'}, // 0517 → 0516 - {u'ԙ', u'Ԙ'}, // 0519 → 0518 - {u'ԛ', u'Ԛ'}, // 051b → 051a - {u'ԝ', u'Ԝ'}, // 051d → 051c - {u'ԟ', u'Ԟ'}, // 051f → 051e - {u'ԡ', u'Ԡ'}, // 0521 → 0520 - {u'ԣ', u'Ԣ'}, // 0523 → 0522 - {u'ԥ', u'Ԥ'}, // 0525 → 0524 - {u'ԧ', u'Ԧ'}, // 0527 → 0526 - {u'ԩ', u'Ԩ'}, // 0529 → 0528 - {u'ԫ', u'Ԫ'}, // 052b → 052a - {u'ԭ', u'Ԭ'}, // 052d → 052c - {u'ԯ', u'Ԯ'}, // 052f → 052e - {u'ա', u'Ա'}, // 0561 → 0531 - {u'բ', u'Բ'}, // 0562 → 0532 - {u'գ', u'Գ'}, // 0563 → 0533 - {u'դ', u'Դ'}, // 0564 → 0534 - {u'ե', u'Ե'}, // 0565 → 0535 - {u'զ', u'Զ'}, // 0566 → 0536 - {u'է', u'Է'}, // 0567 → 0537 - {u'ը', u'Ը'}, // 0568 → 0538 - {u'թ', u'Թ'}, // 0569 → 0539 - {u'ժ', u'Ժ'}, // 056a → 053a - {u'ի', u'Ի'}, // 056b → 053b - {u'լ', u'Լ'}, // 056c → 053c - {u'խ', u'Խ'}, // 056d → 053d - {u'ծ', u'Ծ'}, // 056e → 053e - {u'կ', u'Կ'}, // 056f → 053f - {u'հ', u'Հ'}, // 0570 → 0540 - {u'ձ', u'Ձ'}, // 0571 → 0541 - {u'ղ', u'Ղ'}, // 0572 → 0542 - {u'ճ', u'Ճ'}, // 0573 → 0543 - {u'մ', u'Մ'}, // 0574 → 0544 - {u'յ', u'Յ'}, // 0575 → 0545 - {u'ն', u'Ն'}, // 0576 → 0546 - {u'շ', u'Շ'}, // 0577 → 0547 - {u'ո', u'Ո'}, // 0578 → 0548 - {u'չ', u'Չ'}, // 0579 → 0549 - {u'պ', u'Պ'}, // 057a → 054a - {u'ջ', u'Ջ'}, // 057b → 054b - {u'ռ', u'Ռ'}, // 057c → 054c - {u'ս', u'Ս'}, // 057d → 054d - {u'վ', u'Վ'}, // 057e → 054e - {u'տ', u'Տ'}, // 057f → 054f - {u'ր', u'Ր'}, // 0580 → 0550 - {u'ց', u'Ց'}, // 0581 → 0551 - {u'ւ', u'Ւ'}, // 0582 → 0552 - {u'փ', u'Փ'}, // 0583 → 0553 - {u'ք', u'Ք'}, // 0584 → 0554 - {u'օ', u'Օ'}, // 0585 → 0555 - {u'ֆ', u'Ֆ'}, // 0586 → 0556 - {u'ᏸ', u'Ᏸ'}, // 13f8 → 13f0 - {u'ᏹ', u'Ᏹ'}, // 13f9 → 13f1 - {u'ᏺ', u'Ᏺ'}, // 13fa → 13f2 - {u'ᏻ', u'Ᏻ'}, // 13fb → 13f3 - {u'ᏼ', u'Ᏼ'}, // 13fc → 13f4 - {u'ᏽ', u'Ᏽ'}, // 13fd → 13f5 - {u'ᵹ', u'Ᵹ'}, // 1d79 → a77d - {u'ᵽ', u'Ᵽ'}, // 1d7d → 2c63 - {u'ᶎ', u'Ᶎ'}, // 1d8e → a7c6 - {u'ḁ', u'Ḁ'}, // 1e01 → 1e00 - {u'ḃ', u'Ḃ'}, // 1e03 → 1e02 - {u'ḅ', u'Ḅ'}, // 1e05 → 1e04 - {u'ḇ', u'Ḇ'}, // 1e07 → 1e06 - {u'ḉ', u'Ḉ'}, // 1e09 → 1e08 - {u'ḋ', u'Ḋ'}, // 1e0b → 1e0a - {u'ḍ', u'Ḍ'}, // 1e0d → 1e0c - {u'ḏ', u'Ḏ'}, // 1e0f → 1e0e - {u'ḑ', u'Ḑ'}, // 1e11 → 1e10 - {u'ḓ', u'Ḓ'}, // 1e13 → 1e12 - {u'ḕ', u'Ḕ'}, // 1e15 → 1e14 - {u'ḗ', u'Ḗ'}, // 1e17 → 1e16 - {u'ḙ', u'Ḙ'}, // 1e19 → 1e18 - {u'ḛ', u'Ḛ'}, // 1e1b → 1e1a - {u'ḛ', u'Ẽ'}, // 1e1b → 1ebc - {u'ḝ', u'Ḝ'}, // 1e1d → 1e1c - {u'ḟ', u'Ḟ'}, // 1e1f → 1e1e - {u'ḡ', u'Ḡ'}, // 1e21 → 1e20 - {u'ḣ', u'Ḣ'}, // 1e23 → 1e22 - {u'ḥ', u'Ḥ'}, // 1e25 → 1e24 - {u'ḧ', u'Ḧ'}, // 1e27 → 1e26 - {u'ḩ', u'Ḩ'}, // 1e29 → 1e28 - {u'ḫ', u'Ḫ'}, // 1e2b → 1e2a - {u'ḭ', u'Ḭ'}, // 1e2d → 1e2c - {u'ḯ', u'Ḯ'}, // 1e2f → 1e2e - {u'ḱ', u'Ḱ'}, // 1e31 → 1e30 - {u'ḳ', u'Ḳ'}, // 1e33 → 1e32 - {u'ḵ', u'Ḵ'}, // 1e35 → 1e34 - {u'ḷ', u'Ḷ'}, // 1e37 → 1e36 - {u'ḹ', u'Ḹ'}, // 1e39 → 1e38 - {u'ḻ', u'Ḻ'}, // 1e3b → 1e3a - {u'ḽ', u'Ḽ'}, // 1e3d → 1e3c - {u'ḿ', u'Ḿ'}, // 1e3f → 1e3e - {u'ṁ', u'Ṁ'}, // 1e41 → 1e40 - {u'ṃ', u'Ṃ'}, // 1e43 → 1e42 - {u'ṅ', u'Ṅ'}, // 1e45 → 1e44 - {u'ṇ', u'Ṇ'}, // 1e47 → 1e46 - {u'ṉ', u'Ṉ'}, // 1e49 → 1e48 - {u'ṋ', u'Ṋ'}, // 1e4b → 1e4a - {u'ṍ', u'Ṍ'}, // 1e4d → 1e4c - {u'ṏ', u'Ṏ'}, // 1e4f → 1e4e - {u'ṑ', u'Ṑ'}, // 1e51 → 1e50 - {u'ṓ', u'Ṓ'}, // 1e53 → 1e52 - {u'ṕ', u'Ṕ'}, // 1e55 → 1e54 - {u'ṗ', u'Ṗ'}, // 1e57 → 1e56 - {u'ṙ', u'Ṙ'}, // 1e59 → 1e58 - {u'ṛ', u'Ṛ'}, // 1e5b → 1e5a - {u'ṝ', u'Ṝ'}, // 1e5d → 1e5c - {u'ṟ', u'Ṟ'}, // 1e5f → 1e5e - {u'ṡ', u'Ṡ'}, // 1e61 → 1e60 - {u'ṣ', u'Ṣ'}, // 1e63 → 1e62 - {u'ṥ', u'Ṥ'}, // 1e65 → 1e64 - {u'ṧ', u'Ṧ'}, // 1e67 → 1e66 - {u'ṩ', u'Ṩ'}, // 1e69 → 1e68 - {u'ṫ', u'Ṫ'}, // 1e6b → 1e6a - {u'ṭ', u'Ṭ'}, // 1e6d → 1e6c - {u'ṯ', u'Ṯ'}, // 1e6f → 1e6e - {u'ṱ', u'Ṱ'}, // 1e71 → 1e70 - {u'ṳ', u'Ṳ'}, // 1e73 → 1e72 - {u'ṵ', u'Ṵ'}, // 1e75 → 1e74 - {u'ṷ', u'Ṷ'}, // 1e77 → 1e76 - {u'ṹ', u'Ṹ'}, // 1e79 → 1e78 - {u'ṻ', u'Ṻ'}, // 1e7b → 1e7a - {u'ṽ', u'Ṽ'}, // 1e7d → 1e7c - {u'ṿ', u'Ṿ'}, // 1e7f → 1e7e - {u'ẁ', u'Ẁ'}, // 1e81 → 1e80 - {u'ẃ', u'Ẃ'}, // 1e83 → 1e82 - {u'ẅ', u'Ẅ'}, // 1e85 → 1e84 - {u'ẇ', u'Ẇ'}, // 1e87 → 1e86 - {u'ẉ', u'Ẉ'}, // 1e89 → 1e88 - {u'ẋ', u'Ẋ'}, // 1e8b → 1e8a - {u'ẍ', u'Ẍ'}, // 1e8d → 1e8c - {u'ẏ', u'Ẏ'}, // 1e8f → 1e8e - {u'ẑ', u'Ẑ'}, // 1e91 → 1e90 - {u'ẓ', u'Ẓ'}, // 1e93 → 1e92 - {u'ẕ', u'Ẕ'}, // 1e95 → 1e94 - {u'ạ', u'Ạ'}, // 1ea1 → 1ea0 - {u'ả', u'Ả'}, // 1ea3 → 1ea2 - {u'ấ', u'Ấ'}, // 1ea5 → 1ea4 - {u'ầ', u'Ầ'}, // 1ea7 → 1ea6 - {u'ẩ', u'Ẩ'}, // 1ea9 → 1ea8 - {u'ẫ', u'Ẫ'}, // 1eab → 1eaa - {u'ậ', u'Ậ'}, // 1ead → 1eac - {u'ắ', u'Ắ'}, // 1eaf → 1eae - {u'ằ', u'Ằ'}, // 1eb1 → 1eb0 - {u'ẳ', u'Ẳ'}, // 1eb3 → 1eb2 - {u'ẵ', u'Ẵ'}, // 1eb5 → 1eb4 - {u'ặ', u'Ặ'}, // 1eb7 → 1eb6 - {u'ẹ', u'Ẹ'}, // 1eb9 → 1eb8 - {u'ẻ', u'Ẻ'}, // 1ebb → 1eba - {u'ế', u'Ế'}, // 1ebf → 1ebe - {u'ề', u'Ề'}, // 1ec1 → 1ec0 - {u'ể', u'Ể'}, // 1ec3 → 1ec2 - {u'ễ', u'Ễ'}, // 1ec5 → 1ec4 - {u'ệ', u'Ệ'}, // 1ec7 → 1ec6 - {u'ỉ', u'Ỉ'}, // 1ec9 → 1ec8 - {u'ị', u'Ị'}, // 1ecb → 1eca - {u'ọ', u'Ọ'}, // 1ecd → 1ecc - {u'ỏ', u'Ỏ'}, // 1ecf → 1ece - {u'ố', u'Ố'}, // 1ed1 → 1ed0 - {u'ồ', u'Ồ'}, // 1ed3 → 1ed2 - {u'ổ', u'Ổ'}, // 1ed5 → 1ed4 - {u'ỗ', u'Ỗ'}, // 1ed7 → 1ed6 - {u'ộ', u'Ộ'}, // 1ed9 → 1ed8 - {u'ớ', u'Ớ'}, // 1edb → 1eda - {u'ờ', u'Ờ'}, // 1edd → 1edc - {u'ở', u'Ở'}, // 1edf → 1ede - {u'ỡ', u'Ỡ'}, // 1ee1 → 1ee0 - {u'ợ', u'Ợ'}, // 1ee3 → 1ee2 - {u'ụ', u'Ụ'}, // 1ee5 → 1ee4 - {u'ủ', u'Ủ'}, // 1ee7 → 1ee6 - {u'ứ', u'Ứ'}, // 1ee9 → 1ee8 - {u'ừ', u'Ừ'}, // 1eeb → 1eea - {u'ử', u'Ử'}, // 1eed → 1eec - {u'ữ', u'Ữ'}, // 1eef → 1eee - {u'ự', u'Ự'}, // 1ef1 → 1ef0 - {u'ỳ', u'Ỳ'}, // 1ef3 → 1ef2 - {u'ỵ', u'Ỵ'}, // 1ef5 → 1ef4 - {u'ỷ', u'Ỷ'}, // 1ef7 → 1ef6 - {u'ỹ', u'Ỹ'}, // 1ef9 → 1ef8 - {u'ỻ', u'Ỻ'}, // 1efb → 1efa - {u'ỽ', u'Ỽ'}, // 1efd → 1efc - {u'ỿ', u'Ỿ'}, // 1eff → 1efe - {u'ἀ', u'Ἀ'}, // 1f00 → 1f08 - {u'ἁ', u'Ἁ'}, // 1f01 → 1f09 - {u'ἂ', u'Ἂ'}, // 1f02 → 1f0a - {u'ἃ', u'Ἃ'}, // 1f03 → 1f0b - {u'ἄ', u'Ἄ'}, // 1f04 → 1f0c - {u'ἅ', u'Ἅ'}, // 1f05 → 1f0d - {u'ἆ', u'Ἆ'}, // 1f06 → 1f0e - {u'ἇ', u'Ἇ'}, // 1f07 → 1f0f - {u'ἐ', u'Ἐ'}, // 1f10 → 1f18 - {u'ἑ', u'Ἑ'}, // 1f11 → 1f19 - {u'ἒ', u'Ἒ'}, // 1f12 → 1f1a - {u'ἓ', u'Ἓ'}, // 1f13 → 1f1b - {u'ἔ', u'Ἔ'}, // 1f14 → 1f1c - {u'ἕ', u'Ἕ'}, // 1f15 → 1f1d - {u'ἠ', u'Ἠ'}, // 1f20 → 1f28 - {u'ἡ', u'Ἡ'}, // 1f21 → 1f29 - {u'ἢ', u'Ἢ'}, // 1f22 → 1f2a - {u'ἣ', u'Ἣ'}, // 1f23 → 1f2b - {u'ἤ', u'Ἤ'}, // 1f24 → 1f2c - {u'ἥ', u'Ἥ'}, // 1f25 → 1f2d - {u'ἦ', u'Ἦ'}, // 1f26 → 1f2e - {u'ἧ', u'Ἧ'}, // 1f27 → 1f2f - {u'ἰ', u'Ἰ'}, // 1f30 → 1f38 - {u'ἱ', u'Ἱ'}, // 1f31 → 1f39 - {u'ἲ', u'Ἲ'}, // 1f32 → 1f3a - {u'ἳ', u'Ἳ'}, // 1f33 → 1f3b - {u'ἴ', u'Ἴ'}, // 1f34 → 1f3c - {u'ἵ', u'Ἵ'}, // 1f35 → 1f3d - {u'ἶ', u'Ἶ'}, // 1f36 → 1f3e - {u'ἷ', u'Ἷ'}, // 1f37 → 1f3f - {u'ὀ', u'Ὀ'}, // 1f40 → 1f48 - {u'ὁ', u'Ὁ'}, // 1f41 → 1f49 - {u'ὂ', u'Ὂ'}, // 1f42 → 1f4a - {u'ὃ', u'Ὃ'}, // 1f43 → 1f4b - {u'ὄ', u'Ὄ'}, // 1f44 → 1f4c - {u'ὅ', u'Ὅ'}, // 1f45 → 1f4d - {u'ὑ', u'Ὑ'}, // 1f51 → 1f59 - {u'ὓ', u'Ὓ'}, // 1f53 → 1f5b - {u'ὕ', u'Ὕ'}, // 1f55 → 1f5d - {u'ὗ', u'Ὗ'}, // 1f57 → 1f5f - {u'ὠ', u'Ὠ'}, // 1f60 → 1f68 - {u'ὡ', u'Ὡ'}, // 1f61 → 1f69 - {u'ὢ', u'Ὢ'}, // 1f62 → 1f6a - {u'ὣ', u'Ὣ'}, // 1f63 → 1f6b - {u'ὤ', u'Ὤ'}, // 1f64 → 1f6c - {u'ὥ', u'Ὥ'}, // 1f65 → 1f6d - {u'ὦ', u'Ὦ'}, // 1f66 → 1f6e - {u'ὧ', u'Ὧ'}, // 1f67 → 1f6f - {u'ὰ', u'Ὰ'}, // 1f70 → 1fba - {u'ά', u'Ά'}, // 1f71 → 1fbb - {u'ὲ', u'Ὲ'}, // 1f72 → 1fc8 - {u'έ', u'Έ'}, // 1f73 → 1fc9 - {u'ὴ', u'Ὴ'}, // 1f74 → 1fca - {u'ή', u'Ή'}, // 1f75 → 1fcb - {u'ὶ', u'Ὶ'}, // 1f76 → 1fda - {u'ί', u'Ί'}, // 1f77 → 1fdb - {u'ὸ', u'Ὸ'}, // 1f78 → 1ff8 - {u'ό', u'Ό'}, // 1f79 → 1ff9 - {u'ὺ', u'Ὺ'}, // 1f7a → 1fea - {u'ύ', u'Ύ'}, // 1f7b → 1feb - {u'ὼ', u'Ὼ'}, // 1f7c → 1ffa - {u'ώ', u'Ώ'}, // 1f7d → 1ffb - {u'ᾰ', u'Ᾰ'}, // 1fb0 → 1fb8 - {u'ᾱ', u'Ᾱ'}, // 1fb1 → 1fb9 - {u'ῐ', u'Ῐ'}, // 1fd0 → 1fd8 - {u'ῑ', u'Ῑ'}, // 1fd1 → 1fd9 - {u'ῠ', u'Ῠ'}, // 1fe0 → 1fe8 - {u'ῡ', u'Ῡ'}, // 1fe1 → 1fe9 - {u'ῥ', u'Ῥ'}, // 1fe5 → 1fec - {u'ℓ', u'ℒ'}, // 2113 → 2112 - {u'ℯ', u'ℰ'}, // 212f → 2130 - {u'ℼ', u'ℿ'}, // 213c → 213f - {u'ℼ', u'ℙ'}, // 213c → 2119 - {u'ℽ', u'ℾ'}, // 213d → 213e - {u'ⅆ', u'ⅅ'}, // 2146 → 2145 - {u'ⅎ', u'Ⅎ'}, // 214e → 2132 - {u'ⰰ', u'Ⰰ'}, // 2c30 → 2c00 - {u'ⰱ', u'Ⰱ'}, // 2c31 → 2c01 - {u'ⰲ', u'Ⰲ'}, // 2c32 → 2c02 - {u'ⰳ', u'Ⰳ'}, // 2c33 → 2c03 - {u'ⰴ', u'Ⰴ'}, // 2c34 → 2c04 - {u'ⰵ', u'Ⰵ'}, // 2c35 → 2c05 - {u'ⰶ', u'Ⰶ'}, // 2c36 → 2c06 - {u'ⰷ', u'Ⰷ'}, // 2c37 → 2c07 - {u'ⰸ', u'Ⰸ'}, // 2c38 → 2c08 - {u'ⰹ', u'Ⰹ'}, // 2c39 → 2c09 - {u'ⰹ', u'Ⰻ'}, // 2c39 → 2c0b - {u'ⰺ', u'Ⰺ'}, // 2c3a → 2c0a - {u'ⰼ', u'Ⰼ'}, // 2c3c → 2c0c - {u'ⰽ', u'Ⰽ'}, // 2c3d → 2c0d - {u'ⰾ', u'Ⰾ'}, // 2c3e → 2c0e - {u'ⰿ', u'Ⰿ'}, // 2c3f → 2c0f - {u'ⱀ', u'Ⱀ'}, // 2c40 → 2c10 - {u'ⱁ', u'Ⱁ'}, // 2c41 → 2c11 - {u'ⱂ', u'Ⱂ'}, // 2c42 → 2c12 - {u'ⱃ', u'Ⱃ'}, // 2c43 → 2c13 - {u'ⱄ', u'Ⱄ'}, // 2c44 → 2c14 - {u'ⱅ', u'Ⱅ'}, // 2c45 → 2c15 - {u'ⱆ', u'Ⱆ'}, // 2c46 → 2c16 - {u'ⱇ', u'Ⱇ'}, // 2c47 → 2c17 - {u'ⱈ', u'Ⱈ'}, // 2c48 → 2c18 - {u'ⱉ', u'Ⱉ'}, // 2c49 → 2c19 - {u'ⱊ', u'Ⱊ'}, // 2c4a → 2c1a - {u'ⱋ', u'Ⱋ'}, // 2c4b → 2c1b - {u'ⱌ', u'Ⱌ'}, // 2c4c → 2c1c - {u'ⱍ', u'Ⱍ'}, // 2c4d → 2c1d - {u'ⱎ', u'Ⱎ'}, // 2c4e → 2c1e - {u'ⱏ', u'Ⱏ'}, // 2c4f → 2c1f - {u'ⱐ', u'Ⱐ'}, // 2c50 → 2c20 - {u'ⱑ', u'Ⱑ'}, // 2c51 → 2c21 - {u'ⱒ', u'Ⱒ'}, // 2c52 → 2c22 - {u'ⱓ', u'Ⱓ'}, // 2c53 → 2c23 - {u'ⱔ', u'Ⱔ'}, // 2c54 → 2c24 - {u'ⱕ', u'Ⱕ'}, // 2c55 → 2c25 - {u'ⱖ', u'Ⱖ'}, // 2c56 → 2c26 - {u'ⱗ', u'Ⱗ'}, // 2c57 → 2c27 - {u'ⱘ', u'Ⱘ'}, // 2c58 → 2c28 - {u'ⱙ', u'Ⱙ'}, // 2c59 → 2c29 - {u'ⱚ', u'Ⱚ'}, // 2c5a → 2c2a - {u'ⱛ', u'Ⱛ'}, // 2c5b → 2c2b - {u'ⱜ', u'Ⱜ'}, // 2c5c → 2c2c - {u'ⱝ', u'Ⱝ'}, // 2c5d → 2c2d - {u'ⱞ', u'Ⱞ'}, // 2c5e → 2c2e - {u'ⱡ', u'Ⱡ'}, // 2c61 → 2c60 - {u'ⱥ', u'Ⱥ'}, // 2c65 → 023a - {u'ⱦ', u'Ⱦ'}, // 2c66 → 023e - {u'ⱨ', u'Ⱨ'}, // 2c68 → 2c67 - {u'ⱪ', u'Ⱪ'}, // 2c6a → 2c69 - {u'ⱬ', u'Ⱬ'}, // 2c6c → 2c6b - {u'ⱳ', u'Ⱳ'}, // 2c73 → 2c72 - {u'ⱶ', u'Ⱶ'}, // 2c76 → 2c75 - {u'ⲁ', u'Ⲁ'}, // 2c81 → 2c80 - {u'ⲃ', u'Ⲃ'}, // 2c83 → 2c82 - {u'ⲅ', u'Ⲅ'}, // 2c85 → 2c84 - {u'ⲇ', u'Ⲇ'}, // 2c87 → 2c86 - {u'ⲉ', u'Ⲉ'}, // 2c89 → 2c88 - {u'ⲋ', u'Ⲋ'}, // 2c8b → 2c8a - {u'ⲍ', u'Ⲍ'}, // 2c8d → 2c8c - {u'ⲏ', u'Ⲏ'}, // 2c8f → 2c8e - {u'ⲑ', u'Ⲑ'}, // 2c91 → 2c90 - {u'ⲓ', u'Ⲓ'}, // 2c93 → 2c92 - {u'ⲕ', u'Ⲕ'}, // 2c95 → 2c94 - {u'ⲗ', u'Ⲗ'}, // 2c97 → 2c96 - {u'ⲙ', u'Ⲙ'}, // 2c99 → 2c98 - {u'ⲛ', u'Ⲛ'}, // 2c9b → 2c9a - {u'ⲝ', u'Ⲝ'}, // 2c9d → 2c9c - {u'ⲟ', u'Ⲟ'}, // 2c9f → 2c9e - {u'ⲡ', u'Ⲡ'}, // 2ca1 → 2ca0 - {u'ⲣ', u'Ⲣ'}, // 2ca3 → 2ca2 - {u'ⲥ', u'Ⲥ'}, // 2ca5 → 2ca4 - {u'ⲧ', u'Ⲧ'}, // 2ca7 → 2ca6 - {u'ⲩ', u'Ⲩ'}, // 2ca9 → 2ca8 - {u'ⲫ', u'Ⲫ'}, // 2cab → 2caa - {u'ⲭ', u'Ⲭ'}, // 2cad → 2cac - {u'ⲯ', u'Ⲯ'}, // 2caf → 2cae - {u'ⲱ', u'Ⲱ'}, // 2cb1 → 2cb0 - {u'ⲳ', u'Ⲳ'}, // 2cb3 → 2cb2 - {u'ⲵ', u'Ⲵ'}, // 2cb5 → 2cb4 - {u'ⲷ', u'Ⲷ'}, // 2cb7 → 2cb6 - {u'ⲹ', u'Ⲹ'}, // 2cb9 → 2cb8 - {u'ⲻ', u'Ⲻ'}, // 2cbb → 2cba - {u'ⲽ', u'Ⲽ'}, // 2cbd → 2cbc - {u'ⲿ', u'Ⲿ'}, // 2cbf → 2cbe - {u'ⳁ', u'Ⳁ'}, // 2cc1 → 2cc0 - {u'ⳃ', u'Ⳃ'}, // 2cc3 → 2cc2 - {u'ⳅ', u'Ⳅ'}, // 2cc5 → 2cc4 - {u'ⳇ', u'Ⳇ'}, // 2cc7 → 2cc6 - {u'ⳉ', u'Ⳉ'}, // 2cc9 → 2cc8 - {u'ⳋ', u'Ⳋ'}, // 2ccb → 2cca - {u'ⳍ', u'Ⳍ'}, // 2ccd → 2ccc - {u'ⳏ', u'Ⳏ'}, // 2ccf → 2cce - {u'ⳑ', u'Ⳑ'}, // 2cd1 → 2cd0 - {u'ⳓ', u'Ⳓ'}, // 2cd3 → 2cd2 - {u'ⳕ', u'Ⳕ'}, // 2cd5 → 2cd4 - {u'ⳗ', u'Ⳗ'}, // 2cd7 → 2cd6 - {u'ⳙ', u'Ⳙ'}, // 2cd9 → 2cd8 - {u'ⳛ', u'Ⳛ'}, // 2cdb → 2cda - {u'ⳝ', u'Ⳝ'}, // 2cdd → 2cdc - {u'ⳟ', u'Ⳟ'}, // 2cdf → 2cde - {u'ⳡ', u'Ⳡ'}, // 2ce1 → 2ce0 - {u'ⳣ', u'Ⳣ'}, // 2ce3 → 2ce2 - {u'ⳬ', u'Ⳬ'}, // 2cec → 2ceb - {u'ⳮ', u'Ⳮ'}, // 2cee → 2ced - {u'ⳳ', u'Ⳳ'}, // 2cf3 → 2cf2 - {u'ⴀ', u'Ⴀ'}, // 2d00 → 10a0 - {u'ⴁ', u'Ⴁ'}, // 2d01 → 10a1 - {u'ⴂ', u'Ⴂ'}, // 2d02 → 10a2 - {u'ⴃ', u'Ⴃ'}, // 2d03 → 10a3 - {u'ⴄ', u'Ⴄ'}, // 2d04 → 10a4 - {u'ⴅ', u'Ⴅ'}, // 2d05 → 10a5 - {u'ⴆ', u'Ⴆ'}, // 2d06 → 10a6 - {u'ⴇ', u'Ⴇ'}, // 2d07 → 10a7 - {u'ⴈ', u'Ⴈ'}, // 2d08 → 10a8 - {u'ⴉ', u'Ⴉ'}, // 2d09 → 10a9 - {u'ⴊ', u'Ⴊ'}, // 2d0a → 10aa - {u'ⴋ', u'Ⴋ'}, // 2d0b → 10ab - {u'ⴌ', u'Ⴌ'}, // 2d0c → 10ac - {u'ⴍ', u'Ⴍ'}, // 2d0d → 10ad - {u'ⴎ', u'Ⴎ'}, // 2d0e → 10ae - {u'ⴏ', u'Ⴏ'}, // 2d0f → 10af - {u'ⴐ', u'Ⴐ'}, // 2d10 → 10b0 - {u'ⴑ', u'Ⴑ'}, // 2d11 → 10b1 - {u'ⴒ', u'Ⴒ'}, // 2d12 → 10b2 - {u'ⴓ', u'Ⴓ'}, // 2d13 → 10b3 - {u'ⴔ', u'Ⴔ'}, // 2d14 → 10b4 - {u'ⴕ', u'Ⴕ'}, // 2d15 → 10b5 - {u'ⴖ', u'Ⴖ'}, // 2d16 → 10b6 - {u'ⴗ', u'Ⴗ'}, // 2d17 → 10b7 - {u'ⴘ', u'Ⴘ'}, // 2d18 → 10b8 - {u'ⴙ', u'Ⴙ'}, // 2d19 → 10b9 - {u'ⴚ', u'Ⴚ'}, // 2d1a → 10ba - {u'ⴛ', u'Ⴛ'}, // 2d1b → 10bb - {u'ⴜ', u'Ⴜ'}, // 2d1c → 10bc - {u'ⴝ', u'Ⴝ'}, // 2d1d → 10bd - {u'ⴞ', u'Ⴞ'}, // 2d1e → 10be - {u'ⴟ', u'Ⴟ'}, // 2d1f → 10bf - {u'ⴠ', u'Ⴠ'}, // 2d20 → 10c0 - {u'ⴡ', u'Ⴡ'}, // 2d21 → 10c1 - {u'ⴢ', u'Ⴢ'}, // 2d22 → 10c2 - {u'ⴣ', u'Ⴣ'}, // 2d23 → 10c3 - {u'ⴤ', u'Ⴤ'}, // 2d24 → 10c4 - {u'ⴥ', u'Ⴥ'}, // 2d25 → 10c5 - {u'ⴧ', u'Ⴧ'}, // 2d27 → 10c7 - {u'ⴭ', u'Ⴭ'}, // 2d2d → 10cd - {u'ꙁ', u'Ꙁ'}, // a641 → a640 - {u'ꙃ', u'Ꙃ'}, // a643 → a642 - {u'ꙅ', u'Ꙅ'}, // a645 → a644 - {u'ꙇ', u'Ꙇ'}, // a647 → a646 - {u'ꙉ', u'Ꙉ'}, // a649 → a648 - {u'ꙋ', u'Ꙋ'}, // a64b → a64a - {u'ꙍ', u'Ꙍ'}, // a64d → a64c - {u'ꙏ', u'Ꙏ'}, // a64f → a64e - {u'ꙑ', u'Ꙑ'}, // a651 → a650 - {u'ꙓ', u'Ꙓ'}, // a653 → a652 - {u'ꙕ', u'Ꙕ'}, // a655 → a654 - {u'ꙗ', u'Ꙗ'}, // a657 → a656 - {u'ꙙ', u'Ꙙ'}, // a659 → a658 - {u'ꙛ', u'Ꙛ'}, // a65b → a65a - {u'ꙝ', u'Ꙝ'}, // a65d → a65c - {u'ꙟ', u'Ꙟ'}, // a65f → a65e - {u'ꙡ', u'Ꙡ'}, // a661 → a660 - {u'ꙣ', u'Ꙣ'}, // a663 → a662 - {u'ꙥ', u'Ꙥ'}, // a665 → a664 - {u'ꙧ', u'Ꙧ'}, // a667 → a666 - {u'ꙩ', u'Ꙩ'}, // a669 → a668 - {u'ꙫ', u'Ꙫ'}, // a66b → a66a - {u'ꙭ', u'Ꙭ'}, // a66d → a66c - {u'ꚁ', u'Ꚁ'}, // a681 → a680 - {u'ꚃ', u'Ꚃ'}, // a683 → a682 - {u'ꚅ', u'Ꚅ'}, // a685 → a684 - {u'ꚇ', u'Ꚇ'}, // a687 → a686 - {u'ꚉ', u'Ꚉ'}, // a689 → a688 - {u'ꚋ', u'Ꚋ'}, // a68b → a68a - {u'ꚍ', u'Ꚍ'}, // a68d → a68c - {u'ꚏ', u'Ꚏ'}, // a68f → a68e - {u'ꚑ', u'Ꚑ'}, // a691 → a690 - {u'ꚓ', u'Ꚓ'}, // a693 → a692 - {u'ꚕ', u'Ꚕ'}, // a695 → a694 - {u'ꚗ', u'Ꚗ'}, // a697 → a696 - {u'ꚙ', u'Ꚙ'}, // a699 → a698 - {u'ꚛ', u'Ꚛ'}, // a69b → a69a - {u'ꜣ', u'Ꜣ'}, // a723 → a722 - {u'ꜥ', u'Ꜥ'}, // a725 → a724 - {u'ꜧ', u'Ꜧ'}, // a727 → a726 - {u'ꜩ', u'Ꜩ'}, // a729 → a728 - {u'ꜫ', u'Ꜫ'}, // a72b → a72a - {u'ꜭ', u'Ꜭ'}, // a72d → a72c - {u'ꜯ', u'Ꜯ'}, // a72f → a72e - {u'ꜳ', u'Ꜳ'}, // a733 → a732 - {u'ꜵ', u'Ꜵ'}, // a735 → a734 - {u'ꜷ', u'Ꜷ'}, // a737 → a736 - {u'ꜹ', u'Ꜹ'}, // a739 → a738 - {u'ꜻ', u'Ꜻ'}, // a73b → a73a - {u'ꜽ', u'Ꜽ'}, // a73d → a73c - {u'ꜿ', u'Ꜿ'}, // a73f → a73e - {u'ꝁ', u'Ꝁ'}, // a741 → a740 - {u'ꝃ', u'Ꝃ'}, // a743 → a742 - {u'ꝅ', u'Ꝅ'}, // a745 → a744 - {u'ꝇ', u'Ꝇ'}, // a747 → a746 - {u'ꝉ', u'Ꝉ'}, // a749 → a748 - {u'ꝋ', u'Ꝋ'}, // a74b → a74a - {u'ꝍ', u'Ꝍ'}, // a74d → a74c - {u'ꝏ', u'Ꝏ'}, // a74f → a74e - {u'ꝑ', u'Ꝑ'}, // a751 → a750 - {u'ꝑ', u'Ꝧ'}, // a751 → a766 - {u'ꝑ', u'Ꝗ'}, // a751 → a756 - {u'ꝓ', u'Ꝓ'}, // a753 → a752 - {u'ꝕ', u'Ꝕ'}, // a755 → a754 - {u'ꝙ', u'Ꝙ'}, // a759 → a758 - {u'ꝛ', u'Ꝛ'}, // a75b → a75a - {u'ꝝ', u'Ꝝ'}, // a75d → a75c - {u'ꝟ', u'Ꝟ'}, // a75f → a75e - {u'ꝡ', u'Ꝡ'}, // a761 → a760 - {u'ꝣ', u'Ꝣ'}, // a763 → a762 - {u'ꝥ', u'Ꝥ'}, // a765 → a764 - {u'ꝩ', u'Ꝩ'}, // a769 → a768 - {u'ꝫ', u'Ꝫ'}, // a76b → a76a - {u'ꝭ', u'Ꝭ'}, // a76d → a76c - {u'ꝯ', u'Ꝯ'}, // a76f → a76e - {u'ꝺ', u'Ꝺ'}, // a77a → a779 - {u'ꝼ', u'Ꝼ'}, // a77c → a77b - {u'ꝿ', u'Ꝿ'}, // a77f → a77e - {u'ꞁ', u'Ꞁ'}, // a781 → a780 - {u'ꞃ', u'Ꞃ'}, // a783 → a782 - {u'ꞅ', u'Ꞅ'}, // a785 → a784 - {u'ꞇ', u'Ꞇ'}, // a787 → a786 - {u'ꞌ', u'Ꞌ'}, // a78c → a78b - {u'ꞑ', u'Ꞑ'}, // a791 → a790 - {u'ꞓ', u'Ꞓ'}, // a793 → a792 - {u'ꞔ', u'Ꞔ'}, // a794 → a7c4 - {u'ꞗ', u'Ꞗ'}, // a797 → a796 - {u'ꞙ', u'Ꞙ'}, // a799 → a798 - {u'ꞛ', u'Ꞛ'}, // a79b → a79a - {u'ꞝ', u'Ꞝ'}, // a79d → a79c - {u'ꞟ', u'Ꞟ'}, // a79f → a79e - {u'ꞡ', u'Ꞡ'}, // a7a1 → a7a0 - {u'ꞣ', u'Ꞣ'}, // a7a3 → a7a2 - {u'ꞥ', u'Ꞥ'}, // a7a5 → a7a4 - {u'ꞧ', u'Ꞧ'}, // a7a7 → a7a6 - {u'ꞩ', u'Ꞩ'}, // a7a9 → a7a8 - {u'ꞵ', u'Ꞵ'}, // a7b5 → a7b4 - {u'ꞷ', u'Ꞷ'}, // a7b7 → a7b6 - {u'ꞹ', u'Ꞹ'}, // a7b9 → a7b8 - {u'ꞻ', u'Ꞻ'}, // a7bb → a7ba - {u'ꞽ', u'Ꞽ'}, // a7bd → a7bc - {u'ꞿ', u'Ꞿ'}, // a7bf → a7be - {u'ꟃ', u'Ꟃ'}, // a7c3 → a7c2 - {u'ꭓ', u'Ꭓ'}, // ab53 → a7b3 - {u'a', u'A'}, // ff41 → ff21 - {u'b', u'B'}, // ff42 → ff22 - {u'c', u'C'}, // ff43 → ff23 - {u'd', u'D'}, // ff44 → ff24 - {u'e', u'E'}, // ff45 → ff25 - {u'f', u'F'}, // ff46 → ff26 - {u'g', u'G'}, // ff47 → ff27 - {u'h', u'H'}, // ff48 → ff28 - {u'i', u'I'}, // ff49 → ff29 - {u'j', u'J'}, // ff4a → ff2a - {u'k', u'K'}, // ff4b → ff2b - {u'l', u'L'}, // ff4c → ff2c - {u'm', u'M'}, // ff4d → ff2d - {u'n', u'N'}, // ff4e → ff2e - {u'o', u'O'}, // ff4f → ff2f - {u'p', u'P'}, // ff50 → ff30 - {u'q', u'Q'}, // ff51 → ff31 - {u'r', u'R'}, // ff52 → ff32 - {u's', u'S'}, // ff53 → ff33 - {u't', u'T'}, // ff54 → ff34 - {u'u', u'U'}, // ff55 → ff35 - {u'v', u'V'}, // ff56 → ff36 - {u'w', u'W'}, // ff57 → ff37 - {u'x', u'X'}, // ff58 → ff38 - {u'y', u'Y'}, // ff59 → ff39 - {u'z', u'Z'}, // ff5a → ff3a -#endif +static const struct { + unsigned short x; + unsigned short y; + short d; +} kUpper[] = { + {0x00b5, 0x00b5, +743}, /* 1x µ ..µ → Μ ..Μ Watin */ + {0x00e0, 0x00f6, -32}, /* 23x à ..ö → À ..Ö Watin */ + {0x00f8, 0x00fe, -32}, /* 7x ø ..þ → Ø ..Þ Watin */ + {0x00ff, 0x00ff, +121}, /* 1x ÿ ..ÿ → Ÿ ..Ÿ Watin */ + {0x017a, 0x017a, -1}, /* 1x ź ..ź → Ź ..Ź Watin-A */ + {0x017c, 0x017c, -1}, /* 1x ż ..ż → Ż ..Ż Watin-A */ + {0x017e, 0x017e, -1}, /* 1x ž ..ž → Ž ..Ž Watin-A */ + {0x017f, 0x017f, -300}, /* 1x ſ ..ſ → S ..S Watin-A */ + {0x0180, 0x0180, +195}, /* 1x ƀ ..ƀ → Ƀ ..Ƀ Watin-B */ + {0x0183, 0x0183, -1}, /* 1x ƃ ..ƃ → Ƃ ..Ƃ Watin-B */ + {0x0185, 0x0185, -1}, /* 1x ƅ ..ƅ → Ƅ ..Ƅ Watin-B */ + {0x0188, 0x0188, -1}, /* 1x ƈ ..ƈ → Ƈ ..Ƈ Watin-B */ + {0x018c, 0x018c, -1}, /* 1x ƌ ..ƌ → Ƌ ..Ƌ Watin-B */ + {0x0192, 0x0192, -1}, /* 1x ƒ ..ƒ → Ƒ ..Ƒ Watin-B */ + {0x0195, 0x0195, +97}, /* 1x ƕ ..ƕ → Ƕ ..Ƕ Watin-B */ + {0x0199, 0x0199, -1}, /* 1x ƙ ..ƙ → Ƙ ..Ƙ Watin-B */ + {0x019a, 0x019a, +163}, /* 1x ƚ ..ƚ → Ƚ ..Ƚ Watin-B */ + {0x019e, 0x019e, +130}, /* 1x ƞ ..ƞ → Ƞ ..Ƞ Watin-B */ + {0x01a1, 0x01a1, -1}, /* 1x ơ ..ơ → Ơ ..Ơ Watin-B */ + {0x01a3, 0x01a3, -1}, /* 1x ƣ ..ƣ → Ƣ ..Ƣ Watin-B */ + {0x01a5, 0x01a5, -1}, /* 1x ƥ ..ƥ → Ƥ ..Ƥ Watin-B */ + {0x01a8, 0x01a8, -1}, /* 1x ƨ ..ƨ → Ƨ ..Ƨ Watin-B */ + {0x01ad, 0x01ad, -1}, /* 1x ƭ ..ƭ → Ƭ ..Ƭ Watin-B */ + {0x01b0, 0x01b0, -1}, /* 1x ư ..ư → Ư ..Ư Watin-B */ + {0x01b4, 0x01b4, -1}, /* 1x ƴ ..ƴ → Ƴ ..Ƴ Watin-B */ + {0x01b6, 0x01b6, -1}, /* 1x ƶ ..ƶ → Ƶ ..Ƶ Watin-B */ + {0x01b9, 0x01b9, -1}, /* 1x ƹ ..ƹ → Ƹ ..Ƹ Watin-B */ + {0x01bd, 0x01bd, -1}, /* 1x ƽ ..ƽ → Ƽ ..Ƽ Watin-B */ + {0x01bf, 0x01bf, +56}, /* 1x ƿ ..ƿ → Ƿ ..Ƿ Watin-B */ + {0x01c5, 0x01c5, -1}, /* 1x Dž ..Dž → DŽ ..DŽ Watin-B */ + {0x01c6, 0x01c6, -2}, /* 1x dž ..dž → DŽ ..DŽ Watin-B */ + {0x01c8, 0x01c8, -1}, /* 1x Lj ..Lj → LJ ..LJ Watin-B */ + {0x01c9, 0x01c9, -2}, /* 1x lj ..lj → LJ ..LJ Watin-B */ + {0x01cb, 0x01cb, -1}, /* 1x Nj ..Nj → NJ ..NJ Watin-B */ + {0x01cc, 0x01cc, -2}, /* 1x nj ..nj → NJ ..NJ Watin-B */ + {0x01ce, 0x01ce, -1}, /* 1x ǎ ..ǎ → Ǎ ..Ǎ Watin-B */ + {0x01dd, 0x01dd, -79}, /* 1x ǝ ..ǝ → Ǝ ..Ǝ Watin-B */ + {0x01f2, 0x01f2, -1}, /* 1x Dz ..Dz → DZ ..DZ Watin-B */ + {0x01f3, 0x01f3, -2}, /* 1x dz ..dz → DZ ..DZ Watin-B */ + {0x01f5, 0x01f5, -1}, /* 1x ǵ ..ǵ → Ǵ ..Ǵ Watin-B */ + {0x023c, 0x023c, -1}, /* 1x ȼ ..ȼ → Ȼ ..Ȼ Watin-B */ + {0x023f, 0x0240, +10815}, /* 2x ȿ ..ɀ → Ȿ ..Ɀ Watin-B */ + {0x0242, 0x0242, -1}, /* 1x ɂ ..ɂ → Ɂ ..Ɂ Watin-B */ + {0x0247, 0x0247, -1}, /* 1x ɇ ..ɇ → Ɇ ..Ɇ Watin-B */ + {0x0249, 0x0249, -1}, /* 1x ɉ ..ɉ → Ɉ ..Ɉ Watin-B */ + {0x024b, 0x024b, -1}, /* 1x ɋ ..ɋ → Ɋ ..Ɋ Watin-B */ + {0x024d, 0x024d, -1}, /* 1x ɍ ..ɍ → Ɍ ..Ɍ Watin-B */ + {0x024f, 0x024f, -1}, /* 1x ɏ ..ɏ → Ɏ ..Ɏ Watin-B */ + {0x037b, 0x037d, +130}, /* 3x ͻ ..ͽ → Ͻ ..Ͽ Greek */ + {0x03ac, 0x03ac, -38}, /* 1x ά ..ά → Ά ..Ά Greek */ + {0x03ad, 0x03af, -37}, /* 3x έ ..ί → Έ ..Ί Greek */ + {0x03b1, 0x03c1, -32}, /* 17x α ..ρ → Α ..Ρ Greek */ + {0x03c2, 0x03c2, -31}, /* 1x ς ..ς → Σ ..Σ Greek */ + {0x03c3, 0x03cb, -32}, /* 9x σ ..ϋ → Σ ..Ϋ Greek */ + {0x03cc, 0x03cc, -64}, /* 1x ό ..ό → Ό ..Ό Greek */ + {0x03cd, 0x03ce, -63}, /* 2x ύ ..ώ → Ύ ..Ώ Greek */ + {0x03d0, 0x03d0, -62}, /* 1x ϐ ..ϐ → Β ..Β Greek */ + {0x03d1, 0x03d1, -57}, /* 1x ϑ ..ϑ → Θ ..Θ Greek */ + {0x03d5, 0x03d5, -47}, /* 1x ϕ ..ϕ → Φ ..Φ Greek */ + {0x03d6, 0x03d6, -54}, /* 1x ϖ ..ϖ → Π ..Π Greek */ + {0x03dd, 0x03dd, -1}, /* 1x ϝ ..ϝ → Ϝ ..Ϝ Greek */ + {0x03f0, 0x03f0, -86}, /* 1x ϰ ..ϰ → Κ ..Κ Greek */ + {0x03f1, 0x03f1, -80}, /* 1x ϱ ..ϱ → Ρ ..Ρ Greek */ + {0x03f5, 0x03f5, -96}, /* 1x ϵ ..ϵ → Ε ..Ε Greek */ + {0x0430, 0x044f, -32}, /* 32x а ..я → А ..Я Cyrillic */ + {0x0450, 0x045f, -80}, /* 16x ѐ ..џ → Ѐ ..Џ Cyrillic */ + {0x0461, 0x0461, -1}, /* 1x ѡ ..ѡ → Ѡ ..Ѡ Cyrillic */ + {0x0463, 0x0463, -1}, /* 1x ѣ ..ѣ → Ѣ ..Ѣ Cyrillic */ + {0x0465, 0x0465, -1}, /* 1x ѥ ..ѥ → Ѥ ..Ѥ Cyrillic */ + {0x0473, 0x0473, -1}, /* 1x ѳ ..ѳ → Ѳ ..Ѳ Cyrillic */ + {0x0491, 0x0491, -1}, /* 1x ґ ..ґ → Ґ ..Ґ Cyrillic */ + {0x0499, 0x0499, -1}, /* 1x ҙ ..ҙ → Ҙ ..Ҙ Cyrillic */ + {0x049b, 0x049b, -1}, /* 1x қ ..қ → Қ ..Қ Cyrillic */ + {0x0561, 0x0586, -48}, /* 38x ա ..ֆ → Ա ..Ֆ Armenian */ + {0x10d0, 0x10fa, +3008}, /* 43x ა ..ჺ → Ა ..Ჺ Georgian */ + {0x10fd, 0x10ff, +3008}, /* 3x ჽ ..ჿ → Ჽ ..Ჿ Georgian */ + {0x13f8, 0x13fd, -8}, /* 6x ᏸ ..ᏽ → Ᏸ ..Ᏽ Cherokee */ + {0x214e, 0x214e, -28}, /* 1x ⅎ ..ⅎ → Ⅎ ..Ⅎ Letterlike */ + {0x2170, 0x217f, -16}, /* 16x ⅰ ..ⅿ → Ⅰ ..Ⅿ Numbery */ + {0x2184, 0x2184, -1}, /* 1x ↄ ..ↄ → Ↄ ..Ↄ Numbery */ + {0x24d0, 0x24e9, -26}, /* 26x ⓐ ..ⓩ → Ⓐ ..Ⓩ Enclosed */ + {0x2c30, 0x2c5e, -48}, /* 47x ⰰ ..ⱞ → Ⰰ ..Ⱞ Glagolitic */ + {0x2d00, 0x2d25, -7264}, /* 38x ⴀ ..ⴥ → Ⴀ ..Ⴥ Georgian2 */ + {0x2d27, 0x2d27, -7264}, /* 1x ⴧ ..ⴧ → Ⴧ ..Ⴧ Georgian2 */ + {0x2d2d, 0x2d2d, -7264}, /* 1x ⴭ ..ⴭ → Ⴭ ..Ⴭ Georgian2 */ + {0xff41, 0xff5a, -32}, /* 26x a..z → A..Z Dubs */ }; -static const char32_t kLowerToUpperAstral[][2] = { - {L'𐐨', L'𐐀'}, // 00010428 → 00010400 - {L'𐐩', L'𐐁'}, // 00010429 → 00010401 - {L'𐐪', L'𐐂'}, // 0001042a → 00010402 - {L'𐐫', L'𐐃'}, // 0001042b → 00010403 - {L'𐐬', L'𐐄'}, // 0001042c → 00010404 - {L'𐐭', L'𐐅'}, // 0001042d → 00010405 - {L'𐐮', L'𐐆'}, // 0001042e → 00010406 - {L'𐐯', L'𐐇'}, // 0001042f → 00010407 - {L'𐐰', L'𐐈'}, // 00010430 → 00010408 - {L'𐐱', L'𐐉'}, // 00010431 → 00010409 - {L'𐐲', L'𐐊'}, // 00010432 → 0001040a - {L'𐐳', L'𐐋'}, // 00010433 → 0001040b - {L'𐐴', L'𐐌'}, // 00010434 → 0001040c - {L'𐐵', L'𐐍'}, // 00010435 → 0001040d - {L'𐐶', L'𐐎'}, // 00010436 → 0001040e - {L'𐐷', L'𐐏'}, // 00010437 → 0001040f - {L'𐐸', L'𐐐'}, // 00010438 → 00010410 - {L'𐐹', L'𐐑'}, // 00010439 → 00010411 - {L'𐐺', L'𐐒'}, // 0001043a → 00010412 - {L'𐐻', L'𐐓'}, // 0001043b → 00010413 - {L'𐐼', L'𐐔'}, // 0001043c → 00010414 - {L'𐐽', L'𐐕'}, // 0001043d → 00010415 - {L'𐐾', L'𐐖'}, // 0001043e → 00010416 - {L'𐐿', L'𐐗'}, // 0001043f → 00010417 - {L'𐑀', L'𐐘'}, // 00010440 → 00010418 - {L'𐑁', L'𐐙'}, // 00010441 → 00010419 - {L'𐑂', L'𐐚'}, // 00010442 → 0001041a - {L'𐑃', L'𐐛'}, // 00010443 → 0001041b - {L'𐑄', L'𐐜'}, // 00010444 → 0001041c - {L'𐑅', L'𐐝'}, // 00010445 → 0001041d - {L'𐑆', L'𐐞'}, // 00010446 → 0001041e - {L'𐑇', L'𐐟'}, // 00010447 → 0001041f - {L'𐑈', L'𐐠'}, // 00010448 → 00010420 - {L'𐑉', L'𐐡'}, // 00010449 → 00010421 - {L'𐑊', L'𐐢'}, // 0001044a → 00010422 - {L'𐑋', L'𐐣'}, // 0001044b → 00010423 - {L'𐑌', L'𐐤'}, // 0001044c → 00010424 - {L'𐑍', L'𐐥'}, // 0001044d → 00010425 - {L'𐑎', L'𐐦'}, // 0001044e → 00010426 - {L'𐑏', L'𐐧'}, // 0001044f → 00010427 - {L'𐓘', L'𐒰'}, // 000104d8 → 000104b0 - {L'𐓙', L'𐒱'}, // 000104d9 → 000104b1 - {L'𐓚', L'𐒲'}, // 000104da → 000104b2 - {L'𐓛', L'𐒳'}, // 000104db → 000104b3 - {L'𐓜', L'𐒴'}, // 000104dc → 000104b4 - {L'𐓝', L'𐒵'}, // 000104dd → 000104b5 - {L'𐓞', L'𐒶'}, // 000104de → 000104b6 - {L'𐓟', L'𐒷'}, // 000104df → 000104b7 - {L'𐓠', L'𐒸'}, // 000104e0 → 000104b8 - {L'𐓡', L'𐒹'}, // 000104e1 → 000104b9 - {L'𐓢', L'𐒺'}, // 000104e2 → 000104ba - {L'𐓣', L'𐒻'}, // 000104e3 → 000104bb - {L'𐓤', L'𐒼'}, // 000104e4 → 000104bc - {L'𐓥', L'𐒽'}, // 000104e5 → 000104bd - {L'𐓦', L'𐒾'}, // 000104e6 → 000104be - {L'𐓧', L'𐒿'}, // 000104e7 → 000104bf - {L'𐓨', L'𐓀'}, // 000104e8 → 000104c0 - {L'𐓩', L'𐓁'}, // 000104e9 → 000104c1 - {L'𐓪', L'𐓂'}, // 000104ea → 000104c2 - {L'𐓫', L'𐓃'}, // 000104eb → 000104c3 - {L'𐓬', L'𐓄'}, // 000104ec → 000104c4 - {L'𐓭', L'𐓅'}, // 000104ed → 000104c5 - {L'𐓮', L'𐓆'}, // 000104ee → 000104c6 - {L'𐓯', L'𐓇'}, // 000104ef → 000104c7 - {L'𐓰', L'𐓈'}, // 000104f0 → 000104c8 - {L'𐓱', L'𐓉'}, // 000104f1 → 000104c9 - {L'𐓲', L'𐓊'}, // 000104f2 → 000104ca - {L'𐓳', L'𐓋'}, // 000104f3 → 000104cb - {L'𐓴', L'𐓌'}, // 000104f4 → 000104cc - {L'𐓵', L'𐓍'}, // 000104f5 → 000104cd - {L'𐓶', L'𐓎'}, // 000104f6 → 000104ce - {L'𐓷', L'𐓏'}, // 000104f7 → 000104cf - {L'𐓸', L'𐓐'}, // 000104f8 → 000104d0 - {L'𐓹', L'𐓑'}, // 000104f9 → 000104d1 - {L'𐓺', L'𐓒'}, // 000104fa → 000104d2 - {L'𐓻', L'𐓓'}, // 000104fb → 000104d3 - {L'𐳀', L'𐲀'}, // 00010cc0 → 00010c80 - {L'𐳁', L'𐲁'}, // 00010cc1 → 00010c81 - {L'𐳂', L'𐲉'}, // 00010cc2 → 00010c89 - {L'𐳂', L'𐲂'}, // 00010cc2 → 00010c82 - {L'𐳃', L'𐲃'}, // 00010cc3 → 00010c83 - {L'𐳄', L'𐲄'}, // 00010cc4 → 00010c84 - {L'𐳅', L'𐲅'}, // 00010cc5 → 00010c85 - {L'𐳅', L'𐲙'}, // 00010cc5 → 00010c99 - {L'𐳆', L'𐲆'}, // 00010cc6 → 00010c86 - {L'𐳇', L'𐲇'}, // 00010cc7 → 00010c87 - {L'𐳈', L'𐲈'}, // 00010cc8 → 00010c88 - {L'𐳊', L'𐲊'}, // 00010cca → 00010c8a - {L'𐳋', L'𐲋'}, // 00010ccb → 00010c8b - {L'𐳌', L'𐲌'}, // 00010ccc → 00010c8c - {L'𐳍', L'𐲍'}, // 00010ccd → 00010c8d - {L'𐳎', L'𐲎'}, // 00010cce → 00010c8e - {L'𐳏', L'𐲏'}, // 00010ccf → 00010c8f - {L'𐳐', L'𐲐'}, // 00010cd0 → 00010c90 - {L'𐳑', L'𐲑'}, // 00010cd1 → 00010c91 - {L'𐳒', L'𐲒'}, // 00010cd2 → 00010c92 - {L'𐳓', L'𐲓'}, // 00010cd3 → 00010c93 - {L'𐳔', L'𐲔'}, // 00010cd4 → 00010c94 - {L'𐳕', L'𐲪'}, // 00010cd5 → 00010caa - {L'𐳕', L'𐲕'}, // 00010cd5 → 00010c95 - {L'𐳖', L'𐲖'}, // 00010cd6 → 00010c96 - {L'𐳗', L'𐲗'}, // 00010cd7 → 00010c97 - {L'𐳘', L'𐲘'}, // 00010cd8 → 00010c98 - {L'𐳚', L'𐲚'}, // 00010cda → 00010c9a - {L'𐳛', L'𐲛'}, // 00010cdb → 00010c9b - {L'𐳜', L'𐲜'}, // 00010cdc → 00010c9c - {L'𐳝', L'𐲝'}, // 00010cdd → 00010c9d - {L'𐳞', L'𐲞'}, // 00010cde → 00010c9e - {L'𐳟', L'𐲟'}, // 00010cdf → 00010c9f - {L'𐳠', L'𐲠'}, // 00010ce0 → 00010ca0 - {L'𐳡', L'𐲡'}, // 00010ce1 → 00010ca1 - {L'𐳢', L'𐲢'}, // 00010ce2 → 00010ca2 - {L'𐳣', L'𐲣'}, // 00010ce3 → 00010ca3 - {L'𐳤', L'𐲤'}, // 00010ce4 → 00010ca4 - {L'𐳥', L'𐲥'}, // 00010ce5 → 00010ca5 - {L'𐳦', L'𐲦'}, // 00010ce6 → 00010ca6 - {L'𐳧', L'𐲧'}, // 00010ce7 → 00010ca7 - {L'𐳨', L'𐲨'}, // 00010ce8 → 00010ca8 - {L'𐳩', L'𐲩'}, // 00010ce9 → 00010ca9 - {L'𐳫', L'𐲫'}, // 00010ceb → 00010cab - {L'𐳬', L'𐲬'}, // 00010cec → 00010cac - {L'𐳭', L'𐲭'}, // 00010ced → 00010cad - {L'𐳮', L'𐲮'}, // 00010cee → 00010cae - {L'𐳯', L'𐲯'}, // 00010cef → 00010caf - {L'𐳰', L'𐲰'}, // 00010cf0 → 00010cb0 - {L'𐳱', L'𐲱'}, // 00010cf1 → 00010cb1 - {L'𐳲', L'𐲲'}, // 00010cf2 → 00010cb2 - {L'𑣀', L'𑢠'}, // 000118c0 → 000118a0 - {L'𑣁', L'𑢡'}, // 000118c1 → 000118a1 - {L'𑣂', L'𑢢'}, // 000118c2 → 000118a2 - {L'𑣃', L'𑢣'}, // 000118c3 → 000118a3 - {L'𑣄', L'𑢤'}, // 000118c4 → 000118a4 - {L'𑣅', L'𑢥'}, // 000118c5 → 000118a5 - {L'𑣆', L'𑢦'}, // 000118c6 → 000118a6 - {L'𑣇', L'𑢧'}, // 000118c7 → 000118a7 - {L'𑣈', L'𑢨'}, // 000118c8 → 000118a8 - {L'𑣉', L'𑢩'}, // 000118c9 → 000118a9 - {L'𑣊', L'𑢪'}, // 000118ca → 000118aa - {L'𑣋', L'𑢫'}, // 000118cb → 000118ab - {L'𑣌', L'𑢬'}, // 000118cc → 000118ac - {L'𑣍', L'𑢭'}, // 000118cd → 000118ad - {L'𑣎', L'𑢮'}, // 000118ce → 000118ae - {L'𑣏', L'𑢯'}, // 000118cf → 000118af - {L'𑣐', L'𑢰'}, // 000118d0 → 000118b0 - {L'𑣑', L'𑢱'}, // 000118d1 → 000118b1 - {L'𑣒', L'𑢲'}, // 000118d2 → 000118b2 - {L'𑣓', L'𑢳'}, // 000118d3 → 000118b3 - {L'𑣔', L'𑢴'}, // 000118d4 → 000118b4 - {L'𑣕', L'𑢵'}, // 000118d5 → 000118b5 - {L'𑣖', L'𑢶'}, // 000118d6 → 000118b6 - {L'𑣗', L'𑢷'}, // 000118d7 → 000118b7 - {L'𑣘', L'𑢸'}, // 000118d8 → 000118b8 - {L'𑣙', L'𑢹'}, // 000118d9 → 000118b9 - {L'𑣚', L'𑢺'}, // 000118da → 000118ba - {L'𑣛', L'𑢻'}, // 000118db → 000118bb - {L'𑣜', L'𑢼'}, // 000118dc → 000118bc - {L'𑣝', L'𑢽'}, // 000118dd → 000118bd - {L'𑣞', L'𑢾'}, // 000118de → 000118be - {L'𑣟', L'𑢿'}, // 000118df → 000118bf - {L'𖹠', L'𖹀'}, // 00016e60 → 00016e40 - {L'𖹡', L'𖹁'}, // 00016e61 → 00016e41 - {L'𖹢', L'𖹂'}, // 00016e62 → 00016e42 - {L'𖹣', L'𖹃'}, // 00016e63 → 00016e43 - {L'𖹤', L'𖹄'}, // 00016e64 → 00016e44 - {L'𖹥', L'𖹅'}, // 00016e65 → 00016e45 - {L'𖹦', L'𖹆'}, // 00016e66 → 00016e46 - {L'𖹧', L'𖹇'}, // 00016e67 → 00016e47 - {L'𖹨', L'𖹈'}, // 00016e68 → 00016e48 - {L'𖹩', L'𖹉'}, // 00016e69 → 00016e49 - {L'𖹪', L'𖹊'}, // 00016e6a → 00016e4a - {L'𖹫', L'𖹋'}, // 00016e6b → 00016e4b - {L'𖹬', L'𖹌'}, // 00016e6c → 00016e4c - {L'𖹭', L'𖹍'}, // 00016e6d → 00016e4d - {L'𖹮', L'𖹎'}, // 00016e6e → 00016e4e - {L'𖹯', L'𖹏'}, // 00016e6f → 00016e4f - {L'𖹰', L'𖹐'}, // 00016e70 → 00016e50 - {L'𖹱', L'𖹑'}, // 00016e71 → 00016e51 - {L'𖹲', L'𖹒'}, // 00016e72 → 00016e52 - {L'𖹳', L'𖹓'}, // 00016e73 → 00016e53 - {L'𖹴', L'𖹔'}, // 00016e74 → 00016e54 - {L'𖹵', L'𖹕'}, // 00016e75 → 00016e55 - {L'𖹶', L'𖹖'}, // 00016e76 → 00016e56 - {L'𖹷', L'𖹗'}, // 00016e77 → 00016e57 - {L'𖹸', L'𖹘'}, // 00016e78 → 00016e58 - {L'𖹹', L'𖹙'}, // 00016e79 → 00016e59 - {L'𖹺', L'𖹚'}, // 00016e7a → 00016e5a - {L'𖹻', L'𖹛'}, // 00016e7b → 00016e5b - {L'𖹼', L'𖹜'}, // 00016e7c → 00016e5c - {L'𖹽', L'𖹝'}, // 00016e7d → 00016e5d - {L'𖹾', L'𖹞'}, // 00016e7e → 00016e5e - {L'𖹿', L'𖹟'}, // 00016e7f → 00016e5f - {L'𝐚', L'𝐀'}, // 0001d41a → 0001d400 - {L'𝐛', L'𝐁'}, // 0001d41b → 0001d401 - {L'𝐜', L'𝐂'}, // 0001d41c → 0001d402 - {L'𝐝', L'𝐃'}, // 0001d41d → 0001d403 - {L'𝐞', L'𝐄'}, // 0001d41e → 0001d404 - {L'𝐟', L'𝐅'}, // 0001d41f → 0001d405 - {L'𝐠', L'𝐆'}, // 0001d420 → 0001d406 - {L'𝐡', L'𝐇'}, // 0001d421 → 0001d407 - {L'𝐢', L'𝐈'}, // 0001d422 → 0001d408 - {L'𝐣', L'𝐉'}, // 0001d423 → 0001d409 - {L'𝐤', L'𝐊'}, // 0001d424 → 0001d40a - {L'𝐥', L'𝐋'}, // 0001d425 → 0001d40b - {L'𝐦', L'𝐌'}, // 0001d426 → 0001d40c - {L'𝐧', L'𝐍'}, // 0001d427 → 0001d40d - {L'𝐨', L'𝐎'}, // 0001d428 → 0001d40e - {L'𝐩', L'𝐏'}, // 0001d429 → 0001d40f - {L'𝐪', L'𝐐'}, // 0001d42a → 0001d410 - {L'𝐫', L'𝐑'}, // 0001d42b → 0001d411 - {L'𝐬', L'𝐒'}, // 0001d42c → 0001d412 - {L'𝐭', L'𝐓'}, // 0001d42d → 0001d413 - {L'𝐮', L'𝐔'}, // 0001d42e → 0001d414 - {L'𝐯', L'𝐕'}, // 0001d42f → 0001d415 - {L'𝐰', L'𝐖'}, // 0001d430 → 0001d416 - {L'𝐱', L'𝐗'}, // 0001d431 → 0001d417 - {L'𝐲', L'𝐘'}, // 0001d432 → 0001d418 - {L'𝐳', L'𝐙'}, // 0001d433 → 0001d419 - {L'𝑎', L'𝐴'}, // 0001d44e → 0001d434 - {L'𝑏', L'𝐵'}, // 0001d44f → 0001d435 - {L'𝑐', L'𝐶'}, // 0001d450 → 0001d436 - {L'𝑑', L'𝐷'}, // 0001d451 → 0001d437 - {L'𝑒', L'𝐸'}, // 0001d452 → 0001d438 - {L'𝑓', L'𝐹'}, // 0001d453 → 0001d439 - {L'𝑔', L'𝐺'}, // 0001d454 → 0001d43a - {L'𝑖', L'𝐼'}, // 0001d456 → 0001d43c - {L'𝑗', L'𝐽'}, // 0001d457 → 0001d43d - {L'𝑘', L'𝐾'}, // 0001d458 → 0001d43e - {L'𝑙', L'𝐿'}, // 0001d459 → 0001d43f - {L'𝑚', L'𝑀'}, // 0001d45a → 0001d440 - {L'𝑛', L'𝑁'}, // 0001d45b → 0001d441 - {L'𝑜', L'𝑂'}, // 0001d45c → 0001d442 - {L'𝑝', L'𝑃'}, // 0001d45d → 0001d443 - {L'𝑞', L'𝑄'}, // 0001d45e → 0001d444 - {L'𝑟', L'𝑅'}, // 0001d45f → 0001d445 - {L'𝑠', L'𝑆'}, // 0001d460 → 0001d446 - {L'𝑡', L'𝑇'}, // 0001d461 → 0001d447 - {L'𝑢', L'𝑈'}, // 0001d462 → 0001d448 - {L'𝑣', L'𝑉'}, // 0001d463 → 0001d449 - {L'𝑤', L'𝑊'}, // 0001d464 → 0001d44a - {L'𝑥', L'𝑋'}, // 0001d465 → 0001d44b - {L'𝑦', L'𝑌'}, // 0001d466 → 0001d44c - {L'𝑧', L'𝑍'}, // 0001d467 → 0001d44d - {L'𝒂', L'𝘼'}, // 0001d482 → 0001d63c - {L'𝒂', L'𝑨'}, // 0001d482 → 0001d468 - {L'𝒃', L'𝘽'}, // 0001d483 → 0001d63d - {L'𝒃', L'𝑩'}, // 0001d483 → 0001d469 - {L'𝒄', L'𝘾'}, // 0001d484 → 0001d63e - {L'𝒄', L'𝑪'}, // 0001d484 → 0001d46a - {L'𝒅', L'𝘿'}, // 0001d485 → 0001d63f - {L'𝒅', L'𝑫'}, // 0001d485 → 0001d46b - {L'𝒆', L'𝙀'}, // 0001d486 → 0001d640 - {L'𝒆', L'𝑬'}, // 0001d486 → 0001d46c - {L'𝒇', L'𝙁'}, // 0001d487 → 0001d641 - {L'𝒇', L'𝑭'}, // 0001d487 → 0001d46d - {L'𝒈', L'𝙂'}, // 0001d488 → 0001d642 - {L'𝒈', L'𝑮'}, // 0001d488 → 0001d46e - {L'𝒉', L'𝙃'}, // 0001d489 → 0001d643 - {L'𝒉', L'𝑯'}, // 0001d489 → 0001d46f - {L'𝒊', L'𝙄'}, // 0001d48a → 0001d644 - {L'𝒊', L'𝑰'}, // 0001d48a → 0001d470 - {L'𝒋', L'𝙅'}, // 0001d48b → 0001d645 - {L'𝒋', L'𝑱'}, // 0001d48b → 0001d471 - {L'𝒌', L'𝙆'}, // 0001d48c → 0001d646 - {L'𝒌', L'𝑲'}, // 0001d48c → 0001d472 - {L'𝒍', L'𝙇'}, // 0001d48d → 0001d647 - {L'𝒍', L'𝑳'}, // 0001d48d → 0001d473 - {L'𝒎', L'𝙈'}, // 0001d48e → 0001d648 - {L'𝒎', L'𝑴'}, // 0001d48e → 0001d474 - {L'𝒏', L'𝙉'}, // 0001d48f → 0001d649 - {L'𝒏', L'𝑵'}, // 0001d48f → 0001d475 - {L'𝒐', L'𝑶'}, // 0001d490 → 0001d476 - {L'𝒐', L'𝙊'}, // 0001d490 → 0001d64a - {L'𝒑', L'𝙋'}, // 0001d491 → 0001d64b - {L'𝒑', L'𝑷'}, // 0001d491 → 0001d477 - {L'𝒒', L'𝑸'}, // 0001d492 → 0001d478 - {L'𝒒', L'𝙌'}, // 0001d492 → 0001d64c - {L'𝒓', L'𝙍'}, // 0001d493 → 0001d64d - {L'𝒓', L'𝑹'}, // 0001d493 → 0001d479 - {L'𝒔', L'𝙎'}, // 0001d494 → 0001d64e - {L'𝒔', L'𝑺'}, // 0001d494 → 0001d47a - {L'𝒕', L'𝙏'}, // 0001d495 → 0001d64f - {L'𝒕', L'𝑻'}, // 0001d495 → 0001d47b - {L'𝒖', L'𝙐'}, // 0001d496 → 0001d650 - {L'𝒖', L'𝑼'}, // 0001d496 → 0001d47c - {L'𝒗', L'𝙑'}, // 0001d497 → 0001d651 - {L'𝒗', L'𝑽'}, // 0001d497 → 0001d47d - {L'𝒘', L'𝑾'}, // 0001d498 → 0001d47e - {L'𝒘', L'𝙒'}, // 0001d498 → 0001d652 - {L'𝒙', L'𝑿'}, // 0001d499 → 0001d47f - {L'𝒙', L'𝙓'}, // 0001d499 → 0001d653 - {L'𝒚', L'𝒀'}, // 0001d49a → 0001d480 - {L'𝒚', L'𝙔'}, // 0001d49a → 0001d654 - {L'𝒛', L'𝒁'}, // 0001d49b → 0001d481 - {L'𝒛', L'𝙕'}, // 0001d49b → 0001d655 - {L'𝒶', L'𝒜'}, // 0001d4b6 → 0001d49c - {L'𝒷', L'ℬ'}, // 0001d4b7 → 0000212c - {L'𝒸', L'𝒞'}, // 0001d4b8 → 0001d49e - {L'𝒹', L'𝒟'}, // 0001d4b9 → 0001d49f - {L'𝒻', L'ℱ'}, // 0001d4bb → 00002131 - {L'𝒽', L'ℋ'}, // 0001d4bd → 0000210b - {L'𝒾', L'ℐ'}, // 0001d4be → 00002110 - {L'𝒿', L'𝒥'}, // 0001d4bf → 0001d4a5 - {L'𝓀', L'𝒦'}, // 0001d4c0 → 0001d4a6 - {L'𝓂', L'ℳ'}, // 0001d4c2 → 00002133 - {L'𝓃', L'𝒩'}, // 0001d4c3 → 0001d4a9 - {L'𝓅', L'𝒫'}, // 0001d4c5 → 0001d4ab - {L'𝓆', L'𝒬'}, // 0001d4c6 → 0001d4ac - {L'𝓇', L'ℛ'}, // 0001d4c7 → 0000211b - {L'𝓈', L'𝒮'}, // 0001d4c8 → 0001d4ae - {L'𝓉', L'𝒯'}, // 0001d4c9 → 0001d4af - {L'𝓊', L'𝒰'}, // 0001d4ca → 0001d4b0 - {L'𝓋', L'𝒱'}, // 0001d4cb → 0001d4b1 - {L'𝓌', L'𝒲'}, // 0001d4cc → 0001d4b2 - {L'𝓍', L'𝒳'}, // 0001d4cd → 0001d4b3 - {L'𝓎', L'𝒴'}, // 0001d4ce → 0001d4b4 - {L'𝓏', L'𝒵'}, // 0001d4cf → 0001d4b5 - {L'𝓪', L'𝓐'}, // 0001d4ea → 0001d4d0 - {L'𝓫', L'𝓑'}, // 0001d4eb → 0001d4d1 - {L'𝓬', L'𝓒'}, // 0001d4ec → 0001d4d2 - {L'𝓭', L'𝓓'}, // 0001d4ed → 0001d4d3 - {L'𝓮', L'𝓔'}, // 0001d4ee → 0001d4d4 - {L'𝓯', L'𝓕'}, // 0001d4ef → 0001d4d5 - {L'𝓰', L'𝓖'}, // 0001d4f0 → 0001d4d6 - {L'𝓱', L'𝓗'}, // 0001d4f1 → 0001d4d7 - {L'𝓲', L'𝓘'}, // 0001d4f2 → 0001d4d8 - {L'𝓳', L'𝓙'}, // 0001d4f3 → 0001d4d9 - {L'𝓴', L'𝓚'}, // 0001d4f4 → 0001d4da - {L'𝓵', L'𝓛'}, // 0001d4f5 → 0001d4db - {L'𝓶', L'𝓜'}, // 0001d4f6 → 0001d4dc - {L'𝓷', L'𝓝'}, // 0001d4f7 → 0001d4dd - {L'𝓸', L'𝓞'}, // 0001d4f8 → 0001d4de - {L'𝓹', L'𝓟'}, // 0001d4f9 → 0001d4df - {L'𝓺', L'𝓠'}, // 0001d4fa → 0001d4e0 - {L'𝓻', L'𝓡'}, // 0001d4fb → 0001d4e1 - {L'𝓼', L'𝓢'}, // 0001d4fc → 0001d4e2 - {L'𝓽', L'𝓣'}, // 0001d4fd → 0001d4e3 - {L'𝓾', L'𝓤'}, // 0001d4fe → 0001d4e4 - {L'𝓿', L'𝓥'}, // 0001d4ff → 0001d4e5 - {L'𝔀', L'𝓦'}, // 0001d500 → 0001d4e6 - {L'𝔁', L'𝓧'}, // 0001d501 → 0001d4e7 - {L'𝔂', L'𝓨'}, // 0001d502 → 0001d4e8 - {L'𝔃', L'𝓩'}, // 0001d503 → 0001d4e9 - {L'𝔞', L'𝔄'}, // 0001d51e → 0001d504 - {L'𝔟', L'𝔅'}, // 0001d51f → 0001d505 - {L'𝔡', L'𝔇'}, // 0001d521 → 0001d507 - {L'𝔢', L'𝔈'}, // 0001d522 → 0001d508 - {L'𝔣', L'𝔉'}, // 0001d523 → 0001d509 - {L'𝔤', L'𝔊'}, // 0001d524 → 0001d50a - {L'𝔧', L'𝔍'}, // 0001d527 → 0001d50d - {L'𝔨', L'𝔎'}, // 0001d528 → 0001d50e - {L'𝔩', L'𝔏'}, // 0001d529 → 0001d50f - {L'𝔪', L'𝔐'}, // 0001d52a → 0001d510 - {L'𝔫', L'𝔑'}, // 0001d52b → 0001d511 - {L'𝔬', L'𝔒'}, // 0001d52c → 0001d512 - {L'𝔭', L'𝔓'}, // 0001d52d → 0001d513 - {L'𝔮', L'𝔔'}, // 0001d52e → 0001d514 - {L'𝔰', L'𝔖'}, // 0001d530 → 0001d516 - {L'𝔱', L'𝔗'}, // 0001d531 → 0001d517 - {L'𝔲', L'𝔘'}, // 0001d532 → 0001d518 - {L'𝔳', L'𝔙'}, // 0001d533 → 0001d519 - {L'𝔴', L'𝔚'}, // 0001d534 → 0001d51a - {L'𝔵', L'𝔛'}, // 0001d535 → 0001d51b - {L'𝔶', L'𝔜'}, // 0001d536 → 0001d51c - {L'𝕒', L'𝔸'}, // 0001d552 → 0001d538 - {L'𝕓', L'𝔹'}, // 0001d553 → 0001d539 - {L'𝕔', L'ℂ'}, // 0001d554 → 00002102 - {L'𝕕', L'𝔻'}, // 0001d555 → 0001d53b - {L'𝕖', L'𝔼'}, // 0001d556 → 0001d53c - {L'𝕗', L'𝔽'}, // 0001d557 → 0001d53d - {L'𝕙', L'ℍ'}, // 0001d559 → 0000210d - {L'𝕚', L'𝕀'}, // 0001d55a → 0001d540 - {L'𝕛', L'𝕁'}, // 0001d55b → 0001d541 - {L'𝕜', L'𝕂'}, // 0001d55c → 0001d542 - {L'𝕝', L'𝕃'}, // 0001d55d → 0001d543 - {L'𝕞', L'𝕄'}, // 0001d55e → 0001d544 - {L'𝕟', L'ℕ'}, // 0001d55f → 00002115 - {L'𝕠', L'𝕆'}, // 0001d560 → 0001d546 - {L'𝕢', L'ℚ'}, // 0001d562 → 0000211a - {L'𝕣', L'ℝ'}, // 0001d563 → 0000211d - {L'𝕤', L'𝕊'}, // 0001d564 → 0001d54a - {L'𝕥', L'𝕋'}, // 0001d565 → 0001d54b - {L'𝕦', L'𝕌'}, // 0001d566 → 0001d54c - {L'𝕧', L'𝕍'}, // 0001d567 → 0001d54d - {L'𝕨', L'𝕎'}, // 0001d568 → 0001d54e - {L'𝕩', L'𝕏'}, // 0001d569 → 0001d54f - {L'𝕪', L'𝕐'}, // 0001d56a → 0001d550 - {L'𝕫', L'ℤ'}, // 0001d56b → 00002124 - {L'𝖆', L'𝕬'}, // 0001d586 → 0001d56c - {L'𝖇', L'𝕭'}, // 0001d587 → 0001d56d - {L'𝖈', L'𝕮'}, // 0001d588 → 0001d56e - {L'𝖉', L'𝕯'}, // 0001d589 → 0001d56f - {L'𝖊', L'𝕰'}, // 0001d58a → 0001d570 - {L'𝖋', L'𝕱'}, // 0001d58b → 0001d571 - {L'𝖌', L'𝕲'}, // 0001d58c → 0001d572 - {L'𝖍', L'𝕳'}, // 0001d58d → 0001d573 - {L'𝖎', L'𝕴'}, // 0001d58e → 0001d574 - {L'𝖏', L'𝕵'}, // 0001d58f → 0001d575 - {L'𝖐', L'𝕶'}, // 0001d590 → 0001d576 - {L'𝖑', L'𝕷'}, // 0001d591 → 0001d577 - {L'𝖒', L'𝕸'}, // 0001d592 → 0001d578 - {L'𝖓', L'𝕹'}, // 0001d593 → 0001d579 - {L'𝖔', L'𝕺'}, // 0001d594 → 0001d57a - {L'𝖕', L'𝕻'}, // 0001d595 → 0001d57b - {L'𝖖', L'𝕼'}, // 0001d596 → 0001d57c - {L'𝖗', L'𝕽'}, // 0001d597 → 0001d57d - {L'𝖘', L'𝕾'}, // 0001d598 → 0001d57e - {L'𝖙', L'𝕿'}, // 0001d599 → 0001d57f - {L'𝖚', L'𝖀'}, // 0001d59a → 0001d580 - {L'𝖛', L'𝖁'}, // 0001d59b → 0001d581 - {L'𝖜', L'𝖂'}, // 0001d59c → 0001d582 - {L'𝖝', L'𝖃'}, // 0001d59d → 0001d583 - {L'𝖞', L'𝖄'}, // 0001d59e → 0001d584 - {L'𝖟', L'𝖅'}, // 0001d59f → 0001d585 - {L'𝖺', L'𝖠'}, // 0001d5ba → 0001d5a0 - {L'𝖻', L'𝖡'}, // 0001d5bb → 0001d5a1 - {L'𝖼', L'𝖢'}, // 0001d5bc → 0001d5a2 - {L'𝖽', L'𝖣'}, // 0001d5bd → 0001d5a3 - {L'𝖾', L'𝖤'}, // 0001d5be → 0001d5a4 - {L'𝖿', L'𝖥'}, // 0001d5bf → 0001d5a5 - {L'𝗀', L'𝖦'}, // 0001d5c0 → 0001d5a6 - {L'𝗁', L'𝖧'}, // 0001d5c1 → 0001d5a7 - {L'𝗂', L'𝖨'}, // 0001d5c2 → 0001d5a8 - {L'𝗃', L'𝖩'}, // 0001d5c3 → 0001d5a9 - {L'𝗄', L'𝖪'}, // 0001d5c4 → 0001d5aa - {L'𝗅', L'𝖫'}, // 0001d5c5 → 0001d5ab - {L'𝗆', L'𝖬'}, // 0001d5c6 → 0001d5ac - {L'𝗇', L'𝖭'}, // 0001d5c7 → 0001d5ad - {L'𝗈', L'𝖮'}, // 0001d5c8 → 0001d5ae - {L'𝗉', L'𝖯'}, // 0001d5c9 → 0001d5af - {L'𝗊', L'𝖰'}, // 0001d5ca → 0001d5b0 - {L'𝗋', L'𝖱'}, // 0001d5cb → 0001d5b1 - {L'𝗌', L'𝖲'}, // 0001d5cc → 0001d5b2 - {L'𝗍', L'𝖳'}, // 0001d5cd → 0001d5b3 - {L'𝗎', L'𝖴'}, // 0001d5ce → 0001d5b4 - {L'𝗏', L'𝖵'}, // 0001d5cf → 0001d5b5 - {L'𝗐', L'𝖶'}, // 0001d5d0 → 0001d5b6 - {L'𝗑', L'𝖷'}, // 0001d5d1 → 0001d5b7 - {L'𝗒', L'𝖸'}, // 0001d5d2 → 0001d5b8 - {L'𝗓', L'𝖹'}, // 0001d5d3 → 0001d5b9 - {L'𝗮', L'𝗔'}, // 0001d5ee → 0001d5d4 - {L'𝗯', L'𝗕'}, // 0001d5ef → 0001d5d5 - {L'𝗰', L'𝗖'}, // 0001d5f0 → 0001d5d6 - {L'𝗱', L'𝗗'}, // 0001d5f1 → 0001d5d7 - {L'𝗲', L'𝗘'}, // 0001d5f2 → 0001d5d8 - {L'𝗳', L'𝗙'}, // 0001d5f3 → 0001d5d9 - {L'𝗴', L'𝗚'}, // 0001d5f4 → 0001d5da - {L'𝗵', L'𝗛'}, // 0001d5f5 → 0001d5db - {L'𝗶', L'𝗜'}, // 0001d5f6 → 0001d5dc - {L'𝗷', L'𝗝'}, // 0001d5f7 → 0001d5dd - {L'𝗸', L'𝗞'}, // 0001d5f8 → 0001d5de - {L'𝗹', L'𝗟'}, // 0001d5f9 → 0001d5df - {L'𝗺', L'𝗠'}, // 0001d5fa → 0001d5e0 - {L'𝗻', L'𝗡'}, // 0001d5fb → 0001d5e1 - {L'𝗼', L'𝗢'}, // 0001d5fc → 0001d5e2 - {L'𝗽', L'𝗣'}, // 0001d5fd → 0001d5e3 - {L'𝗾', L'𝗤'}, // 0001d5fe → 0001d5e4 - {L'𝗿', L'𝗥'}, // 0001d5ff → 0001d5e5 - {L'𝘀', L'𝗦'}, // 0001d600 → 0001d5e6 - {L'𝘁', L'𝗧'}, // 0001d601 → 0001d5e7 - {L'𝘂', L'𝗨'}, // 0001d602 → 0001d5e8 - {L'𝘃', L'𝗩'}, // 0001d603 → 0001d5e9 - {L'𝘄', L'𝗪'}, // 0001d604 → 0001d5ea - {L'𝘅', L'𝗫'}, // 0001d605 → 0001d5eb - {L'𝘆', L'𝗬'}, // 0001d606 → 0001d5ec - {L'𝘇', L'𝗭'}, // 0001d607 → 0001d5ed - {L'𝘢', L'𝘈'}, // 0001d622 → 0001d608 - {L'𝘣', L'𝘉'}, // 0001d623 → 0001d609 - {L'𝘤', L'𝘊'}, // 0001d624 → 0001d60a - {L'𝘥', L'𝘋'}, // 0001d625 → 0001d60b - {L'𝘦', L'𝘌'}, // 0001d626 → 0001d60c - {L'𝘧', L'𝘍'}, // 0001d627 → 0001d60d - {L'𝘨', L'𝘎'}, // 0001d628 → 0001d60e - {L'𝘩', L'𝘏'}, // 0001d629 → 0001d60f - {L'𝘪', L'𝘐'}, // 0001d62a → 0001d610 - {L'𝘫', L'𝘑'}, // 0001d62b → 0001d611 - {L'𝘬', L'𝘒'}, // 0001d62c → 0001d612 - {L'𝘭', L'𝘓'}, // 0001d62d → 0001d613 - {L'𝘮', L'𝘔'}, // 0001d62e → 0001d614 - {L'𝘯', L'𝘕'}, // 0001d62f → 0001d615 - {L'𝘰', L'𝘖'}, // 0001d630 → 0001d616 - {L'𝘱', L'𝘗'}, // 0001d631 → 0001d617 - {L'𝘲', L'𝘘'}, // 0001d632 → 0001d618 - {L'𝘳', L'𝘙'}, // 0001d633 → 0001d619 - {L'𝘴', L'𝘚'}, // 0001d634 → 0001d61a - {L'𝘵', L'𝘛'}, // 0001d635 → 0001d61b - {L'𝘶', L'𝘜'}, // 0001d636 → 0001d61c - {L'𝘷', L'𝘝'}, // 0001d637 → 0001d61d - {L'𝘸', L'𝘞'}, // 0001d638 → 0001d61e - {L'𝘹', L'𝘟'}, // 0001d639 → 0001d61f - {L'𝘺', L'𝘠'}, // 0001d63a → 0001d620 - {L'𝘻', L'𝘡'}, // 0001d63b → 0001d621 - {L'𝚊', L'𝙰'}, // 0001d68a → 0001d670 - {L'𝚋', L'𝙱'}, // 0001d68b → 0001d671 - {L'𝚌', L'𝙲'}, // 0001d68c → 0001d672 - {L'𝚍', L'𝙳'}, // 0001d68d → 0001d673 - {L'𝚎', L'𝙴'}, // 0001d68e → 0001d674 - {L'𝚏', L'𝙵'}, // 0001d68f → 0001d675 - {L'𝚐', L'𝙶'}, // 0001d690 → 0001d676 - {L'𝚑', L'𝙷'}, // 0001d691 → 0001d677 - {L'𝚒', L'𝙸'}, // 0001d692 → 0001d678 - {L'𝚓', L'𝙹'}, // 0001d693 → 0001d679 - {L'𝚔', L'𝙺'}, // 0001d694 → 0001d67a - {L'𝚕', L'𝙻'}, // 0001d695 → 0001d67b - {L'𝚖', L'𝙼'}, // 0001d696 → 0001d67c - {L'𝚗', L'𝙽'}, // 0001d697 → 0001d67d - {L'𝚘', L'𝙾'}, // 0001d698 → 0001d67e - {L'𝚙', L'𝙿'}, // 0001d699 → 0001d67f - {L'𝚚', L'𝚀'}, // 0001d69a → 0001d680 - {L'𝚛', L'𝚁'}, // 0001d69b → 0001d681 - {L'𝚜', L'𝚂'}, // 0001d69c → 0001d682 - {L'𝚝', L'𝚃'}, // 0001d69d → 0001d683 - {L'𝚞', L'𝚄'}, // 0001d69e → 0001d684 - {L'𝚟', L'𝚅'}, // 0001d69f → 0001d685 - {L'𝚠', L'𝚆'}, // 0001d6a0 → 0001d686 - {L'𝚡', L'𝚇'}, // 0001d6a1 → 0001d687 - {L'𝚢', L'𝚈'}, // 0001d6a2 → 0001d688 - {L'𝚣', L'𝚉'}, // 0001d6a3 → 0001d689 - {L'𝛂', L'𝚨'}, // 0001d6c2 → 0001d6a8 - {L'𝛃', L'𝚩'}, // 0001d6c3 → 0001d6a9 - {L'𝛄', L'𝚪'}, // 0001d6c4 → 0001d6aa - {L'𝛅', L'𝚫'}, // 0001d6c5 → 0001d6ab - {L'𝛆', L'𝚬'}, // 0001d6c6 → 0001d6ac - {L'𝛇', L'𝚭'}, // 0001d6c7 → 0001d6ad - {L'𝛈', L'𝚮'}, // 0001d6c8 → 0001d6ae - {L'𝛉', L'𝚯'}, // 0001d6c9 → 0001d6af - {L'𝛊', L'𝚰'}, // 0001d6ca → 0001d6b0 - {L'𝛋', L'𝚱'}, // 0001d6cb → 0001d6b1 - {L'𝛌', L'𝚲'}, // 0001d6cc → 0001d6b2 - {L'𝛍', L'𝚳'}, // 0001d6cd → 0001d6b3 - {L'𝛎', L'𝚴'}, // 0001d6ce → 0001d6b4 - {L'𝛏', L'𝚵'}, // 0001d6cf → 0001d6b5 - {L'𝛐', L'𝚶'}, // 0001d6d0 → 0001d6b6 - {L'𝛑', L'𝚷'}, // 0001d6d1 → 0001d6b7 - {L'𝛒', L'𝚸'}, // 0001d6d2 → 0001d6b8 - {L'𝛔', L'𝚺'}, // 0001d6d4 → 0001d6ba - {L'𝛕', L'𝚻'}, // 0001d6d5 → 0001d6bb - {L'𝛖', L'𝚼'}, // 0001d6d6 → 0001d6bc - {L'𝛗', L'𝚽'}, // 0001d6d7 → 0001d6bd - {L'𝛘', L'𝚾'}, // 0001d6d8 → 0001d6be - {L'𝛙', L'𝚿'}, // 0001d6d9 → 0001d6bf - {L'𝛚', L'𝛀'}, // 0001d6da → 0001d6c0 - {L'𝛼', L'𝛢'}, // 0001d6fc → 0001d6e2 - {L'𝛽', L'𝛣'}, // 0001d6fd → 0001d6e3 - {L'𝛾', L'𝛤'}, // 0001d6fe → 0001d6e4 - {L'𝛿', L'𝛥'}, // 0001d6ff → 0001d6e5 - {L'𝜀', L'𝛦'}, // 0001d700 → 0001d6e6 - {L'𝜁', L'𝛧'}, // 0001d701 → 0001d6e7 - {L'𝜂', L'𝛨'}, // 0001d702 → 0001d6e8 - {L'𝜃', L'𝛩'}, // 0001d703 → 0001d6e9 - {L'𝜄', L'𝛪'}, // 0001d704 → 0001d6ea - {L'𝜅', L'𝛫'}, // 0001d705 → 0001d6eb - {L'𝜆', L'𝛬'}, // 0001d706 → 0001d6ec - {L'𝜇', L'𝛭'}, // 0001d707 → 0001d6ed - {L'𝜈', L'𝛮'}, // 0001d708 → 0001d6ee - {L'𝜉', L'𝛯'}, // 0001d709 → 0001d6ef - {L'𝜊', L'𝛰'}, // 0001d70a → 0001d6f0 - {L'𝜋', L'𝛱'}, // 0001d70b → 0001d6f1 - {L'𝜌', L'𝛲'}, // 0001d70c → 0001d6f2 - {L'𝜎', L'𝛴'}, // 0001d70e → 0001d6f4 - {L'𝜏', L'𝛵'}, // 0001d70f → 0001d6f5 - {L'𝜐', L'𝛶'}, // 0001d710 → 0001d6f6 - {L'𝜑', L'𝛷'}, // 0001d711 → 0001d6f7 - {L'𝜒', L'𝛸'}, // 0001d712 → 0001d6f8 - {L'𝜓', L'𝛹'}, // 0001d713 → 0001d6f9 - {L'𝜔', L'𝛺'}, // 0001d714 → 0001d6fa - {L'𝜗', L'𝛳'}, // 0001d717 → 0001d6f3 - {L'𝜶', L'𝜜'}, // 0001d736 → 0001d71c - {L'𝜶', L'𝞐'}, // 0001d736 → 0001d790 - {L'𝜷', L'𝜝'}, // 0001d737 → 0001d71d - {L'𝜷', L'𝞑'}, // 0001d737 → 0001d791 - {L'𝜸', L'𝞒'}, // 0001d738 → 0001d792 - {L'𝜸', L'𝜞'}, // 0001d738 → 0001d71e - {L'𝜹', L'𝜟'}, // 0001d739 → 0001d71f - {L'𝜹', L'𝞓'}, // 0001d739 → 0001d793 - {L'𝜺', L'𝜠'}, // 0001d73a → 0001d720 - {L'𝜺', L'𝞔'}, // 0001d73a → 0001d794 - {L'𝜻', L'𝜡'}, // 0001d73b → 0001d721 - {L'𝜻', L'𝞕'}, // 0001d73b → 0001d795 - {L'𝜼', L'𝜢'}, // 0001d73c → 0001d722 - {L'𝜼', L'𝞖'}, // 0001d73c → 0001d796 - {L'𝜽', L'𝜣'}, // 0001d73d → 0001d723 - {L'𝜽', L'𝞗'}, // 0001d73d → 0001d797 - {L'𝜾', L'𝜤'}, // 0001d73e → 0001d724 - {L'𝜾', L'𝞘'}, // 0001d73e → 0001d798 - {L'𝜿', L'𝜥'}, // 0001d73f → 0001d725 - {L'𝜿', L'𝞙'}, // 0001d73f → 0001d799 - {L'𝝀', L'𝜦'}, // 0001d740 → 0001d726 - {L'𝝀', L'𝞚'}, // 0001d740 → 0001d79a - {L'𝝁', L'𝞛'}, // 0001d741 → 0001d79b - {L'𝝁', L'𝜧'}, // 0001d741 → 0001d727 - {L'𝝂', L'𝞜'}, // 0001d742 → 0001d79c - {L'𝝂', L'𝜨'}, // 0001d742 → 0001d728 - {L'𝝃', L'𝞝'}, // 0001d743 → 0001d79d - {L'𝝃', L'𝜩'}, // 0001d743 → 0001d729 - {L'𝝄', L'𝞞'}, // 0001d744 → 0001d79e - {L'𝝄', L'𝜪'}, // 0001d744 → 0001d72a - {L'𝝅', L'𝞟'}, // 0001d745 → 0001d79f - {L'𝝅', L'𝜫'}, // 0001d745 → 0001d72b - {L'𝝆', L'𝞠'}, // 0001d746 → 0001d7a0 - {L'𝝆', L'𝜬'}, // 0001d746 → 0001d72c - {L'𝝈', L'𝞢'}, // 0001d748 → 0001d7a2 - {L'𝝈', L'𝜮'}, // 0001d748 → 0001d72e - {L'𝝉', L'𝜯'}, // 0001d749 → 0001d72f - {L'𝝉', L'𝞣'}, // 0001d749 → 0001d7a3 - {L'𝝊', L'𝞤'}, // 0001d74a → 0001d7a4 - {L'𝝊', L'𝜰'}, // 0001d74a → 0001d730 - {L'𝝋', L'𝜱'}, // 0001d74b → 0001d731 - {L'𝝋', L'𝞥'}, // 0001d74b → 0001d7a5 - {L'𝝌', L'𝜲'}, // 0001d74c → 0001d732 - {L'𝝌', L'𝞦'}, // 0001d74c → 0001d7a6 - {L'𝝍', L'𝜳'}, // 0001d74d → 0001d733 - {L'𝝍', L'𝞧'}, // 0001d74d → 0001d7a7 - {L'𝝎', L'𝜴'}, // 0001d74e → 0001d734 - {L'𝝎', L'𝞨'}, // 0001d74e → 0001d7a8 - {L'𝝑', L'𝜭'}, // 0001d751 → 0001d72d - {L'𝝰', L'𝝖'}, // 0001d770 → 0001d756 - {L'𝝱', L'𝝗'}, // 0001d771 → 0001d757 - {L'𝝲', L'𝝘'}, // 0001d772 → 0001d758 - {L'𝝳', L'𝝙'}, // 0001d773 → 0001d759 - {L'𝝴', L'𝝚'}, // 0001d774 → 0001d75a - {L'𝝵', L'𝝛'}, // 0001d775 → 0001d75b - {L'𝝶', L'𝝜'}, // 0001d776 → 0001d75c - {L'𝝷', L'𝝝'}, // 0001d777 → 0001d75d - {L'𝝸', L'𝝞'}, // 0001d778 → 0001d75e - {L'𝝹', L'𝝟'}, // 0001d779 → 0001d75f - {L'𝝺', L'𝝠'}, // 0001d77a → 0001d760 - {L'𝝻', L'𝝡'}, // 0001d77b → 0001d761 - {L'𝝼', L'𝝢'}, // 0001d77c → 0001d762 - {L'𝝽', L'𝝣'}, // 0001d77d → 0001d763 - {L'𝝾', L'𝝤'}, // 0001d77e → 0001d764 - {L'𝝿', L'𝝥'}, // 0001d77f → 0001d765 - {L'𝞀', L'𝝦'}, // 0001d780 → 0001d766 - {L'𝞂', L'𝝨'}, // 0001d782 → 0001d768 - {L'𝞃', L'𝝩'}, // 0001d783 → 0001d769 - {L'𝞄', L'𝝪'}, // 0001d784 → 0001d76a - {L'𝞅', L'𝝫'}, // 0001d785 → 0001d76b - {L'𝞆', L'𝝬'}, // 0001d786 → 0001d76c - {L'𝞇', L'𝝭'}, // 0001d787 → 0001d76d - {L'𝞈', L'𝝮'}, // 0001d788 → 0001d76e - {L'𝟅', L'𝞡'}, // 0001d7c5 → 0001d7a1 - {L'𝟅', L'𝝧'}, // 0001d7c5 → 0001d767 - {L'𝟋', L'𝟊'}, // 0001d7cb → 0001d7ca - {L'𞤢', L'𞤀'}, // 0001e922 → 0001e900 - {L'𞤣', L'𞤁'}, // 0001e923 → 0001e901 - {L'𞤤', L'𞤂'}, // 0001e924 → 0001e902 - {L'𞤥', L'𞤃'}, // 0001e925 → 0001e903 - {L'𞤦', L'𞤄'}, // 0001e926 → 0001e904 - {L'𞤧', L'𞤅'}, // 0001e927 → 0001e905 - {L'𞤨', L'𞤆'}, // 0001e928 → 0001e906 - {L'𞤩', L'𞤇'}, // 0001e929 → 0001e907 - {L'𞤪', L'𞤈'}, // 0001e92a → 0001e908 - {L'𞤫', L'𞤉'}, // 0001e92b → 0001e909 - {L'𞤬', L'𞤊'}, // 0001e92c → 0001e90a - {L'𞤭', L'𞤋'}, // 0001e92d → 0001e90b - {L'𞤮', L'𞤌'}, // 0001e92e → 0001e90c - {L'𞤯', L'𞤍'}, // 0001e92f → 0001e90d - {L'𞤰', L'𞤎'}, // 0001e930 → 0001e90e - {L'𞤱', L'𞤏'}, // 0001e931 → 0001e90f - {L'𞤲', L'𞤐'}, // 0001e932 → 0001e910 - {L'𞤳', L'𞤑'}, // 0001e933 → 0001e911 - {L'𞤴', L'𞤒'}, // 0001e934 → 0001e912 - {L'𞤵', L'𞤓'}, // 0001e935 → 0001e913 - {L'𞤶', L'𞤔'}, // 0001e936 → 0001e914 - {L'𞤷', L'𞤕'}, // 0001e937 → 0001e915 - {L'𞤸', L'𞤖'}, // 0001e938 → 0001e916 - {L'𞤹', L'𞤗'}, // 0001e939 → 0001e917 - {L'𞤺', L'𞤘'}, // 0001e93a → 0001e918 - {L'𞤻', L'𞤙'}, // 0001e93b → 0001e919 - {L'𞤼', L'𞤚'}, // 0001e93c → 0001e91a - {L'𞤽', L'𞤛'}, // 0001e93d → 0001e91b - {L'𞤾', L'𞤜'}, // 0001e93e → 0001e91c - {L'𞤿', L'𞤝'}, // 0001e93f → 0001e91d - {L'𞥀', L'𞤞'}, // 0001e940 → 0001e91e - {L'𞥁', L'𞤟'}, // 0001e941 → 0001e91f - {L'𞥂', L'𞤠'}, // 0001e942 → 0001e920 - {L'𞥃', L'𞤡'}, // 0001e943 → 0001e921 +static const int kAstralUpper[][3] = { + {0x10428, 0x1044f, -40}, /* 40x 𐐨..𐑏 → 𐐀..𐐧 Deseret */ + {0x104d8, 0x104fb, -40}, /* 36x 𐓘..𐓻 → 𐒰..𐓓 Osage */ + {0x1d41a, 0x1d433, -26}, /* 26x 𝐚..𝐳 → 𝐀..𝐙 Math */ + {0x1d456, 0x1d467, -26}, /* 18x 𝑖..𝑧 → 𝐼..𝑍 Math */ + {0x1d482, 0x1d49b, -26}, /* 26x 𝒂..𝒛 → 𝑨..𝒁 Math */ + {0x1d4c8, 0x1d4cf, -26}, /* 8x 𝓈..𝓏 → 𝒮..𝒵 Math */ + {0x1d4ea, 0x1d503, -26}, /* 26x 𝓪..𝔃 → 𝓐..𝓩 Math */ + {0x1d527, 0x1d52e, -26}, /* 8x 𝔧..𝔮 → 𝔍..𝔔 Math */ + {0x1d586, 0x1d59f, -26}, /* 26x 𝖆..𝖟 → 𝕬..𝖅 Math */ + {0x1d5ba, 0x1d5d3, -26}, /* 26x 𝖺..𝗓 → 𝖠..𝖹 Math */ + {0x1d5ee, 0x1d607, -26}, /* 26x 𝗮..𝘇 → 𝗔..𝗭 Math */ + {0x1d622, 0x1d63b, -26}, /* 26x 𝘢..𝘻 → 𝘈..𝘡 Math */ + {0x1d68a, 0x1d6a3, +442}, /* 26x 𝒂..𝒛 → 𝘼..𝙕 Math */ + {0x1d6c2, 0x1d6d2, -26}, /* 26x 𝚊..𝚣 → 𝙰..𝚉 Math */ + {0x1d6fc, 0x1d70c, -26}, /* 17x 𝛂..𝛒 → 𝚨..𝚸 Math */ + {0x1d736, 0x1d746, -26}, /* 17x 𝛼..𝜌 → 𝛢..𝛲 Math */ + {0x1d770, 0x1d780, -26}, /* 17x 𝜶..𝝆 → 𝜜..𝜬 Math */ + {0x1d770, 0x1d756, -26}, /* 17x 𝝰..𝞀 → 𝝖..𝝦 Math */ + {0x1d736, 0x1d790, -90}, /* 17x 𝜶..𝝆 → 𝞐..𝞠 Math */ }; /** @@ -1633,33 +141,57 @@ static const char32_t kLowerToUpperAstral[][2] = { */ wint_t towupper(wint_t c) { int m, l, r; - if (isascii(c)) return toupper(c); - if (IsTiny() || c < 0x00010000) { - l = 0; - r = ARRAYLEN(kLowerToUpper) - 1; - while (l <= r) { - m = (l + r) >> 1; - if (kLowerToUpper[m][0] < c) { - l = m + 1; - } else if (kLowerToUpper[m][0] > c) { - r = m - 1; + if (c < 0200) { + if ('a' <= c && c <= 'z') { + return c - 32; + } else { + return c; + } + } else if (c <= 0xffff) { + if ((0x0101 <= c && c <= 0x0177) || /* 60x ā..ŵ → Ā..ā Watin-A */ + (0x01df <= c && c <= 0x01ef) || /* 9x ǟ..ǯ → Ǟ..Ǯ Watin-B */ + (0x01f8 <= c && c <= 0x021e) || /* 20x ǹ..ȟ → Ǹ..Ȟ Watin-B */ + (0x0222 <= c && c <= 0x0232) || /* 9x ȣ..ȳ → Ȣ..Ȳ Watin-B */ + (0x1e01 <= c && c <= 0x1eff)) { /*256x ḁ..ỿ → Ḁ..Ỿ Watin-C */ + if (c == 0x0131) return c + 232; + if (c == 0x1e9e) return c; + return c - (c & 1); + } else if (0x01d0 <= c && c <= 0x01dc) { + return c - (~c & 1); /* 7x ǐ..ǜ → Ǐ..Ǜ Watin-B */ + } else if (0xab70 <= c && c <= 0xabbf) { + return c - 38864; /* 80x ꭰ ..ꮿ → Ꭰ ..Ꮿ Cherokee Supplement */ + } else { + l = 0; + r = sizeof(kUpper) / sizeof(kUpper[0]); + while (l < r) { + m = (l + r) >> 1; + if (kUpper[m].y < c) { + l = m + 1; + } else { + r = m; + } + } + if (kUpper[l].x <= c && c <= kUpper[l].y) { + return c + kUpper[l].d; } else { - return kLowerToUpper[m][1]; + return c; } } } else { l = 0; - r = ARRAYLEN(kLowerToUpperAstral) - 1; - while (l <= r) { + r = sizeof(kAstralUpper) / sizeof(kAstralUpper[0]); + while (l < r) { m = (l + r) >> 1; - if (kLowerToUpperAstral[m][0] < c) { + if (kAstralUpper[m][1] < c) { l = m + 1; - } else if (kLowerToUpperAstral[m][0] > c) { - r = m - 1; } else { - return kLowerToUpperAstral[m][1]; + r = m; } } + if (kAstralUpper[l][0] <= c && c <= kAstralUpper[l][1]) { + return c + kAstralUpper[l][2]; + } else { + return c; + } } - return c; } diff --git a/test/libc/calls/readansi_test.c b/test/libc/calls/readansi_test.c index f5ad10afe..2fb96cf3a 100644 --- a/test/libc/calls/readansi_test.c +++ b/test/libc/calls/readansi_test.c @@ -34,23 +34,44 @@ TEST(readansi, test) { _exit(0); } close(fds[1]); - EXPECT_EQ(1, readansi(fds[0], b, 16)); + EXPECT_EQ(1, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("a", b); - EXPECT_EQ(2, readansi(fds[0], b, 16)); + EXPECT_EQ(2, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\eM", b); - EXPECT_EQ(3, readansi(fds[0], b, 16)); + EXPECT_EQ(3, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\e[A", b); - EXPECT_EQ(3, readansi(fds[0], b, 16)); + EXPECT_EQ(3, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("→", b); - EXPECT_EQ(10, readansi(fds[0], b, 16)); + EXPECT_EQ(10, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\e[123;456R", b); - EXPECT_EQ(4, readansi(fds[0], b, 16)); + EXPECT_EQ(4, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\e[>c", b); - EXPECT_EQ(3, readansi(fds[0], b, 16)); + EXPECT_EQ(3, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\eOz", b); - EXPECT_EQ(3, readansi(fds[0], b, 16)); + EXPECT_EQ(3, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("\xc2\x9bM", b); - EXPECT_EQ(0, readansi(fds[0], b, 16)); + EXPECT_EQ(0, readansi(fds[0], b, sizeof(b))); + EXPECT_STREQ("", b); + ASSERT_NE(-1, wait(&ws)); + ASSERT_TRUE(WIFEXITED(ws)); + ASSERT_EQ(0, WEXITSTATUS(ws)); +} + +TEST(readansi, testOperatingSystemCommand) { + char b[32]; + const char *s; + int ws, pid, fds[2]; + s = "\e]rm -rf /\e\\"; + ASSERT_NE(-1, pipe(fds)); + ASSERT_NE(-1, (pid = fork())); + if (!pid) { + write(fds[1], s, strlen(s)); + _exit(0); + } + close(fds[1]); + EXPECT_EQ(strlen(s), readansi(fds[0], b, sizeof(b))); + EXPECT_STREQ(s, b); + EXPECT_EQ(0, readansi(fds[0], b, sizeof(b))); EXPECT_STREQ("", b); ASSERT_NE(-1, wait(&ws)); ASSERT_TRUE(WIFEXITED(ws)); diff --git a/third_party/linenoise/ezlinenoise.c b/test/libc/str/strclen_test.c similarity index 79% rename from third_party/linenoise/ezlinenoise.c rename to test/libc/str/strclen_test.c index cbad80628..a4fc375d7 100644 --- a/third_party/linenoise/ezlinenoise.c +++ b/test/libc/str/strclen_test.c @@ -16,22 +16,13 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/runtime/gc.internal.h" -#include "libc/x/x.h" -#include "third_party/linenoise/linenoise.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/testlib/testlib.h" -/** - * Reads line of input from terminal w/ history file. - */ -char *ezlinenoise(const char *prompt, const char *prog) { - char *p, *h; - h = gc(xasprintf("%s/.%s_history", gc(xhomedir()), prog)); - linenoiseHistoryLoad(h); - p = linenoise(prompt); - if (p && *p) { - linenoiseHistoryLoad(h); - linenoiseHistoryAdd(p); - linenoiseHistorySave(h); - } - return p; +TEST(strclen, test) { + EXPECT_EQ(0, strclen("")); + EXPECT_EQ(5, strclen("hello")); + EXPECT_EQ(7, strclen("☺☻♥♦♣♠•")); + EXPECT_EQ(9, strclen("e☺e☻♥♦♣♠•")); } diff --git a/test/libc/str/towupper_test.c b/test/libc/str/towupper_test.c index 9284a1be3..48907900a 100644 --- a/test/libc/str/towupper_test.c +++ b/test/libc/str/towupper_test.c @@ -21,29 +21,35 @@ #include "libc/testlib/ezbench.h" #include "libc/testlib/testlib.h" +TEST(iswupper, test) { + EXPECT_TRUE(iswupper(L'𝐵')); +} + TEST(towupper, test) { EXPECT_EQ(u'!', towupper(u'!')); EXPECT_EQ(u'A', towupper(u'a')); EXPECT_EQ(u'À', towupper(u'à')); - if (IsTiny()) return; EXPECT_EQ(L'𝛥', towupper(L'𝛿')); EXPECT_EQ(L'B', towupper(L'b')); + EXPECT_EQ(u'Ꭰ', towupper(u'ꭰ')); } TEST(towlower, test) { EXPECT_EQ(u'!', towlower(u'!')); EXPECT_EQ(u'a', towlower(u'A')); EXPECT_EQ(u'à', towlower(u'À')); - if (IsTiny()) return; EXPECT_EQ(L'𝛿', towlower(L'𝛥')); EXPECT_EQ(L'b', towlower(L'B')); + EXPECT_EQ(u'ꭰ', towlower(u'Ꭰ')); } BENCH(towupper, bench) { EZBENCH2("towupper ascii", donothing, EXPROPRIATE(towupper(VEIL("r", L'a')))); EZBENCH2("towupper latin1", donothing, EXPROPRIATE(towupper(VEIL("r", u'A')))); - if (IsTiny()) return; + EZBENCH2("towupper watinc", donothing, + EXPROPRIATE(towupper(VEIL("r", u'Ỿ')))); + EZBENCH2("towupper greek", donothing, EXPROPRIATE(towupper(VEIL("r", u'α')))); EZBENCH2("towupper astral", donothing, EXPROPRIATE(towupper(VEIL("r", L'𝛿')))); } @@ -52,7 +58,9 @@ BENCH(towlower, bench) { EZBENCH2("towlower ascii", donothing, EXPROPRIATE(towlower(VEIL("r", L'a')))); EZBENCH2("towlower latin1", donothing, EXPROPRIATE(towlower(VEIL("r", u'A')))); - if (IsTiny()) return; + EZBENCH2("towlower watinc", donothing, + EXPROPRIATE(towlower(VEIL("r", u'Ỿ')))); + EZBENCH2("towlower greek", donothing, EXPROPRIATE(towupper(VEIL("r", u'α')))); EZBENCH2("towlower astral", donothing, EXPROPRIATE(towlower(VEIL("r", L'𝛿')))); } diff --git a/third_party/linenoise/README.cosmo b/third_party/linenoise/README.cosmo index 13b262c21..b5bea437f 100644 --- a/third_party/linenoise/README.cosmo +++ b/third_party/linenoise/README.cosmo @@ -1,7 +1,7 @@ DESCRIPTION - linenoise is a library for interactive pseudoteletypewriter command - sessions using ANSI Standard X3.64 control sequences. + Cosmopolitan Linenoise is a library for interactive pseudoteletypewriter + command sessions using ANSI Standard X3.64 control sequences. ORIGIN @@ -10,3 +10,11 @@ ORIGIN Author: antirez Date: Thu Mar 12 15:51:45 2020 +0100 Use unsigned int instead of uint like rest of code base. + +DOCUMENTATION + + See linenoise.c + +LOCAL CHANGES + + See linenoise.c diff --git a/third_party/linenoise/linenoise.c b/third_party/linenoise/linenoise.c index 5d970a955..f1f392c83 100644 --- a/third_party/linenoise/linenoise.c +++ b/third_party/linenoise/linenoise.c @@ -1,21 +1,89 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ linenoise.c -- guerrilla line editing library against the idea that a │ -│ line editing lib needs to be 20,000 lines of C code. │ │ │ -│ You can find the latest source code at: │ +│ Cosmopolitan Linenoise ── guerrilla line editing library against the │ +│ notion that a library for user-friendly pseudoteletypewriter command │ +│ sessions using ANSI standard X3.64 control sequences must have 100k+ │ +│ lines of GPL workarounds to 300 baud and bygone commercial rivalries │ │ │ -│ http://github.com/antirez/linenoise │ +│ CHANGES │ │ │ -│ Does a number of crazy assumptions that happen to be true in 99.9999% of │ -│ the 2010 UNIX computers around. │ +│ - Remove bell │ +│ - Add kill ring │ +│ - Add UTF-8 editing │ +│ - Add CTRL-R search │ +│ - React to terminal resizing │ +│ - Don't generate .data section │ +│ - Support terminal flow control │ +│ - Make history loading 10x faster │ +│ - Make multiline mode the only mode │ +│ - Restore raw mode on process foregrounding │ +│ - Make source code compatible with C++ compilers │ +│ - Fix corruption issues by using generalized parsing │ +│ - Implement nearly all GNU readline editing shortcuts │ +│ - Remove heavyweight dependencies like printf/sprintf │ +│ - Remove ISIG→^C→EAGAIN hack and catch signals properly │ +│ - Support running on Windows in MinTTY or CMD.EXE on Win10+ │ +│ - Support diacratics, русский, Ελληνικά, 中国人, 한국인, 日本 │ +│ │ +│ SHORTCUTS │ +│ │ +│ CTRL-E END │ +│ CTRL-A START │ +│ CTRL-B BACK │ +│ CTRL-F FORWARD │ +│ CTRL-L CLEAR │ +│ CTRL-H BACKSPACE │ +│ CTRL-D DELETE │ +│ CTRL-D EOF (IF EMPTY) │ +│ CTRL-N NEXT HISTORY │ +│ CTRL-P PREVIOUS HISTORY │ +│ CTRL-R SEARCH HISTORY │ +│ CTRL-G CANCEL SEARCH │ +│ ALT-< BEGINNING OF HISTORY │ +│ ALT-> END OF HISTORY │ +│ ALT-F FORWARD WORD │ +│ ALT-B BACKWARD WORD │ +│ CTRL-K KILL LINE FORWARDS │ +│ CTRL-U KILL LINE BACKWARDS │ +│ ALT-H KILL WORD BACKWARDS │ +│ CTRL-W KILL WORD BACKWARDS │ +│ CTRL-ALT-H KILL WORD BACKWARDS │ +│ ALT-D KILL WORD FORWARDS │ +│ CTRL-Y YANK │ +│ ALT-Y ROTATE KILL RING AND YANK AGAIN │ +│ CTRL-T TRANSPOSE │ +│ ALT-T TRANSPOSE WORD │ +│ ALT-U UPPERCASE WORD │ +│ ALT-L LOWERCASE WORD │ +│ ALT-C CAPITALIZE WORD │ +│ CTRL-SPACE SET MARK │ +│ CTRL-X CTRL-X GOTO MARK │ +│ CTRL-S PAUSE OUTPUT │ +│ CTRL-Q RESUME OUTPUT │ +│ CTRL-Z SUSPEND PROCESS │ +│ │ +│ EXAMPLE │ +│ │ +│ // should be ~80kb statically linked │ +│ // will save history to ~/.foo_history │ +│ // cc -fno-jump-tables -Os -o foo foo.c linenoise.c │ +│ main() { │ +│ char *line; │ +│ while ((line = ezlinenoise("IN> ", "foo"))) { │ +│ fputs("OUT> ", stdout); │ +│ fputs(line, stdout); │ +│ fputs("\n", stdout); │ +│ free(line); │ +│ } │ +│ } │ │ │ ╞══════════════════════════════════════════════════════════════════════════════╡ │ │ -│ Copyright (c) 2010-2016, Salvatore Sanfilippo │ -│ Copyright (c) 2010-2013, Pieter Noordhuis │ -│ Copyright (c) 2018-2020, Justine Tunney │ +│ Copyright 2018-2021 Justine Tunney │ +│ Copyright 2010-2016 Salvatore Sanfilippo │ +│ Copyright 2010-2013 Pieter Noordhuis │ │ │ │ All rights reserved. │ │ │ @@ -42,395 +110,619 @@ │ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE │ │ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. │ │ │ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ │ -│ CHANGES │ -│ │ -│ - Remove bell │ -│ - Windows support │ -│ - Filter out unsupported control sequences │ -│ - Filter out Thompson-Pike input sequences │ -│ - Make behavior much more like GNU readline │ -│ │ -│ TODO │ -│ │ -│ - Undo │ -│ - Kill Ring │ -│ - Ctrl+R search │ -│ - Thompson-Pike Encoding │ -│ │ -│ SHORTCUTS │ -│ │ -│ CTRL-L CLEAR SCREEN │ -│ CTRL-N NEXT HISTORY │ -│ CTRL-P PREVIOUS HISTORY │ -│ CTRL-F FORWARD CHAR │ -│ CTRL-B BACKWARD CHAR │ -│ CTRL-A BEGINNING OF LINE │ -│ CTRL-E END OF LINE │ -│ ALT-F FORWARD WORD │ -│ ALT-B BACKWARD WORD │ -│ CTRL-H DELETE CHAR BACKWARDS │ -│ CTRL-ALT-H DELETE WORD BACKWARDS │ -│ ALT-H DELETE WORD BACKWARDS │ -│ CTRL-W DELETE WORD BACKWARDS │ -│ CTRL-D DELETE CHAR FORWARDS │ -│ ALT-D DELETE WORD FORWARDS │ -│ CTRL-T TRANSPOSE CHARS │ -│ CTRL-K DELETE LINE FORWARDS │ -│ CTRL-U DELETE LINE BACKWARDS │ -│ │ -│ REFERENCE │ -│ │ -│ The big scary coding you 𝘮𝘶𝘴𝘵 use curses to abstract. │ -│ │ -│ \t TAB │ -│ \a BELL │ -│ \r CURSOR START │ -│ \b CURSOR LEFT │ -│ \177 CURSOR LEFT │ -│ \n CURSOR DOWN AND START IF OPOST │ -│ \f CURSOR DOWN AND START IF OPOST │ -│ \v CURSOR DOWN AND START IF OPOST │ -│ \eD CURSOR DOWN AND START │ -│ \eE CURSOR DOWN │ -│ \eM CURSOR UP │ -│ \ec FULL RESET │ -│ \e7 SAVE CURSOR POSITION │ -│ \e8 RESTORE CURSOR POSITION │ -│ \e(0 DEC SPECIAL GRAPHICS │ -│ \e(B USAS X3.4-1967 │ -│ \e#5 SINGLE WIDTH │ -│ \e#6 DOUBLE WIDTH │ -│ \e#8 SO MANY E │ -│ \eZ → \e/Z REPORT IDENTITY │ -│ \e[𝑛A CURSOR UP [CLAMPED] │ -│ \e[𝑛B CURSOR DOWN [CLAMPED] │ -│ \e[𝑛C CURSOR RIGHT [CLAMPED] │ -│ \e[𝑛D CURSOR LEFT [CLAMPED] │ -│ \e[𝑦;𝑥H SET CURSOR POSITION [CLAMPED] │ -│ \e[𝑥G SET CURSOR COLUMN [CLAMPED] │ -│ \e[𝑦d SET CURSOR ROW [CLAMPED] │ -│ \e[𝑛E CURSOR DOWN AND START [CLAMPED] │ -│ \e[𝑛F CURSOR UP AND START [CLAMPED] │ -│ \e[𝑛S SCROLL UP │ -│ \e[𝑛T SCROLL DOWN │ -│ \e[𝑛@ INSERT CELLS │ -│ \e[𝑛P DELETE CELLS │ -│ \e[𝑛L INSERT LINES │ -│ \e[𝑛M DELETE LINES │ -│ \e[J ERASE DISPLAY FORWARDS │ -│ \e[1J ERASE DISPLAY BACKWARDS │ -│ \e[2J ERASE DISPLAY │ -│ \e[K ERASE LINE FORWARD │ -│ \e[1K ERASE LINE BACKWARD │ -│ \e[2K ERASE LINE │ -│ \e[𝑛X ERASE CELLS │ -│ \e[0m RESET │ -│ \e[1m BOLD │ -│ \e[2m FAINT │ -│ \e[3m ITALIC │ -│ \e[4m UNDER │ -│ \e[5m BLINK │ -│ \e[7m INVERT │ -│ \e[8m CONCEAL │ -│ \e[9m STRIKE │ -│ \e[20m FRAKTUR │ -│ \e[21m DUNDER │ -│ \e[22m RESET BOLD & FAINT │ -│ \e[23m RESET ITALIC & FRAKTUR │ -│ \e[24m RESET UNDER & DUNDER │ -│ \e[25m RESET BLINK │ -│ \e[27m RESET INVERT │ -│ \e[28m RESET CONCEAL │ -│ \e[29m RESET STRIKE │ -│ \e[39m RESET FOREGROUND │ -│ \e[49m RESET BACKGROUND │ -│ \e[30m BLACK FOREGROUND │ -│ \e[31m RED FOREGROUND │ -│ \e[32m GREEN FOREGROUND │ -│ \e[33m YELLOW FOREGROUND │ -│ \e[34m BLUE FOREGROUND │ -│ \e[35m MAGENTA FOREGROUND │ -│ \e[36m CYAN FOREGROUND │ -│ \e[37m WHITE FOREGROUND │ -│ \e[40m BLACK BACKGROUND │ -│ \e[41m RED BACKGROUND │ -│ \e[42m GREEN BACKGROUND │ -│ \e[44m YELLOW BACKGROUND │ -│ \e[44m BLUE BACKGROUND │ -│ \e[45m MAGENTA BACKGROUND │ -│ \e[46m CYAN BACKGROUND │ -│ \e[47m WHITE BACKGROUND │ -│ \e[90m BRIGHT BLACK FOREGROUND │ -│ \e[91m BRIGHT RED FOREGROUND │ -│ \e[92m BRIGHT GREEN FOREGROUND │ -│ \e[93m BRIGHT YELLOW FOREGROUND │ -│ \e[94m BRIGHT BLUE FOREGROUND │ -│ \e[95m BRIGHT MAGENTA FOREGROUND │ -│ \e[96m BRIGHT CYAN FOREGROUND │ -│ \e[97m BRIGHT WHITE FOREGROUND │ -│ \e[100m BRIGHT BLACK BACKGROUND │ -│ \e[101m BRIGHT RED BACKGROUND │ -│ \e[102m BRIGHT GREEN BACKGROUND │ -│ \e[103m BRIGHT YELLOW BACKGROUND │ -│ \e[104m BRIGHT BLUE BACKGROUND │ -│ \e[105m BRIGHT MAGENTA BACKGROUND │ -│ \e[106m BRIGHT CYAN BACKGROUND │ -│ \e[107m BRIGHT WHITE BACKGROUND │ -│ \e[38;5;𝑥m XTERM256 FOREGROUND │ -│ \e[48;5;𝑥m XTERM256 BACKGROUND │ -│ \e[38;2;𝑟;𝑔;𝑏m RGB FOREGROUND │ -│ \e[48;2;𝑟;𝑔;𝑏m RGB BACKGROUND │ -│ \e[?25h SHOW CURSOR │ -│ \e[?25l HIDE CURSOR │ -│ \e[s SAVE CURSOR POSITION │ -│ \e[u RESTORE CURSOR POSITION │ -│ \e[?5h ... \e[?5l REVERSE VIDEO EPILEPSY │ -│ \e[0q RESET LEDS │ -│ \e[1q TURN ON FIRST LED │ -│ \e[2q TURN ON SECOND LED │ -│ \e[3q TURN ON THIRD LED │ -│ \e[4q TURN ON FOURTH LED │ -│ \e[c → \e[?1;0c REPORT DEVICE TYPE │ -│ \e[5n → \e[0n REPORT DEVICE STATUS │ -│ \e[6n → \e[𝑦;𝑥R REPORT CURSOR POSITION │ -│ \e7\e[9979;9979H\e[6n\e8 → \e[𝑦;𝑥R REPORT DISPLAY DIMENSIONS │ -│ │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/bits/bits.h" #include "libc/calls/calls.h" +#include "libc/calls/sigbits.h" +#include "libc/calls/struct/sigaction.h" +#include "libc/calls/struct/stat.h" #include "libc/calls/termios.h" #include "libc/calls/ttydefaults.h" #include "libc/calls/weirdtypes.h" #include "libc/errno.h" #include "libc/fmt/conv.h" -#include "libc/fmt/fmt.h" -#include "libc/fmt/itoa.h" -#include "libc/macros.internal.h" -#include "libc/runtime/gc.internal.h" -#include "libc/runtime/runtime.h" +#include "libc/mem/mem.h" +#include "libc/nexgen32e/bsr.h" +#include "libc/nexgen32e/rdtsc.h" +#include "libc/sock/sock.h" +#include "libc/stdio/append.internal.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" +#include "libc/str/tpenc.h" #include "libc/sysv/consts/fileno.h" -#include "libc/x/x.h" +#include "libc/sysv/consts/map.h" +#include "libc/sysv/consts/o.h" +#include "libc/sysv/consts/poll.h" +#include "libc/sysv/consts/prot.h" +#include "libc/sysv/consts/sa.h" +#include "libc/sysv/consts/sig.h" #include "third_party/linenoise/linenoise.h" +#include "tool/build/lib/case.h" asm(".ident\t\"\\n\\n\ -linenoise (BSD-2)\\n\ -Copyright (c) 2010-2016, Salvatore Sanfilippo \n\ -Copyright (c) 2010-2013, Pieter Noordhuis \n\ -Copyright (c) 2018-2020, Justine Tunney \""); -asm(".include \"libc/disclaimer.inc\""); -/* clang-format off */ +Cosmopolitan Linenoise (BSD-2)\\n\ +Copyright 2018-2020 Justine Tunney \\n\ +Copyright 2010-2016 Salvatore Sanfilippo \\n\ +Copyright 2010-2013 Pieter Noordhuis \""); -#define LINENOISE_MAX_LINE 4096 -#define LINENOISE_DEFAULT_HISTORY_MAX_LEN 256 -#define LINENOISE_HISTORY_NEXT 0 -#define LINENOISE_HISTORY_PREV 1 +#define LINENOISE_MAX_RING 8 +#define LINENOISE_MAX_DEBUG 16 +#define LINENOISE_MAX_HISTORY 1024 +#define LINENOISE_MAX_LINE 4096 -static char *unsupported_term[] = {"dumb","cons25","emacs",NULL}; -static linenoiseCompletionCallback *completionCallback; -static linenoiseHintsCallback *hintsCallback; -static linenoiseFreeHintsCallback *freeHintsCallback; +#define LINENOISE_HISTORY_FIRST +LINENOISE_MAX_HISTORY +#define LINENOISE_HISTORY_PREV +1 +#define LINENOISE_HISTORY_NEXT -1 +#define LINENOISE_HISTORY_LAST -LINENOISE_MAX_HISTORY -static struct termios orig_termios; /* In order to restore at exit.*/ -static int maskmode; /* Show "***" instead of input. For passwords. */ -static int rawmode; /* For atexit() function to check if restore is needed*/ -static int mlmode; /* Multi line mode. Default is single line. */ -static int atexit_registered; /* Register atexit just 1 time. */ -static int history_max_len = LINENOISE_DEFAULT_HISTORY_MAX_LEN; -static int history_len; -static char **history; +#if 0 +#define DEBUG(L, ...) linenoiseDebug(L, __VA_ARGS__) +#else +#define DEBUG(L, ...) (void)0 +#endif + +struct abuf { + char *b; + int len; +}; + +struct rune { + unsigned c; + unsigned n; +}; + +struct linenoiseRing { + unsigned i; + char *p[LINENOISE_MAX_RING]; +}; /* The linenoiseState structure represents the state during line editing. * We pass this state to functions implementing specific editing * functionalities. */ struct linenoiseState { - int ifd; /* Terminal stdin file descriptor. */ - int ofd; /* Terminal stdout file descriptor. */ - char *buf; /* Edited line buffer. */ - size_t buflen; /* Edited line buffer size. */ - const char *prompt; /* Prompt to display. */ - size_t plen; /* Prompt length. */ - size_t pos; /* Current cursor position. */ - size_t oldpos; /* Previous refresh cursor position. */ - size_t len; /* Current edited line length. */ - size_t cols; /* Number of columns in terminal. */ - size_t maxrows; /* Maximum num of rows used so far (multiline mode) */ - int history_index; /* The history index we are currently editing. */ - char *killed; + int ifd; /* Terminal stdin file descriptor */ + int ofd; /* Terminal stdout file descriptor */ + struct winsize ws; /* Rows and columns in terminal */ + char *buf; /* Edited line buffer */ + const char *prompt; /* Prompt to display */ + int hindex; /* history index */ + unsigned buflen; /* Edited line buffer size */ + unsigned pos; /* Current cursor position */ + unsigned oldpos; /* Previous refresh cursor position */ + unsigned len; /* Current edited line length */ + unsigned maxrows; /* Maximum num of rows used so far */ + unsigned mark; /* Saved cursor position */ + unsigned yi, yj; /* Boundaries of last yank */ + unsigned debugrow; /* Debug log row offset */ + char seq[2][16]; /* Keystroke history for yanking code */ }; +static const char *const kUnsupported[] = {"dumb", "cons25", "emacs"}; + +static jmp_buf jraw; +static char rawmode; +static char gotcont; +static char gotwinch; +static char maskmode; +static char iscapital; +static int historylen; +static struct linenoiseRing ring; +static struct sigaction orig_int; +static struct sigaction orig_quit; +static struct sigaction orig_cont; +static struct sigaction orig_winch; +static struct termios orig_termios; +static char *history[LINENOISE_MAX_HISTORY]; +static linenoiseHintsCallback *hintsCallback; +static linenoiseFreeHintsCallback *freeHintsCallback; +static linenoiseCompletionCallback *completionCallback; + static void linenoiseAtExit(void); -static void refreshLine(struct linenoiseState *); +static void linenoiseRefreshLine(struct linenoiseState *); -/* Debugging macro. */ -#if 0 -FILE *lndebug_fp = NULL; -#define lndebug(...) \ - do { \ - if (lndebug_fp == NULL) { \ - lndebug_fp = fopen("/tmp/lndebug.txt","a"); \ - fprintf(lndebug_fp, \ - "[%d %d %d] p: %d, rows: %d, rpos: %d, max: %d, oldmax: %d\n", \ - (int)l->len,(int)l->pos,(int)l->oldpos,plen,rows,rpos, \ - (int)l->maxrows,old_rows); \ - } \ - fprintf(lndebug_fp, ", " __VA_ARGS__); \ - fflush(lndebug_fp); \ - } while (0) -#else -#define lndebug(fmt, ...) -#endif - -/* ======================= Low level terminal handling ====================== */ - -/* Enable "mask mode". When it is enabled, instead of the input that - * the user is typing, the terminal will just display a corresponding - * number of asterisks, like "****". This is useful for passwords and other - * secrets that should not be displayed. */ -void linenoiseMaskModeEnable(void) { - maskmode = 1; +static int notwseparator(wint_t c) { + return !iswseparator(c); } -/* Disable mask mode. */ -void linenoiseMaskModeDisable(void) { - maskmode = 0; +static wint_t Capitalize(wint_t c) { + if (!iscapital) { + c = towupper(c); + iscapital = 1; + } + return c; } -/* Set if to use or not the multi line mode. */ -void linenoiseSetMultiLine(int ml) { - mlmode = ml; +static struct rune DecodeUtf8(int c) { + struct rune r; + if (c < 252) { + r.n = bsr(255 & ~c); + r.c = c & (((1 << r.n) - 1) | 3); + r.n = 6 - r.n; + } else { + r.c = c & 3; + r.n = 5; + } + return r; } -/* Return true if the terminal name is in the list of terminals we know are - * not able to understand basic escape sequences. */ -static int isUnsupportedTerm(void) { - int j; - char *term = getenv("TERM"); - if (term == NULL) return 0; - for (j = 0; unsupported_term[j]; j++) { - if (!strcasecmp(term,unsupported_term[j])) { - return 1; - } +static size_t GetFdSize(int fd) { + struct stat st; + st.st_size = 0; + fstat(fd, &st); + return st.st_size; +} + +static char *GetLine(FILE *f) { + ssize_t rc; + char *p = 0; + size_t n, c = 0; + if ((rc = getdelim(&p, &c, '\n', f)) != EOF) { + for (n = rc; n; --n) { + if (p[n - 1] == '\r' || p[n - 1] == '\n') { + p[n - 1] = 0; + } else { + break; + } } + return p; + } else { + free(p); return 0; + } } -/* Raw mode: 1960's magic. */ -static int enableRawMode(int fd) { - struct termios raw; - if (!isatty(fileno(stdin))) goto fatal; - if (!atexit_registered) { - atexit(linenoiseAtExit); - atexit_registered = 1; - } - if (tcgetattr(fd,&orig_termios) == -1) goto fatal; - raw = orig_termios; /* modify the original mode */ - /* input modes: no break, no CR to NL, no parity check, no strip char, - * no start/stop output control. */ - raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); - /* output modes - disable post processing */ - raw.c_oflag &= ~(OPOST); - /* control modes - set 8 bit chars */ - raw.c_cflag |= (CS8); - /* local modes - echoing off, canonical off, no extended functions, - * no signal chars (^Z,^C) */ - raw.c_lflag &= ~(ECHO | ICANON | IEXTEN); - /* control chars - set return condition: min number of bytes and timer. - * We want read to return every single byte, without timeout. */ - raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0; /* 1 byte, no timer */ - /* put terminal in raw mode */ - if (tcsetattr(fd,TCSANOW,&raw) < 0) goto fatal; - rawmode = 1; - return 0; -fatal: - errno = ENOTTY; - return -1; -} - -void linenoiseDisableRawMode(int fd) { - /* Don't even check the return value as it's too late. */ - if (!isatty(fileno(stdin))) return; - if (rawmode && tcsetattr(fd,TCSAFLUSH,&orig_termios) != -1) - rawmode = 0; -} - -/* Use the ESC [6n escape sequence to query the horizontal cursor position - * and return it. On error -1 is returned, on success the position of the - * cursor. */ -static int getCursorPosition(int ifd, int ofd) { - int cols, rows; - char buf[16], *p; - unsigned int i = 0; - /* Report cursor location */ - if (xwrite(ofd, "\e[6n", 4) == -1) return -1; - /* Read the response: ESC [ rows ; cols R */ - while (i < sizeof(buf)-1) { - if (read(ifd,buf+i,1) != 1) break; - if (buf[i++] == 'R') break; - } - buf[i] = '\0'; - /* Parse it. */ - p = buf+2; - if (*p++ != '\e' || *p++ != '[') return -1; - rows = strtol(p,&p,10); - if (*p==';') ++p; - cols = strtol(p,&p,10); - return cols; -} - -/* Try to get the number of columns in the current terminal, or assume 80 - * if it fails. */ -static int getColumns(int ifd, int ofd) { - struct winsize ws; - if (ioctl(1, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) { - /* ioctl() failed. Try to query the terminal itself. */ - int start, cols; - /* Get the initial position so we can restore it later. */ - start = getCursorPosition(ifd,ofd); - if (start == -1) goto failed; - /* Go to right margin and get position. */ - if (xwrite(ofd,"\e[999C",6) == -1) goto failed; - cols = getCursorPosition(ifd,ofd); - if (cols == -1) goto failed; - /* Restore position. */ - if (cols > start) { - char seq[26], *p; - p=stpcpy(seq,"\e["); - p+=int64toarray_radix10(cols-start,p),*p++='D'; - xwrite(ofd,seq,p-seq); +static const char *FindSubstringReverse(const char *p, size_t n, const char *q, + size_t m) { + size_t i; + if (m <= n) { + for (n -= m; n; --n) { + for (i = 0; i < m; ++i) { + if (p[n + i] != q[i]) { + break; } - return cols; + } + if (i == m) { + return p + n; + } + } + } + return 0; +} + +static int ParseUnsigned(const char *s, void *e) { + int c, x; + for (x = 0; (c = *s++);) { + if ('0' <= c && c <= '9') { + x = MIN(c - '0' + x * 10, 32767); } else { - return ws.ws_col; + break; } -failed: - return 80; + } + if (e) *(const char **)e = s; + return x; +} + +static char *FormatUnsigned(char *p, unsigned x) { + char t; + size_t i, a, b; + i = 0; + do { + p[i++] = x % 10 + '0'; + x = x / 10; + } while (x > 0); + p[i] = '\0'; + if (i) { + for (a = 0, b = i - 1; a < b; ++a, --b) { + t = p[a]; + p[a] = p[b]; + p[b] = t; + } + } + return p + i; +} + +static size_t GetMonospaceWidth(const char *p, size_t n) { + int c; + size_t i, w; + struct rune r; + enum { kAscii, kUtf8, kEsc, kCsi1, kCsi2, kSs, kNf, kStr, kStr2 } t; + for (r.c = 0, r.n = 0, t = kAscii, w = i = 0; i < n; ++i) { + c = p[i] & 255; + switch (t) { + Whoopsie: + t = kAscii; + /* fallthrough */ + case kAscii: + if (c < 0200) { + if (c == 033) { + t = kEsc; + } else { + ++w; + } + } else if (c >= 0300) { + t = kUtf8; + r = DecodeUtf8(c); + } + break; + case kUtf8: + if ((c & 0300) == 0200) { + r.c <<= 6; + r.c |= c & 077; + if (!--r.n) { + switch (r.c) { + case 033: + t = kEsc; + break; + case 0x9b: + t = kCsi1; + break; + case 0x8e: + case 0x8f: + t = kSs; + break; + case 0x90: + case 0x98: + case 0x9d: + case 0x9e: + case 0x9f: + t = kStr; + break; + default: + w += wcwidth(r.c); + t = kAscii; + break; + } + } + } else { + goto Whoopsie; + } + break; + case kEsc: + if (0x20 <= c && c <= 0x2f) { + t = kNf; + } else if (0x30 <= c && c <= 0x3f) { + t = kAscii; + } else if (0x20 <= c && c <= 0x5F) { + switch (c) { + case '[': + t = kCsi1; + break; + case 'N': + case 'O': + t = kSs; + break; + case 'P': + case 'X': + case ']': + case '^': + case '_': + t = kStr; + break; + case '\\': + goto Whoopsie; + default: + t = kAscii; + break; + } + } else if (0x60 <= c && c <= 0x7e) { + t = kAscii; + } else if (c == 033) { + if (i == 3) t = kAscii; + } else { + t = kAscii; + } + break; + case kSs: + t = kAscii; + break; + case kNf: + if (0x30 <= c && c <= 0x7e) { + t = kAscii; + } else if (!(0x20 <= c && c <= 0x2f)) { + goto Whoopsie; + } + break; + case kCsi1: + if (0x20 <= c && c <= 0x2f) { + t = kCsi2; + } else if (c == '[' && i == 3) { + /* linux function keys */ + } else if (0x40 <= c && c <= 0x7e) { + t = kAscii; + } else if (!(0x30 <= c && c <= 0x3f)) { + goto Whoopsie; + } + break; + case kCsi2: + if (0x40 <= c && c <= 0x7e) { + t = kAscii; + } else if (!(0x20 <= c && c <= 0x2f)) { + goto Whoopsie; + } + break; + case kStr: + switch (c) { + case '\a': + t = kAscii; + break; + case 0033: + case 0302: + t = kStr2; + break; + default: + break; + } + break; + case kStr2: + switch (c) { + case '\a': + case '\\': + case 0234: + t = kAscii; + break; + default: + t = kStr; + break; + } + break; + default: + assert(0); + } + } + return w; +} + +static void abInit(struct abuf *ab) { + ab->b = malloc(1); + ab->len = 0; + ab->b[0] = 0; +} + +static void abAppend(struct abuf *ab, const char *s, int len) { + char *p; + if (!(p = realloc(ab->b, ab->len + len + 1))) return; + memcpy(p + ab->len, s, len); + p[ab->len + len] = 0; + ab->b = p; + ab->len += len; +} + +static void abAppends(struct abuf *ab, const char *s) { + abAppend(ab, s, strlen(s)); +} + +static void abAppendu(struct abuf *ab, unsigned u) { + char b[11]; + abAppend(ab, b, FormatUnsigned(b, u) - b); +} + +static void abAppendw(struct abuf *ab, unsigned long long w) { + char b[8]; + unsigned n = 0; + do b[n++] = w; + while ((w >>= 8)); + abAppend(ab, b, n); +} + +static void abFree(struct abuf *ab) { + free(ab->b); +} + +/** + * Enables "mask mode". + * + * When it is enabled, instead of the input that the user is typing, the + * terminal will just display a corresponding number of asterisks, like + * "****". This is useful for passwords and other secrets that should + * not be displayed. + */ +void linenoiseMaskModeEnable(void) { + maskmode = 1; +} + +void linenoiseMaskModeDisable(void) { + maskmode = 0; +} + +static void linenoiseOnCont(int sig) { + gotcont = 1; +} + +static void linenoiseOnWinch(int sig) { + gotwinch = 1; +} + +static void linenoiseOnInt(int sig) { + longjmp(jraw, sig); +} + +static void linenoiseOnQuit(int sig) { + longjmp(jraw, sig); +} + +static int linenoiseIsUnsupportedTerm(void) { + int i; + char *term; + static char once, res; + if (!once) { + if ((term = getenv("TERM"))) { + for (i = 0; i < sizeof(kUnsupported) / sizeof(*kUnsupported); i++) { + if (!strcasecmp(term, kUnsupported[i])) { + res = 1; + break; + } + } + } + once = 1; + } + return res; +} + +static int enableRawMode(int fd) { + struct termios raw; + struct sigaction sa; + if (tcgetattr(fd, &orig_termios) != -1) { + raw = orig_termios; + raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP); + raw.c_lflag &= ~(ECHO | ICANON | IEXTEN); + raw.c_oflag &= ~OPOST; + raw.c_iflag |= IUTF8; + raw.c_cflag |= CS8; + raw.c_cc[VMIN] = 1; + raw.c_cc[VTIME] = 0; + if (tcsetattr(fd, TCSANOW, &raw) != -1) { + sa.sa_flags = 0; + sa.sa_handler = linenoiseOnCont; + sigemptyset(&sa.sa_mask); + sigaction(SIGCONT, &sa, &orig_cont); + sa.sa_handler = linenoiseOnWinch; + sigaction(SIGWINCH, &sa, &orig_winch); + rawmode = fd; + gotwinch = 0; + gotcont = 0; + return 0; + } + } + errno = ENOTTY; + return -1; +} + +void linenoiseDisableRawMode(void) { + if (rawmode != -1) { + sigaction(SIGCONT, &orig_cont, 0); + sigaction(SIGWINCH, &orig_winch, 0); + tcsetattr(rawmode, TCSAFLUSH, &orig_termios); + rawmode = -1; + } +} + +static int linenoiseWrite(int fd, const void *p, size_t n) { + ssize_t rc; + size_t wrote; + do { + for (;;) { + rc = write(fd, p, n); + if (rc == -1 && errno == EINTR) { + continue; + } else { + break; + } + } + if (rc != -1) { + wrote = rc; + n -= wrote; + p = (char *)p + wrote; + } else { + return -1; + } + } while (n); + return 0; +} + +static int linenoiseWriteStr(int fd, const char *p) { + return linenoiseWrite(fd, p, strlen(p)); +} + +static void linenoiseDebug(struct linenoiseState *l, const char *fmt, ...) { + va_list va; + char *msg = 0; + char *ansi = 0; + int x, y, n, dy, xn; + va_start(va, fmt); + (vappendf)(&msg, fmt, va); + va_end(va); + xn = l->ws.ws_col; + xn = MAX(xn, 80); + y = l->debugrow; + n = GetMonospaceWidth(msg, strlen(msg)); + x = MAX(xn - n, 0); + (appendf)(&ansi, "\e7\e[%u;%uH\e[1K%s\e8", y + 1, x + 1, msg); + linenoiseWrite(l->ofd, ansi, appendz(ansi).i); + y = (y + (n + (xn - 1)) / xn) % LINENOISE_MAX_DEBUG; + l->debugrow = y; + free(ansi); + free(msg); +} + +static ssize_t linenoiseRead(int fd, char *buf, size_t size, + struct linenoiseState *l) { + ssize_t rc; + int refreshme; + do { + refreshme = 0; + if (gotcont && rawmode != -1) { + enableRawMode(rawmode); + if (l) refreshme = 1; + } + if (l && gotwinch) refreshme = 1; + if (refreshme) linenoiseRefreshLine(l); + rc = readansi(fd, buf, size); + } while (rc == -1 && errno == EINTR); + if (l && rc > 0) { + memcpy(l->seq[1], l->seq[0], sizeof(l->seq[0])); + memset(l->seq[0], 0, sizeof(l->seq[0])); + memcpy(l->seq[0], buf, MIN(MIN(size, rc), sizeof(l->seq[0]) - 1)); + } + return rc; +} + +/** + * Returns number of columns in current terminal. + * + * 1. Checks COLUMNS environment variable (set by Emacs) + * 2. Tries asking termios (works for pseudoteletypewriters) + * 3. Falls back to inband signalling (works w/ pipe or serial) + * 4. Otherwise we conservatively assume 80 columns + * + * @param ws should be initialized by caller to zero before first call + * @param ifd is input file descriptor + * @param ofd is output file descriptor + * @return window size + */ +static struct winsize GetTerminalSize(struct winsize ws, int ifd, int ofd) { + int x; + ssize_t n; + char *p, *s, b[16]; + ioctl(ofd, TIOCGWINSZ, &ws); + if ((!ws.ws_row && (s = getenv("ROWS")) && (x = ParseUnsigned(s, 0)))) { + ws.ws_row = x; + } + if ((!ws.ws_col && (s = getenv("COLUMNS")) && (x = ParseUnsigned(s, 0)))) { + ws.ws_col = x; + } + if (((!ws.ws_col || !ws.ws_row) && linenoiseRead(ifd, 0, 0, 0) != -1 && + linenoiseWriteStr( + ofd, "\0337" /* save position */ + "\033[9979;9979H" /* move cursor to bottom right corner */ + "\033[6n" /* report position */ + "\0338") != -1 && /* restore position */ + (n = linenoiseRead(ifd, b, sizeof(b), 0)) != -1 && + n && b[0] == 033 && b[1] == '[' && b[n - 1] == 'R')) { + p = b + 2; + if ((x = ParseUnsigned(p, &p))) ws.ws_row = x; + if (*p++ == ';' && (x = ParseUnsigned(p, 0))) ws.ws_col = x; + } + if (!ws.ws_col) ws.ws_col = 80; + if (!ws.ws_row) ws.ws_row = 24; + return ws; } /* Clear the screen. Used to handle ctrl+l */ -void linenoiseClearScreen(void) { - xwrite(fileno(stdout),"\e[H\e[2J",7); +void linenoiseClearScreen(int fd) { + linenoiseWriteStr(fd, "\033[H" /* move cursor to top left corner */ + "\033[2J"); /* erase display */ } -/* Beep, used for completion when there is nothing to complete or when all - * the choices were already shown. */ static void linenoiseBeep(void) { - /* NOOOO */ - /* fprintf(stderr, "\x7"); */ - /* fflush(stderr); */ + /* THE TERMINAL BELL IS DEAD - HISTORY HAS KILLED IT */ } -/* ============================== Completion ================================ */ - /* Free a list of completion option populated by linenoiseAddCompletion(). */ void linenoiseFreeCompletions(linenoiseCompletions *lc) { - size_t i; - for (i = 0; i < lc->len; i++) - free(lc->cvec[i]); - if (lc->cvec) - free(lc->cvec); + size_t i; + for (i = 0; i < lc->len; i++) free(lc->cvec[i]); + if (lc->cvec) free(lc->cvec); } /* This is an helper function for linenoiseEdit() and is called when the @@ -439,69 +731,180 @@ void linenoiseFreeCompletions(linenoiseCompletions *lc) { * * The state of the editing is encapsulated into the pointed linenoiseState * structure as described in the structure definition. */ -static int completeLine(struct linenoiseState *ls, char *seq, int size) { - linenoiseCompletions lc = { 0, NULL }; - int nwritten, nread = 0; - completionCallback(ls->buf,&lc); - if (!lc.len) { - linenoiseBeep(); - } else { - size_t stop = 0, i = 0; - while(!stop) { - /* Show completion or original buffer */ - if (i < lc.len) { - struct linenoiseState saved = *ls; - ls->len = ls->pos = strlen(lc.cvec[i]); - ls->buf = lc.cvec[i]; - refreshLine(ls); - ls->len = saved.len; - ls->pos = saved.pos; - ls->buf = saved.buf; - } else { - refreshLine(ls); - } - nread = readansi(ls->ifd,seq,size); - if (nread <= 0) { - linenoiseFreeCompletions(&lc); - return -1; - } - switch(seq[0]) { - case '\t': - i = (i+1) % (lc.len+1); - if (i == lc.len) linenoiseBeep(); - break; - default: - /* Update buffer and return */ - if (i < lc.len) { - size_t n = strlen(lc.cvec[i]); - nwritten = MIN(n,ls->buflen); - memcpy(ls->buf,lc.cvec[i],nwritten+1); - ls->len = ls->pos = nwritten; - } - stop = 1; - break; - } - } +static int linenoiseCompleteLine(struct linenoiseState *ls, char *seq, + int size) { + size_t i, n, stop; + int nwritten, nread; + linenoiseCompletions lc; + struct linenoiseState saved; + nread = 0; + memset(&lc, 0, sizeof(lc)); + completionCallback(ls->buf, &lc); + if (!lc.len) { + linenoiseBeep(); + } else { + i = 0; + stop = 0; + while (!stop) { + /* Show completion or original buffer */ + if (i < lc.len) { + saved = *ls; + ls->len = ls->pos = strlen(lc.cvec[i]); + ls->buf = lc.cvec[i]; + linenoiseRefreshLine(ls); + ls->len = saved.len; + ls->pos = saved.pos; + ls->buf = saved.buf; + } else { + linenoiseRefreshLine(ls); + } + nread = linenoiseRead(ls->ifd, seq, size, ls); + if (nread <= 0) { + linenoiseFreeCompletions(&lc); + return -1; + } + switch (seq[0]) { + case '\t': + i = (i + 1) % (lc.len + 1); + if (i == lc.len) { + linenoiseBeep(); + } + break; + default: + if (i < lc.len) { + n = strlen(lc.cvec[i]); + nwritten = MIN(n, ls->buflen); + memcpy(ls->buf, lc.cvec[i], nwritten + 1); + ls->len = ls->pos = nwritten; + } + stop = 1; + break; + } } - linenoiseFreeCompletions(&lc); - return nread; + } + linenoiseFreeCompletions(&lc); + return nread; +} + +static void linenoiseEditHistoryGoto(struct linenoiseState *l, int i) { + if (historylen <= 1) return; + i = MAX(MIN(i, historylen - 1), 0); + free(history[historylen - 1 - l->hindex]); + history[historylen - 1 - l->hindex] = strdup(l->buf); + l->hindex = i; + if (!memccpy(l->buf, history[historylen - 1 - l->hindex], 0, l->buflen)) { + l->buf[l->buflen - 1] = 0; + } + l->len = l->pos = strlen(l->buf); + linenoiseRefreshLine(l); +} + +static void linenoiseEditHistoryMove(struct linenoiseState *l, int dx) { + linenoiseEditHistoryGoto(l, l->hindex + dx); +} + +static char *linenoiseMakeSearchPrompt(struct abuf *ab, int fail, const char *s, + int n) { + ab->len = 0; + abAppendw(ab, '('); + if (fail) abAppends(ab, "failed "); + abAppends(ab, "reverse-i-search `\e[4m"); + abAppend(ab, s, n); + abAppends(ab, "\033[24m"); + abAppends(ab, s + n); + abAppendw(ab, READ32LE("') ")); + return ab->b; +} + +static int linenoiseSearch(struct linenoiseState *l, char *seq, int size) { + char *p; + struct abuf ab; + struct abuf prompt; + const char *oldprompt, *q; + int i, j, k, rc, fail, added, oldpos, matlen, oldindex; + if (historylen <= 1) return 0; + abInit(&ab); + abInit(&prompt); + oldpos = l->pos; + oldprompt = l->prompt; + oldindex = l->hindex; + for (fail = matlen = 0;;) { + l->prompt = linenoiseMakeSearchPrompt(&prompt, fail, ab.b, matlen); + linenoiseRefreshLine(l); + fail = 1; + added = 0; + j = l->pos; + i = l->hindex; + rc = linenoiseRead(l->ifd, seq, size, l); + if (rc > 0) { + if (seq[0] == CTRL('?') || seq[0] == CTRL('H')) { + if (ab.len) { + --ab.len; + matlen = MIN(matlen, ab.len); + } + } else if (seq[0] == CTRL('R')) { + if (j) { + --j; + } else if (i + 1 < historylen) { + ++i; + j = strlen(history[historylen - 1 - i]); + } + } else if (seq[0] == CTRL('G')) { + linenoiseEditHistoryGoto(l, oldindex); + l->pos = oldpos; + rc = 0; + break; + } else if (iswcntrl(seq[0])) { /* only sees canonical c0 */ + break; + } else { + abAppend(&ab, seq, rc); + added = rc; + } + } else { + break; + } + while (i < historylen) { + p = history[historylen - 1 - i]; + k = strlen(p); + j = MIN(k, j + ab.len); + if ((q = FindSubstringReverse(p, j, ab.b, ab.len))) { + linenoiseEditHistoryGoto(l, i); + l->pos = q - p; + fail = 0; + if (added) { + matlen += added; + added = 0; + } + break; + } else { + i = i + 1; + j = LINENOISE_MAX_LINE; + } + } + } + l->prompt = oldprompt; + linenoiseRefreshLine(l); + abFree(&prompt); + abFree(&ab); + linenoiseRefreshLine(l); + return rc; } /* Register a callback function to be called for tab-completion. */ void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) { - completionCallback = fn; + completionCallback = fn; } /* Register a hits function to be called to show hits to the user at the * right of the prompt. */ void linenoiseSetHintsCallback(linenoiseHintsCallback *fn) { - hintsCallback = fn; + hintsCallback = fn; } /* Register a function to free the hints returned by the hints callback * registered with linenoiseSetHintsCallback(). */ void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *fn) { - freeHintsCallback = fn; + freeHintsCallback = fn; } /* This function is used by the callback function registered by the user @@ -509,785 +912,881 @@ void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *fn) { * user typed . See the example.c source code for a very easy to * understand example. */ void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str) { - size_t len = strlen(str); - char *copy, **cvec; - copy = malloc(len+1); - if (copy == NULL) return; - memcpy(copy,str,len+1); - cvec = realloc(lc->cvec,sizeof(char*)*(lc->len+1)); - if (cvec == NULL) { - free(copy); - return; - } - lc->cvec = cvec; - lc->cvec[lc->len++] = copy; -} - -/* =========================== Line editing ================================= */ - -/* We define a very simple "append buffer" structure, that is an heap - * allocated string where we can append to. This is useful in order to - * write all the escape sequences in a buffer and flush them to the standard - * output in a single call, to avoid flickering effects. */ -struct abuf{ - char *b; - int len; -}; - -static void abInit(struct abuf *ab) { - ab->b = NULL; - ab->len = 0; -} - -static void abAppend(struct abuf *ab, const char *s, int len) { - char *new; - if (!(new = realloc(ab->b,ab->len+len))) return; - memcpy(new+ab->len,s,len); - ab->b = new; - ab->len += len; -} - -static void abFree(struct abuf *ab) { - free(ab->b); -} - -/* Helper of refreshSingleLine() and refreshMultiLine() to show hints - * to the right of the prompt. */ -static void refreshShowHints(struct abuf *ab, struct linenoiseState *l, int plen) { - if (hintsCallback && plen+l->len < l->cols) { - const char *ansi1 = "\e[90m"; - const char *ansi2 = "\e[39m"; - char *hint = hintsCallback(l->buf,&ansi1,&ansi2); - if (hint) { - if (ansi1) abAppend(ab,ansi1,strlen(ansi1)); - abAppend(ab,hint,MIN(l->cols-(plen+l->len),strlen(hint))); - if (ansi2) abAppend(ab,ansi2,strlen(ansi2)); - /* Call the function to free the hint returned. */ - if (freeHintsCallback) { - freeHintsCallback(hint); - } - } - } -} - -/* Single line low level line refresh. - * - * Rewrite the currently edited line accordingly to the buffer content, - * cursor position, and number of columns of the terminal. */ -static void refreshSingleLine(struct linenoiseState *l) { - char seq[26], *p; - int plen = strlen(l->prompt); - int fd = l->ofd; - char *buf = l->buf; - int len = l->len; - int pos = l->pos; - struct abuf ab; - while((plen+pos) >= l->cols) { - buf++; - len--; - pos--; - } - while (plen+len > l->cols) { - len--; - } - abInit(&ab); - /* Cursor to left edge */ - abAppend(&ab,"\r",1); - /* Write the prompt and the current buffer content */ - abAppend(&ab,l->prompt,strlen(l->prompt)); - if (maskmode == 1) { - while (len--) { - abAppend(&ab,"*",1); - } + size_t len; + char *copy, **cvec; + if ((copy = malloc((len = strlen(str)) + 1))) { + memcpy(copy, str, len + 1); + if ((cvec = + (char **)realloc(lc->cvec, (lc->len + 1) * sizeof(*lc->cvec)))) { + lc->cvec = cvec; + lc->cvec[lc->len++] = copy; } else { - abAppend(&ab,buf,len); + free(copy); } - /* Show hits if any. */ - refreshShowHints(&ab,l,plen); - /* Erase to right */ - abAppend(&ab,"\e[K",3); - /* Move cursor to original position. */ - p=stpcpy(seq,"\r\e["); - p+=int64toarray_radix10(pos+plen,p),*p++='C'; - abAppend(&ab,seq,p-seq); - xwrite(fd,ab.b,ab.len); - abFree(&ab); + } } -/* Multi line low level line refresh. - * - * Rewrite the currently edited line accordingly to the buffer content, - * cursor position, and number of columns of the terminal. */ -static void refreshMultiLine(struct linenoiseState *l) { - struct abuf ab; - char seq[26], *p; - int plen = strlen(l->prompt); - int rows = (plen+l->len+l->cols-1)/l->cols; /* rows used by current buf. */ - int rpos = (plen+l->oldpos+l->cols)/l->cols; /* cursor relative row. */ - int rpos2; /* rpos after refresh. */ - int col; /* colum position, zero-based. */ - int old_rows = l->maxrows; - int fd = l->ofd, i, j; - /* Update maxrows if needed. */ - if (rows > (int)l->maxrows) l->maxrows = rows; - /* First step: clear all the lines used before. To do so start by - * going to the last row. */ - abInit(&ab); - if (old_rows-rpos > 0) { - lndebug("go down %d", old_rows-rpos); - p=stpcpy(seq,"\e["); - p+=int64toarray_radix10(old_rows-rpos,p),*p++='B'; - abAppend(&ab,seq,p-seq); +static void linenoiseRingFree(void) { + size_t i; + for (i = 0; i < LINENOISE_MAX_RING; ++i) { + if (ring.p[i]) { + free(ring.p[i]); + ring.p[i] = 0; } - /* Now for every row clear it, go up. */ - for (j = 0; j < old_rows-1; j++) { - lndebug("clear+up"); - abAppend(&ab,"\r\e[K\e[1A",8); + } +} + +static void linenoiseRingPush(const char *p, size_t n) { + if (LINENOISE_MAX_RING && n) { + ring.i = (ring.i + 1) % LINENOISE_MAX_RING; + free(ring.p[ring.i]); + ring.p[ring.i] = strndup(p, n); + } +} + +static void linenoiseRingRotate(void) { + size_t i; + for (i = 0; i < LINENOISE_MAX_RING; ++i) { + ring.i = (ring.i - 1) % LINENOISE_MAX_RING; + if (ring.p[ring.i]) { + break; } - /* Clean the top line. */ - lndebug("clear"); - abAppend(&ab,"\r\e[K",4); - /* Write the prompt and the current buffer content */ - abAppend(&ab,l->prompt,strlen(l->prompt)); - if (maskmode == 1) { - for (i = 0; i < l->len; i++) { - abAppend(&ab,"*",1); - } + } +} + +static void linenoiseRefreshHints(struct abuf *ab, struct linenoiseState *l) { + char *hint; + const char *ansi1, *ansi2; + if (!hintsCallback) return; + ansi1 = "\033[90m"; + ansi2 = "\033[39m"; + if (!(hint = hintsCallback(l->buf, &ansi1, &ansi2))) return; + if (ansi1) abAppends(ab, ansi1); + abAppends(ab, hint); + if (ansi2) abAppends(ab, ansi2); + if (freeHintsCallback) freeHintsCallback(hint); +} + +static void linenoiseRefreshLine(struct linenoiseState *l) { + struct abuf ab; + int i, j, fd, plen, pwidth, rows, rpos, rpos2, col, old_rows; + if (gotwinch && rawmode != -1) { + l->ws = GetTerminalSize(l->ws, l->ifd, l->ofd); + gotwinch = 0; + } + fd = l->ofd; + old_rows = l->maxrows; + plen = strlen(l->prompt); + pwidth = GetMonospaceWidth(l->prompt, plen); + /* cursor relative row */ + rpos = (pwidth + l->oldpos + l->ws.ws_col) / l->ws.ws_col; + /* rows used by current buf */ + rows = (pwidth + GetMonospaceWidth(l->buf, l->len) + l->ws.ws_col - 1) / + l->ws.ws_col; + if (rows > (int)l->maxrows) l->maxrows = rows; + /* First step: clear all the lines used before. + * To do so start by going to the last row. */ + abInit(&ab); + if (old_rows - rpos > 0) { + abAppendw(&ab, READ32LE("\033[\0")); + abAppendu(&ab, old_rows - rpos); + abAppendw(&ab, 'B'); + } + /* Now for every row clear it, go up. */ + for (j = 0; j < old_rows - 1; j++) { + abAppends(&ab, "\r\033[K\033[A"); + } + abAppendw(&ab, READ32LE("\r\033[K")); + abAppends(&ab, l->prompt); + if (maskmode) { + for (i = 0; i < l->len; i++) { + abAppendw(&ab, '*'); + } + } else { + abAppend(&ab, l->buf, l->len); + } + linenoiseRefreshHints(&ab, l); + /* If we are at the very end of the screen with our prompt, we need to + * emit a newline and move the prompt to the first column. */ + if ((l->pos && l->pos == l->len && + !((pwidth + GetMonospaceWidth(l->buf, l->pos)) % l->ws.ws_col))) { + abAppendw(&ab, READ32LE("\n\r\0")); + if (++rows > (int)l->maxrows) { + l->maxrows = rows; + } + } + /* move cursor to right position */ + /* get current cursor relative row */ + rpos2 = (pwidth + GetMonospaceWidth(l->buf, l->pos) + l->ws.ws_col) / + l->ws.ws_col; + /* go up till we reach expected positon */ + if (rows - rpos2 > 0) { + abAppendw(&ab, READ32LE("\033[\0")); + abAppendu(&ab, rows - rpos2); + abAppendw(&ab, 'A'); + } + /* set column */ + col = (pwidth + (int)GetMonospaceWidth(l->buf, l->pos)) % (int)l->ws.ws_col; + if (col) { + abAppendw(&ab, READ32LE("\r\033[")); + abAppendu(&ab, col); + abAppendw(&ab, 'C'); + } else { + abAppendw(&ab, '\r'); + } + l->oldpos = l->pos; + linenoiseWrite(fd, ab.b, ab.len); + abFree(&ab); +} + +static int linenoiseEditInsert(struct linenoiseState *l, const char *p, + size_t n) { + char d; + if (l->len + n < l->buflen) { + memmove(l->buf + l->pos + n, l->buf + l->pos, l->len - l->pos); + memcpy(l->buf + l->pos, p, n); + l->pos += n; + l->len += n; + l->buf[l->len] = 0; + linenoiseRefreshLine(l); + } + return 0; +} + +static void linenoiseEditHome(struct linenoiseState *l) { + l->pos = 0; + linenoiseRefreshLine(l); +} + +static void linenoiseEditEnd(struct linenoiseState *l) { + l->pos = l->len; + linenoiseRefreshLine(l); +} + +static void linenoiseEditUp(struct linenoiseState *l) { + linenoiseEditHistoryMove(l, LINENOISE_HISTORY_PREV); +} + +static void linenoiseEditDown(struct linenoiseState *l) { + linenoiseEditHistoryMove(l, LINENOISE_HISTORY_NEXT); +} + +static void linenoiseEditBof(struct linenoiseState *l) { + linenoiseEditHistoryMove(l, LINENOISE_HISTORY_FIRST); +} + +static void linenoiseEditEof(struct linenoiseState *l) { + linenoiseEditHistoryMove(l, LINENOISE_HISTORY_LAST); +} + +static void linenoiseEditRefresh(struct linenoiseState *l) { + linenoiseClearScreen(l->ofd); + linenoiseRefreshLine(l); +} + +static struct rune GetUtf8(const char *p, size_t n) { + struct rune r; + if ((r.n = r.c = 0) < n && (r.c = p[r.n++] & 255) >= 0300) { + r.c = DecodeUtf8(r.c).c; + while (r.n < n && (p[r.n] & 0300) == 0200) { + r.c = r.c << 6 | p[r.n++] & 077; + } + } + return r; +} + +static size_t Forward(struct linenoiseState *l, size_t pos) { + return pos + GetUtf8(l->buf + pos, l->len - pos).n; +} + +static size_t Backward(struct linenoiseState *l, size_t pos) { + if (pos) { + do --pos; + while (pos && (l->buf[pos] & 0300) == 0200); + } + return pos; +} + +static size_t Backwards(struct linenoiseState *l, size_t pos, + int pred(wint_t)) { + size_t i; + struct rune r; + while (pos) { + i = Backward(l, pos); + r = GetUtf8(l->buf + i, l->len - i); + if (pred(r.c)) { + pos = i; } else { - abAppend(&ab,l->buf,l->len); + break; } - /* Show hits if any. */ - refreshShowHints(&ab,l,plen); - /* If we are at the very end of the screen with our prompt, we need to - * emit a newline and move the prompt to the first column. */ - if (l->pos && - l->pos == l->len && - (l->pos+plen) % l->cols == 0) - { - lndebug(""); - abAppend(&ab,"\n\r",2); - rows++; - if (rows > (int)l->maxrows) l->maxrows = rows; - } - /* Move cursor to right position. */ - rpos2 = (plen+l->pos+l->cols)/l->cols; /* current cursor relative row. */ - lndebug("rpos2 %d", rpos2); - /* Go up till we reach the expected positon. */ - if (rows-rpos2 > 0) { - lndebug("go-up %d", rows-rpos2); - p=stpcpy(seq,"\e["); - p+=int64toarray_radix10(rows-rpos2,p),*p++='A'; - abAppend(&ab,seq,p-seq); - } - /* Set column. */ - col = (plen+(int)l->pos) % (int)l->cols; - lndebug("set col %d", 1+col); - if (col) { - p=stpcpy(seq,"\r\e["); - p+=int64toarray_radix10(col,p),*p++='C'; - abAppend(&ab,seq,p-seq); + } + return pos; +} + +static size_t Forwards(struct linenoiseState *l, size_t pos, int pred(wint_t)) { + struct rune r; + while (pos < l->len) { + r = GetUtf8(l->buf + pos, l->len - pos); + if (pred(r.c)) { + pos += r.n; } else { - abAppend(&ab,"\r",1); + break; } - lndebug("\n"); - l->oldpos = l->pos; - xwrite(fd,ab.b,ab.len); - abFree(&ab); + } + return pos; } -/* Calls the two low level functions refreshSingleLine() or - * refreshMultiLine() according to the selected mode. */ -static void refreshLine(struct linenoiseState *l) { - if (mlmode) - refreshMultiLine(l); - else - refreshSingleLine(l); +static size_t ForwardWord(struct linenoiseState *l, size_t pos) { + pos = Forwards(l, pos, iswseparator); + pos = Forwards(l, pos, notwseparator); + return pos; } -/* Insert the character 'c' at cursor current position. - * - * On error writing to the terminal -1 is returned, otherwise 0. */ -static int linenoiseEditInsert(struct linenoiseState *l, char c) { - char d; - if (l->len < l->buflen) { - if (l->len == l->pos) { - l->buf[l->pos] = c; - l->pos++; - l->len++; - l->buf[l->len] = '\0'; - if ((!mlmode && l->plen+l->len < l->cols && !hintsCallback)) { - /* Avoid a full update of the line in the - * trivial case. */ - d = (maskmode==1) ? '*' : c; - if (xwrite(l->ofd,&d,1) == -1) return -1; - } else { - refreshLine(l); - } - } else { - memmove(l->buf+l->pos+1,l->buf+l->pos,l->len-l->pos); - l->buf[l->pos] = c; - l->len++; - l->pos++; - l->buf[l->len] = '\0'; - refreshLine(l); - } +static size_t BackwardWord(struct linenoiseState *l, size_t pos) { + pos = Backwards(l, pos, iswseparator); + pos = Backwards(l, pos, notwseparator); + return pos; +} + +static size_t EscapeWord(struct linenoiseState *l) { + size_t i, j; + struct rune r; + for (i = l->pos; i && i < l->len; i += r.n) { + if (i < l->len) { + r = GetUtf8(l->buf + i, l->len - i); + if (iswseparator(r.c)) break; } - return 0; -} - -/* Move cursor on the left. */ -static void linenoiseEditMoveLeft(struct linenoiseState *l) { - if (l->pos > 0) { - l->pos--; - refreshLine(l); + if ((j = i)) { + do --j; + while (j && (l->buf[j] & 0300) == 0200); + r = GetUtf8(l->buf + j, l->len - j); + if (iswseparator(r.c)) break; } + } + return i; } -static bool IsSeparator(int c) { - return !(isalnum(c) || c > 127); +static void linenoiseEditLeft(struct linenoiseState *l) { + l->pos = Backward(l, l->pos); + linenoiseRefreshLine(l); } -/* Move cursor on the left. */ -static void linenoiseEditMoveLeftWord(struct linenoiseState *l) { - if (l->pos > 0) { - while (l->pos > 0 && IsSeparator(l->buf[l->pos-1])) l->pos--; - while (l->pos > 0 && !IsSeparator(l->buf[l->pos-1])) l->pos--; - refreshLine(l); - } +static void linenoiseEditRight(struct linenoiseState *l) { + if (l->pos == l->len) return; + do l->pos++; + while (l->pos < l->len && (l->buf[l->pos] & 0300) == 0200); + linenoiseRefreshLine(l); } -/* Move cursor on the right. */ -static void linenoiseEditMoveRightWord(struct linenoiseState *l) { - if (l->pos != l->len) { - while (l->pos < l->len && IsSeparator(l->buf[l->pos])) l->pos++; - while (l->pos < l->len && !IsSeparator(l->buf[l->pos])) l->pos++; - refreshLine(l); - } +static void linenoiseEditLeftWord(struct linenoiseState *l) { + l->pos = BackwardWord(l, l->pos); + linenoiseRefreshLine(l); } -/* Move cursor on the right. */ -static void linenoiseEditMoveRight(struct linenoiseState *l) { - if (l->pos != l->len) { - l->pos++; - refreshLine(l); - } +static void linenoiseEditRightWord(struct linenoiseState *l) { + l->pos = ForwardWord(l, l->pos); + linenoiseRefreshLine(l); } -/* Move cursor to the start of the line. */ -static void linenoiseEditMoveHome(struct linenoiseState *l) { - if (l->pos) { - l->pos = 0; - refreshLine(l); - } -} - -/* Move cursor to the end of the line. */ -static void linenoiseEditMoveEnd(struct linenoiseState *l) { - if (l->pos != l->len) { - l->pos = l->len; - refreshLine(l); - } -} - -/* Substitute the currently edited line with the next or previous history - * entry as specified by 'dir'. */ -static void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) { - if (history_len > 1) { - /* Update the current history entry before to - * overwrite it with the next one. */ - free(history[history_len - 1 - l->history_index]); - history[history_len - 1 - l->history_index] = strdup(l->buf); - /* Show the new entry */ - l->history_index += (dir == LINENOISE_HISTORY_PREV) ? 1 : -1; - if (l->history_index < 0) { - l->history_index = 0; - return; - } else if (l->history_index >= history_len) { - l->history_index = history_len-1; - return; - } - strncpy(l->buf,history[history_len - 1 - l->history_index],l->buflen); - l->buf[l->buflen-1] = '\0'; - l->len = l->pos = strlen(l->buf); - refreshLine(l); - } -} - -/* Delete the character at the right of the cursor without altering the cursor - * position. Basically this is what happens with the "Delete" keyboard key. */ static void linenoiseEditDelete(struct linenoiseState *l) { - if (l->len > 0 && l->pos < l->len) { - memmove(l->buf+l->pos,l->buf+l->pos+1,l->len-l->pos-1); - l->len--; - l->buf[l->len] = '\0'; - refreshLine(l); + size_t i; + if (l->pos == l->len) return; + i = Forward(l, l->pos); + memmove(l->buf + l->pos, l->buf + i, l->len - i + 1); + l->len -= i - l->pos; + linenoiseRefreshLine(l); +} + +static void linenoiseEditRubout(struct linenoiseState *l) { + size_t i; + if (!l->pos) return; + i = Backward(l, l->pos); + memmove(l->buf + i, l->buf + l->pos, l->len - l->pos + 1); + l->len -= l->pos - i; + l->pos = i; + linenoiseRefreshLine(l); +} + +static void linenoiseEditDeleteWord(struct linenoiseState *l) { + size_t i; + if (l->pos == l->len) return; + i = ForwardWord(l, l->pos); + linenoiseRingPush(l->buf + l->pos, i - l->len); + memmove(l->buf + l->pos, l->buf + i, l->len - i + 1); + l->len -= i - l->pos; + linenoiseRefreshLine(l); +} + +static void linenoiseEditRuboutWord(struct linenoiseState *l) { + size_t i; + if (!l->pos) return; + i = BackwardWord(l, l->pos); + linenoiseRingPush(l->buf + i, l->pos - i); + memmove(l->buf + i, l->buf + l->pos, l->len - l->pos + 1); + l->len -= l->pos - i; + l->pos = i; + linenoiseRefreshLine(l); +} + +static void linenoiseEditXlatWord(struct linenoiseState *l, + wint_t xlat(wint_t)) { + int c; + struct rune r; + struct abuf ab; + size_t i, j, p; + abInit(&ab); + i = Forwards(l, l->pos, iswseparator); + for (j = i; j < l->len; j += r.n) { + r = GetUtf8(l->buf + j, l->len - j); + if (iswseparator(r.c)) break; + if ((c = xlat(r.c)) != r.c) { + abAppendw(&ab, tpenc(c)); + } else { /* avoid canonicalization */ + abAppend(&ab, l->buf + j, r.n); } + } + if (ab.len && i + ab.len + l->len - j < l->buflen) { + l->pos = i + ab.len; + abAppend(&ab, l->buf + j, l->len - j); + l->len = i + ab.len; + memcpy(l->buf + i, ab.b, ab.len + 1); + linenoiseRefreshLine(l); + } + abFree(&ab); } -/* Backspace implementation. */ -static void linenoiseEditBackspace(struct linenoiseState *l) { - if (l->pos > 0 && l->len > 0) { - memmove(l->buf+l->pos-1,l->buf+l->pos,l->len-l->pos); - l->pos--; - l->len--; - l->buf[l->len] = '\0'; - refreshLine(l); - } +static void linenoiseEditLowercaseWord(struct linenoiseState *l) { + linenoiseEditXlatWord(l, towlower); } -static void linenoiseEditDeleteNextWord(struct linenoiseState *l) { - size_t i = l->pos; - while (i != l->len && IsSeparator(l->buf[i])) i++; - while (i != l->len && !IsSeparator(l->buf[i])) i++; - memmove(l->buf+l->pos,l->buf+i,l->len-i); - l->len -= i - l->pos; - refreshLine(l); +static void linenoiseEditUppercaseWord(struct linenoiseState *l) { + linenoiseEditXlatWord(l, towupper); } -/* Delete the previous word, maintaining the cursor at the start of the - * current word. */ -static void linenoiseEditDeletePrevWord(struct linenoiseState *l) { - size_t diff, old_pos; - old_pos = l->pos; - while (l->pos > 0 && IsSeparator(l->buf[l->pos-1])) l->pos--; - while (l->pos > 0 && !IsSeparator(l->buf[l->pos-1])) l->pos--; - diff = old_pos - l->pos; - memmove(l->buf+l->pos,l->buf+old_pos,l->len-old_pos+1); - l->len -= diff; - refreshLine(l); -} - -static void linenoiseKill(struct linenoiseState *l, size_t i, size_t n) { - free(l->killed); - l->killed = memcpy(malloc(n + 1), l->buf + i, n); - l->killed[n] = '\0'; +static void linenoiseEditCapitalizeWord(struct linenoiseState *l) { + iscapital = 0; + linenoiseEditXlatWord(l, Capitalize); } static void linenoiseEditKillLeft(struct linenoiseState *l) { - size_t diff, old_pos; - old_pos = l->pos; - l->pos = 0; - diff = old_pos - l->pos; - memmove(l->buf+l->pos,l->buf+old_pos,l->len-old_pos+1); - l->len -= diff; - refreshLine(l); + size_t diff, old_pos; + linenoiseRingPush(l->buf, l->pos); + old_pos = l->pos; + l->pos = 0; + diff = old_pos - l->pos; + memmove(l->buf + l->pos, l->buf + old_pos, l->len - old_pos + 1); + l->len -= diff; + linenoiseRefreshLine(l); } static void linenoiseEditKillRight(struct linenoiseState *l) { - l->buf[l->pos] = '\0'; - l->len = l->pos; - refreshLine(l); + linenoiseRingPush(l->buf + l->pos, l->len - l->pos); + l->buf[l->pos] = '\0'; + l->len = l->pos; + linenoiseRefreshLine(l); } -static void linenoiseEditTransposeCharacters(struct linenoiseState *l) { - int t; - if (l->pos > 0 && l->pos < l->len) { - t = l->buf[l->pos-1]; - l->buf[l->pos-1] = l->buf[l->pos]; - l->buf[l->pos] = t; - if (l->pos < l->len) l->pos++; - refreshLine(l); +static void linenoiseEditYank(struct linenoiseState *l) { + char *p; + size_t n; + if (!ring.p[ring.i]) return; + n = strlen(ring.p[ring.i]); + if (l->len + n < l->buflen) { + p = malloc(l->len - l->pos + 1); + memcpy(p, l->buf + l->pos, l->len - l->pos + 1); + memcpy(l->buf + l->pos, ring.p[ring.i], n); + memcpy(l->buf + l->pos + n, p, l->len - l->pos + 1); + l->yi = l->pos; + l->yj = l->pos + n; + l->pos += n; + l->len += n; + free(p); + linenoiseRefreshLine(l); + } +} + +static void linenoiseEditRotate(struct linenoiseState *l) { + if ((l->seq[1][0] == CTRL('Y') || + (l->seq[1][0] == 033 && l->seq[1][1] == 'y'))) { + if (l->yi < l->len && l->yj <= l->len) { + memmove(l->buf + l->yi, l->buf + l->yj, l->len - l->yj + 1); + l->len -= l->yj - l->yi; + l->pos -= l->yj - l->yi; } + linenoiseRingRotate(); + linenoiseEditYank(l); + } } -/* This function is the core of the line editing capability of linenoise. +static void linenoiseEditTranspose(struct linenoiseState *l) { + char *q, *p; + size_t a, b, c; + b = l->pos; + a = Backward(l, b); + c = Forward(l, b); + if (!(a < b && b < c)) return; + p = q = malloc(c - a); + p = mempcpy(p, l->buf + b, c - b); + p = mempcpy(p, l->buf + a, b - a); + assert(p - q == c - a); + memcpy(l->buf + a, q, p - q); + l->pos = c; + free(q); + linenoiseRefreshLine(l); +} + +static void linenoiseEditTransposeWords(struct linenoiseState *l) { + char *q, *p; + struct rune r; + size_t pi, xi, xj, yi, yj; + pi = EscapeWord(l); + xj = Backwards(l, pi, iswseparator); + xi = Backwards(l, xj, notwseparator); + yi = Forwards(l, pi, iswseparator); + yj = Forwards(l, yi, notwseparator); + if (!(xi < xj && xj < yi && yi < yj)) return; + p = q = malloc(yj - xi); + p = mempcpy(p, l->buf + yi, yj - yi); + p = mempcpy(p, l->buf + xj, yi - xj); + p = mempcpy(p, l->buf + xi, xj - xi); + assert(p - q == yj - xi); + memcpy(l->buf + xi, q, p - q); + l->pos = yj; + free(q); + linenoiseRefreshLine(l); +} + +static void linenoiseEditSqueeze(struct linenoiseState *l) { + size_t i, j; + i = Backwards(l, l->pos, iswseparator); + j = Forwards(l, l->pos, iswseparator); + if (!(i < j)) return; + memmove(l->buf + i, l->buf + j, l->len - j + 1); + l->len -= j - i; + l->pos = i; + linenoiseRefreshLine(l); +} + +static void linenoiseEditMark(struct linenoiseState *l) { + l->mark = l->pos; +} + +static void linenoiseEditGoto(struct linenoiseState *l) { + if (l->mark > l->len) return; + l->pos = MIN(l->mark, l->len); + linenoiseRefreshLine(l); +} + +/** + * Runs linenoise engine. + * + * This function is the core of the line editing capability of linenoise. * It expects 'fd' to be already in "raw mode" so that every key pressed * will be returned ASAP to read(). * * The resulting string is put into 'buf' when the user type enter, or * when ctrl+d is typed. * - * The function returns the length of the current buffer. */ -static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen, const char *prompt) { - struct linenoiseState l; - /* Populate the linenoise state that we pass to functions implementing - * specific editing functionalities. */ - l.ifd = stdin_fd; - l.ofd = stdout_fd; - l.buf = buf; - l.buflen = buflen; - l.prompt = prompt; - l.plen = strlen(prompt); - l.oldpos = l.pos = 0; - l.len = 0; - l.cols = getColumns(stdin_fd, stdout_fd); - l.maxrows = 0; - l.history_index = 0; - /* Buffer starts empty. */ - l.buf[0] = '\0'; - l.buflen--; /* Make sure there is always space for the nulterm */ - /* The latest history entry is always our current buffer, that - * initially is just an empty string. */ - linenoiseHistoryAdd(""); - if (xwrite(l.ofd,prompt,l.plen) == -1) return -1; - while(1) { - int i; - int nread; - char seq[16]; - nread = readansi(l.ifd,seq,sizeof(seq)); - if (nread <= 0) return l.len; - /* Only autocomplete when the callback is set. It returns < 0 when - * there was an error reading from fd. Otherwise it will return the - * character that should be handled next. */ - if (seq[0] == '\t' && completionCallback) { - nread = completeLine(&l, seq, sizeof(seq)); - if (nread < 0) return l.len; - if (!nread) continue; - } - switch(seq[0]) { - case '\r': /* enter */ - history_len--; - free(history[history_len]); - if (mlmode) linenoiseEditMoveEnd(&l); - if (hintsCallback) { - /* Force a refresh without hints to leave the previous - * line as the user typed it after a newline. */ - linenoiseHintsCallback *hc = hintsCallback; - hintsCallback = NULL; - refreshLine(&l); - hintsCallback = hc; - } - return (int)l.len; - case CTRL('C'): - errno = EAGAIN; - return -1; - case CTRL('?'): /* backspace a.k.a. 0177 a.k.a. 127 */ - case CTRL('H'): - linenoiseEditBackspace(&l); - break; - case CTRL('D'): /* remove char at right of cursor, or if the - line is empty, act as end-of-file. */ - if (l.len > 0) { - linenoiseEditDelete(&l); - } else { - history_len--; - free(history[history_len]); - return -1; - } - break; - case CTRL('T'): /* swaps current character with previous. */ - linenoiseEditTransposeCharacters(&l); - break; - case CTRL('B'): - linenoiseEditMoveLeft(&l); - break; - case CTRL('F'): - linenoiseEditMoveRight(&l); - break; - case CTRL('P'): - linenoiseEditHistoryNext(&l, LINENOISE_HISTORY_PREV); - break; - case CTRL('N'): - linenoiseEditHistoryNext(&l, LINENOISE_HISTORY_NEXT); - break; - case CTRL('U'): /* delete the line backwards */ - linenoiseEditKillLeft(&l); - break; - case CTRL('K'): /* delete from current to end of line */ - linenoiseEditKillRight(&l); - break; - case CTRL('A'): /* go to the start of the line */ - linenoiseEditMoveHome(&l); - break; - case CTRL('E'): /* go to the end of the line */ - linenoiseEditMoveEnd(&l); - break; - case CTRL('L'): /* clear screen */ - linenoiseClearScreen(); - refreshLine(&l); - break; - case CTRL('W'): /* delete previous word */ - linenoiseEditDeletePrevWord(&l); - break; - case '\e': /* escape sequence */ - /* Read the next two bytes representing the escape sequence. - * Use two calls to handle slow terminals returning the two - * chars at different times. */ - if (nread < 2) break; - switch(seq[1]) { - case '[': - if (nread < 3) break; - if (seq[2] >= '0' && seq[2] <= '9') { - if (nread < 4) break; - if (seq[3] == '~') { - switch(seq[2]) { - case '1': /* "\e[1~" is home */ - linenoiseEditMoveHome(&l); - break; - case '3': /* "\e[3~" is delete */ - linenoiseEditDelete(&l); - break; - case '4': /* "\e[4~" is end */ - linenoiseEditMoveEnd(&l); - break; - default: - break; - } - } - } else { - switch(seq[2]) { - case 'A': /* "\e[A" is up */ - linenoiseEditHistoryNext(&l, LINENOISE_HISTORY_PREV); - break; - case 'B': /* "\e[B" is down */ - linenoiseEditHistoryNext(&l, LINENOISE_HISTORY_NEXT); - break; - case 'C': /* "\e[C" is right */ - linenoiseEditMoveRight(&l); - break; - case 'D': /* "\e[D" is left */ - linenoiseEditMoveLeft(&l); - break; - case 'H': /* "\e[H" is home */ - linenoiseEditMoveHome(&l); - break; - case 'F': /* "\e[F" is end */ - linenoiseEditMoveEnd(&l); - break; - default: - break; - } - } - break; - case 'O': - if (nread < 3) break; - switch(seq[2]) { - case 'H': /* "\eOH" is home */ - linenoiseEditMoveHome(&l); - break; - case 'F': /* "\eOF" is end */ - linenoiseEditMoveEnd(&l); - break; - default: - break; - } - break; - case 'b': /* "\eb" is alt-b */ - linenoiseEditMoveLeftWord(&l); - break; - case 'f': /* "\ef" is alt-f */ - linenoiseEditMoveRightWord(&l); - break; - case 'd': /* "\ed" is alt-d */ - linenoiseEditDeleteNextWord(&l); - break; - case 'h': /* "\e" is alt-h */ - linenoiseEditDeletePrevWord(&l); - break; - case CTRL('H'): /* "\e\b" is ctrl-alt-h */ - linenoiseEditDeletePrevWord(&l); - break; - default: - break; - } - break; - default: - if (32 <= seq[0] && seq[0] < 127) { - if (linenoiseEditInsert(&l,seq[0])==-1) { - return -1; - } - } - break; - } + * Returns chomped character count in buf >=0 or -1 on eof / error + */ +static ssize_t linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, + size_t buflen, const char *prompt) { + ssize_t rc; + size_t nread; + char seq[16]; + struct linenoiseState l; + linenoiseHintsCallback *hc; + memset(&l, 0, sizeof(l)); + buf[0] = 0; + l.buf = buf; + l.ifd = stdin_fd; + l.ofd = stdout_fd; + l.buflen = buflen - 1; + l.prompt = prompt ? prompt : ""; + l.ws = GetTerminalSize(l.ws, l.ifd, l.ofd); + linenoiseHistoryAdd(""); + linenoiseWriteStr(l.ofd, l.prompt); + while (1) { + rc = linenoiseRead(l.ifd, seq, sizeof(seq), &l); + if (rc > 0) { + if (seq[0] == CTRL('R')) { + rc = linenoiseSearch(&l, seq, sizeof(seq)); + if (!rc) continue; + } else if (seq[0] == '\t' && completionCallback) { + rc = linenoiseCompleteLine(&l, seq, sizeof(seq)); + if (!rc) continue; + } } - return l.len; -} - -/* This function calls the line editing function linenoiseEdit() using - * the STDIN file descriptor set in raw mode. */ -static int linenoiseRaw(char *buf, size_t buflen, const char *prompt) { - int count; - if (!buflen) { - errno = EINVAL; - return -1; - } - if (enableRawMode(fileno(stdin)) == -1) return -1; - count = linenoiseEdit(fileno(stdin), fileno(stdout), buf, buflen, prompt); - linenoiseDisableRawMode(fileno(stdin)); - if (count != -1) fputc('\n',stdout); - return count; -} - -/* This function is called when linenoise() is called with the standard - * input file descriptor not attached to a TTY. So for example when the - * program using linenoise is called in pipe or with a file redirected - * to its standard input. In this case, we want to be able to return the - * line regardless of its length (by default we are limited to 4k). */ -static char *linenoiseNoTTY(void) { - char *line = NULL; - size_t len = 0, maxlen = 0; - while(1) { - if (len == maxlen) { - if (maxlen == 0) maxlen = 16; - maxlen *= 2; - char *oldval = line; - line = realloc(line,maxlen); - if (line == NULL) { - if (oldval) free(oldval); - return NULL; - } - } - int c = fgetc(stdin); - if (c == EOF || c == '\n') { - if (c == EOF && len == 0) { - free(line); - return NULL; - } else { - line[len] = '\0'; - return line; - } - } else { - line[len] = c; - len++; - } - } -} - -/* The high level function that is the main API of the linenoise library. - * This function checks if the terminal has basic capabilities, just checking - * for a blacklist of stupid terminals, and later either calls the line - * editing function or uses dummy fgets() so that you will be able to type - * something even in the most desperate of the conditions. */ -char *linenoise(const char *prompt) { - int count; - char *buf; - if (!isatty(fileno(stdin))) { - /* Not a tty: read from file / pipe. In this mode we don't want any - * limit to the line size, so we call a function to handle that. */ - return linenoiseNoTTY(); - } else if (isUnsupportedTerm()) { - fputs(prompt,stdout); - fflush(stdout); - return chomp(xgetline(stdin)); + if (rc > 0) { + nread = rc; + } else if (!rc && l.len) { + nread = 1; + seq[0] = '\r'; + seq[1] = 0; } else { - buf = malloc(LINENOISE_MAX_LINE); - count = linenoiseRaw(buf,LINENOISE_MAX_LINE,prompt); - if (count == -1) return NULL; - return strdup(buf); + historylen--; + free(history[historylen]); + history[historylen] = 0; + return -1; } -} - -/* This is just a wrapper the user may want to call in order to make sure - * the linenoise returned buffer is freed with the same allocator it was - * created with. Useful when the main program is using an alternative - * allocator. */ -void linenoiseFree(void *ptr) { - free(ptr); -} - -/* Free the history, but does not reset it. Only used when we have to - * exit() to avoid memory leaks are reported by valgrind & co. */ -void linenoiseHistoryFree(void) { - int j; - if (history) { - for (j = 0; j < history_len; j++) - free(history[j]); - free(history); - history_len = 0; - history = 0; - } -} - -/* At exit we'll try to fix the terminal to the initial conditions. */ -static void linenoiseAtExit(void) { - linenoiseDisableRawMode(fileno(stdin)); - linenoiseHistoryFree(); -} - -/* This is the API call to add a new entry in the linenoise history. - * It uses a fixed array of char pointers that are shifted (memmoved) - * when the history max length is reached in order to remove the older - * entry and make room for the new one, so it is not exactly suitable for huge - * histories, but will work well for a few hundred of entries. - * - * Using a circular buffer is smarter, but a bit more complex to handle. */ -int linenoiseHistoryAdd(const char *line) { - char *linecopy; - if (history_max_len == 0) return 0; - /* Initialization on first call. */ - if (history == NULL) { - history = malloc(sizeof(char*)*history_max_len); - if (history == NULL) return 0; - memset(history,0,(sizeof(char*)*history_max_len)); - } - /* Don't add duplicated lines. */ - if (history_len && !strcmp(history[history_len-1], line)) return 0; - /* Add an heap allocated copy of the line in the history. - * If we reached the max length, remove the older line. */ - linecopy = strdup(line); - if (!linecopy) return 0; - if (history_len == history_max_len) { - free(history[0]); - memmove(history,history+1,sizeof(char*)*(history_max_len-1)); - history_len--; - } - history[history_len] = linecopy; - history_len++; - return 1; -} - -/* Set the maximum length for the history. This function can be called even - * if there is already some history, the function will make sure to retain - * just the latest 'len' elements if the new history length value is smaller - * than the amount of items already inside the history. */ -int linenoiseHistorySetMaxLen(int len) { - char **new; - if (len < 1) return 0; - if (history) { - int tocopy = history_len; - new = malloc(sizeof(char*)*len); - if (new == NULL) return 0; - /* If we can't copy everything, free the elements we'll not use. */ - if (len < tocopy) { - int j; - for (j = 0; j < tocopy-len; j++) free(history[j]); - tocopy = len; + switch (seq[0]) { + CASE(CTRL('P'), linenoiseEditUp(&l)); + CASE(CTRL('E'), linenoiseEditEnd(&l)); + CASE(CTRL('N'), linenoiseEditDown(&l)); + CASE(CTRL('A'), linenoiseEditHome(&l)); + CASE(CTRL('B'), linenoiseEditLeft(&l)); + CASE(CTRL('@'), linenoiseEditMark(&l)); + CASE(CTRL('Y'), linenoiseEditYank(&l)); + CASE(CTRL('F'), linenoiseEditRight(&l)); + CASE(CTRL('?'), linenoiseEditRubout(&l)); + CASE(CTRL('H'), linenoiseEditRubout(&l)); + CASE(CTRL('L'), linenoiseEditRefresh(&l)); + CASE(CTRL('U'), linenoiseEditKillLeft(&l)); + CASE(CTRL('T'), linenoiseEditTranspose(&l)); + CASE(CTRL('K'), linenoiseEditKillRight(&l)); + CASE(CTRL('W'), linenoiseEditRuboutWord(&l)); + case CTRL('X'): + if (l.seq[1][0] == CTRL('X')) { + linenoiseEditGoto(&l); } - memset(new,0,sizeof(char*)*len); - memcpy(new,history+(history_len-tocopy), sizeof(char*)*tocopy); - free(history); - history = new; + break; + case CTRL('D'): + if (l.len) { + linenoiseEditDelete(&l); + } else { + free(history[--historylen]); + history[historylen] = 0; + return -1; + } + break; + case '\r': + free(history[--historylen]); + history[historylen] = 0; + linenoiseEditEnd(&l); + if (hintsCallback) { + /* Force a refresh without hints to leave the previous + * line as the user typed it after a newline. */ + hc = hintsCallback; + hintsCallback = 0; + linenoiseRefreshLine(&l); + hintsCallback = hc; + } + DEBUG(&l, "%`'s", buf); + return l.len; + case 033: + if (nread < 2) break; + switch (seq[1]) { + CASE('<', linenoiseEditBof(&l)); + CASE('>', linenoiseEditEof(&l)); + CASE('y', linenoiseEditRotate(&l)); + CASE('\\', linenoiseEditSqueeze(&l)); + CASE('b', linenoiseEditLeftWord(&l)); + CASE('f', linenoiseEditRightWord(&l)); + CASE('h', linenoiseEditRuboutWord(&l)); + CASE('d', linenoiseEditDeleteWord(&l)); + CASE('l', linenoiseEditLowercaseWord(&l)); + CASE('u', linenoiseEditUppercaseWord(&l)); + CASE('c', linenoiseEditCapitalizeWord(&l)); + CASE('t', linenoiseEditTransposeWords(&l)); + CASE(CTRL('H'), linenoiseEditRuboutWord(&l)); + case '[': + if (nread < 3) break; + if (seq[2] >= '0' && seq[2] <= '9') { + if (nread < 4) break; + if (seq[3] == '~') { + switch (seq[2]) { + CASE('1', linenoiseEditHome(&l)); /* \e[1~ */ + CASE('3', linenoiseEditDelete(&l)); /* \e[3~ */ + CASE('4', linenoiseEditEnd(&l)); /* \e[4~ */ + default: + break; + } + } + } else { + switch (seq[2]) { + CASE('A', linenoiseEditUp(&l)); + CASE('B', linenoiseEditDown(&l)); + CASE('C', linenoiseEditRight(&l)); + CASE('D', linenoiseEditLeft(&l)); + CASE('H', linenoiseEditHome(&l)); + CASE('F', linenoiseEditEnd(&l)); + default: + break; + } + } + break; + case 'O': + if (nread < 3) break; + switch (seq[2]) { + CASE('H', linenoiseEditHome(&l)); + CASE('F', linenoiseEditEnd(&l)); + default: + break; + } + break; + default: + break; + } + break; + default: + if (!iswcntrl(seq[0])) { /* only sees canonical c0 */ + linenoiseEditInsert(&l, seq, nread); + } + break; } - history_max_len = len; - if (history_len > history_max_len) - history_len = history_max_len; - return 1; + } } -/* Save the history in the specified file. On success 0 is returned - * otherwise -1 is returned. */ -int linenoiseHistorySave(const char *filename) { - mode_t old_umask = umask(S_IXUSR|S_IRWXG|S_IRWXO); - FILE *fp; - int j; - fp = fopen(filename,"w"); - umask(old_umask); - if (fp == NULL) return -1; - chmod(filename,S_IRUSR|S_IWUSR); - for (j = 0; j < history_len; j++) { - fputs(history[j],fp); - fputc('\n',fp); - } - fclose(fp); - return 0; +void linenoiseFree(void *ptr) { + free(ptr); } -/* Load the history from the specified file. If the file does not exist - * zero is returned and no operation is performed. +void linenoiseHistoryFree(void) { + size_t i; + for (i = 0; i < LINENOISE_MAX_HISTORY; i++) { + if (history[i]) { + free(history[i]); + history[i] = 0; + } + } + historylen = 0; +} + +static void linenoiseAtExit(void) { + linenoiseDisableRawMode(); + linenoiseHistoryFree(); + linenoiseRingFree(); +} + +int linenoiseHistoryAdd(const char *line) { + char *linecopy; + if (!LINENOISE_MAX_HISTORY) return 0; + if (historylen && !strcmp(history[historylen - 1], line)) return 0; + if (!(linecopy = strdup(line))) return 0; + if (historylen == LINENOISE_MAX_HISTORY) { + free(history[0]); + memmove(history, history + 1, sizeof(char *) * (LINENOISE_MAX_HISTORY - 1)); + historylen--; + } + history[historylen++] = linecopy; + return 1; +} + +/** + * Saves line editing history to file. * - * If the file exists and the operation succeeded 0 is returned, otherwise - * on error -1 is returned. */ -int linenoiseHistoryLoad(const char *filename) { - FILE *fp = fopen(filename,"r"); - char buf[LINENOISE_MAX_LINE]; - if (fp == NULL) return -1; - while (fgets(buf,LINENOISE_MAX_LINE,fp) != NULL) { - char *p; - p = strchr(buf,'\r'); - if (!p) p = strchr(buf,'\n'); - if (p) *p = '\0'; - linenoiseHistoryAdd(buf); - } - fclose(fp); - return 0; + * @return 0 on success, or -1 w/ errno + */ +int linenoiseHistorySave(const char *filename) { + int j; + FILE *fp; + mode_t old_umask; + old_umask = umask(S_IXUSR | S_IRWXG | S_IRWXO); + fp = fopen(filename, "w"); + umask(old_umask); + if (!fp) return -1; + chmod(filename, S_IRUSR | S_IWUSR); + for (j = 0; j < historylen; j++) { + fputs(history[j], fp); + fputc('\n', fp); + } + fclose(fp); + return 0; +} + +/** + * Loads history from the specified file. + * + * If the file doesn't exist, zero is returned and this will do nothing. + * If the file does exists and the operation succeeded zero is returned + * otherwise on error -1 is returned. + * + * @return 0 on success, or -1 w/ errno + */ +int linenoiseHistoryLoad(const char *filename) { + char **h; + int rc, fd, err; + size_t i, j, k, n; + char *m, *e, *p, *q, *f, *s; + err = errno, rc = 0; + if (!LINENOISE_MAX_HISTORY) return 0; + if (!(h = (char **)calloc(2 * LINENOISE_MAX_HISTORY, sizeof(char *)))) + return -1; + if ((fd = open(filename, O_RDONLY)) != -1) { + if ((n = GetFdSize(fd))) { + if ((m = (char *)mmap(0, n, PROT_READ, MAP_SHARED, fd, 0)) != + MAP_FAILED) { + for (i = 0, e = (p = m) + n; p < e; p = f + 1) { + if (!(q = (char *)memchr(p, '\n', e - p))) q = e; + for (f = q; q > p; --q) { + if (q[-1] != '\n' && q[-1] != '\r') break; + } + if (q > p) { + h[i * 2 + 0] = p; + h[i * 2 + 1] = q; + i = (i + 1) % LINENOISE_MAX_HISTORY; + } + } + linenoiseHistoryFree(); + for (j = 0; j < LINENOISE_MAX_HISTORY; ++j) { + if (h[(k = (i + j) % LINENOISE_MAX_HISTORY) * 2]) { + if ((s = malloc((n = h[k * 2 + 1] - h[k * 2]) + 1))) { + memcpy(s, h[k * 2], n), s[n] = 0; + history[historylen++] = s; + } + } + } + munmap(m, n); + } else { + rc = -1; + } + } + close(fd); + } else if (errno == ENOENT) { + errno = err; + } else { + rc = -1; + } + free(h); + return rc; +} + +/** + * Reads line interactively. + * + * This function can be used instead of linenoise() in cases where we + * know for certain we're dealing with a terminal, which means we can + * avoid linking any stdio code. + * + * @return chomped allocated string of read line or null on eof/error + */ +char *linenoiseRaw(const char *prompt, int infd, int outfd) { + int sig; + ssize_t rc; + size_t nread; + char *buf, *p; + sigset_t omask; + static char once; + struct sigaction sa; + if (!once) atexit(linenoiseAtExit), once = 1; + if (!(buf = malloc(LINENOISE_MAX_LINE))) return 0; + if (enableRawMode(infd) == -1) return 0; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGINT); + sigaddset(&sa.sa_mask, SIGQUIT); + sigprocmask(SIG_BLOCK, &sa.sa_mask, &omask); + sa.sa_flags = SA_NODEFER; + sa.sa_handler = linenoiseOnInt; + sigaction(SIGINT, &sa, &orig_int); + sa.sa_handler = linenoiseOnQuit; + sigaction(SIGQUIT, &sa, &orig_quit); + if (!(sig = setjmp(jraw))) { + sigprocmask(SIG_UNBLOCK, &sa.sa_mask, 0); + rc = linenoiseEdit(infd, outfd, buf, LINENOISE_MAX_LINE, prompt); + } else { + rc = -1; + } + linenoiseDisableRawMode(); + sigaction(SIGINT, &orig_int, 0); + sigaction(SIGQUIT, &orig_quit, 0); + sigprocmask(SIG_SETMASK, &omask, 0); + if (sig) raise(sig); + if (rc != -1) { + nread = rc; + linenoiseWriteStr(outfd, "\n"); + if ((p = realloc(buf, nread + 1))) buf = p; + return buf; + } else { + free(buf); + return 0; + } +} + +/** + * Reads line intelligently. + * + * The high level function that is the main API of the linenoise library. + * This function checks if the terminal has basic capabilities, just checking + * for a blacklist of inarticulate terminals, and later either calls the line + * editing function or uses dummy fgets() so that you will be able to type + * something even in the most desperate of the conditions. + * + * @param prompt is printed before asking for input if we have a term + * and this may be set to empty or null to disable and prompt may + * contain ansi escape sequences, color, utf8, etc. + * @return chomped allocated string of read line or null on eof/error + */ +char *linenoise(const char *prompt) { + if ((!isatty(fileno(stdin)) || !isatty(fileno(stdout)))) { + return GetLine(stdin); + } else if (linenoiseIsUnsupportedTerm()) { + if (prompt && *prompt) { + fputs(prompt, stdout); + fflush(stdout); + } + return GetLine(stdin); + } else { + fflush(stdout); + return linenoiseRaw(prompt, fileno(stdin), fileno(stdout)); + } +} + +/** + * Reads line intelligently w/ history, e.g. + * + * // see ~/.foo_history + * main() { + * char *line; + * while ((line = ezlinenoise("IN> ", "foo"))) { + * printf("OUT> %s\n", line); + * free(line); + * } + * } + * + * @param prompt is printed before asking for input if we have a term + * and this may be set to empty or null to disable and prompt may + * contain ansi escape sequences, color, utf8, etc. + * @param prog is name of your app, used to generate history filename + * however if it contains a slash / dot then we'll assume prog is + * the history filename which as determined by the caller + * @return chomped allocated string of read line or null on eof/error + */ +char *ezlinenoise(const char *prompt, const char *prog) { + char *line; + struct abuf path; + const char *a, *b; + abInit(&path); + if (prog) { + if (strchr(prog, '/') || strchr(prog, '.')) { + abAppends(&path, prog); + } else { + b = ""; + if (!(a = getenv("HOME"))) { + if (!(a = getenv("HOMEDRIVE")) || !(b = getenv("HOMEPATH"))) { + a = ""; + } + } + if (*a) { + abAppends(&path, a); + abAppends(&path, b); + abAppendw(&path, '/'); + } + abAppendw(&path, '.'); + abAppends(&path, prog); + abAppends(&path, "_history"); + } + } + if (path.len) { + linenoiseHistoryLoad(path.b); + } + line = linenoise(prompt); + if (path.len && line && *line) { + /* history here is inefficient but helpful when the user has multiple + * repls open at the same time, so history propagates between them */ + linenoiseHistoryLoad(path.b); + linenoiseHistoryAdd(line); + linenoiseHistorySave(path.b); + } + abFree(&path); + return line; } diff --git a/third_party/linenoise/linenoise.h b/third_party/linenoise/linenoise.h index 31310cd44..10d3016f2 100644 --- a/third_party/linenoise/linenoise.h +++ b/third_party/linenoise/linenoise.h @@ -19,18 +19,17 @@ void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *); void linenoiseAddCompletion(linenoiseCompletions *, const char *); char *linenoise(const char *) nodiscard; +char *linenoiseRaw(const char *, int, int) nodiscard; char *ezlinenoise(const char *, const char *) nodiscard; int linenoiseHistoryAdd(const char *); -int linenoiseHistorySetMaxLen(int); int linenoiseHistorySave(const char *); int linenoiseHistoryLoad(const char *); void linenoiseFreeCompletions(linenoiseCompletions *); void linenoiseHistoryFree(void); -void linenoiseClearScreen(void); -void linenoiseSetMultiLine(int); +void linenoiseClearScreen(int); void linenoiseMaskModeEnable(void); void linenoiseMaskModeDisable(void); -void linenoiseDisableRawMode(int); +void linenoiseDisableRawMode(void); void linenoiseFree(void *); COSMOPOLITAN_C_END_ diff --git a/third_party/linenoise/linenoise.mk b/third_party/linenoise/linenoise.mk index 113485560..849d992b8 100644 --- a/third_party/linenoise/linenoise.mk +++ b/third_party/linenoise/linenoise.mk @@ -25,7 +25,6 @@ THIRD_PARTY_LINENOISE_A_DIRECTDEPS = \ LIBC_STDIO \ LIBC_RUNTIME \ LIBC_SYSV_CALLS \ - LIBC_X \ LIBC_STR \ LIBC_UNICODE \ LIBC_STUBS @@ -44,6 +43,7 @@ $(THIRD_PARTY_LINENOISE_A).pkg: \ $(THIRD_PARTY_LINENOISE_A_OBJS): \ OVERRIDE_CFLAGS += \ + -fno-jump-tables \ -ffunction-sections \ -fdata-sections diff --git a/third_party/python/Lib/_bootlocale.py b/third_party/python/Lib/_bootlocale.py index ba682c437..ee5d213fc 100644 --- a/third_party/python/Lib/_bootlocale.py +++ b/third_party/python/Lib/_bootlocale.py @@ -1,21 +1,2 @@ -"""A minimal subset of the locale module used at interpreter startup -(imported by the _io module), in order to reduce startup time. - -Don't import directly from third-party code; use the `locale` module instead! -""" - -import sys -import _locale - def getpreferredencoding(do_setlocale=True): - assert not do_setlocale - result = _locale.nl_langinfo(_locale.CODESET) - if not result and sys.platform in ('darwin', 'cosmo'): - # nl_langinfo can return an empty string - # when the setting has an invalid value. - # Default to UTF-8 in that case because - # UTF-8 is the default charset on OSX and - # returning nothing will crash the - # interpreter. - result = 'UTF-8' - return result + return 'UTF-8' diff --git a/third_party/python/Lib/re.py b/third_party/python/Lib/re.py index 9ae8ffb03..770a724ed 100644 --- a/third_party/python/Lib/re.py +++ b/third_party/python/Lib/re.py @@ -123,10 +123,7 @@ import enum import sre_compile import sre_parse import functools -try: - import _locale -except ImportError: - _locale = None +import _locale # public symbols __all__ = [ diff --git a/third_party/python/Programs/hello.c b/third_party/python/Programs/hello.c deleted file mode 100644 index 1e79e2527..000000000 --- a/third_party/python/Programs/hello.c +++ /dev/null @@ -1,2 +0,0 @@ -#define LAUNCH "hello" -#include "third_party/python/Programs/launch.c" diff --git a/third_party/python/Programs/httpserver.c b/third_party/python/Programs/httpserver.c deleted file mode 100644 index 3f2d95868..000000000 --- a/third_party/python/Programs/httpserver.c +++ /dev/null @@ -1,2 +0,0 @@ -#define LAUNCH "http.server" -#include "third_party/python/Programs/launch.c" diff --git a/third_party/python/Programs/launch.c b/third_party/python/Programs/launch.c deleted file mode 100644 index c36403427..000000000 --- a/third_party/python/Programs/launch.c +++ /dev/null @@ -1,143 +0,0 @@ -/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│ -│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│ -╞══════════════════════════════════════════════════════════════════════════════╡ -│ Python 3 │ -│ https://docs.python.org/3/license.html │ -╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/bits/bits.h" -#include "libc/bits/safemacros.internal.h" -#include "libc/calls/calls.h" -#include "libc/dce.h" -#include "libc/errno.h" -#include "libc/log/check.h" -#include "libc/log/log.h" -#include "libc/mem/mem.h" -#include "libc/nexgen32e/rdtsc.h" -#include "libc/runtime/gc.internal.h" -#include "libc/runtime/runtime.h" -#include "libc/runtime/symbols.internal.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" -#include "libc/sysv/consts/fileno.h" -#include "libc/sysv/consts/sig.h" -#include "libc/unicode/locale.h" -#include "libc/x/x.h" -#include "libc/zip.h" -#include "third_party/linenoise/linenoise.h" -#include "third_party/python/Include/abstract.h" -#include "third_party/python/Include/ceval.h" -#include "third_party/python/Include/dictobject.h" -#include "third_party/python/Include/fileutils.h" -#include "third_party/python/Include/funcobject.h" -#include "third_party/python/Include/import.h" -#include "third_party/python/Include/listobject.h" -#include "third_party/python/Include/modsupport.h" -#include "third_party/python/Include/moduleobject.h" -#include "third_party/python/Include/object.h" -#include "third_party/python/Include/pydebug.h" -#include "third_party/python/Include/pyerrors.h" -#include "third_party/python/Include/pylifecycle.h" -#include "third_party/python/Include/pymem.h" -#include "third_party/python/Include/pyport.h" -#include "third_party/python/Include/pythonrun.h" -#include "third_party/python/Include/sysmodule.h" -#include "third_party/python/Include/unicodeobject.h" -#include "third_party/python/Include/yoink.h" -/* clang-format off */ - -#define _L(x) L##x -#define L(x) _L(x) - -PYTHON_YOINK(LAUNCH); - -PYTHON_YOINK("_bootlocale"); -PYTHON_YOINK("_locale"); -PYTHON_YOINK("encodings.aliases"); -PYTHON_YOINK("encodings.latin_1"); -PYTHON_YOINK("encodings.utf_8"); -PYTHON_YOINK("launchpy"); - -const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules; -struct _inittab *PyImport_Inittab = _PyImport_Inittab; - -static int LaunchModule(wchar_t *modname) -{ - PyObject *module, *runpy, *runmodule, *runargs, *result; - runpy = PyImport_ImportModule("launchpy"); - if (runpy == NULL) { - fprintf(stderr, "Could not import launchpy module\n"); - PyErr_Print(); - return -1; - } - runmodule = PyObject_GetAttrString(runpy, "run_module_as_main"); - if (runmodule == NULL) { - fprintf(stderr, "Could not access launchpy.run_module_as_main\n"); - PyErr_Print(); - Py_DECREF(runpy); - return -1; - } - module = PyUnicode_FromWideChar(modname, wcslen(modname)); - if (module == NULL) { - fprintf(stderr, "Could not convert module name to unicode\n"); - PyErr_Print(); - Py_DECREF(runpy); - Py_DECREF(runmodule); - return -1; - } - runargs = Py_BuildValue("(O)", module); - if (runargs == NULL) { - fprintf(stderr, - "Could not create arguments for runpy._run_module_as_main\n"); - PyErr_Print(); - Py_DECREF(runpy); - Py_DECREF(runmodule); - Py_DECREF(module); - return -1; - } - result = PyObject_Call(runmodule, runargs, NULL); - if (result == NULL) { - PyErr_Print(); - } - Py_DECREF(runpy); - Py_DECREF(runmodule); - Py_DECREF(module); - Py_DECREF(runargs); - if (result == NULL) { - return -1; - } - Py_DECREF(result); - return 0; -} - -int -main(int argc, char **argv) -{ - int i, res; - char *oldloc; - wchar_t **argv_copy; - wchar_t **argv_copy2; - _PyMem_SetupAllocators("malloc"); - argv_copy = gc(malloc(sizeof(wchar_t*) * (argc+1))); - argv_copy2 = gc(malloc(sizeof(wchar_t*) * (argc+1))); - oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); - setlocale(LC_ALL, ""); - for (i = 0; i < argc; i++) { - argv_copy2[i] = argv_copy[i] = gc(utf8toutf32(argv[i], -1, 0)); - } - argv_copy2[argc] = argv_copy[argc] = NULL; - setlocale(LC_ALL, oldloc); - PyMem_RawFree(oldloc); - _PyRandom_Init(); - Py_FrozenFlag++; - Py_NoSiteFlag++; - /* Py_VerboseFlag++; */ - Py_NoUserSiteDirectory++; - Py_IgnoreEnvironmentFlag++; - Py_DontWriteBytecodeFlag++; - Py_Initialize(); - Py_LimitedPath(); - PySys_SetArgvEx(argc, argv_copy, 0); - res = LaunchModule(L(LAUNCH)) != 0; - _PyMem_SetupAllocators("malloc"); - return res; -} diff --git a/third_party/python/Programs/repl.c b/third_party/python/Programs/repl.c index 98c84987a..b491b8ca7 100644 --- a/third_party/python/Programs/repl.c +++ b/third_party/python/Programs/repl.c @@ -153,7 +153,7 @@ TerminalReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) PyOS_sighandler_t saint; saint = PyOS_setsig(SIGINT, OnKeyboardInterrupt); if (setjmp(jbuf)) { - linenoiseDisableRawMode(STDIN_FILENO); + linenoiseDisableRawMode(); PyOS_setsig(SIGINT, saint); return NULL; } diff --git a/third_party/python/launch.c b/third_party/python/launch.c new file mode 100644 index 000000000..ac33f6cbc --- /dev/null +++ b/third_party/python/launch.c @@ -0,0 +1,103 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Python 3 │ +│ https://docs.python.org/3/license.html │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/x/x.h" +#include "third_party/python/Include/abstract.h" +#include "third_party/python/Include/import.h" +#include "third_party/python/Include/modsupport.h" +#include "third_party/python/Include/object.h" +#include "third_party/python/Include/pydebug.h" +#include "third_party/python/Include/pylifecycle.h" +#include "third_party/python/Include/pymem.h" +#include "third_party/python/Include/pythonrun.h" +#include "third_party/python/Include/sysmodule.h" +#include "third_party/python/Include/unicodeobject.h" +#include "third_party/python/Include/yoink.h" +/* clang-format off */ + +STATIC_YOINK("zip_uri_support"); +PYTHON_YOINK("_bootlocale"); +PYTHON_YOINK("_locale"); +PYTHON_YOINK("encodings.aliases"); +PYTHON_YOINK("encodings.latin_1"); +PYTHON_YOINK("encodings.utf_8"); +PYTHON_YOINK("launchpy"); + +extern char kLaunchPythonModuleName[]; /* generated by pyobj.com */ +const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules; +struct _inittab *PyImport_Inittab = _PyImport_Inittab; + +int +LaunchPythonModule(const char *name) +{ + PyObject *mod, *runpy, *runmodule, *runargs, *result; + if (!(runpy = PyImport_ImportModule("launchpy"))) { + PyErr_Print(); + return 123; + } + if (!(runmodule = PyObject_GetAttrString(runpy, "run_module_as_main"))) { + PyErr_Print(); + Py_DECREF(runpy); + return 122; + } + if (!(mod = PyUnicode_DecodeUTF8Stateful(name, strlen(name), 0, 0))) { + PyErr_Print(); + Py_DECREF(runpy); + Py_DECREF(runmodule); + return 121; + } + if (!(runargs = Py_BuildValue("(O)", mod))) { + PyErr_Print(); + Py_DECREF(runpy); + Py_DECREF(runmodule); + Py_DECREF(mod); + return 119; + } + if (!(result = PyObject_Call(runmodule, runargs, NULL))) { + PyErr_Print(); + } + Py_DECREF(runpy); + Py_DECREF(runmodule); + Py_DECREF(mod); + Py_DECREF(runargs); + if (!result) return 118; + Py_DECREF(result); + return 0; +} + +int +main(int argc, char *argv[]) +{ + size_t n; + int i, sts; + wchar_t *w; + PyObject *a, *s; + Py_FrozenFlag++; + Py_NoSiteFlag++; + /* Py_VerboseFlag++; */ + Py_NoUserSiteDirectory++; + Py_IgnoreEnvironmentFlag++; + Py_DontWriteBytecodeFlag++; +#if defined(Py_DEBUG) || defined(USE_TRACEMALLOC) + _PyMem_SetupAllocators(Py_GETENV("PYTHONMALLOC")); +#else + _PyMem_SetupAllocators(0); +#endif + _PyRandom_Init(); + Py_Initialize(); + Py_LimitedPath(); + if (!(a = PyList_New(argc))) return 127; + for (i = 0; i < argc; ++i) { + if (!(w = utf8toutf32(argv[i], -1, &n))) return 126; + if (!(s = PyUnicode_FromWideChar(w, n))) return 125; + PyList_SetItem(a, i, s); + free(w); + } + if (PySys_SetObject("argv", a)) return 124; + sts = LaunchPythonModule(kLaunchPythonModuleName); + if (Py_FinalizeEx() < 0) sts = 120; + return sts; +} diff --git a/third_party/python/pyconfig.h b/third_party/python/pyconfig.h index 3fecdad33..f153a4b05 100644 --- a/third_party/python/pyconfig.h +++ b/third_party/python/pyconfig.h @@ -985,8 +985,10 @@ /* Define to printf format modifier for Py_ssize_t */ #define PY_FORMAT_SIZE_T "z" -/* Define if you want to build an interpreter with many run-time checks. */ -/* #define Py_DEBUG 1 */ +#ifdef MODE_DBG +#define Py_DEBUG 1 +#define USE_TRACEMALLOC 1 +#endif /* Defined if Python is built as a shared library. */ /* #undef Py_ENABLE_SHARED */ diff --git a/third_party/python/pyobj.c b/third_party/python/pyobj.c index bf288e109..0b67638f1 100644 --- a/third_party/python/pyobj.c +++ b/third_party/python/pyobj.c @@ -64,12 +64,13 @@ OVERVIEW\n\ FLAGS\n\ \n\ -o PATH output elf object file\n\ - -P STR prefix fake directory in zip\n\ + -P STR prefix fake zip directory (default .python)\n\ -C INT strip directory components from src in zip\n\ -O0 don't optimize [default]\n\ -O1 remove debug statements\n\ -O2 remove debug statements and docstrings\n\ -B binary only (don't include .py file)\n\ + -m insert executable launch.c yoink\n\ -0 zip uncompressed\n\ -n do nothing\n\ -h help\n\ @@ -212,6 +213,7 @@ static struct stat st; static PyObject *code; static PyObject *marsh; static bool nocompress; +static bool insertlauncher; static uint64_t image_base; static int strip_components; static struct ElfWriter *elf; @@ -224,7 +226,8 @@ GetOpts(int argc, char *argv[]) { int opt; image_base = IMAGE_BASE_VIRTUAL; - while ((opt = getopt(argc, argv, "hn0Bb:O:o:C:P:")) != -1) { + path_prefix = ".python"; + while ((opt = getopt(argc, argv, "hnm0Bb:O:o:C:P:")) != -1) { switch (opt) { case 'B': binonly = true; @@ -232,6 +235,9 @@ GetOpts(int argc, char *argv[]) case '0': nocompress = true; break; + case 'm': + insertlauncher = true; + break; case 'o': outpath = optarg; break; @@ -289,7 +295,7 @@ GetZipFile(void) const char *zipfile; zipfile = pyfile; zipfile = StripComponents(zipfile, strip_components); - if (path_prefix) { + if (*path_prefix) { zipfile = gc(xjoinpaths(path_prefix, zipfile)); } return strdup(zipfile); @@ -418,9 +424,10 @@ Analyze(const char *modname, PyObject *code, struct Interner *globals) PyObject *co_code, *co_names, *co_consts, *name, *cnst, *iter, *item; mod = 0; istry = rel = 0; - co_code = PyObject_GetAttrString(code, "co_code"); - co_names = PyObject_GetAttrString(code, "co_names"); - co_consts = PyObject_GetAttrString(code, "co_consts"); + assert(PyCode_Check(code)); + co_code = ((PyCodeObject *)code)->co_code; + co_names = ((PyCodeObject *)code)->co_names; + co_consts = ((PyCodeObject *)code)->co_consts; n = PyBytes_GET_SIZE(co_code); p = PyBytes_AS_STRING(co_code); for (a = i = 0; i + 2 <= n; i += 2) { @@ -490,8 +497,6 @@ Analyze(const char *modname, PyObject *code, struct Interner *globals) } a = 0; } - Py_DECREF(co_names); - Py_DECREF(co_code); free(mod); iter = PyObject_GetIter(co_consts); while ((item = PyIter_Next(iter))) { @@ -501,7 +506,6 @@ Analyze(const char *modname, PyObject *code, struct Interner *globals) Py_DECREF(item); } Py_DECREF(iter); - Py_DECREF(co_consts); } static void @@ -521,6 +525,7 @@ AnalyzeModule(const char *modname) static int Objectify(void) { + size_t n; bool ispkg; char header[12]; size_t pysize, pycsize, marsize; @@ -568,14 +573,28 @@ Objectify(void) elfwriter_startsection(elf, ".yoink", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR); AnalyzeModule(modname); - if (path_prefix && !IsDot()) { + if (*path_prefix && !IsDot()) { elfwriter_yoink(elf, gc(xstrcat(path_prefix, "/")), STB_GLOBAL); } if (strchr(modname, '.')) { Yoink(gc(GetParent()), STB_GLOBAL); } - elfwriter_yoink(elf, "__zip_start", STB_GLOBAL); + if (insertlauncher) { + elfwriter_yoink(elf, "LaunchPythonModule", STB_GLOBAL); + } elfwriter_finishsection(elf); + if (insertlauncher) { + n = strlen(modname) + 1; + elfwriter_align(elf, 1, 0); + elfwriter_startsection(elf, ".rodata.str1.1", SHT_PROGBITS, + SHF_ALLOC | SHF_MERGE | SHF_STRINGS); + memcpy(elfwriter_reserve(elf, n), modname, n); + elfwriter_appendsym(elf, "kLaunchPythonModuleName", + ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), + STV_DEFAULT, 0, n); + elfwriter_commit(elf, n); + elfwriter_finishsection(elf); + } elfwriter_close(elf); freeinterner(yoinked); return 0; diff --git a/third_party/python/python.mk b/third_party/python/python.mk index e8a785439..d361184ff 100644 --- a/third_party/python/python.mk +++ b/third_party/python/python.mk @@ -27,8 +27,7 @@ THIRD_PARTY_PYTHON_COMS = \ o/$(MODE)/third_party/python/pyobj.com \ o/$(MODE)/third_party/python/pycomp.com \ o/$(MODE)/third_party/python/repl.com \ - o/$(MODE)/third_party/python/hello.com \ - o/$(MODE)/third_party/python/httpserver.com \ + o/$(MODE)/third_party/python/Lib/hello.com \ o/$(MODE)/third_party/python/pythontester.com THIRD_PARTY_PYTHON_CHECKS = \ @@ -408,6 +407,7 @@ THIRD_PARTY_PYTHON_STAGE1_A_SRCS = \ third_party/python/Python/traceback.c THIRD_PARTY_PYTHON_STAGE2_A_SRCS = \ + third_party/python/launch.c \ third_party/python/Modules/_hashmbedtls.c \ third_party/python/Objects/fromfd.c \ third_party/python/Modules/_bisectmodule.c \ @@ -1874,7 +1874,6 @@ THIRD_PARTY_PYTHON_STAGE2_A_DEPS = \ o/$(MODE)/third_party/python/pyobj.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ o/$(MODE)/third_party/python/pyobj.o \ $(CRT) \ $(APE) @@ -1882,7 +1881,6 @@ o/$(MODE)/third_party/python/pyobj.com.dbg: \ o/$(MODE)/third_party/python/pycomp.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ o/$(MODE)/third_party/python/pycomp.o \ $(CRT) \ $(APE) @@ -1890,7 +1888,6 @@ o/$(MODE)/third_party/python/pycomp.com.dbg: \ o/$(MODE)/third_party/python/freeze.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ o/$(MODE)/third_party/python/Programs/freeze.o \ $(CRT) \ $(APE) @@ -1898,9 +1895,7 @@ o/$(MODE)/third_party/python/freeze.com.dbg: \ o/$(MODE)/third_party/python/python.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ $(THIRD_PARTY_PYTHON_STAGE2) \ - $(THIRD_PARTY_PYTHON_STAGE2_A).pkg \ o/$(MODE)/third_party/python/Programs/python.o \ $(CRT) \ $(APE) @@ -1908,39 +1903,23 @@ o/$(MODE)/third_party/python/python.com.dbg: \ o/$(MODE)/third_party/python/repl.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ $(THIRD_PARTY_PYTHON_STAGE2) \ - $(THIRD_PARTY_PYTHON_STAGE2_A).pkg \ o/$(MODE)/third_party/python/Programs/repl.o \ $(CRT) \ $(APE) @$(APELINK) -o/$(MODE)/third_party/python/httpserver.com.dbg: \ +o/$(MODE)/third_party/python/Lib/hello.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ $(THIRD_PARTY_PYTHON_STAGE2) \ - $(THIRD_PARTY_PYTHON_STAGE2_A).pkg \ - o/$(MODE)/third_party/python/Programs/httpserver.o \ - $(CRT) \ - $(APE) - @$(APELINK) - -o/$(MODE)/third_party/python/hello.com.dbg: \ - $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ - $(THIRD_PARTY_PYTHON_STAGE2) \ - $(THIRD_PARTY_PYTHON_STAGE2_A).pkg \ - o/$(MODE)/third_party/python/Programs/hello.o \ + o/$(MODE)/third_party/python/Lib/hello.o \ $(CRT) \ $(APE) @$(APELINK) o/$(MODE)/third_party/python/pythontester.com.dbg: \ $(THIRD_PARTY_PYTHON_STAGE1) \ - $(THIRD_PARTY_PYTHON_STAGE1_A).pkg \ $(THIRD_PARTY_PYTHON_STAGE2) \ - $(THIRD_PARTY_PYTHON_STAGE2_A).pkg \ o/$(MODE)/third_party/python/Programs/pythontester.o \ $(CRT) \ $(APE) @@ -2025,6 +2004,7 @@ o/$(MODE)/third_party/python/Modules/faulthandler.o: \ $(THIRD_PARTY_PYTHON_STDLIB_PYS_OBJS): PYFLAGS += -P.python -C3 $(THIRD_PARTY_PYTHON_STDLIB_DATA_OBJS): ZIPOBJ_FLAGS += -P.python -C3 +o/$(MODE)/third_party/python/Lib/hello.o: PYFLAGS += -m o/$(MODE)/third_party/python/Python/ceval.o: QUOTA = -M512m o/$(MODE)/third_party/python/Objects/unicodeobject.o: QUOTA += -C16 @@ -2050,11 +2030,8 @@ THIRD_PARTY_PYTHON_SRCS = \ third_party/python/pyobj.c \ third_party/python/pycomp.c \ third_party/python/Programs/repl.c \ - third_party/python/Programs/hello.c \ - third_party/python/Programs/launch.c \ third_party/python/Programs/freeze.c \ third_party/python/Programs/python.c \ - third_party/python/Programs/httpserver.c \ third_party/python/Programs/pythontester.c #$(THIRD_PARTY_PYTHON_OBJS): \ diff --git a/third_party/sqlite3/shell.c b/third_party/sqlite3/shell.c index e062d456a..9a938e6e3 100644 --- a/third_party/sqlite3/shell.c +++ b/third_party/sqlite3/shell.c @@ -146,7 +146,7 @@ typedef unsigned char u8; #define shell_add_history(X) linenoiseHistoryAdd(X) #define shell_read_history(X) linenoiseHistoryLoad(X) #define shell_write_history(X) linenoiseHistorySave(X) -#define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) +#define shell_stifle_history(X) #define shell_readline(X) linenoise(X) #else