summaryrefslogtreecommitdiffstats
path: root/i18nutil
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /i18nutil
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'i18nutil')
-rw-r--r--i18nutil/IwyuFilter_i18nutil.yaml2
-rw-r--r--i18nutil/Library_i18nutil.mk55
-rw-r--r--i18nutil/Makefile14
-rw-r--r--i18nutil/Module_i18nutil.mk15
-rw-r--r--i18nutil/README.md4
-rw-r--r--i18nutil/source/utility/casefolding.cxx223
-rw-r--r--i18nutil/source/utility/casefolding_data.h859
-rw-r--r--i18nutil/source/utility/oneToOneMapping.cxx145
-rw-r--r--i18nutil/source/utility/paper.cxx499
-rw-r--r--i18nutil/source/utility/scripttypedetector.cxx84
-rw-r--r--i18nutil/source/utility/unicode.cxx1319
-rw-r--r--i18nutil/source/utility/unicode_data.h763
-rw-r--r--i18nutil/source/utility/widthfolding.cxx244
-rw-r--r--i18nutil/source/utility/widthfolding_data.h941
14 files changed, 5167 insertions, 0 deletions
diff --git a/i18nutil/IwyuFilter_i18nutil.yaml b/i18nutil/IwyuFilter_i18nutil.yaml
new file mode 100644
index 0000000000..7c69af4385
--- /dev/null
+++ b/i18nutil/IwyuFilter_i18nutil.yaml
@@ -0,0 +1,2 @@
+---
+assumeFilename: i18nutil/source/utility/paper.cxx
diff --git a/i18nutil/Library_i18nutil.mk b/i18nutil/Library_i18nutil.mk
new file mode 100644
index 0000000000..2a255e41d2
--- /dev/null
+++ b/i18nutil/Library_i18nutil.mk
@@ -0,0 +1,55 @@
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+$(eval $(call gb_Library_Library,i18nutil))
+
+$(eval $(call gb_Library_use_externals,i18nutil,\
+ boost_headers \
+ icu_headers \
+ icui18n \
+ icuuc \
+))
+
+$(eval $(call gb_Library_use_custom_headers,i18nutil,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_Library_use_sdk_api,i18nutil))
+
+$(eval $(call gb_Library_add_defs,i18nutil,\
+ -DI18NUTIL_DLLIMPLEMENTATION \
+))
+
+$(eval $(call gb_Library_use_libraries,i18nutil,\
+ utl \
+ i18nlangtag \
+ comphelper \
+ cppu \
+ sal \
+))
+
+$(eval $(call gb_Library_add_exception_objects,i18nutil,\
+ i18nutil/source/utility/casefolding \
+ i18nutil/source/utility/oneToOneMapping \
+ i18nutil/source/utility/paper \
+ i18nutil/source/utility/scripttypedetector \
+ i18nutil/source/utility/unicode \
+ i18nutil/source/utility/widthfolding \
+))
+
+# vim: set noet sw=4:
diff --git a/i18nutil/Makefile b/i18nutil/Makefile
new file mode 100644
index 0000000000..0997e62848
--- /dev/null
+++ b/i18nutil/Makefile
@@ -0,0 +1,14 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+
+include $(module_directory)/../solenv/gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/i18nutil/Module_i18nutil.mk b/i18nutil/Module_i18nutil.mk
new file mode 100644
index 0000000000..9b543dfdc3
--- /dev/null
+++ b/i18nutil/Module_i18nutil.mk
@@ -0,0 +1,15 @@
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Module_Module,i18nutil))
+
+$(eval $(call gb_Module_add_targets,i18nutil,\
+ Library_i18nutil \
+))
+
+# vim: set noet sw=4:
diff --git a/i18nutil/README.md b/i18nutil/README.md
new file mode 100644
index 0000000000..aa90a90135
--- /dev/null
+++ b/i18nutil/README.md
@@ -0,0 +1,4 @@
+# Internationalization Related Utilities (i18nutil)
+
+It comprises of honest c++ code which you just link to directly, while `i18npool`
+tends to consist of code you interact with via UNO.
diff --git a/i18nutil/source/utility/casefolding.cxx b/i18nutil/source/utility/casefolding.cxx
new file mode 100644
index 0000000000..52dbeb1ca1
--- /dev/null
+++ b/i18nutil/source/utility/casefolding.cxx
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <i18nutil/casefolding.hxx>
+#include "casefolding_data.h"
+#include <i18nutil/oneToOneMapping.hxx>
+#include <i18nutil/widthfolding.hxx>
+#include <i18nutil/transliteration.hxx>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <rtl/character.hxx>
+
+#include <unicode/uchar.h>
+
+using namespace com::sun::star::lang;
+using namespace com::sun::star::uno;
+
+namespace i18nutil {
+
+const Mapping mapping_03a3[] = {{0, 1, {0x03c2, 0, 0}},{0, 1, {0x03c3, 0, 0}}};
+const Mapping mapping_0307[] = {{0, 0, {0, 0, 0}},{0, 1, {0x0307, 0, 0}}};
+const Mapping mapping_004a[] = {{0, 2, {0x006a, 0x0307, 0}},{0, 1, {0x006a, 0, 0}}};
+const Mapping mapping_012e[] = {{0, 2, {0x012f, 0x0307, 0}},{0, 1, {0x012f, 0, 0}}};
+const Mapping mapping_00cc[] = {{0, 3, {0x0069, 0x0307, 0x0300}},{0, 1, {0x00ec, 0, 0}}};
+const Mapping mapping_00cd[] = {{0, 3, {0x0069, 0x0307, 0x0301}},{0, 1, {0x00ed, 0, 0}}};
+const Mapping mapping_0128[] = {{0, 3, {0x0069, 0x0307, 0x0303}},{0, 1, {0x0129, 0, 0}}};
+const Mapping mapping_0049[] = {{0, 2, {0x0069, 0x0307, 0}},{0, 1, {0x0131, 0, 0}},{0, 1, {0x0069, 0, 0}}};
+const Mapping mapping_0069[] = {{0, 1, {0x0130, 0, 0}},{0, 1, {0x0049, 0, 0}}};
+const Mapping mapping_0130[] = {{0, 1, {0x0069, 0, 0}},{0, 1, {0x0130, 0, 0}}};
+
+#define langIs(lang) (aLocale.Language == lang)
+
+// only check simple case, there is more complicated case need to be checked.
+#define type_i(ch) ((ch) == 0x0069 || (ch) == 0x006a)
+
+static bool cased_letter(sal_Unicode ch)
+{
+ int msb = ch >> 8;
+ int cmi = CaseMappingIndex[msb];
+ if (cmi < 0)
+ return false;
+ int cmv_idx = (cmi << 8) + (ch & 0xff);
+ return bool(static_cast<MappingType>(CaseMappingValue[cmv_idx].type) & MappingType::CasedLetterMask);
+}
+
+// for Lithuanian, condition to make explicit dot above when lowercasing capital I's and J's
+// whenever there are more accents above.
+#define accent_above(ch) (((ch) >= 0x0300 && (ch) <= 0x0314) || ((ch) >= 0x033D && (ch) <= 0x0344) || (ch) == 0x0346 || ((ch) >= 0x034A && (ch) <= 0x034C))
+
+const Mapping& casefolding::getConditionalValue(const sal_Unicode* str, sal_Int32 pos, sal_Int32 len, Locale const & aLocale, MappingType nMappingType)
+{
+ switch(str[pos]) {
+ case 0x03a3:
+ // final_sigma (not followed by cased and preceded by cased character)
+ // DOES NOT check ignorable sequence yet (more complicated implementation).
+ return !(pos < len && cased_letter(str[pos+1])) && (pos > 0 && cased_letter(str[pos-1])) ?
+ mapping_03a3[0] : mapping_03a3[1];
+ case 0x0307:
+ return (((nMappingType == MappingType::LowerToUpper && langIs("lt")) ||
+ (nMappingType == MappingType::UpperToLower && (langIs("tr") || langIs("az")))) &&
+ (pos > 0 && type_i(str[pos-1]))) ? // after_i
+ mapping_0307[0] : mapping_0307[1];
+ case 0x0130:
+ return (langIs("tr") || langIs("az")) ? mapping_0130[0] : mapping_0130[1];
+ case 0x0069:
+ return (langIs("tr") || langIs("az")) ? mapping_0069[0] : mapping_0069[1];
+ case 0x0049: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_0049[0] :
+ (langIs("tr") || langIs("az")) ? mapping_0049[1] : mapping_0049[2];
+ case 0x004a: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_004a[0] : mapping_004a[1];
+ case 0x012e: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_012e[0] : mapping_012e[1];
+ case 0x00cc: return langIs("lt") ? mapping_00cc[0] : mapping_00cc[1];
+ case 0x00cd: return langIs("lt") ? mapping_00cd[0] : mapping_00cd[1];
+ case 0x0128: return langIs("lt") ? mapping_0128[0] : mapping_0128[1];
+ }
+ // Should not come here
+ throw RuntimeException();
+}
+
+Mapping casefolding::getValue(const sal_Unicode* str, sal_Int32 pos, sal_Int32 len, Locale const & aLocale, MappingType nMappingType)
+{
+ if (pos > 0 && rtl::isHighSurrogate(str[pos-1]) && rtl::isLowSurrogate(str[pos]))
+ return { 0, 0, { 0, 0, 0 } };
+
+ Mapping dummy = { 0, 1, { str[pos], 0, 0 } };
+
+ sal_uInt32 c;
+ if (pos + 1 < len && rtl::isHighSurrogate(str[pos]) && rtl::isLowSurrogate(str[pos + 1]))
+ c = rtl::combineSurrogates(str[pos], str[pos + 1]);
+ else
+ c = str[pos];
+
+ sal_Int16 address = -1;
+ if (c < SAL_N_ELEMENTS(CaseMappingIndex) * 256)
+ address = CaseMappingIndex[c >> 8];
+
+ if (address >= 0) {
+ address = (address << 8) + (c & 0xFF);
+ if (static_cast<MappingType>(CaseMappingValue[address].type) & nMappingType) {
+ MappingType type = static_cast<MappingType>(CaseMappingValue[address].type);
+ if (type & MappingType::NotValue) {
+ if (CaseMappingValue[address].value == 0)
+ return getConditionalValue(str, pos, len, aLocale, nMappingType);
+ else {
+ for (int map = CaseMappingValue[address].value;
+ map < CaseMappingValue[address].value + MaxCaseMappingExtras; map++) {
+ if (static_cast<MappingType>(CaseMappingExtra[map].type) & nMappingType) {
+ if (static_cast<MappingType>(CaseMappingExtra[map].type) & MappingType::NotValue)
+ return getConditionalValue(str, pos, len, aLocale, nMappingType);
+ else
+ return CaseMappingExtra[map];
+ }
+ }
+ // Should not come here
+ throw RuntimeException();
+ }
+ }
+ else
+ {
+ dummy.map[0] = CaseMappingValue[address].value;
+ return dummy;
+ }
+ }
+ }
+
+ // If the code point is not supported by our case mapping tables,
+ // fallback to ICU functions.
+ // TODO: this does not handle special case mapping as these require
+ // using ustring.h APIs, which work on the whole string not character
+ // by character.
+ // TODO: what is the difference between ToLower and UpperToLower etc.?
+ sal_uInt32 value = c;
+ switch (nMappingType)
+ {
+ case MappingType::ToLower:
+ case MappingType::UpperToLower:
+ value = u_tolower(c);
+ break;
+ case MappingType::ToUpper:
+ case MappingType::LowerToUpper:
+ value = u_toupper(c);
+ break;
+ case MappingType::ToTitle:
+ value = u_totitle(c);
+ break;
+ case MappingType::SimpleFolding:
+ case MappingType::FullFolding:
+ value = u_foldCase(c, U_FOLD_CASE_DEFAULT);
+ break;
+ default: break;
+ }
+
+ dummy.nmap = rtl::splitSurrogates(value, dummy.map);
+
+ return dummy;
+}
+
+static bool
+is_ja_voice_sound_mark(sal_Unicode& current, sal_Unicode next)
+{
+ if (next != 0x3099 && next != 0x309a)
+ return false;
+ sal_Unicode c = widthfolding::getCompositionChar(current, next);
+ if (c != 0)
+ current = c;
+ return c != 0;
+}
+
+sal_Unicode casefolding::getNextChar(const sal_Unicode *str, sal_Int32& idx, sal_Int32 len, MappingElement& e, Locale const & aLocale, MappingType nMappingType, TransliterationFlags moduleLoaded)
+{
+ if( idx >= len )
+ {
+ e = MappingElement();
+ return 0;
+ }
+
+ sal_Unicode c;
+
+ if (moduleLoaded & TransliterationFlags::IGNORE_CASE) {
+ if( e.current >= e.element.nmap ) {
+ e.element = getValue(str, idx++, len, aLocale, nMappingType);
+ e.current = 0;
+ }
+ c = e.element.map[e.current++];
+ } else {
+ c = *(str + idx++);
+ }
+
+ if (moduleLoaded & TransliterationFlags::IGNORE_KANA) {
+ if ((0x3040 <= c && c <= 0x3094) || (0x309d <= c && c <= 0x309f))
+ c += 0x60;
+ }
+
+ // composition: KA + voice-mark --> GA. see halfwidthToFullwidth.cxx for detail
+ if (moduleLoaded & TransliterationFlags::IGNORE_WIDTH) {
+ static oneToOneMapping& half2fullTable = widthfolding::gethalf2fullTable();
+ c = half2fullTable[c];
+ if (0x3040 <= c && c <= 0x30ff && idx < len &&
+ is_ja_voice_sound_mark(c, half2fullTable[*(str + idx)]))
+ idx++;
+ }
+
+ return c;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/casefolding_data.h b/i18nutil/source/utility/casefolding_data.h
new file mode 100644
index 0000000000..174fdc066e
--- /dev/null
+++ b/i18nutil/source/utility/casefolding_data.h
@@ -0,0 +1,859 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_CASEFOLDING_DATA_H
+#define INCLUDED_I18NUTIL_SOURCE_UTILITY_CASEFOLDING_DATA_H
+
+#include <sal/types.h>
+
+namespace i18nutil {
+
+const sal_Int8 CaseMappingIndex[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, -1, -1, // 0000 - 07ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 0800 - 0fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 1000 - 17ff
+ -1, -1, -1, -1, -1, -1, 0x06, 0x07, // 1800 - 1fff
+ -1, 0x08, -1, -1, 0x09, -1, -1, -1, // 2000 - 27ff
+ -1, -1, -1, -1, 0x0a, -1, -1, -1, // 2800 - 2fff, Coptic added
+ -1, -1, -1, -1, -1, -1, -1, -1, // 3000 - 37ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 3800 - 3fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 4000 - 47ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 4800 - 4fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 5000 - 57ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 5800 - 5fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 6000 - 67ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 6800 - 6fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 7000 - 77ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 7800 - 7fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 8000 - 87ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 8800 - 8fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 9000 - 97ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // 9800 - 9fff
+ -1, -1, -1, -1, -1, -1, -1, -1, // a000 - a7ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // a800 - afff
+ -1, -1, -1, -1, -1, -1, -1, -1, // b000 - b7ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // b800 - bfff
+ -1, -1, -1, -1, -1, -1, -1, -1, // c000 - c7ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // c800 - cfff
+ -1, -1, -1, -1, -1, -1, -1, -1, // d000 - d7ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // d800 - dfff
+ -1, -1, -1, -1, -1, -1, -1, -1, // e000 - e7ff
+ -1, -1, -1, -1, -1, -1, -1, -1, // e800 - efff
+ -1, -1, -1, -1, -1, -1, -1, -1, // f000 - f7ff
+ -1, -1, -1, 0x0b, -1, -1, -1, 0x0c, // f800 - ffff
+};
+
+
+const Value CaseMappingValue[] = {
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0000 - 0007
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0008 - 000f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0010 - 0017
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0018 - 001f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0020 - 0027
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0028 - 002f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0030 - 0037
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0038 - 003f
+ {0x00, 0x0000}, {0x6a, 0x0061}, {0x6a, 0x0062}, {0x6a, 0x0063}, {0x6a, 0x0064}, {0x6a, 0x0065}, {0x6a, 0x0066}, {0x6a, 0x0067}, // 0040 - 0047
+ {0x6a, 0x0068}, {0xea, 0x0000}, {0xea, 0x0003}, {0x6a, 0x006B}, {0x6a, 0x006C}, {0x6a, 0x006D}, {0x6a, 0x006E}, {0x6a, 0x006F}, // 0048 - 004f
+ {0x6a, 0x0070}, {0x6a, 0x0071}, {0x6a, 0x0072}, {0x6a, 0x0073}, {0x6a, 0x0074}, {0x6a, 0x0075}, {0x6a, 0x0076}, {0x6a, 0x0077}, // 0050 - 0057
+ {0x6a, 0x0078}, {0x6a, 0x0079}, {0x6a, 0x007A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0058 - 005f
+ {0x00, 0x0000}, {0x15, 0x0041}, {0x15, 0x0042}, {0x15, 0x0043}, {0x15, 0x0044}, {0x15, 0x0045}, {0x15, 0x0046}, {0x15, 0x0047}, // 0060 - 0067
+ {0x15, 0x0048}, {0x95, 0x0000}, {0x15, 0x004A}, {0x15, 0x004B}, {0x15, 0x004C}, {0x15, 0x004D}, {0x15, 0x004E}, {0x15, 0x004F}, // 0068 - 006f
+ {0x15, 0x0050}, {0x15, 0x0051}, {0x15, 0x0052}, {0x15, 0x0053}, {0x15, 0x0054}, {0x15, 0x0055}, {0x15, 0x0056}, {0x15, 0x0057}, // 0070 - 0077
+ {0x15, 0x0058}, {0x15, 0x0059}, {0x15, 0x005A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0078 - 007f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0080 - 0087
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0088 - 008f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0090 - 0097
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0098 - 009f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00a0 - 00a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00a8 - 00af
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf5, 0x0005}, {0x00, 0x0000}, {0x00, 0x0000}, // 00b0 - 00b7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00b8 - 00bf
+ {0x6a, 0x00E0}, {0x6a, 0x00E1}, {0x6a, 0x00E2}, {0x6a, 0x00E3}, {0x6a, 0x00E4}, {0x6a, 0x00E5}, {0x6a, 0x00E6}, {0x6a, 0x00E7}, // 00c0 - 00c7
+ {0x6a, 0x00E8}, {0x6a, 0x00E9}, {0x6a, 0x00EA}, {0x6a, 0x00EB}, {0xea, 0x0007}, {0xea, 0x0009}, {0x6a, 0x00EE}, {0x6a, 0x00EF}, // 00c8 - 00cf
+ {0x6a, 0x00F0}, {0x6a, 0x00F1}, {0x6a, 0x00F2}, {0x6a, 0x00F3}, {0x6a, 0x00F4}, {0x6a, 0x00F5}, {0x6a, 0x00F6}, {0x00, 0x0000}, // 00d0 - 00d7
+ {0x6a, 0x00F8}, {0x6a, 0x00F9}, {0x6a, 0x00FA}, {0x6a, 0x00FB}, {0x6a, 0x00FC}, {0x6a, 0x00FD}, {0x6a, 0x00FE}, {0xd5, 0x000B}, // 00d8 - 00df
+ {0x15, 0x00C0}, {0x15, 0x00C1}, {0x15, 0x00C2}, {0x15, 0x00C3}, {0x15, 0x00C4}, {0x15, 0x00C5}, {0x15, 0x00C6}, {0x15, 0x00C7}, // 00e0 - 00e7
+ {0x15, 0x00C8}, {0x15, 0x00C9}, {0x15, 0x00CA}, {0x15, 0x00CB}, {0x15, 0x00CC}, {0x15, 0x00CD}, {0x15, 0x00CE}, {0x15, 0x00CF}, // 00e8 - 00ef
+ {0x15, 0x00D0}, {0x15, 0x00D1}, {0x15, 0x00D2}, {0x15, 0x00D3}, {0x15, 0x00D4}, {0x15, 0x00D5}, {0x15, 0x00D6}, {0x00, 0x0000}, // 00f0 - 00f7
+ {0x15, 0x00D8}, {0x15, 0x00D9}, {0x15, 0x00DA}, {0x15, 0x00DB}, {0x15, 0x00DC}, {0x15, 0x00DD}, {0x15, 0x00DE}, {0x15, 0x0178}, // 00f8 - 00ff
+
+ {0x6a, 0x0101}, {0x15, 0x0100}, {0x6a, 0x0103}, {0x15, 0x0102}, {0x6a, 0x0105}, {0x15, 0x0104}, {0x6a, 0x0107}, {0x15, 0x0106}, // 0100 - 0107
+ {0x6a, 0x0109}, {0x15, 0x0108}, {0x6a, 0x010B}, {0x15, 0x010A}, {0x6a, 0x010D}, {0x15, 0x010C}, {0x6a, 0x010F}, {0x15, 0x010E}, // 0108 - 010f
+ {0x6a, 0x0111}, {0x15, 0x0110}, {0x6a, 0x0113}, {0x15, 0x0112}, {0x6a, 0x0115}, {0x15, 0x0114}, {0x6a, 0x0117}, {0x15, 0x0116}, // 0110 - 0117
+ {0x6a, 0x0119}, {0x15, 0x0118}, {0x6a, 0x011B}, {0x15, 0x011A}, {0x6a, 0x011D}, {0x15, 0x011C}, {0x6a, 0x011F}, {0x15, 0x011E}, // 0118 - 011f
+ {0x6a, 0x0121}, {0x15, 0x0120}, {0x6a, 0x0123}, {0x15, 0x0122}, {0x6a, 0x0125}, {0x15, 0x0124}, {0x6a, 0x0127}, {0x15, 0x0126}, // 0120 - 0127
+ {0xea, 0x000E}, {0x15, 0x0128}, {0x6a, 0x012B}, {0x15, 0x012A}, {0x6a, 0x012D}, {0x15, 0x012C}, {0xea, 0x0010}, {0x15, 0x012E}, // 0128 - 012f
+ {0xea, 0x0000}, {0x15, 0x0049}, {0x6a, 0x0133}, {0x15, 0x0132}, {0x6a, 0x0135}, {0x15, 0x0134}, {0x6a, 0x0137}, {0x15, 0x0136}, // 0130 - 0137
+ {0x00, 0x0000}, {0x6a, 0x013A}, {0x15, 0x0139}, {0x6a, 0x013C}, {0x15, 0x013B}, {0x6a, 0x013E}, {0x15, 0x013D}, {0x6a, 0x0140}, // 0138 - 013f
+ {0x15, 0x013F}, {0x6a, 0x0142}, {0x15, 0x0141}, {0x6a, 0x0144}, {0x15, 0x0143}, {0x6a, 0x0146}, {0x15, 0x0145}, {0x6a, 0x0148}, // 0140 - 0147
+ {0x15, 0x0147}, {0xd5, 0x0014}, {0x6a, 0x014B}, {0x15, 0x014A}, {0x6a, 0x014D}, {0x15, 0x014C}, {0x6a, 0x014F}, {0x15, 0x014E}, // 0148 - 014f
+ {0x6a, 0x0151}, {0x15, 0x0150}, {0x6a, 0x0153}, {0x15, 0x0152}, {0x6a, 0x0155}, {0x15, 0x0154}, {0x6a, 0x0157}, {0x15, 0x0156}, // 0150 - 0157
+ {0x6a, 0x0159}, {0x15, 0x0158}, {0x6a, 0x015B}, {0x15, 0x015A}, {0x6a, 0x015D}, {0x15, 0x015C}, {0x6a, 0x015F}, {0x15, 0x015E}, // 0158 - 015f
+ {0x6a, 0x0161}, {0x15, 0x0160}, {0x6a, 0x0163}, {0x15, 0x0162}, {0x6a, 0x0165}, {0x15, 0x0164}, {0x6a, 0x0167}, {0x15, 0x0166}, // 0160 - 0167
+ {0x6a, 0x0169}, {0x15, 0x0168}, {0x6a, 0x016B}, {0x15, 0x016A}, {0x6a, 0x016D}, {0x15, 0x016C}, {0x6a, 0x016F}, {0x15, 0x016E}, // 0168 - 016f
+ {0x6a, 0x0171}, {0x15, 0x0170}, {0x6a, 0x0173}, {0x15, 0x0172}, {0x6a, 0x0175}, {0x15, 0x0174}, {0x6a, 0x0177}, {0x15, 0x0176}, // 0170 - 0177
+ {0x6a, 0x00FF}, {0x6a, 0x017A}, {0x15, 0x0179}, {0x6a, 0x017C}, {0x15, 0x017B}, {0x6a, 0x017E}, {0x15, 0x017D}, {0xf5, 0x0016}, // 0178 - 017f
+ {0x00, 0x0000}, {0x6a, 0x0253}, {0x6a, 0x0183}, {0x15, 0x0182}, {0x6a, 0x0185}, {0x15, 0x0184}, {0x6a, 0x0254}, {0x6a, 0x0188}, // 0180 - 0187
+ {0x15, 0x0187}, {0x6a, 0x0256}, {0x6a, 0x0257}, {0x6a, 0x018C}, {0x15, 0x018B}, {0x00, 0x0000}, {0x6a, 0x01DD}, {0x6a, 0x0259}, // 0188 - 018f
+ {0x6a, 0x025B}, {0x6a, 0x0192}, {0x15, 0x0191}, {0x6a, 0x0260}, {0x6a, 0x0263}, {0x15, 0x01F6}, {0x6a, 0x0269}, {0x6a, 0x0268}, // 0190 - 0197
+ {0x6a, 0x0199}, {0x15, 0x0198}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x026F}, {0x6a, 0x0272}, {0x00, 0x0000}, {0x6a, 0x0275}, // 0198 - 019f
+ {0x6a, 0x01A1}, {0x15, 0x01A0}, {0x6a, 0x01A3}, {0x15, 0x01A2}, {0x6a, 0x01A5}, {0x15, 0x01A4}, {0x6a, 0x0280}, {0x6a, 0x01A8}, // 01a0 - 01a7
+ {0x15, 0x01A7}, {0x6a, 0x0283}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x01AD}, {0x15, 0x01AC}, {0x6a, 0x0288}, {0x6a, 0x01B0}, // 01a8 - 01af
+ {0x15, 0x01AF}, {0x6a, 0x028A}, {0x6a, 0x028B}, {0x6a, 0x01B4}, {0x15, 0x01B3}, {0x6a, 0x01B6}, {0x15, 0x01B5}, {0x6a, 0x0292}, // 01b0 - 01b7
+ {0x6a, 0x01B9}, {0x15, 0x01B8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x01BD}, {0x15, 0x01BC}, {0x00, 0x0000}, {0x15, 0x01F7}, // 01b8 - 01bf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xfa, 0x0018}, {0xec, 0x001A}, {0x95, 0x001C}, {0xfa, 0x001E}, // 01c0 - 01c7
+ {0xec, 0x0020}, {0x95, 0x0022}, {0xfa, 0x0024}, {0xec, 0x0026}, {0x95, 0x0028}, {0x6a, 0x01CE}, {0x15, 0x01CD}, {0x6a, 0x01D0}, // 01c8 - 01cf
+ {0x15, 0x01CF}, {0x6a, 0x01D2}, {0x15, 0x01D1}, {0x6a, 0x01D4}, {0x15, 0x01D3}, {0x6a, 0x01D6}, {0x15, 0x01D5}, {0x6a, 0x01D8}, // 01d0 - 01d7
+ {0x15, 0x01D7}, {0x6a, 0x01DA}, {0x15, 0x01D9}, {0x6a, 0x01DC}, {0x15, 0x01DB}, {0x15, 0x018E}, {0x6a, 0x01DF}, {0x15, 0x01DE}, // 01d8 - 01df
+ {0x6a, 0x01E1}, {0x15, 0x01E0}, {0x6a, 0x01E3}, {0x15, 0x01E2}, {0x6a, 0x01E5}, {0x15, 0x01E4}, {0x6a, 0x01E7}, {0x15, 0x01E6}, // 01e0 - 01e7
+ {0x6a, 0x01E9}, {0x15, 0x01E8}, {0x6a, 0x01EB}, {0x15, 0x01EA}, {0x6a, 0x01ED}, {0x15, 0x01EC}, {0x6a, 0x01EF}, {0x15, 0x01EE}, // 01e8 - 01ef
+ {0xd5, 0x002A}, {0xfa, 0x002C}, {0xec, 0x002E}, {0x95, 0x0030}, {0x6a, 0x01F5}, {0x15, 0x01F4}, {0x6a, 0x0195}, {0x6a, 0x01BF}, // 01f0 - 01f7
+ {0x6a, 0x01F9}, {0x15, 0x01F8}, {0x6a, 0x01FB}, {0x15, 0x01FA}, {0x6a, 0x01FD}, {0x15, 0x01FC}, {0x6a, 0x01FF}, {0x15, 0x01FE}, // 01f8 - 01ff
+
+ {0x6a, 0x0201}, {0x15, 0x0200}, {0x6a, 0x0203}, {0x15, 0x0202}, {0x6a, 0x0205}, {0x15, 0x0204}, {0x6a, 0x0207}, {0x15, 0x0206}, // 0200 - 0207
+ {0x6a, 0x0209}, {0x15, 0x0208}, {0x6a, 0x020B}, {0x15, 0x020A}, {0x6a, 0x020D}, {0x15, 0x020C}, {0x6a, 0x020F}, {0x15, 0x020E}, // 0208 - 020f
+ {0x6a, 0x0211}, {0x15, 0x0210}, {0x6a, 0x0213}, {0x15, 0x0212}, {0x6a, 0x0215}, {0x15, 0x0214}, {0x6a, 0x0217}, {0x15, 0x0216}, // 0210 - 0217
+ {0x6a, 0x0219}, {0x15, 0x0218}, {0x6a, 0x021B}, {0x15, 0x021A}, {0x6a, 0x021D}, {0x15, 0x021C}, {0x6a, 0x021F}, {0x15, 0x021E}, // 0218 - 021f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x0223}, {0x15, 0x0222}, {0x6a, 0x0225}, {0x15, 0x0224}, {0x6a, 0x0227}, {0x15, 0x0226}, // 0220 - 0227
+ {0x6a, 0x0229}, {0x15, 0x0228}, {0x6a, 0x022B}, {0x15, 0x022A}, {0x6a, 0x022D}, {0x15, 0x022C}, {0x6a, 0x022F}, {0x15, 0x022E}, // 0228 - 022f
+ {0x6a, 0x0231}, {0x15, 0x0230}, {0x6a, 0x0233}, {0x15, 0x0232}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0230 - 0237
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0238 - 023f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0240 - 0247
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0248 - 024f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x0181}, {0x15, 0x0186}, {0x00, 0x0000}, {0x15, 0x0189}, {0x15, 0x018A}, // 0250 - 0257
+ {0x00, 0x0000}, {0x15, 0x018F}, {0x00, 0x0000}, {0x15, 0x0190}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0258 - 025f
+ {0x15, 0x0193}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x0194}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0260 - 0267
+ {0x15, 0x0197}, {0x15, 0x0196}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019C}, // 0268 - 026f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019D}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019F}, {0x00, 0x0000}, {0x00, 0x0000}, // 0270 - 0277
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0278 - 027f
+ {0x15, 0x01A6}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x01A9}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0280 - 0287
+ {0x15, 0x01AE}, {0x00, 0x0000}, {0x15, 0x01B1}, {0x15, 0x01B2}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0288 - 028f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x01B7}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0290 - 0297
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0298 - 029f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02a0 - 02a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02a8 - 02af
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02b0 - 02b7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02b8 - 02bf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02c0 - 02c7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02c8 - 02cf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02d0 - 02d7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02d8 - 02df
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02e0 - 02e7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02e8 - 02ef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02f0 - 02f7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02f8 - 02ff
+
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x9f, 0x0000}, // 0300 - 0307
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0308 - 030f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0310 - 0317
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0318 - 031f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0320 - 0327
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0328 - 032f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0330 - 0337
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0338 - 033f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf4, 0x0032}, {0x00, 0x0000}, {0x00, 0x0000}, // 0340 - 0347
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0348 - 034f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0350 - 0357
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0358 - 035f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0360 - 0367
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0368 - 036f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0370 - 0377
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0378 - 037f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03AC}, {0x00, 0x0000}, // 0380 - 0387
+ {0x6a, 0x03AD}, {0x6a, 0x03AE}, {0x6a, 0x03AF}, {0x00, 0x0000}, {0x6a, 0x03CC}, {0x00, 0x0000}, {0x6a, 0x03CD}, {0x6a, 0x03CE}, // 0388 - 038f
+ {0xd5, 0x0034}, {0x6a, 0x03B1}, {0x6a, 0x03B2}, {0x6a, 0x03B3}, {0x6a, 0x03B4}, {0x6a, 0x03B5}, {0x6a, 0x03B6}, {0x6a, 0x03B7}, // 0390 - 0397
+ {0x6a, 0x03B8}, {0x6a, 0x03B9}, {0x6a, 0x03BA}, {0x6a, 0x03BB}, {0x6a, 0x03BC}, {0x6a, 0x03BD}, {0x6a, 0x03BE}, {0x6a, 0x03BF}, // 0398 - 039f
+ {0x6a, 0x03C0}, {0x6a, 0x03C1}, {0x00, 0x0000}, {0xea, 0x0036}, {0x6a, 0x03C4}, {0x6a, 0x03C5}, {0x6a, 0x03C6}, {0x6a, 0x03C7}, // 03a0 - 03a7
+ {0x6a, 0x03C8}, {0x6a, 0x03C9}, {0x6a, 0x03CA}, {0x6a, 0x03CB}, {0x15, 0x0386}, {0x15, 0x0388}, {0x15, 0x0389}, {0x15, 0x038A}, // 03a8 - 03af
+ {0xd5, 0x0038}, {0x15, 0x0391}, {0x15, 0x0392}, {0x15, 0x0393}, {0x15, 0x0394}, {0x15, 0x0395}, {0x15, 0x0396}, {0x15, 0x0397}, // 03b0 - 03b7
+ {0x15, 0x0398}, {0x15, 0x0399}, {0x15, 0x039A}, {0x15, 0x039B}, {0x15, 0x039C}, {0x15, 0x039D}, {0x15, 0x039E}, {0x15, 0x039F}, // 03b8 - 03bf
+ {0x15, 0x03A0}, {0x15, 0x03A1}, {0xf5, 0x003A}, {0x15, 0x03A3}, {0x15, 0x03A4}, {0x15, 0x03A5}, {0x15, 0x03A6}, {0x15, 0x03A7}, // 03c0 - 03c7
+ {0x15, 0x03A8}, {0x15, 0x03A9}, {0x15, 0x03AA}, {0x15, 0x03AB}, {0x15, 0x038C}, {0x15, 0x038E}, {0x15, 0x038F}, {0x00, 0x0000}, // 03c8 - 03cf
+ {0xf5, 0x003C}, {0xf5, 0x003E}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf5, 0x0040}, {0xf5, 0x0042}, {0x00, 0x0000}, // 03d0 - 03d7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03DB}, {0x15, 0x03DA}, {0x6a, 0x03DD}, {0x15, 0x03DC}, {0x6a, 0x03DF}, {0x15, 0x03DE}, // 03d8 - 03df
+ {0x6a, 0x03E1}, {0x15, 0x03E0}, {0x6a, 0x03E3}, {0x15, 0x03E2}, {0x6a, 0x03E5}, {0x15, 0x03E4}, {0x6a, 0x03E7}, {0x15, 0x03E6}, // 03e0 - 03e7
+ {0x6a, 0x03E9}, {0x15, 0x03E8}, {0x6a, 0x03EB}, {0x15, 0x03EA}, {0x6a, 0x03ED}, {0x15, 0x03EC}, {0x6a, 0x03EF}, {0x15, 0x03EE}, // 03e8 - 03ef
+ {0xf5, 0x0044}, {0xf5, 0x0046}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03B8}, {0xf5, 0x004A}, {0x00, 0x0000}, {0x00, 0x0000}, // 03f0 - 03f7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 03f8 - 03ff
+
+ {0x6a, 0x0450}, {0x6a, 0x0451}, {0x6a, 0x0452}, {0x6a, 0x0453}, {0x6a, 0x0454}, {0x6a, 0x0455}, {0x6a, 0x0456}, {0x6a, 0x0457}, // 0400 - 0407
+ {0x6a, 0x0458}, {0x6a, 0x0459}, {0x6a, 0x045A}, {0x6a, 0x045B}, {0x6a, 0x045C}, {0x6a, 0x045D}, {0x6a, 0x045E}, {0x6a, 0x045F}, // 0408 - 040f
+ {0x6a, 0x0430}, {0x6a, 0x0431}, {0x6a, 0x0432}, {0x6a, 0x0433}, {0x6a, 0x0434}, {0x6a, 0x0435}, {0x6a, 0x0436}, {0x6a, 0x0437}, // 0410 - 0417
+ {0x6a, 0x0438}, {0x6a, 0x0439}, {0x6a, 0x043A}, {0x6a, 0x043B}, {0x6a, 0x043C}, {0x6a, 0x043D}, {0x6a, 0x043E}, {0x6a, 0x043F}, // 0418 - 041f
+ {0x6a, 0x0440}, {0x6a, 0x0441}, {0x6a, 0x0442}, {0x6a, 0x0443}, {0x6a, 0x0444}, {0x6a, 0x0445}, {0x6a, 0x0446}, {0x6a, 0x0447}, // 0420 - 0427
+ {0x6a, 0x0448}, {0x6a, 0x0449}, {0x6a, 0x044A}, {0x6a, 0x044B}, {0x6a, 0x044C}, {0x6a, 0x044D}, {0x6a, 0x044E}, {0x6a, 0x044F}, // 0428 - 042f
+ {0x15, 0x0410}, {0x15, 0x0411}, {0x15, 0x0412}, {0x15, 0x0413}, {0x15, 0x0414}, {0x15, 0x0415}, {0x15, 0x0416}, {0x15, 0x0417}, // 0430 - 0437
+ {0x15, 0x0418}, {0x15, 0x0419}, {0x15, 0x041A}, {0x15, 0x041B}, {0x15, 0x041C}, {0x15, 0x041D}, {0x15, 0x041E}, {0x15, 0x041F}, // 0438 - 043f
+ {0x15, 0x0420}, {0x15, 0x0421}, {0x15, 0x0422}, {0x15, 0x0423}, {0x15, 0x0424}, {0x15, 0x0425}, {0x15, 0x0426}, {0x15, 0x0427}, // 0440 - 0447
+ {0x15, 0x0428}, {0x15, 0x0429}, {0x15, 0x042A}, {0x15, 0x042B}, {0x15, 0x042C}, {0x15, 0x042D}, {0x15, 0x042E}, {0x15, 0x042F}, // 0448 - 044f
+ {0x15, 0x0400}, {0x15, 0x0401}, {0x15, 0x0402}, {0x15, 0x0403}, {0x15, 0x0404}, {0x15, 0x0405}, {0x15, 0x0406}, {0x15, 0x0407}, // 0450 - 0457
+ {0x15, 0x0408}, {0x15, 0x0409}, {0x15, 0x040A}, {0x15, 0x040B}, {0x15, 0x040C}, {0x15, 0x040D}, {0x15, 0x040E}, {0x15, 0x040F}, // 0458 - 045f
+ {0x6a, 0x0461}, {0x15, 0x0460}, {0x6a, 0x0463}, {0x15, 0x0462}, {0x6a, 0x0465}, {0x15, 0x0464}, {0x6a, 0x0467}, {0x15, 0x0466}, // 0460 - 0467
+ {0x6a, 0x0469}, {0x15, 0x0468}, {0x6a, 0x046B}, {0x15, 0x046A}, {0x6a, 0x046D}, {0x15, 0x046C}, {0x6a, 0x046F}, {0x15, 0x046E}, // 0468 - 046f
+ {0x6a, 0x0471}, {0x15, 0x0470}, {0x6a, 0x0473}, {0x15, 0x0472}, {0x6a, 0x0475}, {0x15, 0x0474}, {0x6a, 0x0477}, {0x15, 0x0476}, // 0470 - 0477
+ {0x6a, 0x0479}, {0x15, 0x0478}, {0x6a, 0x047B}, {0x15, 0x047A}, {0x6a, 0x047D}, {0x15, 0x047C}, {0x6a, 0x047F}, {0x15, 0x047E}, // 0478 - 047f
+ {0x6a, 0x0481}, {0x15, 0x0480}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0480 - 0487
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x048D}, {0x15, 0x048C}, {0x6a, 0x048F}, {0x15, 0x048E}, // 0488 - 048f
+ {0x6a, 0x0491}, {0x15, 0x0490}, {0x6a, 0x0493}, {0x15, 0x0492}, {0x6a, 0x0495}, {0x15, 0x0494}, {0x6a, 0x0497}, {0x15, 0x0496}, // 0490 - 0497
+ {0x6a, 0x0499}, {0x15, 0x0498}, {0x6a, 0x049B}, {0x15, 0x049A}, {0x6a, 0x049D}, {0x15, 0x049C}, {0x6a, 0x049F}, {0x15, 0x049E}, // 0498 - 049f
+ {0x6a, 0x04A1}, {0x15, 0x04A0}, {0x6a, 0x04A3}, {0x15, 0x04A2}, {0x6a, 0x04A5}, {0x15, 0x04A4}, {0x6a, 0x04A7}, {0x15, 0x04A6}, // 04a0 - 04a7
+ {0x6a, 0x04A9}, {0x15, 0x04A8}, {0x6a, 0x04AB}, {0x15, 0x04AA}, {0x6a, 0x04AD}, {0x15, 0x04AC}, {0x6a, 0x04AF}, {0x15, 0x04AE}, // 04a8 - 04af
+ {0x6a, 0x04B1}, {0x15, 0x04B0}, {0x6a, 0x04B3}, {0x15, 0x04B2}, {0x6a, 0x04B5}, {0x15, 0x04B4}, {0x6a, 0x04B7}, {0x15, 0x04B6}, // 04b0 - 04b7
+ {0x6a, 0x04B9}, {0x15, 0x04B8}, {0x6a, 0x04BB}, {0x15, 0x04BA}, {0x6a, 0x04BD}, {0x15, 0x04BC}, {0x6a, 0x04BF}, {0x15, 0x04BE}, // 04b8 - 04bf
+ {0x00, 0x0000}, {0x6a, 0x04C2}, {0x15, 0x04C1}, {0x6a, 0x04C4}, {0x15, 0x04C3}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x04C8}, // 04c0 - 04c7
+ {0x15, 0x04C7}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x04CC}, {0x15, 0x04CB}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 04c8 - 04cf
+ {0x6a, 0x04D1}, {0x15, 0x04D0}, {0x6a, 0x04D3}, {0x15, 0x04D2}, {0x6a, 0x04D5}, {0x15, 0x04D4}, {0x6a, 0x04D7}, {0x15, 0x04D6}, // 04d0 - 04d7
+ {0x6a, 0x04D9}, {0x15, 0x04D8}, {0x6a, 0x04DB}, {0x15, 0x04DA}, {0x6a, 0x04DD}, {0x15, 0x04DC}, {0x6a, 0x04DF}, {0x15, 0x04DE}, // 04d8 - 04df
+ {0x6a, 0x04E1}, {0x15, 0x04E0}, {0x6a, 0x04E3}, {0x15, 0x04E2}, {0x6a, 0x04E5}, {0x15, 0x04E4}, {0x6a, 0x04E7}, {0x15, 0x04E6}, // 04e0 - 04e7
+ {0x6a, 0x04E9}, {0x15, 0x04E8}, {0x6a, 0x04EB}, {0x15, 0x04EA}, {0x6a, 0x04ED}, {0x15, 0x04EC}, {0x6a, 0x04EF}, {0x15, 0x04EE}, // 04e8 - 04ef
+ {0x6a, 0x04F1}, {0x15, 0x04F0}, {0x6a, 0x04F3}, {0x15, 0x04F2}, {0x6a, 0x04F5}, {0x15, 0x04F4}, {0x00, 0x0000}, {0x00, 0x0000}, // 04f0 - 04f7
+ {0x6a, 0x04F9}, {0x15, 0x04F8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 04f8 - 04ff
+
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0500 - 0507
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0508 - 050f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0510 - 0517
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0518 - 051f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0520 - 0527
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0528 - 052f
+ {0x00, 0x0000}, {0x6a, 0x0561}, {0x6a, 0x0562}, {0x6a, 0x0563}, {0x6a, 0x0564}, {0x6a, 0x0565}, {0x6a, 0x0566}, {0x6a, 0x0567}, // 0530 - 0537
+ {0x6a, 0x0568}, {0x6a, 0x0569}, {0x6a, 0x056A}, {0x6a, 0x056B}, {0x6a, 0x056C}, {0x6a, 0x056D}, {0x6a, 0x056E}, {0x6a, 0x056F}, // 0538 - 053f
+ {0x6a, 0x0570}, {0x6a, 0x0571}, {0x6a, 0x0572}, {0x6a, 0x0573}, {0x6a, 0x0574}, {0x6a, 0x0575}, {0x6a, 0x0576}, {0x6a, 0x0577}, // 0540 - 0547
+ {0x6a, 0x0578}, {0x6a, 0x0579}, {0x6a, 0x057A}, {0x6a, 0x057B}, {0x6a, 0x057C}, {0x6a, 0x057D}, {0x6a, 0x057E}, {0x6a, 0x057F}, // 0548 - 054f
+ {0x6a, 0x0580}, {0x6a, 0x0581}, {0x6a, 0x0582}, {0x6a, 0x0583}, {0x6a, 0x0584}, {0x6a, 0x0585}, {0x6a, 0x0586}, {0x00, 0x0000}, // 0550 - 0557
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0558 - 055f
+ {0x00, 0x0000}, {0x15, 0x0531}, {0x15, 0x0532}, {0x15, 0x0533}, {0x15, 0x0534}, {0x15, 0x0535}, {0x15, 0x0536}, {0x15, 0x0537}, // 0560 - 0567
+ {0x15, 0x0538}, {0x15, 0x0539}, {0x15, 0x053A}, {0x15, 0x053B}, {0x15, 0x053C}, {0x15, 0x053D}, {0x15, 0x053E}, {0x15, 0x053F}, // 0568 - 056f
+ {0x15, 0x0540}, {0x15, 0x0541}, {0x15, 0x0542}, {0x15, 0x0543}, {0x15, 0x0544}, {0x15, 0x0545}, {0x15, 0x0546}, {0x15, 0x0547}, // 0570 - 0577
+ {0x15, 0x0548}, {0x15, 0x0549}, {0x15, 0x054A}, {0x15, 0x054B}, {0x15, 0x054C}, {0x15, 0x054D}, {0x15, 0x054E}, {0x15, 0x054F}, // 0578 - 057f
+ {0x15, 0x0550}, {0x15, 0x0551}, {0x15, 0x0552}, {0x15, 0x0553}, {0x15, 0x0554}, {0x15, 0x0555}, {0x15, 0x0556}, {0xd5, 0x004C}, // 0580 - 0587
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0588 - 058f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0590 - 0597
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0598 - 059f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05a0 - 05a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05a8 - 05af
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05b0 - 05b7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05b8 - 05bf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05c0 - 05c7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05c8 - 05cf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05d0 - 05d7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05d8 - 05df
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05e0 - 05e7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05e8 - 05ef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05f0 - 05f7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05f8 - 05ff
+
+ {0x6a, 0x1E01}, {0x15, 0x1E00}, {0x6a, 0x1E03}, {0x15, 0x1E02}, {0x6a, 0x1E05}, {0x15, 0x1E04}, {0x6a, 0x1E07}, {0x15, 0x1E06}, // 1e00 - 1e07
+ {0x6a, 0x1E09}, {0x15, 0x1E08}, {0x6a, 0x1E0B}, {0x15, 0x1E0A}, {0x6a, 0x1E0D}, {0x15, 0x1E0C}, {0x6a, 0x1E0F}, {0x15, 0x1E0E}, // 1e08 - 1e0f
+ {0x6a, 0x1E11}, {0x15, 0x1E10}, {0x6a, 0x1E13}, {0x15, 0x1E12}, {0x6a, 0x1E15}, {0x15, 0x1E14}, {0x6a, 0x1E17}, {0x15, 0x1E16}, // 1e10 - 1e17
+ {0x6a, 0x1E19}, {0x15, 0x1E18}, {0x6a, 0x1E1B}, {0x15, 0x1E1A}, {0x6a, 0x1E1D}, {0x15, 0x1E1C}, {0x6a, 0x1E1F}, {0x15, 0x1E1E}, // 1e18 - 1e1f
+ {0x6a, 0x1E21}, {0x15, 0x1E20}, {0x6a, 0x1E23}, {0x15, 0x1E22}, {0x6a, 0x1E25}, {0x15, 0x1E24}, {0x6a, 0x1E27}, {0x15, 0x1E26}, // 1e20 - 1e27
+ {0x6a, 0x1E29}, {0x15, 0x1E28}, {0x6a, 0x1E2B}, {0x15, 0x1E2A}, {0x6a, 0x1E2D}, {0x15, 0x1E2C}, {0x6a, 0x1E2F}, {0x15, 0x1E2E}, // 1e28 - 1e2f
+ {0x6a, 0x1E31}, {0x15, 0x1E30}, {0x6a, 0x1E33}, {0x15, 0x1E32}, {0x6a, 0x1E35}, {0x15, 0x1E34}, {0x6a, 0x1E37}, {0x15, 0x1E36}, // 1e30 - 1e37
+ {0x6a, 0x1E39}, {0x15, 0x1E38}, {0x6a, 0x1E3B}, {0x15, 0x1E3A}, {0x6a, 0x1E3D}, {0x15, 0x1E3C}, {0x6a, 0x1E3F}, {0x15, 0x1E3E}, // 1e38 - 1e3f
+ {0x6a, 0x1E41}, {0x15, 0x1E40}, {0x6a, 0x1E43}, {0x15, 0x1E42}, {0x6a, 0x1E45}, {0x15, 0x1E44}, {0x6a, 0x1E47}, {0x15, 0x1E46}, // 1e40 - 1e47
+ {0x6a, 0x1E49}, {0x15, 0x1E48}, {0x6a, 0x1E4B}, {0x15, 0x1E4A}, {0x6a, 0x1E4D}, {0x15, 0x1E4C}, {0x6a, 0x1E4F}, {0x15, 0x1E4E}, // 1e48 - 1e4f
+ {0x6a, 0x1E51}, {0x15, 0x1E50}, {0x6a, 0x1E53}, {0x15, 0x1E52}, {0x6a, 0x1E55}, {0x15, 0x1E54}, {0x6a, 0x1E57}, {0x15, 0x1E56}, // 1e50 - 1e57
+ {0x6a, 0x1E59}, {0x15, 0x1E58}, {0x6a, 0x1E5B}, {0x15, 0x1E5A}, {0x6a, 0x1E5D}, {0x15, 0x1E5C}, {0x6a, 0x1E5F}, {0x15, 0x1E5E}, // 1e58 - 1e5f
+ {0x6a, 0x1E61}, {0x15, 0x1E60}, {0x6a, 0x1E63}, {0x15, 0x1E62}, {0x6a, 0x1E65}, {0x15, 0x1E64}, {0x6a, 0x1E67}, {0x15, 0x1E66}, // 1e60 - 1e67
+ {0x6a, 0x1E69}, {0x15, 0x1E68}, {0x6a, 0x1E6B}, {0x15, 0x1E6A}, {0x6a, 0x1E6D}, {0x15, 0x1E6C}, {0x6a, 0x1E6F}, {0x15, 0x1E6E}, // 1e68 - 1e6f
+ {0x6a, 0x1E71}, {0x15, 0x1E70}, {0x6a, 0x1E73}, {0x15, 0x1E72}, {0x6a, 0x1E75}, {0x15, 0x1E74}, {0x6a, 0x1E77}, {0x15, 0x1E76}, // 1e70 - 1e77
+ {0x6a, 0x1E79}, {0x15, 0x1E78}, {0x6a, 0x1E7B}, {0x15, 0x1E7A}, {0x6a, 0x1E7D}, {0x15, 0x1E7C}, {0x6a, 0x1E7F}, {0x15, 0x1E7E}, // 1e78 - 1e7f
+ {0x6a, 0x1E81}, {0x15, 0x1E80}, {0x6a, 0x1E83}, {0x15, 0x1E82}, {0x6a, 0x1E85}, {0x15, 0x1E84}, {0x6a, 0x1E87}, {0x15, 0x1E86}, // 1e80 - 1e87
+ {0x6a, 0x1E89}, {0x15, 0x1E88}, {0x6a, 0x1E8B}, {0x15, 0x1E8A}, {0x6a, 0x1E8D}, {0x15, 0x1E8C}, {0x6a, 0x1E8F}, {0x15, 0x1E8E}, // 1e88 - 1e8f
+ {0x6a, 0x1E91}, {0x15, 0x1E90}, {0x6a, 0x1E93}, {0x15, 0x1E92}, {0x6a, 0x1E95}, {0x15, 0x1E94}, {0xd5, 0x004F}, {0xd5, 0x0051}, // 1e90 - 1e97
+ {0xd5, 0x0053}, {0xd5, 0x0055}, {0xd5, 0x0057}, {0xf5, 0x0059}, {0x00, 0x0000}, {0x00, 0x0000}, {0xea, 0x015E}, {0x00, 0x0000}, // 1e98 - 1e9f
+ {0x6a, 0x1EA1}, {0x15, 0x1EA0}, {0x6a, 0x1EA3}, {0x15, 0x1EA2}, {0x6a, 0x1EA5}, {0x15, 0x1EA4}, {0x6a, 0x1EA7}, {0x15, 0x1EA6}, // 1ea0 - 1ea7
+ {0x6a, 0x1EA9}, {0x15, 0x1EA8}, {0x6a, 0x1EAB}, {0x15, 0x1EAA}, {0x6a, 0x1EAD}, {0x15, 0x1EAC}, {0x6a, 0x1EAF}, {0x15, 0x1EAE}, // 1ea8 - 1eaf
+ {0x6a, 0x1EB1}, {0x15, 0x1EB0}, {0x6a, 0x1EB3}, {0x15, 0x1EB2}, {0x6a, 0x1EB5}, {0x15, 0x1EB4}, {0x6a, 0x1EB7}, {0x15, 0x1EB6}, // 1eb0 - 1eb7
+ {0x6a, 0x1EB9}, {0x15, 0x1EB8}, {0x6a, 0x1EBB}, {0x15, 0x1EBA}, {0x6a, 0x1EBD}, {0x15, 0x1EBC}, {0x6a, 0x1EBF}, {0x15, 0x1EBE}, // 1eb8 - 1ebf
+ {0x6a, 0x1EC1}, {0x15, 0x1EC0}, {0x6a, 0x1EC3}, {0x15, 0x1EC2}, {0x6a, 0x1EC5}, {0x15, 0x1EC4}, {0x6a, 0x1EC7}, {0x15, 0x1EC6}, // 1ec0 - 1ec7
+ {0x6a, 0x1EC9}, {0x15, 0x1EC8}, {0x6a, 0x1ECB}, {0x15, 0x1ECA}, {0x6a, 0x1ECD}, {0x15, 0x1ECC}, {0x6a, 0x1ECF}, {0x15, 0x1ECE}, // 1ec8 - 1ecf
+ {0x6a, 0x1ED1}, {0x15, 0x1ED0}, {0x6a, 0x1ED3}, {0x15, 0x1ED2}, {0x6a, 0x1ED5}, {0x15, 0x1ED4}, {0x6a, 0x1ED7}, {0x15, 0x1ED6}, // 1ed0 - 1ed7
+ {0x6a, 0x1ED9}, {0x15, 0x1ED8}, {0x6a, 0x1EDB}, {0x15, 0x1EDA}, {0x6a, 0x1EDD}, {0x15, 0x1EDC}, {0x6a, 0x1EDF}, {0x15, 0x1EDE}, // 1ed8 - 1edf
+ {0x6a, 0x1EE1}, {0x15, 0x1EE0}, {0x6a, 0x1EE3}, {0x15, 0x1EE2}, {0x6a, 0x1EE5}, {0x15, 0x1EE4}, {0x6a, 0x1EE7}, {0x15, 0x1EE6}, // 1ee0 - 1ee7
+ {0x6a, 0x1EE9}, {0x15, 0x1EE8}, {0x6a, 0x1EEB}, {0x15, 0x1EEA}, {0x6a, 0x1EED}, {0x15, 0x1EEC}, {0x6a, 0x1EEF}, {0x15, 0x1EEE}, // 1ee8 - 1eef
+ {0x6a, 0x1EF1}, {0x15, 0x1EF0}, {0x6a, 0x1EF3}, {0x15, 0x1EF2}, {0x6a, 0x1EF5}, {0x15, 0x1EF4}, {0x6a, 0x1EF7}, {0x15, 0x1EF6}, // 1ef0 - 1ef7
+ {0x6a, 0x1EF9}, {0x15, 0x1EF8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1ef8 - 1eff
+
+ {0x15, 0x1F08}, {0x15, 0x1F09}, {0x15, 0x1F0A}, {0x15, 0x1F0B}, {0x15, 0x1F0C}, {0x15, 0x1F0D}, {0x15, 0x1F0E}, {0x15, 0x1F0F}, // 1f00 - 1f07
+ {0x6a, 0x1F00}, {0x6a, 0x1F01}, {0x6a, 0x1F02}, {0x6a, 0x1F03}, {0x6a, 0x1F04}, {0x6a, 0x1F05}, {0x6a, 0x1F06}, {0x6a, 0x1F07}, // 1f08 - 1f0f
+ {0x15, 0x1F18}, {0x15, 0x1F19}, {0x15, 0x1F1A}, {0x15, 0x1F1B}, {0x15, 0x1F1C}, {0x15, 0x1F1D}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f10 - 1f17
+ {0x6a, 0x1F10}, {0x6a, 0x1F11}, {0x6a, 0x1F12}, {0x6a, 0x1F13}, {0x6a, 0x1F14}, {0x6a, 0x1F15}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f18 - 1f1f
+ {0x15, 0x1F28}, {0x15, 0x1F29}, {0x15, 0x1F2A}, {0x15, 0x1F2B}, {0x15, 0x1F2C}, {0x15, 0x1F2D}, {0x15, 0x1F2E}, {0x15, 0x1F2F}, // 1f20 - 1f27
+ {0x6a, 0x1F20}, {0x6a, 0x1F21}, {0x6a, 0x1F22}, {0x6a, 0x1F23}, {0x6a, 0x1F24}, {0x6a, 0x1F25}, {0x6a, 0x1F26}, {0x6a, 0x1F27}, // 1f28 - 1f2f
+ {0x15, 0x1F38}, {0x15, 0x1F39}, {0x15, 0x1F3A}, {0x15, 0x1F3B}, {0x15, 0x1F3C}, {0x15, 0x1F3D}, {0x15, 0x1F3E}, {0x15, 0x1F3F}, // 1f30 - 1f37
+ {0x6a, 0x1F30}, {0x6a, 0x1F31}, {0x6a, 0x1F32}, {0x6a, 0x1F33}, {0x6a, 0x1F34}, {0x6a, 0x1F35}, {0x6a, 0x1F36}, {0x6a, 0x1F37}, // 1f38 - 1f3f
+ {0x15, 0x1F48}, {0x15, 0x1F49}, {0x15, 0x1F4A}, {0x15, 0x1F4B}, {0x15, 0x1F4C}, {0x15, 0x1F4D}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f40 - 1f47
+ {0x6a, 0x1F40}, {0x6a, 0x1F41}, {0x6a, 0x1F42}, {0x6a, 0x1F43}, {0x6a, 0x1F44}, {0x6a, 0x1F45}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f48 - 1f4f
+ {0xd5, 0x005B}, {0x15, 0x1F59}, {0xd5, 0x005D}, {0x15, 0x1F5B}, {0xd5, 0x005F}, {0x15, 0x1F5D}, {0xd5, 0x0061}, {0x15, 0x1F5F}, // 1f50 - 1f57
+ {0x00, 0x0000}, {0x6a, 0x1F51}, {0x00, 0x0000}, {0x6a, 0x1F53}, {0x00, 0x0000}, {0x6a, 0x1F55}, {0x00, 0x0000}, {0x6a, 0x1F57}, // 1f58 - 1f5f
+ {0x15, 0x1F68}, {0x15, 0x1F69}, {0x15, 0x1F6A}, {0x15, 0x1F6B}, {0x15, 0x1F6C}, {0x15, 0x1F6D}, {0x15, 0x1F6E}, {0x15, 0x1F6F}, // 1f60 - 1f67
+ {0x6a, 0x1F60}, {0x6a, 0x1F61}, {0x6a, 0x1F62}, {0x6a, 0x1F63}, {0x6a, 0x1F64}, {0x6a, 0x1F65}, {0x6a, 0x1F66}, {0x6a, 0x1F67}, // 1f68 - 1f6f
+ {0x15, 0x1FBA}, {0x15, 0x1FBB}, {0x15, 0x1FC8}, {0x15, 0x1FC9}, {0x15, 0x1FCA}, {0x15, 0x1FCB}, {0x15, 0x1FDA}, {0x15, 0x1FDB}, // 1f70 - 1f77
+ {0x15, 0x1FF8}, {0x15, 0x1FF9}, {0x15, 0x1FEA}, {0x15, 0x1FEB}, {0x15, 0x1FFA}, {0x15, 0x1FFB}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f78 - 1f7f
+ {0xd5, 0x0063}, {0xd5, 0x0066}, {0xd5, 0x0069}, {0xd5, 0x006C}, {0xd5, 0x006F}, {0xd5, 0x0072}, {0xd5, 0x0075}, {0xd5, 0x0078}, // 1f80 - 1f87
+ {0xec, 0x007B}, {0xec, 0x007E}, {0xec, 0x0081}, {0xec, 0x0084}, {0xec, 0x0087}, {0xec, 0x008A}, {0xec, 0x008D}, {0xec, 0x0090}, // 1f88 - 1f8f
+ {0xd5, 0x0093}, {0xd5, 0x0096}, {0xd5, 0x0099}, {0xd5, 0x009C}, {0xd5, 0x009F}, {0xd5, 0x00A2}, {0xd5, 0x00A5}, {0xd5, 0x00A8}, // 1f90 - 1f97
+ {0xec, 0x00AB}, {0xec, 0x00AE}, {0xec, 0x00B1}, {0xec, 0x00B4}, {0xec, 0x00B7}, {0xec, 0x00BA}, {0xec, 0x00BD}, {0xec, 0x00C0}, // 1f98 - 1f9f
+ {0xd5, 0x00C3}, {0xd5, 0x00C6}, {0xd5, 0x00C9}, {0xd5, 0x00CC}, {0xd5, 0x00CF}, {0xd5, 0x00D2}, {0xd5, 0x00D5}, {0xd5, 0x00D8}, // 1fa0 - 1fa7
+ {0xec, 0x00DB}, {0xec, 0x00DE}, {0xec, 0x00E1}, {0xec, 0x00E4}, {0xec, 0x00E7}, {0xec, 0x00EA}, {0xec, 0x00ED}, {0xec, 0x00F0}, // 1fa8 - 1faf
+ {0x15, 0x1FB8}, {0x15, 0x1FB9}, {0xd5, 0x00F3}, {0xd5, 0x00F6}, {0xd5, 0x00F9}, {0x00, 0x0000}, {0xd5, 0x00FC}, {0xd5, 0x00FE}, // 1fb0 - 1fb7
+ {0x6a, 0x1FB0}, {0x6a, 0x1FB1}, {0x6a, 0x1F70}, {0x6a, 0x1F71}, {0xec, 0x0101}, {0x00, 0x0000}, {0xf5, 0x0104}, {0x00, 0x0000}, // 1fb8 - 1fbf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x0106}, {0xd5, 0x0109}, {0xd5, 0x010C}, {0x00, 0x0000}, {0xd5, 0x010F}, {0xd5, 0x0111}, // 1fc0 - 1fc7
+ {0x6a, 0x1F72}, {0x6a, 0x1F73}, {0x6a, 0x1F74}, {0x6a, 0x1F75}, {0xec, 0x0114}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fc8 - 1fcf
+ {0x15, 0x1FD8}, {0x15, 0x1FD9}, {0xd5, 0x0117}, {0xd5, 0x0119}, {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x011B}, {0xd5, 0x011D}, // 1fd0 - 1fd7
+ {0x6a, 0x1FD0}, {0x6a, 0x1FD1}, {0x6a, 0x1F76}, {0x6a, 0x1F77}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fd8 - 1fdf
+ {0x15, 0x1FE8}, {0x15, 0x1FE9}, {0xd5, 0x011F}, {0xd5, 0x0121}, {0xd5, 0x0123}, {0x15, 0x1FEC}, {0xd5, 0x0125}, {0xd5, 0x0127}, // 1fe0 - 1fe7
+ {0x6a, 0x1FE0}, {0x6a, 0x1FE1}, {0x6a, 0x1F7A}, {0x6a, 0x1F7B}, {0x6a, 0x1FE5}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fe8 - 1fef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x0129}, {0xd5, 0x012C}, {0xd5, 0x012F}, {0x00, 0x0000}, {0xd5, 0x0132}, {0xd5, 0x0134}, // 1ff0 - 1ff7
+ {0x6a, 0x1F78}, {0x6a, 0x1F79}, {0x6a, 0x1F7C}, {0x6a, 0x1F7D}, {0xec, 0x0137}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1ff8 - 1fff
+
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2100 - 2107
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2108 - 210f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2110 - 2117
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2118 - 211f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03C9}, {0x00, 0x0000}, // 2120 - 2127
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x006B}, {0x6a, 0x00E5}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2128 - 212f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2130 - 2137
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2138 - 213f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2140 - 2147
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2148 - 214f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2150 - 2157
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2158 - 215f
+ {0x68, 0x2170}, {0x68, 0x2171}, {0x68, 0x2172}, {0x68, 0x2173}, {0x68, 0x2174}, {0x68, 0x2175}, {0x68, 0x2176}, {0x68, 0x2177}, // 2160 - 2167
+ {0x68, 0x2178}, {0x68, 0x2179}, {0x68, 0x217A}, {0x68, 0x217B}, {0x68, 0x217C}, {0x68, 0x217D}, {0x68, 0x217E}, {0x68, 0x217F}, // 2168 - 216f
+ {0x14, 0x2160}, {0x14, 0x2161}, {0x14, 0x2162}, {0x14, 0x2163}, {0x14, 0x2164}, {0x14, 0x2165}, {0x14, 0x2166}, {0x14, 0x2167}, // 2170 - 2177
+ {0x14, 0x2168}, {0x14, 0x2169}, {0x14, 0x216A}, {0x14, 0x216B}, {0x14, 0x216C}, {0x14, 0x216D}, {0x14, 0x216E}, {0x14, 0x216F}, // 2178 - 217f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2180 - 2187
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2188 - 218f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2190 - 2197
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2198 - 219f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21a0 - 21a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21a8 - 21af
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21b0 - 21b7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21b8 - 21bf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21c0 - 21c7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21c8 - 21cf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21d0 - 21d7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21d8 - 21df
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21e0 - 21e7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21e8 - 21ef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21f0 - 21f7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21f8 - 21ff
+
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2400 - 2407
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2408 - 240f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2410 - 2417
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2418 - 241f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2420 - 2427
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2428 - 242f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2430 - 2437
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2438 - 243f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2440 - 2447
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2448 - 244f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2450 - 2457
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2458 - 245f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2460 - 2467
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2468 - 246f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2470 - 2477
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2478 - 247f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2480 - 2487
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2488 - 248f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2490 - 2497
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2498 - 249f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24a0 - 24a7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24a8 - 24af
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x68, 0x24D0}, {0x68, 0x24D1}, // 24b0 - 24b7
+ {0x68, 0x24D2}, {0x68, 0x24D3}, {0x68, 0x24D4}, {0x68, 0x24D5}, {0x68, 0x24D6}, {0x68, 0x24D7}, {0x68, 0x24D8}, {0x68, 0x24D9}, // 24b8 - 24bf
+ {0x68, 0x24DA}, {0x68, 0x24DB}, {0x68, 0x24DC}, {0x68, 0x24DD}, {0x68, 0x24DE}, {0x68, 0x24DF}, {0x68, 0x24E0}, {0x68, 0x24E1}, // 24c0 - 24c7
+ {0x68, 0x24E2}, {0x68, 0x24E3}, {0x68, 0x24E4}, {0x68, 0x24E5}, {0x68, 0x24E6}, {0x68, 0x24E7}, {0x68, 0x24E8}, {0x68, 0x24E9}, // 24c8 - 24cf
+ {0x14, 0x24B6}, {0x14, 0x24B7}, {0x14, 0x24B8}, {0x14, 0x24B9}, {0x14, 0x24BA}, {0x14, 0x24BB}, {0x14, 0x24BC}, {0x14, 0x24BD}, // 24d0 - 24d7
+ {0x14, 0x24BE}, {0x14, 0x24BF}, {0x14, 0x24C0}, {0x14, 0x24C1}, {0x14, 0x24C2}, {0x14, 0x24C3}, {0x14, 0x24C4}, {0x14, 0x24C5}, // 24d8 - 24df
+ {0x14, 0x24C6}, {0x14, 0x24C7}, {0x14, 0x24C8}, {0x14, 0x24C9}, {0x14, 0x24CA}, {0x14, 0x24CB}, {0x14, 0x24CC}, {0x14, 0x24CD}, // 24e0 - 24e7
+ {0x14, 0x24CE}, {0x14, 0x24CF}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24e8 - 24ef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24f0 - 24f7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24f8 - 24ff
+
+ {0x6a, 0x2C30}, {0x6a, 0x2C31}, {0x6a, 0x2C32}, {0x6a, 0x2C33}, {0x6a, 0x2C34}, {0x6a, 0x2C35}, {0x6a, 0x2C36}, {0x6a, 0x2C37}, // 2c00 - 2c07, Glagolitic
+ {0x6a, 0x2C38}, {0x6a, 0x2C39}, {0x6a, 0x2C3A}, {0x6a, 0x2C3B}, {0x6a, 0x2C3C}, {0x6a, 0x2C3D}, {0x6a, 0x2C3E}, {0x6a, 0x2C3F}, // 2c08 - 2c0f
+ {0x6a, 0x2C40}, {0x6a, 0x2C41}, {0x6a, 0x2C42}, {0x6a, 0x2C43}, {0x6a, 0x2C44}, {0x6a, 0x2C45}, {0x6a, 0x2C46}, {0x6a, 0x2C47}, // 2c10 - 2c17
+ {0x6a, 0x2C48}, {0x6a, 0x2C49}, {0x6a, 0x2C4A}, {0x6a, 0x2C4B}, {0x6a, 0x2C4C}, {0x6a, 0x2C4D}, {0x6a, 0x2C4E}, {0x6a, 0x2C4F}, // 2c18 - 2c1f
+ {0x6a, 0x2C50}, {0x6a, 0x2C51}, {0x6a, 0x2C52}, {0x6a, 0x2C53}, {0x6a, 0x2C54}, {0x6a, 0x2C55}, {0x6a, 0x2C56}, {0x6a, 0x2C57}, // 2c20 - 2c27
+ {0x6a, 0x2C58}, {0x6a, 0x2C59}, {0x6a, 0x2C5A}, {0x6a, 0x2C5B}, {0x6a, 0x2C5C}, {0x6a, 0x2C5D}, {0x6a, 0x2C5E}, {0x00, 0x0000}, // 2c28 - 2c2f
+ {0x15, 0x2C00}, {0x15, 0x2C01}, {0x15, 0x2C02}, {0x15, 0x2C03}, {0x15, 0x2C04}, {0x15, 0x2C05}, {0x15, 0x2C06}, {0x15, 0x2C07}, // 2c30 - 2c37
+ {0x15, 0x2C08}, {0x15, 0x2C09}, {0x15, 0x2C0A}, {0x15, 0x2C0B}, {0x15, 0x2C0C}, {0x15, 0x2C0D}, {0x15, 0x2C0E}, {0x15, 0x2C0F}, // 2c38 - 2c3f
+ {0x15, 0x2C10}, {0x15, 0x2C11}, {0x15, 0x2C12}, {0x15, 0x2C13}, {0x15, 0x2C14}, {0x15, 0x2C15}, {0x15, 0x2C16}, {0x15, 0x2C17}, // 2c40 - 2c47
+ {0x15, 0x2C18}, {0x15, 0x2C19}, {0x15, 0x2C1A}, {0x15, 0x2C1B}, {0x15, 0x2C1C}, {0x15, 0x2C1D}, {0x15, 0x2C1E}, {0x15, 0x2C1F}, // 2c48 - 2c4f
+ {0x15, 0x2C20}, {0x15, 0x2C21}, {0x15, 0x2C22}, {0x15, 0x2C23}, {0x15, 0x2C24}, {0x15, 0x2C25}, {0x15, 0x2C26}, {0x15, 0x2C27}, // 2c50 - 2c57
+ {0x15, 0x2C28}, {0x15, 0x2C29}, {0x15, 0x2C2A}, {0x15, 0x2C2B}, {0x15, 0x2C2C}, {0x15, 0x2C2D}, {0x15, 0x2C2E}, {0x00, 0x0000}, // 2c58 - 2c5f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c60 - 2c67
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c68 - 2c6f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c70 - 2c77
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c78 - 2c7f
+ {0x6a, 0x2c81}, {0x15, 0x2c80}, {0x6a, 0x2c83}, {0x15, 0x2c82}, {0x6a, 0x2c85}, {0x15, 0x2c84}, {0x6a, 0x2c87}, {0x15, 0x2c86}, // 2c80 - 2c87, Coptic
+ {0x6a, 0x2c89}, {0x15, 0x2c88}, {0x6a, 0x2c8b}, {0x15, 0x2c8a}, {0x6a, 0x2c8d}, {0x15, 0x2c8c}, {0x6a, 0x2c8f}, {0x15, 0x2c8e}, // 2c88 - 2c8f
+ {0x6a, 0x2c91}, {0x15, 0x2c90}, {0x6a, 0x2c93}, {0x15, 0x2c92}, {0x6a, 0x2c95}, {0x15, 0x2c94}, {0x6a, 0x2c97}, {0x15, 0x2c96}, // 2c90 - 2c97
+ {0x6a, 0x2c99}, {0x15, 0x2c98}, {0x6a, 0x2c9b}, {0x15, 0x2c9a}, {0x6a, 0x2c9d}, {0x15, 0x2c9c}, {0x6a, 0x2c9f}, {0x15, 0x2c9e}, // 2c98 - 2c9f
+ {0x6a, 0x2ca1}, {0x15, 0x2ca0}, {0x6a, 0x2ca3}, {0x15, 0x2ca2}, {0x6a, 0x2ca5}, {0x15, 0x2ca4}, {0x6a, 0x2ca7}, {0x15, 0x2ca6}, // 2ca0 - 2ca7
+ {0x6a, 0x2ca9}, {0x15, 0x2ca8}, {0x6a, 0x2cab}, {0x15, 0x2caa}, {0x6a, 0x2cad}, {0x15, 0x2cac}, {0x6a, 0x2caf}, {0x15, 0x2cae}, // 2ca8 - 2caf
+ {0x6a, 0x2cb1}, {0x15, 0x2cb0}, {0x6a, 0x2cb3}, {0x15, 0x2cb2}, {0x6a, 0x2cb5}, {0x15, 0x2cb4}, {0x6a, 0x2cb7}, {0x15, 0x2cb6}, // 2cb0 - 2cb7
+ {0x6a, 0x2cb9}, {0x15, 0x2cb8}, {0x6a, 0x2cbb}, {0x15, 0x2cba}, {0x6a, 0x2cbd}, {0x15, 0x2cbc}, {0x6a, 0x2cbf}, {0x15, 0x2cbe}, // 2cb8 - 2cbf
+ {0x6a, 0x2cc1}, {0x15, 0x2cc0}, {0x6a, 0x2cc3}, {0x15, 0x2cc2}, {0x6a, 0x2cc5}, {0x15, 0x2cc4}, {0x6a, 0x2cc7}, {0x15, 0x2cc6}, // 2cc0 - 2cc7
+ {0x6a, 0x2cc9}, {0x15, 0x2cc8}, {0x6a, 0x2ccb}, {0x15, 0x2cca}, {0x6a, 0x2ccd}, {0x15, 0x2ccc}, {0x6a, 0x2ccf}, {0x15, 0x2cce}, // 2cc8 - 2ccf
+ {0x6a, 0x2cd1}, {0x15, 0x2cd0}, {0x6a, 0x2cd3}, {0x15, 0x2cd2}, {0x6a, 0x2cd5}, {0x15, 0x2cd4}, {0x6a, 0x2cd7}, {0x15, 0x2cd6}, // 2cd0 - 2cd7
+ {0x6a, 0x2cd9}, {0x15, 0x2cd8}, {0x6a, 0x2cdb}, {0x15, 0x2cda}, {0x6a, 0x2cdd}, {0x15, 0x2cdc}, {0x6a, 0x2cdf}, {0x15, 0x2cde}, // 2cd8 - 2cdf
+ {0x6a, 0x2ce1}, {0x15, 0x2ce0}, {0x6a, 0x2ce3}, {0x15, 0x2ce2}, {0x6a, 0x2ce5}, {0x15, 0x2ce4}, {0x6a, 0x2ce7}, {0x15, 0x2ce6}, // 2ce0 - 2ce7
+ {0x6a, 0x2ce9}, {0x15, 0x2ce8}, {0x6a, 0x2ceb}, {0x15, 0x2cea}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2ce8 - 2cef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2cf0 - 2cf7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2cf8 - 2cff
+
+ {0xd5, 0x013A}, {0xd5, 0x013D}, {0xd5, 0x0140}, {0xd5, 0x0143}, {0xd5, 0x0146}, {0xd5, 0x0149}, {0xd5, 0x014C}, {0x00, 0x0000}, // fb00 - fb07
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb08 - fb0f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x014F}, {0xd5, 0x0152}, {0xd5, 0x0155}, {0xd5, 0x0158}, {0xd5, 0x015B}, // fb10 - fb17
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb18 - fb1f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb20 - fb27
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb28 - fb2f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb30 - fb37
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb38 - fb3f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb40 - fb47
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb48 - fb4f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb50 - fb57
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb58 - fb5f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb60 - fb67
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb68 - fb6f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb70 - fb77
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb78 - fb7f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb80 - fb87
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb88 - fb8f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb90 - fb97
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb98 - fb9f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fba0 - fba7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fba8 - fbaf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbb0 - fbb7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbb8 - fbbf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbc0 - fbc7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbc8 - fbcf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbd0 - fbd7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbd8 - fbdf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbe0 - fbe7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbe8 - fbef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbf0 - fbf7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbf8 - fbff
+
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff00 - ff07
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff08 - ff0f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff10 - ff17
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff18 - ff1f
+ {0x00, 0x0000}, {0x6a, 0xFF41}, {0x6a, 0xFF42}, {0x6a, 0xFF43}, {0x6a, 0xFF44}, {0x6a, 0xFF45}, {0x6a, 0xFF46}, {0x6a, 0xFF47}, // ff20 - ff27
+ {0x6a, 0xFF48}, {0x6a, 0xFF49}, {0x6a, 0xFF4A}, {0x6a, 0xFF4B}, {0x6a, 0xFF4C}, {0x6a, 0xFF4D}, {0x6a, 0xFF4E}, {0x6a, 0xFF4F}, // ff28 - ff2f
+ {0x6a, 0xFF50}, {0x6a, 0xFF51}, {0x6a, 0xFF52}, {0x6a, 0xFF53}, {0x6a, 0xFF54}, {0x6a, 0xFF55}, {0x6a, 0xFF56}, {0x6a, 0xFF57}, // ff30 - ff37
+ {0x6a, 0xFF58}, {0x6a, 0xFF59}, {0x6a, 0xFF5A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff38 - ff3f
+ {0x00, 0x0000}, {0x15, 0xFF21}, {0x15, 0xFF22}, {0x15, 0xFF23}, {0x15, 0xFF24}, {0x15, 0xFF25}, {0x15, 0xFF26}, {0x15, 0xFF27}, // ff40 - ff47
+ {0x15, 0xFF28}, {0x15, 0xFF29}, {0x15, 0xFF2A}, {0x15, 0xFF2B}, {0x15, 0xFF2C}, {0x15, 0xFF2D}, {0x15, 0xFF2E}, {0x15, 0xFF2F}, // ff48 - ff4f
+ {0x15, 0xFF30}, {0x15, 0xFF31}, {0x15, 0xFF32}, {0x15, 0xFF33}, {0x15, 0xFF34}, {0x15, 0xFF35}, {0x15, 0xFF36}, {0x15, 0xFF37}, // ff50 - ff57
+ {0x15, 0xFF38}, {0x15, 0xFF39}, {0x15, 0xFF3A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff58 - ff5f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff60 - ff67
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff68 - ff6f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff70 - ff77
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff78 - ff7f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff80 - ff87
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff88 - ff8f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff90 - ff97
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff98 - ff9f
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffa0 - ffa7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffa8 - ffaf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffb0 - ffb7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffb8 - ffbf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffc0 - ffc7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffc8 - ffcf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffd0 - ffd7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffd8 - ffdf
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffe0 - ffe7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffe8 - ffef
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff0 - fff7
+ {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff8 - ffff
+};
+
+
+#define MaxCaseMappingExtras 3
+
+Mapping const CaseMappingExtra[] = {
+ {0x80, 0, {0x0000, 0x0000, 0x0000}}, // 0x0000 (0 0x0000)
+ {0x60, 1, {0x0131, 0x0000, 0x0000}}, // 0x0049 (1 0x0001)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0049 (2 0x0002)
+ {0x60, 1, {0x006A, 0x0000, 0x0000}}, // 0x004a (3 0x0003)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x004a (4 0x0004)
+ {0x15, 1, {0x039C, 0x0000, 0x0000}}, // 0x00b5 (5 0x0005)
+ {0x60, 1, {0x03BC, 0x0000, 0x0000}}, // 0x00b5 (6 0x0006)
+ {0x60, 1, {0x00EC, 0x0000, 0x0000}}, // 0x00cc (7 0x0007)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x00cc (8 0x0008)
+ {0x60, 1, {0x00ED, 0x0000, 0x0000}}, // 0x00cd (9 0x0009)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x00cd (10 0x000A)
+ {0x15, 1, {0x1E9E, 0x0000, 0x0000}}, // 0x00df (11 0x000B)
+ {0x40, 2, {0x0073, 0x0073, 0x0000}}, // 0x00df (12 0x000C)
+ {0x20, 1, {0x00DF, 0x0000, 0x0000}}, // 0x00df (13 0x000D) not hit, CaseMappingValue.type is 0xd5=0x80+0x55 not 0xf5=0x80+0x75, but keep slot
+ {0x60, 1, {0x0129, 0x0000, 0x0000}}, // 0x0128 (14 0x000E)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0128 (15 0x000F)
+ {0x60, 1, {0x012F, 0x0000, 0x0000}}, // 0x012e (16 0x0010)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x012e (17 0x0011)
+ {0x60, 1, {0x0069, 0x0000, 0x0000}}, // 0x0130 (18 0x0012)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0130 (19 0x0013)
+ {0x15, 2, {0x02BC, 0x004E, 0x0000}}, // 0x0149 (20 0x0014)
+ {0x40, 2, {0x02BC, 0x006E, 0x0000}}, // 0x0149 (21 0x0015)
+ {0x15, 1, {0x0053, 0x0000, 0x0000}}, // 0x017f (22 0x0016)
+ {0x60, 1, {0x0073, 0x0000, 0x0000}}, // 0x017f (23 0x0017)
+ {0x6a, 1, {0x01C6, 0x0000, 0x0000}}, // 0x01c4 (24 0x0018)
+ {0x10, 1, {0x01C5, 0x0000, 0x0000}}, // 0x01c4 (25 0x0019)
+ {0x68, 1, {0x01C6, 0x0000, 0x0000}}, // 0x01c5 (26 0x001A)
+ {0x04, 1, {0x01C4, 0x0000, 0x0000}}, // 0x01c5 (27 0x001B)
+ {0x05, 1, {0x01C4, 0x0000, 0x0000}}, // 0x01c6 (28 0x001C)
+ {0x10, 1, {0x01C5, 0x0000, 0x0000}}, // 0x01c6 (29 0x001D)
+ {0x6a, 1, {0x01C9, 0x0000, 0x0000}}, // 0x01c7 (30 0x001E)
+ {0x10, 1, {0x01C8, 0x0000, 0x0000}}, // 0x01c7 (31 0x001F)
+ {0x68, 1, {0x01C9, 0x0000, 0x0000}}, // 0x01c8 (32 0x0020)
+ {0x04, 1, {0x01C7, 0x0000, 0x0000}}, // 0x01c8 (33 0x0021)
+ {0x05, 1, {0x01C7, 0x0000, 0x0000}}, // 0x01c9 (34 0x0022)
+ {0x10, 1, {0x01C8, 0x0000, 0x0000}}, // 0x01c9 (35 0x0023)
+ {0x6a, 1, {0x01CC, 0x0000, 0x0000}}, // 0x01ca (36 0x0024)
+ {0x10, 1, {0x01CB, 0x0000, 0x0000}}, // 0x01ca (37 0x0025)
+ {0x68, 1, {0x01CC, 0x0000, 0x0000}}, // 0x01cb (38 0x0026)
+ {0x04, 1, {0x01CA, 0x0000, 0x0000}}, // 0x01cb (39 0x0027)
+ {0x05, 1, {0x01CA, 0x0000, 0x0000}}, // 0x01cc (40 0x0028)
+ {0x10, 1, {0x01CB, 0x0000, 0x0000}}, // 0x01cc (41 0x0029)
+ {0x15, 2, {0x004A, 0x030C, 0x0000}}, // 0x01f0 (42 0x002A)
+ {0x40, 2, {0x006A, 0x030C, 0x0000}}, // 0x01f0 (43 0x002B)
+ {0x6a, 1, {0x01F3, 0x0000, 0x0000}}, // 0x01f1 (44 0x002C)
+ {0x10, 1, {0x01F2, 0x0000, 0x0000}}, // 0x01f1 (45 0x002D)
+ {0x68, 1, {0x01F3, 0x0000, 0x0000}}, // 0x01f2 (46 0x002E)
+ {0x04, 1, {0x01F1, 0x0000, 0x0000}}, // 0x01f2 (47 0x002F)
+ {0x05, 1, {0x01F1, 0x0000, 0x0000}}, // 0x01f3 (48 0x0030)
+ {0x10, 1, {0x01F2, 0x0000, 0x0000}}, // 0x01f3 (49 0x0031)
+ {0x14, 1, {0x0399, 0x0000, 0x0000}}, // 0x0345 (50 0x0032)
+ {0x60, 1, {0x03B9, 0x0000, 0x0000}}, // 0x0345 (51 0x0033)
+ {0x15, 3, {0x0399, 0x0308, 0x0301}}, // 0x0390 (52 0x0034)
+ {0x40, 3, {0x03B9, 0x0308, 0x0301}}, // 0x0390 (53 0x0035)
+ {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03a3 (54 0x0036)
+ {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x03a3 (55 0x0037)
+ {0x15, 3, {0x03A5, 0x0308, 0x0301}}, // 0x03b0 (56 0x0038)
+ {0x40, 3, {0x03C5, 0x0308, 0x0301}}, // 0x03b0 (57 0x0039)
+ {0x15, 1, {0x03A3, 0x0000, 0x0000}}, // 0x03c2 (58 0x003A)
+ {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03c2 (59 0x003B)
+ {0x15, 1, {0x0392, 0x0000, 0x0000}}, // 0x03d0 (60 0x003C)
+ {0x60, 1, {0x03B2, 0x0000, 0x0000}}, // 0x03d0 (61 0x003D)
+ {0x15, 1, {0x0398, 0x0000, 0x0000}}, // 0x03d1 (62 0x003E)
+ {0x60, 1, {0x03B8, 0x0000, 0x0000}}, // 0x03d1 (63 0x003F)
+ {0x15, 1, {0x03A6, 0x0000, 0x0000}}, // 0x03d5 (64 0x0040)
+ {0x60, 1, {0x03C6, 0x0000, 0x0000}}, // 0x03d5 (65 0x0041)
+ {0x15, 1, {0x03A0, 0x0000, 0x0000}}, // 0x03d6 (66 0x0042)
+ {0x60, 1, {0x03C0, 0x0000, 0x0000}}, // 0x03d6 (67 0x0043)
+ {0x15, 1, {0x039A, 0x0000, 0x0000}}, // 0x03f0 (68 0x0044)
+ {0x60, 1, {0x03BA, 0x0000, 0x0000}}, // 0x03f0 (69 0x0045)
+ {0x15, 1, {0x03A1, 0x0000, 0x0000}}, // 0x03f1 (70 0x0046)
+ {0x60, 1, {0x03C1, 0x0000, 0x0000}}, // 0x03f1 (71 0x0047)
+ {0x15, 1, {0x03A3, 0x0000, 0x0000}}, // 0x03f2 (72 0x0048) -- not hit, but keep slot (tdf#97152)
+ {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03f2 (73 0x0049) -- not hit, but keep slot (tdf#97152)
+ {0x15, 1, {0x0395, 0x0000, 0x0000}}, // 0x03f5 (74 0x004A)
+ {0x60, 1, {0x03B5, 0x0000, 0x0000}}, // 0x03f5 (75 0x004B)
+ {0x05, 2, {0x0535, 0x0552, 0x0000}}, // 0x0587 (76 0x004C)
+ {0x10, 2, {0x0535, 0x0582, 0x0000}}, // 0x0587 (77 0x004D)
+ {0x40, 2, {0x0565, 0x0582, 0x0000}}, // 0x0587 (78 0x004E)
+ {0x15, 2, {0x0048, 0x0331, 0x0000}}, // 0x1e96 (79 0x004F)
+ {0x40, 2, {0x0068, 0x0331, 0x0000}}, // 0x1e96 (80 0x0050)
+ {0x15, 2, {0x0054, 0x0308, 0x0000}}, // 0x1e97 (81 0x0051)
+ {0x40, 2, {0x0074, 0x0308, 0x0000}}, // 0x1e97 (82 0x0052)
+ {0x15, 2, {0x0057, 0x030A, 0x0000}}, // 0x1e98 (83 0x0053)
+ {0x40, 2, {0x0077, 0x030A, 0x0000}}, // 0x1e98 (84 0x0054)
+ {0x15, 2, {0x0059, 0x030A, 0x0000}}, // 0x1e99 (85 0x0055)
+ {0x40, 2, {0x0079, 0x030A, 0x0000}}, // 0x1e99 (86 0x0056)
+ {0x15, 2, {0x0041, 0x02BE, 0x0000}}, // 0x1e9a (87 0x0057)
+ {0x40, 2, {0x0061, 0x02BE, 0x0000}}, // 0x1e9a (88 0x0058)
+ {0x15, 1, {0x1E60, 0x0000, 0x0000}}, // 0x1e9b (89 0x0059)
+ {0x60, 1, {0x1E61, 0x0000, 0x0000}}, // 0x1e9b (90 0x005A)
+ {0x15, 2, {0x03A5, 0x0313, 0x0000}}, // 0x1f50 (91 0x005B)
+ {0x40, 2, {0x03C5, 0x0313, 0x0000}}, // 0x1f50 (92 0x005C)
+ {0x15, 3, {0x03A5, 0x0313, 0x0300}}, // 0x1f52 (93 0x005D)
+ {0x40, 3, {0x03C5, 0x0313, 0x0300}}, // 0x1f52 (94 0x005E)
+ {0x15, 3, {0x03A5, 0x0313, 0x0301}}, // 0x1f54 (95 0x005F)
+ {0x40, 3, {0x03C5, 0x0313, 0x0301}}, // 0x1f54 (96 0x0060)
+ {0x15, 3, {0x03A5, 0x0313, 0x0342}}, // 0x1f56 (97 0x0061)
+ {0x40, 3, {0x03C5, 0x0313, 0x0342}}, // 0x1f56 (98 0x0062)
+ {0x05, 2, {0x1F08, 0x0399, 0x0000}}, // 0x1f80 (99 0x0063)
+ {0x10, 1, {0x1F88, 0x0000, 0x0000}}, // 0x1f80 (100 0x0064)
+ {0x40, 2, {0x1F00, 0x03B9, 0x0000}}, // 0x1f80 (101 0x0065)
+ {0x05, 2, {0x1F09, 0x0399, 0x0000}}, // 0x1f81 (102 0x0066)
+ {0x10, 1, {0x1F89, 0x0000, 0x0000}}, // 0x1f81 (103 0x0067)
+ {0x40, 2, {0x1F01, 0x03B9, 0x0000}}, // 0x1f81 (104 0x0068)
+ {0x05, 2, {0x1F0A, 0x0399, 0x0000}}, // 0x1f82 (105 0x0069)
+ {0x10, 1, {0x1F8A, 0x0000, 0x0000}}, // 0x1f82 (106 0x006A)
+ {0x40, 2, {0x1F02, 0x03B9, 0x0000}}, // 0x1f82 (107 0x006B)
+ {0x05, 2, {0x1F0B, 0x0399, 0x0000}}, // 0x1f83 (108 0x006C)
+ {0x10, 1, {0x1F8B, 0x0000, 0x0000}}, // 0x1f83 (109 0x006D)
+ {0x40, 2, {0x1F03, 0x03B9, 0x0000}}, // 0x1f83 (110 0x006E)
+ {0x05, 2, {0x1F0C, 0x0399, 0x0000}}, // 0x1f84 (111 0x006F)
+ {0x10, 1, {0x1F8C, 0x0000, 0x0000}}, // 0x1f84 (112 0x0070)
+ {0x40, 2, {0x1F04, 0x03B9, 0x0000}}, // 0x1f84 (113 0x0071)
+ {0x05, 2, {0x1F0D, 0x0399, 0x0000}}, // 0x1f85 (114 0x0072)
+ {0x10, 1, {0x1F8D, 0x0000, 0x0000}}, // 0x1f85 (115 0x0073)
+ {0x40, 2, {0x1F05, 0x03B9, 0x0000}}, // 0x1f85 (116 0x0074)
+ {0x05, 2, {0x1F0E, 0x0399, 0x0000}}, // 0x1f86 (117 0x0075)
+ {0x10, 1, {0x1F8E, 0x0000, 0x0000}}, // 0x1f86 (118 0x0076)
+ {0x40, 2, {0x1F06, 0x03B9, 0x0000}}, // 0x1f86 (119 0x0077)
+ {0x05, 2, {0x1F0F, 0x0399, 0x0000}}, // 0x1f87 (120 0x0078)
+ {0x10, 1, {0x1F8F, 0x0000, 0x0000}}, // 0x1f87 (121 0x0079)
+ {0x40, 2, {0x1F07, 0x03B9, 0x0000}}, // 0x1f87 (122 0x007A)
+ {0x28, 1, {0x1F80, 0x0000, 0x0000}}, // 0x1f88 (123 0x007B)
+ {0x04, 2, {0x1F08, 0x0399, 0x0000}}, // 0x1f88 (124 0x007C)
+ {0x40, 2, {0x1F00, 0x03B9, 0x0000}}, // 0x1f88 (125 0x007D)
+ {0x28, 1, {0x1F81, 0x0000, 0x0000}}, // 0x1f89 (126 0x007E)
+ {0x04, 2, {0x1F09, 0x0399, 0x0000}}, // 0x1f89 (127 0x007F)
+ {0x40, 2, {0x1F01, 0x03B9, 0x0000}}, // 0x1f89 (128 0x0080)
+ {0x28, 1, {0x1F82, 0x0000, 0x0000}}, // 0x1f8a (129 0x0081)
+ {0x04, 2, {0x1F0A, 0x0399, 0x0000}}, // 0x1f8a (130 0x0082)
+ {0x40, 2, {0x1F02, 0x03B9, 0x0000}}, // 0x1f8a (131 0x0083)
+ {0x28, 1, {0x1F83, 0x0000, 0x0000}}, // 0x1f8b (132 0x0084)
+ {0x04, 2, {0x1F0B, 0x0399, 0x0000}}, // 0x1f8b (133 0x0085)
+ {0x40, 2, {0x1F03, 0x03B9, 0x0000}}, // 0x1f8b (134 0x0086)
+ {0x28, 1, {0x1F84, 0x0000, 0x0000}}, // 0x1f8c (135 0x0087)
+ {0x04, 2, {0x1F0C, 0x0399, 0x0000}}, // 0x1f8c (136 0x0088)
+ {0x40, 2, {0x1F04, 0x03B9, 0x0000}}, // 0x1f8c (137 0x0089)
+ {0x28, 1, {0x1F85, 0x0000, 0x0000}}, // 0x1f8d (138 0x008A)
+ {0x04, 2, {0x1F0D, 0x0399, 0x0000}}, // 0x1f8d (139 0x008B)
+ {0x40, 2, {0x1F05, 0x03B9, 0x0000}}, // 0x1f8d (140 0x008C)
+ {0x28, 1, {0x1F86, 0x0000, 0x0000}}, // 0x1f8e (141 0x008D)
+ {0x04, 2, {0x1F0E, 0x0399, 0x0000}}, // 0x1f8e (142 0x008E)
+ {0x40, 2, {0x1F06, 0x03B9, 0x0000}}, // 0x1f8e (143 0x008F)
+ {0x28, 1, {0x1F87, 0x0000, 0x0000}}, // 0x1f8f (144 0x0090)
+ {0x04, 2, {0x1F0F, 0x0399, 0x0000}}, // 0x1f8f (145 0x0091)
+ {0x40, 2, {0x1F07, 0x03B9, 0x0000}}, // 0x1f8f (146 0x0092)
+ {0x05, 2, {0x1F28, 0x0399, 0x0000}}, // 0x1f90 (147 0x0093)
+ {0x10, 1, {0x1F98, 0x0000, 0x0000}}, // 0x1f90 (148 0x0094)
+ {0x40, 2, {0x1F20, 0x03B9, 0x0000}}, // 0x1f90 (149 0x0095)
+ {0x05, 2, {0x1F29, 0x0399, 0x0000}}, // 0x1f91 (150 0x0096)
+ {0x10, 1, {0x1F99, 0x0000, 0x0000}}, // 0x1f91 (151 0x0097)
+ {0x40, 2, {0x1F21, 0x03B9, 0x0000}}, // 0x1f91 (152 0x0098)
+ {0x05, 2, {0x1F2A, 0x0399, 0x0000}}, // 0x1f92 (153 0x0099)
+ {0x10, 1, {0x1F9A, 0x0000, 0x0000}}, // 0x1f92 (154 0x009A)
+ {0x40, 2, {0x1F22, 0x03B9, 0x0000}}, // 0x1f92 (155 0x009B)
+ {0x05, 2, {0x1F2B, 0x0399, 0x0000}}, // 0x1f93 (156 0x009C)
+ {0x10, 1, {0x1F9B, 0x0000, 0x0000}}, // 0x1f93 (157 0x009D)
+ {0x40, 2, {0x1F23, 0x03B9, 0x0000}}, // 0x1f93 (158 0x009E)
+ {0x05, 2, {0x1F2C, 0x0399, 0x0000}}, // 0x1f94 (159 0x009F)
+ {0x10, 1, {0x1F9C, 0x0000, 0x0000}}, // 0x1f94 (160 0x00A0)
+ {0x40, 2, {0x1F24, 0x03B9, 0x0000}}, // 0x1f94 (161 0x00A1)
+ {0x05, 2, {0x1F2D, 0x0399, 0x0000}}, // 0x1f95 (162 0x00A2)
+ {0x10, 1, {0x1F9D, 0x0000, 0x0000}}, // 0x1f95 (163 0x00A3)
+ {0x40, 2, {0x1F25, 0x03B9, 0x0000}}, // 0x1f95 (164 0x00A4)
+ {0x05, 2, {0x1F2E, 0x0399, 0x0000}}, // 0x1f96 (165 0x00A5)
+ {0x10, 1, {0x1F9E, 0x0000, 0x0000}}, // 0x1f96 (166 0x00A6)
+ {0x40, 2, {0x1F26, 0x03B9, 0x0000}}, // 0x1f96 (167 0x00A7)
+ {0x05, 2, {0x1F2F, 0x0399, 0x0000}}, // 0x1f97 (168 0x00A8)
+ {0x10, 1, {0x1F9F, 0x0000, 0x0000}}, // 0x1f97 (169 0x00A9)
+ {0x40, 2, {0x1F27, 0x03B9, 0x0000}}, // 0x1f97 (170 0x00AA)
+ {0x28, 1, {0x1F90, 0x0000, 0x0000}}, // 0x1f98 (171 0x00AB)
+ {0x04, 2, {0x1F28, 0x0399, 0x0000}}, // 0x1f98 (172 0x00AC)
+ {0x40, 2, {0x1F20, 0x03B9, 0x0000}}, // 0x1f98 (173 0x00AD)
+ {0x28, 1, {0x1F91, 0x0000, 0x0000}}, // 0x1f99 (174 0x00AE)
+ {0x04, 2, {0x1F29, 0x0399, 0x0000}}, // 0x1f99 (175 0x00AF)
+ {0x40, 2, {0x1F21, 0x03B9, 0x0000}}, // 0x1f99 (176 0x00B0)
+ {0x28, 1, {0x1F92, 0x0000, 0x0000}}, // 0x1f9a (177 0x00B1)
+ {0x04, 2, {0x1F2A, 0x0399, 0x0000}}, // 0x1f9a (178 0x00B2)
+ {0x40, 2, {0x1F22, 0x03B9, 0x0000}}, // 0x1f9a (179 0x00B3)
+ {0x28, 1, {0x1F93, 0x0000, 0x0000}}, // 0x1f9b (180 0x00B4)
+ {0x04, 2, {0x1F2B, 0x0399, 0x0000}}, // 0x1f9b (181 0x00B5)
+ {0x40, 2, {0x1F23, 0x03B9, 0x0000}}, // 0x1f9b (182 0x00B6)
+ {0x28, 1, {0x1F94, 0x0000, 0x0000}}, // 0x1f9c (183 0x00B7)
+ {0x04, 2, {0x1F2C, 0x0399, 0x0000}}, // 0x1f9c (184 0x00B8)
+ {0x40, 2, {0x1F24, 0x03B9, 0x0000}}, // 0x1f9c (185 0x00B9)
+ {0x28, 1, {0x1F95, 0x0000, 0x0000}}, // 0x1f9d (186 0x00BA)
+ {0x04, 2, {0x1F2D, 0x0399, 0x0000}}, // 0x1f9d (187 0x00BB)
+ {0x40, 2, {0x1F25, 0x03B9, 0x0000}}, // 0x1f9d (188 0x00BC)
+ {0x28, 1, {0x1F96, 0x0000, 0x0000}}, // 0x1f9e (189 0x00BD)
+ {0x04, 2, {0x1F2E, 0x0399, 0x0000}}, // 0x1f9e (190 0x00BE)
+ {0x40, 2, {0x1F26, 0x03B9, 0x0000}}, // 0x1f9e (191 0x00BF)
+ {0x28, 1, {0x1F97, 0x0000, 0x0000}}, // 0x1f9f (192 0x00C0)
+ {0x04, 2, {0x1F2F, 0x0399, 0x0000}}, // 0x1f9f (193 0x00C1)
+ {0x40, 2, {0x1F27, 0x03B9, 0x0000}}, // 0x1f9f (194 0x00C2)
+ {0x05, 2, {0x1F68, 0x0399, 0x0000}}, // 0x1fa0 (195 0x00C3)
+ {0x10, 1, {0x1FA8, 0x0000, 0x0000}}, // 0x1fa0 (196 0x00C4)
+ {0x40, 2, {0x1F60, 0x03B9, 0x0000}}, // 0x1fa0 (197 0x00C5)
+ {0x05, 2, {0x1F69, 0x0399, 0x0000}}, // 0x1fa1 (198 0x00C6)
+ {0x10, 1, {0x1FA9, 0x0000, 0x0000}}, // 0x1fa1 (199 0x00C7)
+ {0x40, 2, {0x1F61, 0x03B9, 0x0000}}, // 0x1fa1 (200 0x00C8)
+ {0x05, 2, {0x1F6A, 0x0399, 0x0000}}, // 0x1fa2 (201 0x00C9)
+ {0x10, 1, {0x1FAA, 0x0000, 0x0000}}, // 0x1fa2 (202 0x00CA)
+ {0x40, 2, {0x1F62, 0x03B9, 0x0000}}, // 0x1fa2 (203 0x00CB)
+ {0x05, 2, {0x1F6B, 0x0399, 0x0000}}, // 0x1fa3 (204 0x00CC)
+ {0x10, 1, {0x1FAB, 0x0000, 0x0000}}, // 0x1fa3 (205 0x00CD)
+ {0x40, 2, {0x1F63, 0x03B9, 0x0000}}, // 0x1fa3 (206 0x00CE)
+ {0x05, 2, {0x1F6C, 0x0399, 0x0000}}, // 0x1fa4 (207 0x00CF)
+ {0x10, 1, {0x1FAC, 0x0000, 0x0000}}, // 0x1fa4 (208 0x00D0)
+ {0x40, 2, {0x1F64, 0x03B9, 0x0000}}, // 0x1fa4 (209 0x00D1)
+ {0x05, 2, {0x1F6D, 0x0399, 0x0000}}, // 0x1fa5 (210 0x00D2)
+ {0x10, 1, {0x1FAD, 0x0000, 0x0000}}, // 0x1fa5 (211 0x00D3)
+ {0x40, 2, {0x1F65, 0x03B9, 0x0000}}, // 0x1fa5 (212 0x00D4)
+ {0x05, 2, {0x1F6E, 0x0399, 0x0000}}, // 0x1fa6 (213 0x00D5)
+ {0x10, 1, {0x1FAE, 0x0000, 0x0000}}, // 0x1fa6 (214 0x00D6)
+ {0x40, 2, {0x1F66, 0x03B9, 0x0000}}, // 0x1fa6 (215 0x00D7)
+ {0x05, 2, {0x1F6F, 0x0399, 0x0000}}, // 0x1fa7 (216 0x00D8)
+ {0x10, 1, {0x1FAF, 0x0000, 0x0000}}, // 0x1fa7 (217 0x00D9)
+ {0x40, 2, {0x1F67, 0x03B9, 0x0000}}, // 0x1fa7 (218 0x00DA)
+ {0x28, 1, {0x1FA0, 0x0000, 0x0000}}, // 0x1fa8 (219 0x00DB)
+ {0x04, 2, {0x1F68, 0x0399, 0x0000}}, // 0x1fa8 (220 0x00DC)
+ {0x40, 2, {0x1F60, 0x03B9, 0x0000}}, // 0x1fa8 (221 0x00DD)
+ {0x28, 1, {0x1FA1, 0x0000, 0x0000}}, // 0x1fa9 (222 0x00DE)
+ {0x04, 2, {0x1F69, 0x0399, 0x0000}}, // 0x1fa9 (223 0x00DF)
+ {0x40, 2, {0x1F61, 0x03B9, 0x0000}}, // 0x1fa9 (224 0x00E0)
+ {0x28, 1, {0x1FA2, 0x0000, 0x0000}}, // 0x1faa (225 0x00E1)
+ {0x04, 2, {0x1F6A, 0x0399, 0x0000}}, // 0x1faa (226 0x00E2)
+ {0x40, 2, {0x1F62, 0x03B9, 0x0000}}, // 0x1faa (227 0x00E3)
+ {0x28, 1, {0x1FA3, 0x0000, 0x0000}}, // 0x1fab (228 0x00E4)
+ {0x04, 2, {0x1F6B, 0x0399, 0x0000}}, // 0x1fab (229 0x00E5)
+ {0x40, 2, {0x1F63, 0x03B9, 0x0000}}, // 0x1fab (230 0x00E6)
+ {0x28, 1, {0x1FA4, 0x0000, 0x0000}}, // 0x1fac (231 0x00E7)
+ {0x04, 2, {0x1F6C, 0x0399, 0x0000}}, // 0x1fac (232 0x00E8)
+ {0x40, 2, {0x1F64, 0x03B9, 0x0000}}, // 0x1fac (233 0x00E9)
+ {0x28, 1, {0x1FA5, 0x0000, 0x0000}}, // 0x1fad (234 0x00EA)
+ {0x04, 2, {0x1F6D, 0x0399, 0x0000}}, // 0x1fad (235 0x00EB)
+ {0x40, 2, {0x1F65, 0x03B9, 0x0000}}, // 0x1fad (236 0x00EC)
+ {0x28, 1, {0x1FA6, 0x0000, 0x0000}}, // 0x1fae (237 0x00ED)
+ {0x04, 2, {0x1F6E, 0x0399, 0x0000}}, // 0x1fae (238 0x00EE)
+ {0x40, 2, {0x1F66, 0x03B9, 0x0000}}, // 0x1fae (239 0x00EF)
+ {0x28, 1, {0x1FA7, 0x0000, 0x0000}}, // 0x1faf (240 0x00F0)
+ {0x04, 2, {0x1F6F, 0x0399, 0x0000}}, // 0x1faf (241 0x00F1)
+ {0x40, 2, {0x1F67, 0x03B9, 0x0000}}, // 0x1faf (242 0x00F2)
+ {0x05, 2, {0x1FBA, 0x0399, 0x0000}}, // 0x1fb2 (243 0x00F3)
+ {0x10, 2, {0x1FBA, 0x0345, 0x0000}}, // 0x1fb2 (244 0x00F4)
+ {0x40, 2, {0x1F70, 0x03B9, 0x0000}}, // 0x1fb2 (245 0x00F5)
+ {0x05, 2, {0x0391, 0x0399, 0x0000}}, // 0x1fb3 (246 0x00F6)
+ {0x10, 1, {0x1FBC, 0x0000, 0x0000}}, // 0x1fb3 (247 0x00F7)
+ {0x40, 2, {0x03B1, 0x03B9, 0x0000}}, // 0x1fb3 (248 0x00F8)
+ {0x05, 2, {0x0386, 0x0399, 0x0000}}, // 0x1fb4 (249 0x00F9)
+ {0x10, 2, {0x0386, 0x0345, 0x0000}}, // 0x1fb4 (250 0x00FA)
+ {0x40, 2, {0x03AC, 0x03B9, 0x0000}}, // 0x1fb4 (251 0x00FB)
+ {0x15, 2, {0x0391, 0x0342, 0x0000}}, // 0x1fb6 (252 0x00FC)
+ {0x40, 2, {0x03B1, 0x0342, 0x0000}}, // 0x1fb6 (253 0x00FD)
+ {0x05, 3, {0x0391, 0x0342, 0x0399}}, // 0x1fb7 (254 0x00FE)
+ {0x10, 3, {0x0391, 0x0342, 0x0345}}, // 0x1fb7 (255 0x00FF)
+ {0x40, 3, {0x03B1, 0x0342, 0x03B9}}, // 0x1fb7 (256 0x0100)
+ {0x28, 1, {0x1FB3, 0x0000, 0x0000}}, // 0x1fbc (257 0x0101)
+ {0x04, 2, {0x0391, 0x0399, 0x0000}}, // 0x1fbc (258 0x0102)
+ {0x40, 2, {0x03B1, 0x03B9, 0x0000}}, // 0x1fbc (259 0x0103)
+ {0x15, 1, {0x0399, 0x0000, 0x0000}}, // 0x1fbe (260 0x0104)
+ {0x60, 1, {0x03B9, 0x0000, 0x0000}}, // 0x1fbe (261 0x0105)
+ {0x05, 2, {0x1FCA, 0x0399, 0x0000}}, // 0x1fc2 (262 0x0106)
+ {0x10, 2, {0x1FCA, 0x0345, 0x0000}}, // 0x1fc2 (263 0x0107)
+ {0x40, 2, {0x1F74, 0x03B9, 0x0000}}, // 0x1fc2 (264 0x0108)
+ {0x05, 2, {0x0397, 0x0399, 0x0000}}, // 0x1fc3 (265 0x0109)
+ {0x10, 1, {0x1FCC, 0x0000, 0x0000}}, // 0x1fc3 (266 0x010A)
+ {0x40, 2, {0x03B7, 0x03B9, 0x0000}}, // 0x1fc3 (267 0x010B)
+ {0x05, 2, {0x0389, 0x0399, 0x0000}}, // 0x1fc4 (268 0x010C)
+ {0x10, 2, {0x0389, 0x0345, 0x0000}}, // 0x1fc4 (269 0x010D)
+ {0x40, 2, {0x03AE, 0x03B9, 0x0000}}, // 0x1fc4 (270 0x010E)
+ {0x15, 2, {0x0397, 0x0342, 0x0000}}, // 0x1fc6 (271 0x010F)
+ {0x40, 2, {0x03B7, 0x0342, 0x0000}}, // 0x1fc6 (272 0x0110)
+ {0x05, 3, {0x0397, 0x0342, 0x0399}}, // 0x1fc7 (273 0x0111)
+ {0x10, 3, {0x0397, 0x0342, 0x0345}}, // 0x1fc7 (274 0x0112)
+ {0x40, 3, {0x03B7, 0x0342, 0x03B9}}, // 0x1fc7 (275 0x0113)
+ {0x28, 1, {0x1FC3, 0x0000, 0x0000}}, // 0x1fcc (276 0x0114)
+ {0x04, 2, {0x0397, 0x0399, 0x0000}}, // 0x1fcc (277 0x0115)
+ {0x40, 2, {0x03B7, 0x03B9, 0x0000}}, // 0x1fcc (278 0x0116)
+ {0x15, 3, {0x0399, 0x0308, 0x0300}}, // 0x1fd2 (279 0x0117)
+ {0x40, 3, {0x03B9, 0x0308, 0x0300}}, // 0x1fd2 (280 0x0118)
+ {0x15, 3, {0x0399, 0x0308, 0x0301}}, // 0x1fd3 (281 0x0119)
+ {0x40, 3, {0x03B9, 0x0308, 0x0301}}, // 0x1fd3 (282 0x011A)
+ {0x15, 2, {0x0399, 0x0342, 0x0000}}, // 0x1fd6 (283 0x011B)
+ {0x40, 2, {0x03B9, 0x0342, 0x0000}}, // 0x1fd6 (284 0x011C)
+ {0x15, 3, {0x0399, 0x0308, 0x0342}}, // 0x1fd7 (285 0x011D)
+ {0x40, 3, {0x03B9, 0x0308, 0x0342}}, // 0x1fd7 (286 0x011E)
+ {0x15, 3, {0x03A5, 0x0308, 0x0300}}, // 0x1fe2 (287 0x011F)
+ {0x40, 3, {0x03C5, 0x0308, 0x0300}}, // 0x1fe2 (288 0x0120)
+ {0x15, 3, {0x03A5, 0x0308, 0x0301}}, // 0x1fe3 (289 0x0121)
+ {0x40, 3, {0x03C5, 0x0308, 0x0301}}, // 0x1fe3 (290 0x0122)
+ {0x15, 2, {0x03A1, 0x0313, 0x0000}}, // 0x1fe4 (291 0x0123)
+ {0x40, 2, {0x03C1, 0x0313, 0x0000}}, // 0x1fe4 (292 0x0124)
+ {0x15, 2, {0x03A5, 0x0342, 0x0000}}, // 0x1fe6 (293 0x0125)
+ {0x40, 2, {0x03C5, 0x0342, 0x0000}}, // 0x1fe6 (294 0x0126)
+ {0x15, 3, {0x03A5, 0x0308, 0x0342}}, // 0x1fe7 (295 0x0127)
+ {0x40, 3, {0x03C5, 0x0308, 0x0342}}, // 0x1fe7 (296 0x0128)
+ {0x05, 2, {0x1FFA, 0x0399, 0x0000}}, // 0x1ff2 (297 0x0129)
+ {0x10, 2, {0x1FFA, 0x0345, 0x0000}}, // 0x1ff2 (298 0x012A)
+ {0x40, 2, {0x1F7C, 0x03B9, 0x0000}}, // 0x1ff2 (299 0x012B)
+ {0x05, 2, {0x03A9, 0x0399, 0x0000}}, // 0x1ff3 (300 0x012C)
+ {0x10, 1, {0x1FFC, 0x0000, 0x0000}}, // 0x1ff3 (301 0x012D)
+ {0x40, 2, {0x03C9, 0x03B9, 0x0000}}, // 0x1ff3 (302 0x012E)
+ {0x05, 2, {0x038F, 0x0399, 0x0000}}, // 0x1ff4 (303 0x012F)
+ {0x10, 2, {0x038F, 0x0345, 0x0000}}, // 0x1ff4 (304 0x0130)
+ {0x40, 2, {0x03CE, 0x03B9, 0x0000}}, // 0x1ff4 (305 0x0131)
+ {0x15, 2, {0x03A9, 0x0342, 0x0000}}, // 0x1ff6 (306 0x0132)
+ {0x40, 2, {0x03C9, 0x0342, 0x0000}}, // 0x1ff6 (307 0x0133)
+ {0x05, 3, {0x03A9, 0x0342, 0x0399}}, // 0x1ff7 (308 0x0134)
+ {0x10, 3, {0x03A9, 0x0342, 0x0345}}, // 0x1ff7 (309 0x0135)
+ {0x40, 3, {0x03C9, 0x0342, 0x03B9}}, // 0x1ff7 (310 0x0136)
+ {0x28, 1, {0x1FF3, 0x0000, 0x0000}}, // 0x1ffc (311 0x0137)
+ {0x04, 2, {0x03A9, 0x0399, 0x0000}}, // 0x1ffc (312 0x0138)
+ {0x40, 2, {0x03C9, 0x03B9, 0x0000}}, // 0x1ffc (313 0x0139)
+ {0x05, 2, {0x0046, 0x0046, 0x0000}}, // 0xfb00 (314 0x013A)
+ {0x10, 2, {0x0046, 0x0066, 0x0000}}, // 0xfb00 (315 0x013B)
+ {0x40, 2, {0x0066, 0x0066, 0x0000}}, // 0xfb00 (316 0x013C)
+ {0x05, 2, {0x0046, 0x0049, 0x0000}}, // 0xfb01 (317 0x013D)
+ {0x10, 2, {0x0046, 0x0069, 0x0000}}, // 0xfb01 (318 0x013E)
+ {0x40, 2, {0x0066, 0x0069, 0x0000}}, // 0xfb01 (319 0x013F)
+ {0x05, 2, {0x0046, 0x004C, 0x0000}}, // 0xfb02 (320 0x0140)
+ {0x10, 2, {0x0046, 0x006C, 0x0000}}, // 0xfb02 (321 0x0141)
+ {0x40, 2, {0x0066, 0x006C, 0x0000}}, // 0xfb02 (322 0x0142)
+ {0x05, 3, {0x0046, 0x0046, 0x0049}}, // 0xfb03 (323 0x0143)
+ {0x10, 3, {0x0046, 0x0066, 0x0069}}, // 0xfb03 (324 0x0144)
+ {0x40, 3, {0x0066, 0x0066, 0x0069}}, // 0xfb03 (325 0x0145)
+ {0x05, 3, {0x0046, 0x0046, 0x004C}}, // 0xfb04 (326 0x0146)
+ {0x10, 3, {0x0046, 0x0066, 0x006C}}, // 0xfb04 (327 0x0147)
+ {0x40, 3, {0x0066, 0x0066, 0x006C}}, // 0xfb04 (328 0x0148)
+ {0x05, 2, {0x0053, 0x0054, 0x0000}}, // 0xfb05 (329 0x0149)
+ {0x10, 2, {0x0053, 0x0074, 0x0000}}, // 0xfb05 (330 0x014A)
+ {0x40, 2, {0x0073, 0x0074, 0x0000}}, // 0xfb05 (331 0x014B)
+ {0x05, 2, {0x0053, 0x0054, 0x0000}}, // 0xfb06 (332 0x014C)
+ {0x10, 2, {0x0053, 0x0074, 0x0000}}, // 0xfb06 (333 0x014D)
+ {0x40, 2, {0x0073, 0x0074, 0x0000}}, // 0xfb06 (334 0x014E)
+ {0x05, 2, {0x0544, 0x0546, 0x0000}}, // 0xfb13 (335 0x014F)
+ {0x10, 2, {0x0544, 0x0576, 0x0000}}, // 0xfb13 (336 0x0150)
+ {0x40, 2, {0x0574, 0x0576, 0x0000}}, // 0xfb13 (337 0x0151)
+ {0x05, 2, {0x0544, 0x0535, 0x0000}}, // 0xfb14 (338 0x0152)
+ {0x10, 2, {0x0544, 0x0565, 0x0000}}, // 0xfb14 (339 0x0153)
+ {0x40, 2, {0x0574, 0x0565, 0x0000}}, // 0xfb14 (340 0x0154)
+ {0x05, 2, {0x0544, 0x053B, 0x0000}}, // 0xfb15 (341 0x0155)
+ {0x10, 2, {0x0544, 0x056B, 0x0000}}, // 0xfb15 (342 0x0156)
+ {0x40, 2, {0x0574, 0x056B, 0x0000}}, // 0xfb15 (343 0x0157)
+ {0x05, 2, {0x054E, 0x0546, 0x0000}}, // 0xfb16 (344 0x0158)
+ {0x10, 2, {0x054E, 0x0576, 0x0000}}, // 0xfb16 (345 0x0159)
+ {0x40, 2, {0x057E, 0x0576, 0x0000}}, // 0xfb16 (346 0x015A)
+ {0x05, 2, {0x0544, 0x053D, 0x0000}}, // 0xfb17 (347 0x015B)
+ {0x10, 2, {0x0544, 0x056D, 0x0000}}, // 0xfb17 (348 0x015C)
+ {0x40, 2, {0x0574, 0x056D, 0x0000}}, // 0xfb17 (349 0x015D)
+ {0x2a, 1, {0x00DF, 0x0000, 0x0000}}, // 0x1e9e (350 0x015E)
+ {0x40, 2, {0x0073, 0x0073, 0x0000}}, // 0x1e9e (351 0x015F)
+};
+
+/* Following code need special handling
+ 0x0069, 0x00CC, 0x00CD, 0x0128, 0x012E, 0x0130, 0x0049, 0x004A, 0x0307, 0x03A3,
+*/
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/oneToOneMapping.cxx b/i18nutil/source/utility/oneToOneMapping.cxx
new file mode 100644
index 0000000000..fbb7054d91
--- /dev/null
+++ b/i18nutil/source/utility/oneToOneMapping.cxx
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <i18nutil/oneToOneMapping.hxx>
+
+namespace i18nutil {
+
+oneToOneMapping::oneToOneMapping( OneToOneMappingTable_t const *rpTable, const size_t rnBytes, const size_t rnUnitSize )
+ : mpTable( rpTable ),
+ mnSize( rnBytes / rnUnitSize )
+{
+}
+
+oneToOneMapping::~oneToOneMapping()
+{
+}
+
+sal_Unicode oneToOneMapping::find(const sal_Unicode nKey) const
+{
+ if( mpTable )
+ {
+ // binary search
+ int bottom = 0;
+ int top = mnSize - 1;
+
+ for (;;) {
+ const int current = (top + bottom) / 2;
+ if( nKey < mpTable[current].first )
+ top = current - 1;
+ else if( nKey > mpTable[current].first )
+ bottom = current + 1;
+ else
+ return mpTable[current].second;
+
+ if( bottom > top )
+ return nKey;
+ }
+ }
+ else
+ return nKey;
+}
+
+oneToOneMappingWithFlag::oneToOneMappingWithFlag( UnicodePairWithFlag const *rpTableWF, const size_t rnSize, const UnicodePairFlag rnFlag )
+ : oneToOneMapping( nullptr, rnSize, sizeof(UnicodePairWithFlag) ),
+ mpTableWF ( rpTableWF ),
+ mnFlag ( rnFlag ),
+ mbHasIndex( false )
+{
+}
+
+oneToOneMappingWithFlag::~oneToOneMappingWithFlag()
+{
+}
+
+void oneToOneMappingWithFlag::makeIndex()
+{
+ if( mbHasIndex || !mpTableWF )
+ return;
+
+ int current = -1;
+
+ for( size_t k = 0; k < mnSize; k++ )
+ {
+ const int high = (mpTableWF[k].first >> 8) & 0xFF;
+ const int low = (mpTableWF[k].first) & 0xFF;
+ if( high != current )
+ {
+ current = high;
+ mpIndex[high].reset(new UnicodePairWithFlag const *[256]);
+
+ for (int j = 0; j < 256; ++j)
+ mpIndex[high][j] = nullptr;
+ }
+ mpIndex[high][low] = &mpTableWF[k];
+ }
+
+ mbHasIndex = true;
+}
+
+sal_Unicode oneToOneMappingWithFlag::find( const sal_Unicode nKey ) const
+{
+ if( mpTableWF )
+ {
+ if( mbHasIndex )
+ {
+ // index search
+ int high, low;
+ high = (nKey >> 8) & 0xFF;
+ low = nKey & 0xFF;
+ if( mpIndex[high] != nullptr &&
+ mpIndex[high][low] != nullptr &&
+ mpIndex[high][low]->flag & mnFlag )
+ return mpIndex[high][low]->second;
+ else
+ return nKey;
+ }
+ else
+ {
+ // binary search
+ int bottom = 0;
+ int top = mnSize - 1;
+
+ for (;;) {
+ const int current = (top + bottom) / 2;
+ if( nKey < mpTableWF[current].first )
+ top = current - 1;
+ else if( nKey > mpTableWF[current].first )
+ bottom = current + 1;
+ else
+ {
+ if( mpTableWF[current].flag & mnFlag )
+ return mpTableWF[current].second;
+ else
+ return nKey;
+ }
+
+ if( bottom > top )
+ return nKey;
+ }
+ }
+ }
+ else
+ return nKey;
+}
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/paper.cxx b/i18nutil/source/utility/paper.cxx
new file mode 100644
index 0000000000..399b3295ed
--- /dev/null
+++ b/i18nutil/source/utility/paper.cxx
@@ -0,0 +1,499 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include <officecfg/Setup.hxx>
+#include <officecfg/System.hxx>
+#include <sal/config.h>
+#include <sal/macros.h>
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <tools/long.hxx>
+
+#include <i18nutil/paper.hxx>
+
+#include <unotools/configmgr.hxx>
+#include <com/sun/star/lang/Locale.hpp>
+
+#ifdef UNX
+#include <stdio.h>
+#include <locale.h>
+#if defined(LC_PAPER) && defined(_GNU_SOURCE)
+#include <langinfo.h>
+#endif
+#endif
+
+namespace {
+
+struct PageDesc
+{
+ tools::Long m_nWidth;
+ tools::Long m_nHeight;
+ const char *m_pPSName;
+ const char *m_pAltPSName;
+};
+
+}
+
+#define PT2MM100( v ) \
+ tools::Long(((v) * 35.27777778) + 0.5)
+
+#define IN2MM100( v ) \
+ (tools::Long(((v) * 2540) + 0.5))
+
+#define MM2MM100( v ) \
+ (tools::Long((v) * 100))
+
+//PostScript Printer Description File Format Specification
+//http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf
+//https://web.archive.org/web/20040912070512/http://www.y-adagio.com/public/committees/docsii/doc_00-49/symp_ulaan/china_ppr.pdf (Kai)
+//http://www.sls.psi.ch/controls/help/howto/Howto_Print_a_A0_Poster_at_WSLA_012_2.pdf (Dia)
+
+//!! The order of these entries must correspond to enum Paper in <i18nutil/paper.hxx>
+
+// see XclPaperSize pPaperSizeTable in calc and ApiPaperSize in filter
+const PageDesc aDinTab[] =
+{
+ { MM2MM100( 841 ), MM2MM100( 1189 ), "A0", nullptr },
+ { MM2MM100( 594 ), MM2MM100( 841 ), "A1", nullptr },
+ { MM2MM100( 420 ), MM2MM100( 594 ), "A2", nullptr },
+ { MM2MM100( 297 ), MM2MM100( 420 ), "A3", nullptr },
+ { MM2MM100( 210 ), MM2MM100( 297 ), "A4", nullptr },
+ { MM2MM100( 148 ), MM2MM100( 210 ), "A5", nullptr },
+ { MM2MM100( 250 ), MM2MM100( 353 ), "ISOB4", nullptr },
+ { MM2MM100( 176 ), MM2MM100( 250 ), "ISOB5", nullptr },
+ { IN2MM100( 8.5 ), IN2MM100( 11 ), "Letter", "Note" },
+ { IN2MM100( 8.5 ), IN2MM100( 14 ), "Legal", nullptr },
+ { IN2MM100( 11 ), IN2MM100( 17 ), "Tabloid", "11x17" },
+ { 0, 0, nullptr, nullptr }, //User
+ { MM2MM100( 125 ), MM2MM100( 176 ), "ISOB6", nullptr },
+ { MM2MM100( 229 ), MM2MM100( 324 ), "EnvC4", "C4" },
+ { MM2MM100( 162 ), MM2MM100( 229 ), "EnvC5", "C5" },
+ { MM2MM100( 114 ), MM2MM100( 162 ), "EnvC6", "C6" },
+ { MM2MM100( 114 ), MM2MM100( 229 ), "EnvC65", nullptr },
+ { MM2MM100( 110 ), MM2MM100( 220 ), "EnvDL", "DL" },
+ { MM2MM100( 180), MM2MM100( 270 ), nullptr, nullptr }, //Dia
+ { MM2MM100( 210), MM2MM100( 280 ), nullptr, nullptr }, //Screen 4:3
+ { IN2MM100( 17 ), IN2MM100( 22 ), "AnsiC", "CSheet" },
+ { IN2MM100( 22 ), IN2MM100( 34 ), "AnsiD", "DSheet" },
+ { IN2MM100( 34 ), IN2MM100( 44 ), "AnsiE", "ESheet" },
+ { IN2MM100( 7.25 ), IN2MM100( 10.5 ), "Executive", nullptr },
+ //"Folio" is a different size in the PPD documentation than 8.5x11
+ //This "FanFoldGermanLegal" is known in the Philippines as
+ //"Legal" paper or "Long Bond Paper". The "Legal" name causing untold
+ //misery, given the differently sized US "Legal" paper
+ { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGermanLegal", nullptr },
+ { IN2MM100( 3.875 ), IN2MM100( 7.5 ), "EnvMonarch", "Monarch" },
+ { IN2MM100( 3.625 ), IN2MM100( 6.5 ), "EnvPersonal", "Personal" },
+ { IN2MM100( 3.875 ), IN2MM100( 8.875 ), "Env9", nullptr },
+ { IN2MM100( 4.125 ), IN2MM100( 9.5 ), "Env10", "Comm10" },
+ { IN2MM100( 4.5 ), IN2MM100( 10.375 ), "Env11", nullptr },
+ { IN2MM100( 4.75 ), IN2MM100( 11 ), "Env12", nullptr },
+ { MM2MM100( 184 ), MM2MM100( 260 ), nullptr, nullptr }, //Kai16 / 16k
+ { MM2MM100( 130 ), MM2MM100( 184 ), nullptr, nullptr }, //Kai32
+ { MM2MM100( 140 ), MM2MM100( 203 ), nullptr, nullptr }, //BigKai32
+ { MM2MM100( 257 ), MM2MM100( 364 ), "B4", nullptr }, //JIS
+ { MM2MM100( 182 ), MM2MM100( 257 ), "B5", nullptr }, //JIS
+ { MM2MM100( 128 ), MM2MM100( 182 ), "B6", nullptr }, //JIS
+ { IN2MM100( 17 ), IN2MM100( 11 ), "Ledger", nullptr },
+ { IN2MM100( 5.5 ), IN2MM100( 8.5 ), "Statement", nullptr },
+ { PT2MM100( 610 ), PT2MM100( 780 ), "Quarto", nullptr },
+ { IN2MM100( 10 ), IN2MM100( 14 ), "10x14", nullptr },
+ { IN2MM100( 5.5 ), IN2MM100( 11.5 ), "Env14", nullptr },
+ { MM2MM100( 324 ), MM2MM100( 458 ), "EnvC3", "C3" },
+ { MM2MM100( 110 ), MM2MM100( 230 ), "EnvItalian", nullptr },
+ { IN2MM100( 14.875 ),IN2MM100( 11 ), "FanFoldUS", nullptr },
+ { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGerman", nullptr },
+ { MM2MM100( 100 ), MM2MM100( 148 ), "Postcard", nullptr },
+ { IN2MM100( 9 ), IN2MM100( 11 ), "9x11", nullptr },
+ { IN2MM100( 10 ), IN2MM100( 11 ), "10x11", nullptr },
+ { IN2MM100( 15 ), IN2MM100( 11 ), "15x11", nullptr },
+ { MM2MM100( 220 ), MM2MM100( 220 ), "EnvInvite", nullptr },
+ { MM2MM100( 227 ), MM2MM100( 356 ), "SuperA", nullptr },
+ { MM2MM100( 305 ), MM2MM100( 487 ), "SuperB", nullptr },
+ { IN2MM100( 8.5 ), IN2MM100( 12.69 ), "LetterPlus", nullptr },
+ { MM2MM100( 210 ), MM2MM100( 330 ), "A4Plus", nullptr },
+ { MM2MM100( 200 ), MM2MM100( 148 ), "DoublePostcard", nullptr },
+ { MM2MM100( 105 ), MM2MM100( 148 ), "A6", nullptr },
+ { IN2MM100( 12 ), IN2MM100( 11 ), "12x11", nullptr },
+ { MM2MM100( 74 ), MM2MM100( 105 ), "A7", nullptr },
+ { MM2MM100( 52 ), MM2MM100( 74 ), "A8", nullptr },
+ { MM2MM100( 37 ), MM2MM100( 52 ), "A9", nullptr },
+ { MM2MM100( 26 ), MM2MM100( 37 ), "A10", nullptr },
+ { MM2MM100( 1000 ), MM2MM100( 1414 ), "ISOB0", nullptr },
+ { MM2MM100( 707 ), MM2MM100( 1000 ), "ISOB1", nullptr },
+ { MM2MM100( 500 ), MM2MM100( 707 ), "ISOB2", nullptr },
+ { MM2MM100( 353 ), MM2MM100( 500 ), "ISOB3", nullptr },
+ { MM2MM100( 88 ), MM2MM100( 125 ), "ISOB7", nullptr },
+ { MM2MM100( 62 ), MM2MM100( 88 ), "ISOB8", nullptr },
+ { MM2MM100( 44 ), MM2MM100( 62 ), "ISOB9", nullptr },
+ { MM2MM100( 31 ), MM2MM100( 44 ), "ISOB10", nullptr },
+ { MM2MM100( 458 ), MM2MM100( 648 ), "EnvC2", "C2" },
+ { MM2MM100( 81 ), MM2MM100( 114 ), "EnvC7", "C7" },
+ { MM2MM100( 57 ), MM2MM100( 81 ), "EnvC8", "C8" },
+ { IN2MM100( 9 ), IN2MM100( 12 ), "ARCHA", nullptr },
+ { IN2MM100( 12 ), IN2MM100( 18 ), "ARCHB", nullptr },
+ { IN2MM100( 18 ), IN2MM100( 24 ), "ARCHC", nullptr },
+ { IN2MM100( 24 ), IN2MM100( 36 ), "ARCHD", nullptr },
+ { IN2MM100( 36 ), IN2MM100( 48 ), "ARCHE", nullptr },
+ { MM2MM100( 157.5), MM2MM100( 280 ), nullptr, nullptr }, //Screen 16:9
+ { MM2MM100( 175 ), MM2MM100( 280 ), nullptr, nullptr }, //Screen 16:10
+ { MM2MM100( 195 ), MM2MM100( 270 ), nullptr, nullptr }, // 16k
+ { MM2MM100( 197 ), MM2MM100( 273 ), nullptr, nullptr }, // 16k
+ { IN2MM100( 7.5 ), IN2MM100( 13.333 ), nullptr, nullptr }, //PowerPoint Widescreen
+ { IN2MM100( 7.5 ), IN2MM100( 10 ), nullptr, nullptr }, //PowerPoint On-screen Show (4:3)
+ { IN2MM100( 5.625 ), IN2MM100( 10 ), nullptr, nullptr }, //PowerPoint On-screen Show (16:9)
+ { IN2MM100( 6.25 ), IN2MM100( 10 ), nullptr, nullptr } //PowerPoint On-screen Show (16:10)
+
+};
+
+const size_t nTabSize = SAL_N_ELEMENTS(aDinTab);
+
+// tdf#151107 make this not just large enough for rounding errors on our side
+// but also large enough to match where the ppd side rounded up to the next
+// point. Seen with C5/C6/C65 envelopes which can be found over 1 point away
+// from the values in aDinTab
+#define MAXSLOPPY PT2MM100(1.25)
+
+void PaperInfo::doSloppyFit(bool bAlsoTryRotated)
+{
+ if (m_eType != PAPER_USER)
+ return;
+
+ for ( size_t i = 0; i < nTabSize; ++i )
+ {
+ if (i == PAPER_USER) continue;
+
+ tools::Long lDiffW = std::abs(aDinTab[i].m_nWidth - m_nPaperWidth);
+ tools::Long lDiffH = std::abs(aDinTab[i].m_nHeight - m_nPaperHeight);
+
+ if (lDiffW < MAXSLOPPY && lDiffH < MAXSLOPPY)
+ {
+ m_nPaperWidth = aDinTab[i].m_nWidth;
+ m_nPaperHeight = aDinTab[i].m_nHeight;
+ m_eType = static_cast<Paper>(i);
+ return;
+ }
+ }
+
+ if (bAlsoTryRotated)
+ {
+ std::swap(m_nPaperWidth, m_nPaperHeight);
+ doSloppyFit();
+ std::swap(m_nPaperWidth, m_nPaperHeight);
+ }
+}
+
+bool PaperInfo::sloppyEqual(const PaperInfo &rOther) const
+{
+ return
+ (
+ (std::abs(m_nPaperWidth - rOther.m_nPaperWidth) < MAXSLOPPY) &&
+ (std::abs(m_nPaperHeight - rOther.m_nPaperHeight) < MAXSLOPPY)
+ );
+}
+
+tools::Long PaperInfo::sloppyFitPageDimension(tools::Long nDimension)
+{
+ for ( size_t i = 0; i < nTabSize; ++i )
+ {
+ if (i == PAPER_USER) continue;
+ tools::Long lDiff;
+
+ lDiff = std::abs(aDinTab[i].m_nWidth - nDimension);
+ if ( lDiff < MAXSLOPPY )
+ return aDinTab[i].m_nWidth;
+
+ lDiff = std::abs(aDinTab[i].m_nHeight - nDimension);
+ if ( lDiff < MAXSLOPPY )
+ return aDinTab[i].m_nHeight;
+ }
+ return nDimension;
+}
+
+PaperInfo PaperInfo::getSystemDefaultPaper()
+{
+ if (utl::ConfigManager::IsFuzzing())
+ return PaperInfo(PAPER_A4);
+
+ OUString aLocaleStr = officecfg::Setup::L10N::ooSetupSystemLocale::get();
+
+#ifdef UNX
+ // if set to "use system", get papersize from system
+ if (aLocaleStr.isEmpty())
+ {
+ static bool bInitialized = false;
+ static PaperInfo aInstance(PAPER_A4);
+
+ if (bInitialized)
+ return aInstance;
+
+#if ! defined(MACOSX) && ! defined(EMSCRIPTEN)
+ // try libpaper
+ // #i78617# workaround missing paperconf command
+ FILE* pPipe = popen( "paperconf 2>/dev/null", "r" );
+ if( pPipe )
+ {
+ Paper ePaper = PAPER_USER;
+
+ char aBuffer[ 1024 ];
+ aBuffer[0] = 0;
+ char *pBuffer = fgets( aBuffer, sizeof(aBuffer), pPipe );
+ bool bOk = pclose(pPipe) == 0;
+
+ if (bOk && pBuffer && *pBuffer != 0)
+ {
+ OString aPaper(pBuffer);
+ aPaper = aPaper.trim();
+ static const struct { const char *pName; Paper ePaper; } aCustoms [] =
+ {
+ { "B0", PAPER_B0_ISO },
+ { "B1", PAPER_B1_ISO },
+ { "B2", PAPER_B2_ISO },
+ { "B3", PAPER_B3_ISO },
+ { "B4", PAPER_B4_ISO },
+ { "B5", PAPER_B5_ISO },
+ { "B6", PAPER_B6_ISO },
+ { "B7", PAPER_B7_ISO },
+ { "B8", PAPER_B8_ISO },
+ { "B9", PAPER_B9_ISO },
+ { "B10", PAPER_B10_ISO },
+ { "folio", PAPER_FANFOLD_LEGAL_DE },
+ { "flsa", PAPER_FANFOLD_LEGAL_DE },
+ { "flse", PAPER_FANFOLD_LEGAL_DE }
+ };
+
+ bool bHalve = false;
+
+ size_t const nExtraTabSize = SAL_N_ELEMENTS(aCustoms);
+ for (size_t i = 0; i < nExtraTabSize; ++i)
+ {
+ if (rtl_str_compareIgnoreAsciiCase(aCustoms[i].pName, aPaper.getStr()) == 0)
+ {
+ ePaper = aCustoms[i].ePaper;
+ break;
+ }
+ }
+
+ if (ePaper == PAPER_USER)
+ {
+ bHalve = aPaper.startsWith("half", &aPaper);
+ ePaper = PaperInfo::fromPSName(aPaper);
+ }
+
+ if (ePaper != PAPER_USER)
+ {
+ aInstance = PaperInfo(ePaper);
+ if (bHalve)
+ aInstance = PaperInfo(aInstance.getHeight()/2, aInstance.getWidth());
+ bInitialized = true;
+ return aInstance;
+ }
+ }
+ }
+#endif
+
+// _NL_PAPER_WIDTH / HEIGHT not available with android unified headers
+#if defined(LC_PAPER) && defined(_GNU_SOURCE) && !defined(ANDROID)
+ // try LC_PAPER
+ locale_t loc = newlocale(LC_PAPER_MASK, "", static_cast<locale_t>(0));
+ if (loc != static_cast<locale_t>(0))
+ {
+ union paperword { char *string; int word; };
+ paperword w, h;
+ w.string = nl_langinfo_l(_NL_PAPER_WIDTH, loc);
+ h.string = nl_langinfo_l(_NL_PAPER_HEIGHT, loc);
+
+ freelocale(loc);
+
+ //glibc stores sizes as integer mm units
+ w.word *= 100;
+ h.word *= 100;
+
+ for ( size_t i = 0; i < nTabSize; ++i )
+ {
+ if (i == PAPER_USER) continue;
+
+ //glibc stores sizes as integer mm units, and so is inaccurate.
+ //To find a standard paper size we calculate the standard paper
+ //sizes into equally inaccurate mm and compare
+ tools::Long width = (aDinTab[i].m_nWidth + 50) / 100;
+ tools::Long height = (aDinTab[i].m_nHeight + 50) / 100;
+
+ if (width == w.word/100 && height == h.word/100)
+ {
+ w.word = aDinTab[i].m_nWidth;
+ h.word = aDinTab[i].m_nHeight;
+ break;
+ }
+ }
+
+ aInstance = PaperInfo(w.word, h.word);
+ bInitialized = true;
+ return aInstance;
+ }
+#endif
+ }
+#endif
+
+ // if set to "use system", try to get locale from system
+ if (aLocaleStr.isEmpty())
+ aLocaleStr = officecfg::System::L10N::Locale::get();
+
+ static constexpr OUStringLiteral EN_US = u"en-US";
+ if (aLocaleStr.isEmpty())
+ aLocaleStr = EN_US;
+
+ // convert locale string to locale struct
+ css::lang::Locale aSysLocale;
+ sal_Int32 nDashPos = aLocaleStr.indexOf( '-' );
+ if( nDashPos < 0 ) nDashPos = aLocaleStr.getLength();
+ aSysLocale.Language = aLocaleStr.copy( 0, nDashPos );
+ if( nDashPos + 1 < aLocaleStr.getLength() )
+ aSysLocale.Country = aLocaleStr.copy( nDashPos + 1 );
+
+ return PaperInfo::getDefaultPaperForLocale(aSysLocale);
+}
+
+PaperInfo::PaperInfo(Paper eType) : m_eType(eType)
+{
+ static_assert( SAL_N_ELEMENTS(aDinTab) == NUM_PAPER_ENTRIES,
+ "mismatch between array entries and enum values" );
+
+ m_nPaperWidth = aDinTab[m_eType].m_nWidth;
+ m_nPaperHeight = aDinTab[m_eType].m_nHeight;
+}
+
+PaperInfo::PaperInfo(tools::Long nPaperWidth, tools::Long nPaperHeight)
+ : m_eType(PAPER_USER),
+ m_nPaperWidth(nPaperWidth),
+ m_nPaperHeight(nPaperHeight)
+{
+ for ( size_t i = 0; i < nTabSize; ++i )
+ {
+ if (
+ (nPaperWidth == aDinTab[i].m_nWidth) &&
+ (nPaperHeight == aDinTab[i].m_nHeight)
+ )
+ {
+ m_eType = static_cast<Paper>(i);
+ break;
+ }
+ }
+}
+
+OString PaperInfo::toPSName(Paper ePaper)
+{
+ return static_cast<size_t>(ePaper) < nTabSize && aDinTab[ePaper].m_pPSName ? OString(aDinTab[ePaper].m_pPSName) : OString();
+}
+
+Paper PaperInfo::fromPSName(const OString &rName)
+{
+ if (rName.isEmpty())
+ return PAPER_USER;
+
+ for ( size_t i = 0; i < nTabSize; ++i )
+ {
+ if (aDinTab[i].m_pPSName &&
+ !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pPSName, rName.getStr()))
+ {
+ return static_cast<Paper>(i);
+ }
+ else if (aDinTab[i].m_pAltPSName &&
+ !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pAltPSName, rName.getStr()))
+ {
+ return static_cast<Paper>(i);
+ }
+ }
+
+ return PAPER_USER;
+}
+
+//http://wiki.openoffice.org/wiki/DefaultPaperSize
+//http://www.unicode.org/cldr/data/charts/supplemental/territory_language_information.html
+//http://sourceware.org/git/?p=glibc.git;a=tree;f=localedata/locales
+//http://en.wikipedia.org/wiki/Paper_size
+//http://msdn.microsoft.com/en-us/library/cc195164.aspx
+PaperInfo PaperInfo::getDefaultPaperForLocale( const css::lang::Locale & rLocale )
+{
+ Paper eType = PAPER_A4;
+
+ if (
+ //United States, Letter
+ rLocale.Country == "US" ||
+ //Puerto Rico:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // http://sources.redhat.com/ml/libc-hacker/2001-07/msg00046.html
+ rLocale.Country == "PR" ||
+ //Canada:
+ // http://sources.redhat.com/ml/libc-hacker/2001-07/msg00053.html
+ rLocale.Country == "CA" ||
+ //Venuzuela:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00019.html
+ rLocale.Country == "VE" ||
+ //Chile:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00240.html
+ rLocale.Country == "CL" ||
+ //Mexico:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // http://qa.openoffice.org/issues/show_bug.cgi?id=49739
+ rLocale.Country == "MX" ||
+ //Colombia:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // http://qa.openoffice.org/issues/show_bug.cgi?id=69703
+ rLocale.Country == "CO" ||
+ //Philippines:
+ // http://unicode.org/cldr/trac/ticket/1710
+ // http://ubuntuliving.blogspot.com/2008/07/default-paper-size-in-evince.html
+ // http://www.gov.ph/faqs/driverslicense.asp
+ rLocale.Country == "PH" ||
+ //Belize:
+ // http://unicode.org/cldr/trac/ticket/2585
+ // http://www.belize.gov.bz/ct.asp?xItem=1666&ctNode=486&mp=27
+ rLocale.Country == "BZ" ||
+ //Costa Rica:
+ // http://unicode.org/cldr/trac/ticket/2585
+ // http://sources.redhat.com/bugzilla/show_bug.cgi?id=11258
+ rLocale.Country == "CR" ||
+ //Guatemala:
+ // http://unicode.org/cldr/trac/ticket/2585
+ // http://sources.redhat.com/bugzilla/show_bug.cgi?id=10936
+ rLocale.Country == "GT" ||
+ //Nicaragua:
+ // http://unicode.org/cldr/trac/ticket/2585
+ rLocale.Country == "NI" ||
+ //Panama:
+ // http://unicode.org/cldr/trac/ticket/2585
+ // http://www.minsa.gob.pa/minsa/tl_files/documents/baner_informativo/INSTRUMENTO%20DE%20INVESTIGACION%20DE%20RAAV%202009.pdf
+ rLocale.Country == "PA" ||
+ //El Salvador:
+ // http://unicode.org/cldr/trac/ticket/2585
+ // http://www.tse.gob.sv
+ rLocale.Country == "SV"
+ )
+ {
+ eType = PAPER_LETTER;
+ }
+
+ return eType;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/scripttypedetector.cxx b/i18nutil/source/utility/scripttypedetector.cxx
new file mode 100644
index 0000000000..5bc3f9bb2a
--- /dev/null
+++ b/i18nutil/source/utility/scripttypedetector.cxx
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <com/sun/star/i18n/ScriptDirection.hpp>
+#include <com/sun/star/i18n/UnicodeScript.hpp>
+#include <i18nutil/scripttypedetector.hxx>
+#include <i18nutil/unicode.hxx>
+#include <o3tl/safeint.hxx>
+
+using namespace com::sun::star::i18n;
+
+const sal_Int16 scriptDirection[] = {
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT = 0,
+ ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT = 1,
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER = 2,
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER_SEPARATOR = 3,
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER_TERMINATOR = 4,
+ ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_ARABIC_NUMBER = 5,
+ ScriptDirection::NEUTRAL, // DirectionProperty_COMMON_NUMBER_SEPARATOR = 6,
+ ScriptDirection::NEUTRAL, // DirectionProperty_BLOCK_SEPARATOR = 7,
+ ScriptDirection::NEUTRAL, // DirectionProperty_SEGMENT_SEPARATOR = 8,
+ ScriptDirection::NEUTRAL, // DirectionProperty_WHITE_SPACE_NEUTRAL = 9,
+ ScriptDirection::NEUTRAL, // DirectionProperty_OTHER_NEUTRAL = 10,
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT_EMBEDDING = 11,
+ ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT_OVERRIDE = 12,
+ ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_ARABIC = 13,
+ ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_EMBEDDING = 14,
+ ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_OVERRIDE = 15,
+ ScriptDirection::NEUTRAL, // DirectionProperty_POP_DIRECTIONAL_FORMAT = 16,
+ ScriptDirection::NEUTRAL, // DirectionProperty_DIR_NON_SPACING_MARK = 17,
+ ScriptDirection::NEUTRAL, // DirectionProperty_BOUNDARY_NEUTRAL = 18,
+};
+
+sal_Int16 ScriptTypeDetector::getScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 defaultScriptDirection )
+{
+ sal_Int16 dir = scriptDirection[unicode::getUnicodeDirection(Text[nPos])];
+ return (dir == ScriptDirection::NEUTRAL) ? defaultScriptDirection : dir;
+}
+
+// return value '-1' means either the direction on nPos is not same as scriptDirection or nPos is out of range.
+sal_Int32 ScriptTypeDetector::beginOfScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 direction )
+{
+ sal_Int32 cPos = nPos;
+
+ if (cPos < static_cast<sal_Int32>(Text.size())) {
+ for (; cPos >= 0; cPos--) {
+ if (direction != getScriptDirection(Text, cPos, direction))
+ break;
+ }
+ }
+ return cPos == nPos ? -1 : cPos + 1;
+}
+
+sal_Int32 ScriptTypeDetector::endOfScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 direction )
+{
+ sal_Int32 cPos = nPos;
+ sal_Int32 len = Text.size();
+
+ if (cPos >=0) {
+ for (; cPos < len; cPos++) {
+ if (direction != getScriptDirection(Text, cPos, direction))
+ break;
+ }
+ }
+ return cPos == nPos ? -1 : cPos;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx
new file mode 100644
index 0000000000..e98afeeff3
--- /dev/null
+++ b/i18nutil/source/utility/unicode.cxx
@@ -0,0 +1,1319 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <com/sun/star/i18n/UnicodeType.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <i18nlangtag/languagetag.hxx>
+#include <i18nlangtag/languagetagicu.hxx>
+#include <i18nutil/unicode.hxx>
+#include <sal/log.hxx>
+#include <unicode/numfmt.h>
+#include <unicode/uchar.h>
+#include "unicode_data.h"
+#include <rtl/character.hxx>
+#include <o3tl/string_view.hxx>
+#include <memory>
+
+// Workaround for glibc braindamage:
+// glibc 2.4's langinfo.h does "#define CURRENCY_SYMBOL __CURRENCY_SYMBOL"
+// which (obviously) breaks UnicodeType::CURRENCY_SYMBOL
+#undef CURRENCY_SYMBOL
+
+using namespace ::com::sun::star::i18n;
+
+template<class L, typename T>
+static T getScriptType( const sal_Unicode ch, const L* typeList, T unknownType ) {
+
+ sal_Int16 i = 0;
+ css::i18n::UnicodeScript type = typeList[0].to;
+ while (type < UnicodeScript_kScriptCount && ch > UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeTo]) {
+ type = typeList[++i].to;
+ }
+
+ return (type < UnicodeScript_kScriptCount &&
+ ch >= UnicodeScriptType[static_cast<int>(typeList[i].from)][int(UnicodeScriptTypeFrom)]) ?
+ typeList[i].value : unknownType;
+}
+
+sal_Int16
+unicode::getUnicodeScriptType( const sal_Unicode ch, const ScriptTypeList* typeList, sal_Int16 unknownType ) {
+ return getScriptType(ch, typeList, unknownType);
+}
+
+sal_Unicode
+unicode::getUnicodeScriptStart( UnicodeScript type) {
+ return UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeFrom];
+}
+
+sal_Unicode
+unicode::getUnicodeScriptEnd( UnicodeScript type) {
+ return UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeTo];
+}
+
+sal_Int16
+unicode::getUnicodeType(const sal_uInt32 ch)
+{
+ static sal_uInt32 c = 0x00;
+ static sal_uInt32 r = 0x00;
+
+ if (ch == c) return r;
+ else c = ch;
+
+ switch (u_charType(ch))
+ {
+ case U_UNASSIGNED:
+ r = css::i18n::UnicodeType::UNASSIGNED;
+ break;
+ case U_UPPERCASE_LETTER:
+ r = css::i18n::UnicodeType::UPPERCASE_LETTER;
+ break;
+ case U_LOWERCASE_LETTER:
+ r = css::i18n::UnicodeType::LOWERCASE_LETTER;
+ break;
+ case U_TITLECASE_LETTER:
+ r = css::i18n::UnicodeType::TITLECASE_LETTER;
+ break;
+ case U_MODIFIER_LETTER:
+ r = css::i18n::UnicodeType::MODIFIER_LETTER;
+ break;
+ case U_OTHER_LETTER:
+ r = css::i18n::UnicodeType::OTHER_LETTER;
+ break;
+ case U_NON_SPACING_MARK:
+ r = css::i18n::UnicodeType::NON_SPACING_MARK;
+ break;
+ case U_ENCLOSING_MARK:
+ r = css::i18n::UnicodeType::ENCLOSING_MARK;
+ break;
+ case U_COMBINING_SPACING_MARK:
+ r = css::i18n::UnicodeType::COMBINING_SPACING_MARK;
+ break;
+ case U_DECIMAL_DIGIT_NUMBER:
+ r = css::i18n::UnicodeType::DECIMAL_DIGIT_NUMBER;
+ break;
+ case U_LETTER_NUMBER:
+ r = css::i18n::UnicodeType::LETTER_NUMBER;
+ break;
+ case U_OTHER_NUMBER:
+ r = css::i18n::UnicodeType::OTHER_NUMBER;
+ break;
+ case U_SPACE_SEPARATOR:
+ r = css::i18n::UnicodeType::SPACE_SEPARATOR;
+ break;
+ case U_LINE_SEPARATOR:
+ r = css::i18n::UnicodeType::LINE_SEPARATOR;
+ break;
+ case U_PARAGRAPH_SEPARATOR:
+ r = css::i18n::UnicodeType::PARAGRAPH_SEPARATOR;
+ break;
+ case U_CONTROL_CHAR:
+ r = css::i18n::UnicodeType::CONTROL;
+ break;
+ case U_FORMAT_CHAR:
+ r = css::i18n::UnicodeType::FORMAT;
+ break;
+ case U_PRIVATE_USE_CHAR:
+ r = css::i18n::UnicodeType::PRIVATE_USE;
+ break;
+ case U_SURROGATE:
+ r = css::i18n::UnicodeType::SURROGATE;
+ break;
+ case U_DASH_PUNCTUATION:
+ r = css::i18n::UnicodeType::DASH_PUNCTUATION;
+ break;
+ case U_INITIAL_PUNCTUATION:
+ r = css::i18n::UnicodeType::INITIAL_PUNCTUATION;
+ break;
+ case U_FINAL_PUNCTUATION:
+ r = css::i18n::UnicodeType::FINAL_PUNCTUATION;
+ break;
+ case U_CONNECTOR_PUNCTUATION:
+ r = css::i18n::UnicodeType::CONNECTOR_PUNCTUATION;
+ break;
+ case U_OTHER_PUNCTUATION:
+ r = css::i18n::UnicodeType::OTHER_PUNCTUATION;
+ break;
+ case U_MATH_SYMBOL:
+ r = css::i18n::UnicodeType::MATH_SYMBOL;
+ break;
+ case U_CURRENCY_SYMBOL:
+ r = css::i18n::UnicodeType::CURRENCY_SYMBOL;
+ break;
+ case U_MODIFIER_SYMBOL:
+ r = css::i18n::UnicodeType::MODIFIER_SYMBOL;
+ break;
+ case U_OTHER_SYMBOL:
+ r = css::i18n::UnicodeType::OTHER_SYMBOL;
+ break;
+ case U_START_PUNCTUATION:
+ r = css::i18n::UnicodeType::START_PUNCTUATION;
+ break;
+ case U_END_PUNCTUATION:
+ r = css::i18n::UnicodeType::END_PUNCTUATION;
+ break;
+ }
+
+ return r;
+}
+
+sal_uInt8
+unicode::getUnicodeDirection( const sal_Unicode ch ) {
+ static sal_Unicode c = 0x00;
+ static sal_uInt8 r = 0x00;
+
+ if (ch == c) return r;
+ else c = ch;
+
+ sal_Int16 address = UnicodeDirectionIndex[ch >> 8];
+ r = (address < UnicodeDirectionNumberBlock)
+ ? UnicodeDirectionBlockValue[address]
+ : UnicodeDirectionValue[((address - UnicodeDirectionNumberBlock) << 8) + (ch & 0xff)];
+ return r;
+}
+
+sal_uInt32 unicode::GetMirroredChar(sal_uInt32 nChar) {
+ nChar = u_charMirror(nChar);
+ return nChar;
+}
+
+#define bit(name) (1U << name)
+
+#define UPPERMASK bit(UnicodeType::UPPERCASE_LETTER)
+
+#define LOWERMASK bit(UnicodeType::LOWERCASE_LETTER)
+
+#define TITLEMASK bit(UnicodeType::TITLECASE_LETTER)
+
+#define ALPHAMASK UPPERMASK|LOWERMASK|TITLEMASK|\
+ bit(UnicodeType::MODIFIER_LETTER)|\
+ bit(UnicodeType::OTHER_LETTER)
+
+#define SPACEMASK bit(UnicodeType::SPACE_SEPARATOR)|\
+ bit(UnicodeType::LINE_SEPARATOR)|\
+ bit(UnicodeType::PARAGRAPH_SEPARATOR)
+
+#define CONTROLMASK bit(UnicodeType::CONTROL)|\
+ bit(UnicodeType::FORMAT)|\
+ bit(UnicodeType::LINE_SEPARATOR)|\
+ bit(UnicodeType::PARAGRAPH_SEPARATOR)
+
+#define IsType(func, mask) \
+bool func( const sal_uInt32 ch) {\
+ return (bit(getUnicodeType(ch)) & (mask)) != 0;\
+}
+
+IsType(unicode::isControl, CONTROLMASK)
+IsType(unicode::isAlpha, ALPHAMASK)
+IsType(unicode::isSpace, SPACEMASK)
+
+#define CONTROLSPACE bit(0x09)|bit(0x0a)|bit(0x0b)|bit(0x0c)|bit(0x0d)|\
+ bit(0x1c)|bit(0x1d)|bit(0x1e)|bit(0x1f)
+
+bool unicode::isWhiteSpace(const sal_uInt32 ch)
+{
+ return (ch != 0xa0 && isSpace(ch)) || (ch <= 0x1F && (bit(ch) & (CONTROLSPACE)));
+}
+
+sal_Int16 unicode::getScriptClassFromUScriptCode(UScriptCode eScript)
+{
+ //See unicode/uscript.h
+ sal_Int16 nRet;
+ switch (eScript)
+ {
+ case USCRIPT_INVALID_CODE:
+ case USCRIPT_COMMON:
+ case USCRIPT_INHERITED:
+ case USCRIPT_UNWRITTEN_LANGUAGES:
+ case USCRIPT_UNKNOWN:
+ case USCRIPT_MATHEMATICAL_NOTATION:
+ case USCRIPT_SYMBOLS:
+ case USCRIPT_CODE_LIMIT:
+ nRet = ScriptType::WEAK;
+ break;
+ case USCRIPT_ARMENIAN:
+ case USCRIPT_CHEROKEE:
+ case USCRIPT_COPTIC:
+ case USCRIPT_CYRILLIC:
+ case USCRIPT_GEORGIAN:
+ case USCRIPT_GOTHIC:
+ case USCRIPT_GREEK:
+ case USCRIPT_LATIN:
+ case USCRIPT_OGHAM:
+ case USCRIPT_OLD_ITALIC:
+ case USCRIPT_RUNIC:
+ case USCRIPT_CANADIAN_ABORIGINAL:
+ case USCRIPT_BRAILLE:
+ case USCRIPT_CYPRIOT:
+ case USCRIPT_OSMANYA:
+ case USCRIPT_SHAVIAN:
+ case USCRIPT_KATAKANA_OR_HIRAGANA:
+ case USCRIPT_GLAGOLITIC:
+ case USCRIPT_CIRTH:
+ case USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC:
+ case USCRIPT_OLD_HUNGARIAN:
+ case USCRIPT_LATIN_FRAKTUR:
+ case USCRIPT_LATIN_GAELIC:
+ nRet = ScriptType::LATIN;
+ break;
+ case USCRIPT_BOPOMOFO:
+ case USCRIPT_HAN:
+ case USCRIPT_HANGUL:
+ case USCRIPT_HIRAGANA:
+ case USCRIPT_KATAKANA:
+ case USCRIPT_YI:
+ case USCRIPT_SIMPLIFIED_HAN:
+ case USCRIPT_TRADITIONAL_HAN:
+ case USCRIPT_JAPANESE:
+ case USCRIPT_KOREAN:
+ case USCRIPT_TANGUT:
+ case USCRIPT_KHITAN_SMALL_SCRIPT:
+ nRet = ScriptType::ASIAN;
+ break;
+ case USCRIPT_ARABIC:
+ case USCRIPT_BENGALI:
+ case USCRIPT_DESERET:
+ case USCRIPT_DEVANAGARI:
+ case USCRIPT_ETHIOPIC:
+ case USCRIPT_GUJARATI:
+ case USCRIPT_GURMUKHI:
+ case USCRIPT_HEBREW:
+ case USCRIPT_KANNADA:
+ case USCRIPT_KHMER:
+ case USCRIPT_LAO:
+ case USCRIPT_MALAYALAM:
+ case USCRIPT_MONGOLIAN:
+ case USCRIPT_MYANMAR:
+ case USCRIPT_ORIYA:
+ case USCRIPT_SINHALA:
+ case USCRIPT_SYRIAC:
+ case USCRIPT_TAMIL:
+ case USCRIPT_TELUGU:
+ case USCRIPT_THAANA:
+ case USCRIPT_THAI:
+ case USCRIPT_TIBETAN:
+ case USCRIPT_TAGALOG:
+ case USCRIPT_HANUNOO:
+ case USCRIPT_BUHID:
+ case USCRIPT_TAGBANWA:
+ case USCRIPT_LIMBU:
+ case USCRIPT_LINEAR_B:
+ case USCRIPT_TAI_LE:
+ case USCRIPT_UGARITIC:
+ case USCRIPT_BUGINESE:
+ case USCRIPT_KHAROSHTHI:
+ case USCRIPT_SYLOTI_NAGRI:
+ case USCRIPT_NEW_TAI_LUE:
+ case USCRIPT_TIFINAGH:
+ case USCRIPT_OLD_PERSIAN:
+ case USCRIPT_BALINESE:
+ case USCRIPT_BATAK:
+ case USCRIPT_BLISSYMBOLS:
+ case USCRIPT_BRAHMI:
+ case USCRIPT_CHAM:
+ case USCRIPT_DEMOTIC_EGYPTIAN:
+ case USCRIPT_HIERATIC_EGYPTIAN:
+ case USCRIPT_EGYPTIAN_HIEROGLYPHS:
+ case USCRIPT_KHUTSURI:
+ case USCRIPT_PAHAWH_HMONG:
+ case USCRIPT_HARAPPAN_INDUS:
+ case USCRIPT_JAVANESE:
+ case USCRIPT_KAYAH_LI:
+ case USCRIPT_LEPCHA:
+ case USCRIPT_LINEAR_A:
+ case USCRIPT_MANDAEAN:
+ case USCRIPT_MAYAN_HIEROGLYPHS:
+ case USCRIPT_MEROITIC:
+ case USCRIPT_NKO:
+ case USCRIPT_ORKHON:
+ case USCRIPT_OLD_PERMIC:
+ case USCRIPT_PHAGS_PA:
+ case USCRIPT_PHOENICIAN:
+ case USCRIPT_PHONETIC_POLLARD:
+ case USCRIPT_RONGORONGO:
+ case USCRIPT_SARATI:
+ case USCRIPT_ESTRANGELO_SYRIAC:
+ case USCRIPT_WESTERN_SYRIAC:
+ case USCRIPT_EASTERN_SYRIAC:
+ case USCRIPT_TENGWAR:
+ case USCRIPT_VAI:
+ case USCRIPT_VISIBLE_SPEECH:
+ case USCRIPT_CUNEIFORM:
+ case USCRIPT_CARIAN:
+ case USCRIPT_LANNA:
+ case USCRIPT_LYCIAN:
+ case USCRIPT_LYDIAN:
+ case USCRIPT_OL_CHIKI:
+ case USCRIPT_REJANG:
+ case USCRIPT_SAURASHTRA:
+ case USCRIPT_SIGN_WRITING:
+ case USCRIPT_SUNDANESE:
+ case USCRIPT_MOON:
+ case USCRIPT_MEITEI_MAYEK:
+ case USCRIPT_IMPERIAL_ARAMAIC:
+ case USCRIPT_AVESTAN:
+ case USCRIPT_CHAKMA:
+ case USCRIPT_KAITHI:
+ case USCRIPT_MANICHAEAN:
+ case USCRIPT_INSCRIPTIONAL_PAHLAVI:
+ case USCRIPT_PSALTER_PAHLAVI:
+ case USCRIPT_BOOK_PAHLAVI:
+ case USCRIPT_INSCRIPTIONAL_PARTHIAN:
+ case USCRIPT_SAMARITAN:
+ case USCRIPT_TAI_VIET:
+ case USCRIPT_BAMUM:
+ case USCRIPT_LISU:
+ case USCRIPT_NAKHI_GEBA:
+ case USCRIPT_OLD_SOUTH_ARABIAN:
+ case USCRIPT_BASSA_VAH:
+ case USCRIPT_DUPLOYAN_SHORTAND:
+ case USCRIPT_ELBASAN:
+ case USCRIPT_GRANTHA:
+ case USCRIPT_KPELLE:
+ case USCRIPT_LOMA:
+ case USCRIPT_MENDE:
+ case USCRIPT_MEROITIC_CURSIVE:
+ case USCRIPT_OLD_NORTH_ARABIAN:
+ case USCRIPT_NABATAEAN:
+ case USCRIPT_PALMYRENE:
+ case USCRIPT_SINDHI:
+ case USCRIPT_WARANG_CITI:
+ default: // anything new is going to be pretty wild
+ nRet = ScriptType::COMPLEX;
+ break;
+ }
+ return nRet;
+}
+
+sal_Int16 unicode::getScriptClassFromLanguageTag( const LanguageTag& rLanguageTag )
+{
+ constexpr int32_t nBuf = 42;
+ UScriptCode aBuf[nBuf];
+ if (rLanguageTag.hasScript())
+ {
+ aBuf[0] = static_cast<UScriptCode>(u_getPropertyValueEnum( UCHAR_SCRIPT,
+ OUStringToOString( rLanguageTag.getScript(), RTL_TEXTENCODING_ASCII_US).getStr()));
+ }
+ else
+ {
+ OUString aName;
+ if (rLanguageTag.getCountry().isEmpty())
+ aName = rLanguageTag.getLanguage();
+ else
+ aName = rLanguageTag.getLanguage() + "-" + rLanguageTag.getCountry();
+ UErrorCode status = U_ZERO_ERROR;
+ const int32_t nScripts = uscript_getCode(
+ OUStringToOString( aName, RTL_TEXTENCODING_ASCII_US).getStr(),
+ aBuf, nBuf, &status);
+ // U_BUFFER_OVERFLOW_ERROR would be set with too many scripts for buffer
+ // and required capacity returned, but really..
+ if (nScripts == 0 || !U_SUCCESS(status))
+ return css::i18n::ScriptType::LATIN;
+ }
+ return getScriptClassFromUScriptCode( aBuf[0]);
+}
+
+OString unicode::getExemplarLanguageForUScriptCode(UScriptCode eScript)
+{
+ OString sRet;
+ switch (eScript)
+ {
+ case USCRIPT_CODE_LIMIT:
+ case USCRIPT_INVALID_CODE:
+ sRet = "zxx"_ostr;
+ break;
+ case USCRIPT_COMMON:
+ case USCRIPT_INHERITED:
+ sRet = "und"_ostr;
+ break;
+ case USCRIPT_MATHEMATICAL_NOTATION:
+ case USCRIPT_SYMBOLS:
+ sRet = "zxx"_ostr;
+ break;
+ case USCRIPT_UNWRITTEN_LANGUAGES:
+ case USCRIPT_UNKNOWN:
+ sRet = "und"_ostr;
+ break;
+ case USCRIPT_ARABIC:
+ sRet = "ar"_ostr;
+ break;
+ case USCRIPT_ARMENIAN:
+ sRet = "hy"_ostr;
+ break;
+ case USCRIPT_BENGALI:
+ sRet = "bn"_ostr;
+ break;
+ case USCRIPT_BOPOMOFO:
+ sRet = "zh"_ostr;
+ break;
+ case USCRIPT_CHEROKEE:
+ sRet = "chr"_ostr;
+ break;
+ case USCRIPT_COPTIC:
+ sRet = "cop"_ostr;
+ break;
+ case USCRIPT_CYRILLIC:
+ sRet = "ru"_ostr;
+ break;
+ case USCRIPT_DESERET:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_DEVANAGARI:
+ sRet = "hi"_ostr;
+ break;
+ case USCRIPT_ETHIOPIC:
+ sRet = "am"_ostr;
+ break;
+ case USCRIPT_GEORGIAN:
+ sRet = "ka"_ostr;
+ break;
+ case USCRIPT_GOTHIC:
+ sRet = "got"_ostr;
+ break;
+ case USCRIPT_GREEK:
+ sRet = "el"_ostr;
+ break;
+ case USCRIPT_GUJARATI:
+ sRet = "gu"_ostr;
+ break;
+ case USCRIPT_GURMUKHI:
+ sRet = "pa"_ostr;
+ break;
+ case USCRIPT_HAN:
+ sRet = "zh"_ostr;
+ break;
+ case USCRIPT_HANGUL:
+ sRet = "ko"_ostr;
+ break;
+ case USCRIPT_HEBREW:
+ sRet = "hr"_ostr;
+ break;
+ case USCRIPT_HIRAGANA:
+ sRet = "ja"_ostr;
+ break;
+ case USCRIPT_KANNADA:
+ sRet = "kn"_ostr;
+ break;
+ case USCRIPT_KATAKANA:
+ sRet = "ja"_ostr;
+ break;
+ case USCRIPT_KHMER:
+ sRet = "km"_ostr;
+ break;
+ case USCRIPT_LAO:
+ sRet = "lo"_ostr;
+ break;
+ case USCRIPT_LATIN:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_MALAYALAM:
+ sRet = "ml"_ostr;
+ break;
+ case USCRIPT_MONGOLIAN:
+ sRet = "mn"_ostr;
+ break;
+ case USCRIPT_MYANMAR:
+ sRet = "my"_ostr;
+ break;
+ case USCRIPT_OGHAM:
+ sRet = "pgl"_ostr;
+ break;
+ case USCRIPT_OLD_ITALIC:
+ sRet = "osc"_ostr;
+ break;
+ case USCRIPT_ORIYA:
+ sRet = "or"_ostr;
+ break;
+ case USCRIPT_RUNIC:
+ sRet = "ang"_ostr;
+ break;
+ case USCRIPT_SINHALA:
+ sRet = "si"_ostr;
+ break;
+ case USCRIPT_SYRIAC:
+ sRet = "syr"_ostr;
+ break;
+ case USCRIPT_TAMIL:
+ sRet = "ta"_ostr;
+ break;
+ case USCRIPT_TELUGU:
+ sRet = "te"_ostr;
+ break;
+ case USCRIPT_THAANA:
+ sRet = "dv"_ostr;
+ break;
+ case USCRIPT_THAI:
+ sRet = "th"_ostr;
+ break;
+ case USCRIPT_TIBETAN:
+ sRet = "bo"_ostr;
+ break;
+ case USCRIPT_CANADIAN_ABORIGINAL:
+ sRet = "iu"_ostr;
+ break;
+ case USCRIPT_YI:
+ sRet = "ii"_ostr;
+ break;
+ case USCRIPT_TAGALOG:
+ sRet = "tl"_ostr;
+ break;
+ case USCRIPT_HANUNOO:
+ sRet = "hnn"_ostr;
+ break;
+ case USCRIPT_BUHID:
+ sRet = "bku"_ostr;
+ break;
+ case USCRIPT_TAGBANWA:
+ sRet = "tbw"_ostr;
+ break;
+ case USCRIPT_BRAILLE:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_CYPRIOT:
+ sRet = "ecy"_ostr;
+ break;
+ case USCRIPT_LIMBU:
+ sRet = "lif"_ostr;
+ break;
+ case USCRIPT_LINEAR_B:
+ sRet = "gmy"_ostr;
+ break;
+ case USCRIPT_OSMANYA:
+ sRet = "so"_ostr;
+ break;
+ case USCRIPT_SHAVIAN:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_TAI_LE:
+ sRet = "tdd"_ostr;
+ break;
+ case USCRIPT_UGARITIC:
+ sRet = "uga"_ostr;
+ break;
+ case USCRIPT_KATAKANA_OR_HIRAGANA:
+ sRet = "ja"_ostr;
+ break;
+ case USCRIPT_BUGINESE:
+ sRet = "bug"_ostr;
+ break;
+ case USCRIPT_GLAGOLITIC:
+ sRet = "ch"_ostr;
+ break;
+ case USCRIPT_KHAROSHTHI:
+ sRet = "pra"_ostr;
+ break;
+ case USCRIPT_SYLOTI_NAGRI:
+ sRet = "syl"_ostr;
+ break;
+ case USCRIPT_NEW_TAI_LUE:
+ sRet = "khb"_ostr;
+ break;
+ case USCRIPT_TIFINAGH:
+ sRet = "tmh"_ostr;
+ break;
+ case USCRIPT_OLD_PERSIAN:
+ sRet = "peo"_ostr;
+ break;
+ case USCRIPT_BALINESE:
+ sRet = "ban"_ostr;
+ break;
+ case USCRIPT_BATAK:
+ sRet = "btk"_ostr;
+ break;
+ case USCRIPT_BLISSYMBOLS:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_BRAHMI:
+ sRet = "pra"_ostr;
+ break;
+ case USCRIPT_CHAM:
+ sRet = "cja"_ostr;
+ break;
+ case USCRIPT_CIRTH:
+ sRet = "sjn"_ostr;
+ break;
+ case USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC:
+ sRet = "cu"_ostr;
+ break;
+ case USCRIPT_DEMOTIC_EGYPTIAN:
+ case USCRIPT_HIERATIC_EGYPTIAN:
+ case USCRIPT_EGYPTIAN_HIEROGLYPHS:
+ sRet = "egy"_ostr;
+ break;
+ case USCRIPT_KHUTSURI:
+ sRet = "ka"_ostr;
+ break;
+ case USCRIPT_SIMPLIFIED_HAN:
+ sRet = "zh"_ostr;
+ break;
+ case USCRIPT_TRADITIONAL_HAN:
+ sRet = "zh"_ostr;
+ break;
+ case USCRIPT_PAHAWH_HMONG:
+ sRet = "blu"_ostr;
+ break;
+ case USCRIPT_OLD_HUNGARIAN:
+ sRet = "ohu"_ostr;
+ break;
+ case USCRIPT_HARAPPAN_INDUS:
+ sRet = "xiv"_ostr;
+ break;
+ case USCRIPT_JAVANESE:
+ sRet = "kaw"_ostr;
+ break;
+ case USCRIPT_KAYAH_LI:
+ sRet = "eky"_ostr;
+ break;
+ case USCRIPT_LATIN_FRAKTUR:
+ sRet = "de"_ostr;
+ break;
+ case USCRIPT_LATIN_GAELIC:
+ sRet = "ga"_ostr;
+ break;
+ case USCRIPT_LEPCHA:
+ sRet = "lep"_ostr;
+ break;
+ case USCRIPT_LINEAR_A:
+ sRet = "ecr"_ostr;
+ break;
+ case USCRIPT_MAYAN_HIEROGLYPHS:
+ sRet = "myn"_ostr;
+ break;
+ case USCRIPT_MEROITIC:
+ sRet = "xmr"_ostr;
+ break;
+ case USCRIPT_NKO:
+ sRet = "nqo"_ostr;
+ break;
+ case USCRIPT_ORKHON:
+ sRet = "otk"_ostr;
+ break;
+ case USCRIPT_OLD_PERMIC:
+ sRet = "kv"_ostr;
+ break;
+ case USCRIPT_PHAGS_PA:
+ sRet = "xng"_ostr;
+ break;
+ case USCRIPT_PHOENICIAN:
+ sRet = "phn"_ostr;
+ break;
+ case USCRIPT_PHONETIC_POLLARD:
+ sRet = "hmd"_ostr;
+ break;
+ case USCRIPT_RONGORONGO:
+ sRet = "rap"_ostr;
+ break;
+ case USCRIPT_SARATI:
+ sRet = "qya"_ostr;
+ break;
+ case USCRIPT_ESTRANGELO_SYRIAC:
+ sRet = "syr"_ostr;
+ break;
+ case USCRIPT_WESTERN_SYRIAC:
+ sRet = "tru"_ostr;
+ break;
+ case USCRIPT_EASTERN_SYRIAC:
+ sRet = "aii"_ostr;
+ break;
+ case USCRIPT_TENGWAR:
+ sRet = "sjn"_ostr;
+ break;
+ case USCRIPT_VAI:
+ sRet = "vai"_ostr;
+ break;
+ case USCRIPT_VISIBLE_SPEECH:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_CUNEIFORM:
+ sRet = "akk"_ostr;
+ break;
+ case USCRIPT_CARIAN:
+ sRet = "xcr"_ostr;
+ break;
+ case USCRIPT_JAPANESE:
+ sRet = "ja"_ostr;
+ break;
+ case USCRIPT_LANNA:
+ sRet = "nod"_ostr;
+ break;
+ case USCRIPT_LYCIAN:
+ sRet = "xlc"_ostr;
+ break;
+ case USCRIPT_LYDIAN:
+ sRet = "xld"_ostr;
+ break;
+ case USCRIPT_OL_CHIKI:
+ sRet = "sat"_ostr;
+ break;
+ case USCRIPT_REJANG:
+ sRet = "rej"_ostr;
+ break;
+ case USCRIPT_SAURASHTRA:
+ sRet = "saz"_ostr;
+ break;
+ case USCRIPT_SIGN_WRITING:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_SUNDANESE:
+ sRet = "su"_ostr;
+ break;
+ case USCRIPT_MOON:
+ sRet = "en"_ostr;
+ break;
+ case USCRIPT_MEITEI_MAYEK:
+ sRet = "mni"_ostr;
+ break;
+ case USCRIPT_IMPERIAL_ARAMAIC:
+ sRet = "arc"_ostr;
+ break;
+ case USCRIPT_AVESTAN:
+ sRet = "ae"_ostr;
+ break;
+ case USCRIPT_CHAKMA:
+ sRet = "ccp"_ostr;
+ break;
+ case USCRIPT_KOREAN:
+ sRet = "ko"_ostr;
+ break;
+ case USCRIPT_KAITHI:
+ sRet = "awa"_ostr;
+ break;
+ case USCRIPT_MANICHAEAN:
+ sRet = "xmn"_ostr;
+ break;
+ case USCRIPT_INSCRIPTIONAL_PAHLAVI:
+ case USCRIPT_PSALTER_PAHLAVI:
+ case USCRIPT_BOOK_PAHLAVI:
+ case USCRIPT_INSCRIPTIONAL_PARTHIAN:
+ sRet = "xpr"_ostr;
+ break;
+ case USCRIPT_SAMARITAN:
+ sRet = "heb"_ostr;
+ break;
+ case USCRIPT_TAI_VIET:
+ sRet = "blt"_ostr;
+ break;
+ case USCRIPT_MANDAEAN: /* Aliased to USCRIPT_MANDAIC in icu 4.6. */
+ sRet = "mic"_ostr;
+ break;
+ case USCRIPT_NABATAEAN:
+ sRet = "mis-Nbat"_ostr; // Uncoded with script
+ break;
+ case USCRIPT_PALMYRENE:
+ sRet = "mis-Palm"_ostr; // Uncoded with script
+ break;
+ case USCRIPT_BAMUM:
+ sRet = "bax"_ostr;
+ break;
+ case USCRIPT_LISU:
+ sRet = "lis"_ostr;
+ break;
+ case USCRIPT_NAKHI_GEBA:
+ sRet = "nxq"_ostr;
+ break;
+ case USCRIPT_OLD_SOUTH_ARABIAN:
+ sRet = "xsa"_ostr;
+ break;
+ case USCRIPT_BASSA_VAH:
+ sRet = "bsq"_ostr;
+ break;
+ case USCRIPT_DUPLOYAN_SHORTAND:
+ sRet = "fr"_ostr;
+ break;
+ case USCRIPT_ELBASAN:
+ sRet = "sq"_ostr;
+ break;
+ case USCRIPT_GRANTHA:
+ sRet = "ta"_ostr;
+ break;
+ case USCRIPT_KPELLE:
+ sRet = "kpe"_ostr;
+ break;
+ case USCRIPT_LOMA:
+ sRet = "lom"_ostr;
+ break;
+ case USCRIPT_MENDE:
+ sRet = "men"_ostr;
+ break;
+ case USCRIPT_MEROITIC_CURSIVE:
+ sRet = "xmr"_ostr;
+ break;
+ case USCRIPT_OLD_NORTH_ARABIAN:
+ sRet = "xna"_ostr;
+ break;
+ case USCRIPT_SINDHI:
+ sRet = "sd"_ostr;
+ break;
+ case USCRIPT_WARANG_CITI:
+ sRet = "hoc"_ostr;
+ break;
+ case USCRIPT_AFAKA:
+ sRet = "djk"_ostr;
+ break;
+ case USCRIPT_JURCHEN:
+ sRet = "juc"_ostr;
+ break;
+ case USCRIPT_MRO:
+ sRet = "cmr"_ostr;
+ break;
+ case USCRIPT_NUSHU:
+ sRet = "mis-Nshu"_ostr; // Uncoded with script
+ break;
+ case USCRIPT_SHARADA:
+ sRet = "sa"_ostr;
+ break;
+ case USCRIPT_SORA_SOMPENG:
+ sRet = "srb"_ostr;
+ break;
+ case USCRIPT_TAKRI:
+ sRet = "doi"_ostr;
+ break;
+ case USCRIPT_TANGUT:
+ sRet = "txg"_ostr;
+ break;
+ case USCRIPT_WOLEAI:
+ sRet = "woe"_ostr;
+ break;
+ case USCRIPT_ANATOLIAN_HIEROGLYPHS:
+ sRet = "hlu"_ostr;
+ break;
+ case USCRIPT_KHOJKI:
+ sRet = "gu"_ostr;
+ break;
+ case USCRIPT_TIRHUTA:
+ sRet = "mai"_ostr;
+ break;
+ case USCRIPT_CAUCASIAN_ALBANIAN:
+ sRet = "xag"_ostr;
+ break;
+ case USCRIPT_MAHAJANI:
+ sRet = "mwr"_ostr;
+ break;
+ case USCRIPT_AHOM:
+ sRet = "aho"_ostr;
+ break;
+ case USCRIPT_HATRAN:
+ sRet = "qly-Hatr"_ostr;
+ break;
+ case USCRIPT_MODI:
+ sRet = "mr-Modi"_ostr;
+ break;
+ case USCRIPT_MULTANI:
+ sRet = "skr-Mutl"_ostr;
+ break;
+ case USCRIPT_PAU_CIN_HAU:
+ sRet = "ctd-Pauc"_ostr;
+ break;
+ case USCRIPT_SIDDHAM:
+ sRet = "sa-Sidd"_ostr;
+ break;
+ case USCRIPT_ADLAM:
+ sRet = "mis-Adlm"_ostr; // Adlam for Fulani, no language code
+ break;
+ case USCRIPT_BHAIKSUKI:
+ sRet = "mis-Bhks"_ostr; // Bhaiksuki for some Buddhist texts, no language code
+ break;
+ case USCRIPT_MARCHEN:
+ sRet = "bo-Marc"_ostr;
+ break;
+ case USCRIPT_NEWA:
+ sRet = "new-Newa"_ostr;
+ break;
+ case USCRIPT_OSAGE:
+ sRet = "osa-Osge"_ostr;
+ break;
+ case USCRIPT_HAN_WITH_BOPOMOFO:
+ sRet = "mis-Hanb"_ostr; // Han with Bopomofo, zh-Hanb ?
+ break;
+ case USCRIPT_JAMO:
+ sRet = "ko"_ostr; // Jamo - elements of Hangul Syllables
+ break;
+ case USCRIPT_SYMBOLS_EMOJI:
+ sRet = "mis-Zsye"_ostr; // Emoji variant
+ break;
+ case USCRIPT_MASARAM_GONDI:
+ sRet = "gon-Gonm"_ostr; // macro language code, could be wsg,esg,gno
+ break;
+ case USCRIPT_SOYOMBO:
+ sRet = "mn-Soyo"_ostr; // abugida to write Mongolian, also Tibetan and Sanskrit
+ break;
+ case USCRIPT_ZANABAZAR_SQUARE:
+ sRet = "mn-Zanb"_ostr; // abugida to write Mongolian
+ break;
+ case USCRIPT_DOGRA:
+ sRet = "dgo"_ostr; // Dogri proper
+ break;
+ case USCRIPT_GUNJALA_GONDI:
+ sRet = "wsg"_ostr; // Adilabad Gondi
+ break;
+ case USCRIPT_MAKASAR:
+ sRet = "mak"_ostr;
+ break;
+ case USCRIPT_MEDEFAIDRIN:
+ sRet = "dmf-Medf"_ostr;
+ break;
+ case USCRIPT_HANIFI_ROHINGYA:
+ sRet = "rhg"_ostr;
+ break;
+ case USCRIPT_SOGDIAN:
+ sRet = "sog"_ostr;
+ break;
+ case USCRIPT_OLD_SOGDIAN:
+ sRet = "sog"_ostr;
+ break;
+ case USCRIPT_ELYMAIC:
+ sRet = "arc-Elym"_ostr;
+ break;
+ case USCRIPT_NYIAKENG_PUACHUE_HMONG:
+ sRet = "hmn-Hmnp"_ostr; // macrolanguage code
+ break;
+ case USCRIPT_NANDINAGARI:
+ sRet = "sa-Nand"_ostr;
+ break;
+ case USCRIPT_WANCHO:
+ sRet = "nnp-Wcho"_ostr;
+ break;
+ case USCRIPT_CHORASMIAN:
+ sRet = "xco-Chrs"_ostr;
+ break;
+ case USCRIPT_DIVES_AKURU:
+ sRet = "dv-Diak"_ostr;
+ break;
+ case USCRIPT_KHITAN_SMALL_SCRIPT:
+ sRet = "zkt-Kits"_ostr;
+ break;
+ case USCRIPT_YEZIDI:
+ sRet = "kmr-Yezi"_ostr;
+ break;
+#if (U_ICU_VERSION_MAJOR_NUM >= 70)
+ case USCRIPT_CYPRO_MINOAN:
+ sRet = "mis-Cpmn"_ostr; // Uncoded with script
+ break;
+ case USCRIPT_OLD_UYGHUR:
+ sRet = "oui-Ougr"_ostr;
+ break;
+ case USCRIPT_TANGSA:
+ sRet = "nst-Tnsa"_ostr;
+ break;
+ case USCRIPT_TOTO:
+ sRet = "txo-Toto"_ostr;
+ break;
+ case USCRIPT_VITHKUQI:
+ sRet = "sq-Vith"_ostr; // macrolanguage code
+ break;
+#endif
+#if (U_ICU_VERSION_MAJOR_NUM >= 72)
+ case USCRIPT_KAWI:
+ sRet = "mis-Kawi"_ostr; // Uncoded with script
+ break;
+ case USCRIPT_NAG_MUNDARI:
+ sRet = "unr-Nagm"_ostr;
+ break;
+#endif
+ }
+ return sRet;
+}
+
+//Format a number as a percentage according to the rules of the given
+//language, e.g. 100 -> "100%" for en-US vs "100 %" for de-DE
+OUString unicode::formatPercent(double dNumber,
+ const LanguageTag &rLangTag)
+{
+ // get a currency formatter for this locale ID
+ UErrorCode errorCode=U_ZERO_ERROR;
+
+ LanguageTag aLangTag(rLangTag);
+
+ // As of CLDR Version 24 these languages were not listed as using spacing
+ // between number and % but are reported as such by our l10n groups
+ // http://www.unicode.org/cldr/charts/24/by_type/numbers.number_formatting_patterns.html
+ // so format using French which has the desired rules
+ if (aLangTag.getLanguage() == "es" || aLangTag.getLanguage() == "sl")
+ aLangTag.reset("fr-FR");
+
+ icu::Locale aLocale = LanguageTagIcu::getIcuLocale(aLangTag);
+
+ std::unique_ptr<icu::NumberFormat> xF(
+ icu::NumberFormat::createPercentInstance(aLocale, errorCode));
+ if(U_FAILURE(errorCode))
+ {
+ SAL_WARN("i18n", "icu::NumberFormat::createPercentInstance failed");
+ return OUString::number(dNumber) + "%";
+ }
+
+ icu::UnicodeString output;
+ xF->format(dNumber/100, output);
+ OUString aRet(reinterpret_cast<const sal_Unicode *>(output.getBuffer()),
+ output.length());
+ if (rLangTag.getLanguage() == "de")
+ {
+ //narrow no-break space instead of (normal) no-break space
+ return aRet.replace(0x00A0, 0x202F);
+ }
+ return aRet;
+}
+
+bool ToggleUnicodeCodepoint::AllowMoreInput(sal_Unicode uChar)
+{
+ //arbitrarily chosen maximum length allowed - normal max usage would be around 30.
+ if( maInput.getLength() > 255 )
+ mbAllowMoreChars = false;
+
+ if( !mbAllowMoreChars )
+ return false;
+
+ bool bPreventNonHex = false;
+ if( maInput.indexOf("U+") != -1 )
+ bPreventNonHex = true;
+
+ switch ( unicode::getUnicodeType(uChar) )
+ {
+ case css::i18n::UnicodeType::SURROGATE:
+ if( bPreventNonHex )
+ {
+ mbAllowMoreChars = false;
+ return false;
+ }
+
+ if( rtl::isLowSurrogate(uChar) && maUtf16.isEmpty() && maInput.isEmpty() )
+ {
+ maUtf16.append(uChar);
+ return true;
+ }
+ if( rtl::isHighSurrogate(uChar) && maInput.isEmpty() )
+ maUtf16.insert(0, uChar );
+ //end of hex strings, or unexpected order of high/low, so don't accept more
+ if( !maUtf16.isEmpty() )
+ maInput.append(maUtf16);
+ if( !maCombining.isEmpty() )
+ maInput.append(maCombining);
+ mbAllowMoreChars = false;
+ break;
+
+ case css::i18n::UnicodeType::NON_SPACING_MARK:
+ case css::i18n::UnicodeType::COMBINING_SPACING_MARK:
+ if( bPreventNonHex )
+ {
+ mbAllowMoreChars = false;
+ return false;
+ }
+
+ //extreme edge case: already invalid high/low surrogates with preceding combining chars, and now an extra combining mark.
+ if( !maUtf16.isEmpty() )
+ {
+ maInput = maUtf16;
+ if( !maCombining.isEmpty() )
+ maInput.append(maCombining);
+ mbAllowMoreChars = false;
+ return false;
+ }
+ maCombining.insert(0, uChar);
+ break;
+
+ default:
+ //extreme edge case: already invalid high/low surrogates with preceding combining chars, and now an extra character.
+ if( !maUtf16.isEmpty() )
+ {
+ maInput = maUtf16;
+ if( !maCombining.isEmpty() )
+ maInput.append(maCombining);
+ mbAllowMoreChars = false;
+ return false;
+ }
+
+ if( !maCombining.isEmpty() )
+ {
+ maCombining.insert(0, uChar);
+ maInput = maCombining;
+ mbAllowMoreChars = false;
+ return false;
+ }
+
+ // 0 - 1f are control characters. Do not process those.
+ if( uChar < 0x20 )
+ {
+ mbAllowMoreChars = false;
+ return false;
+ }
+
+ switch( uChar )
+ {
+ case 'u':
+ case 'U':
+ // U+ notation found. Continue looking for another one.
+ if( mbRequiresU )
+ {
+ mbRequiresU = false;
+ maInput.insert(0,"U+");
+ }
+ // treat as a normal character
+ else
+ {
+ mbAllowMoreChars = false;
+ if( !bPreventNonHex )
+ maInput.insertUtf32(0, uChar);
+ }
+ break;
+ case '+':
+ // + already found: skip when not U, or edge case of +U+xxxx
+ if( mbRequiresU || (maInput.indexOf("U+") == 0) )
+ mbAllowMoreChars = false;
+ // hex chars followed by '+' - now require a 'U'
+ else if ( !maInput.isEmpty() )
+ mbRequiresU = true;
+ // treat as a normal character
+ else
+ {
+ mbAllowMoreChars = false;
+ if( !bPreventNonHex )
+ maInput.insertUtf32(0, uChar);
+ }
+ break;
+ default:
+ // + already found. Since not U, cancel further input
+ if( mbRequiresU )
+ mbAllowMoreChars = false;
+ // maximum digits per notation is 8: only one notation
+ else if( maInput.indexOf("U+") == -1 && maInput.getLength() == 8 )
+ mbAllowMoreChars = false;
+ // maximum digits per notation is 8: previous notation found
+ else if( maInput.indexOf("U+") == 8 )
+ mbAllowMoreChars = false;
+ // a hex character. Add to string.
+ else if( rtl::isAsciiHexDigit(uChar) )
+ {
+ mbIsHexString = true;
+ maInput.insertUtf32(0, uChar);
+ }
+ // not a hex character: stop input. keep if it is the first input provided
+ else
+ {
+ mbAllowMoreChars = false;
+ if( maInput.isEmpty() )
+ maInput.insertUtf32(0, uChar);
+ }
+ }
+ }
+ return mbAllowMoreChars;
+}
+
+OUString ToggleUnicodeCodepoint::StringToReplace()
+{
+ if( maInput.isEmpty() )
+ {
+ //edge case - input finished with incomplete low surrogate or combining characters without a base
+ if( mbAllowMoreChars )
+ {
+ if( !maUtf16.isEmpty() )
+ maInput = maUtf16;
+ if( !maCombining.isEmpty() )
+ maInput.append(maCombining);
+ }
+ return maInput.toString();
+ }
+
+ if( !mbIsHexString )
+ return maInput.toString();
+
+ //this function potentially modifies the input string. Prevent addition of further characters
+ mbAllowMoreChars = false;
+
+ //validate unicode notation.
+ OUString sIn;
+ sal_uInt32 nUnicode = 0;
+ sal_Int32 nUPlus = maInput.indexOf("U+");
+ //if U+ notation used, strip off all extra chars added not in U+ notation
+ if( nUPlus != -1 )
+ {
+ maInput.remove(0, nUPlus);
+ sIn = maInput.copy(2).makeStringAndClear();
+ nUPlus = sIn.indexOf("U+");
+ }
+ else
+ sIn = maInput.toString();
+ while( nUPlus != -1 )
+ {
+ nUnicode = o3tl::toUInt32(sIn.subView(0, nUPlus), 16);
+ //prevent creating control characters or invalid Unicode values
+ if( !rtl::isUnicodeCodePoint(nUnicode) || nUnicode < 0x20 )
+ maInput = sIn.subView(nUPlus);
+ sIn = sIn.copy(nUPlus+2);
+ nUPlus = sIn.indexOf("U+");
+ }
+
+ nUnicode = sIn.toUInt32(16);
+ if( !rtl::isUnicodeCodePoint(nUnicode) || nUnicode < 0x20 )
+ maInput.truncate().append( sIn[sIn.getLength()-1] );
+ return maInput.toString();
+}
+
+sal_uInt32 ToggleUnicodeCodepoint::CharsToDelete()
+{
+ OUString sIn = StringToReplace();
+ sal_Int32 nPos = 0;
+ sal_uInt32 counter = 0;
+ while( nPos < sIn.getLength() )
+ {
+ sIn.iterateCodePoints(&nPos);
+ ++counter;
+ }
+ return counter;
+}
+
+OUString ToggleUnicodeCodepoint::ReplacementString()
+{
+ OUString sIn = StringToReplace();
+ OUStringBuffer output = "";
+ sal_Int32 nUPlus = sIn.indexOf("U+");
+ // convert from hex notation to glyph
+ if( nUPlus != -1 || (sIn.getLength() > 1 && mbIsHexString) )
+ {
+ sal_uInt32 nUnicode = 0;
+ if( nUPlus == 0)
+ {
+ sIn = sIn.copy(2);
+ nUPlus = sIn.indexOf("U+");
+ }
+ while( nUPlus > 0 )
+ {
+ nUnicode = o3tl::toUInt32(sIn.subView(0, nUPlus), 16);
+ output.appendUtf32( nUnicode );
+
+ sIn = sIn.copy(nUPlus+2);
+ nUPlus = sIn.indexOf("U+");
+ }
+ nUnicode = sIn.toUInt32(16);
+ output.appendUtf32( nUnicode );
+ }
+ // convert from glyph to hex notation
+ else
+ {
+ sal_Int32 nPos = 0;
+ while( nPos < sIn.getLength() )
+ {
+ OUStringBuffer aTmp = OUString::number(sIn.iterateCodePoints(&nPos),16);
+ //pad with zeros - minimum length of 4.
+ for( sal_Int32 i = 4 - aTmp.getLength(); i > 0; --i )
+ aTmp.insert( 0,"0" );
+ output.append( "U+" + aTmp );
+ }
+ }
+ return output.makeStringAndClear();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/unicode_data.h b/i18nutil/source/utility/unicode_data.h
new file mode 100644
index 0000000000..af23f95488
--- /dev/null
+++ b/i18nutil/source/utility/unicode_data.h
@@ -0,0 +1,763 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_UNICODE_DATA_H
+#define INCLUDED_I18NUTIL_SOURCE_UTILITY_UNICODE_DATA_H
+
+#include <sal/types.h>
+
+
+#define UnicodeDirectionNumberBlock 3
+
+const sal_Int8 UnicodeDirectionIndex[] = {
+ 0x03, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // 0000 - 07ff
+ 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, // 0800 - 0fff
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, // 1000 - 17ff
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, // 1800 - 1fff
+ 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, // 2000 - 27ff
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1f, // 2800 - 2fff
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3000 - 37ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3800 - 3fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 4000 - 47ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 4800 - 4fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 5000 - 57ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 5800 - 5fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 6000 - 67ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 6800 - 6fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 7000 - 77ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 7800 - 7fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 8000 - 87ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 8800 - 8fff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9000 - 97ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9800 - 9fff
+ 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, // a000 - a7ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // a800 - afff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // b000 - b7ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // b800 - bfff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // c000 - c7ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // c800 - cfff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // d000 - d7ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // d800 - dfff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // e000 - e7ff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // e800 - efff
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // f000 - f7ff
+ 0x00, 0x00, 0x00, 0x22, 0x02, 0x23, 0x24, 0x25, // f800 - ffff
+};
+
+
+const sal_Int8 UnicodeDirectionBlockValue[] = {
+ 0, 10, 13,
+};
+
+
+const sal_Int8 UnicodeDirectionValue[] = {
+ 18,18,18,18,18,18,18,18,18, 8, 7, 8, 9, 7,18,18,// 0000 - 000f
+ 18,18,18,18,18,18,18,18,18,18,18,18, 7, 7, 7, 8,// 0010 - 001f
+ 9,10,10, 4, 4, 4,10,10,10,10,10, 4, 6, 4, 6, 3,// 0020 - 002f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,10,10,10,10,10,// 0030 - 003f
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0040 - 004f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,10,// 0050 - 005f
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0060 - 006f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,18,// 0070 - 007f
+ 18,18,18,18,18, 7,18,18,18,18,18,18,18,18,18,18,// 0080 - 008f
+ 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,// 0090 - 009f
+ 6,10, 4, 4, 4, 4,10,10,10,10, 0,10,10,10,10,10,// 00a0 - 00af
+ 4, 4, 2, 2,10, 0,10,10,10, 2, 0,10,10,10,10,10,// 00b0 - 00bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 00c0 - 00cf
+ 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 00d0 - 00df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 00e0 - 00ef
+ 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 00f0 - 00ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0200 - 020f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0210 - 021f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0220 - 022f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0230 - 023f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0240 - 024f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0250 - 025f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0260 - 026f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0270 - 027f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0280 - 028f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0290 - 029f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 02a0 - 02af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0,// 02b0 - 02bf
+ 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 02c0 - 02cf
+ 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 02d0 - 02df
+ 0, 0, 0, 0, 0,10,10,10,10,10,10,10,10,10, 0, 0,// 02e0 - 02ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 02f0 - 02ff
+
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0300 - 030f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0310 - 031f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0320 - 032f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0330 - 033f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 0,// 0340 - 034f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0350 - 035f
+ 17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0360 - 036f
+ 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,// 0370 - 037f
+ 0, 0, 0, 0,10,10, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 0380 - 038f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0390 - 039f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03a0 - 03af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03b0 - 03bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03c0 - 03cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03d0 - 03df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03e0 - 03ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03f0 - 03ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0400 - 040f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0410 - 041f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0420 - 042f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0430 - 043f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0440 - 044f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0450 - 045f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0460 - 046f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0470 - 047f
+ 0, 0, 0,17,17,17,17, 0,17,17, 0, 0, 0, 0, 0, 0,// 0480 - 048f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0490 - 049f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04a0 - 04af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04b0 - 04bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04c0 - 04cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04d0 - 04df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04e0 - 04ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04f0 - 04ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0500 - 050f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0510 - 051f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0520 - 052f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0530 - 053f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0540 - 054f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0550 - 055f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0560 - 056f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0570 - 057f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0,// 0580 - 058f
+ 0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0590 - 059f
+ 17,17, 0,17,17,17,17,17,17,17,17,17,17,17,17,17,// 05a0 - 05af
+ 17,17,17,17,17,17,17,17,17,17, 0,17,17,17, 1,17,// 05b0 - 05bf
+ 1,17,17, 1,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 05c0 - 05cf
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,// 05d0 - 05df
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,// 05e0 - 05ef
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 05f0 - 05ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,// 0600 - 060f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13, 0, 0, 0,13,// 0610 - 061f
+ 0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0620 - 062f
+ 13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0, 0, 0,// 0630 - 063f
+ 13,13,13,13,13,13,13,13,13,13,13,17,17,17,17,17,// 0640 - 064f
+ 17,17,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0650 - 065f
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5,13, 0, 0,// 0660 - 066f
+ 17,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0670 - 067f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0680 - 068f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0690 - 069f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06a0 - 06af
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06b0 - 06bf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06c0 - 06cf
+ 13,13,13,13,13,13,17,17,17,17,17,17,17,17,17,17,// 06d0 - 06df
+ 17,17,17,17,17,13,13,17,17,10,17,17,17,17, 0, 0,// 06e0 - 06ef
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,13,13,13,13,13, 0,// 06f0 - 06ff
+
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13, 0,18,// 0700 - 070f
+ 13,17,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0710 - 071f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0,// 0720 - 072f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0730 - 073f
+ 17,17,17,17,17,17,17,17,17,17,17, 0, 0, 0, 0, 0,// 0740 - 074f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0750 - 075f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0760 - 076f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0770 - 077f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0780 - 078f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0790 - 079f
+ 13,13,13,13,13,13,17,17,17,17,17,17,17,17,17,17,// 07a0 - 07af
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07b0 - 07bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07c0 - 07cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07d0 - 07df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07e0 - 07ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07f0 - 07ff
+
+ 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0900 - 090f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0910 - 091f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0920 - 092f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0930 - 093f
+ 0,17,17,17,17,17,17,17,17, 0, 0, 0, 0,17, 0, 0,// 0940 - 094f
+ 0,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0950 - 095f
+ 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0960 - 096f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0970 - 097f
+ 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0980 - 098f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0990 - 099f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09a0 - 09af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 09b0 - 09bf
+ 0,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 09c0 - 09cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09d0 - 09df
+ 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09e0 - 09ef
+ 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09f0 - 09ff
+
+ 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a00 - 0a0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a10 - 0a1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a20 - 0a2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0a30 - 0a3f
+ 0,17,17, 0, 0, 0, 0,17,17, 0, 0,17,17,17, 0, 0,// 0a40 - 0a4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a50 - 0a5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a60 - 0a6f
+ 17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a70 - 0a7f
+ 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a80 - 0a8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a90 - 0a9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0aa0 - 0aaf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0ab0 - 0abf
+ 0,17,17,17,17,17, 0,17,17, 0, 0, 0, 0,17, 0, 0,// 0ac0 - 0acf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ad0 - 0adf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ae0 - 0aef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0af0 - 0aff
+
+ 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b00 - 0b0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b10 - 0b1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b20 - 0b2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,17,// 0b30 - 0b3f
+ 0,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0b40 - 0b4f
+ 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b50 - 0b5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b60 - 0b6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b70 - 0b7f
+ 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b80 - 0b8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b90 - 0b9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ba0 - 0baf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bb0 - 0bbf
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0bc0 - 0bcf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bd0 - 0bdf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0be0 - 0bef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bf0 - 0bff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c00 - 0c0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c10 - 0c1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c20 - 0c2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,// 0c30 - 0c3f
+ 17, 0, 0, 0, 0, 0,17,17,17, 0,17,17,17,17, 0, 0,// 0c40 - 0c4f
+ 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c50 - 0c5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c60 - 0c6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c70 - 0c7f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c80 - 0c8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c90 - 0c9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ca0 - 0caf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,// 0cb0 - 0cbf
+ 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0,17,17, 0, 0,// 0cc0 - 0ccf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0cd0 - 0cdf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ce0 - 0cef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0cf0 - 0cff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d00 - 0d0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d10 - 0d1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d20 - 0d2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d30 - 0d3f
+ 0,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0d40 - 0d4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d50 - 0d5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d60 - 0d6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d70 - 0d7f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d80 - 0d8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d90 - 0d9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0da0 - 0daf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0db0 - 0dbf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0,// 0dc0 - 0dcf
+ 0, 0,17,17,17, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0dd0 - 0ddf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0de0 - 0def
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0df0 - 0dff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e00 - 0e0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e10 - 0e1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e20 - 0e2f
+ 0,17, 0, 0,17,17,17,17,17,17,17, 0, 0, 0, 0, 4,// 0e30 - 0e3f
+ 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,17,17, 0,// 0e40 - 0e4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e50 - 0e5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e60 - 0e6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e70 - 0e7f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e80 - 0e8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e90 - 0e9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ea0 - 0eaf
+ 0,17, 0, 0,17,17,17,17,17,17, 0,17,17, 0, 0, 0,// 0eb0 - 0ebf
+ 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17, 0, 0,// 0ec0 - 0ecf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ed0 - 0edf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ee0 - 0eef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ef0 - 0eff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f00 - 0f0f
+ 0, 0, 0, 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0,// 0f10 - 0f1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f20 - 0f2f
+ 0, 0, 0, 0, 0,17, 0,17, 0,17,10,10,10,10, 0, 0,// 0f30 - 0f3f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f40 - 0f4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f50 - 0f5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f60 - 0f6f
+ 0,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 0,// 0f70 - 0f7f
+ 17,17,17,17,17, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0,// 0f80 - 0f8f
+ 17,17,17,17,17,17,17,17, 0,17,17,17,17,17,17,17,// 0f90 - 0f9f
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0fa0 - 0faf
+ 17,17,17,17,17,17,17,17,17,17,17,17,17, 0, 0, 0,// 0fb0 - 0fbf
+ 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fc0 - 0fcf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fd0 - 0fdf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fe0 - 0fef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ff0 - 0fff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1000 - 100f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1010 - 101f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,// 1020 - 102f
+ 17, 0,17, 0, 0, 0,17,17, 0,17, 0, 0, 0, 0, 0, 0,// 1030 - 103f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1040 - 104f
+ 0, 0, 0, 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0,// 1050 - 105f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1060 - 106f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1070 - 107f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1080 - 108f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1090 - 109f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10a0 - 10af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10b0 - 10bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10c0 - 10cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10d0 - 10df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10e0 - 10ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10f0 - 10ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1600 - 160f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1610 - 161f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1620 - 162f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1630 - 163f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1640 - 164f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1650 - 165f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1660 - 166f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1670 - 167f
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1680 - 168f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0,// 1690 - 169f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16a0 - 16af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16b0 - 16bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16c0 - 16cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16d0 - 16df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16e0 - 16ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16f0 - 16ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1700 - 170f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1710 - 171f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1720 - 172f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1730 - 173f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1740 - 174f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1750 - 175f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1760 - 176f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1770 - 177f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1780 - 178f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1790 - 179f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17a0 - 17af
+ 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,17, 0, 0,// 17b0 - 17bf
+ 0, 0, 0, 0, 0, 0,17, 0, 0,17,17,17,17,17,17,17,// 17c0 - 17cf
+ 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,// 17d0 - 17df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17e0 - 17ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17f0 - 17ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,18,18,18,18, 0,// 1800 - 180f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1810 - 181f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1820 - 182f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1830 - 183f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1840 - 184f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1850 - 185f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1860 - 186f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1870 - 187f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1880 - 188f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1890 - 189f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0,// 18a0 - 18af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18b0 - 18bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18c0 - 18cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18d0 - 18df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18e0 - 18ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18f0 - 18ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f00 - 1f0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f10 - 1f1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f20 - 1f2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f30 - 1f3f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f40 - 1f4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f50 - 1f5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f60 - 1f6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f70 - 1f7f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f80 - 1f8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f90 - 1f9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1fa0 - 1faf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,10,// 1fb0 - 1fbf
+ 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fc0 - 1fcf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fd0 - 1fdf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fe0 - 1fef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0,// 1ff0 - 1fff
+
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,18,18,18, 0, 1,// 2000 - 200f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2010 - 201f
+ 10,10,10,10,10,10,10,10, 9, 7,11,14,16,12,15, 9,// 2020 - 202f
+ 4, 4, 4, 4, 4,10,10,10,10,10,10,10,10,10,10,10,// 2030 - 203f
+ 10,10,10,10,10,10,10, 0,10,10,10,10,10,10, 0, 0,// 2040 - 204f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2050 - 205f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,18,18,18,18,18,18,// 2060 - 206f
+ 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 4, 4,10,10,10, 0,// 2070 - 207f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4,10,10,10, 0,// 2080 - 208f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2090 - 209f
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,// 20a0 - 20af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20b0 - 20bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20c0 - 20cf
+ 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 20d0 - 20df
+ 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20e0 - 20ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20f0 - 20ff
+
+ 10,10, 0,10,10,10,10, 0,10,10, 0, 0, 0, 0, 0, 0,// 2100 - 210f
+ 0, 0, 0, 0,10, 0,10,10,10, 0, 0, 0, 0, 0,10,10,// 2110 - 211f
+ 10,10,10,10, 0,10, 0,10, 0,10, 0, 0, 0, 0, 4, 0,// 2120 - 212f
+ 0, 0,10, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0,// 2130 - 213f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2140 - 214f
+ 0, 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2150 - 215f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2160 - 216f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2170 - 217f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2180 - 218f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2190 - 219f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21a0 - 21af
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21b0 - 21bf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21c0 - 21cf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21d0 - 21df
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21e0 - 21ef
+ 10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 21f0 - 21ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2200 - 220f
+ 10,10, 4, 4,10,10,10,10,10,10,10,10,10,10,10,10,// 2210 - 221f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2220 - 222f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2230 - 223f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2240 - 224f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2250 - 225f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2260 - 226f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2270 - 227f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2280 - 228f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2290 - 229f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22a0 - 22af
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22b0 - 22bf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22c0 - 22cf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22d0 - 22df
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22e0 - 22ef
+ 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 22f0 - 22ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2300 - 230f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2310 - 231f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2320 - 232f
+ 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2330 - 233f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2340 - 234f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2350 - 235f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2360 - 236f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,10,10,10,// 2370 - 237f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2380 - 238f
+ 10,10,10,10,10, 0,10,10,10,10,10, 0, 0, 0, 0, 0,// 2390 - 239f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23a0 - 23af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23b0 - 23bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23c0 - 23cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23d0 - 23df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23e0 - 23ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23f0 - 23ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2400 - 240f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2410 - 241f
+ 10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2420 - 242f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2430 - 243f
+ 10,10,10,10,10,10,10,10,10,10,10, 0, 0, 0, 0, 0,// 2440 - 244f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2450 - 245f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2460 - 246f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2470 - 247f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2480 - 248f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,// 2490 - 249f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24a0 - 24af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24b0 - 24bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24c0 - 24cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24d0 - 24df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,// 24e0 - 24ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24f0 - 24ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2500 - 250f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2510 - 251f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2520 - 252f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2530 - 253f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2540 - 254f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2550 - 255f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2560 - 256f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2570 - 257f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2580 - 258f
+ 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2590 - 259f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25a0 - 25af
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25b0 - 25bf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25c0 - 25cf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25d0 - 25df
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25e0 - 25ef
+ 10,10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0,// 25f0 - 25ff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2600 - 260f
+ 10,10,10,10, 0, 0, 0, 0, 0,10,10,10,10,10,10,10,// 2610 - 261f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2620 - 262f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2630 - 263f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2640 - 264f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2650 - 265f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2660 - 266f
+ 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2670 - 267f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2680 - 268f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2690 - 269f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26a0 - 26af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26b0 - 26bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26c0 - 26cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26d0 - 26df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26e0 - 26ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26f0 - 26ff
+
+ 0,10,10,10,10, 0,10,10,10,10, 0, 0,10,10,10,10,// 2700 - 270f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2710 - 271f
+ 10,10,10,10,10,10,10,10, 0,10,10,10,10,10,10,10,// 2720 - 272f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2730 - 273f
+ 10,10,10,10,10,10,10,10,10,10,10,10, 0,10, 0,10,// 2740 - 274f
+ 10,10,10, 0, 0, 0,10, 0,10,10,10,10,10,10,10, 0,// 2750 - 275f
+ 0,10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0,// 2760 - 276f
+ 0, 0, 0, 0, 0, 0,10,10,10,10,10,10,10,10,10,10,// 2770 - 277f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2780 - 278f
+ 10,10,10,10,10, 0, 0, 0,10,10,10,10,10,10,10,10,// 2790 - 279f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 27a0 - 27af
+ 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 0,// 27b0 - 27bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27c0 - 27cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27d0 - 27df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27e0 - 27ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27f0 - 27ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e00 - 2e0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e10 - 2e1f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e20 - 2e2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e30 - 2e3f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e40 - 2e4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e50 - 2e5f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e60 - 2e6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e70 - 2e7f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2e80 - 2e8f
+ 10,10,10,10,10,10,10,10,10,10, 0,10,10,10,10,10,// 2e90 - 2e9f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ea0 - 2eaf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2eb0 - 2ebf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ec0 - 2ecf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ed0 - 2edf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ee0 - 2eef
+ 10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2ef0 - 2eff
+
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f00 - 2f0f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f10 - 2f1f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f20 - 2f2f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f30 - 2f3f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f40 - 2f4f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f50 - 2f5f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f60 - 2f6f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f70 - 2f7f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f80 - 2f8f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f90 - 2f9f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fa0 - 2faf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fb0 - 2fbf
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fc0 - 2fcf
+ 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2fd0 - 2fdf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2fe0 - 2fef
+ 10,10,10,10,10,10,10,10,10,10,10,10, 0, 0, 0, 0,// 2ff0 - 2fff
+
+ 9,10,10,10,10, 0, 0, 0,10,10,10,10,10,10,10,10,// 3000 - 300f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 3010 - 301f
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,// 3020 - 302f
+ 10, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0,10,10,// 3030 - 303f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3040 - 304f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3050 - 305f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3060 - 306f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3070 - 307f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3080 - 308f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,10,10, 0, 0, 0,// 3090 - 309f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30a0 - 30af
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30b0 - 30bf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30c0 - 30cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30d0 - 30df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30e0 - 30ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0,// 30f0 - 30ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a400 - a40f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a410 - a41f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a420 - a42f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a430 - a43f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a440 - a44f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a450 - a45f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a460 - a46f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a470 - a47f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a480 - a48f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// a490 - a49f
+ 10,10, 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,// a4a0 - a4af
+ 10,10,10,10, 0,10,10,10,10,10,10,10,10,10,10,10,// a4b0 - a4bf
+ 10, 0,10,10,10, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4c0 - a4cf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4d0 - a4df
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4e0 - a4ef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4f0 - a4ff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fb00 - fb0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,17, 1,// fb10 - fb1f
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1,// fb20 - fb2f
+ 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0,// fb30 - fb3f
+ 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,// fb40 - fb4f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb50 - fb5f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb60 - fb6f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb70 - fb7f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb80 - fb8f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb90 - fb9f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fba0 - fbaf
+ 13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fbb0 - fbbf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fbc0 - fbcf
+ 0, 0, 0,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbd0 - fbdf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbe0 - fbef
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbf0 - fbff
+
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd00 - fd0f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd10 - fd1f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd20 - fd2f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,10,// fd30 - fd3f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fd40 - fd4f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd50 - fd5f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd60 - fd6f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd70 - fd7f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd80 - fd8f
+ 0, 0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd90 - fd9f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fda0 - fdaf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fdb0 - fdbf
+ 13,13,13,13,13,13,13,13, 0, 0, 0, 0, 0, 0, 0, 0,// fdc0 - fdcf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fdd0 - fddf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fde0 - fdef
+ 13,13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0, 0,// fdf0 - fdff
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe00 - fe0f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe10 - fe1f
+ 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe20 - fe2f
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// fe30 - fe3f
+ 10,10,10,10,10, 0, 0, 0, 0,10,10,10,10,10,10,10,// fe40 - fe4f
+ 6,10, 6, 0,10, 6,10,10,10,10,10,10,10,10,10, 4,// fe50 - fe5f
+ 10,10, 4, 4,10,10,10, 0,10, 4, 4,10, 0, 0, 0, 0,// fe60 - fe6f
+ 13,13,13, 0,13, 0,13,13,13,13,13,13,13,13,13,13,// fe70 - fe7f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fe80 - fe8f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fe90 - fe9f
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fea0 - feaf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// feb0 - febf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fec0 - fecf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fed0 - fedf
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fee0 - feef
+ 13,13,13,13,13,13,13,13,13,13,13,13,13, 0, 0,18,// fef0 - feff
+
+ 0,10,10, 4, 4, 4,10,10,10,10,10, 4, 6, 4, 6, 3,// ff00 - ff0f
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,10,10,10,10,10,// ff10 - ff1f
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff20 - ff2f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,10,// ff30 - ff3f
+ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff40 - ff4f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10, 0,// ff50 - ff5f
+ 0,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff60 - ff6f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff70 - ff7f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff80 - ff8f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff90 - ff9f
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffa0 - ffaf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffb0 - ffbf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffc0 - ffcf
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffd0 - ffdf
+ 4, 4,10,10,10, 4, 4, 0,10,10,10,10,10,10,10, 0,// ffe0 - ffef
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,18,18,18,10,10, 0, 0,// fff0 - ffff
+
+};
+
+
+#define UnicodeScriptTypeFrom 0
+#define UnicodeScriptTypeTo 1
+
+const sal_Unicode UnicodeScriptType[][2] = {
+ {0x0000, 0x007f}, // 0. Basic Latin
+ {0x0080, 0x00ff}, // 1. Latin-1 Supplement
+ {0x0100, 0x017f}, // 2. Latin Extended-A
+ {0x0180, 0x024f}, // 3. Latin Extended-B
+ {0x0250, 0x02af}, // 4. IPA Extensions
+ {0x02b0, 0x02ff}, // 5. Spacing Modifier Letters
+ {0x0300, 0x036f}, // 6. Combining Diacritical Marks
+ {0x0370, 0x03ff}, // 7. Greek
+ {0x0400, 0x04ff}, // 8. Cyrillic
+ {0x0530, 0x058f}, // 9. Armenian
+ {0x0590, 0x05ff}, // 10. Hebrew
+ {0x0600, 0x06ff}, // 11. Arabic
+ {0x0700, 0x074f}, // 12. Syriac
+ {0x0780, 0x07bf}, // 13. Thaana
+ {0x0900, 0x097f}, // 14. Devanagari
+ {0x0980, 0x09ff}, // 15. Bengali
+ {0x0a00, 0x0a7f}, // 16. Gurmukhi
+ {0x0a80, 0x0aff}, // 17. Gujarati
+ {0x0b00, 0x0b7f}, // 18. Odia
+ {0x0b80, 0x0bff}, // 19. Tamil
+ {0x0c00, 0x0c7f}, // 20. Telugu
+ {0x0c80, 0x0cff}, // 21. Kannada
+ {0x0d00, 0x0d7f}, // 22. Malayalam
+ {0x0d80, 0x0dff}, // 23. Sinhala
+ {0x0e00, 0x0e7f}, // 24. Thai
+ {0x0e80, 0x0eff}, // 25. Lao
+ {0x0f00, 0x0fff}, // 26. Tibetan
+ {0x1000, 0x109f}, // 27. Myanmar
+ {0x10a0, 0x10ff}, // 28. Georgian
+ {0x1100, 0x11ff}, // 29. Hangul Jamo
+ {0x1200, 0x137f}, // 30. Ethiopic
+ {0x13a0, 0x13ff}, // 31. Cherokee
+ {0x1400, 0x167f}, // 32. Unified Canadian Aboriginal Syllabics
+ {0x1680, 0x169f}, // 33. Ogham
+ {0x16a0, 0x16ff}, // 34. Runic
+ {0x1780, 0x17ff}, // 35. Khmer
+ {0x1800, 0x18af}, // 36. Mongolian
+ {0x1e00, 0x1eff}, // 37. Latin Extended Additional
+ {0x1f00, 0x1fff}, // 38. Greek Extended
+ {0x2000, 0x206f}, // 39. General Punctuation
+ {0x2070, 0x209f}, // 40. Superscripts and Subscripts
+ {0x20a0, 0x20cf}, // 41. Currency Symbols
+ {0x20d0, 0x20ff}, // 42. Combining Marks for Symbols
+ {0x2100, 0x214f}, // 43. Letterlike Symbols
+ {0x2150, 0x218f}, // 44. Number Forms
+ {0x2190, 0x21ff}, // 45. Arrows
+ {0x2200, 0x22ff}, // 46. Mathematical Operators
+ {0x2300, 0x23ff}, // 47. Miscellaneous Technical
+ {0x2400, 0x243f}, // 48. Control Pictures
+ {0x2440, 0x245f}, // 49. Optical Character Recognition
+ {0x2460, 0x24ff}, // 50. Enclosed Alphanumerics
+ {0x2500, 0x257f}, // 51. Box Drawing
+ {0x2580, 0x259f}, // 52. Block Elements
+ {0x25a0, 0x25ff}, // 53. Geometric Shapes
+ {0x2600, 0x26ff}, // 54. Miscellaneous Symbols
+ {0x2700, 0x27bf}, // 55. Dingbats
+ {0x2800, 0x28ff}, // 56. Braille Patterns
+ {0x2e80, 0x2eff}, // 57. CJK Radicals Supplement
+ {0x2f00, 0x2fdf}, // 58. Kangxi Radicals
+ {0x2ff0, 0x2fff}, // 59. Ideographic Description Characters
+ {0x3000, 0x303f}, // 60. CJK Symbols and Punctuation
+ {0x3040, 0x309f}, // 61. Hiragana
+ {0x30a0, 0x30ff}, // 62. Katakana
+ {0x3100, 0x312f}, // 63. Bopomofo
+ {0x3130, 0x318f}, // 64. Hangul Compatibility Jamo
+ {0x3190, 0x319f}, // 65. Kanbun
+ {0x31a0, 0x31bf}, // 66. Bopomofo Extended
+ {0x3200, 0x32ff}, // 67. Enclosed CJK Letters and Months
+ {0x3300, 0x33ff}, // 68. CJK Compatibility
+ {0x3400, 0x4db5}, // 69. CJK Unified Ideographs Extension A
+ {0x4e00, 0x9fff}, // 70. CJK Unified Ideographs
+ {0xa000, 0xa48f}, // 71. Yi Syllables
+ {0xa490, 0xa4cf}, // 72. Yi Radicals
+ {0xac00, 0xd7a3}, // 73. Hangul Syllables
+ {0xd800, 0xdb7f}, // 74. High Surrogates
+ {0xdb80, 0xdbff}, // 75. High Private Use Surrogates
+ {0xdc00, 0xdfff}, // 76. Low Surrogates
+ {0xe000, 0xf8ff}, // 77. Private Use
+ {0xf900, 0xfaff}, // 78. CJK Compatibility Ideographs
+ {0xfb00, 0xfb4f}, // 79. Alphabetic Presentation Forms
+ {0xfb50, 0xfdff}, // 80. Arabic Presentation Forms-A
+ {0xfe20, 0xfe2f}, // 81. Combining Half Marks
+ {0xfe30, 0xfe4f}, // 82. CJK Compatibility Forms
+ {0xfe50, 0xfe6f}, // 83. Small Form Variants
+ {0xfe70, 0xfefe}, // 84. Arabic Presentation Forms-B
+ {0xfeff, 0xfeff}, // 85. kNoScript
+ {0xff00, 0xffef}, // 85. Halfwidth and Fullwidth Forms
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/widthfolding.cxx b/i18nutil/source/utility/widthfolding.cxx
new file mode 100644
index 0000000000..6a1b52d161
--- /dev/null
+++ b/i18nutil/source/utility/widthfolding.cxx
@@ -0,0 +1,244 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <i18nutil/widthfolding.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include "widthfolding_data.h"
+
+using namespace com::sun::star::uno;
+
+
+namespace i18nutil {
+
+sal_Unicode widthfolding::decompose_ja_voiced_sound_marksChar2Char (sal_Unicode inChar)
+{
+ if (0x30a0 <= inChar && inChar <= 0x30ff) {
+ sal_Int16 i = inChar - 0x3040;
+ if (decomposition_table[i].decomposited_character_1)
+ return 0xFFFF;
+ }
+ return inChar;
+}
+
+/**
+ * Decompose Japanese specific voiced and semi-voiced sound marks.
+ */
+OUString widthfolding::decompose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >* pOffset )
+{
+ // Create a string buffer which can hold nCount * 2 + 1 characters.
+ // Its size may become double of nCount.
+ // The reference count is 1 now.
+ rtl_uString * newStr = rtl_uString_alloc(nCount * 2);
+
+ sal_Int32 *p = nullptr;
+ sal_Int32 position = 0;
+ if (pOffset) {
+ // Allocate double of nCount length to offset argument.
+ pOffset->realloc( nCount * 2 );
+ p = pOffset->getArray();
+ position = startPos;
+ }
+
+ // Prepare pointers of unicode character arrays.
+ const sal_Unicode* src = inStr.getStr() + startPos;
+ sal_Unicode* dst = newStr->buffer;
+
+ // Decomposition: GA --> KA + voice-mark
+ while (nCount -- > 0) {
+ sal_Unicode c = *src++;
+ // see http://charts.unicode.org/Web/U3040.html Hiragana (U+3040..U+309F)
+ // see http://charts.unicode.org/Web/U30A0.html Katakana (U+30A0..U+30FF)
+ // Hiragana is not applied to decomposition.
+ // Only Katakana is applied to decomposition
+ if (0x30a0 <= c && c <= 0x30ff) {
+ int i = int(c - 0x3040);
+ sal_Unicode first = decomposition_table[i].decomposited_character_1;
+ if (first != 0x0000) {
+ *dst ++ = first;
+ *dst ++ = decomposition_table[i].decomposited_character_2; // second
+ if (pOffset) {
+ *p ++ = position;
+ *p ++ = position ++;
+ }
+ continue;
+ }
+ }
+ *dst ++ = c;
+ if (pOffset)
+ *p ++ = position ++;
+ }
+ *dst = u'\0';
+
+ newStr->length = sal_Int32(dst - newStr->buffer);
+ if (pOffset)
+ pOffset->realloc(newStr->length);
+ return OUString(newStr, SAL_NO_ACQUIRE); // take ownership
+}
+
+oneToOneMapping& widthfolding::getfull2halfTable()
+{
+ static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_NORMAL);
+ table.makeIndex();
+ return table;
+}
+
+/**
+ * Compose Japanese specific voiced and semi-voiced sound marks.
+ */
+OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >* pOffset, sal_Int32 nFlags )
+{
+ // Create a string buffer which can hold nCount + 1 characters.
+ // Its size may become equal to nCount or smaller.
+ // The reference count is 1 now.
+ rtl_uString * newStr = rtl_uString_alloc(nCount);
+
+ // Prepare pointers of unicode character arrays.
+ const sal_Unicode* src = inStr.getStr() + startPos;
+ sal_Unicode* dst = newStr->buffer;
+
+ // This conversion algorithm requires at least one character.
+ if (nCount > 0) {
+
+ // .. .. KA VOICE .. ..
+ // ^ ^
+ // previousChar currentChar
+ // ^
+ // position
+ //
+ // will be converted to
+ // .. .. GA .. ..
+
+ sal_Int32 *p = nullptr;
+ sal_Int32 position = 0;
+ if (pOffset) {
+ // Allocate nCount length to offset argument.
+ pOffset->realloc( nCount );
+ p = pOffset->getArray();
+ position = startPos;
+ }
+
+ //
+ sal_Unicode previousChar = *src ++;
+ sal_Unicode currentChar;
+
+ // Composition: KA + voice-mark --> GA
+ while (-- nCount > 0) {
+ currentChar = *src ++;
+ // see http://charts.unicode.org/Web/U3040.html Hiragana (U+3040..U+309F)
+ // see http://charts.unicode.org/Web/U30A0.html Katakana (U+30A0..U+30FF)
+ // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK
+ // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ int j = currentChar - 0x3099; // 0x3099, 0x309a, 0x309b, 0x309c ?
+
+ if (2 <= j && j <= 3) // 0x309b or 0x309c
+ j -= 2;
+
+ if (0 <= j && j <= 1) {
+ // 0 addresses a code point regarding 0x3099 or 0x309b (voiced sound mark),
+ // 1 is 0x309a or 0x309c (semi-voiced sound mark)
+ int i = int(previousChar - 0x3040); // i acts as an index of array
+ bool bCompose = false;
+
+ if (0 <= i && i <= (0x30ff - 0x3040) && composition_table[i][j])
+ bCompose = true;
+
+ // not to use combined KATAKANA LETTER VU
+ if ( previousChar == 0x30a6 && (nFlags & WIDTHFOLDING_DONT_USE_COMBINED_VU) )
+ bCompose = false;
+
+ if( bCompose ){
+ if (pOffset) {
+ position ++;
+ *p ++ = position ++;
+ }
+ *dst ++ = composition_table[i][j];
+ previousChar = *src ++;
+ nCount --;
+ continue;
+ }
+ }
+ if (pOffset)
+ *p ++ = position ++;
+ *dst ++ = previousChar;
+ previousChar = currentChar;
+ }
+
+ if (nCount == 0) {
+ if (pOffset)
+ *p = position;
+ *dst ++ = previousChar;
+ }
+
+ *dst = u'\0';
+
+ newStr->length = sal_Int32(dst - newStr->buffer);
+ }
+ if (pOffset)
+ pOffset->realloc(newStr->length);
+ return OUString(newStr, SAL_NO_ACQUIRE); // take ownership
+}
+
+oneToOneMapping& widthfolding::gethalf2fullTable()
+{
+ static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_NORMAL);
+ table.makeIndex();
+ return table;
+}
+
+sal_Unicode widthfolding::getCompositionChar(sal_Unicode c1, sal_Unicode c2)
+{
+ return composition_table[c1 - 0x3040][c2 - 0x3099];
+}
+
+
+oneToOneMapping& widthfolding::getfull2halfTableForASC()
+{
+ static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_ASC_FUNCTION);
+ table.makeIndex();
+
+ return table;
+}
+
+oneToOneMapping& widthfolding::gethalf2fullTableForJIS()
+{
+ static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_JIS_FUNCTION);
+ table.makeIndex();
+
+ return table;
+}
+
+oneToOneMapping& widthfolding::getfullKana2halfKanaTable()
+{
+ static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_KATAKANA_ONLY);
+ table.makeIndex();
+ return table;
+}
+
+oneToOneMapping& widthfolding::gethalfKana2fullKanaTable()
+{
+ static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_KATAKANA_ONLY);
+ table.makeIndex();
+ return table;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/i18nutil/source/utility/widthfolding_data.h b/i18nutil/source/utility/widthfolding_data.h
new file mode 100644
index 0000000000..26ead65d04
--- /dev/null
+++ b/i18nutil/source/utility/widthfolding_data.h
@@ -0,0 +1,941 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_WIDTHFOLDING_DATA_H
+#define INCLUDED_I18NUTIL_SOURCE_UTILITY_WIDTHFOLDING_DATA_H
+
+#include <i18nutil/oneToOneMapping.hxx>
+
+namespace i18nutil {
+
+/*
+ Unicode Normalization Forms
+ http://www.unicode.org/unicode/reports/tr15/index.html
+ http://www.w3.org/International/charlint/
+*/
+
+typedef struct {
+ sal_Unicode decomposited_character_1;
+ sal_Unicode decomposited_character_2;
+} decomposition_table_entry_t;
+
+// bluedwarf: 0x3099 (COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)
+// => 0x309b (KATAKANA-HIRAGANA VOICED SOUND MARK)
+//
+// 0x309a (COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK)
+// => 0x309c (KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK)
+//
+// the combining characters shouldn't be used
+const decomposition_table_entry_t decomposition_table[] = {
+ { 0x0000, 0x0000 }, // 0x3040
+ { 0x0000, 0x0000 }, // 0x3041 HIRAGANA LETTER SMALL A
+ { 0x0000, 0x0000 }, // 0x3042 HIRAGANA LETTER A
+ { 0x0000, 0x0000 }, // 0x3043 HIRAGANA LETTER SMALL I
+ { 0x0000, 0x0000 }, // 0x3044 HIRAGANA LETTER I
+ { 0x0000, 0x0000 }, // 0x3045 HIRAGANA LETTER SMALL U
+ { 0x0000, 0x0000 }, // 0x3046 HIRAGANA LETTER U
+ { 0x0000, 0x0000 }, // 0x3047 HIRAGANA LETTER SMALL E
+ { 0x0000, 0x0000 }, // 0x3048 HIRAGANA LETTER E
+ { 0x0000, 0x0000 }, // 0x3049 HIRAGANA LETTER SMALL O
+ { 0x0000, 0x0000 }, // 0x304a HIRAGANA LETTER O
+ { 0x0000, 0x0000 }, // 0x304b HIRAGANA LETTER KA
+ { 0x304b, 0x309b }, // 0x304c HIRAGANA LETTER GA --> HIRAGANA LETTER KA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x304d HIRAGANA LETTER KI
+ { 0x304d, 0x309b }, // 0x304e HIRAGANA LETTER GI --> HIRAGANA LETTER KI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x304f HIRAGANA LETTER KU
+ { 0x304f, 0x309b }, // 0x3050 HIRAGANA LETTER GU --> HIRAGANA LETTER KU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3051 HIRAGANA LETTER KE
+ { 0x3051, 0x309b }, // 0x3052 HIRAGANA LETTER GE --> HIRAGANA LETTER KE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3053 HIRAGANA LETTER KO
+ { 0x3053, 0x309b }, // 0x3054 HIRAGANA LETTER GO --> HIRAGANA LETTER KO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3055 HIRAGANA LETTER SA
+ { 0x3055, 0x309b }, // 0x3056 HIRAGANA LETTER ZA --> HIRAGANA LETTER SA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3057 HIRAGANA LETTER SI
+ { 0x3057, 0x309b }, // 0x3058 HIRAGANA LETTER ZI --> HIRAGANA LETTER SI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3059 HIRAGANA LETTER SU
+ { 0x3059, 0x309b }, // 0x305a HIRAGANA LETTER ZU --> HIRAGANA LETTER SU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x305b HIRAGANA LETTER SE
+ { 0x305b, 0x309b }, // 0x305c HIRAGANA LETTER ZE --> HIRAGANA LETTER SE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x305d HIRAGANA LETTER SO
+ { 0x305d, 0x309b }, // 0x305e HIRAGANA LETTER ZO --> HIRAGANA LETTER SO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x305f HIRAGANA LETTER TA
+ { 0x305f, 0x309b }, // 0x3060 HIRAGANA LETTER DA --> HIRAGANA LETTER TA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3061 HIRAGANA LETTER TI
+ { 0x3061, 0x309b }, // 0x3062 HIRAGANA LETTER DI --> HIRAGANA LETTER TI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3063 HIRAGANA LETTER SMALL TU
+ { 0x0000, 0x0000 }, // 0x3064 HIRAGANA LETTER TU
+ { 0x3064, 0x309b }, // 0x3065 HIRAGANA LETTER DU --> HIRAGANA LETTER TU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3066 HIRAGANA LETTER TE
+ { 0x3066, 0x309b }, // 0x3067 HIRAGANA LETTER DE --> HIRAGANA LETTER TE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3068 HIRAGANA LETTER TO
+ { 0x3068, 0x309b }, // 0x3069 HIRAGANA LETTER DO --> HIRAGANA LETTER TO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x306a HIRAGANA LETTER NA
+ { 0x0000, 0x0000 }, // 0x306b HIRAGANA LETTER NI
+ { 0x0000, 0x0000 }, // 0x306c HIRAGANA LETTER NU
+ { 0x0000, 0x0000 }, // 0x306d HIRAGANA LETTER NE
+ { 0x0000, 0x0000 }, // 0x306e HIRAGANA LETTER NO
+ { 0x0000, 0x0000 }, // 0x306f HIRAGANA LETTER HA
+ { 0x306f, 0x309b }, // 0x3070 HIRAGANA LETTER BA --> HIRAGANA LETTER HA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x306f, 0x309c }, // 0x3071 HIRAGANA LETTER PA --> HIRAGANA LETTER HA + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3072 HIRAGANA LETTER HI
+ { 0x3072, 0x309b }, // 0x3073 HIRAGANA LETTER BI --> HIRAGANA LETTER HI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x3072, 0x309c }, // 0x3074 HIRAGANA LETTER PI --> HIRAGANA LETTER HI + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3075 HIRAGANA LETTER HU
+ { 0x3075, 0x309b }, // 0x3076 HIRAGANA LETTER BU --> HIRAGANA LETTER HU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x3075, 0x309c }, // 0x3077 HIRAGANA LETTER PU --> HIRAGANA LETTER HU + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3078 HIRAGANA LETTER HE
+ { 0x3078, 0x309b }, // 0x3079 HIRAGANA LETTER BE --> HIRAGANA LETTER HE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x3078, 0x309c }, // 0x307a HIRAGANA LETTER PE --> HIRAGANA LETTER HE + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x307b HIRAGANA LETTER HO
+ { 0x307b, 0x309b }, // 0x307c HIRAGANA LETTER BO --> HIRAGANA LETTER HO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x307b, 0x309c }, // 0x307d HIRAGANA LETTER PO --> HIRAGANA LETTER HO + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x307e HIRAGANA LETTER MA
+ { 0x0000, 0x0000 }, // 0x307f HIRAGANA LETTER MI
+ { 0x0000, 0x0000 }, // 0x3080 HIRAGANA LETTER MU
+ { 0x0000, 0x0000 }, // 0x3081 HIRAGANA LETTER ME
+ { 0x0000, 0x0000 }, // 0x3082 HIRAGANA LETTER MO
+ { 0x0000, 0x0000 }, // 0x3083 HIRAGANA LETTER SMALL YA
+ { 0x0000, 0x0000 }, // 0x3084 HIRAGANA LETTER YA
+ { 0x0000, 0x0000 }, // 0x3085 HIRAGANA LETTER SMALL YU
+ { 0x0000, 0x0000 }, // 0x3086 HIRAGANA LETTER YU
+ { 0x0000, 0x0000 }, // 0x3087 HIRAGANA LETTER SMALL YO
+ { 0x0000, 0x0000 }, // 0x3088 HIRAGANA LETTER YO
+ { 0x0000, 0x0000 }, // 0x3089 HIRAGANA LETTER RA
+ { 0x0000, 0x0000 }, // 0x308a HIRAGANA LETTER RI
+ { 0x0000, 0x0000 }, // 0x308b HIRAGANA LETTER RU
+ { 0x0000, 0x0000 }, // 0x308c HIRAGANA LETTER RE
+ { 0x0000, 0x0000 }, // 0x308d HIRAGANA LETTER RO
+ { 0x0000, 0x0000 }, // 0x308e HIRAGANA LETTER SMALL WA
+ { 0x0000, 0x0000 }, // 0x308f HIRAGANA LETTER WA
+ { 0x0000, 0x0000 }, // 0x3090 HIRAGANA LETTER WI
+ { 0x0000, 0x0000 }, // 0x3091 HIRAGANA LETTER WE
+ { 0x0000, 0x0000 }, // 0x3092 HIRAGANA LETTER WO
+ { 0x0000, 0x0000 }, // 0x3093 HIRAGANA LETTER N
+ { 0x3046, 0x309b }, // 0x3094 HIRAGANA LETTER VU --> HIRAGANA LETTER U + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x3095
+ { 0x0000, 0x0000 }, // 0x3096
+ { 0x0000, 0x0000 }, // 0x3097
+ { 0x0000, 0x0000 }, // 0x3098
+ { 0x0000, 0x0000 }, // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309d HIRAGANA ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x309e HIRAGANA VOICED ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x309f
+ { 0x0000, 0x0000 }, // 0x30a0
+ { 0x0000, 0x0000 }, // 0x30a1 KATAKANA LETTER SMALL A
+ { 0x0000, 0x0000 }, // 0x30a2 KATAKANA LETTER A
+ { 0x0000, 0x0000 }, // 0x30a3 KATAKANA LETTER SMALL I
+ { 0x0000, 0x0000 }, // 0x30a4 KATAKANA LETTER I
+ { 0x0000, 0x0000 }, // 0x30a5 KATAKANA LETTER SMALL U
+ { 0x0000, 0x0000 }, // 0x30a6 KATAKANA LETTER U
+ { 0x0000, 0x0000 }, // 0x30a7 KATAKANA LETTER SMALL E
+ { 0x0000, 0x0000 }, // 0x30a8 KATAKANA LETTER E
+ { 0x0000, 0x0000 }, // 0x30a9 KATAKANA LETTER SMALL O
+ { 0x0000, 0x0000 }, // 0x30aa KATAKANA LETTER O
+ { 0x0000, 0x0000 }, // 0x30ab KATAKANA LETTER KA
+ { 0x30ab, 0x309b }, // 0x30ac KATAKANA LETTER GA --> KATAKANA LETTER KA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30ad KATAKANA LETTER KI
+ { 0x30ad, 0x309b }, // 0x30ae KATAKANA LETTER GI --> KATAKANA LETTER KI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30af KATAKANA LETTER KU
+ { 0x30af, 0x309b }, // 0x30b0 KATAKANA LETTER GU --> KATAKANA LETTER KU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30b1 KATAKANA LETTER KE
+ { 0x30b1, 0x309b }, // 0x30b2 KATAKANA LETTER GE --> KATAKANA LETTER KE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30b3 KATAKANA LETTER KO
+ { 0x30b3, 0x309b }, // 0x30b4 KATAKANA LETTER GO --> KATAKANA LETTER KO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30b5 KATAKANA LETTER SA
+ { 0x30b5, 0x309b }, // 0x30b6 KATAKANA LETTER ZA --> KATAKANA LETTER SA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30b7 KATAKANA LETTER SI
+ { 0x30b7, 0x309b }, // 0x30b8 KATAKANA LETTER ZI --> KATAKANA LETTER SI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30b9 KATAKANA LETTER SU
+ { 0x30b9, 0x309b }, // 0x30ba KATAKANA LETTER ZU --> KATAKANA LETTER SU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30bb KATAKANA LETTER SE
+ { 0x30bb, 0x309b }, // 0x30bc KATAKANA LETTER ZE --> KATAKANA LETTER SE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30bd KATAKANA LETTER SO
+ { 0x30bd, 0x309b }, // 0x30be KATAKANA LETTER ZO --> KATAKANA LETTER SO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30bf KATAKANA LETTER TA
+ { 0x30bf, 0x309b }, // 0x30c0 KATAKANA LETTER DA --> KATAKANA LETTER TA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30c1 KATAKANA LETTER TI
+ { 0x30c1, 0x309b }, // 0x30c2 KATAKANA LETTER DI --> KATAKANA LETTER TI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30c3 KATAKANA LETTER SMALL TU
+ { 0x0000, 0x0000 }, // 0x30c4 KATAKANA LETTER TU
+ { 0x30c4, 0x309b }, // 0x30c5 KATAKANA LETTER DU --> KATAKANA LETTER TU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30c6 KATAKANA LETTER TE
+ { 0x30c6, 0x309b }, // 0x30c7 KATAKANA LETTER DE --> KATAKANA LETTER TE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30c8 KATAKANA LETTER TO
+ { 0x30c8, 0x309b }, // 0x30c9 KATAKANA LETTER DO --> KATAKANA LETTER TO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30ca KATAKANA LETTER NA
+ { 0x0000, 0x0000 }, // 0x30cb KATAKANA LETTER NI
+ { 0x0000, 0x0000 }, // 0x30cc KATAKANA LETTER NU
+ { 0x0000, 0x0000 }, // 0x30cd KATAKANA LETTER NE
+ { 0x0000, 0x0000 }, // 0x30ce KATAKANA LETTER NO
+ { 0x0000, 0x0000 }, // 0x30cf KATAKANA LETTER HA
+ { 0x30cf, 0x309b }, // 0x30d0 KATAKANA LETTER BA --> KATAKANA LETTER HA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30cf, 0x309c }, // 0x30d1 KATAKANA LETTER PA --> KATAKANA LETTER HA + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30d2 KATAKANA LETTER HI
+ { 0x30d2, 0x309b }, // 0x30d3 KATAKANA LETTER BI --> KATAKANA LETTER HI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30d2, 0x309c }, // 0x30d4 KATAKANA LETTER PI --> KATAKANA LETTER HI + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30d5 KATAKANA LETTER HU
+ { 0x30d5, 0x309b }, // 0x30d6 KATAKANA LETTER BU --> KATAKANA LETTER HU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30d5, 0x309c }, // 0x30d7 KATAKANA LETTER PU --> KATAKANA LETTER HU + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30d8 KATAKANA LETTER HE
+ { 0x30d8, 0x309b }, // 0x30d9 KATAKANA LETTER BE --> KATAKANA LETTER HE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30d8, 0x309c }, // 0x30da KATAKANA LETTER PE --> KATAKANA LETTER HE + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30db KATAKANA LETTER HO
+ { 0x30db, 0x309b }, // 0x30dc KATAKANA LETTER BO --> KATAKANA LETTER HO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30db, 0x309c }, // 0x30dd KATAKANA LETTER PO --> KATAKANA LETTER HO + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30de KATAKANA LETTER MA
+ { 0x0000, 0x0000 }, // 0x30df KATAKANA LETTER MI
+ { 0x0000, 0x0000 }, // 0x30e0 KATAKANA LETTER MU
+ { 0x0000, 0x0000 }, // 0x30e1 KATAKANA LETTER ME
+ { 0x0000, 0x0000 }, // 0x30e2 KATAKANA LETTER MO
+ { 0x0000, 0x0000 }, // 0x30e3 KATAKANA LETTER SMALL YA
+ { 0x0000, 0x0000 }, // 0x30e4 KATAKANA LETTER YA
+ { 0x0000, 0x0000 }, // 0x30e5 KATAKANA LETTER SMALL YU
+ { 0x0000, 0x0000 }, // 0x30e6 KATAKANA LETTER YU
+ { 0x0000, 0x0000 }, // 0x30e7 KATAKANA LETTER SMALL YO
+ { 0x0000, 0x0000 }, // 0x30e8 KATAKANA LETTER YO
+ { 0x0000, 0x0000 }, // 0x30e9 KATAKANA LETTER RA
+ { 0x0000, 0x0000 }, // 0x30ea KATAKANA LETTER RI
+ { 0x0000, 0x0000 }, // 0x30eb KATAKANA LETTER RU
+ { 0x0000, 0x0000 }, // 0x30ec KATAKANA LETTER RE
+ { 0x0000, 0x0000 }, // 0x30ed KATAKANA LETTER RO
+ { 0x0000, 0x0000 }, // 0x30ee KATAKANA LETTER SMALL WA
+ { 0x0000, 0x0000 }, // 0x30ef KATAKANA LETTER WA
+ { 0x0000, 0x0000 }, // 0x30f0 KATAKANA LETTER WI
+ { 0x0000, 0x0000 }, // 0x30f1 KATAKANA LETTER WE
+ { 0x0000, 0x0000 }, // 0x30f2 KATAKANA LETTER WO
+ { 0x0000, 0x0000 }, // 0x30f3 KATAKANA LETTER N
+ { 0x30a6, 0x309b }, // 0x30f4 KATAKANA LETTER VU --> KATAKANA LETTER U + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30f5 KATAKANA LETTER SMALL KA
+ { 0x0000, 0x0000 }, // 0x30f6 KATAKANA LETTER SMALL KE
+ { 0x30ef, 0x309b }, // 0x30f7 KATAKANA LETTER VA --> KATAKANA LETTER WA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30f0, 0x309b }, // 0x30f8 KATAKANA LETTER VI --> KATAKANA LETTER WI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30f1, 0x309b }, // 0x30f9 KATAKANA LETTER VE --> KATAKANA LETTER WE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x30f2, 0x309b }, // 0x30fa KATAKANA LETTER VO --> KATAKANA LETTER WO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30fb KATAKANA MIDDLE DOT
+ { 0x0000, 0x0000 }, // 0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30fd KATAKANA ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x30fe KATAKANA VOICED ITERATION MARK
+ { 0x0000, 0x0000 } // 0x30ff
+};
+
+
+/*
+ Halfwidth and Fullwidth Forms (U+FF00..U+FFEF)
+ ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt
+ ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html
+ http://charts.unicode.org/Web/UFF00.html
+*/
+
+#define FULL2HALF_NORMAL 0x01
+#define FULL2HALF_ASC_FUNCTION 0x02
+#define FULL2HALF_KATAKANA_ONLY 0x04
+
+UnicodePairWithFlag const full2half[] = {
+ { 0x2015, 0xFF70, FULL2HALF_ASC_FUNCTION }, // HORIZONTAL BAR --> KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ { 0x2018, 0x0060, FULL2HALF_ASC_FUNCTION }, // LEFT SINGLE QUOTATION MARK => GRAVE ACCENT
+ { 0x2019, 0x0027, FULL2HALF_ASC_FUNCTION }, // RIGHT SINGLE QUOTATION MARK => APOSTROPHE
+ { 0x201D, 0x0022, FULL2HALF_ASC_FUNCTION }, // RIGHT DOUBLE QUOTATION MARK => QUOTATION MARK
+ { 0x2190, 0xFFE9, FULL2HALF_NORMAL }, // LEFTWARDS ARROW --> HALFWIDTH LEFTWARDS ARROW
+ { 0x2191, 0xFFEA, FULL2HALF_NORMAL }, // UPWARDS ARROW --> HALFWIDTH UPWARDS ARROW
+ { 0x2192, 0xFFEB, FULL2HALF_NORMAL }, // RIGHTWARDS ARROW --> HALFWIDTH RIGHTWARDS ARROW
+ { 0x2193, 0xFFEC, FULL2HALF_NORMAL }, // DOWNWARDS ARROW --> HALFWIDTH DOWNWARDS ARROW
+ { 0x2502, 0xFFE8, FULL2HALF_NORMAL }, // BOX DRAWINGS LIGHT VERTICAL --> HALFWIDTH FORMS LIGHT VERTICAL
+ { 0x25A0, 0xFFED, FULL2HALF_NORMAL }, // BLACK SQUARE --> HALFWIDTH BLACK SQUARE
+ { 0x25CB, 0xFFEE, FULL2HALF_NORMAL }, // WHITE CIRCLE --> HALFWIDTH WHITE CIRCLE
+ { 0x3000, 0x0020, FULL2HALF_NORMAL }, // IDEOGRAPHIC SPACE --> SPACE
+ { 0x3001, 0xFF64, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // IDEOGRAPHIC COMMA --> HALFWIDTH IDEOGRAPHIC COMMA
+ { 0x3002, 0xFF61, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // IDEOGRAPHIC FULL STOP --> HALFWIDTH IDEOGRAPHIC FULL STOP
+ { 0x300C, 0xFF62, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // LEFT CORNER BRACKET --> HALFWIDTH LEFT CORNER BRACKET
+ { 0x300D, 0xFF63, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // RIGHT CORNER BRACKET --> HALFWIDTH RIGHT CORNER BRACKET
+ { 0x3099, 0xFF9E, FULL2HALF_NORMAL }, // COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK --> HALFWIDTH KATAKANA VOICED SOUND MARK
+ { 0x309A, 0xFF9F, FULL2HALF_NORMAL }, // COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK --> HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+
+// bluedwarf: Added normal (semi-)voiced sound mark
+ { 0x309B, 0xFF9E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA-HIRAGANA VOICED SOUND MARK --> HALFWIDTH KATAKANA VOICED SOUND MARK
+ { 0x309C, 0xFF9F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK --> HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+
+ { 0x30A1, 0xFF67, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL A --> HALFWIDTH KATAKANA LETTER SMALL A
+ { 0x30A2, 0xFF71, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER A --> HALFWIDTH KATAKANA LETTER A
+ { 0x30A3, 0xFF68, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL I --> HALFWIDTH KATAKANA LETTER SMALL I
+ { 0x30A4, 0xFF72, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER I --> HALFWIDTH KATAKANA LETTER I
+ { 0x30A5, 0xFF69, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL U --> HALFWIDTH KATAKANA LETTER SMALL U
+ { 0x30A6, 0xFF73, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER U --> HALFWIDTH KATAKANA LETTER U
+ { 0x30A7, 0xFF6A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL E --> HALFWIDTH KATAKANA LETTER SMALL E
+ { 0x30A8, 0xFF74, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER E --> HALFWIDTH KATAKANA LETTER E
+ { 0x30A9, 0xFF6B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL O --> HALFWIDTH KATAKANA LETTER SMALL O
+ { 0x30AA, 0xFF75, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER O --> HALFWIDTH KATAKANA LETTER O
+ { 0x30AB, 0xFF76, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KA --> HALFWIDTH KATAKANA LETTER KA
+ { 0x30AD, 0xFF77, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KI --> HALFWIDTH KATAKANA LETTER KI
+ { 0x30AF, 0xFF78, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KU --> HALFWIDTH KATAKANA LETTER KU
+ { 0x30B1, 0xFF79, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KE --> HALFWIDTH KATAKANA LETTER KE
+ { 0x30B3, 0xFF7A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KO --> HALFWIDTH KATAKANA LETTER KO
+ { 0x30B5, 0xFF7B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SA --> HALFWIDTH KATAKANA LETTER SA
+ { 0x30B7, 0xFF7C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SI --> HALFWIDTH KATAKANA LETTER SI
+ { 0x30B9, 0xFF7D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SU --> HALFWIDTH KATAKANA LETTER SU
+ { 0x30BB, 0xFF7E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SE --> HALFWIDTH KATAKANA LETTER SE
+ { 0x30BD, 0xFF7F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SO --> HALFWIDTH KATAKANA LETTER SO
+ { 0x30BF, 0xFF80, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TA --> HALFWIDTH KATAKANA LETTER TA
+ { 0x30C1, 0xFF81, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TI --> HALFWIDTH KATAKANA LETTER TI
+ { 0x30C3, 0xFF6F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL TU --> HALFWIDTH KATAKANA LETTER SMALL TU
+ { 0x30C4, 0xFF82, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TU --> HALFWIDTH KATAKANA LETTER TU
+ { 0x30C6, 0xFF83, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TE --> HALFWIDTH KATAKANA LETTER TE
+ { 0x30C8, 0xFF84, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TO --> HALFWIDTH KATAKANA LETTER TO
+ { 0x30CA, 0xFF85, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NA --> HALFWIDTH KATAKANA LETTER NA
+ { 0x30CB, 0xFF86, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NI --> HALFWIDTH KATAKANA LETTER NI
+ { 0x30CC, 0xFF87, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NU --> HALFWIDTH KATAKANA LETTER NU
+ { 0x30CD, 0xFF88, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NE --> HALFWIDTH KATAKANA LETTER NE
+ { 0x30CE, 0xFF89, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NO --> HALFWIDTH KATAKANA LETTER NO
+ { 0x30CF, 0xFF8A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HA --> HALFWIDTH KATAKANA LETTER HA
+ { 0x30D2, 0xFF8B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HI --> HALFWIDTH KATAKANA LETTER HI
+ { 0x30D5, 0xFF8C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HU --> HALFWIDTH KATAKANA LETTER HU
+ { 0x30D8, 0xFF8D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HE --> HALFWIDTH KATAKANA LETTER HE
+ { 0x30DB, 0xFF8E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HO --> HALFWIDTH KATAKANA LETTER HO
+ { 0x30DE, 0xFF8F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MA --> HALFWIDTH KATAKANA LETTER MA
+ { 0x30DF, 0xFF90, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MI --> HALFWIDTH KATAKANA LETTER MI
+ { 0x30E0, 0xFF91, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MU --> HALFWIDTH KATAKANA LETTER MU
+ { 0x30E1, 0xFF92, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER ME --> HALFWIDTH KATAKANA LETTER ME
+ { 0x30E2, 0xFF93, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MO --> HALFWIDTH KATAKANA LETTER MO
+ { 0x30E3, 0xFF6C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YA --> HALFWIDTH KATAKANA LETTER SMALL YA
+ { 0x30E4, 0xFF94, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YA --> HALFWIDTH KATAKANA LETTER YA
+ { 0x30E5, 0xFF6D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YU --> HALFWIDTH KATAKANA LETTER SMALL YU
+ { 0x30E6, 0xFF95, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YU --> HALFWIDTH KATAKANA LETTER YU
+ { 0x30E7, 0xFF6E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YO --> HALFWIDTH KATAKANA LETTER SMALL YO
+ { 0x30E8, 0xFF96, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YO --> HALFWIDTH KATAKANA LETTER YO
+ { 0x30E9, 0xFF97, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RA --> HALFWIDTH KATAKANA LETTER RA
+ { 0x30EA, 0xFF98, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RI --> HALFWIDTH KATAKANA LETTER RI
+ { 0x30EB, 0xFF99, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RU --> HALFWIDTH KATAKANA LETTER RU
+ { 0x30EC, 0xFF9A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RE --> HALFWIDTH KATAKANA LETTER RE
+ { 0x30ED, 0xFF9B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RO --> HALFWIDTH KATAKANA LETTER RO
+ { 0x30EF, 0xFF9C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER WA --> HALFWIDTH KATAKANA LETTER WA
+ { 0x30F2, 0xFF66, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER WO --> HALFWIDTH KATAKANA LETTER WO
+ { 0x30F3, 0xFF9D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER N --> HALFWIDTH KATAKANA LETTER N
+ { 0x30FB, 0xFF65, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // KATAKANA MIDDLE DOT --> HALFWIDTH KATAKANA MIDDLE DOT
+ { 0x30FC, 0xFF70, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // KATAKANA-HIRAGANA PROLONGED SOUND MARK --> HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ { 0x3131, 0xFFA1, FULL2HALF_NORMAL }, // HANGUL LETTER KIYEOK --> HALFWIDTH HANGUL LETTER KIYEOK
+ { 0x3132, 0xFFA2, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGKIYEOK --> HALFWIDTH HANGUL LETTER SSANGKIYEOK
+ { 0x3133, 0xFFA3, FULL2HALF_NORMAL }, // HANGUL LETTER KIYEOK-SIOS --> HALFWIDTH HANGUL LETTER KIYEOK-SIOS
+ { 0x3134, 0xFFA4, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN --> HALFWIDTH HANGUL LETTER NIEUN
+ { 0x3135, 0xFFA5, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN-CIEUC --> HALFWIDTH HANGUL LETTER NIEUN-CIEUC
+ { 0x3136, 0xFFA6, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN-HIEUH --> HALFWIDTH HANGUL LETTER NIEUN-HIEUH
+ { 0x3137, 0xFFA7, FULL2HALF_NORMAL }, // HANGUL LETTER TIKEUT --> HALFWIDTH HANGUL LETTER TIKEUT
+ { 0x3138, 0xFFA8, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGTIKEUT --> HALFWIDTH HANGUL LETTER SSANGTIKEUT
+ { 0x3139, 0xFFA9, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL --> HALFWIDTH HANGUL LETTER RIEUL
+ { 0x313A, 0xFFAA, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-KIYEOK --> HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
+ { 0x313B, 0xFFAB, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-MIEUM --> HALFWIDTH HANGUL LETTER RIEUL-MIEUM
+ { 0x313C, 0xFFAC, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-PIEUP --> HALFWIDTH HANGUL LETTER RIEUL-PIEUP
+ { 0x313D, 0xFFAD, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-SIOS --> HALFWIDTH HANGUL LETTER RIEUL-SIOS
+ { 0x313E, 0xFFAE, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-THIEUTH --> HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
+ { 0x313F, 0xFFAF, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-PHIEUPH --> HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
+ { 0x3140, 0xFFB0, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-HIEUH --> HALFWIDTH HANGUL LETTER RIEUL-HIEUH
+ { 0x3141, 0xFFB1, FULL2HALF_NORMAL }, // HANGUL LETTER MIEUM --> HALFWIDTH HANGUL LETTER MIEUM
+ { 0x3142, 0xFFB2, FULL2HALF_NORMAL }, // HANGUL LETTER PIEUP --> HALFWIDTH HANGUL LETTER PIEUP
+ { 0x3143, 0xFFB3, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGPIEUP --> HALFWIDTH HANGUL LETTER SSANGPIEUP
+ { 0x3144, 0xFFB4, FULL2HALF_NORMAL }, // HANGUL LETTER PIEUP-SIOS --> HALFWIDTH HANGUL LETTER PIEUP-SIOS
+ { 0x3145, 0xFFB5, FULL2HALF_NORMAL }, // HANGUL LETTER SIOS --> HALFWIDTH HANGUL LETTER SIOS
+ { 0x3146, 0xFFB6, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGSIOS --> HALFWIDTH HANGUL LETTER SSANGSIOS
+ { 0x3147, 0xFFB7, FULL2HALF_NORMAL }, // HANGUL LETTER IEUNG --> HALFWIDTH HANGUL LETTER IEUNG
+ { 0x3148, 0xFFB8, FULL2HALF_NORMAL }, // HANGUL LETTER CIEUC --> HALFWIDTH HANGUL LETTER CIEUC
+ { 0x3149, 0xFFB9, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGCIEUC --> HALFWIDTH HANGUL LETTER SSANGCIEUC
+ { 0x314A, 0xFFBA, FULL2HALF_NORMAL }, // HANGUL LETTER CHIEUCH --> HALFWIDTH HANGUL LETTER CHIEUCH
+ { 0x314B, 0xFFBB, FULL2HALF_NORMAL }, // HANGUL LETTER KHIEUKH --> HALFWIDTH HANGUL LETTER KHIEUKH
+ { 0x314C, 0xFFBC, FULL2HALF_NORMAL }, // HANGUL LETTER THIEUTH --> HALFWIDTH HANGUL LETTER THIEUTH
+ { 0x314D, 0xFFBD, FULL2HALF_NORMAL }, // HANGUL LETTER PHIEUPH --> HALFWIDTH HANGUL LETTER PHIEUPH
+ { 0x314E, 0xFFBE, FULL2HALF_NORMAL }, // HANGUL LETTER HIEUH --> HALFWIDTH HANGUL LETTER HIEUH
+ { 0x314F, 0xFFC2, FULL2HALF_NORMAL }, // HANGUL LETTER A --> HALFWIDTH HANGUL LETTER A
+ { 0x3150, 0xFFC3, FULL2HALF_NORMAL }, // HANGUL LETTER AE --> HALFWIDTH HANGUL LETTER AE
+ { 0x3151, 0xFFC4, FULL2HALF_NORMAL }, // HANGUL LETTER YA --> HALFWIDTH HANGUL LETTER YA
+ { 0x3152, 0xFFC5, FULL2HALF_NORMAL }, // HANGUL LETTER YAE --> HALFWIDTH HANGUL LETTER YAE
+ { 0x3153, 0xFFC6, FULL2HALF_NORMAL }, // HANGUL LETTER EO --> HALFWIDTH HANGUL LETTER EO
+ { 0x3154, 0xFFC7, FULL2HALF_NORMAL }, // HANGUL LETTER E --> HALFWIDTH HANGUL LETTER E
+ { 0x3155, 0xFFCA, FULL2HALF_NORMAL }, // HANGUL LETTER YEO --> HALFWIDTH HANGUL LETTER YEO
+ { 0x3156, 0xFFCB, FULL2HALF_NORMAL }, // HANGUL LETTER YE --> HALFWIDTH HANGUL LETTER YE
+ { 0x3157, 0xFFCC, FULL2HALF_NORMAL }, // HANGUL LETTER O --> HALFWIDTH HANGUL LETTER O
+ { 0x3158, 0xFFCD, FULL2HALF_NORMAL }, // HANGUL LETTER WA --> HALFWIDTH HANGUL LETTER WA
+ { 0x3159, 0xFFCE, FULL2HALF_NORMAL }, // HANGUL LETTER WAE --> HALFWIDTH HANGUL LETTER WAE
+ { 0x315A, 0xFFCF, FULL2HALF_NORMAL }, // HANGUL LETTER OE --> HALFWIDTH HANGUL LETTER OE
+ { 0x315B, 0xFFD2, FULL2HALF_NORMAL }, // HANGUL LETTER YO --> HALFWIDTH HANGUL LETTER YO
+ { 0x315C, 0xFFD3, FULL2HALF_NORMAL }, // HANGUL LETTER U --> HALFWIDTH HANGUL LETTER U
+ { 0x315D, 0xFFD4, FULL2HALF_NORMAL }, // HANGUL LETTER WEO --> HALFWIDTH HANGUL LETTER WEO
+ { 0x315E, 0xFFD5, FULL2HALF_NORMAL }, // HANGUL LETTER WE --> HALFWIDTH HANGUL LETTER WE
+ { 0x315F, 0xFFD6, FULL2HALF_NORMAL }, // HANGUL LETTER WI --> HALFWIDTH HANGUL LETTER WI
+ { 0x3160, 0xFFD7, FULL2HALF_NORMAL }, // HANGUL LETTER YU --> HALFWIDTH HANGUL LETTER YU
+ { 0x3161, 0xFFDA, FULL2HALF_NORMAL }, // HANGUL LETTER EU --> HALFWIDTH HANGUL LETTER EU
+ { 0x3162, 0xFFDB, FULL2HALF_NORMAL }, // HANGUL LETTER YI --> HALFWIDTH HANGUL LETTER YI
+ { 0x3163, 0xFFDC, FULL2HALF_NORMAL }, // HANGUL LETTER I --> HALFWIDTH HANGUL LETTER I
+ { 0x3164, 0xFFA0, FULL2HALF_NORMAL }, // HANGUL FILLER --> HALFWIDTH HANGUL FILLER
+ { 0xFF01, 0x0021, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH EXCLAMATION MARK --> EXCLAMATION MARK
+ { 0xFF02, 0x0022, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH QUOTATION MARK --> QUOTATION MARK
+ { 0xFF03, 0x0023, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH NUMBER SIGN --> NUMBER SIGN
+ { 0xFF04, 0x0024, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DOLLAR SIGN --> DOLLAR SIGN
+ { 0xFF05, 0x0025, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH PERCENT SIGN --> PERCENT SIGN
+ { 0xFF06, 0x0026, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH AMPERSAND --> AMPERSAND
+ { 0xFF07, 0x0027, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH APOSTROPHE --> APOSTROPHE
+ { 0xFF08, 0x0028, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT PARENTHESIS --> LEFT PARENTHESIS
+ { 0xFF09, 0x0029, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT PARENTHESIS --> RIGHT PARENTHESIS
+ { 0xFF0A, 0x002A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH ASTERISK --> ASTERISK
+ { 0xFF0B, 0x002B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH PLUS SIGN --> PLUS SIGN
+ { 0xFF0C, 0x002C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COMMA --> COMMA
+ { 0xFF0D, 0x002D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH HYPHEN-MINUS --> HYPHEN-MINUS
+ { 0xFF0E, 0x002E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH FULL STOP --> FULL STOP
+ { 0xFF0F, 0x002F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH SOLIDUS --> SOLIDUS
+ { 0xFF10, 0x0030, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT ZERO --> DIGIT ZERO
+ { 0xFF11, 0x0031, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT ONE --> DIGIT ONE
+ { 0xFF12, 0x0032, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT TWO --> DIGIT TWO
+ { 0xFF13, 0x0033, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT THREE --> DIGIT THREE
+ { 0xFF14, 0x0034, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT FOUR --> DIGIT FOUR
+ { 0xFF15, 0x0035, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT FIVE --> DIGIT FIVE
+ { 0xFF16, 0x0036, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT SIX --> DIGIT SIX
+ { 0xFF17, 0x0037, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT SEVEN --> DIGIT SEVEN
+ { 0xFF18, 0x0038, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT EIGHT --> DIGIT EIGHT
+ { 0xFF19, 0x0039, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT NINE --> DIGIT NINE
+ { 0xFF1A, 0x003A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COLON --> COLON
+ { 0xFF1B, 0x003B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH SEMICOLON --> SEMICOLON
+ { 0xFF1C, 0x003C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LESS-THAN SIGN --> LESS-THAN SIGN
+ { 0xFF1D, 0x003D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH EQUALS SIGN --> EQUALS SIGN
+ { 0xFF1E, 0x003E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH GREATER-THAN SIGN --> GREATER-THAN SIGN
+ { 0xFF1F, 0x003F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH QUESTION MARK --> QUESTION MARK
+ { 0xFF20, 0x0040, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COMMERCIAL AT --> COMMERCIAL AT
+ { 0xFF21, 0x0041, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER A --> LATIN CAPITAL LETTER A
+ { 0xFF22, 0x0042, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER B --> LATIN CAPITAL LETTER B
+ { 0xFF23, 0x0043, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER C --> LATIN CAPITAL LETTER C
+ { 0xFF24, 0x0044, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER D --> LATIN CAPITAL LETTER D
+ { 0xFF25, 0x0045, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER E --> LATIN CAPITAL LETTER E
+ { 0xFF26, 0x0046, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER F --> LATIN CAPITAL LETTER F
+ { 0xFF27, 0x0047, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER G --> LATIN CAPITAL LETTER G
+ { 0xFF28, 0x0048, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER H --> LATIN CAPITAL LETTER H
+ { 0xFF29, 0x0049, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER I --> LATIN CAPITAL LETTER I
+ { 0xFF2A, 0x004A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER J --> LATIN CAPITAL LETTER J
+ { 0xFF2B, 0x004B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER K --> LATIN CAPITAL LETTER K
+ { 0xFF2C, 0x004C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER L --> LATIN CAPITAL LETTER L
+ { 0xFF2D, 0x004D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER M --> LATIN CAPITAL LETTER M
+ { 0xFF2E, 0x004E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER N --> LATIN CAPITAL LETTER N
+ { 0xFF2F, 0x004F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER O --> LATIN CAPITAL LETTER O
+ { 0xFF30, 0x0050, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER P --> LATIN CAPITAL LETTER P
+ { 0xFF31, 0x0051, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Q --> LATIN CAPITAL LETTER Q
+ { 0xFF32, 0x0052, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER R --> LATIN CAPITAL LETTER R
+ { 0xFF33, 0x0053, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER S --> LATIN CAPITAL LETTER S
+ { 0xFF34, 0x0054, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER T --> LATIN CAPITAL LETTER T
+ { 0xFF35, 0x0055, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER U --> LATIN CAPITAL LETTER U
+ { 0xFF36, 0x0056, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER V --> LATIN CAPITAL LETTER V
+ { 0xFF37, 0x0057, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER W --> LATIN CAPITAL LETTER W
+ { 0xFF38, 0x0058, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER X --> LATIN CAPITAL LETTER X
+ { 0xFF39, 0x0059, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Y --> LATIN CAPITAL LETTER Y
+ { 0xFF3A, 0x005A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Z --> LATIN CAPITAL LETTER Z
+ { 0xFF3B, 0x005B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT SQUARE BRACKET --> LEFT SQUARE BRACKET
+ { 0xFF3C, 0x005C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH REVERSE SOLIDUS --> REVERSE SOLIDUS
+ { 0xFF3D, 0x005D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT SQUARE BRACKET --> RIGHT SQUARE BRACKET
+ { 0xFF3E, 0x005E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH CIRCUMFLEX ACCENT --> CIRCUMFLEX ACCENT
+ { 0xFF3F, 0x005F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LOW LINE --> LOW LINE
+ { 0xFF40, 0x0060, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH GRAVE ACCENT --> GRAVE ACCENT
+ { 0xFF41, 0x0061, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER A --> LATIN SMALL LETTER A
+ { 0xFF42, 0x0062, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER B --> LATIN SMALL LETTER B
+ { 0xFF43, 0x0063, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER C --> LATIN SMALL LETTER C
+ { 0xFF44, 0x0064, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER D --> LATIN SMALL LETTER D
+ { 0xFF45, 0x0065, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER E --> LATIN SMALL LETTER E
+ { 0xFF46, 0x0066, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER F --> LATIN SMALL LETTER F
+ { 0xFF47, 0x0067, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER G --> LATIN SMALL LETTER G
+ { 0xFF48, 0x0068, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER H --> LATIN SMALL LETTER H
+ { 0xFF49, 0x0069, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER I --> LATIN SMALL LETTER I
+ { 0xFF4A, 0x006A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER J --> LATIN SMALL LETTER J
+ { 0xFF4B, 0x006B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER K --> LATIN SMALL LETTER K
+ { 0xFF4C, 0x006C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER L --> LATIN SMALL LETTER L
+ { 0xFF4D, 0x006D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER M --> LATIN SMALL LETTER M
+ { 0xFF4E, 0x006E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER N --> LATIN SMALL LETTER N
+ { 0xFF4F, 0x006F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER O --> LATIN SMALL LETTER O
+ { 0xFF50, 0x0070, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER P --> LATIN SMALL LETTER P
+ { 0xFF51, 0x0071, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Q --> LATIN SMALL LETTER Q
+ { 0xFF52, 0x0072, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER R --> LATIN SMALL LETTER R
+ { 0xFF53, 0x0073, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER S --> LATIN SMALL LETTER S
+ { 0xFF54, 0x0074, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER T --> LATIN SMALL LETTER T
+ { 0xFF55, 0x0075, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER U --> LATIN SMALL LETTER U
+ { 0xFF56, 0x0076, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER V --> LATIN SMALL LETTER V
+ { 0xFF57, 0x0077, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER W --> LATIN SMALL LETTER W
+ { 0xFF58, 0x0078, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER X --> LATIN SMALL LETTER X
+ { 0xFF59, 0x0079, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Y --> LATIN SMALL LETTER Y
+ { 0xFF5A, 0x007A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Z --> LATIN SMALL LETTER Z
+ { 0xFF5B, 0x007B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT CURLY BRACKET --> LEFT CURLY BRACKET
+ { 0xFF5C, 0x007C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH VERTICAL LINE --> VERTICAL LINE
+ { 0xFF5D, 0x007D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT CURLY BRACKET --> RIGHT CURLY BRACKET
+ { 0xFF5E, 0x007E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH TILDE --> TILDE
+ { 0xFFE0, 0x00A2, FULL2HALF_NORMAL }, // FULLWIDTH CENT SIGN --> CENT SIGN
+ { 0xFFE1, 0x00A3, FULL2HALF_NORMAL }, // FULLWIDTH POUND SIGN --> POUND SIGN
+ { 0xFFE2, 0x00AC, FULL2HALF_NORMAL }, // FULLWIDTH NOT SIGN --> NOT SIGN
+ { 0xFFE3, 0x00AF, FULL2HALF_NORMAL }, // FULLWIDTH MACRON --> MACRON
+ { 0xFFE4, 0x00A6, FULL2HALF_NORMAL }, // FULLWIDTH BROKEN BAR --> BROKEN BAR
+ { 0xFFE5, 0x00A5, FULL2HALF_NORMAL }, // FULLWIDTH YEN SIGN --> YEN SIGN
+ { 0xFFE5, 0x005C, FULL2HALF_ASC_FUNCTION }, // FULLWIDTH YEN SIGN --> REVERSE SOLIDUS, exceptional conversion
+ { 0xFFE6, 0x20A9, FULL2HALF_NORMAL }, // FULLWIDTH WON SIGN --> WON SIGN
+};
+
+/*
+ Unicode Normalization Forms
+ http://www.unicode.org/unicode/reports/tr15/index.html
+ http://www.w3.org/International/charlint/
+*/
+
+const sal_Unicode composition_table[][2] = {
+ { 0x0000, 0x0000 }, // 0x3040
+ { 0x0000, 0x0000 }, // 0x3041 HIRAGANA LETTER SMALL A
+ { 0x0000, 0x0000 }, // 0x3042 HIRAGANA LETTER A
+ { 0x0000, 0x0000 }, // 0x3043 HIRAGANA LETTER SMALL I
+ { 0x0000, 0x0000 }, // 0x3044 HIRAGANA LETTER I
+ { 0x0000, 0x0000 }, // 0x3045 HIRAGANA LETTER SMALL U
+ { 0x3094, 0x0000 }, // 0x3046 HIRAGANA LETTER U --> HIRAGANA LETTER VU
+ { 0x0000, 0x0000 }, // 0x3047 HIRAGANA LETTER SMALL E
+ { 0x0000, 0x0000 }, // 0x3048 HIRAGANA LETTER E
+ { 0x0000, 0x0000 }, // 0x3049 HIRAGANA LETTER SMALL O
+ { 0x0000, 0x0000 }, // 0x304a HIRAGANA LETTER O
+ { 0x304c, 0x0000 }, // 0x304b HIRAGANA LETTER KA --> HIRAGANA LETTER GA
+ { 0x0000, 0x0000 }, // 0x304c HIRAGANA LETTER GA
+ { 0x304e, 0x0000 }, // 0x304d HIRAGANA LETTER KI --> HIRAGANA LETTER GI
+ { 0x0000, 0x0000 }, // 0x304e HIRAGANA LETTER GI
+ { 0x3050, 0x0000 }, // 0x304f HIRAGANA LETTER KU --> HIRAGANA LETTER GU
+ { 0x0000, 0x0000 }, // 0x3050 HIRAGANA LETTER GU
+ { 0x3052, 0x0000 }, // 0x3051 HIRAGANA LETTER KE --> HIRAGANA LETTER GE
+ { 0x0000, 0x0000 }, // 0x3052 HIRAGANA LETTER GE
+ { 0x3054, 0x0000 }, // 0x3053 HIRAGANA LETTER KO --> HIRAGANA LETTER GO
+ { 0x0000, 0x0000 }, // 0x3054 HIRAGANA LETTER GO
+ { 0x3056, 0x0000 }, // 0x3055 HIRAGANA LETTER SA --> HIRAGANA LETTER ZA
+ { 0x0000, 0x0000 }, // 0x3056 HIRAGANA LETTER ZA
+ { 0x3058, 0x0000 }, // 0x3057 HIRAGANA LETTER SI --> HIRAGANA LETTER ZI
+ { 0x0000, 0x0000 }, // 0x3058 HIRAGANA LETTER ZI
+ { 0x305a, 0x0000 }, // 0x3059 HIRAGANA LETTER SU --> HIRAGANA LETTER ZU
+ { 0x0000, 0x0000 }, // 0x305a HIRAGANA LETTER ZU
+ { 0x305c, 0x0000 }, // 0x305b HIRAGANA LETTER SE --> HIRAGANA LETTER ZE
+ { 0x0000, 0x0000 }, // 0x305c HIRAGANA LETTER ZE
+ { 0x305e, 0x0000 }, // 0x305d HIRAGANA LETTER SO --> HIRAGANA LETTER ZO
+ { 0x0000, 0x0000 }, // 0x305e HIRAGANA LETTER ZO
+ { 0x3060, 0x0000 }, // 0x305f HIRAGANA LETTER TA --> HIRAGANA LETTER DA
+ { 0x0000, 0x0000 }, // 0x3060 HIRAGANA LETTER DA
+ { 0x3062, 0x0000 }, // 0x3061 HIRAGANA LETTER TI --> HIRAGANA LETTER DI
+ { 0x0000, 0x0000 }, // 0x3062 HIRAGANA LETTER DI
+ { 0x0000, 0x0000 }, // 0x3063 HIRAGANA LETTER SMALL TU
+ { 0x3065, 0x0000 }, // 0x3064 HIRAGANA LETTER TU --> HIRAGANA LETTER DU
+ { 0x0000, 0x0000 }, // 0x3065 HIRAGANA LETTER DU
+ { 0x3067, 0x0000 }, // 0x3066 HIRAGANA LETTER TE --> HIRAGANA LETTER DE
+ { 0x0000, 0x0000 }, // 0x3067 HIRAGANA LETTER DE
+ { 0x3069, 0x0000 }, // 0x3068 HIRAGANA LETTER TO --> HIRAGANA LETTER DO
+ { 0x0000, 0x0000 }, // 0x3069 HIRAGANA LETTER DO
+ { 0x0000, 0x0000 }, // 0x306a HIRAGANA LETTER NA
+ { 0x0000, 0x0000 }, // 0x306b HIRAGANA LETTER NI
+ { 0x0000, 0x0000 }, // 0x306c HIRAGANA LETTER NU
+ { 0x0000, 0x0000 }, // 0x306d HIRAGANA LETTER NE
+ { 0x0000, 0x0000 }, // 0x306e HIRAGANA LETTER NO
+ { 0x3070, 0x3071 }, // 0x306f HIRAGANA LETTER HA --> HIRAGANA LETTER BA or HIRAGANA LETTER PA
+ { 0x0000, 0x0000 }, // 0x3070 HIRAGANA LETTER BA
+ { 0x0000, 0x0000 }, // 0x3071 HIRAGANA LETTER PA
+ { 0x3073, 0x3074 }, // 0x3072 HIRAGANA LETTER HI --> HIRAGANA LETTER BI or HIRAGANA LETTER PI
+ { 0x0000, 0x0000 }, // 0x3073 HIRAGANA LETTER BI
+ { 0x0000, 0x0000 }, // 0x3074 HIRAGANA LETTER PI
+ { 0x3076, 0x3077 }, // 0x3075 HIRAGANA LETTER HU --> HIRAGANA LETTER BU or HIRAGANA LETTER PU
+ { 0x0000, 0x0000 }, // 0x3076 HIRAGANA LETTER BU
+ { 0x0000, 0x0000 }, // 0x3077 HIRAGANA LETTER PU
+ { 0x3079, 0x307a }, // 0x3078 HIRAGANA LETTER HE --> HIRAGANA LETTER BE or HIRAGANA LETTER PE
+ { 0x0000, 0x0000 }, // 0x3079 HIRAGANA LETTER BE
+ { 0x0000, 0x0000 }, // 0x307a HIRAGANA LETTER PE
+ { 0x307c, 0x307d }, // 0x307b HIRAGANA LETTER HO --> HIRAGANA LETTER BO or HIRAGANA LETTER PO
+ { 0x0000, 0x0000 }, // 0x307c HIRAGANA LETTER BO
+ { 0x0000, 0x0000 }, // 0x307d HIRAGANA LETTER PO
+ { 0x0000, 0x0000 }, // 0x307e HIRAGANA LETTER MA
+ { 0x0000, 0x0000 }, // 0x307f HIRAGANA LETTER MI
+ { 0x0000, 0x0000 }, // 0x3080 HIRAGANA LETTER MU
+ { 0x0000, 0x0000 }, // 0x3081 HIRAGANA LETTER ME
+ { 0x0000, 0x0000 }, // 0x3082 HIRAGANA LETTER MO
+ { 0x0000, 0x0000 }, // 0x3083 HIRAGANA LETTER SMALL YA
+ { 0x0000, 0x0000 }, // 0x3084 HIRAGANA LETTER YA
+ { 0x0000, 0x0000 }, // 0x3085 HIRAGANA LETTER SMALL YU
+ { 0x0000, 0x0000 }, // 0x3086 HIRAGANA LETTER YU
+ { 0x0000, 0x0000 }, // 0x3087 HIRAGANA LETTER SMALL YO
+ { 0x0000, 0x0000 }, // 0x3088 HIRAGANA LETTER YO
+ { 0x0000, 0x0000 }, // 0x3089 HIRAGANA LETTER RA
+ { 0x0000, 0x0000 }, // 0x308a HIRAGANA LETTER RI
+ { 0x0000, 0x0000 }, // 0x308b HIRAGANA LETTER RU
+ { 0x0000, 0x0000 }, // 0x308c HIRAGANA LETTER RE
+ { 0x0000, 0x0000 }, // 0x308d HIRAGANA LETTER RO
+ { 0x0000, 0x0000 }, // 0x308e HIRAGANA LETTER SMALL WA
+ { 0x0000, 0x0000 }, // 0x308f HIRAGANA LETTER WA
+ { 0x0000, 0x0000 }, // 0x3090 HIRAGANA LETTER WI
+ { 0x0000, 0x0000 }, // 0x3091 HIRAGANA LETTER WE
+ { 0x0000, 0x0000 }, // 0x3092 HIRAGANA LETTER WO
+ { 0x0000, 0x0000 }, // 0x3093 HIRAGANA LETTER N
+ { 0x0000, 0x0000 }, // 0x3094 HIRAGANA LETTER VU
+ { 0x0000, 0x0000 }, // 0x3095
+ { 0x0000, 0x0000 }, // 0x3096
+ { 0x0000, 0x0000 }, // 0x3097
+ { 0x0000, 0x0000 }, // 0x3098
+ { 0x0000, 0x0000 }, // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x309d HIRAGANA ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x309e HIRAGANA VOICED ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x309f
+ { 0x0000, 0x0000 }, // 0x30a0
+ { 0x0000, 0x0000 }, // 0x30a1 KATAKANA LETTER SMALL A
+ { 0x0000, 0x0000 }, // 0x30a2 KATAKANA LETTER A
+ { 0x0000, 0x0000 }, // 0x30a3 KATAKANA LETTER SMALL I
+ { 0x0000, 0x0000 }, // 0x30a4 KATAKANA LETTER I
+ { 0x0000, 0x0000 }, // 0x30a5 KATAKANA LETTER SMALL U
+ { 0x30f4, 0x0000 }, // 0x30a6 KATAKANA LETTER U --> KATAKANA LETTER VU
+ { 0x0000, 0x0000 }, // 0x30a7 KATAKANA LETTER SMALL E
+ { 0x0000, 0x0000 }, // 0x30a8 KATAKANA LETTER E
+ { 0x0000, 0x0000 }, // 0x30a9 KATAKANA LETTER SMALL O
+ { 0x0000, 0x0000 }, // 0x30aa KATAKANA LETTER O
+ { 0x30ac, 0x0000 }, // 0x30ab KATAKANA LETTER KA --> KATAKANA LETTER GA
+ { 0x0000, 0x0000 }, // 0x30ac KATAKANA LETTER GA
+ { 0x30ae, 0x0000 }, // 0x30ad KATAKANA LETTER KI --> KATAKANA LETTER GI
+ { 0x0000, 0x0000 }, // 0x30ae KATAKANA LETTER GI
+ { 0x30b0, 0x0000 }, // 0x30af KATAKANA LETTER KU --> KATAKANA LETTER GU
+ { 0x0000, 0x0000 }, // 0x30b0 KATAKANA LETTER GU
+ { 0x30b2, 0x0000 }, // 0x30b1 KATAKANA LETTER KE --> KATAKANA LETTER GE
+ { 0x0000, 0x0000 }, // 0x30b2 KATAKANA LETTER GE
+ { 0x30b4, 0x0000 }, // 0x30b3 KATAKANA LETTER KO --> KATAKANA LETTER GO
+ { 0x0000, 0x0000 }, // 0x30b4 KATAKANA LETTER GO
+ { 0x30b6, 0x0000 }, // 0x30b5 KATAKANA LETTER SA --> KATAKANA LETTER ZA
+ { 0x0000, 0x0000 }, // 0x30b6 KATAKANA LETTER ZA
+ { 0x30b8, 0x0000 }, // 0x30b7 KATAKANA LETTER SI --> KATAKANA LETTER ZI
+ { 0x0000, 0x0000 }, // 0x30b8 KATAKANA LETTER ZI
+ { 0x30ba, 0x0000 }, // 0x30b9 KATAKANA LETTER SU --> KATAKANA LETTER ZU
+ { 0x0000, 0x0000 }, // 0x30ba KATAKANA LETTER ZU
+ { 0x30bc, 0x0000 }, // 0x30bb KATAKANA LETTER SE --> KATAKANA LETTER ZE
+ { 0x0000, 0x0000 }, // 0x30bc KATAKANA LETTER ZE
+ { 0x30be, 0x0000 }, // 0x30bd KATAKANA LETTER SO --> KATAKANA LETTER ZO
+ { 0x0000, 0x0000 }, // 0x30be KATAKANA LETTER ZO
+ { 0x30c0, 0x0000 }, // 0x30bf KATAKANA LETTER TA --> KATAKANA LETTER DA
+ { 0x0000, 0x0000 }, // 0x30c0 KATAKANA LETTER DA
+ { 0x30c2, 0x0000 }, // 0x30c1 KATAKANA LETTER TI --> KATAKANA LETTER DI
+ { 0x0000, 0x0000 }, // 0x30c2 KATAKANA LETTER DI
+ { 0x0000, 0x0000 }, // 0x30c3 KATAKANA LETTER SMALL TU
+ { 0x30c5, 0x0000 }, // 0x30c4 KATAKANA LETTER TU --> KATAKANA LETTER DU
+ { 0x0000, 0x0000 }, // 0x30c5 KATAKANA LETTER DU
+ { 0x30c7, 0x0000 }, // 0x30c6 KATAKANA LETTER TE --> KATAKANA LETTER DE
+ { 0x0000, 0x0000 }, // 0x30c7 KATAKANA LETTER DE
+ { 0x30c9, 0x0000 }, // 0x30c8 KATAKANA LETTER TO --> KATAKANA LETTER DO
+ { 0x0000, 0x0000 }, // 0x30c9 KATAKANA LETTER DO
+ { 0x0000, 0x0000 }, // 0x30ca KATAKANA LETTER NA
+ { 0x0000, 0x0000 }, // 0x30cb KATAKANA LETTER NI
+ { 0x0000, 0x0000 }, // 0x30cc KATAKANA LETTER NU
+ { 0x0000, 0x0000 }, // 0x30cd KATAKANA LETTER NE
+ { 0x0000, 0x0000 }, // 0x30ce KATAKANA LETTER NO
+ { 0x30d0, 0x30d1 }, // 0x30cf KATAKANA LETTER HA --> KATAKANA LETTER BA or KATAKANA LETTER PA
+ { 0x0000, 0x0000 }, // 0x30d0 KATAKANA LETTER BA
+ { 0x0000, 0x0000 }, // 0x30d1 KATAKANA LETTER PA
+ { 0x30d3, 0x30d4 }, // 0x30d2 KATAKANA LETTER HI --> KATAKANA LETTER BI or KATAKANA LETTER PI
+ { 0x0000, 0x0000 }, // 0x30d3 KATAKANA LETTER BI
+ { 0x0000, 0x0000 }, // 0x30d4 KATAKANA LETTER PI
+ { 0x30d6, 0x30d7 }, // 0x30d5 KATAKANA LETTER HU --> KATAKANA LETTER BU or KATAKANA LETTER PU
+ { 0x0000, 0x0000 }, // 0x30d6 KATAKANA LETTER BU
+ { 0x0000, 0x0000 }, // 0x30d7 KATAKANA LETTER PU
+ { 0x30d9, 0x30da }, // 0x30d8 KATAKANA LETTER HE --> KATAKANA LETTER BE or KATAKANA LETTER PE
+ { 0x0000, 0x0000 }, // 0x30d9 KATAKANA LETTER BE
+ { 0x0000, 0x0000 }, // 0x30da KATAKANA LETTER PE
+ { 0x30dc, 0x30dd }, // 0x30db KATAKANA LETTER HO --> KATAKANA LETTER BO or KATAKANA LETTER PO
+ { 0x0000, 0x0000 }, // 0x30dc KATAKANA LETTER BO
+ { 0x0000, 0x0000 }, // 0x30dd KATAKANA LETTER PO
+ { 0x0000, 0x0000 }, // 0x30de KATAKANA LETTER MA
+ { 0x0000, 0x0000 }, // 0x30df KATAKANA LETTER MI
+ { 0x0000, 0x0000 }, // 0x30e0 KATAKANA LETTER MU
+ { 0x0000, 0x0000 }, // 0x30e1 KATAKANA LETTER ME
+ { 0x0000, 0x0000 }, // 0x30e2 KATAKANA LETTER MO
+ { 0x0000, 0x0000 }, // 0x30e3 KATAKANA LETTER SMALL YA
+ { 0x0000, 0x0000 }, // 0x30e4 KATAKANA LETTER YA
+ { 0x0000, 0x0000 }, // 0x30e5 KATAKANA LETTER SMALL YU
+ { 0x0000, 0x0000 }, // 0x30e6 KATAKANA LETTER YU
+ { 0x0000, 0x0000 }, // 0x30e7 KATAKANA LETTER SMALL YO
+ { 0x0000, 0x0000 }, // 0x30e8 KATAKANA LETTER YO
+ { 0x0000, 0x0000 }, // 0x30e9 KATAKANA LETTER RA
+ { 0x0000, 0x0000 }, // 0x30ea KATAKANA LETTER RI
+ { 0x0000, 0x0000 }, // 0x30eb KATAKANA LETTER RU
+ { 0x0000, 0x0000 }, // 0x30ec KATAKANA LETTER RE
+ { 0x0000, 0x0000 }, // 0x30ed KATAKANA LETTER RO
+ { 0x0000, 0x0000 }, // 0x30ee KATAKANA LETTER SMALL WA
+ { 0x30f7, 0x0000 }, // 0x30ef KATAKANA LETTER WA --> KATAKANA LETTER VA
+ { 0x30f8, 0x0000 }, // 0x30f0 KATAKANA LETTER WI --> KATAKANA LETTER VI
+ { 0x30f9, 0x0000 }, // 0x30f1 KATAKANA LETTER WE --> KATAKANA LETTER VE
+ { 0x30fa, 0x0000 }, // 0x30f2 KATAKANA LETTER WO --> KATAKANA LETTER VO
+ { 0x0000, 0x0000 }, // 0x30f3 KATAKANA LETTER N
+ { 0x0000, 0x0000 }, // 0x30f4 KATAKANA LETTER VU
+ { 0x0000, 0x0000 }, // 0x30f5 KATAKANA LETTER SMALL KA
+ { 0x0000, 0x0000 }, // 0x30f6 KATAKANA LETTER SMALL KE
+ { 0x0000, 0x0000 }, // 0x30f7 KATAKANA LETTER VA
+ { 0x0000, 0x0000 }, // 0x30f8 KATAKANA LETTER VI
+ { 0x0000, 0x0000 }, // 0x30f9 KATAKANA LETTER VE
+ { 0x0000, 0x0000 }, // 0x30fa KATAKANA LETTER VO
+ { 0x0000, 0x0000 }, // 0x30fb KATAKANA MIDDLE DOT
+ { 0x0000, 0x0000 }, // 0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ { 0x0000, 0x0000 }, // 0x30fd KATAKANA ITERATION MARK
+ { 0x0000, 0x0000 }, // 0x30fe KATAKANA VOICED ITERATION MARK
+ { 0x0000, 0x0000 } // 0x30ff
+};
+
+
+/*
+ Halfwidth and Fullwidth Forms (U+FF00..U+FFEF)
+ ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt
+ ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html
+ http://charts.unicode.org/Web/UFF00.html
+*/
+
+#define HALF2FULL_NORMAL 0x01
+#define HALF2FULL_JIS_FUNCTION 0x02
+#define HALF2FULL_KATAKANA_ONLY 0x04
+
+UnicodePairWithFlag const half2full[] = {
+ { 0x0020, 0x3000, HALF2FULL_NORMAL }, // SPACE --> IDEOGRAPHIC SPACE
+ { 0x0021, 0xFF01, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // EXCLAMATION MARK --> FULLWIDTH EXCLAMATION MARK
+ { 0x0022, 0xFF02, HALF2FULL_NORMAL }, // QUOTATION MARK --> FULLWIDTH QUOTATION MARK
+ { 0x0022, 0x201D, HALF2FULL_JIS_FUNCTION }, // QUOTATION MARK --> RIGHT DOUBLE QUOTATION MARK, exceptional conversion
+ { 0x0023, 0xFF03, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // NUMBER SIGN --> FULLWIDTH NUMBER SIGN
+ { 0x0024, 0xFF04, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DOLLAR SIGN --> FULLWIDTH DOLLAR SIGN
+ { 0x0025, 0xFF05, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // PERCENT SIGN --> FULLWIDTH PERCENT SIGN
+ { 0x0026, 0xFF06, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // AMPERSAND --> FULLWIDTH AMPERSAND
+ { 0x0027, 0xFF07, HALF2FULL_NORMAL }, // APOSTROPHE --> FULLWIDTH APOSTROPHE
+ { 0x0027, 0x2019, HALF2FULL_JIS_FUNCTION }, // APOSTROPHE --> RIGHT SINGLE QUOTATION MARK, exceptional conversion
+ { 0x0028, 0xFF08, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT PARENTHESIS --> FULLWIDTH LEFT PARENTHESIS
+ { 0x0029, 0xFF09, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT PARENTHESIS --> FULLWIDTH RIGHT PARENTHESIS
+ { 0x002A, 0xFF0A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // ASTERISK --> FULLWIDTH ASTERISK
+ { 0x002B, 0xFF0B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // PLUS SIGN --> FULLWIDTH PLUS SIGN
+ { 0x002C, 0xFF0C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COMMA --> FULLWIDTH COMMA
+ { 0x002D, 0xFF0D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // MINUS HYPHEN --> FULLWIDTH MINUS HYPHEN
+ { 0x002E, 0xFF0E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // FULL STOP --> FULLWIDTH FULL STOP
+ { 0x002F, 0xFF0F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // SOLIDUS --> FULLWIDTH SOLIDUS
+ { 0x0030, 0xFF10, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT ZERO --> FULLWIDTH DIGIT ZERO
+ { 0x0031, 0xFF11, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT ONE --> FULLWIDTH DIGIT ONE
+ { 0x0032, 0xFF12, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT TWO --> FULLWIDTH DIGIT TWO
+ { 0x0033, 0xFF13, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT THREE --> FULLWIDTH DIGIT THREE
+ { 0x0034, 0xFF14, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT FOUR --> FULLWIDTH DIGIT FOUR
+ { 0x0035, 0xFF15, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT FIVE --> FULLWIDTH DIGIT FIVE
+ { 0x0036, 0xFF16, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT SIX --> FULLWIDTH DIGIT SIX
+ { 0x0037, 0xFF17, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT SEVEN --> FULLWIDTH DIGIT SEVEN
+ { 0x0038, 0xFF18, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT EIGHT --> FULLWIDTH DIGIT EIGHT
+ { 0x0039, 0xFF19, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT NINE --> FULLWIDTH DIGIT NINE
+ { 0x003A, 0xFF1A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COLON --> FULLWIDTH COLON
+ { 0x003B, 0xFF1B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // SEMICOLON --> FULLWIDTH SEMICOLON
+ { 0x003C, 0xFF1C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LESS-THAN SIGN --> FULLWIDTH LESS-THAN SIGN
+ { 0x003D, 0xFF1D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // EQUALS SIGN --> FULLWIDTH EQUALS SIGN
+ { 0x003E, 0xFF1E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // GREATER-THAN SIGN --> FULLWIDTH GREATER-THAN SIGN
+ { 0x003F, 0xFF1F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // QUESTION MARK --> FULLWIDTH QUESTION MARK
+ { 0x0040, 0xFF20, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COMMERCIAL AT --> FULLWIDTH COMMERCIAL AT
+ { 0x0041, 0xFF21, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER A --> FULLWIDTH LATIN CAPITAL LETTER A
+ { 0x0042, 0xFF22, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER B --> FULLWIDTH LATIN CAPITAL LETTER B
+ { 0x0043, 0xFF23, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER C --> FULLWIDTH LATIN CAPITAL LETTER C
+ { 0x0044, 0xFF24, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER D --> FULLWIDTH LATIN CAPITAL LETTER D
+ { 0x0045, 0xFF25, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER E --> FULLWIDTH LATIN CAPITAL LETTER E
+ { 0x0046, 0xFF26, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER F --> FULLWIDTH LATIN CAPITAL LETTER F
+ { 0x0047, 0xFF27, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER G --> FULLWIDTH LATIN CAPITAL LETTER G
+ { 0x0048, 0xFF28, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER H --> FULLWIDTH LATIN CAPITAL LETTER H
+ { 0x0049, 0xFF29, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER I --> FULLWIDTH LATIN CAPITAL LETTER I
+ { 0x004A, 0xFF2A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER J --> FULLWIDTH LATIN CAPITAL LETTER J
+ { 0x004B, 0xFF2B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER K --> FULLWIDTH LATIN CAPITAL LETTER K
+ { 0x004C, 0xFF2C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER L --> FULLWIDTH LATIN CAPITAL LETTER L
+ { 0x004D, 0xFF2D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER M --> FULLWIDTH LATIN CAPITAL LETTER M
+ { 0x004E, 0xFF2E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER N --> FULLWIDTH LATIN CAPITAL LETTER N
+ { 0x004F, 0xFF2F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER O --> FULLWIDTH LATIN CAPITAL LETTER O
+ { 0x0050, 0xFF30, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER P --> FULLWIDTH LATIN CAPITAL LETTER P
+ { 0x0051, 0xFF31, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Q --> FULLWIDTH LATIN CAPITAL LETTER Q
+ { 0x0052, 0xFF32, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER R --> FULLWIDTH LATIN CAPITAL LETTER R
+ { 0x0053, 0xFF33, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER S --> FULLWIDTH LATIN CAPITAL LETTER S
+ { 0x0054, 0xFF34, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER T --> FULLWIDTH LATIN CAPITAL LETTER T
+ { 0x0055, 0xFF35, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER U --> FULLWIDTH LATIN CAPITAL LETTER U
+ { 0x0056, 0xFF36, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER V --> FULLWIDTH LATIN CAPITAL LETTER V
+ { 0x0057, 0xFF37, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER W --> FULLWIDTH LATIN CAPITAL LETTER W
+ { 0x0058, 0xFF38, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER X --> FULLWIDTH LATIN CAPITAL LETTER X
+ { 0x0059, 0xFF39, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Y --> FULLWIDTH LATIN CAPITAL LETTER Y
+ { 0x005A, 0xFF3A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Z --> FULLWIDTH LATIN CAPITAL LETTER Z
+ { 0x005B, 0xFF3B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT SQUARE BRACKET --> FULLWIDTH LEFT SQUARE BRACKET
+ { 0x005C, 0xFF3C, HALF2FULL_NORMAL }, // REVERSE SOLIDUS --> FULLWIDTH REVERSE SOLIDUS
+ { 0x005C, 0xFFE5, HALF2FULL_JIS_FUNCTION }, // REVERSE SOLIDUS --> FULLWIDTH YEN SIGN, exceptional conversion
+ { 0x005D, 0xFF3D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT SQUARE BRACKET --> FULLWIDTH RIGHT SQUARE BRACKET
+ { 0x005E, 0xFF3E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // CIRCUMFLEX ACCENT --> FULLWIDTH CIRCUMFLEX ACCENT
+ { 0x005F, 0xFF3F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LOW LINE --> FULLWIDTH LOW LINE
+ { 0x0060, 0xFF40, HALF2FULL_NORMAL }, // GRAVE ACCENT --> FULLWIDTH GRAVE ACCENT
+ { 0x0060, 0x2018, HALF2FULL_JIS_FUNCTION }, // GRAVE ACCENT --> LEFT SINGLE QUOTATION MARK, exceptional conversion
+ { 0x0061, 0xFF41, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER A --> FULLWIDTH LATIN SMALL LETTER A
+ { 0x0062, 0xFF42, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER B --> FULLWIDTH LATIN SMALL LETTER B
+ { 0x0063, 0xFF43, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER C --> FULLWIDTH LATIN SMALL LETTER C
+ { 0x0064, 0xFF44, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER D --> FULLWIDTH LATIN SMALL LETTER D
+ { 0x0065, 0xFF45, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER E --> FULLWIDTH LATIN SMALL LETTER E
+ { 0x0066, 0xFF46, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER F --> FULLWIDTH LATIN SMALL LETTER F
+ { 0x0067, 0xFF47, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER G --> FULLWIDTH LATIN SMALL LETTER G
+ { 0x0068, 0xFF48, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER H --> FULLWIDTH LATIN SMALL LETTER H
+ { 0x0069, 0xFF49, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER I --> FULLWIDTH LATIN SMALL LETTER I
+ { 0x006A, 0xFF4A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER J --> FULLWIDTH LATIN SMALL LETTER J
+ { 0x006B, 0xFF4B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER K --> FULLWIDTH LATIN SMALL LETTER K
+ { 0x006C, 0xFF4C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER L --> FULLWIDTH LATIN SMALL LETTER L
+ { 0x006D, 0xFF4D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER M --> FULLWIDTH LATIN SMALL LETTER M
+ { 0x006E, 0xFF4E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER N --> FULLWIDTH LATIN SMALL LETTER N
+ { 0x006F, 0xFF4F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER O --> FULLWIDTH LATIN SMALL LETTER O
+ { 0x0070, 0xFF50, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER P --> FULLWIDTH LATIN SMALL LETTER P
+ { 0x0071, 0xFF51, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Q --> FULLWIDTH LATIN SMALL LETTER Q
+ { 0x0072, 0xFF52, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER R --> FULLWIDTH LATIN SMALL LETTER R
+ { 0x0073, 0xFF53, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER S --> FULLWIDTH LATIN SMALL LETTER S
+ { 0x0074, 0xFF54, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER T --> FULLWIDTH LATIN SMALL LETTER T
+ { 0x0075, 0xFF55, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER U --> FULLWIDTH LATIN SMALL LETTER U
+ { 0x0076, 0xFF56, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER V --> FULLWIDTH LATIN SMALL LETTER V
+ { 0x0077, 0xFF57, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER W --> FULLWIDTH LATIN SMALL LETTER W
+ { 0x0078, 0xFF58, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER X --> FULLWIDTH LATIN SMALL LETTER X
+ { 0x0079, 0xFF59, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Y --> FULLWIDTH LATIN SMALL LETTER Y
+ { 0x007A, 0xFF5A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Z --> FULLWIDTH LATIN SMALL LETTER Z
+ { 0x007B, 0xFF5B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT CURLY BRACKET --> FULLWIDTH LEFT CURLY BRACKET
+ { 0x007C, 0xFF5C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // VERTICAL LINE --> FULLWIDTH VERTICAL LINE
+ { 0x007D, 0xFF5D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT CURLY BRACKET --> FULLWIDTH RIGHT CURLY BRACKET
+ { 0x007E, 0xFF5E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // TILDE --> FULLWIDTH TILDE
+ { 0x00A2, 0xFFE0, HALF2FULL_NORMAL }, // CENT SIGN --> FULLWIDTH CENT SIGN
+ { 0x00A3, 0xFFE1, HALF2FULL_NORMAL }, // POUND SIGN --> FULLWIDTH POUND SIGN
+ { 0x00A5, 0xFFE5, HALF2FULL_NORMAL }, // YEN SIGN --> FULLWIDTH YEN SIGN
+ { 0x00A6, 0xFFE4, HALF2FULL_NORMAL }, // BROKEN BAR --> FULLWIDTH BROKEN BAR
+ { 0x00AC, 0xFFE2, HALF2FULL_NORMAL }, // NOT SIGN --> FULLWIDTH NOT SIGN
+ { 0x00AF, 0xFFE3, HALF2FULL_NORMAL }, // MACRON --> FULLWIDTH MACRON
+ { 0x20A9, 0xFFE6, HALF2FULL_NORMAL }, // WON SIGN --> FULLWIDTH WON SIGN
+ { 0xFF61, 0x3002, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH IDEOGRAPHIC FULL STOP --> IDEOGRAPHIC FULL STOP
+ { 0xFF62, 0x300C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH LEFT CORNER BRACKET --> LEFT CORNER BRACKET
+ { 0xFF63, 0x300D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH RIGHT CORNER BRACKET --> RIGHT CORNER BRACKET
+ { 0xFF64, 0x3001, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH IDEOGRAPHIC COMMA --> IDEOGRAPHIC COMMA
+ { 0xFF65, 0x30FB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH KATAKANA MIDDLE DOT --> KATAKANA MIDDLE DOT
+ { 0xFF66, 0x30F2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER WO --> KATAKANA LETTER WO
+ { 0xFF67, 0x30A1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL A --> KATAKANA LETTER SMALL A
+ { 0xFF68, 0x30A3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL I --> KATAKANA LETTER SMALL I
+ { 0xFF69, 0x30A5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL U --> KATAKANA LETTER SMALL U
+ { 0xFF6A, 0x30A7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL E --> KATAKANA LETTER SMALL E
+ { 0xFF6B, 0x30A9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL O --> KATAKANA LETTER SMALL O
+ { 0xFF6C, 0x30E3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YA --> KATAKANA LETTER SMALL YA
+ { 0xFF6D, 0x30E5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YU --> KATAKANA LETTER SMALL YU
+ { 0xFF6E, 0x30E7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YO --> KATAKANA LETTER SMALL YO
+ { 0xFF6F, 0x30C3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL TU --> KATAKANA LETTER SMALL TU
+ { 0xFF70, 0x30FC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK --> KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ { 0xFF71, 0x30A2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER A --> KATAKANA LETTER A
+ { 0xFF72, 0x30A4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER I --> KATAKANA LETTER I
+ { 0xFF73, 0x30A6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER U --> KATAKANA LETTER U
+ { 0xFF74, 0x30A8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER E --> KATAKANA LETTER E
+ { 0xFF75, 0x30AA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER O --> KATAKANA LETTER O
+ { 0xFF76, 0x30AB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KA --> KATAKANA LETTER KA
+ { 0xFF77, 0x30AD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KI --> KATAKANA LETTER KI
+ { 0xFF78, 0x30AF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KU --> KATAKANA LETTER KU
+ { 0xFF79, 0x30B1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KE --> KATAKANA LETTER KE
+ { 0xFF7A, 0x30B3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KO --> KATAKANA LETTER KO
+ { 0xFF7B, 0x30B5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SA --> KATAKANA LETTER SA
+ { 0xFF7C, 0x30B7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SI --> KATAKANA LETTER SI
+ { 0xFF7D, 0x30B9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SU --> KATAKANA LETTER SU
+ { 0xFF7E, 0x30BB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SE --> KATAKANA LETTER SE
+ { 0xFF7F, 0x30BD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SO --> KATAKANA LETTER SO
+ { 0xFF80, 0x30BF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TA --> KATAKANA LETTER TA
+ { 0xFF81, 0x30C1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TI --> KATAKANA LETTER TI
+ { 0xFF82, 0x30C4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TU --> KATAKANA LETTER TU
+ { 0xFF83, 0x30C6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TE --> KATAKANA LETTER TE
+ { 0xFF84, 0x30C8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TO --> KATAKANA LETTER TO
+ { 0xFF85, 0x30CA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NA --> KATAKANA LETTER NA
+ { 0xFF86, 0x30CB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NI --> KATAKANA LETTER NI
+ { 0xFF87, 0x30CC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NU --> KATAKANA LETTER NU
+ { 0xFF88, 0x30CD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NE --> KATAKANA LETTER NE
+ { 0xFF89, 0x30CE, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NO --> KATAKANA LETTER NO
+ { 0xFF8A, 0x30CF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HA --> KATAKANA LETTER HA
+ { 0xFF8B, 0x30D2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HI --> KATAKANA LETTER HI
+ { 0xFF8C, 0x30D5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HU --> KATAKANA LETTER HU
+ { 0xFF8D, 0x30D8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HE --> KATAKANA LETTER HE
+ { 0xFF8E, 0x30DB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HO --> KATAKANA LETTER HO
+ { 0xFF8F, 0x30DE, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MA --> KATAKANA LETTER MA
+ { 0xFF90, 0x30DF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MI --> KATAKANA LETTER MI
+ { 0xFF91, 0x30E0, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MU --> KATAKANA LETTER MU
+ { 0xFF92, 0x30E1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER ME --> KATAKANA LETTER ME
+ { 0xFF93, 0x30E2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MO --> KATAKANA LETTER MO
+ { 0xFF94, 0x30E4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YA --> KATAKANA LETTER YA
+ { 0xFF95, 0x30E6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YU --> KATAKANA LETTER YU
+ { 0xFF96, 0x30E8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YO --> KATAKANA LETTER YO
+ { 0xFF97, 0x30E9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RA --> KATAKANA LETTER RA
+ { 0xFF98, 0x30EA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RI --> KATAKANA LETTER RI
+ { 0xFF99, 0x30EB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RU --> KATAKANA LETTER RU
+ { 0xFF9A, 0x30EC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RE --> KATAKANA LETTER RE
+ { 0xFF9B, 0x30ED, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RO --> KATAKANA LETTER RO
+ { 0xFF9C, 0x30EF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER WA --> KATAKANA LETTER WA
+ { 0xFF9D, 0x30F3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER N --> KATAKANA LETTER N
+
+// bluedwarf: A combination character cannot be used solely
+// { 0xFF9E, 0x3099, HALF2FULL_NORMAL }, // HALFWIDTH KATAKANA VOICED SOUND MARK --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+// { 0xFF9F, 0x309A, HALF2FULL_NORMAL }, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK --> COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ { 0xFF9E, 0x309B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA VOICED SOUND MARK --> KATAKANA-HIRAGANA VOICED SOUND MARK
+ { 0xFF9F, 0x309C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK --> KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+
+ { 0xFFA0, 0x3164, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL FILLER --> HANGUL FILLER
+ { 0xFFA1, 0x3131, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KIYEOK --> HANGUL LETTER KIYEOK
+ { 0xFFA2, 0x3132, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGKIYEOK --> HANGUL LETTER SSANGKIYEOK
+ { 0xFFA3, 0x3133, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KIYEOK-SIOS --> HANGUL LETTER KIYEOK-SIOS
+ { 0xFFA4, 0x3134, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN --> HANGUL LETTER NIEUN
+ { 0xFFA5, 0x3135, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN-CIEUC --> HANGUL LETTER NIEUN-CIEUC
+ { 0xFFA6, 0x3136, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN-HIEUH --> HANGUL LETTER NIEUN-HIEUH
+ { 0xFFA7, 0x3137, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER TIKEUT --> HANGUL LETTER TIKEUT
+ { 0xFFA8, 0x3138, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGTIKEUT --> HANGUL LETTER SSANGTIKEUT
+ { 0xFFA9, 0x3139, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL --> HANGUL LETTER RIEUL
+ { 0xFFAA, 0x313A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-KIYEOK --> HANGUL LETTER RIEUL-KIYEOK
+ { 0xFFAB, 0x313B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-MIEUM --> HANGUL LETTER RIEUL-MIEUM
+ { 0xFFAC, 0x313C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-PIEUP --> HANGUL LETTER RIEUL-PIEUP
+ { 0xFFAD, 0x313D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-SIOS --> HANGUL LETTER RIEUL-SIOS
+ { 0xFFAE, 0x313E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-THIEUTH --> HANGUL LETTER RIEUL-THIEUTH
+ { 0xFFAF, 0x313F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH --> HANGUL LETTER RIEUL-PHIEUPH
+ { 0xFFB0, 0x3140, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-HIEUH --> HANGUL LETTER RIEUL-HIEUH
+ { 0xFFB1, 0x3141, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER MIEUM --> HANGUL LETTER MIEUM
+ { 0xFFB2, 0x3142, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PIEUP --> HANGUL LETTER PIEUP
+ { 0xFFB3, 0x3143, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGPIEUP --> HANGUL LETTER SSANGPIEUP
+ { 0xFFB4, 0x3144, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PIEUP-SIOS --> HANGUL LETTER PIEUP-SIOS
+ { 0xFFB5, 0x3145, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SIOS --> HANGUL LETTER SIOS
+ { 0xFFB6, 0x3146, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGSIOS --> HANGUL LETTER SSANGSIOS
+ { 0xFFB7, 0x3147, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER IEUNG --> HANGUL LETTER IEUNG
+ { 0xFFB8, 0x3148, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER CIEUC --> HANGUL LETTER CIEUC
+ { 0xFFB9, 0x3149, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGCIEUC --> HANGUL LETTER SSANGCIEUC
+ { 0xFFBA, 0x314A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER CHIEUCH --> HANGUL LETTER CHIEUCH
+ { 0xFFBB, 0x314B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KHIEUKH --> HANGUL LETTER KHIEUKH
+ { 0xFFBC, 0x314C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER THIEUTH --> HANGUL LETTER THIEUTH
+ { 0xFFBD, 0x314D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PHIEUPH --> HANGUL LETTER PHIEUPH
+ { 0xFFBE, 0x314E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER HIEUH --> HANGUL LETTER HIEUH
+ { 0xFFC2, 0x314F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER A --> HANGUL LETTER A
+ { 0xFFC3, 0x3150, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER AE --> HANGUL LETTER AE
+ { 0xFFC4, 0x3151, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YA --> HANGUL LETTER YA
+ { 0xFFC5, 0x3152, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YAE --> HANGUL LETTER YAE
+ { 0xFFC6, 0x3153, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER EO --> HANGUL LETTER EO
+ { 0xFFC7, 0x3154, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER E --> HANGUL LETTER E
+ { 0xFFCA, 0x3155, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YEO --> HANGUL LETTER YEO
+ { 0xFFCB, 0x3156, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YE --> HANGUL LETTER YE
+ { 0xFFCC, 0x3157, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER O --> HANGUL LETTER O
+ { 0xFFCD, 0x3158, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WA --> HANGUL LETTER WA
+ { 0xFFCE, 0x3159, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WAE --> HANGUL LETTER WAE
+ { 0xFFCF, 0x315A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER OE --> HANGUL LETTER OE
+ { 0xFFD2, 0x315B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YO --> HANGUL LETTER YO
+ { 0xFFD3, 0x315C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER U --> HANGUL LETTER U
+ { 0xFFD4, 0x315D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WEO --> HANGUL LETTER WEO
+ { 0xFFD5, 0x315E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WE --> HANGUL LETTER WE
+ { 0xFFD6, 0x315F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WI --> HANGUL LETTER WI
+ { 0xFFD7, 0x3160, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YU --> HANGUL LETTER YU
+ { 0xFFDA, 0x3161, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER EU --> HANGUL LETTER EU
+ { 0xFFDB, 0x3162, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YI --> HANGUL LETTER YI
+ { 0xFFDC, 0x3163, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER I --> HANGUL LETTER I
+ { 0xFFE8, 0x2502, HALF2FULL_NORMAL }, // HALFWIDTH FORMS LIGHT VERTICAL --> BOX DRAWINGS LIGHT VERTICAL
+ { 0xFFE9, 0x2190, HALF2FULL_NORMAL }, // HALFWIDTH LEFTWARDS ARROW --> LEFTWARDS ARROW
+ { 0xFFEA, 0x2191, HALF2FULL_NORMAL }, // HALFWIDTH UPWARDS ARROW --> UPWARDS ARROW
+ { 0xFFEB, 0x2192, HALF2FULL_NORMAL }, // HALFWIDTH RIGHTWARDS ARROW --> RIGHTWARDS ARROW
+ { 0xFFEC, 0x2193, HALF2FULL_NORMAL }, // HALFWIDTH DOWNWARDS ARROW --> DOWNWARDS ARROW
+ { 0xFFED, 0x25A0, HALF2FULL_NORMAL }, // HALFWIDTH BLACK SQUARE --> BLACK SQUARE
+ { 0xFFEE, 0x25CB, HALF2FULL_NORMAL }, // HALFWIDTH WHITE CIRCLE --> WHITE CIRCLE
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */