From d66da966977efc8fba89c31889192a1f7acc86de Mon Sep 17 00:00:00 2001 From: Shaw Date: Tue, 13 Oct 2026 22:51:44 -0400 Subject: [PATCH 1/4] tools: add misaki-g2p, a native misaki English G2P for Paradee Paradee-8M only saw misaki 0.9.4 phonemes in training. This ports misaki's American English pipeline as paradee/tts.py configures it (spaCy tokenizer, lexicon lookup, stemming, stress, numbers, eSpeak NG fallback with misaki's E2M table, paradee's 510-symbol chunking) to dependency-free C++17 with a C API, so speech can run without Python or ONNX. - convert_misaki_lexicon.py: pinned us_gold/us_silver -> deterministic, mmap-able misaki-en-us.lex (sha in pins.json) - rule-based tagger in place of en_core_web_sm; English number words written independently of num2words (LGPL) - optional libespeak-ng 1.52.0 (GPL-3.0-or-later, flagged in LICENSES/); without it unknown words are spelled out and fallback_kind() is 0 - agreement gate against the pinned Python misaki: 99.97% of words and 98.26% of sentences identical on the 230-sentence gate corpus Co-Authored-By: Claude Opus 5.5 --- tools/misaki-g2p/CMakeLists.txt | 87 + .../misaki-g2p/LICENSES/eSpeak-NG-NOTICE.txt | 23 + .../misaki-g2p/LICENSES/misaki-Apache-2.0.txt | 201 + tools/misaki-g2p/LICENSES/misaki-NOTICE.txt | 16 + tools/misaki-g2p/LICENSES/spaCy-MIT.txt | 21 + tools/misaki-g2p/README.md | 121 + tools/misaki-g2p/convert_misaki_lexicon.py | 273 + tools/misaki-g2p/include/misaki-g2p.h | 73 + tools/misaki-g2p/pins.json | 117 + tools/misaki-g2p/scripts/gen_tables.py | 212 + tools/misaki-g2p/src/espeak.cpp | 302 + tools/misaki-g2p/src/g2p.cpp | 1115 +++ tools/misaki-g2p/src/lexicon.cpp | 173 + tools/misaki-g2p/src/misaki-g2p.cpp | 130 + tools/misaki-g2p/src/misaki-internal.h | 189 + tools/misaki-g2p/src/numbers.cpp | 116 + tools/misaki-g2p/src/spacy-en-rules.inc | 1353 ++++ tools/misaki-g2p/src/tagger.cpp | 632 ++ tools/misaki-g2p/src/tokenizer.cpp | 596 ++ tools/misaki-g2p/src/unicode-tables.inc | 6950 +++++++++++++++++ tools/misaki-g2p/src/unicode.cpp | 258 + tools/misaki-g2p/tests/CMakeLists.txt | 75 + tools/misaki-g2p/tests/compare_misaki.py | 343 + tools/misaki-g2p/tests/corpus/agent_style.txt | 70 + .../tests/corpus/eliza_android_sentences.txt | 25 + .../tests/corpus/paradee_samples.txt | 5 + .../tests/corpus/wikitext_heldout_200.txt | 200 + tools/misaki-g2p/tests/data/e2m.tsv | 24 + tools/misaki-g2p/tests/data/mini_gold.json | 86 + tools/misaki-g2p/tests/data/mini_silver.json | 4 + tools/misaki-g2p/tests/data/stress.tsv | 18 + tools/misaki-g2p/tests/data/subtokenize.tsv | 27 + tools/misaki-g2p/tests/data/tokenizer.tsv | 20 + .../misaki-g2p/tests/fixtures/agent_style.txt | 953 +++ .../tests/fixtures/agent_style.txt.sha256 | 1 + tools/misaki-g2p/tests/fixtures/reference.txt | 4951 ++++++++++++ .../tests/fixtures/reference.txt.sha256 | 1 + .../misaki-g2p/tests/gen_unit_expectations.py | 122 + tools/misaki-g2p/tests/test_agreement.cpp | 271 + tools/misaki-g2p/tests/test_misaki_g2p.cpp | 254 + tools/misaki-g2p/tools/misaki-g2p-cli.cpp | 122 + 41 files changed, 20530 insertions(+) create mode 100644 tools/misaki-g2p/CMakeLists.txt create mode 100644 tools/misaki-g2p/LICENSES/eSpeak-NG-NOTICE.txt create mode 100644 tools/misaki-g2p/LICENSES/misaki-Apache-2.0.txt create mode 100644 tools/misaki-g2p/LICENSES/misaki-NOTICE.txt create mode 100644 tools/misaki-g2p/LICENSES/spaCy-MIT.txt create mode 100644 tools/misaki-g2p/README.md create mode 100644 tools/misaki-g2p/convert_misaki_lexicon.py create mode 100644 tools/misaki-g2p/include/misaki-g2p.h create mode 100644 tools/misaki-g2p/pins.json create mode 100644 tools/misaki-g2p/scripts/gen_tables.py create mode 100644 tools/misaki-g2p/src/espeak.cpp create mode 100644 tools/misaki-g2p/src/g2p.cpp create mode 100644 tools/misaki-g2p/src/lexicon.cpp create mode 100644 tools/misaki-g2p/src/misaki-g2p.cpp create mode 100644 tools/misaki-g2p/src/misaki-internal.h create mode 100644 tools/misaki-g2p/src/numbers.cpp create mode 100644 tools/misaki-g2p/src/spacy-en-rules.inc create mode 100644 tools/misaki-g2p/src/tagger.cpp create mode 100644 tools/misaki-g2p/src/tokenizer.cpp create mode 100644 tools/misaki-g2p/src/unicode-tables.inc create mode 100644 tools/misaki-g2p/src/unicode.cpp create mode 100644 tools/misaki-g2p/tests/CMakeLists.txt create mode 100644 tools/misaki-g2p/tests/compare_misaki.py create mode 100644 tools/misaki-g2p/tests/corpus/agent_style.txt create mode 100644 tools/misaki-g2p/tests/corpus/eliza_android_sentences.txt create mode 100644 tools/misaki-g2p/tests/corpus/paradee_samples.txt create mode 100644 tools/misaki-g2p/tests/corpus/wikitext_heldout_200.txt create mode 100644 tools/misaki-g2p/tests/data/e2m.tsv create mode 100644 tools/misaki-g2p/tests/data/mini_gold.json create mode 100644 tools/misaki-g2p/tests/data/mini_silver.json create mode 100644 tools/misaki-g2p/tests/data/stress.tsv create mode 100644 tools/misaki-g2p/tests/data/subtokenize.tsv create mode 100644 tools/misaki-g2p/tests/data/tokenizer.tsv create mode 100644 tools/misaki-g2p/tests/fixtures/agent_style.txt create mode 100644 tools/misaki-g2p/tests/fixtures/agent_style.txt.sha256 create mode 100644 tools/misaki-g2p/tests/fixtures/reference.txt create mode 100644 tools/misaki-g2p/tests/fixtures/reference.txt.sha256 create mode 100644 tools/misaki-g2p/tests/gen_unit_expectations.py create mode 100644 tools/misaki-g2p/tests/test_agreement.cpp create mode 100644 tools/misaki-g2p/tests/test_misaki_g2p.cpp create mode 100644 tools/misaki-g2p/tools/misaki-g2p-cli.cpp diff --git a/tools/misaki-g2p/CMakeLists.txt b/tools/misaki-g2p/CMakeLists.txt new file mode 100644 index 0000000000..3e80f61cd6 --- /dev/null +++ b/tools/misaki-g2p/CMakeLists.txt @@ -0,0 +1,87 @@ +# misaki-g2p: native misaki 0.9.4 American English G2P for Paradee-8M. +# +# Pure C++17, no ggml dependency: usable from the llama.cpp tree +# (LLAMA_BUILD_MISAKI_G2P) or standalone (cmake -S tools/misaki-g2p). +# +# Options +# MISAKI_G2P_ESPEAK link libespeak-ng for misaki's eSpeak fallback +# (GPL-3.0-or-later; flagged, not required). +# Uses an existing `espeak-ng` CMake target when the +# parent project defines one, else find_library with +# MISAKI_G2P_ESPEAK_ROOT as a hint. +# MISAKI_G2P_BUILD_TESTS unit tests and the misaki agreement gate. +# MISAKI_G2P_LEXICON prebuilt misaki-en-us.lex for the tests; when +# empty the tests build one with +# convert_misaki_lexicon.py --fetch (Python 3 and +# network access to raw.githubusercontent.com). +# MISAKI_G2P_ESPEAK_DATA espeak-ng-data directory for the gate test. +cmake_minimum_required(VERSION 3.14) + +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + project(misaki_g2p CXX) + set(MISAKI_G2P_STANDALONE ON) + include(CTest) +else() + set(MISAKI_G2P_STANDALONE OFF) +endif() + +option(MISAKI_G2P_ESPEAK "Link libespeak-ng for the misaki OOV fallback (GPL-3.0-or-later)" ON) +set(MISAKI_G2P_ESPEAK_ROOT "" CACHE PATH "Prefix to search for libespeak-ng") +if (MISAKI_G2P_STANDALONE) + option(MISAKI_G2P_BUILD_TESTS "Build misaki-g2p tests" ON) +else() + option(MISAKI_G2P_BUILD_TESTS "Build misaki-g2p tests" ${LLAMA_BUILD_TESTS}) +endif() +set(MISAKI_G2P_LEXICON "" CACHE FILEPATH "Prebuilt misaki-en-us.lex for the tests") +set(MISAKI_G2P_ESPEAK_DATA "" CACHE PATH "espeak-ng-data directory for the agreement gate") + +add_library(misaki_g2p STATIC + src/espeak.cpp + src/g2p.cpp + src/lexicon.cpp + src/misaki-g2p.cpp + src/numbers.cpp + src/tagger.cpp + src/tokenizer.cpp + src/unicode.cpp +) +target_include_directories(misaki_g2p PUBLIC $ + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) +target_compile_features(misaki_g2p PUBLIC cxx_std_17) +set_target_properties(misaki_g2p PROPERTIES POSITION_INDEPENDENT_CODE ON CXX_EXTENSIONS OFF) +target_compile_definitions(misaki_g2p PRIVATE MISAKI_G2P_BUILD) + +set(MISAKI_G2P_HAS_ESPEAK OFF) +if (MISAKI_G2P_ESPEAK) + if (TARGET espeak-ng) + target_link_libraries(misaki_g2p PRIVATE espeak-ng) + set(MISAKI_G2P_HAS_ESPEAK ON) + else() + find_path(MISAKI_ESPEAK_INCLUDE_DIR espeak-ng/speak_lib.h + HINTS ${MISAKI_G2P_ESPEAK_ROOT} /opt/homebrew /usr/local /usr PATH_SUFFIXES include) + find_library(MISAKI_ESPEAK_LIBRARY NAMES espeak-ng + HINTS ${MISAKI_G2P_ESPEAK_ROOT} /opt/homebrew /usr/local /usr PATH_SUFFIXES lib lib64) + if (MISAKI_ESPEAK_INCLUDE_DIR AND MISAKI_ESPEAK_LIBRARY) + target_include_directories(misaki_g2p PRIVATE ${MISAKI_ESPEAK_INCLUDE_DIR}) + target_link_libraries(misaki_g2p PRIVATE ${MISAKI_ESPEAK_LIBRARY}) + set(MISAKI_G2P_HAS_ESPEAK ON) + endif() + endif() + if (MISAKI_G2P_HAS_ESPEAK) + target_compile_definitions(misaki_g2p PRIVATE MISAKI_G2P_USE_ESPEAK) + message(STATUS "misaki-g2p: libespeak-ng linked (GPL-3.0-or-later): eSpeak + E2M fallback, as in Paradee training") + else() + message(STATUS "misaki-g2p: libespeak-ng not found: out-of-lexicon words are spelled out (fallback kind 0)") + endif() +endif() + +if (NOT CMAKE_SYSTEM_NAME STREQUAL "iOS" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Android") + add_executable(misaki-g2p-cli tools/misaki-g2p-cli.cpp) + target_include_directories(misaki-g2p-cli PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) + target_link_libraries(misaki-g2p-cli PRIVATE misaki_g2p) +endif() + +if (MISAKI_G2P_BUILD_TESTS AND NOT CMAKE_CROSSCOMPILING) + enable_testing() + add_subdirectory(tests) +endif() diff --git a/tools/misaki-g2p/LICENSES/eSpeak-NG-NOTICE.txt b/tools/misaki-g2p/LICENSES/eSpeak-NG-NOTICE.txt new file mode 100644 index 0000000000..1e57ed9265 --- /dev/null +++ b/tools/misaki-g2p/LICENSES/eSpeak-NG-NOTICE.txt @@ -0,0 +1,23 @@ +LICENCE FLAG (not a blocker): eSpeak NG is GPL-3.0-or-later. + +When MISAKI_G2P_ESPEAK is ON and libespeak-ng is found, misaki_g2p links +eSpeak NG 1.52.0 (https://github.com/espeak-ng/espeak-ng, tarball sha256 +bb4338102ff3b49a81423da8a1a158b420124b055b60fa76cfb4b18677130a23) and reads its +English data (phontab, phonindex, phondata, intonations, en_dict, lang/gmw/en, +lang/gmw/en-US). A binary that links libespeak-ng is a combined work under the +GPL-3.0-or-later: distributing it requires the corresponding source and the GPL +terms for the whole work. eSpeak NG is used only for words outside misaki's +lexicon, exactly as misaki's EspeakFallback did when Paradee's training data +was made. + +Built with MISAKI_G2P_ESPEAK=OFF (or without libespeak-ng present), no GPL code +is linked; misaki_g2p_fallback_kind() then returns 0 and unknown words are +spelled out with the lexicon's letter pronunciations. Output for those words +then differs from what Paradee was trained on. + +Other flags: +- tests/corpus/wikitext_heldout_200.txt: the first 200 sentences of + paradee training/data/wikitext_sents.json (WikiText-103, from Wikipedia, + CC-BY-SA-3.0, share-alike). Test data only. +- num2words (LGPL-2.1) is used only by tests/compare_misaki.py to run the + Python reference; no num2words code is copied. diff --git a/tools/misaki-g2p/LICENSES/misaki-Apache-2.0.txt b/tools/misaki-g2p/LICENSES/misaki-Apache-2.0.txt new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/tools/misaki-g2p/LICENSES/misaki-Apache-2.0.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tools/misaki-g2p/LICENSES/misaki-NOTICE.txt b/tools/misaki-g2p/LICENSES/misaki-NOTICE.txt new file mode 100644 index 0000000000..e0934d8532 --- /dev/null +++ b/tools/misaki-g2p/LICENSES/misaki-NOTICE.txt @@ -0,0 +1,16 @@ +misaki-g2p ports hexgrad/misaki (https://github.com/hexgrad/misaki), commit +fba1236595f2d2bf21d414ba6e57d25256afada3 (the misaki 0.9.4 release), to C++: +misaki/en.py (Lexicon, G2P, token merging, stress, stemming), misaki/espeak.py +(EspeakFallback's eSpeak-to-misaki table) and the American English lexicon +misaki/data/us_gold.json and us_silver.json, which convert_misaki_lexicon.py +turns into misaki-en-us.lex. + +misaki is Copyright hexgrad and contributors, licensed under the Apache +License 2.0 (misaki-Apache-2.0.txt in this directory). The ported sources in +src/ keep that licence; changes from the original are the C++ translation, +the replacement of spaCy's statistical tagger with rules (src/tagger.cpp), and +the replacement of num2words with independent English number rules +(src/numbers.cpp). + +The eSpeak-to-misaki table is also cross-checked against web/misaki.js of +sahilmahendrakar/paradee (Apache-2.0) at 9c8b4d7504cbee7e64de2d0341bb690f0b0ab708. diff --git a/tools/misaki-g2p/LICENSES/spaCy-MIT.txt b/tools/misaki-g2p/LICENSES/spaCy-MIT.txt new file mode 100644 index 0000000000..6cb7810c6e --- /dev/null +++ b/tools/misaki-g2p/LICENSES/spaCy-MIT.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2016-2024 ExplosionAI GmbH, 2016 spaCy GmbH, 2015 Matthew Honnibal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/tools/misaki-g2p/README.md b/tools/misaki-g2p/README.md new file mode 100644 index 0000000000..142937c483 --- /dev/null +++ b/tools/misaki-g2p/README.md @@ -0,0 +1,121 @@ +# misaki-g2p + +Native American English grapheme-to-phoneme conversion for Paradee-8M v1.0. + +Paradee only ever saw phonemes from misaki 0.9.4 in training, configured as in +`paradee/tts.py`: + +```python +en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk='') +``` + +This library reproduces that pipeline in C++17 with no Python, no ONNX and no +ggml: spaCy's English tokenizer, a rule-based stand-in for spaCy's tagger, +misaki's lexicon lookup, stemming, stress, numbers and token merging, the +eSpeak NG fallback with misaki's eSpeak-to-misaki (E2M) table, and paradee's +sentence chunking. Every input is pinned in `pins.json`. + +## Build + +```sh +cmake -S tools/misaki-g2p -B build -G Ninja # standalone +cmake --build build && (cd build && ctest --output-on-failure) +``` + +Inside llama.cpp it is a plain `add_subdirectory(tools/misaki-g2p)`, giving +the static library `misaki_g2p` (no ggml dependency). + +| option | default | meaning | +|---|---|---| +| `MISAKI_G2P_ESPEAK` | ON | link libespeak-ng for the OOV fallback. Uses an existing `espeak-ng` target, else `find_library` (hint `MISAKI_G2P_ESPEAK_ROOT`). **GPL-3.0-or-later**, see `LICENSES/eSpeak-NG-NOTICE.txt`. | +| `MISAKI_G2P_BUILD_TESTS` | ON standalone, `LLAMA_BUILD_TESTS` in-tree | unit tests and the agreement gate | +| `MISAKI_G2P_LEXICON` | empty | prebuilt `misaki-en-us.lex` for the tests (else fetched and converted) | +| `MISAKI_G2P_ESPEAK_DATA` | empty | `espeak-ng-data` for the gate (else found next to the library) | + +## Lexicon + +```sh +python3 tools/misaki-g2p/convert_misaki_lexicon.py --fetch CACHE_DIR -o misaki-en-us.lex +python3 tools/misaki-g2p/convert_misaki_lexicon.py --verify misaki-en-us.lex +``` + +`--fetch` downloads `us_gold.json` / `us_silver.json` from hexgrad/misaki at +the pinned commit and refuses bytes whose sha256 differs; the output is +deterministic and its sha256 is pinned (`pins.json` `lexicon`). The file is a +sorted, mmap-able table (format in the converter's docstring) with misaki's +capitalisation expansion applied and the per-tag variants (DEFAULT, NOUN, VERB, +ADJ, ADV, DT, None, VBD, VBN, VBP) kept, including null variants. + +## C API (`include/misaki-g2p.h`) + +```c +misaki_g2p* misaki_g2p_open(const char* lex_path, const char* espeak_data_dir_or_null, char** err); +int misaki_g2p_phonemize(misaki_g2p*, const char* utf8, size_t len, char** out_utf8, char** err); +int misaki_g2p_fallback_kind(const misaki_g2p*); /* 1 = eSpeak + E2M, 0 = spell-out */ +int misaki_g2p_espeak_linked(void); +void misaki_g2p_free(char*); +void misaki_g2p_close(misaki_g2p*); +``` + +`misaki_g2p_phonemize` returns paradee's chunks joined by `'\n'`: text is split +at sentence ends and newlines, each sentence is phonemized, and a sentence +longer than 510 symbols is cut at the last space that fits. Every symbol is in +Paradee's `config.json` vocabulary or the call fails (only explicit +`[word](/phonemes/)` overrides can trigger that). Map each symbol to its id and +add a 0 pad at each end. + +With `espeak_data_dir_or_null == NULL` (or a build without libespeak-ng) words +missing from the lexicon are spelled with the lexicon's letter pronunciations +and `misaki_g2p_fallback_kind()` returns 0. Those words then differ from +training, so ship with eSpeak NG when the GPL is acceptable. libespeak-ng +keeps its data path in a 160-byte buffer; keep the data directory path under +about 135 bytes. + +## Agreement gate + +`tests/compare_misaki.py reference` runs the pinned Python misaki (versions in +`pins.json` `reference_python`) on + +- `samples/sentences.txt` from the Paradee model repo (5 sentences), +- the first 200 held-out sentences of paradee `training/data/wikitext_sents.json`, +- eliza's `packages/app/scripts/kokoro-voice/qualify/.../sentences.txt` (25), + +and writes `tests/fixtures/reference.txt` with its sha256. The CTest +`misaki_g2p_agreement` checks the native output against it: at least 99.5% of +words and 98% of sentences must be identical after Paradee's vocabulary filter, +and the C API must return exactly the chunker's output. Every mismatch is +listed in `build/tests/agreement-report.txt`. `misaki_g2p_agent` applies the +same gate to 70 assistant-style sentences (`tests/corpus/agent_style.txt`). + +Results with eSpeak NG 1.52.0: + +| set | words | sentences | +|---|---|---| +| gate corpus (230 sentences) | 3751/3752 (99.97%) | 226/230 (98.26%) | +| assistant-style (70) | 619/619 (100%) | 70/70 (100%) | +| WikiText 200..1700, not gated | 99.93% | 96.1% | +| WikiText 9000..11000, not gated, never tuned on | 99.89% | 95.8% | + +The remaining differences come from spaCy's statistical tagger, which the +rules cannot follow everywhere: mostly the direction of straight quotes +written with spaces on both sides (a WikiText artifact, `“` vs `”`), and a +few homographs and `that` readings. `compare_misaki.py extended` reproduces the +non-gated rows; `compare_misaki.py numbers` checks the number words against +num2words (22201/22201 identical). + +## Deviations from Python misaki + +- POS tags come from rules (`src/tagger.cpp`), not en_core_web_sm. +- Number words are an independent implementation (num2words is LGPL). +- NFKC normalisation composes base + mark pairs but not Hangul jamo. +- Hostile input is bounded: runs of more than 64 subtokens are split, the + camelCase subtoken search stops at 64 letters, URL matching skips tokens over + 2048 code points. Natural text never reaches these limits. +- eSpeak symbols outside Paradee's vocabulary are dropped at the fallback, + which gives the same ids paradee feeds the model. + +## Regenerating generated files + +`scripts/gen_tables.py` (Python 3.12, spaCy 3.8.16) writes +`src/unicode-tables.inc` and `src/spacy-en-rules.inc`; +`tests/gen_unit_expectations.py` writes `tests/data/`. diff --git a/tools/misaki-g2p/convert_misaki_lexicon.py b/tools/misaki-g2p/convert_misaki_lexicon.py new file mode 100644 index 0000000000..73123ed1ab --- /dev/null +++ b/tools/misaki-g2p/convert_misaki_lexicon.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +"""Convert misaki's American English lexicon (us_gold.json + us_silver.json) +into the binary, mmap-able `misaki-en-us.lex` read by tools/misaki-g2p. + +The inputs are pinned in pins.json (hexgrad/misaki at a fixed commit, same +bytes as the misaki 0.9.4 wheel). The converter refuses inputs whose sha256 +does not match the pin unless --allow-unpinned is given (used only by the unit +tests, which build a tiny lexicon from tests/data/). + +misaki's Lexicon.grow_dictionary() is applied to each table, the same way +misaki does at load time: every lowercase key of two or more characters also +gets a Capitalized key, and every Capitalized key a lowercase one, unless the +dictionary already has that key. + +File layout (little-endian, every section 8-byte aligned): + + header (128 bytes) + 0 char[8] magic "MISAKILX" + 8 u32 format version (1) + 12 u32 flags (0 = American English) + 16 u32 gold entry count + 20 u32 silver entry count + 24 u32 variant count + 28 u32 string pool size in bytes + 32 u8[32] sha256 of the us_gold.json bytes the file was built from + 64 u8[32] sha256 of the us_silver.json bytes + 96 u32 offset of the gold entries + 100 u32 offset of the silver entries + 104 u32 offset of the variants + 108 u32 offset of the string pool + 112 u32 total file size + 116 u32[3] reserved, zero + gold entries, then silver entries (12 bytes each, sorted by key bytes) + u32 key offset, u16 key length, u16 variant count, u32 first variant index + variants (8 bytes each) + u8 tag, u8 null flag, u16 value length, u32 value offset + string pool (UTF-8, no terminators, sorted and de-duplicated) + +A plain string entry has one variant with tag PLAIN. A tagged entry (for +example "read" or "that") has one variant per tag, in tag order; a null value +(JSON null) keeps the tag with the null flag set, because misaki treats a +null as "spell the word out" rather than as a missing tag. + +The output is deterministic: the same inputs always give the same bytes. + +usage: + convert_misaki_lexicon.py --gold us_gold.json --silver us_silver.json -o misaki-en-us.lex + convert_misaki_lexicon.py --fetch CACHE_DIR -o misaki-en-us.lex # download the pinned JSON + convert_misaki_lexicon.py --verify misaki-en-us.lex # check against pins.json +""" +import argparse +import hashlib +import json +import os +import struct +import sys +import urllib.request + +HERE = os.path.dirname(os.path.abspath(__file__)) +PINS = os.path.join(HERE, "pins.json") + +MAGIC = b"MISAKILX" +VERSION = 1 +HEADER_SIZE = 128 + +# Tag ids shared with src/lexicon.h. PLAIN marks an entry whose JSON value is a +# plain string. "None" is the misaki tag used when nothing follows the word. +TAGS = ["PLAIN", "DEFAULT", "NOUN", "VERB", "ADJ", "ADV", "DT", "None", "VBD", "VBN", "VBP"] +TAG_ID = {t: i for i, t in enumerate(TAGS)} + +# Phoneme vocabulary misaki asserts for American English gold entries (en.py US_VOCAB). +US_VOCAB = frozenset("AIOWYbdfhijklmnpstuvwzæðŋɑɔəɛɜɡɪɹɾʃʊʌʒʤʧˈˌθᵊᵻʔ") + + +def sha256_bytes(b): + return hashlib.sha256(b).hexdigest() + + +def load_pins(): + with open(PINS, encoding="utf-8") as f: + return json.load(f) + + +def grow_dictionary(d): + """misaki en.Lexicon.grow_dictionary, for ASCII keys.""" + e = {} + for k, v in d.items(): + if len(k) < 2: + continue + if k == k.lower(): + if k != k.capitalize(): + e[k.capitalize()] = v + elif k == k.lower().capitalize(): + e[k.lower()] = v + return {**e, **d} + + +def check_gold(d): + for k, vs in d.items(): + if isinstance(vs, str): + bad = [c for c in vs if c not in US_VOCAB] + if bad: + raise SystemExit(f"gold entry {k!r} has phonemes outside the US vocab: {bad}") + elif isinstance(vs, dict): + if "DEFAULT" not in vs: + raise SystemExit(f"gold entry {k!r} has no DEFAULT tag") + for t, v in vs.items(): + if t not in TAG_ID or t == "PLAIN": + raise SystemExit(f"gold entry {k!r} has unknown tag {t!r}") + if v is not None and any(c not in US_VOCAB for c in v): + raise SystemExit(f"gold entry {k!r}/{t} has phonemes outside the US vocab") + else: + raise SystemExit(f"gold entry {k!r} is neither a string nor a dict") + + +def check_keys(d, name): + for k in d: + if not k.isascii(): + # The C++ reader compares raw bytes, so non-ASCII keys would still + # work, but misaki's own data has none; flag a changed input. + raise SystemExit(f"{name}: non-ASCII key {k!r}; the pinned data has none") + + +def build(gold_bytes, silver_bytes): + gold = json.loads(gold_bytes.decode("utf-8")) + silver = json.loads(silver_bytes.decode("utf-8")) + check_keys(gold, "gold") + check_keys(silver, "silver") + gold = grow_dictionary(gold) + silver = grow_dictionary(silver) + check_gold(gold) + for k, v in silver.items(): + if not isinstance(v, str): + raise SystemExit(f"silver entry {k!r} is not a string") + + strings = set() + for table in (gold, silver): + for k, v in table.items(): + strings.add(k) + if isinstance(v, str): + strings.add(v) + else: + for x in v.values(): + if x is not None: + strings.add(x) + pool = bytearray() + where = {} + for s in sorted(strings, key=lambda s: s.encode("utf-8")): + b = s.encode("utf-8") + if len(b) > 0xFFFF: + raise SystemExit(f"string too long: {s[:40]!r}") + where[s] = (len(pool), len(b)) + pool += b + + variants = bytearray() + nvar = 0 + + def entries_for(table): + nonlocal nvar + out = bytearray() + for k in sorted(table, key=lambda s: s.encode("utf-8")): + v = table[k] + koff, klen = where[k] + first = nvar + if isinstance(v, str): + items = [("PLAIN", v)] + else: + items = sorted(v.items(), key=lambda kv: TAG_ID[kv[0]]) + for t, x in items: + if x is None: + variants.extend(struct.pack(" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) && defined(MISAKI_G2P_SHARED) +# if defined(MISAKI_G2P_BUILD) +# define MISAKI_G2P_API __declspec(dllexport) +# else +# define MISAKI_G2P_API __declspec(dllimport) +# endif +#elif defined(MISAKI_G2P_SHARED) +# define MISAKI_G2P_API __attribute__((visibility("default"))) +#else +# define MISAKI_G2P_API +#endif + +/* Longest chunk misaki_g2p_phonemize returns, in phoneme symbols: Paradee's + * text side has 512 positions, two of which are the pad tokens. */ +#define MISAKI_G2P_MAX_CHUNK 510 + +/* misaki_g2p_fallback_kind() values */ +#define MISAKI_G2P_FALLBACK_SPELL 0 /* no eSpeak: out-of-lexicon words are spelled with lexicon letters */ +#define MISAKI_G2P_FALLBACK_ESPEAK 1 /* eSpeak NG + misaki's eSpeak-to-misaki table, as in training */ + +typedef struct misaki_g2p misaki_g2p; + +/* Open a converter. + * lex_path: misaki-en-us.lex written by convert_misaki_lexicon.py. + * espeak_data_dir_or_null: an espeak-ng-data directory (or its parent) to + * enable the eSpeak fallback; NULL selects the spell-out fallback. When the + * library was built without libespeak-ng, a non-NULL value is an error. + * err: on failure, *err receives a message to release with misaki_g2p_free. + * Returns NULL on failure. */ +MISAKI_G2P_API misaki_g2p * misaki_g2p_open(const char * lex_path, const char * espeak_data_dir_or_null, char ** err); + +/* Phonemize UTF-8 text. On success returns 0 and sets *out_utf8 to the + * phoneme chunks separated by '\n', each at most MISAKI_G2P_MAX_CHUNK symbols + * and made only of Paradee vocabulary symbols (an empty string when the text + * has nothing to say). Release *out_utf8 with misaki_g2p_free. + * On failure returns a negative value and sets *err. */ +MISAKI_G2P_API int misaki_g2p_phonemize(misaki_g2p * g, const char * utf8, size_t len, char ** out_utf8, char ** err); + +/* MISAKI_G2P_FALLBACK_ESPEAK or MISAKI_G2P_FALLBACK_SPELL. */ +MISAKI_G2P_API int misaki_g2p_fallback_kind(const misaki_g2p * g); + +/* 1 when the library was built with libespeak-ng (GPL-3.0-or-later). */ +MISAKI_G2P_API int misaki_g2p_espeak_linked(void); + +MISAKI_G2P_API void misaki_g2p_free(char * s); +MISAKI_G2P_API void misaki_g2p_close(misaki_g2p * g); + +#ifdef __cplusplus +} +#endif + +#endif /* MISAKI_G2P_H */ diff --git a/tools/misaki-g2p/pins.json b/tools/misaki-g2p/pins.json new file mode 100644 index 0000000000..7f22149e11 --- /dev/null +++ b/tools/misaki-g2p/pins.json @@ -0,0 +1,117 @@ +{ + "comment": "Inputs of tools/misaki-g2p. Paradee-8M was trained only on phonemes from misaki 0.9.4 configured as in paradee/tts.py: en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk=''). Everything here pins that configuration.", + "misaki": { + "repo": "https://github.com/hexgrad/misaki", + "commit": "fba1236595f2d2bf21d414ba6e57d25256afada3", + "license": "Apache-2.0", + "raw_url": "https://raw.githubusercontent.com/hexgrad/misaki/{commit}/{path}", + "files": { + "misaki/en.py": { + "bytes": 32505, + "sha256": "a9c36c90a3fa6c6084e9042fd8e19f6049add4f1435d8fe5ca1b77f3529a98f4", + "note": "Differs from the 0.9.4 wheel's en.py (sha256 ddf67ad3bc4dd98143dcc9b6fbcde259b9d879d8b91684201cf0deeb07aa9910) only by the FallbackNetwork class and its default, which paradee replaces with EspeakFallback; the G2P logic is the same." + }, + "misaki/espeak.py": { + "bytes": 3799, + "sha256": "ebc39e807eeae7b99322109d8477aa16b605427f9cc852a4b1f6f72c45806a09", + "note": "Identical to the 0.9.4 wheel." + }, + "misaki/data/us_gold.json": { + "bytes": 3000469, + "sha256": "dc414872a49a28ae6c141463d502fd945f3b2fde040484fdc47d00cc4612686f", + "note": "Identical to the 0.9.4 wheel." + }, + "misaki/data/us_silver.json": { + "bytes": 3099517, + "sha256": "de8f67be911bb6c659187b4a65fd966b6a30e56350e0f790d763210b053ac475", + "note": "Identical to the 0.9.4 wheel." + } + }, + "pypi_wheel": { + "file": "misaki-0.9.4-py3-none-any.whl", + "sha256": "90e2eeb169786c014c429e5058d2ea6bcd02d651f2a24450ba6c9ffc0f8da15a" + } + }, + "lexicon": { + "file": "misaki-en-us.lex", + "format_version": 1, + "bytes": 12947790, + "sha256": "fbf09090cff0a41f3f579bf03ab9fc42710b04d7284767b10467a5f182c23925", + "note": "Output of convert_misaki_lexicon.py on the pinned us_gold.json/us_silver.json; deterministic, checked by the converter." + }, + "espeak_ng": { + "version": "1.52.0", + "url": "https://github.com/espeak-ng/espeak-ng/archive/refs/tags/1.52.0.tar.gz", + "bytes": 17739803, + "sha256": "bb4338102ff3b49a81423da8a1a158b420124b055b60fa76cfb4b18677130a23", + "license": "GPL-3.0-or-later", + "license_flag": "GPL-3.0-or-later. Linking libespeak-ng makes the combined binary GPL; flagged, not blocked. Without it the OOV fallback spells words out (misaki_g2p_fallback_kind() == 0).", + "data": [ + "phontab", + "phonindex", + "phondata", + "intonations", + "en_dict", + "lang/gmw/en", + "lang/gmw/en-US" + ], + "same_as": "espeakng-loader 0.2.4 (bundles libespeak-ng 1.52.0 with byte-identical en data), which misaki's EspeakFallback loads" + }, + "e2m": { + "sources": [ + "hexgrad/misaki@fba1236595f2d2bf21d414ba6e57d25256afada3 misaki/espeak.py EspeakFallback.E2M", + "sahilmahendrakar/paradee@9c8b4d7504cbee7e64de2d0341bb690f0b0ab708 web/misaki.js (sha256 84072f9db03f1139448044ca2549271de1e29d9e7b43da09607cd2cc413a5e39)" + ], + "note": "The native fallback asks libespeak-ng for tie marks like phonemizer does, so it applies misaki's espeak.py table exactly; web/misaki.js is the tie-less adaptation of the same table and is the cross-check." + }, + "paradee": { + "repo": "https://github.com/sahilmahendrakar/paradee", + "commit": "9c8b4d7504cbee7e64de2d0341bb690f0b0ab708", + "license": "Apache-2.0", + "tts_py_sha256": "978c6eeea27f764e495065cf34cd1ca3da2a2d3645a615457e0a711f7af35042", + "wikitext_sents_json": { + "path": "training/data/wikitext_sents.json", + "bytes": 1308404, + "sha256": "95d7edd69cfbacb67ef7c4df120d31c1dab2a3c91a12fd287abe506760c6ac15", + "license": "CC-BY-SA-3.0 (WikiText-103, from Wikipedia)", + "license_flag": "CC-BY-SA share-alike text; the first 200 sentences are copied into tests/corpus/wikitext_heldout_200.txt as test data only." + } + }, + "paradee_model": { + "repo": "https://huggingface.co/sahilmahendrakar/Paradee-8M-v1.0", + "revision": "8f34b01ef8adcb0bec470b89bf2fd62a7b2369e6", + "tag": "v1.0", + "config_json_sha256": "f24046974a3a8c747affefb45c7c504263a99d5081787908b16abe8f5ac94fcd", + "samples_sentences_txt_sha256": "2d411facb6b0429ad05f6ea3abf9c6a79ba6613990cadf54e2213e11a8c9fd1b" + }, + "reference_python": { + "python": "3.12", + "misaki": "0.9.4", + "spacy": "3.8.16", + "en_core_web_sm": "3.8.0", + "en_core_web_sm_url": "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl", + "num2words": "0.5.14", + "num2words_license_flag": "LGPL-2.1; used only by the reference script, never copied: the native number rules are written independently.", + "phonemizer-fork": "3.3.2", + "espeakng-loader": "0.2.4", + "source": "paradee/training/uv.lock at the paradee commit above (en_core_web_sm is what misaki downloads at first use for spaCy 3.8)" + }, + "generator": { + "comment": "scripts/gen_tables.py: Python string tables and spaCy tokenizer exceptions compiled into src/*.inc", + "python": "3.12", + "spacy": "3.8.16", + "spacy_license": "MIT" + }, + "eliza_android_sentences": { + "repo": "https://github.com/elizaOS/eliza", + "path": "packages/app/scripts/kokoro-voice/qualify/app/src/androidTest/assets/sentences.txt", + "sha256": "51387dfe3e38a4371821f31943bb91043a9a571f6424b82591613259ae03529d", + "commit": "38c892072c93a897dc8357436fc3915859be3bb0", + "copy": "tests/corpus/eliza_android_sentences.txt" + }, + "fixtures": { + "reference.txt": "073a90f89a2b8af01b26d9e2aade8b60ae7cadaecdfc1a459c21daeac7e7c19b", + "agent_style.txt": "de406bbe3d4a388e596f36d1da9ff4103dfb1e52494172c5a162e5720f514654", + "comment": "Python misaki 0.9.4 reference phonemes (tests/compare_misaki.py reference); each has a .sha256 file the gate checks." + } +} diff --git a/tools/misaki-g2p/scripts/gen_tables.py b/tools/misaki-g2p/scripts/gen_tables.py new file mode 100644 index 0000000000..eeedd4ebd8 --- /dev/null +++ b/tools/misaki-g2p/scripts/gen_tables.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +"""Generate the character tables and tokenizer exceptions compiled into +misaki_g2p (src/unicode-tables.inc, src/spacy-en-rules.inc). + +misaki leans on Python string methods (isalpha, lower, upper, isdigit, +unicodedata.numeric, NFKC) and on spaCy's English tokenizer. The C++ port +reproduces both from these tables, so they are generated from the exact +versions misaki 0.9.4 ran with when Paradee's training data was made +(pins.json: python 3.12 / Unicode 15.0, spacy 3.8.16, en_core_web_sm 3.8.0). +spaCy is MIT-licensed (LICENSES/spaCy-MIT.txt); the exception list is data +from spacy/lang/en/tokenizer_exceptions.py and spacy/lang/tokenizer_exceptions.py. + +usage: python3 scripts/gen_tables.py (rewrites both .inc files next to src/) +""" +import json +import os +import re +import sys +import unicodedata + +HERE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(HERE, "..", "src") +PINS = json.load(open(os.path.join(HERE, "..", "pins.json"), encoding="utf-8")) + +import regex # noqa: E402 (the module misaki's subtokenizer uses) +import spacy # noqa: E402 +from spacy.lang import char_classes as cc # noqa: E402 + +MAXCP = 0x110000 + + +def check_versions(): + want_py = PINS["generator"]["python"] + got_py = "%d.%d" % sys.version_info[:2] + if got_py != want_py: + raise SystemExit(f"python {got_py} != pinned {want_py} (Unicode tables would change)") + if spacy.__version__ != PINS["generator"]["spacy"]: + raise SystemExit(f"spacy {spacy.__version__} != pinned {PINS['generator']['spacy']}") + + +def ranges(pred): + out = [] + start = None + for cp in range(MAXCP): + if 0xD800 <= cp <= 0xDFFF: + ok = False + else: + ok = pred(chr(cp)) + if ok and start is None: + start = cp + elif not ok and start is not None: + out.append((start, cp - 1)) + start = None + if start is not None: + out.append((start, MAXCP - 1)) + return out + + +def emit_ranges(f, name, rs): + f.write(f"static const CpRange {name}[] = {{\n") + for i in range(0, len(rs), 6): + f.write(" " + " ".join("{0x%X, 0x%X}," % r for r in rs[i:i + 6]) + "\n") + f.write("};\n\n") + + +def cxx_u32(s): + return 'U"' + "".join("\\U%08X" % ord(c) for c in s) + '"' + + +def cxx_u8(s): + out = [] + for b in s.encode("utf-8"): + c = chr(b) + if 0x20 <= b < 0x7F and c not in '"\\?': + out.append(c) + else: + out.append("\\x%02X\"\"" % b) + return '"' + "".join(out) + '"' + + +def cls(pattern_class): + rx = re.compile("[" + pattern_class + "]") + return lambda ch: rx.fullmatch(ch) is not None + + +def gen_unicode(): + path = os.path.join(SRC, "unicode-tables.inc") + with open(path, "w", encoding="utf-8") as f: + f.write("// Generated by scripts/gen_tables.py from Python %s (Unicode %s), regex %s and\n" + "// spaCy %s char_classes. Do not edit.\n\n" + % ("%d.%d.%d" % sys.version_info[:3], unicodedata.unidata_version, regex.__version__, spacy.__version__)) + # Python str predicates + emit_ranges(f, "kPyAlpha", ranges(str.isalpha)) + emit_ranges(f, "kPySpace", ranges(str.isspace)) + # str.isdigit with unicodedata.numeric values + f.write("static const CpDigit kPyDigit[] = {\n") + items = [(cp, unicodedata.numeric(chr(cp))) for cp in range(MAXCP) + if not (0xD800 <= cp <= 0xDFFF) and chr(cp).isdigit()] + for i in range(0, len(items), 8): + f.write(" " + " ".join("{0x%X, %d}," % (cp, int(v)) for cp, v in items[i:i + 8]) + "\n") + f.write("};\n\n") + # case maps (1:1 and multi) + for name, fn in (("Lower", str.lower), ("Upper", str.upper)): + one, multi = [], [] + for cp in range(MAXCP): + if 0xD800 <= cp <= 0xDFFF: + continue + c = chr(cp) + m = fn(c) + if m == c: + continue + if len(m) == 1: + one.append((cp, ord(m))) + else: + multi.append((cp, m)) + f.write(f"static const CpMap kPy{name}One[] = {{\n") + for i in range(0, len(one), 6): + f.write(" " + " ".join("{0x%X, 0x%X}," % p for p in one[i:i + 6]) + "\n") + f.write("};\n\n") + f.write(f"static const CpMulti kPy{name}Multi[] = {{\n") + for cp, m in multi: + f.write(" {0x%X, %s},\n" % (cp, cxx_u32(m))) + f.write("};\n\n") + # Python title-case first char (str.capitalize uses title case for the first char) + one = [] + for cp in range(MAXCP): + if 0xD800 <= cp <= 0xDFFF: + continue + c = chr(cp) + t = c.capitalize() + if t != c and len(t) == 1: + one.append((cp, ord(t))) + f.write("static const CpMap kPyTitleOne[] = {\n") + for i in range(0, len(one), 6): + f.write(" " + " ".join("{0x%X, 0x%X}," % p for p in one[i:i + 6]) + "\n") + f.write("};\n\n") + # regex-module general categories used by misaki's subtokenizer + cat = unicodedata.category + emit_ranges(f, "kCatL", ranges(lambda ch: cat(ch).startswith("L"))) + emit_ranges(f, "kCatLu", ranges(lambda ch: cat(ch) == "Lu")) + emit_ranges(f, "kCatLl", ranges(lambda ch: cat(ch) == "Ll")) + emit_ranges(f, "kCatNd", ranges(lambda ch: cat(ch) == "Nd")) + # NFKC: per-code-point mapping plus canonical pair composition + f.write("static const CpMulti kNfkc[] = {\n") + for cp in range(MAXCP): + if 0xD800 <= cp <= 0xDFFF: + continue + c = chr(cp) + n = unicodedata.normalize("NFKC", c) + if n != c: + f.write(" {0x%X, %s},\n" % (cp, cxx_u32(n))) + f.write("};\n\n") + pairs = [] + for cp in range(MAXCP): + if 0xD800 <= cp <= 0xDFFF: + continue + c = chr(cp) + d = unicodedata.decomposition(c) + if not d or d.startswith("<"): + continue + parts = [int(x, 16) for x in d.split()] + if len(parts) == 2 and unicodedata.normalize("NFC", chr(parts[0]) + chr(parts[1])) == c: + pairs.append((parts[0], parts[1], cp)) + pairs.sort() + f.write("static const CpCompose kCompose[] = {\n") + for i in range(0, len(pairs), 4): + f.write(" " + " ".join("{0x%X, 0x%X, 0x%X}," % p for p in pairs[i:i + 4]) + "\n") + f.write("};\n\n") + f.write("static const CpMap kCombiningClass[] = {\n") + ccs = [(cp, unicodedata.combining(chr(cp))) for cp in range(MAXCP) + if not (0xD800 <= cp <= 0xDFFF) and unicodedata.combining(chr(cp))] + for i in range(0, len(ccs), 8): + f.write(" " + " ".join("{0x%X, %d}," % p for p in ccs[i:i + 8]) + "\n") + f.write("};\n\n") + # spaCy character classes + emit_ranges(f, "kSpacyAlpha", ranges(cls(cc.ALPHA))) + emit_ranges(f, "kSpacyAlphaLower", ranges(cls(cc.ALPHA_LOWER))) + emit_ranges(f, "kSpacyAlphaUpper", ranges(cls(cc.ALPHA_UPPER))) + # lookbehind class of the suffix rule (?<=[0-9{al}{e}{p}(?:{q})])\. + from spacy.lang import punctuation as sp + dot_rule = [r for r in sp.TOKENIZER_SUFFIXES if r.startswith("(?<=[0-9") and r.endswith("])\\.")] + assert len(dot_rule) == 1, dot_rule + rx = re.compile(dot_rule[0]) + emit_ranges(f, "kSpacySuffixDotPre", ranges(lambda ch: (m := rx.search(ch + ".")) is not None and m.start() == 1)) + icons = cc.LIST_ICONS[0] + assert icons.startswith("[") and icons.endswith("]"), icons[:20] + emit_ranges(f, "kSpacyIcons", ranges(cls(icons[1:-1]))) + print(path) + + +def gen_rules(): + nlp = spacy.blank("en") + rules = nlp.tokenizer.rules + path = os.path.join(SRC, "spacy-en-rules.inc") + with open(path, "w", encoding="utf-8") as f: + f.write("// Generated by scripts/gen_tables.py from spaCy %s English tokenizer exceptions\n" + "// (MIT, see LICENSES/spaCy-MIT.txt). Do not edit. Each entry is the exception\n" + "// string and its token pieces separated by \\x1F.\n\n" % spacy.__version__) + f.write("static const char * const kSpacyRules[] = {\n") + for k in sorted(rules, key=lambda s: s.encode("utf-8")): + pieces = [x[65] for x in rules[k]] # 65 == spacy.attrs.ORTH + assert "".join(pieces) == k, (k, pieces) + f.write(" %s,\n" % cxx_u8(k + "\x1f" + "\x1f".join(pieces))) + f.write("};\n") + print(path, len(rules)) + + +if __name__ == "__main__": + check_versions() + gen_unicode() + gen_rules() diff --git a/tools/misaki-g2p/src/espeak.cpp b/tools/misaki-g2p/src/espeak.cpp new file mode 100644 index 0000000000..83ed587149 --- /dev/null +++ b/tools/misaki-g2p/src/espeak.cpp @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: Apache-2.0 +// misaki's out-of-vocabulary fallback: eSpeak NG (GPL-3.0-or-later, linked +// only when MISAKI_G2P_USE_ESPEAK is defined; see LICENSES/eSpeak-NG-NOTICE.txt) +// called the way phonemizer-fork 3.3.2 calls it for +// EspeakBackend('en-us', preserve_punctuation=True, with_stress=True, tie='^'), +// then misaki espeak.EspeakFallback's eSpeak-to-misaki (E2M) table. +#include "misaki-internal.h" + +#include + +#if defined(MISAKI_G2P_USE_ESPEAK) +# include +#endif + +namespace misaki { +namespace { + +const u32 kMarks = U";:,.!?¡¿—…\"«»“”(){}[]"; // phonemizer _DEFAULT_MARKS + +bool is_mark(char32_t c) { return contains(kMarks, c); } + +struct MarkIndex { + u32 mark; + char position; // 'B', 'I', 'E' or 'A' +}; + +// re.finditer(r'(\s*[marks]+\s*)+', line) +std::vector> find_marks(const u32 & s) { + std::vector> out; + size_t p = 0; + while (p < s.size()) { + size_t q = p; + while (q < s.size() && py_isspace(s[q])) q++; + if (q >= s.size() || !is_mark(s[q])) { + p++; + continue; + } + size_t end = q; + while (true) { + size_t r = end; + while (r < s.size() && py_isspace(s[r])) r++; + if (r >= s.size() || !is_mark(s[r])) break; + while (r < s.size() && is_mark(s[r])) r++; + while (r < s.size() && py_isspace(s[r])) r++; + end = r; + } + out.emplace_back(p, end); + p = end; + } + return out; +} + +std::vector py_str_split(const u32 & s, const u32 & sep) { + std::vector out; + size_t a = 0; + while (true) { + size_t b = s.find(sep, a); + if (b == u32::npos) { + out.push_back(s.substr(a)); + break; + } + out.push_back(s.substr(a, b - a)); + a = b + sep.size(); + } + return out; +} + +// Punctuation.preserve() for one line. +void preserve(const u32 & line_in, std::vector & chunks, std::vector & marks) { + auto matches = find_marks(line_in); + if (matches.empty()) { + if (!line_in.empty()) chunks.push_back(line_in); + return; + } + if (matches.size() == 1 && matches[0].first == 0 && matches[0].second == line_in.size()) { + marks.push_back({line_in, 'A'}); + return; + } + for (size_t i = 0; i < matches.size(); i++) { + u32 g = line_in.substr(matches[i].first, matches[i].second - matches[i].first); + char pos = 'I'; + if (i == 0 && starts_with(line_in, g)) pos = 'B'; + else if (i + 1 == matches.size() && ends_with(line_in, g)) pos = 'E'; + marks.push_back({g, pos}); + } + u32 line = line_in; + std::vector preserved; + for (auto & m : marks) { + std::vector split = py_str_split(line, m.mark); + u32 suffix; + for (size_t k = 1; k < split.size(); k++) { + if (k > 1) suffix += m.mark; + suffix += split[k]; + } + preserved.push_back(split[0]); + line = suffix; + } + preserved.push_back(line); + for (auto & p : preserved) if (!p.empty()) chunks.push_back(p); +} + +// Punctuation.restore() with sep.word = ' ', strip = False, all marks on line 0. +std::vector restore(std::vector text, std::vector marks) { + std::vector out; + size_t pos = 0; + const u32 sep = U" "; + while (!text.empty() || !marks.empty()) { + if (marks.empty()) { + for (u32 line : text) { + if (!ends_with(line, sep)) line += sep; + out.push_back(line); + } + text.clear(); + } else if (text.empty()) { + u32 all; + for (auto & m : marks) all += m.mark; + out.push_back(all); + marks.clear(); + } else { + MarkIndex cur = marks[0]; + if (pos == 0) { // current_mark.index == pos + marks.erase(marks.begin()); + const u32 & mark = cur.mark; + if (ends_with(text[0], sep)) text[0] = text[0].substr(0, text[0].size() - sep.size()); + if (cur.position == 'B') { + text[0] = mark + text[0]; + } else if (cur.position == 'E') { + out.push_back(text[0] + mark + (ends_with(mark, sep) ? u32() : sep)); + text.erase(text.begin()); + pos++; + } else if (cur.position == 'A') { + out.push_back(mark + (ends_with(mark, sep) ? u32() : sep)); + pos++; + } else { + if (text.size() == 1) { + text[0] = text[0] + mark; + } else { + u32 first = text[0]; + text.erase(text.begin()); + text[0] = first + mark + text[0]; + } + } + } else { + out.push_back(text[0]); + text.erase(text.begin()); + pos++; + } + } + } + return out; +} + +#if defined(MISAKI_G2P_USE_ESPEAK) +std::mutex & espeak_mutex() { + static std::mutex m; + return m; +} +bool g_espeak_ready = false; +std::string g_espeak_path; +#endif + +} // namespace + +bool espeak_linked() { +#if defined(MISAKI_G2P_USE_ESPEAK) + return true; +#else + return false; +#endif +} + +u32 EspeakFallback::e2m(const u32 & in) { + static const std::pair kE2M[] = { + // misaki EspeakFallback.E2M sorted by descending key length (stable) + {U"ʔˌn̩", U"ʔn"}, + {U"ʔn̩", U"ʔn"}, {U"a^ɪ", U"I"}, {U"a^ʊ", U"W"}, {U"d^ʒ", U"ʤ"}, {U"e^ɪ", U"A"}, {U"t^ʃ", U"ʧ"}, + {U"ɔ^ɪ", U"Y"}, {U"ə^l", U"ᵊl"}, + {U"ʲo", U"jo"}, {U"ʲə", U"jə"}, + {U"e", U"A"}, {U"ʲ", U""}, {U"ɚ", U"əɹ"}, {U"r", U"ɹ"}, {U"x", U"k"}, {U"ç", U"k"}, {U"ɐ", U"ə"}, {U"ɬ", U"l"}, + {U"̃", U""}, + }; + u32 ps = in; + for (auto & kv : kE2M) ps = replace_all(ps, kv.first, kv.second); + // re.sub(r'(\S)̩', r'ᵊ\1', ps).replace(chr(809), '') + { + u32 o; + for (size_t i = 0; i < ps.size(); i++) { + if (i + 1 < ps.size() && ps[i + 1] == 0x329 && !py_isspace(ps[i])) { + o += U'ᵊ'; + o += ps[i]; + i++; + } else if (ps[i] != 0x329) { + o += ps[i]; + } + } + ps = o; + } + // American English + ps = replace_all(ps, U"o^ʊ", U"O"); + ps = replace_all(ps, U"ɜːɹ", U"ɜɹ"); + ps = replace_all(ps, U"ɜː", U"ɜɹ"); + ps = replace_all(ps, U"ɪə", U"iə"); + ps = replace_all(ps, U"ː", U""); + ps = replace_all(ps, U"o", U"ɔ"); // for espeak < 1.52 + ps = replace_all(ps, U"ɾ", U"T"); + ps = replace_all(ps, U"ʔ", U"t"); + return replace_all(ps, U"^", U""); +} + +std::unique_ptr EspeakFallback::open(const std::string & data_dir, std::string & err) { +#if defined(MISAKI_G2P_USE_ESPEAK) + std::lock_guard lock(espeak_mutex()); + // espeak-ng keeps its data path in a 160-byte buffer (N_PATH_HOME) and + // fails on longer ones with a misleading "No such file" error. + if (data_dir.size() + sizeof("/espeak-ng-data/phontab") > 160) { + err = "eSpeak NG data path is too long for libespeak-ng (max ~135 bytes): " + data_dir; + return nullptr; + } + if (!g_espeak_ready || g_espeak_path != data_dir) { + int rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 0, data_dir.empty() ? nullptr : data_dir.c_str(), 0); + if (rate <= 0) { + err = "espeak_Initialize failed for data dir '" + data_dir + "'"; + return nullptr; + } + // phonemizer selects the first voice whose language is en-us + if (espeak_SetVoiceByName("gmw/en-US") != EE_OK) { + err = "eSpeak NG voice gmw/en-US not found under '" + data_dir + "'"; + return nullptr; + } + g_espeak_ready = true; + g_espeak_path = data_dir; + } + return std::unique_ptr(new EspeakFallback()); +#else + (void) data_dir; + err = "misaki_g2p was built without libespeak-ng (MISAKI_G2P_ESPEAK=OFF)"; + return nullptr; +#endif +} + +EspeakFallback::~EspeakFallback() = default; + +u32 EspeakFallback::phonemize_line(const u32 & text) { +#if defined(MISAKI_G2P_USE_ESPEAK) + std::lock_guard lock(espeak_mutex()); + std::string utf8 = to_utf8(text); + const void * ptr = utf8.c_str(); + // EspeakWrapper.text_to_phonemes(text, tie=True) + const int mode = 0x02 | (0x01 << 7) | (0x0361 << 8); + u32 joined; + bool first = true; + while (ptr != nullptr) { + const char * ph = espeak_TextToPhonemes(&ptr, espeakCHARS_UTF8, mode); + if (ph && *ph) { + if (!first) joined += U" "; + joined += from_utf8(ph, std::char_traits::length(ph)); + first = false; + } + } + // EspeakBackend._postprocess_line + u32 line = replace_all(py_strip(joined), U"\n", U" "); + line = replace_all(line, U" ", U" "); // str.replace is one left-to-right pass + { + u32 o; // re.sub(r'_+', '_') then re.sub(r'_ ', ' ') + for (char32_t c : line) { + if (c == '_' && !o.empty() && o.back() == '_') continue; + o += c; + } + line = replace_all(o, U"_ ", U" "); + } + if (line.empty()) return u32(); + u32 out; + size_t a = 0; + for (size_t i = 0; i <= line.size(); i++) { + if (i == line.size() || line[i] == ' ') { + u32 word = py_strip(line.substr(a, i - a)); + out += replace_all(word, U"͡", U"^") + U" "; + a = i + 1; + } + } + return out; +#else + (void) text; + return u32(); +#endif +} + +std::optional EspeakFallback::operator()(const u32 & text) { + std::vector chunks; + std::vector marks; + preserve(text, chunks, marks); + std::vector phonemized; + for (auto & c : chunks) phonemized.push_back(phonemize_line(c)); + std::vector restored = restore(phonemized, marks); + if (restored.empty()) return std::nullopt; + u32 ps = py_strip(restored[0]); + ps = e2m(ps); + // EspeakFallback returns (None, None) only when phonemizer returns no line + return ps; +} + +} // namespace misaki diff --git a/tools/misaki-g2p/src/g2p.cpp b/tools/misaki-g2p/src/g2p.cpp new file mode 100644 index 0000000000..e4743abc9b --- /dev/null +++ b/tools/misaki-g2p/src/g2p.cpp @@ -0,0 +1,1115 @@ +// SPDX-License-Identifier: Apache-2.0 +// Port of misaki 0.9.4 en.py (hexgrad/misaki, Apache-2.0): Lexicon lookup, +// stemming, stress, numbers, token merging and G2P.__call__, configured as +// paradee/tts.py uses it: G2P(trf=False, british=False, +// fallback=EspeakFallback(british=False), unk=''). +#include "misaki-internal.h" + +#include +#include +#include + +namespace misaki { +namespace { + +using Ps = std::optional; +using Stress = std::optional; + +struct Result { + Ps ps; + std::optional rating; +}; + +struct TokenContext { + std::optional future_vowel; + bool future_to = false; +}; + +const u32 kDiphthongs = U"AIOQWYʤʧ"; +const u32 kSubtokenJunks = U"',-._‘’/"; +const u32 kPuncts = U";:,.!?—…\"“”"; +const u32 kNonQuotePuncts = U";:,.!?—…"; +const u32 kConsonants = U"bdfhjklmnpstvwzðŋɡɹɾʃʒʤʧθ"; +const u32 kUsTaus = U"AIOWYiuæɑəɛɪɹʊʌ"; +const u32 kVowels = U"AIOQWYaiuæɑɒɔəɛɜɪʊʌᵻ"; +const char32_t kPrimary = U'ˈ'; +const char32_t kSecondary = U'ˌ'; + +bool is_vowel(char32_t c) { return contains(kVowels, c); } +bool truthy(const Ps & p) { return p && !p->empty(); } +bool is_stress(char32_t c) { return c == kPrimary || c == kSecondary; } + +// LEXICON_ORDS: ' - A-Z a-z +bool lexicon_ord(char32_t c) { return c == '\'' || c == '-' || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); } +bool all_lexicon_ords(const u32 & w) { return std::all_of(w.begin(), w.end(), lexicon_ord); } + +bool is_ascii_digits(const u32 & s) { // re.match(r'^[0-9]+$') + if (s.empty()) return false; + for (char32_t c : s) if (c < '0' || c > '9') return false; + return true; +} + +bool is_punct_tag(const std::string & t) { + static const std::set tags = {".", ",", "-LRB-", "-RRB-", "``", "\"\"", "''", ":", "$", "#", "NFP"}; + return tags.count(t) > 0; +} + +int stress_weight(const Ps & ps) { + if (!ps) return 0; + int w = 0; + for (char32_t c : *ps) w += contains(kDiphthongs, c) ? 2 : 1; + return w; +} + +u32 restress(const u32 & ps) { + // Each stress mark moves to just before the next vowel at or after it. + std::vector> ips; + for (size_t i = 0; i < ps.size(); i++) ips.emplace_back((double) i, ps[i]); + for (size_t i = 0; i < ps.size(); i++) { + if (!is_stress(ps[i])) continue; + size_t j = i; + while (j < ps.size() && !is_vowel(ps[j])) j++; + if (j == ps.size()) continue; // misaki would raise; never reached from apply_stress + ips[i].first = (double) j - 0.5; + } + std::stable_sort(ips.begin(), ips.end()); + u32 out; + for (auto & p : ips) out += p.second; + return out; +} + +Ps apply_stress(const Ps & ps_in, Stress stress) { + if (!ps_in) return ps_in; + const u32 & ps = *ps_in; + if (!stress) return ps; + double s = *stress; + bool has_primary = contains(ps, kPrimary), has_secondary = contains(ps, kSecondary); + bool has_vowel = std::any_of(ps.begin(), ps.end(), is_vowel); + if (s < -1) { + u32 o; + for (char32_t c : ps) if (!is_stress(c)) o += c; + return o; + } else if (s == -1 || ((s == 0 || s == -0.5) && has_primary)) { + u32 o; + for (char32_t c : ps) { + if (c == kSecondary) continue; + o += c == kPrimary ? kSecondary : c; + } + return o; + } else if ((s == 0 || s == 0.5 || s == 1) && !has_primary && !has_secondary) { + if (!has_vowel) return ps; + return restress(u32(1, kSecondary) + ps); + } else if (s >= 1 && !has_primary && has_secondary) { + u32 o = ps; + std::replace(o.begin(), o.end(), kSecondary, kPrimary); + return o; + } else if (s > 1 && !has_primary && !has_secondary) { + if (!has_vowel) return ps; + return restress(u32(1, kPrimary) + ps); + } + return ps; +} + +std::string parent_tag(const std::string & tag) { + if (tag.rfind("VB", 0) == 0) return "VERB"; + if (tag.rfind("NN", 0) == 0) return "NOUN"; + if (tag.rfind("ADV", 0) == 0 || tag.rfind("RB", 0) == 0) return "ADV"; + if (tag.rfind("ADJ", 0) == 0 || tag.rfind("JJ", 0) == 0) return "ADJ"; + return tag; +} + +int tag_id(const std::string & t) { + static const char * names[] = {"PLAIN", "DEFAULT", "NOUN", "VERB", "ADJ", "ADV", "DT", "None", "VBD", "VBN", "VBP"}; + for (int i = 0; i < TAG_COUNT; i++) if (t == names[i]) return i; + return -1; +} + +class Lexicon { + public: + explicit Lexicon(const LexFile & f) : f_(f) {} + + bool in_golds(const u32 & w) const { return f_.in_gold(w); } + bool in_silvers(const u32 & w) const { return f_.in_silver(w); } + + // self.golds[word] for a plain-string entry + Ps gold_plain(const u32 & w) const { + LexValue v = f_.gold(w); + return v.plain; + } + + Result get_NNP(const u32 & word) const { + u32 joined; + for (char32_t c : word) { + if (!py_isalpha(c)) continue; + LexValue v = f_.gold(py_upper(u32(1, c))); + if (!v.found || !v.plain) return {}; + joined += *v.plain; + } + Ps ps = apply_stress(joined, 0.0); + size_t cut = ps->rfind(kSecondary); + if (cut != u32::npos) (*ps)[cut] = kPrimary; + return {ps, 3}; + } + + Result get_special_case(const u32 & word, const std::string & tag, Stress stress, const TokenContext & ctx) const { + if (tag == "ADD" && (word == U"." || word == U"/")) return lookup(word == U"." ? U"dot" : U"slash", "", -0.5, &ctx); + if (word == U"%") return lookup(U"percent", "", {}, &ctx); + if (word == U"&") return lookup(U"and", "", {}, &ctx); + if (word == U"+") return lookup(U"plus", "", {}, &ctx); + if (word == U"@") return lookup(U"at", "", {}, &ctx); + { + // '.' in word.strip('.') and word.replace('.', '').isalpha() and len(max(word.split('.'), key=len)) < 3 + size_t a = 0, b = word.size(); + while (a < b && word[a] == '.') a++; + while (b > a && word[b - 1] == '.') b--; + u32 stripped = word.substr(a, b - a); + u32 nodots; + for (char32_t c : word) if (c != '.') nodots += c; + if (contains(stripped, U'.') && py_str_isalpha(nodots)) { + size_t longest = 0, cur = 0; + for (char32_t c : word) { + if (c == '.') { longest = std::max(longest, cur); cur = 0; } + else cur++; + } + longest = std::max(longest, cur); + if (longest < 3) return get_NNP(word); + } + } + if (word == U"a" || word == U"A") return {U(tag == "DT" ? "ɐ" : "ˈA"), 4}; + if (word == U"am" || word == U"Am" || word == U"AM") { + if (tag.rfind("NN", 0) == 0) return get_NNP(word); + if (!ctx.future_vowel || word != U"am" || (stress && *stress > 0)) return {gold_plain(U"am"), 4}; + return {U"ɐm", 4}; + } + if (word == U"an" || word == U"An" || word == U"AN") { + if (word == U"AN" && tag.rfind("NN", 0) == 0) return get_NNP(word); + return {U"ɐn", 4}; + } + if (word == U"I" && tag == "PRP") return {u32(1, kSecondary) + U"I", 4}; + if ((word == U"by" || word == U"By" || word == U"BY") && parent_tag(tag) == "ADV") return {U"bˈI", 4}; + if (word == U"to" || word == U"To" || (word == U"TO" && (tag == "TO" || tag == "IN"))) { + if (!ctx.future_vowel) return {gold_plain(U"to"), 4}; + return {U(*ctx.future_vowel ? "tʊ" : "tə"), 4}; + } + if (word == U"in" || word == U"In" || (word == U"IN" && tag != "NNP")) { + u32 s = (!ctx.future_vowel || tag != "IN") ? u32(1, kPrimary) : u32(); + return {s + U"ɪn", 4}; + } + if (word == U"the" || word == U"The" || (word == U"THE" && tag == "DT")) { + return {U(ctx.future_vowel && *ctx.future_vowel ? "ði" : "ðə"), 4}; + } + if (tag == "IN") { + // re.match(r'(?i)vs\.?$', word) + u32 l = py_lower(word); + if (l == U"vs" || l == U"vs.") return lookup(U"versus", "", {}, &ctx); + } + if (word == U"used" || word == U"Used" || word == U"USED") { + LexValue v = f_.gold(U"used"); + if ((tag == "VBD" || tag == "JJ") && ctx.future_to) return {v.by_tag[TAG_VBD], 4}; + return {v.by_tag[TAG_DEFAULT], 4}; + } + return {}; + } + + bool is_known(const u32 & word) const { + if (in_golds(word) || word == U"%" || word == U"&" || word == U"+" || word == U"@" || in_silvers(word)) return true; + if (!py_str_isalpha(word) || !all_lexicon_ords(word)) return false; + if (word.size() == 1) return true; + if (word == py_upper(word) && in_golds(py_lower(word))) return true; + u32 rest = word.substr(1); + return rest == py_upper(rest); + } + + Result lookup(u32 word, std::string tag, Stress stress, const TokenContext * ctx) const { + std::optional is_NNP; + if (word == py_upper(word) && !in_golds(word)) { + word = py_lower(word); + is_NNP = tag == "NNP"; + } + LexValue v = f_.gold(word); + int rating = 4; + if (!v.found && !(is_NNP && *is_NNP)) { + v = f_.silver(word); + rating = 3; + } + Ps ps; + if (v.found && v.is_dict) { + int id; + if (ctx && !ctx->future_vowel && v.has_tag[TAG_NONE]) { + id = TAG_NONE; + } else { + id = tag_id(tag); + if (id < 0 || !v.has_tag[id]) id = tag_id(parent_tag(tag)); + } + ps = (id >= 0 && v.has_tag[id]) ? v.by_tag[id] : v.by_tag[TAG_DEFAULT]; + } else if (v.found) { + ps = v.plain; + } + if (!ps || (is_NNP && *is_NNP && !contains(*ps, kPrimary))) { + // ps, rating = self.get_NNP(word): on failure both become None + return get_NNP(word); + } + return {apply_stress(ps, stress), ps ? std::optional(rating) : std::nullopt}; + } + + u32 _s(const u32 & stem) const { + char32_t c = stem.back(); + if (contains(U"ptkfθ", c)) return stem + U"s"; + if (contains(U"szʃʒʧʤ", c)) return stem + U"ᵻz"; + return stem + U"z"; + } + Ps _s(const Ps & stem) const { + if (!stem || stem->empty()) return {}; + return _s(*stem); + } + + Result stem_s(const u32 & word, const std::string & tag, Stress stress, const TokenContext * ctx) const { + if (word.size() < 3 || word.back() != 's') return {}; + u32 stem; + if (!ends_with(word, U"ss") && is_known(word.substr(0, word.size() - 1))) { + stem = word.substr(0, word.size() - 1); + } else if ((ends_with(word, U"'s") || (word.size() > 4 && ends_with(word, U"es") && !ends_with(word, U"ies"))) && + is_known(word.substr(0, word.size() - 2))) { + stem = word.substr(0, word.size() - 2); + } else if (word.size() > 4 && ends_with(word, U"ies") && is_known(word.substr(0, word.size() - 3) + U"y")) { + stem = word.substr(0, word.size() - 3) + U"y"; + } else { + return {}; + } + Result r = lookup(stem, tag, stress, ctx); + return {_s(r.ps), r.rating}; + } + + Ps _ed(const Ps & stem_in) const { + if (!stem_in || stem_in->empty()) return {}; + const u32 & stem = *stem_in; + char32_t c = stem.back(); + if (contains(U"pkfθʃsʧ", c)) return stem + U"t"; + if (c == 'd') return stem + U"ᵻd"; + if (c != 't') return stem + U"d"; + if (stem.size() < 2) return stem + U"ɪd"; + if (contains(kUsTaus, stem[stem.size() - 2])) return stem.substr(0, stem.size() - 1) + U"ɾᵻd"; + return stem + U"ᵻd"; + } + + Result stem_ed(const u32 & word, const std::string & tag, Stress stress, const TokenContext * ctx) const { + if (word.size() < 4 || word.back() != 'd') return {}; + u32 stem; + if (!ends_with(word, U"dd") && is_known(word.substr(0, word.size() - 1))) { + stem = word.substr(0, word.size() - 1); + } else if (word.size() > 4 && ends_with(word, U"ed") && !ends_with(word, U"eed") && + is_known(word.substr(0, word.size() - 2))) { + stem = word.substr(0, word.size() - 2); + } else { + return {}; + } + Result r = lookup(stem, tag, stress, ctx); + return {_ed(r.ps), r.rating}; + } + + Ps _ing(const Ps & stem_in) const { + if (!stem_in || stem_in->empty()) return {}; + const u32 & stem = *stem_in; + if (stem.size() > 1 && stem.back() == 't' && contains(kUsTaus, stem[stem.size() - 2])) { + return stem.substr(0, stem.size() - 1) + U"ɾɪŋ"; + } + return stem + U"ɪŋ"; + } + + static bool double_consonant_ing(const u32 & w) { + // re.search(r'([bcdgklmnprstvxz])\1ing$|cking$', word) + if (ends_with(w, U"cking")) return true; + if (w.size() < 5 || !ends_with(w, U"ing")) return false; + char32_t a = w[w.size() - 5], b = w[w.size() - 4]; + return a == b && contains(U"bcdgklmnprstvxz", a); + } + + Result stem_ing(const u32 & word, const std::string & tag, Stress stress, const TokenContext * ctx) const { + if (word.size() < 5 || !ends_with(word, U"ing")) return {}; + u32 stem; + u32 base = word.substr(0, word.size() - 3); + if (word.size() > 5 && is_known(base)) { + stem = base; + } else if (is_known(base + U"e")) { + stem = base + U"e"; + } else if (word.size() > 5 && double_consonant_ing(word) && is_known(word.substr(0, word.size() - 4))) { + stem = word.substr(0, word.size() - 4); + } else { + return {}; + } + Result r = lookup(stem, tag, stress, ctx); + return {_ing(r.ps), r.rating}; + } + + Result get_word(u32 word, const std::string & tag, Stress stress, const TokenContext & ctx) const { + Result sc = get_special_case(word, tag, stress, ctx); + if (sc.ps) return sc; + u32 wl = py_lower(word); + u32 no_apos; + for (char32_t c : word) if (c != '\'') no_apos += c; + if (word.size() > 1 && py_str_isalpha(no_apos) && word != wl && (tag != "NNP" || word.size() > 7) && + !in_golds(word) && !in_silvers(word) && (word == py_upper(word) || word.substr(1) == py_lower(word.substr(1))) && + (in_golds(wl) || in_silvers(wl) || truthy(stem_s(wl, tag, stress, &ctx).ps) || + truthy(stem_ed(wl, tag, stress, &ctx).ps) || truthy(stem_ing(wl, tag, stress, &ctx).ps))) { + word = wl; + } + if (is_known(word)) return lookup(word, tag, stress, &ctx); + if (ends_with(word, U"s'") && is_known(word.substr(0, word.size() - 2) + U"'s")) { + return lookup(word.substr(0, word.size() - 2) + U"'s", tag, stress, &ctx); + } + if (ends_with(word, U"'") && is_known(word.substr(0, word.size() - 1))) { + return lookup(word.substr(0, word.size() - 1), tag, stress, &ctx); + } + Result r = stem_s(word, tag, stress, &ctx); + if (r.ps) return r; + r = stem_ed(word, tag, stress, &ctx); + if (r.ps) return r; + r = stem_ing(word, tag, stress ? stress : Stress(0.5), &ctx); + if (r.ps) return r; + return {}; + } + + static bool is_currency(const u32 & word) { + size_t dots = std::count(word.begin(), word.end(), U'.'); + if (dots == 0) return true; + if (dots > 1) return false; + u32 cents = word.substr(word.find('.') + 1); + // set(cents) == {0} compares characters with the int 0: never true + return cents.size() < 3; + } + + Result get_number(u32 word, const std::optional & currency, bool is_head, const std::string & num_flags) const { + // suffix = re.search(r"[a-z']+$", word) + size_t k = word.size(); + while (k > 0 && ((word[k - 1] >= 'a' && word[k - 1] <= 'z') || word[k - 1] == '\'')) k--; + std::optional suffix; + if (k < word.size()) { + suffix = word.substr(k); + word = word.substr(0, k); + } + auto is_ordinal_suffix = [&]() { + return suffix && (*suffix == U"st" || *suffix == U"nd" || *suffix == U"rd" || *suffix == U"th"); + }; + std::vector result; + if (!word.empty() && word[0] == '-') { + result.push_back(lookup(U"minus", "", {}, nullptr)); + word = word.substr(1); + } + auto extend_words = [&](const u32 & words, bool first) { + // re.split(r'[^a-z]+', ...) + std::vector splits; + u32 cur; + bool in_sep = false; + for (char32_t c : words) { + if (c >= 'a' && c <= 'z') { + cur += c; + in_sep = false; + } else if (!in_sep) { + splits.push_back(cur); + cur.clear(); + in_sep = true; + } + } + splits.push_back(cur); + for (size_t i = 0; i < splits.size(); i++) { + const u32 & w = splits[i]; + if (w != U"and" || num_flags.find('&') != std::string::npos) { + if (first && i == 0 && splits.size() > 1 && w == U"one" && num_flags.find('a') != std::string::npos) { + result.push_back({U"ə", 4}); + } else { + result.push_back(lookup(w, "", w == U"point" ? Stress(-2) : Stress(), nullptr)); + } + } else if (w == U"and" && num_flags.find('n') != std::string::npos && !result.empty()) { + Result & last = result.back(); + if (last.ps) last.ps = *last.ps + U"ən"; + } + } + }; + auto extend_num = [&](const u32 & num, bool first) { + std::string d = to_utf8(num); + extend_words(number_cardinal(d), first); + }; + const bool digits = is_ascii_digits(word); + if (digits && is_ordinal_suffix()) { + extend_words(number_ordinal(to_utf8(word)), true); + } else if (result.empty() && word.size() == 4 && !(currency && (*currency == U"$" || *currency == U"£" || *currency == U"€")) && digits) { + extend_words(number_year(to_utf8(word)), true); + } else if (!is_head && !contains(word, U'.')) { + u32 num; + for (char32_t c : word) if (c != ',') num += c; + if (num.empty()) return {}; + if (num[0] == '0' || num.size() > 3) { + for (char32_t c : num) extend_num(u32(1, c), false); + } else if (num.size() == 3 && !ends_with(num, U"00")) { + extend_num(num.substr(0, 1), true); + if (num[1] == '0') { + result.push_back(lookup(U"O", "", -2.0, nullptr)); + extend_num(num.substr(2, 1), false); + } else { + extend_num(num.substr(1), false); + } + } else { + extend_num(num, true); + } + } else if (std::count(word.begin(), word.end(), U'.') > 1 || !is_head) { + bool first = true; + u32 w2; + for (char32_t c : word) if (c != ',') w2 += c; + size_t a = 0; + for (size_t i = 0; i <= w2.size(); i++) { + if (i < w2.size() && w2[i] != '.') continue; + u32 num = w2.substr(a, i - a); + a = i + 1; + if (num.empty()) { + } else if (num[0] == '0' || (num.size() != 2 && std::any_of(num.begin() + 1, num.end(), [](char32_t c) { return c != '0'; }))) { + for (char32_t c : num) extend_num(u32(1, c), false); + } else { + extend_num(num, first); + } + first = false; + } + } else if (currency && (*currency == U"$" || *currency == U"£" || *currency == U"€") && is_currency(word)) { + const char32_t * units[2]; + if (*currency == U"$") { units[0] = U"dollar"; units[1] = U"cent"; } + else if (*currency == U"£") { units[0] = U"pound"; units[1] = U"pence"; } + else { units[0] = U"euro"; units[1] = U"cent"; } + u32 w2; + for (char32_t c : word) if (c != ',') w2 += c; + std::vector> pairs; // (digits, unit) + size_t dot = w2.find('.'); + pairs.push_back({dot == u32::npos ? w2 : w2.substr(0, dot), units[0]}); + if (dot != u32::npos) pairs.push_back({w2.substr(dot + 1), units[1]}); + auto value_is_zero = [](const u32 & d) { return std::all_of(d.begin(), d.end(), [](char32_t c) { return c == '0'; }); }; + auto value_is_one = [](const u32 & d) { + size_t i = 0; + while (i + 1 < d.size() && d[i] == '0') i++; + return d.substr(i) == U"1"; + }; + if (pairs.size() > 1) { + if (value_is_zero(pairs[1].first)) pairs.resize(1); + else if (value_is_zero(pairs[0].first)) pairs.erase(pairs.begin()); + } + for (size_t i = 0; i < pairs.size(); i++) { + if (i > 0) result.push_back(lookup(U"and", "", {}, nullptr)); + u32 d = pairs[i].first.empty() ? U"0" : pairs[i].first; + extend_num(d, i == 0); + const u32 & unit = pairs[i].second; + if (!value_is_one(d) && unit != U"pence") result.push_back(stem_s(unit + U"s", "", {}, nullptr)); + else result.push_back(lookup(unit, "", {}, nullptr)); + } + } else { + u32 words; + if (digits) { + if (!number_fits(to_utf8(word))) return {}; + words = number_cardinal(to_utf8(word)); + } else if (!contains(word, U'.')) { + u32 w2; + for (char32_t c : word) if (c != ',') w2 += c; + if (!is_ascii_digits(w2) || !number_fits(to_utf8(w2))) return {}; + words = is_ordinal_suffix() ? number_ordinal(to_utf8(w2)) : number_cardinal(to_utf8(w2)); + } else { + u32 w2; + for (char32_t c : word) if (c != ',') w2 += c; + if (w2[0] == '.') { + words = U"point"; + for (size_t i = 1; i < w2.size(); i++) words += U" " + number_cardinal(to_utf8(u32(1, w2[i]))); + } else { + words = number_float(to_utf8(w2)); + } + } + extend_words(words, true); + } + if (result.empty()) return {}; + u32 joined; + int rating = 99; + for (size_t i = 0; i < result.size(); i++) { + if (!result[i].ps) return {}; // misaki would raise on a None in ' '.join + if (i) joined += U" "; + joined += *result[i].ps; + rating = std::min(rating, result[i].rating.value_or(0)); + } + if (suffix && (*suffix == U"s" || *suffix == U"'s")) return {_s(joined), rating}; + if (suffix && (*suffix == U"ed" || *suffix == U"'d")) return {_ed(Ps(joined)), rating}; + if (suffix && *suffix == U"ing") return {_ing(Ps(joined)), rating}; + return {joined, rating}; + } + + Ps append_currency(const Ps & ps, const std::optional & currency) const { + if (!currency || currency->empty()) return ps; + const char32_t * unit = nullptr; + if (*currency == U"$") unit = U"dollars"; + else if (*currency == U"£") unit = U"pounds"; + else if (*currency == U"€") unit = U"euros"; + if (!unit) return ps; + Ps c = stem_s(unit, "", {}, nullptr).ps; + return c ? Ps(*ps + U" " + *c) : ps; + } + + static bool is_number(const u32 & word_in, bool is_head) { + if (!std::any_of(word_in.begin(), word_in.end(), [](char32_t c) { return c >= '0' && c <= '9'; })) return false; + u32 word = word_in; + for (const char32_t * s : {U"ing", U"'d", U"ed", U"'s", U"st", U"nd", U"rd", U"th", U"s"}) { + if (ends_with(word, s)) { + word = word.substr(0, word.size() - u32(s).size()); + break; + } + } + for (size_t i = 0; i < word.size(); i++) { + char32_t c = word[i]; + if (!((c >= '0' && c <= '9') || c == ',' || c == '.' || (is_head && i == 0 && c == '-'))) return false; + } + return true; + } + + Result operator()(const MToken & tk, const TokenContext & ctx) const { + u32 word = tk.alias ? *tk.alias : tk.text; + word = replace_all(replace_all(word, U"‘", U"'"), U"’", U"'"); + word = nfkc(word); + u32 w2; + for (char32_t c : word) { + int d = py_digit_value(c); + // numeric_if_needed: every isdigit() character has an integral value + if (d >= 0) w2 += U(std::to_string(d).c_str()); + else w2 += c; + } + word = w2; + Stress stress; + if (word != py_lower(word)) stress = (word == py_upper(word)) ? 2.0 : 0.5; + Result r = get_word(word, tk.tag, stress, ctx); + if (r.ps) return {apply_stress(append_currency(r.ps, tk.currency), tk.stress), r.rating}; + if (is_number(word, tk.is_head)) { + Result n = get_number(word, tk.currency, tk.is_head, tk.num_flags); + return {apply_stress(n.ps, tk.stress), n.rating}; + } + return {}; + } + + private: + const LexFile & f_; +}; + +MToken merge_tokens(const std::vector & tokens, const std::optional & unk) { + std::set stresses; + for (auto & t : tokens) if (t.stress) stresses.insert(*t.stress); + std::optional currency; + for (auto & t : tokens) if (t.currency && (!currency || *t.currency > *currency)) currency = t.currency; + bool any_none_rating = false; + int min_rating = 1 << 30; + for (auto & t : tokens) { + if (!t.rating) any_none_rating = true; + else min_rating = std::min(min_rating, *t.rating); + } + MToken out; + std::optional ps; + if (unk) { + u32 p; + for (auto & tk : tokens) { + if (tk.prespace && !p.empty() && !py_isspace(p.back()) && tk.phonemes && !tk.phonemes->empty()) p += U" "; + p += tk.phonemes ? *tk.phonemes : *unk; + } + ps = p; + } + for (size_t i = 0; i + 1 < tokens.size(); i++) out.text += tokens[i].text + tokens[i].whitespace; + out.text += tokens.back().text; + int best = -1; + for (auto & tk : tokens) { + int score = 0; + for (char32_t c : tk.text) score += (u32(1, c) == py_lower(u32(1, c))) ? 1 : 2; + if (score > best) { + best = score; + out.tag = tk.tag; + } + } + out.whitespace = tokens.back().whitespace; + out.phonemes = ps; + out.is_head = tokens[0].is_head; + out.alias.reset(); + if (stresses.size() == 1) out.stress = *stresses.begin(); + out.currency = currency; + std::set flags; + for (auto & t : tokens) for (char c : t.num_flags) flags.insert(c); + for (char c : flags) out.num_flags += c; + out.prespace = tokens[0].prespace; + if (!any_none_rating) out.rating = min_rating; + return out; +} + +TokenContext token_context(const TokenContext & ctx, const Ps & ps, const MToken & token) { + TokenContext out; + out.future_vowel = ctx.future_vowel; + if (ps && !ps->empty()) { + for (char32_t c : *ps) { + if (contains(kVowels, c) || contains(kConsonants, c) || contains(kNonQuotePuncts, c)) { + if (contains(kNonQuotePuncts, c)) out.future_vowel.reset(); + else out.future_vowel = contains(kVowels, c); + break; + } + } + } + out.future_to = token.text == U"to" || token.text == U"To" || (token.text == U"TO" && (token.tag == "TO" || token.tag == "IN")); + return out; +} + +void resolve_tokens(std::vector & tokens) { + u32 text; + for (size_t i = 0; i + 1 < tokens.size(); i++) text += tokens[i].text + tokens[i].whitespace; + text += tokens.back().text; + bool prespace = contains(text, U' ') || contains(text, U'/'); + if (!prespace) { + std::set kinds; + for (char32_t c : text) { + if (contains(kSubtokenJunks, c)) continue; + kinds.insert(py_isalpha(c) ? 0 : ((c >= '0' && c <= '9') ? 1 : 2)); + } + prespace = kinds.size() > 1; + } + for (size_t i = 0; i < tokens.size(); i++) { + MToken & tk = tokens[i]; + if (!tk.phonemes) { + if (i == tokens.size() - 1 && tk.text.size() == 1 && contains(kNonQuotePuncts, tk.text[0])) { + tk.phonemes = tk.text; + tk.rating = 3; + } else if (std::all_of(tk.text.begin(), tk.text.end(), [](char32_t c) { return contains(kSubtokenJunks, c); })) { + tk.phonemes = u32(); + tk.rating = 3; + } + } else if (i > 0) { + tk.prespace = prespace; + } + } + if (prespace) return; + struct Idx { bool primary; int weight; size_t i; }; + std::vector indices; + for (size_t i = 0; i < tokens.size(); i++) { + if (tokens[i].phonemes && !tokens[i].phonemes->empty()) { + indices.push_back({contains(*tokens[i].phonemes, kPrimary), stress_weight(tokens[i].phonemes), i}); + } + } + if (indices.size() == 2 && tokens[indices[0].i].text.size() == 1) { + size_t i = indices[1].i; + tokens[i].phonemes = apply_stress(tokens[i].phonemes, -0.5); + return; + } + size_t n_primary = 0; + for (auto & x : indices) n_primary += x.primary; + if (indices.size() < 2 || n_primary <= (indices.size() + 1) / 2) return; + std::sort(indices.begin(), indices.end(), [](const Idx & a, const Idx & b) { + if (a.primary != b.primary) return a.primary < b.primary; + if (a.weight != b.weight) return a.weight < b.weight; + return a.i < b.i; + }); + indices.resize(indices.size() / 2); + for (auto & x : indices) tokens[x.i].phonemes = apply_stress(tokens[x.i].phonemes, -0.5); +} + +// misaki G2P.preprocess: markdown-style [text](feature) links. +struct Preprocessed { + u32 text; + std::vector tokens; + std::vector> features; // token index -> raw feature +}; + +std::vector py_split(const u32 & s) { + std::vector out; + u32 cur; + for (char32_t c : s) { + if (py_isspace(c)) { + if (!cur.empty()) out.push_back(cur); + cur.clear(); + } else { + cur += c; + } + } + if (!cur.empty()) out.push_back(cur); + return out; +} + +Preprocessed preprocess(const u32 & text_in) { + Preprocessed p; + size_t a = 0; + while (a < text_in.size() && py_isspace(text_in[a])) a++; + u32 text = text_in.substr(a); + size_t last_end = 0; + size_t pos = 0; + // LINK_REGEX = r'\[([^\]]+)\]\(([^\)]*)\)' + while (pos < text.size()) { + size_t lb = text.find('[', pos); + if (lb == u32::npos) break; + size_t rb = lb + 1; + while (rb < text.size() && text[rb] != ']') rb++; + if (rb >= text.size() || rb == lb + 1 || rb + 1 >= text.size() || text[rb + 1] != '(') { + pos = lb + 1; + continue; + } + size_t rp = rb + 2; + while (rp < text.size() && text[rp] != ')') rp++; + if (rp >= text.size()) { + pos = lb + 1; + continue; + } + u32 g1 = text.substr(lb + 1, rb - lb - 1); + u32 f = text.substr(rb + 2, rp - rb - 2); + p.text += text.substr(last_end, lb - last_end); + for (auto & t : py_split(text.substr(last_end, lb - last_end))) p.tokens.push_back(t); + std::string feat; + u32 body = f; + if (!f.empty() && (f[0] == '-' || f[0] == '+')) body = f.substr(1); + if (is_ascii_digits(body)) { + feat = "i" + to_utf8(f); + } else if (f == U"0.5" || f == U"+0.5") { + feat = "f0.5"; + } else if (f == U"-0.5") { + feat = "f-0.5"; + } else if (f.size() > 1 && f[0] == '/' && f.back() == '/') { + u32 v = f.substr(1); + while (!v.empty() && v.back() == '/') v.pop_back(); + while (!v.empty() && v.front() == '/') v.erase(v.begin()); // later .lstrip('/') + feat = "s/" + to_utf8(v); + } else if (f.size() > 1 && f[0] == '#' && f.back() == '#') { + u32 v = f.substr(1); + while (!v.empty() && v.back() == '#') v.pop_back(); + while (!v.empty() && v.front() == '#') v.erase(v.begin()); + feat = "s#" + to_utf8(v); + } + if (!feat.empty()) p.features.emplace_back(p.tokens.size(), feat); + p.text += g1; + p.tokens.push_back(g1); + last_end = rp + 1; + pos = rp + 1; + } + if (last_end < text.size()) { + p.text += text.substr(last_end); + for (auto & t : py_split(text.substr(last_end))) p.tokens.push_back(t); + } + return p; +} + +// A misaki "word": one token, or a run of subtokens with no space between. +struct Word { + bool is_list = false; + std::vector toks; +}; + +} // namespace + +std::optional apply_stress_for_test(const std::optional & ps, std::optional stress) { + return apply_stress(ps, stress); +} + +std::optional G2P::fallback(const MToken & tk) { + last_fallback_count++; + std::optional ps; + if (fallback_) { + ps = (*fallback_)(tk.text); + } else { + // No eSpeak: read the word's letters, like misaki's get_NNP. + Result r = Lexicon(lex_).get_NNP(tk.text); + if (r.ps && !r.ps->empty()) ps = r.ps; + } + if (ps) { + // paradee maps phonemes to ids with `if c in vocab`; drop the rare + // eSpeak symbols outside the vocabulary here so the string has the + // same ids and every symbol is valid. + u32 kept; + for (char32_t c : *ps) if (in_paradee_vocab(c)) kept += c; + ps = kept; + } + return ps; +} + +u32 G2P::operator()(const u32 & input, std::vector * tokens_out) { + Lexicon lexicon(lex_); + last_fallback_count = 0; + const std::optional unk = u32(); // paradee: unk='' + Preprocessed pre = preprocess(input); + std::vector st = spacy_tokenize(pre.text); + std::vector tags = tag_tokens(st, &lex_); + std::vector tokens; + for (size_t i = 0; i < st.size(); i++) { + MToken t; + t.text = st[i].text; + t.tag = tags[i]; + t.whitespace = st[i].space_after ? U" " : U""; + tokens.push_back(std::move(t)); + } + if (!pre.features.empty()) { + // spacy.training.Alignment.from_strings(tokens, spacy tokens): align + // on characters, whitespace removed, lowercased. + std::vector xchar, ychar; + u32 xs, ys; + for (size_t k = 0; k < pre.tokens.size(); k++) { + for (char32_t c : pre.tokens[k]) if (!py_isspace(c)) { xs += c; xchar.push_back(k); } + } + for (size_t k = 0; k < tokens.size(); k++) { + for (char32_t c : tokens[k].text) if (!py_isspace(c)) { ys += c; ychar.push_back(k); } + } + std::vector flat; // align.y2x.data + if (py_lower(xs) == py_lower(ys)) { + for (size_t y = 0; y < tokens.size(); y++) { + std::set xsset; + for (size_t c = 0; c < ychar.size(); c++) if (ychar[c] == y) xsset.insert(xchar[c]); + for (size_t x : xsset) flat.push_back(x); + } + } + for (auto & fv : pre.features) { + size_t k = fv.first; + const std::string & v = fv.second; + size_t i = 0; + for (size_t pos = 0; pos < flat.size(); pos++) { + if (flat[pos] != k) continue; + size_t j = pos; + size_t this_i = i++; + if (j >= tokens.size()) continue; + if (v[0] == 'i') tokens[j].stress = std::stod(v.substr(1)); + else if (v[0] == 'f') tokens[j].stress = std::stod(v.substr(1)); + else if (v.rfind("s/", 0) == 0) { + tokens[j].is_head = this_i == 0; + tokens[j].phonemes = this_i == 0 ? U(v.substr(2).c_str()) : u32(); + tokens[j].rating = 5; + } else if (v.rfind("s#", 0) == 0) { + tokens[j].num_flags = v.substr(2); + } + } + } + } + // fold_left + { + std::vector result; + for (auto & tk : tokens) { + if (!result.empty() && !tk.is_head) { + MToken prev = result.back(); + result.pop_back(); + result.push_back(merge_tokens({prev, tk}, unk)); + } else { + result.push_back(tk); + } + } + tokens.swap(result); + } + // retokenize + std::vector words; + { + std::optional currency; + for (size_t i = 0; i < tokens.size(); i++) { + const MToken & token = tokens[i]; + std::vector tks; + if (!token.alias && !token.phonemes) { + for (const u32 & t : subtokenize(token.text)) { + MToken s; + s.text = t; + s.tag = token.tag; + s.whitespace = U""; + s.phonemes = token.phonemes; + s.is_head = true; + s.num_flags = token.num_flags; + s.stress = token.stress; + s.prespace = false; + tks.push_back(std::move(s)); + } + } else { + tks.push_back(token); + } + if (tks.empty()) continue; // subtokenize found nothing (misaki would raise on tks[-1]) + tks.back().whitespace = token.whitespace; + for (size_t j = 0; j < tks.size(); j++) { + MToken & tk = tks[j]; + if (tk.alias || tk.phonemes) { + } else if (tk.tag == "$" && (tk.text == U"$" || tk.text == U"£" || tk.text == U"€")) { + currency = tk.text; + tk.phonemes = u32(); + tk.rating = 4; + } else if (tk.tag == ":" && (tk.text == U"-" || tk.text == U"–")) { + tk.phonemes = U"—"; + tk.rating = 3; + } else if (is_punct_tag(tk.tag) && + !std::all_of(tk.text.begin(), tk.text.end(), [](char32_t c) { + u32 l = py_lower(u32(1, c)); + return l.size() == 1 && l[0] >= 97 && l[0] <= 122; + })) { + if (tk.tag == "-LRB-") tk.phonemes = U"("; + else if (tk.tag == "-RRB-") tk.phonemes = U")"; + else if (tk.tag == "``") tk.phonemes = U"“"; + else if (tk.tag == "\"\"" || tk.tag == "''") tk.phonemes = U"”"; + else { + u32 p; + for (char32_t c : tk.text) if (contains(kPuncts, c)) p += c; + tk.phonemes = p; + } + tk.rating = 4; + } else if (currency) { + if (tk.tag != "CD") { + currency.reset(); + } else if (j + 1 == tks.size() && (i + 1 == tokens.size() || tokens[i + 1].tag != "CD")) { + tk.currency = currency; + } + } else if (j > 0 && j + 1 < tks.size() && tk.text == U"2") { + u32 pair; + pair += tks[j - 1].text.back(); + pair += tks[j + 1].text.front(); + if (py_str_isalpha(pair)) tk.alias = U"to"; + } + if (tk.alias || tk.phonemes) { + words.push_back({false, {tk}}); + } else if (!words.empty() && words.back().is_list && words.back().toks.back().whitespace.empty()) { + tk.is_head = false; + words.back().toks.push_back(tk); + } else if (!tk.whitespace.empty()) { + words.push_back({false, {tk}}); + } else { + words.push_back({true, {tk}}); + } + } + } + // misaki's list-word search is cubic in the number of subtokens; a + // run of more than 64 (never seen in real text) is cut into pieces so + // hostile input cannot stall the caller. + constexpr size_t kMaxRun = 64; + std::vector capped; + for (auto & w : words) { + if (!w.is_list || w.toks.size() <= kMaxRun) { + capped.push_back(std::move(w)); + continue; + } + for (size_t a = 0; a < w.toks.size(); a += kMaxRun) { + Word part; + part.is_list = true; + part.toks.assign(w.toks.begin() + a, w.toks.begin() + std::min(w.toks.size(), a + kMaxRun)); + capped.push_back(std::move(part)); + } + } + words.swap(capped); + for (auto & w : words) if (w.is_list && w.toks.size() == 1) w.is_list = false; + } + TokenContext ctx; + for (size_t wi = words.size(); wi-- > 0;) { + Word & w = words[wi]; + if (!w.is_list) { + MToken & tk = w.toks[0]; + if (!tk.phonemes) { + Result r = lexicon(tk, ctx); + tk.phonemes = r.ps; + tk.rating = r.rating; + } + if (!tk.phonemes) { + tk.phonemes = fallback(tk); + tk.rating = tk.phonemes ? std::optional(2) : std::nullopt; + } + ctx = token_context(ctx, tk.phonemes, tk); + continue; + } + size_t left = 0, right = w.toks.size(); + bool should_fallback = false; + while (left < right) { + bool any_set = false; + for (size_t k = left; k < right; k++) if (w.toks[k].alias || w.toks[k].phonemes) any_set = true; + Result r; + MToken merged; + if (!any_set) { + std::vector part(w.toks.begin() + left, w.toks.begin() + right); + merged = merge_tokens(part, std::nullopt); + r = lexicon(merged, ctx); + } + if (r.ps) { + w.toks[left].phonemes = r.ps; + w.toks[left].rating = r.rating; + for (size_t k = left + 1; k < right; k++) w.toks[k].phonemes = u32(); + ctx = token_context(ctx, r.ps, merged); + right = left; + left = 0; + } else if (left + 1 < right) { + left++; + } else { + right--; + MToken & tk = w.toks[right]; + if (!tk.phonemes) { + if (std::all_of(tk.text.begin(), tk.text.end(), [](char32_t c) { return contains(kSubtokenJunks, c); })) { + tk.phonemes = u32(); + tk.rating = 3; + } else { + should_fallback = true; + break; + } + } + left = 0; + } + } + if (should_fallback) { + MToken merged = merge_tokens(w.toks, std::nullopt); + w.toks[0].phonemes = fallback(merged); + w.toks[0].rating = w.toks[0].phonemes ? std::optional(2) : std::nullopt; + for (size_t k = 1; k < w.toks.size(); k++) { + w.toks[k].phonemes = u32(); + w.toks[k].rating = w.toks[0].rating; + } + } else { + resolve_tokens(w.toks); + } + } + std::vector final_tokens; + for (auto & w : words) { + if (w.is_list) final_tokens.push_back(merge_tokens(w.toks, unk)); + else final_tokens.push_back(w.toks[0]); + } + u32 out; + for (auto & tk : final_tokens) { + if (tk.phonemes) { + for (char32_t & c : *tk.phonemes) { + if (c == U'ɾ') c = 'T'; + else if (c == U'ʔ') c = 't'; + } + } + out += (tk.phonemes ? *tk.phonemes : *unk) + tk.whitespace; + } + if (tokens_out) *tokens_out = std::move(final_tokens); + return out; +} + +std::vector paradee_chunks(G2P & g2p, const u32 & text, size_t max_phonemes) { + // re.split(r"(?<=[.!?…])\s+|\n+", text.strip()) + u32 t = py_strip(text); + std::vector sentences; + u32 cur; + size_t i = 0; + while (i < t.size()) { + char32_t c = t[i]; + bool after_end = i > 0 && contains(U".!?…", t[i - 1]); + if (after_end && py_isspace(c)) { + size_t j = i; + while (j < t.size() && py_isspace(t[j])) j++; + sentences.push_back(cur); + cur.clear(); + i = j; + continue; + } + if (c == '\n') { + size_t j = i; + while (j < t.size() && t[j] == '\n') j++; + sentences.push_back(cur); + cur.clear(); + i = j; + continue; + } + cur += c; + i++; + } + sentences.push_back(cur); + std::vector chunks; + for (const u32 & s : sentences) { + if (py_strip(s).empty()) continue; + u32 ps = g2p(s); + while (ps.size() > max_phonemes) { + size_t cut = ps.rfind(U' ', max_phonemes - 1); + // ps.rfind(" ", 0, MAX) searches ps[0:MAX]; cut > 0 or MAX + if (cut == u32::npos || cut == 0) cut = max_phonemes; + chunks.push_back(ps.substr(0, cut)); + ps = ps.substr(cut); + size_t k = 0; + while (k < ps.size() && py_isspace(ps[k])) k++; + ps = ps.substr(k); + } + if (!ps.empty()) chunks.push_back(ps); + } + return chunks; +} + +} // namespace misaki diff --git a/tools/misaki-g2p/src/lexicon.cpp b/tools/misaki-g2p/src/lexicon.cpp new file mode 100644 index 0000000000..3922336e48 --- /dev/null +++ b/tools/misaki-g2p/src/lexicon.cpp @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: Apache-2.0 +// Reader for misaki-en-us.lex (written by convert_misaki_lexicon.py). +#include "misaki-internal.h" + +#include +#include + +#if defined(_WIN32) +# define MISAKI_NO_MMAP 1 +#else +# include +# include +# include +# include +#endif + +namespace misaki { +namespace { + +constexpr size_t kHeader = 128; +constexpr size_t kEntry = 12; +constexpr size_t kVariant = 8; + +uint32_t rd32(const uint8_t * p) { return (uint32_t) p[0] | ((uint32_t) p[1] << 8) | ((uint32_t) p[2] << 16) | ((uint32_t) p[3] << 24); } +uint16_t rd16(const uint8_t * p) { return (uint16_t) (p[0] | (p[1] << 8)); } + +} // namespace + +std::unique_ptr LexFile::open(const std::string & path, std::string & err) { + std::unique_ptr lf(new LexFile()); +#if !defined(MISAKI_NO_MMAP) + int fd = ::open(path.c_str(), O_RDONLY | O_CLOEXEC); + if (fd < 0) { + err = "cannot open lexicon " + path + ": " + std::strerror(errno); + return nullptr; + } + struct stat st; + if (fstat(fd, &st) != 0 || st.st_size < (off_t) kHeader) { + ::close(fd); + err = "lexicon " + path + " is too small"; + return nullptr; + } + void * p = mmap(nullptr, (size_t) st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + ::close(fd); + if (p == MAP_FAILED) { + err = "cannot mmap lexicon " + path + ": " + std::strerror(errno); + return nullptr; + } + lf->base_ = (const uint8_t *) p; + lf->size_ = (size_t) st.st_size; + lf->mapped_ = true; +#else + FILE * f = std::fopen(path.c_str(), "rb"); + if (!f) { + err = "cannot open lexicon " + path; + return nullptr; + } + std::fseek(f, 0, SEEK_END); + long n = std::ftell(f); + std::fseek(f, 0, SEEK_SET); + if (n < (long) kHeader) { + std::fclose(f); + err = "lexicon " + path + " is too small"; + return nullptr; + } + lf->owned_.resize((size_t) n); + size_t got = std::fread(lf->owned_.data(), 1, (size_t) n, f); + std::fclose(f); + if (got != (size_t) n) { + err = "short read on lexicon " + path; + return nullptr; + } + lf->base_ = lf->owned_.data(); + lf->size_ = (size_t) n; +#endif + const uint8_t * h = lf->base_; + if (std::memcmp(h, "MISAKILX", 8) != 0) { + err = "lexicon " + path + " has a bad magic (not a misaki-en-us.lex)"; + return nullptr; + } + uint32_t version = rd32(h + 8); + if (version != 1) { + err = "lexicon " + path + " has format version " + std::to_string(version) + ", expected 1"; + return nullptr; + } + lf->n_gold_ = rd32(h + 16); + lf->n_silver_ = rd32(h + 20); + lf->n_var_ = rd32(h + 24); + lf->n_str_ = rd32(h + 28); + uint32_t off_gold = rd32(h + 96), off_silver = rd32(h + 100), off_var = rd32(h + 104), off_str = rd32(h + 108); + uint32_t total = rd32(h + 112); + if (total != lf->size_ || (uint64_t) off_gold + (uint64_t) lf->n_gold_ * kEntry > off_silver || + (uint64_t) off_silver + (uint64_t) lf->n_silver_ * kEntry > off_var || + (uint64_t) off_var + (uint64_t) lf->n_var_ * kVariant > off_str || (uint64_t) off_str + lf->n_str_ > total) { + err = "lexicon " + path + " is truncated or inconsistent"; + return nullptr; + } + lf->gold_ = h + off_gold; + lf->silver_ = h + off_silver; + lf->variants_ = h + off_var; + lf->strings_ = h + off_str; + // Validate every reference once so lookups need no bounds checks. + for (int t = 0; t < 2; t++) { + const uint8_t * e = t ? lf->silver_ : lf->gold_; + uint32_t n = t ? lf->n_silver_ : lf->n_gold_; + for (uint32_t i = 0; i < n; i++, e += kEntry) { + uint32_t koff = rd32(e), klen = rd16(e + 4), nv = rd16(e + 6), first = rd32(e + 8); + if ((uint64_t) koff + klen > lf->n_str_ || nv == 0 || (uint64_t) first + nv > lf->n_var_) { + err = "lexicon " + path + " has a bad entry"; + return nullptr; + } + } + } + for (uint32_t i = 0; i < lf->n_var_; i++) { + const uint8_t * v = lf->variants_ + (size_t) i * kVariant; + if (v[0] >= TAG_COUNT || (uint64_t) rd32(v + 4) + rd16(v + 2) > lf->n_str_) { + err = "lexicon " + path + " has a bad variant"; + return nullptr; + } + } + return lf; +} + +LexFile::~LexFile() { +#if !defined(MISAKI_NO_MMAP) + if (mapped_ && base_) munmap((void *) base_, size_); +#endif +} + +long LexFile::find(const uint8_t * entries, uint32_t n, const std::string & key) const { + long lo = 0, hi = (long) n; + while (lo < hi) { + long mid = (lo + hi) / 2; + const uint8_t * e = entries + (size_t) mid * kEntry; + uint32_t koff = rd32(e), klen = rd16(e + 4); + int c = std::memcmp(strings_ + koff, key.data(), std::min(klen, key.size())); + if (c == 0) c = (klen < key.size()) ? -1 : (klen > key.size() ? 1 : 0); + if (c == 0) return mid; + if (c < 0) lo = mid + 1; + else hi = mid; + } + return -1; +} + +LexValue LexFile::get(const uint8_t * entries, uint32_t n, const u32 & key) const { + LexValue out; + long i = find(entries, n, to_utf8(key)); + if (i < 0) return out; + out.found = true; + const uint8_t * e = entries + (size_t) i * kEntry; + uint32_t nv = rd16(e + 6), first = rd32(e + 8); + for (uint32_t k = 0; k < nv; k++) { + const uint8_t * v = variants_ + (size_t) (first + k) * kVariant; + uint8_t tag = v[0]; + std::optional val; + if (!v[1]) val = from_utf8((const char *) strings_ + rd32(v + 4), rd16(v + 2)); + if (tag == TAG_PLAIN) { + out.plain = val; + } else { + out.is_dict = true; + out.has_tag[tag] = true; + out.by_tag[tag] = val; + } + } + return out; +} + +LexValue LexFile::gold(const u32 & key) const { return get(gold_, n_gold_, key); } +LexValue LexFile::silver(const u32 & key) const { return get(silver_, n_silver_, key); } +bool LexFile::in_gold(const u32 & key) const { return find(gold_, n_gold_, to_utf8(key)) >= 0; } +bool LexFile::in_silver(const u32 & key) const { return find(silver_, n_silver_, to_utf8(key)) >= 0; } + +} // namespace misaki diff --git a/tools/misaki-g2p/src/misaki-g2p.cpp b/tools/misaki-g2p/src/misaki-g2p.cpp new file mode 100644 index 0000000000..3323d60307 --- /dev/null +++ b/tools/misaki-g2p/src/misaki-g2p.cpp @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: Apache-2.0 +// C API of misaki_g2p. +#include "misaki-g2p.h" + +#include "misaki-internal.h" + +#include +#include +#include +#include + +struct misaki_g2p { + std::unique_ptr lex; + std::unique_ptr espeak; + std::unique_ptr g2p; +}; + +namespace { + +char * dup(const std::string & s) { + char * p = (char *) std::malloc(s.size() + 1); + if (p) std::memcpy(p, s.c_str(), s.size() + 1); + return p; +} + +void set_err(char ** err, const std::string & msg) { + if (err) *err = dup(msg); +} + +} // namespace + +namespace misaki { + +// Paradee-8M v1.0 config.json "vocab" keys (HF revision 8f34b01e, config.json +// sha256 f24046974a3a8c747affefb45c7c504263a99d5081787908b16abe8f5ac94fcd). +const u32 & paradee_vocab() { + static const u32 v = + U";:,.!?—…\"()“” ̃ʣʥʦʨᵝꭧAIOQSTWYᵊ" + U"abcdefhijklmnopqrstuvwxyzɑɐɒæβɔɕçɖðʤə" + U"ɚɛɜɟɡɥɨɪʝɯɰŋɳɲɴø" + U"ɸθœɹɾɻʁɽʂʃʈʧʊʋʌɣ" + U"ɤχʎʒʔˈˌːʰʲ↓→↗↘ᵻ"; + return v; +} + +bool in_paradee_vocab(char32_t c) { return contains(paradee_vocab(), c); } + +} // namespace misaki + +extern "C" { + +misaki_g2p * misaki_g2p_open(const char * lex_path, const char * espeak_data_dir_or_null, char ** err) { + if (err) *err = nullptr; + if (!lex_path) { + set_err(err, "misaki_g2p_open: lex_path is NULL"); + return nullptr; + } + try { + std::unique_ptr g(new misaki_g2p()); + std::string e; + g->lex = misaki::LexFile::open(lex_path, e); + if (!g->lex) { + set_err(err, e); + return nullptr; + } + if (espeak_data_dir_or_null) { + g->espeak = misaki::EspeakFallback::open(espeak_data_dir_or_null, e); + if (!g->espeak) { + set_err(err, e); + return nullptr; + } + } + g->g2p.reset(new misaki::G2P(*g->lex, g->espeak.get())); + return g.release(); + } catch (const std::exception & ex) { + set_err(err, std::string("misaki_g2p_open: ") + ex.what()); + return nullptr; + } +} + +int misaki_g2p_phonemize(misaki_g2p * g, const char * utf8, size_t len, char ** out_utf8, char ** err) { + if (err) *err = nullptr; + if (out_utf8) *out_utf8 = nullptr; + if (!g || !out_utf8 || (!utf8 && len)) { + set_err(err, "misaki_g2p_phonemize: bad arguments"); + return -1; + } + try { + misaki::u32 text = misaki::from_utf8(utf8 ? utf8 : "", len); + std::vector chunks = misaki::paradee_chunks(*g->g2p, text, MISAKI_G2P_MAX_CHUNK); + misaki::u32 joined; + for (size_t i = 0; i < chunks.size(); i++) { + const misaki::u32 & c = chunks[i]; + if (c.size() > MISAKI_G2P_MAX_CHUNK) { + set_err(err, "misaki_g2p_phonemize: chunk longer than 510 symbols"); + return -2; + } + for (char32_t ch : c) { + if (!misaki::in_paradee_vocab(ch)) { + set_err(err, "misaki_g2p_phonemize: symbol U+" + std::to_string((unsigned) ch) + + " is not in the Paradee vocabulary (chunk: " + misaki::to_utf8(c) + ")"); + return -3; + } + } + if (i) joined += U'\n'; + joined += c; + } + *out_utf8 = dup(misaki::to_utf8(joined)); + if (!*out_utf8) { + set_err(err, "misaki_g2p_phonemize: out of memory"); + return -4; + } + return 0; + } catch (const std::exception & ex) { + set_err(err, std::string("misaki_g2p_phonemize: ") + ex.what()); + return -5; + } +} + +int misaki_g2p_fallback_kind(const misaki_g2p * g) { + return (g && g->espeak) ? MISAKI_G2P_FALLBACK_ESPEAK : MISAKI_G2P_FALLBACK_SPELL; +} + +int misaki_g2p_espeak_linked(void) { return misaki::espeak_linked() ? 1 : 0; } + +void misaki_g2p_free(char * s) { std::free(s); } + +void misaki_g2p_close(misaki_g2p * g) { delete g; } + +} // extern "C" diff --git a/tools/misaki-g2p/src/misaki-internal.h b/tools/misaki-g2p/src/misaki-internal.h new file mode 100644 index 0000000000..a039b109ab --- /dev/null +++ b/tools/misaki-g2p/src/misaki-internal.h @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: Apache-2.0 +// Internal interfaces of misaki_g2p, a C++ port of misaki 0.9.4's American +// English G2P (hexgrad/misaki, Apache-2.0; see LICENSES/misaki-NOTICE.txt). +// Everything works on UTF-32 strings so that Python's per-code-point string +// semantics (len, slicing, isalpha, lower, ...) carry over directly. +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace misaki { + +using u32 = std::u32string; + +// ---------------------------------------------------------------- unicode.cpp +std::string to_utf8(const u32 & s); +u32 from_utf8(const char * s, size_t n); +inline u32 from_utf8(const std::string & s) { return from_utf8(s.data(), s.size()); } +u32 U(const char * utf8); // literal helper + +// Python str semantics (CPython 3.12, Unicode 15.0) +bool py_isalpha(char32_t c); +bool py_isspace(char32_t c); +int py_digit_value(char32_t c); // str.isdigit() -> int(unicodedata.numeric(c)), else -1 +bool py_str_isalpha(const u32 & s); +bool py_str_isdigit(const u32 & s); +u32 py_lower(const u32 & s); +u32 py_upper(const u32 & s); +u32 py_capitalize(const u32 & s); +inline bool py_is_lower(const u32 & s) { return py_lower(s) == s; } // s == s.lower() +inline bool py_is_upper(const u32 & s) { return py_upper(s) == s; } // s == s.upper() +u32 py_strip(const u32 & s); +u32 nfkc(const u32 & s); + +// regex-module general categories (misaki's subtokenizer) +bool cat_L(char32_t c); +bool cat_Lu(char32_t c); +bool cat_Ll(char32_t c); +bool cat_Nd(char32_t c); + +// spaCy char_classes +bool spacy_alpha(char32_t c); +bool spacy_alpha_lower(char32_t c); +bool spacy_alpha_upper(char32_t c); +bool spacy_icon(char32_t c); +bool spacy_suffix_dot_pre(char32_t c); // lookbehind of the suffix rule for a final '.' + +inline bool contains(const u32 & s, char32_t c) { return s.find(c) != u32::npos; } +inline bool contains(const u32 & s, const u32 & t) { return s.find(t) != u32::npos; } +inline bool starts_with(const u32 & s, const u32 & p) { return s.size() >= p.size() && s.compare(0, p.size(), p) == 0; } +inline bool ends_with(const u32 & s, const u32 & p) { return s.size() >= p.size() && s.compare(s.size() - p.size(), p.size(), p) == 0; } +u32 replace_all(u32 s, const u32 & from, const u32 & to); + +// ---------------------------------------------------------------- lexicon.cpp +enum LexTag : uint8_t { + TAG_PLAIN = 0, TAG_DEFAULT, TAG_NOUN, TAG_VERB, TAG_ADJ, TAG_ADV, TAG_DT, TAG_NONE, TAG_VBD, TAG_VBN, TAG_VBP, + TAG_COUNT +}; + +// One JSON value of us_gold.json / us_silver.json: a plain string, or a dict +// of tag -> string-or-null. +struct LexValue { + bool found = false; + bool is_dict = false; + std::optional plain; + std::optional by_tag[TAG_COUNT]; + bool has_tag[TAG_COUNT] = {}; +}; + +class LexFile { + public: + static std::unique_ptr open(const std::string & path, std::string & err); + ~LexFile(); + LexValue gold(const u32 & key) const; + LexValue silver(const u32 & key) const; + bool in_gold(const u32 & key) const; + bool in_silver(const u32 & key) const; + uint32_t gold_count() const { return n_gold_; } + uint32_t silver_count() const { return n_silver_; } + + private: + LexFile() = default; + LexValue get(const uint8_t * entries, uint32_t n, const u32 & key) const; + long find(const uint8_t * entries, uint32_t n, const std::string & key) const; + const uint8_t * base_ = nullptr; + size_t size_ = 0; + bool mapped_ = false; + std::vector owned_; + const uint8_t * gold_ = nullptr; + const uint8_t * silver_ = nullptr; + const uint8_t * variants_ = nullptr; + const uint8_t * strings_ = nullptr; + uint32_t n_gold_ = 0, n_silver_ = 0, n_var_ = 0, n_str_ = 0; +}; + +// ---------------------------------------------------------------- tokens +struct MToken { + u32 text; + std::string tag; + u32 whitespace; + std::optional phonemes; + // MToken._ (addict dict; absent keys read as None) + bool is_head = true; + std::optional alias; + std::optional stress; + std::optional currency; + std::string num_flags; + bool prespace = false; + std::optional rating; +}; + +// ---------------------------------------------------------------- tokenizer.cpp +// spaCy 3.8 English tokenizer: whitespace split, exceptions, prefix/suffix/ +// infix rules and URL matching. Returns (text, whitespace) pairs. +struct SpacyToken { + u32 text; + bool space_after = false; + size_t start = 0; // code point offset into the input +}; +std::vector spacy_tokenize(const u32 & text); + +// misaki en.subtokenize (the SUBTOKEN_REGEX findall) +std::vector subtokenize(const u32 & word); + +// ---------------------------------------------------------------- tagger.cpp +// Penn Treebank tags, approximating en_core_web_sm 3.8.0 closely enough for +// the places misaki reads a tag. +std::vector tag_tokens(const std::vector & toks, const LexFile * lex); + +// ---------------------------------------------------------------- numbers.cpp +// English number words, written for this port (cardinal with "and", ordinal, +// year, decimal) to match the strings misaki got from num2words. +u32 number_cardinal(const std::string & digits); // digits only, no sign +u32 number_ordinal(const std::string & digits); +u32 number_year(const std::string & digits); +u32 number_float(const std::string & text); // "12.50", ".5", "3." +bool number_fits(const std::string & digits); // within the supported range + +// ---------------------------------------------------------------- espeak.cpp +class EspeakFallback { + public: + // Returns null and sets err when libespeak-ng is not linked or fails to load. + static std::unique_ptr open(const std::string & data_dir, std::string & err); + ~EspeakFallback(); + // misaki espeak.EspeakFallback.__call__ on a token text: phonemizer + // (preserve_punctuation, with_stress, tie='^') then the E2M table. + std::optional operator()(const u32 & text); + // The E2M mapping alone, on phonemizer-style output (tests). + static u32 e2m(const u32 & espeak_tied_ipa); + private: + EspeakFallback() = default; + u32 phonemize_line(const u32 & text); +}; +bool espeak_linked(); + +// ---------------------------------------------------------------- misaki-g2p.cpp +const u32 & paradee_vocab(); +bool in_paradee_vocab(char32_t c); + +// ---------------------------------------------------------------- g2p.cpp +struct G2POptions { + std::u32string unk; // paradee passes unk='' +}; + +class G2P { + public: + G2P(const LexFile & lex, EspeakFallback * fallback) : lex_(lex), fallback_(fallback) {} + // misaki en.G2P.__call__: returns the phoneme string and the final tokens. + u32 operator()(const u32 & text, std::vector * tokens_out = nullptr); + bool has_espeak() const { return fallback_ != nullptr; } + // number of tokens that went to the OOV fallback in the last call + int last_fallback_count = 0; + private: + const LexFile & lex_; + EspeakFallback * fallback_; + std::optional fallback(const MToken & tk); +}; + +// misaki en.apply_stress (exposed for the unit tests) +std::optional apply_stress_for_test(const std::optional & ps, std::optional stress); + +// paradee/tts.py Paradee._chunks: sentence split, phonemize, cut to <= 510. +std::vector paradee_chunks(G2P & g2p, const u32 & text, size_t max_phonemes = 510); + +} // namespace misaki diff --git a/tools/misaki-g2p/src/numbers.cpp b/tools/misaki-g2p/src/numbers.cpp new file mode 100644 index 0000000000..5b264a207e --- /dev/null +++ b/tools/misaki-g2p/src/numbers.cpp @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: Apache-2.0 +// English number words for the misaki port. misaki got these strings from +// num2words; this is an independent implementation of the same English +// conventions (short scale, "and" before the last two digits, "oh" in +// years), checked against num2words output by tests/compare_misaki.py. +#include "misaki-internal.h" + +#include +#include + +namespace misaki { +namespace { + +const char * kOnes[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", + "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", + "eighteen", "nineteen"}; +const char * kTens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; +// 10^3 .. 10^39 +const char * kScales[] = {"", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", + "sextillion", "septillion", "octillion", "nonillion", "decillion", "undecillion", + "duodecillion"}; +constexpr size_t kMaxGroups = sizeof(kScales) / sizeof(kScales[0]); + +std::string strip_zeros(const std::string & d) { + size_t i = 0; + while (i + 1 < d.size() && d[i] == '0') i++; + return d.substr(i); +} + +std::string under_100(int n) { + if (n < 20) return kOnes[n]; + std::string s = kTens[n / 10]; + if (n % 10) s += std::string("-") + kOnes[n % 10]; + return s; +} + +std::string under_1000(int n) { + if (n < 100) return under_100(n); + std::string s = std::string(kOnes[n / 100]) + " hundred"; + if (n % 100) s += " and " + under_100(n % 100); + return s; +} + +std::string cardinal(const std::string & digits) { + std::string d = strip_zeros(digits); + if (d.empty() || d == "0") return "zero"; + std::vector groups; // least significant first + for (long end = (long) d.size(); end > 0; end -= 3) { + long start = end - 3 < 0 ? 0 : end - 3; + groups.push_back(std::stoi(d.substr((size_t) start, (size_t) (end - start)))); + } + std::string out; + int last = groups[0]; + bool higher = false; + for (size_t g = groups.size(); g-- > 1;) { + if (!groups[g]) continue; + if (!out.empty()) out += ", "; + out += under_1000(groups[g]) + " " + kScales[g]; + higher = true; + } + if (last) { + if (higher) out += last < 100 ? " and " : ", "; + out += under_1000(last); + } + return out; +} + +std::string ordinalize_word(const std::string & w) { + static const char * irregular[][2] = {{"one", "first"}, {"two", "second"}, {"three", "third"}, + {"five", "fifth"}, {"eight", "eighth"}, {"nine", "ninth"}, + {"twelve", "twelfth"}}; + for (auto & p : irregular) if (w == p[0]) return p[1]; + if (!w.empty() && w.back() == 'y') return w.substr(0, w.size() - 1) + "ieth"; + return w + "th"; +} + +std::string ordinal(const std::string & digits) { + std::string c = cardinal(digits); + size_t cut = c.find_last_of(" -"); + if (cut == std::string::npos) return ordinalize_word(c); + return c.substr(0, cut + 1) + ordinalize_word(c.substr(cut + 1)); +} + +} // namespace + +bool number_fits(const std::string & digits) { return strip_zeros(digits).size() <= 3 * kMaxGroups; } + +u32 number_cardinal(const std::string & digits) { return U(cardinal(digits).c_str()); } +u32 number_ordinal(const std::string & digits) { return U(ordinal(digits).c_str()); } + +u32 number_year(const std::string & digits) { + std::string d = strip_zeros(digits); + long long v = d.size() > 6 ? 1000000 : std::stoll(d); + long long high = v / 100, low = v % 100; + if (high == 0 || (high % 10 == 0 && low < 10) || high >= 100) return number_cardinal(d); + std::string s = cardinal(std::to_string(high)) + " "; + if (low == 0) s += "hundred"; + else if (low < 10) s += "oh-" + cardinal(std::to_string(low)); + else s += cardinal(std::to_string(low)); + return U(s.c_str()); +} + +u32 number_float(const std::string & text) { + size_t dot = text.find('.'); + std::string ip = dot == std::string::npos ? text : text.substr(0, dot); + std::string fp = dot == std::string::npos ? "" : text.substr(dot + 1); + while (!fp.empty() && fp.back() == '0') fp.pop_back(); + std::string s = cardinal(ip.empty() ? "0" : ip); + if (!fp.empty()) { + s += " point"; + for (char c : fp) s += std::string(" ") + kOnes[c - '0']; + } + return U(s.c_str()); +} + +} // namespace misaki diff --git a/tools/misaki-g2p/src/spacy-en-rules.inc b/tools/misaki-g2p/src/spacy-en-rules.inc new file mode 100644 index 0000000000..e531d6eae2 --- /dev/null +++ b/tools/misaki-g2p/src/spacy-en-rules.inc @@ -0,0 +1,1353 @@ +// Generated by scripts/gen_tables.py from spaCy 3.8.16 English tokenizer exceptions +// (MIT, see LICENSES/spaCy-MIT.txt). Do not edit. Each entry is the exception +// string and its token pieces separated by \x1F. + +static const char * const kSpacyRules[] = { + "\x09""\x1F""\x09""", + "\x0A""\x1F""\x0A""", + " \x1F"" ", + "'\x1F""'", + "''\x1F""''", + "'Cause\x1F""'Cause", + "'Cos\x1F""'Cos", + "'Coz\x1F""'Coz", + "'Cuz\x1F""'Cuz", + "'S\x1F""'S", + "'bout\x1F""'bout", + "'cause\x1F""'cause", + "'cos\x1F""'cos", + "'coz\x1F""'coz", + "'cuz\x1F""'cuz", + "'d\x1F""'d", + "'em\x1F""'em", + "'ll\x1F""'ll", + "'nuff\x1F""'nuff", + "'re\x1F""'re", + "'s\x1F""'s", + "(*_*)\x1F""(*_*)", + "(-8\x1F""(-8", + "(-:\x1F""(-:", + "(-;\x1F""(-;", + "(-_-)\x1F""(-_-)", + "(._.)\x1F""(._.)", + "(:\x1F""(:", + "(;\x1F""(;", + "(=\x1F""(=", + "(>_<)\x1F""(>_<)", + "(^_^)\x1F""(^_^)", + "(o:\x1F""(o:", + "(\xC2""\xAC""_\xC2""\xAC"")\x1F""(\xC2""\xAC""_\xC2""\xAC"")", + "(\xE0""\xB2""\xA0""_\xE0""\xB2""\xA0"")\x1F""(\xE0""\xB2""\xA0""_\xE0""\xB2""\xA0"")", + "(\xE2""\x95""\xAF""\xC2""\xB0""\xE2""\x96""\xA1""\xC2""\xB0""\xEF""\xBC""\x89""\xE2""\x95""\xAF""\xEF""\xB8""\xB5""\xE2""\x94""\xBB""\xE2""\x94""\x81""\xE2""\x94""\xBB""\x1F""(\xE2""\x95""\xAF""\xC2""\xB0""\xE2""\x96""\xA1""\xC2""\xB0""\xEF""\xBC""\x89""\xE2""\x95""\xAF""\xEF""\xB8""\xB5""\xE2""\x94""\xBB""\xE2""\x94""\x81""\xE2""\x94""\xBB""", + ")-:\x1F"")-:", + "):\x1F""):", + "-_-\x1F""-_-", + "-__-\x1F""-__-", + "._.\x1F""._.", + "0.0\x1F""0.0", + "0.o\x1F""0.o", + "0_0\x1F""0_0", + "0_o\x1F""0_o", + "10a.m.\x1F""10\x1F""a.m.", + "10am\x1F""10\x1F""am", + "10p.m.\x1F""10\x1F""p.m.", + "10pm\x1F""10\x1F""pm", + "11a.m.\x1F""11\x1F""a.m.", + "11am\x1F""11\x1F""am", + "11p.m.\x1F""11\x1F""p.m.", + "11pm\x1F""11\x1F""pm", + "12a.m.\x1F""12\x1F""a.m.", + "12am\x1F""12\x1F""am", + "12p.m.\x1F""12\x1F""p.m.", + "12pm\x1F""12\x1F""pm", + "1a.m.\x1F""1\x1F""a.m.", + "1am\x1F""1\x1F""am", + "1p.m.\x1F""1\x1F""p.m.", + "1pm\x1F""1\x1F""pm", + "2a.m.\x1F""2\x1F""a.m.", + "2am\x1F""2\x1F""am", + "2p.m.\x1F""2\x1F""p.m.", + "2pm\x1F""2\x1F""pm", + "3a.m.\x1F""3\x1F""a.m.", + "3am\x1F""3\x1F""am", + "3p.m.\x1F""3\x1F""p.m.", + "3pm\x1F""3\x1F""pm", + "4a.m.\x1F""4\x1F""a.m.", + "4am\x1F""4\x1F""am", + "4p.m.\x1F""4\x1F""p.m.", + "4pm\x1F""4\x1F""pm", + "5a.m.\x1F""5\x1F""a.m.", + "5am\x1F""5\x1F""am", + "5p.m.\x1F""5\x1F""p.m.", + "5pm\x1F""5\x1F""pm", + "6a.m.\x1F""6\x1F""a.m.", + "6am\x1F""6\x1F""am", + "6p.m.\x1F""6\x1F""p.m.", + "6pm\x1F""6\x1F""pm", + "7a.m.\x1F""7\x1F""a.m.", + "7am\x1F""7\x1F""am", + "7p.m.\x1F""7\x1F""p.m.", + "7pm\x1F""7\x1F""pm", + "8)\x1F""8)", + "8-)\x1F""8-)", + "8-D\x1F""8-D", + "8D\x1F""8D", + "8a.m.\x1F""8\x1F""a.m.", + "8am\x1F""8\x1F""am", + "8p.m.\x1F""8\x1F""p.m.", + "8pm\x1F""8\x1F""pm", + "9a.m.\x1F""9\x1F""a.m.", + "9am\x1F""9\x1F""am", + "9p.m.\x1F""9\x1F""p.m.", + "9pm\x1F""9\x1F""pm", + ":'(\x1F"":'(", + ":')\x1F"":')", + ":'-(\x1F"":'-(", + ":'-)\x1F"":'-)", + ":(\x1F"":(", + ":((\x1F"":((", + ":(((\x1F"":(((", + ":()\x1F"":()", + ":)\x1F"":)", + ":))\x1F"":))", + ":)))\x1F"":)))", + ":*\x1F"":*", + ":-(\x1F"":-(", + ":-((\x1F"":-((", + ":-(((\x1F"":-(((", + ":-)\x1F"":-)", + ":-))\x1F"":-))", + ":-)))\x1F"":-)))", + ":-*\x1F"":-*", + ":-/\x1F"":-/", + ":-0\x1F"":-0", + ":-3\x1F"":-3", + ":->\x1F"":->", + ":-D\x1F"":-D", + ":-O\x1F"":-O", + ":-P\x1F"":-P", + ":-X\x1F"":-X", + ":-]\x1F"":-]", + ":-o\x1F"":-o", + ":-p\x1F"":-p", + ":-x\x1F"":-x", + ":-|\x1F"":-|", + ":-}\x1F"":-}", + ":/\x1F"":/", + ":0\x1F"":0", + ":1\x1F"":1", + ":3\x1F"":3", + ":>\x1F"":>", + ":D\x1F"":D", + ":O\x1F"":O", + ":P\x1F"":P", + ":X\x1F"":X", + ":]\x1F"":]", + ":o\x1F"":o", + ":o)\x1F"":o)", + ":p\x1F"":p", + ":x\x1F"":x", + ":|\x1F"":|", + ":}\x1F"":}", + ":\xE2""\x80""\x99""(\x1F"":\xE2""\x80""\x99""(", + ":\xE2""\x80""\x99"")\x1F"":\xE2""\x80""\x99"")", + ":\xE2""\x80""\x99""-(\x1F"":\xE2""\x80""\x99""-(", + ":\xE2""\x80""\x99""-)\x1F"":\xE2""\x80""\x99""-)", + ";)\x1F"";)", + ";-)\x1F"";-)", + ";-D\x1F"";-D", + ";D\x1F"";D", + ";_;\x1F"";_;", + "<.<\x1F""<.<", + "\x1F""", + "=(\x1F""=(", + "=)\x1F""=)", + "=/\x1F""=/", + "=3\x1F""=3", + "=D\x1F""=D", + "=[\x1F""=[", + "=]\x1F""=]", + "=|\x1F""=|", + ">.<\x1F"">.<", + ">.>\x1F"">.>", + ">:(\x1F"">:(", + ">:o\x1F"">:o", + "><(((*>\x1F""><(((*>", + "@_@\x1F""@_@", + "Adm.\x1F""Adm.", + "Ain't\x1F""Ai\x1F""n't", + "Aint\x1F""Ai\x1F""nt", + "Ain\xE2""\x80""\x99""t\x1F""Ai\x1F""n\xE2""\x80""\x99""t", + "Ak.\x1F""Ak.", + "Ala.\x1F""Ala.", + "Apr.\x1F""Apr.", + "Aren't\x1F""Are\x1F""n't", + "Arent\x1F""Are\x1F""nt", + "Aren\xE2""\x80""\x99""t\x1F""Are\x1F""n\xE2""\x80""\x99""t", + "Ariz.\x1F""Ariz.", + "Ark.\x1F""Ark.", + "Aug.\x1F""Aug.", + "Bros.\x1F""Bros.", + "C'mon\x1F""C'm\x1F""on", + "C++\x1F""C++", + "Calif.\x1F""Calif.", + "Can't\x1F""Ca\x1F""n't", + "Can't've\x1F""Ca\x1F""n't\x1F""'ve", + "Cannot\x1F""Can\x1F""not", + "Cant\x1F""Ca\x1F""nt", + "Cantve\x1F""Ca\x1F""nt\x1F""ve", + "Can\xE2""\x80""\x99""t\x1F""Ca\x1F""n\xE2""\x80""\x99""t", + "Can\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Ca\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Co.\x1F""Co.", + "Colo.\x1F""Colo.", + "Conn.\x1F""Conn.", + "Corp.\x1F""Corp.", + "Could've\x1F""Could\x1F""'ve", + "Couldn't\x1F""Could\x1F""n't", + "Couldn't've\x1F""Could\x1F""n't\x1F""'ve", + "Couldnt\x1F""Could\x1F""nt", + "Couldntve\x1F""Could\x1F""nt\x1F""ve", + "Couldn\xE2""\x80""\x99""t\x1F""Could\x1F""n\xE2""\x80""\x99""t", + "Couldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Could\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Couldve\x1F""Could\x1F""ve", + "Could\xE2""\x80""\x99""ve\x1F""Could\x1F""\xE2""\x80""\x99""ve", + "C\xE2""\x80""\x99""mon\x1F""C\xE2""\x80""\x99""m\x1F""on", + "D.C.\x1F""D.C.", + "Daren't\x1F""Dare\x1F""n't", + "Darent\x1F""Dare\x1F""nt", + "Daren\xE2""\x80""\x99""t\x1F""Dare\x1F""n\xE2""\x80""\x99""t", + "Dec.\x1F""Dec.", + "Del.\x1F""Del.", + "Didn't\x1F""Did\x1F""n't", + "Didn't've\x1F""Did\x1F""n't\x1F""'ve", + "Didnt\x1F""Did\x1F""nt", + "Didntve\x1F""Did\x1F""nt\x1F""ve", + "Didn\xE2""\x80""\x99""t\x1F""Did\x1F""n\xE2""\x80""\x99""t", + "Didn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Did\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Doesn't\x1F""Does\x1F""n't", + "Doesn't've\x1F""Does\x1F""n't\x1F""'ve", + "Doesnt\x1F""Does\x1F""nt", + "Doesntve\x1F""Does\x1F""nt\x1F""ve", + "Doesn\xE2""\x80""\x99""t\x1F""Does\x1F""n\xE2""\x80""\x99""t", + "Doesn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Does\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Doin\x1F""Doin", + "Doin'\x1F""Doin'", + "Doin\xE2""\x80""\x99""\x1F""Doin\xE2""\x80""\x99""", + "Don't\x1F""Do\x1F""n't", + "Don't've\x1F""Do\x1F""n't\x1F""'ve", + "Dont\x1F""Do\x1F""nt", + "Dontve\x1F""Do\x1F""nt\x1F""ve", + "Don\xE2""\x80""\x99""t\x1F""Do\x1F""n\xE2""\x80""\x99""t", + "Don\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Do\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Dr.\x1F""Dr.", + "E.G.\x1F""E.G.", + "E.g.\x1F""E.g.", + "Feb.\x1F""Feb.", + "Fla.\x1F""Fla.", + "Ga.\x1F""Ga.", + "Gen.\x1F""Gen.", + "Goin\x1F""Goin", + "Goin'\x1F""Goin'", + "Goin\xE2""\x80""\x99""\x1F""Goin\xE2""\x80""\x99""", + "Gonna\x1F""Gon\x1F""na", + "Gotta\x1F""Got\x1F""ta", + "Gov.\x1F""Gov.", + "Hadn't\x1F""Had\x1F""n't", + "Hadn't've\x1F""Had\x1F""n't\x1F""'ve", + "Hadnt\x1F""Had\x1F""nt", + "Hadntve\x1F""Had\x1F""nt\x1F""ve", + "Hadn\xE2""\x80""\x99""t\x1F""Had\x1F""n\xE2""\x80""\x99""t", + "Hadn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Had\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Hasn't\x1F""Has\x1F""n't", + "Hasnt\x1F""Has\x1F""nt", + "Hasn\xE2""\x80""\x99""t\x1F""Has\x1F""n\xE2""\x80""\x99""t", + "Haven't\x1F""Have\x1F""n't", + "Havent\x1F""Have\x1F""nt", + "Haven\xE2""\x80""\x99""t\x1F""Have\x1F""n\xE2""\x80""\x99""t", + "Havin\x1F""Havin", + "Havin'\x1F""Havin'", + "Havin\xE2""\x80""\x99""\x1F""Havin\xE2""\x80""\x99""", + "He'd\x1F""He\x1F""'d", + "He'd've\x1F""He\x1F""'d\x1F""'ve", + "He'll\x1F""He\x1F""'ll", + "He'll've\x1F""He\x1F""'ll\x1F""'ve", + "He's\x1F""He\x1F""'s", + "Hed\x1F""He\x1F""d", + "Hedve\x1F""He\x1F""d\x1F""ve", + "Hellve\x1F""He\x1F""ll\x1F""ve", + "Hes\x1F""He\x1F""s", + "He\xE2""\x80""\x99""d\x1F""He\x1F""\xE2""\x80""\x99""d", + "He\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""He\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "He\xE2""\x80""\x99""ll\x1F""He\x1F""\xE2""\x80""\x99""ll", + "He\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""He\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "He\xE2""\x80""\x99""s\x1F""He\x1F""\xE2""\x80""\x99""s", + "How'd\x1F""How\x1F""'d", + "How'd've\x1F""How\x1F""'d\x1F""'ve", + "How'd'y\x1F""How\x1F""'d\x1F""'y", + "How'll\x1F""How\x1F""'ll", + "How'll've\x1F""How\x1F""'ll\x1F""'ve", + "How're\x1F""How\x1F""'re", + "How's\x1F""How\x1F""'s", + "How've\x1F""How\x1F""'ve", + "Howd\x1F""How\x1F""d", + "Howdve\x1F""How\x1F""d\x1F""ve", + "Howll\x1F""How\x1F""ll", + "Howllve\x1F""How\x1F""ll\x1F""ve", + "Howre\x1F""How\x1F""re", + "Hows\x1F""How\x1F""s", + "Howve\x1F""How\x1F""ve", + "How\xE2""\x80""\x99""d\x1F""How\x1F""\xE2""\x80""\x99""d", + "How\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""How\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "How\xE2""\x80""\x99""d\xE2""\x80""\x99""y\x1F""How\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""y", + "How\xE2""\x80""\x99""ll\x1F""How\x1F""\xE2""\x80""\x99""ll", + "How\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""How\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "How\xE2""\x80""\x99""re\x1F""How\x1F""\xE2""\x80""\x99""re", + "How\xE2""\x80""\x99""s\x1F""How\x1F""\xE2""\x80""\x99""s", + "How\xE2""\x80""\x99""ve\x1F""How\x1F""\xE2""\x80""\x99""ve", + "I'd\x1F""I\x1F""'d", + "I'd've\x1F""I\x1F""'d\x1F""'ve", + "I'll\x1F""I\x1F""'ll", + "I'll've\x1F""I\x1F""'ll\x1F""'ve", + "I'm\x1F""I\x1F""'m", + "I'ma\x1F""I\x1F""'m\x1F""a", + "I've\x1F""I\x1F""'ve", + "I.E.\x1F""I.E.", + "I.e.\x1F""I.e.", + "Ia.\x1F""Ia.", + "Id\x1F""I\x1F""d", + "Id.\x1F""Id.", + "Idve\x1F""I\x1F""d\x1F""ve", + "Ill.\x1F""Ill.", + "Illve\x1F""I\x1F""ll\x1F""ve", + "Im\x1F""I\x1F""m", + "Ima\x1F""I\x1F""m\x1F""a", + "Inc.\x1F""Inc.", + "Ind.\x1F""Ind.", + "Isn't\x1F""Is\x1F""n't", + "Isnt\x1F""Is\x1F""nt", + "Isn\xE2""\x80""\x99""t\x1F""Is\x1F""n\xE2""\x80""\x99""t", + "It'd\x1F""It\x1F""'d", + "It'd've\x1F""It\x1F""'d\x1F""'ve", + "It'll\x1F""It\x1F""'ll", + "It'll've\x1F""It\x1F""'ll\x1F""'ve", + "It's\x1F""It\x1F""'s", + "Itd\x1F""It\x1F""d", + "Itdve\x1F""It\x1F""d\x1F""ve", + "Itll\x1F""It\x1F""ll", + "Itllve\x1F""It\x1F""ll\x1F""ve", + "It\xE2""\x80""\x99""d\x1F""It\x1F""\xE2""\x80""\x99""d", + "It\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""It\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "It\xE2""\x80""\x99""ll\x1F""It\x1F""\xE2""\x80""\x99""ll", + "It\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""It\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "It\xE2""\x80""\x99""s\x1F""It\x1F""\xE2""\x80""\x99""s", + "Ive\x1F""I\x1F""ve", + "I\xE2""\x80""\x99""d\x1F""I\x1F""\xE2""\x80""\x99""d", + "I\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""I\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "I\xE2""\x80""\x99""ll\x1F""I\x1F""\xE2""\x80""\x99""ll", + "I\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""I\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "I\xE2""\x80""\x99""m\x1F""I\x1F""\xE2""\x80""\x99""m", + "I\xE2""\x80""\x99""ma\x1F""I\x1F""\xE2""\x80""\x99""m\x1F""a", + "I\xE2""\x80""\x99""ve\x1F""I\x1F""\xE2""\x80""\x99""ve", + "Jan.\x1F""Jan.", + "Jr.\x1F""Jr.", + "Jul.\x1F""Jul.", + "Jun.\x1F""Jun.", + "Kan.\x1F""Kan.", + "Kans.\x1F""Kans.", + "Ky.\x1F""Ky.", + "La.\x1F""La.", + "Let's\x1F""Let\x1F""'s", + "Let\xE2""\x80""\x99""s\x1F""Let\x1F""\xE2""\x80""\x99""s", + "Lovin\x1F""Lovin", + "Lovin'\x1F""Lovin'", + "Lovin\xE2""\x80""\x99""\x1F""Lovin\xE2""\x80""\x99""", + "Ltd.\x1F""Ltd.", + "Ma'am\x1F""Ma'am", + "Mar.\x1F""Mar.", + "Mass.\x1F""Mass.", + "Mayn't\x1F""May\x1F""n't", + "Mayn't've\x1F""May\x1F""n't\x1F""'ve", + "Maynt\x1F""May\x1F""nt", + "Mayntve\x1F""May\x1F""nt\x1F""ve", + "Mayn\xE2""\x80""\x99""t\x1F""May\x1F""n\xE2""\x80""\x99""t", + "Mayn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""May\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Ma\xE2""\x80""\x99""am\x1F""Ma\xE2""\x80""\x99""am", + "Md.\x1F""Md.", + "Messrs.\x1F""Messrs.", + "Mich.\x1F""Mich.", + "Might've\x1F""Might\x1F""'ve", + "Mightn't\x1F""Might\x1F""n't", + "Mightn't've\x1F""Might\x1F""n't\x1F""'ve", + "Mightnt\x1F""Might\x1F""nt", + "Mightntve\x1F""Might\x1F""nt\x1F""ve", + "Mightn\xE2""\x80""\x99""t\x1F""Might\x1F""n\xE2""\x80""\x99""t", + "Mightn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Might\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Mightve\x1F""Might\x1F""ve", + "Might\xE2""\x80""\x99""ve\x1F""Might\x1F""\xE2""\x80""\x99""ve", + "Minn.\x1F""Minn.", + "Miss.\x1F""Miss.", + "Mo.\x1F""Mo.", + "Mont.\x1F""Mont.", + "Mr.\x1F""Mr.", + "Mrs.\x1F""Mrs.", + "Ms.\x1F""Ms.", + "Mt.\x1F""Mt.", + "Must've\x1F""Must\x1F""'ve", + "Mustn't\x1F""Must\x1F""n't", + "Mustn't've\x1F""Must\x1F""n't\x1F""'ve", + "Mustnt\x1F""Must\x1F""nt", + "Mustntve\x1F""Must\x1F""nt\x1F""ve", + "Mustn\xE2""\x80""\x99""t\x1F""Must\x1F""n\xE2""\x80""\x99""t", + "Mustn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Must\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Mustve\x1F""Must\x1F""ve", + "Must\xE2""\x80""\x99""ve\x1F""Must\x1F""\xE2""\x80""\x99""ve", + "N.C.\x1F""N.C.", + "N.D.\x1F""N.D.", + "N.H.\x1F""N.H.", + "N.J.\x1F""N.J.", + "N.M.\x1F""N.M.", + "N.Y.\x1F""N.Y.", + "Neb.\x1F""Neb.", + "Nebr.\x1F""Nebr.", + "Needn't\x1F""Need\x1F""n't", + "Needn't've\x1F""Need\x1F""n't\x1F""'ve", + "Neednt\x1F""Need\x1F""nt", + "Needntve\x1F""Need\x1F""nt\x1F""ve", + "Needn\xE2""\x80""\x99""t\x1F""Need\x1F""n\xE2""\x80""\x99""t", + "Needn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Need\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Nev.\x1F""Nev.", + "Not've\x1F""Not\x1F""'ve", + "Nothin\x1F""Nothin", + "Nothin'\x1F""Nothin'", + "Nothin\xE2""\x80""\x99""\x1F""Nothin\xE2""\x80""\x99""", + "Notve\x1F""Not\x1F""ve", + "Not\xE2""\x80""\x99""ve\x1F""Not\x1F""\xE2""\x80""\x99""ve", + "Nov.\x1F""Nov.", + "Nuthin\x1F""Nuthin", + "Nuthin'\x1F""Nuthin'", + "Nuthin\xE2""\x80""\x99""\x1F""Nuthin\xE2""\x80""\x99""", + "O'clock\x1F""O'clock", + "O.O\x1F""O.O", + "O.o\x1F""O.o", + "O_O\x1F""O_O", + "O_o\x1F""O_o", + "Oct.\x1F""Oct.", + "Okla.\x1F""Okla.", + "Ol\x1F""Ol", + "Ol'\x1F""Ol'", + "Ol\xE2""\x80""\x99""\x1F""Ol\xE2""\x80""\x99""", + "Ore.\x1F""Ore.", + "Oughtn't\x1F""Ought\x1F""n't", + "Oughtn't've\x1F""Ought\x1F""n't\x1F""'ve", + "Oughtnt\x1F""Ought\x1F""nt", + "Oughtntve\x1F""Ought\x1F""nt\x1F""ve", + "Oughtn\xE2""\x80""\x99""t\x1F""Ought\x1F""n\xE2""\x80""\x99""t", + "Oughtn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Ought\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "O\xE2""\x80""\x99""clock\x1F""O\xE2""\x80""\x99""clock", + "Pa.\x1F""Pa.", + "Ph.D.\x1F""Ph.D.", + "Prof.\x1F""Prof.", + "Rep.\x1F""Rep.", + "Rev.\x1F""Rev.", + "S.C.\x1F""S.C.", + "Sen.\x1F""Sen.", + "Sep.\x1F""Sep.", + "Sept.\x1F""Sept.", + "Shan't\x1F""Sha\x1F""n't", + "Shan't've\x1F""Sha\x1F""n't\x1F""'ve", + "Shant\x1F""Sha\x1F""nt", + "Shantve\x1F""Sha\x1F""nt\x1F""ve", + "Shan\xE2""\x80""\x99""t\x1F""Sha\x1F""n\xE2""\x80""\x99""t", + "Shan\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Sha\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "She'd\x1F""She\x1F""'d", + "She'd've\x1F""She\x1F""'d\x1F""'ve", + "She'll\x1F""She\x1F""'ll", + "She'll've\x1F""She\x1F""'ll\x1F""'ve", + "She's\x1F""She\x1F""'s", + "Shedve\x1F""She\x1F""d\x1F""ve", + "Shellve\x1F""She\x1F""ll\x1F""ve", + "Shes\x1F""She\x1F""s", + "She\xE2""\x80""\x99""d\x1F""She\x1F""\xE2""\x80""\x99""d", + "She\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""She\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "She\xE2""\x80""\x99""ll\x1F""She\x1F""\xE2""\x80""\x99""ll", + "She\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""She\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "She\xE2""\x80""\x99""s\x1F""She\x1F""\xE2""\x80""\x99""s", + "Should've\x1F""Should\x1F""'ve", + "Shouldn't\x1F""Should\x1F""n't", + "Shouldn't've\x1F""Should\x1F""n't\x1F""'ve", + "Shouldnt\x1F""Should\x1F""nt", + "Shouldntve\x1F""Should\x1F""nt\x1F""ve", + "Shouldn\xE2""\x80""\x99""t\x1F""Should\x1F""n\xE2""\x80""\x99""t", + "Shouldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Should\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Shouldve\x1F""Should\x1F""ve", + "Should\xE2""\x80""\x99""ve\x1F""Should\x1F""\xE2""\x80""\x99""ve", + "Somethin\x1F""Somethin", + "Somethin'\x1F""Somethin'", + "Somethin\xE2""\x80""\x99""\x1F""Somethin\xE2""\x80""\x99""", + "St.\x1F""St.", + "Tenn.\x1F""Tenn.", + "That'd\x1F""That\x1F""'d", + "That'd've\x1F""That\x1F""'d\x1F""'ve", + "That'll\x1F""That\x1F""'ll", + "That'll've\x1F""That\x1F""'ll\x1F""'ve", + "That's\x1F""That\x1F""'s", + "Thatd\x1F""That\x1F""d", + "Thatdve\x1F""That\x1F""d\x1F""ve", + "Thatll\x1F""That\x1F""ll", + "Thatllve\x1F""That\x1F""ll\x1F""ve", + "Thats\x1F""That\x1F""s", + "That\xE2""\x80""\x99""d\x1F""That\x1F""\xE2""\x80""\x99""d", + "That\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""That\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "That\xE2""\x80""\x99""ll\x1F""That\x1F""\xE2""\x80""\x99""ll", + "That\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""That\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "That\xE2""\x80""\x99""s\x1F""That\x1F""\xE2""\x80""\x99""s", + "There'd\x1F""There\x1F""'d", + "There'd've\x1F""There\x1F""'d\x1F""'ve", + "There'll\x1F""There\x1F""'ll", + "There'll've\x1F""There\x1F""'ll\x1F""'ve", + "There're\x1F""There\x1F""'re", + "There's\x1F""There\x1F""'s", + "There've\x1F""There\x1F""'ve", + "Thered\x1F""There\x1F""d", + "Theredve\x1F""There\x1F""d\x1F""ve", + "Therell\x1F""There\x1F""ll", + "Therellve\x1F""There\x1F""ll\x1F""ve", + "Therere\x1F""There\x1F""re", + "Theres\x1F""There\x1F""s", + "Thereve\x1F""There\x1F""ve", + "There\xE2""\x80""\x99""d\x1F""There\x1F""\xE2""\x80""\x99""d", + "There\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""There\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "There\xE2""\x80""\x99""ll\x1F""There\x1F""\xE2""\x80""\x99""ll", + "There\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""There\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "There\xE2""\x80""\x99""re\x1F""There\x1F""\xE2""\x80""\x99""re", + "There\xE2""\x80""\x99""s\x1F""There\x1F""\xE2""\x80""\x99""s", + "There\xE2""\x80""\x99""ve\x1F""There\x1F""\xE2""\x80""\x99""ve", + "These'd\x1F""These\x1F""'d", + "These'd've\x1F""These\x1F""'d\x1F""'ve", + "These'll\x1F""These\x1F""'ll", + "These'll've\x1F""These\x1F""'ll\x1F""'ve", + "These're\x1F""These\x1F""'re", + "These've\x1F""These\x1F""'ve", + "Thesed\x1F""These\x1F""d", + "Thesedve\x1F""These\x1F""d\x1F""ve", + "Thesell\x1F""These\x1F""ll", + "Thesellve\x1F""These\x1F""ll\x1F""ve", + "Thesere\x1F""These\x1F""re", + "Theseve\x1F""These\x1F""ve", + "These\xE2""\x80""\x99""d\x1F""These\x1F""\xE2""\x80""\x99""d", + "These\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""These\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "These\xE2""\x80""\x99""ll\x1F""These\x1F""\xE2""\x80""\x99""ll", + "These\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""These\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "These\xE2""\x80""\x99""re\x1F""These\x1F""\xE2""\x80""\x99""re", + "These\xE2""\x80""\x99""ve\x1F""These\x1F""\xE2""\x80""\x99""ve", + "They'd\x1F""They\x1F""'d", + "They'd've\x1F""They\x1F""'d\x1F""'ve", + "They'll\x1F""They\x1F""'ll", + "They'll've\x1F""They\x1F""'ll\x1F""'ve", + "They're\x1F""They\x1F""'re", + "They've\x1F""They\x1F""'ve", + "Theyd\x1F""They\x1F""d", + "Theydve\x1F""They\x1F""d\x1F""ve", + "Theyll\x1F""They\x1F""ll", + "Theyllve\x1F""They\x1F""ll\x1F""ve", + "Theyre\x1F""They\x1F""re", + "Theyve\x1F""They\x1F""ve", + "They\xE2""\x80""\x99""d\x1F""They\x1F""\xE2""\x80""\x99""d", + "They\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""They\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "They\xE2""\x80""\x99""ll\x1F""They\x1F""\xE2""\x80""\x99""ll", + "They\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""They\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "They\xE2""\x80""\x99""re\x1F""They\x1F""\xE2""\x80""\x99""re", + "They\xE2""\x80""\x99""ve\x1F""They\x1F""\xE2""\x80""\x99""ve", + "This'd\x1F""This\x1F""'d", + "This'd've\x1F""This\x1F""'d\x1F""'ve", + "This'll\x1F""This\x1F""'ll", + "This'll've\x1F""This\x1F""'ll\x1F""'ve", + "This's\x1F""This\x1F""'s", + "Thisd\x1F""This\x1F""d", + "Thisdve\x1F""This\x1F""d\x1F""ve", + "Thisll\x1F""This\x1F""ll", + "Thisllve\x1F""This\x1F""ll\x1F""ve", + "Thiss\x1F""This\x1F""s", + "This\xE2""\x80""\x99""d\x1F""This\x1F""\xE2""\x80""\x99""d", + "This\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""This\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "This\xE2""\x80""\x99""ll\x1F""This\x1F""\xE2""\x80""\x99""ll", + "This\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""This\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "This\xE2""\x80""\x99""s\x1F""This\x1F""\xE2""\x80""\x99""s", + "Those'd\x1F""Those\x1F""'d", + "Those'd've\x1F""Those\x1F""'d\x1F""'ve", + "Those'll\x1F""Those\x1F""'ll", + "Those'll've\x1F""Those\x1F""'ll\x1F""'ve", + "Those're\x1F""Those\x1F""'re", + "Those've\x1F""Those\x1F""'ve", + "Thosed\x1F""Those\x1F""d", + "Thosedve\x1F""Those\x1F""d\x1F""ve", + "Thosell\x1F""Those\x1F""ll", + "Thosellve\x1F""Those\x1F""ll\x1F""ve", + "Thosere\x1F""Those\x1F""re", + "Thoseve\x1F""Those\x1F""ve", + "Those\xE2""\x80""\x99""d\x1F""Those\x1F""\xE2""\x80""\x99""d", + "Those\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""Those\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "Those\xE2""\x80""\x99""ll\x1F""Those\x1F""\xE2""\x80""\x99""ll", + "Those\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""Those\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "Those\xE2""\x80""\x99""re\x1F""Those\x1F""\xE2""\x80""\x99""re", + "Those\xE2""\x80""\x99""ve\x1F""Those\x1F""\xE2""\x80""\x99""ve", + "V.V\x1F""V.V", + "V_V\x1F""V_V", + "Va.\x1F""Va.", + "Wash.\x1F""Wash.", + "Wasn't\x1F""Was\x1F""n't", + "Wasnt\x1F""Was\x1F""nt", + "Wasn\xE2""\x80""\x99""t\x1F""Was\x1F""n\xE2""\x80""\x99""t", + "We'd\x1F""We\x1F""'d", + "We'd've\x1F""We\x1F""'d\x1F""'ve", + "We'll\x1F""We\x1F""'ll", + "We'll've\x1F""We\x1F""'ll\x1F""'ve", + "We're\x1F""We\x1F""'re", + "We've\x1F""We\x1F""'ve", + "Wed\x1F""We\x1F""d", + "Wedve\x1F""We\x1F""d\x1F""ve", + "Wellve\x1F""We\x1F""ll\x1F""ve", + "Weren't\x1F""Were\x1F""n't", + "Werent\x1F""Were\x1F""nt", + "Weren\xE2""\x80""\x99""t\x1F""Were\x1F""n\xE2""\x80""\x99""t", + "Weve\x1F""We\x1F""ve", + "We\xE2""\x80""\x99""d\x1F""We\x1F""\xE2""\x80""\x99""d", + "We\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""We\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "We\xE2""\x80""\x99""ll\x1F""We\x1F""\xE2""\x80""\x99""ll", + "We\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""We\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "We\xE2""\x80""\x99""re\x1F""We\x1F""\xE2""\x80""\x99""re", + "We\xE2""\x80""\x99""ve\x1F""We\x1F""\xE2""\x80""\x99""ve", + "What'd\x1F""What\x1F""'d", + "What'd've\x1F""What\x1F""'d\x1F""'ve", + "What'll\x1F""What\x1F""'ll", + "What'll've\x1F""What\x1F""'ll\x1F""'ve", + "What're\x1F""What\x1F""'re", + "What's\x1F""What\x1F""'s", + "What've\x1F""What\x1F""'ve", + "Whatd\x1F""What\x1F""d", + "Whatdve\x1F""What\x1F""d\x1F""ve", + "Whatll\x1F""What\x1F""ll", + "Whatllve\x1F""What\x1F""ll\x1F""ve", + "Whatre\x1F""What\x1F""re", + "Whats\x1F""What\x1F""s", + "Whatve\x1F""What\x1F""ve", + "What\xE2""\x80""\x99""d\x1F""What\x1F""\xE2""\x80""\x99""d", + "What\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""What\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "What\xE2""\x80""\x99""ll\x1F""What\x1F""\xE2""\x80""\x99""ll", + "What\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""What\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "What\xE2""\x80""\x99""re\x1F""What\x1F""\xE2""\x80""\x99""re", + "What\xE2""\x80""\x99""s\x1F""What\x1F""\xE2""\x80""\x99""s", + "What\xE2""\x80""\x99""ve\x1F""What\x1F""\xE2""\x80""\x99""ve", + "When'd\x1F""When\x1F""'d", + "When'd've\x1F""When\x1F""'d\x1F""'ve", + "When'll\x1F""When\x1F""'ll", + "When'll've\x1F""When\x1F""'ll\x1F""'ve", + "When're\x1F""When\x1F""'re", + "When's\x1F""When\x1F""'s", + "When've\x1F""When\x1F""'ve", + "Whend\x1F""When\x1F""d", + "Whendve\x1F""When\x1F""d\x1F""ve", + "Whenll\x1F""When\x1F""ll", + "Whenllve\x1F""When\x1F""ll\x1F""ve", + "Whenre\x1F""When\x1F""re", + "Whens\x1F""When\x1F""s", + "Whenve\x1F""When\x1F""ve", + "When\xE2""\x80""\x99""d\x1F""When\x1F""\xE2""\x80""\x99""d", + "When\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""When\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "When\xE2""\x80""\x99""ll\x1F""When\x1F""\xE2""\x80""\x99""ll", + "When\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""When\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "When\xE2""\x80""\x99""re\x1F""When\x1F""\xE2""\x80""\x99""re", + "When\xE2""\x80""\x99""s\x1F""When\x1F""\xE2""\x80""\x99""s", + "When\xE2""\x80""\x99""ve\x1F""When\x1F""\xE2""\x80""\x99""ve", + "Where'd\x1F""Where\x1F""'d", + "Where'd've\x1F""Where\x1F""'d\x1F""'ve", + "Where'll\x1F""Where\x1F""'ll", + "Where'll've\x1F""Where\x1F""'ll\x1F""'ve", + "Where're\x1F""Where\x1F""'re", + "Where's\x1F""Where\x1F""'s", + "Where've\x1F""Where\x1F""'ve", + "Whered\x1F""Where\x1F""d", + "Wheredve\x1F""Where\x1F""d\x1F""ve", + "Wherell\x1F""Where\x1F""ll", + "Wherellve\x1F""Where\x1F""ll\x1F""ve", + "Wherere\x1F""Where\x1F""re", + "Wheres\x1F""Where\x1F""s", + "Whereve\x1F""Where\x1F""ve", + "Where\xE2""\x80""\x99""d\x1F""Where\x1F""\xE2""\x80""\x99""d", + "Where\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""Where\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "Where\xE2""\x80""\x99""ll\x1F""Where\x1F""\xE2""\x80""\x99""ll", + "Where\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""Where\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "Where\xE2""\x80""\x99""re\x1F""Where\x1F""\xE2""\x80""\x99""re", + "Where\xE2""\x80""\x99""s\x1F""Where\x1F""\xE2""\x80""\x99""s", + "Where\xE2""\x80""\x99""ve\x1F""Where\x1F""\xE2""\x80""\x99""ve", + "Who'd\x1F""Who\x1F""'d", + "Who'd've\x1F""Who\x1F""'d\x1F""'ve", + "Who'll\x1F""Who\x1F""'ll", + "Who'll've\x1F""Who\x1F""'ll\x1F""'ve", + "Who're\x1F""Who\x1F""'re", + "Who's\x1F""Who\x1F""'s", + "Who've\x1F""Who\x1F""'ve", + "Whod\x1F""Who\x1F""d", + "Whodve\x1F""Who\x1F""d\x1F""ve", + "Wholl\x1F""Who\x1F""ll", + "Whollve\x1F""Who\x1F""ll\x1F""ve", + "Whos\x1F""Who\x1F""s", + "Whove\x1F""Who\x1F""ve", + "Who\xE2""\x80""\x99""d\x1F""Who\x1F""\xE2""\x80""\x99""d", + "Who\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""Who\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "Who\xE2""\x80""\x99""ll\x1F""Who\x1F""\xE2""\x80""\x99""ll", + "Who\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""Who\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "Who\xE2""\x80""\x99""re\x1F""Who\x1F""\xE2""\x80""\x99""re", + "Who\xE2""\x80""\x99""s\x1F""Who\x1F""\xE2""\x80""\x99""s", + "Who\xE2""\x80""\x99""ve\x1F""Who\x1F""\xE2""\x80""\x99""ve", + "Why'd\x1F""Why\x1F""'d", + "Why'd've\x1F""Why\x1F""'d\x1F""'ve", + "Why'll\x1F""Why\x1F""'ll", + "Why'll've\x1F""Why\x1F""'ll\x1F""'ve", + "Why're\x1F""Why\x1F""'re", + "Why's\x1F""Why\x1F""'s", + "Why've\x1F""Why\x1F""'ve", + "Whyd\x1F""Why\x1F""d", + "Whydve\x1F""Why\x1F""d\x1F""ve", + "Whyll\x1F""Why\x1F""ll", + "Whyllve\x1F""Why\x1F""ll\x1F""ve", + "Whyre\x1F""Why\x1F""re", + "Whys\x1F""Why\x1F""s", + "Whyve\x1F""Why\x1F""ve", + "Why\xE2""\x80""\x99""d\x1F""Why\x1F""\xE2""\x80""\x99""d", + "Why\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""Why\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "Why\xE2""\x80""\x99""ll\x1F""Why\x1F""\xE2""\x80""\x99""ll", + "Why\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""Why\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "Why\xE2""\x80""\x99""re\x1F""Why\x1F""\xE2""\x80""\x99""re", + "Why\xE2""\x80""\x99""s\x1F""Why\x1F""\xE2""\x80""\x99""s", + "Why\xE2""\x80""\x99""ve\x1F""Why\x1F""\xE2""\x80""\x99""ve", + "Wis.\x1F""Wis.", + "Won't\x1F""Wo\x1F""n't", + "Won't've\x1F""Wo\x1F""n't\x1F""'ve", + "Wont\x1F""Wo\x1F""nt", + "Wontve\x1F""Wo\x1F""nt\x1F""ve", + "Won\xE2""\x80""\x99""t\x1F""Wo\x1F""n\xE2""\x80""\x99""t", + "Won\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Wo\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Would've\x1F""Would\x1F""'ve", + "Wouldn't\x1F""Would\x1F""n't", + "Wouldn't've\x1F""Would\x1F""n't\x1F""'ve", + "Wouldnt\x1F""Would\x1F""nt", + "Wouldntve\x1F""Would\x1F""nt\x1F""ve", + "Wouldn\xE2""\x80""\x99""t\x1F""Would\x1F""n\xE2""\x80""\x99""t", + "Wouldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""Would\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "Wouldve\x1F""Would\x1F""ve", + "Would\xE2""\x80""\x99""ve\x1F""Would\x1F""\xE2""\x80""\x99""ve", + "XD\x1F""XD", + "XDD\x1F""XDD", + "You'd\x1F""You\x1F""'d", + "You'd've\x1F""You\x1F""'d\x1F""'ve", + "You'll\x1F""You\x1F""'ll", + "You'll've\x1F""You\x1F""'ll\x1F""'ve", + "You're\x1F""You\x1F""'re", + "You've\x1F""You\x1F""'ve", + "Youd\x1F""You\x1F""d", + "Youdve\x1F""You\x1F""d\x1F""ve", + "Youll\x1F""You\x1F""ll", + "Youllve\x1F""You\x1F""ll\x1F""ve", + "Youre\x1F""You\x1F""re", + "Youve\x1F""You\x1F""ve", + "You\xE2""\x80""\x99""d\x1F""You\x1F""\xE2""\x80""\x99""d", + "You\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""You\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "You\xE2""\x80""\x99""ll\x1F""You\x1F""\xE2""\x80""\x99""ll", + "You\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""You\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "You\xE2""\x80""\x99""re\x1F""You\x1F""\xE2""\x80""\x99""re", + "You\xE2""\x80""\x99""ve\x1F""You\x1F""\xE2""\x80""\x99""ve", + "[-:\x1F""[-:", + "[:\x1F""[:", + "[=\x1F""[=", + "\x5C""\x22"")\x1F""\x5C""\x22"")", + "\x5C""n\x1F""\x5C""n", + "\x5C""t\x1F""\x5C""t", + "]=\x1F""]=", + "^_^\x1F""^_^", + "^__^\x1F""^__^", + "^___^\x1F""^___^", + "a.\x1F""a.", + "a.m.\x1F""a.m.", + "ain't\x1F""ai\x1F""n't", + "aint\x1F""ai\x1F""nt", + "ain\xE2""\x80""\x99""t\x1F""ai\x1F""n\xE2""\x80""\x99""t", + "and/or\x1F""and/or", + "aren't\x1F""are\x1F""n't", + "arent\x1F""are\x1F""nt", + "aren\xE2""\x80""\x99""t\x1F""are\x1F""n\xE2""\x80""\x99""t", + "b.\x1F""b.", + "c'mon\x1F""c'm\x1F""on", + "c.\x1F""c.", + "can't\x1F""ca\x1F""n't", + "can't've\x1F""ca\x1F""n't\x1F""'ve", + "cannot\x1F""can\x1F""not", + "cant\x1F""ca\x1F""nt", + "cantve\x1F""ca\x1F""nt\x1F""ve", + "can\xE2""\x80""\x99""t\x1F""ca\x1F""n\xE2""\x80""\x99""t", + "can\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""ca\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "co.\x1F""co.", + "could've\x1F""could\x1F""'ve", + "couldn't\x1F""could\x1F""n't", + "couldn't've\x1F""could\x1F""n't\x1F""'ve", + "couldnt\x1F""could\x1F""nt", + "couldntve\x1F""could\x1F""nt\x1F""ve", + "couldn\xE2""\x80""\x99""t\x1F""could\x1F""n\xE2""\x80""\x99""t", + "couldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""could\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "couldve\x1F""could\x1F""ve", + "could\xE2""\x80""\x99""ve\x1F""could\x1F""\xE2""\x80""\x99""ve", + "c\xE2""\x80""\x99""mon\x1F""c\xE2""\x80""\x99""m\x1F""on", + "d.\x1F""d.", + "daren't\x1F""dare\x1F""n't", + "darent\x1F""dare\x1F""nt", + "daren\xE2""\x80""\x99""t\x1F""dare\x1F""n\xE2""\x80""\x99""t", + "didn't\x1F""did\x1F""n't", + "didn't've\x1F""did\x1F""n't\x1F""'ve", + "didnt\x1F""did\x1F""nt", + "didntve\x1F""did\x1F""nt\x1F""ve", + "didn\xE2""\x80""\x99""t\x1F""did\x1F""n\xE2""\x80""\x99""t", + "didn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""did\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "doesn't\x1F""does\x1F""n't", + "doesn't've\x1F""does\x1F""n't\x1F""'ve", + "doesnt\x1F""does\x1F""nt", + "doesntve\x1F""does\x1F""nt\x1F""ve", + "doesn\xE2""\x80""\x99""t\x1F""does\x1F""n\xE2""\x80""\x99""t", + "doesn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""does\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "doin\x1F""doin", + "doin'\x1F""doin'", + "doin\xE2""\x80""\x99""\x1F""doin\xE2""\x80""\x99""", + "don't\x1F""do\x1F""n't", + "don't've\x1F""do\x1F""n't\x1F""'ve", + "dont\x1F""do\x1F""nt", + "dontve\x1F""do\x1F""nt\x1F""ve", + "don\xE2""\x80""\x99""t\x1F""do\x1F""n\xE2""\x80""\x99""t", + "don\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""do\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "e.\x1F""e.", + "e.g.\x1F""e.g.", + "em\x1F""em", + "f.\x1F""f.", + "g.\x1F""g.", + "goin\x1F""goin", + "goin'\x1F""goin'", + "goin\xE2""\x80""\x99""\x1F""goin\xE2""\x80""\x99""", + "gonna\x1F""gon\x1F""na", + "gotta\x1F""got\x1F""ta", + "h.\x1F""h.", + "hadn't\x1F""had\x1F""n't", + "hadn't've\x1F""had\x1F""n't\x1F""'ve", + "hadnt\x1F""had\x1F""nt", + "hadntve\x1F""had\x1F""nt\x1F""ve", + "hadn\xE2""\x80""\x99""t\x1F""had\x1F""n\xE2""\x80""\x99""t", + "hadn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""had\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "hasn't\x1F""has\x1F""n't", + "hasnt\x1F""has\x1F""nt", + "hasn\xE2""\x80""\x99""t\x1F""has\x1F""n\xE2""\x80""\x99""t", + "haven't\x1F""have\x1F""n't", + "havent\x1F""have\x1F""nt", + "haven\xE2""\x80""\x99""t\x1F""have\x1F""n\xE2""\x80""\x99""t", + "havin\x1F""havin", + "havin'\x1F""havin'", + "havin\xE2""\x80""\x99""\x1F""havin\xE2""\x80""\x99""", + "he'd\x1F""he\x1F""'d", + "he'd've\x1F""he\x1F""'d\x1F""'ve", + "he'll\x1F""he\x1F""'ll", + "he'll've\x1F""he\x1F""'ll\x1F""'ve", + "he's\x1F""he\x1F""'s", + "hed\x1F""he\x1F""d", + "hedve\x1F""he\x1F""d\x1F""ve", + "hellve\x1F""he\x1F""ll\x1F""ve", + "hes\x1F""he\x1F""s", + "he\xE2""\x80""\x99""d\x1F""he\x1F""\xE2""\x80""\x99""d", + "he\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""he\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "he\xE2""\x80""\x99""ll\x1F""he\x1F""\xE2""\x80""\x99""ll", + "he\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""he\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "he\xE2""\x80""\x99""s\x1F""he\x1F""\xE2""\x80""\x99""s", + "how'd\x1F""how\x1F""'d", + "how'd've\x1F""how\x1F""'d\x1F""'ve", + "how'd'y\x1F""how\x1F""'d\x1F""'y", + "how'll\x1F""how\x1F""'ll", + "how'll've\x1F""how\x1F""'ll\x1F""'ve", + "how're\x1F""how\x1F""'re", + "how's\x1F""how\x1F""'s", + "how've\x1F""how\x1F""'ve", + "howd\x1F""how\x1F""d", + "howdve\x1F""how\x1F""d\x1F""ve", + "howll\x1F""how\x1F""ll", + "howllve\x1F""how\x1F""ll\x1F""ve", + "howre\x1F""how\x1F""re", + "hows\x1F""how\x1F""s", + "howve\x1F""how\x1F""ve", + "how\xE2""\x80""\x99""d\x1F""how\x1F""\xE2""\x80""\x99""d", + "how\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""how\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "how\xE2""\x80""\x99""d\xE2""\x80""\x99""y\x1F""how\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""y", + "how\xE2""\x80""\x99""ll\x1F""how\x1F""\xE2""\x80""\x99""ll", + "how\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""how\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "how\xE2""\x80""\x99""re\x1F""how\x1F""\xE2""\x80""\x99""re", + "how\xE2""\x80""\x99""s\x1F""how\x1F""\xE2""\x80""\x99""s", + "how\xE2""\x80""\x99""ve\x1F""how\x1F""\xE2""\x80""\x99""ve", + "i'd\x1F""i\x1F""'d", + "i'd've\x1F""i\x1F""'d\x1F""'ve", + "i'll\x1F""i\x1F""'ll", + "i'll've\x1F""i\x1F""'ll\x1F""'ve", + "i'm\x1F""i\x1F""'m", + "i'ma\x1F""i\x1F""'m\x1F""a", + "i've\x1F""i\x1F""'ve", + "i.\x1F""i.", + "i.e.\x1F""i.e.", + "id\x1F""i\x1F""d", + "idve\x1F""i\x1F""d\x1F""ve", + "illve\x1F""i\x1F""ll\x1F""ve", + "im\x1F""i\x1F""m", + "ima\x1F""i\x1F""m\x1F""a", + "isn't\x1F""is\x1F""n't", + "isnt\x1F""is\x1F""nt", + "isn\xE2""\x80""\x99""t\x1F""is\x1F""n\xE2""\x80""\x99""t", + "it'd\x1F""it\x1F""'d", + "it'd've\x1F""it\x1F""'d\x1F""'ve", + "it'll\x1F""it\x1F""'ll", + "it'll've\x1F""it\x1F""'ll\x1F""'ve", + "it's\x1F""it\x1F""'s", + "itd\x1F""it\x1F""d", + "itdve\x1F""it\x1F""d\x1F""ve", + "itll\x1F""it\x1F""ll", + "itllve\x1F""it\x1F""ll\x1F""ve", + "it\xE2""\x80""\x99""d\x1F""it\x1F""\xE2""\x80""\x99""d", + "it\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""it\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "it\xE2""\x80""\x99""ll\x1F""it\x1F""\xE2""\x80""\x99""ll", + "it\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""it\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "it\xE2""\x80""\x99""s\x1F""it\x1F""\xE2""\x80""\x99""s", + "ive\x1F""i\x1F""ve", + "i\xE2""\x80""\x99""d\x1F""i\x1F""\xE2""\x80""\x99""d", + "i\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""i\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "i\xE2""\x80""\x99""ll\x1F""i\x1F""\xE2""\x80""\x99""ll", + "i\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""i\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "i\xE2""\x80""\x99""m\x1F""i\x1F""\xE2""\x80""\x99""m", + "i\xE2""\x80""\x99""ma\x1F""i\x1F""\xE2""\x80""\x99""m\x1F""a", + "i\xE2""\x80""\x99""ve\x1F""i\x1F""\xE2""\x80""\x99""ve", + "j.\x1F""j.", + "k.\x1F""k.", + "l.\x1F""l.", + "let's\x1F""let\x1F""'s", + "let\xE2""\x80""\x99""s\x1F""let\x1F""\xE2""\x80""\x99""s", + "ll\x1F""ll", + "lovin\x1F""lovin", + "lovin'\x1F""lovin'", + "lovin\xE2""\x80""\x99""\x1F""lovin\xE2""\x80""\x99""", + "m.\x1F""m.", + "ma'am\x1F""ma'am", + "mayn't\x1F""may\x1F""n't", + "mayn't've\x1F""may\x1F""n't\x1F""'ve", + "maynt\x1F""may\x1F""nt", + "mayntve\x1F""may\x1F""nt\x1F""ve", + "mayn\xE2""\x80""\x99""t\x1F""may\x1F""n\xE2""\x80""\x99""t", + "mayn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""may\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "ma\xE2""\x80""\x99""am\x1F""ma\xE2""\x80""\x99""am", + "might've\x1F""might\x1F""'ve", + "mightn't\x1F""might\x1F""n't", + "mightn't've\x1F""might\x1F""n't\x1F""'ve", + "mightnt\x1F""might\x1F""nt", + "mightntve\x1F""might\x1F""nt\x1F""ve", + "mightn\xE2""\x80""\x99""t\x1F""might\x1F""n\xE2""\x80""\x99""t", + "mightn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""might\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "mightve\x1F""might\x1F""ve", + "might\xE2""\x80""\x99""ve\x1F""might\x1F""\xE2""\x80""\x99""ve", + "must've\x1F""must\x1F""'ve", + "mustn't\x1F""must\x1F""n't", + "mustn't've\x1F""must\x1F""n't\x1F""'ve", + "mustnt\x1F""must\x1F""nt", + "mustntve\x1F""must\x1F""nt\x1F""ve", + "mustn\xE2""\x80""\x99""t\x1F""must\x1F""n\xE2""\x80""\x99""t", + "mustn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""must\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "mustve\x1F""must\x1F""ve", + "must\xE2""\x80""\x99""ve\x1F""must\x1F""\xE2""\x80""\x99""ve", + "n.\x1F""n.", + "needn't\x1F""need\x1F""n't", + "needn't've\x1F""need\x1F""n't\x1F""'ve", + "neednt\x1F""need\x1F""nt", + "needntve\x1F""need\x1F""nt\x1F""ve", + "needn\xE2""\x80""\x99""t\x1F""need\x1F""n\xE2""\x80""\x99""t", + "needn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""need\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "not've\x1F""not\x1F""'ve", + "nothin\x1F""nothin", + "nothin'\x1F""nothin'", + "nothin\xE2""\x80""\x99""\x1F""nothin\xE2""\x80""\x99""", + "notve\x1F""not\x1F""ve", + "not\xE2""\x80""\x99""ve\x1F""not\x1F""\xE2""\x80""\x99""ve", + "nuff\x1F""nuff", + "nuthin\x1F""nuthin", + "nuthin'\x1F""nuthin'", + "nuthin\xE2""\x80""\x99""\x1F""nuthin\xE2""\x80""\x99""", + "o'clock\x1F""o'clock", + "o.\x1F""o.", + "o.0\x1F""o.0", + "o.O\x1F""o.O", + "o.o\x1F""o.o", + "o_0\x1F""o_0", + "o_O\x1F""o_O", + "o_o\x1F""o_o", + "ol\x1F""ol", + "ol'\x1F""ol'", + "ol\xE2""\x80""\x99""\x1F""ol\xE2""\x80""\x99""", + "oughtn't\x1F""ought\x1F""n't", + "oughtn't've\x1F""ought\x1F""n't\x1F""'ve", + "oughtnt\x1F""ought\x1F""nt", + "oughtntve\x1F""ought\x1F""nt\x1F""ve", + "oughtn\xE2""\x80""\x99""t\x1F""ought\x1F""n\xE2""\x80""\x99""t", + "oughtn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""ought\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "o\xE2""\x80""\x99""clock\x1F""o\xE2""\x80""\x99""clock", + "p.\x1F""p.", + "p.m.\x1F""p.m.", + "q.\x1F""q.", + "r.\x1F""r.", + "s.\x1F""s.", + "shan't\x1F""sha\x1F""n't", + "shan't've\x1F""sha\x1F""n't\x1F""'ve", + "shant\x1F""sha\x1F""nt", + "shantve\x1F""sha\x1F""nt\x1F""ve", + "shan\xE2""\x80""\x99""t\x1F""sha\x1F""n\xE2""\x80""\x99""t", + "shan\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""sha\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "she'd\x1F""she\x1F""'d", + "she'd've\x1F""she\x1F""'d\x1F""'ve", + "she'll\x1F""she\x1F""'ll", + "she'll've\x1F""she\x1F""'ll\x1F""'ve", + "she's\x1F""she\x1F""'s", + "shedve\x1F""she\x1F""d\x1F""ve", + "shellve\x1F""she\x1F""ll\x1F""ve", + "shes\x1F""she\x1F""s", + "she\xE2""\x80""\x99""d\x1F""she\x1F""\xE2""\x80""\x99""d", + "she\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""she\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "she\xE2""\x80""\x99""ll\x1F""she\x1F""\xE2""\x80""\x99""ll", + "she\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""she\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "she\xE2""\x80""\x99""s\x1F""she\x1F""\xE2""\x80""\x99""s", + "should've\x1F""should\x1F""'ve", + "shouldn't\x1F""should\x1F""n't", + "shouldn't've\x1F""should\x1F""n't\x1F""'ve", + "shouldnt\x1F""should\x1F""nt", + "shouldntve\x1F""should\x1F""nt\x1F""ve", + "shouldn\xE2""\x80""\x99""t\x1F""should\x1F""n\xE2""\x80""\x99""t", + "shouldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""should\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "shouldve\x1F""should\x1F""ve", + "should\xE2""\x80""\x99""ve\x1F""should\x1F""\xE2""\x80""\x99""ve", + "somethin\x1F""somethin", + "somethin'\x1F""somethin'", + "somethin\xE2""\x80""\x99""\x1F""somethin\xE2""\x80""\x99""", + "t.\x1F""t.", + "that'd\x1F""that\x1F""'d", + "that'd've\x1F""that\x1F""'d\x1F""'ve", + "that'll\x1F""that\x1F""'ll", + "that'll've\x1F""that\x1F""'ll\x1F""'ve", + "that's\x1F""that\x1F""'s", + "thatd\x1F""that\x1F""d", + "thatdve\x1F""that\x1F""d\x1F""ve", + "thatll\x1F""that\x1F""ll", + "thatllve\x1F""that\x1F""ll\x1F""ve", + "thats\x1F""that\x1F""s", + "that\xE2""\x80""\x99""d\x1F""that\x1F""\xE2""\x80""\x99""d", + "that\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""that\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "that\xE2""\x80""\x99""ll\x1F""that\x1F""\xE2""\x80""\x99""ll", + "that\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""that\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "that\xE2""\x80""\x99""s\x1F""that\x1F""\xE2""\x80""\x99""s", + "there'd\x1F""there\x1F""'d", + "there'd've\x1F""there\x1F""'d\x1F""'ve", + "there'll\x1F""there\x1F""'ll", + "there'll've\x1F""there\x1F""'ll\x1F""'ve", + "there're\x1F""there\x1F""'re", + "there's\x1F""there\x1F""'s", + "there've\x1F""there\x1F""'ve", + "thered\x1F""there\x1F""d", + "theredve\x1F""there\x1F""d\x1F""ve", + "therell\x1F""there\x1F""ll", + "therellve\x1F""there\x1F""ll\x1F""ve", + "therere\x1F""there\x1F""re", + "theres\x1F""there\x1F""s", + "thereve\x1F""there\x1F""ve", + "there\xE2""\x80""\x99""d\x1F""there\x1F""\xE2""\x80""\x99""d", + "there\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""there\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "there\xE2""\x80""\x99""ll\x1F""there\x1F""\xE2""\x80""\x99""ll", + "there\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""there\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "there\xE2""\x80""\x99""re\x1F""there\x1F""\xE2""\x80""\x99""re", + "there\xE2""\x80""\x99""s\x1F""there\x1F""\xE2""\x80""\x99""s", + "there\xE2""\x80""\x99""ve\x1F""there\x1F""\xE2""\x80""\x99""ve", + "these'd\x1F""these\x1F""'d", + "these'd've\x1F""these\x1F""'d\x1F""'ve", + "these'll\x1F""these\x1F""'ll", + "these'll've\x1F""these\x1F""'ll\x1F""'ve", + "these're\x1F""these\x1F""'re", + "these've\x1F""these\x1F""'ve", + "thesed\x1F""these\x1F""d", + "thesedve\x1F""these\x1F""d\x1F""ve", + "thesell\x1F""these\x1F""ll", + "thesellve\x1F""these\x1F""ll\x1F""ve", + "thesere\x1F""these\x1F""re", + "theseve\x1F""these\x1F""ve", + "these\xE2""\x80""\x99""d\x1F""these\x1F""\xE2""\x80""\x99""d", + "these\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""these\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "these\xE2""\x80""\x99""ll\x1F""these\x1F""\xE2""\x80""\x99""ll", + "these\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""these\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "these\xE2""\x80""\x99""re\x1F""these\x1F""\xE2""\x80""\x99""re", + "these\xE2""\x80""\x99""ve\x1F""these\x1F""\xE2""\x80""\x99""ve", + "they'd\x1F""they\x1F""'d", + "they'd've\x1F""they\x1F""'d\x1F""'ve", + "they'll\x1F""they\x1F""'ll", + "they'll've\x1F""they\x1F""'ll\x1F""'ve", + "they're\x1F""they\x1F""'re", + "they've\x1F""they\x1F""'ve", + "theyd\x1F""they\x1F""d", + "theydve\x1F""they\x1F""d\x1F""ve", + "theyll\x1F""they\x1F""ll", + "theyllve\x1F""they\x1F""ll\x1F""ve", + "theyre\x1F""they\x1F""re", + "theyve\x1F""they\x1F""ve", + "they\xE2""\x80""\x99""d\x1F""they\x1F""\xE2""\x80""\x99""d", + "they\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""they\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "they\xE2""\x80""\x99""ll\x1F""they\x1F""\xE2""\x80""\x99""ll", + "they\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""they\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "they\xE2""\x80""\x99""re\x1F""they\x1F""\xE2""\x80""\x99""re", + "they\xE2""\x80""\x99""ve\x1F""they\x1F""\xE2""\x80""\x99""ve", + "this'd\x1F""this\x1F""'d", + "this'd've\x1F""this\x1F""'d\x1F""'ve", + "this'll\x1F""this\x1F""'ll", + "this'll've\x1F""this\x1F""'ll\x1F""'ve", + "this's\x1F""this\x1F""'s", + "thisd\x1F""this\x1F""d", + "thisdve\x1F""this\x1F""d\x1F""ve", + "thisll\x1F""this\x1F""ll", + "thisllve\x1F""this\x1F""ll\x1F""ve", + "thiss\x1F""this\x1F""s", + "this\xE2""\x80""\x99""d\x1F""this\x1F""\xE2""\x80""\x99""d", + "this\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""this\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "this\xE2""\x80""\x99""ll\x1F""this\x1F""\xE2""\x80""\x99""ll", + "this\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""this\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "this\xE2""\x80""\x99""s\x1F""this\x1F""\xE2""\x80""\x99""s", + "those'd\x1F""those\x1F""'d", + "those'd've\x1F""those\x1F""'d\x1F""'ve", + "those'll\x1F""those\x1F""'ll", + "those'll've\x1F""those\x1F""'ll\x1F""'ve", + "those're\x1F""those\x1F""'re", + "those've\x1F""those\x1F""'ve", + "thosed\x1F""those\x1F""d", + "thosedve\x1F""those\x1F""d\x1F""ve", + "thosell\x1F""those\x1F""ll", + "thosellve\x1F""those\x1F""ll\x1F""ve", + "thosere\x1F""those\x1F""re", + "thoseve\x1F""those\x1F""ve", + "those\xE2""\x80""\x99""d\x1F""those\x1F""\xE2""\x80""\x99""d", + "those\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""those\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "those\xE2""\x80""\x99""ll\x1F""those\x1F""\xE2""\x80""\x99""ll", + "those\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""those\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "those\xE2""\x80""\x99""re\x1F""those\x1F""\xE2""\x80""\x99""re", + "those\xE2""\x80""\x99""ve\x1F""those\x1F""\xE2""\x80""\x99""ve", + "u.\x1F""u.", + "v.\x1F""v.", + "v.s.\x1F""v.s.", + "v.v\x1F""v.v", + "v_v\x1F""v_v", + "vs.\x1F""vs.", + "w.\x1F""w.", + "w/o\x1F""w/o", + "wasn't\x1F""was\x1F""n't", + "wasnt\x1F""was\x1F""nt", + "wasn\xE2""\x80""\x99""t\x1F""was\x1F""n\xE2""\x80""\x99""t", + "we'd\x1F""we\x1F""'d", + "we'd've\x1F""we\x1F""'d\x1F""'ve", + "we'll\x1F""we\x1F""'ll", + "we'll've\x1F""we\x1F""'ll\x1F""'ve", + "we're\x1F""we\x1F""'re", + "we've\x1F""we\x1F""'ve", + "wed\x1F""we\x1F""d", + "wedve\x1F""we\x1F""d\x1F""ve", + "wellve\x1F""we\x1F""ll\x1F""ve", + "weren't\x1F""were\x1F""n't", + "werent\x1F""were\x1F""nt", + "weren\xE2""\x80""\x99""t\x1F""were\x1F""n\xE2""\x80""\x99""t", + "weve\x1F""we\x1F""ve", + "we\xE2""\x80""\x99""d\x1F""we\x1F""\xE2""\x80""\x99""d", + "we\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""we\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "we\xE2""\x80""\x99""ll\x1F""we\x1F""\xE2""\x80""\x99""ll", + "we\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""we\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "we\xE2""\x80""\x99""re\x1F""we\x1F""\xE2""\x80""\x99""re", + "we\xE2""\x80""\x99""ve\x1F""we\x1F""\xE2""\x80""\x99""ve", + "what'd\x1F""what\x1F""'d", + "what'd've\x1F""what\x1F""'d\x1F""'ve", + "what'll\x1F""what\x1F""'ll", + "what'll've\x1F""what\x1F""'ll\x1F""'ve", + "what're\x1F""what\x1F""'re", + "what's\x1F""what\x1F""'s", + "what've\x1F""what\x1F""'ve", + "whatd\x1F""what\x1F""d", + "whatdve\x1F""what\x1F""d\x1F""ve", + "whatll\x1F""what\x1F""ll", + "whatllve\x1F""what\x1F""ll\x1F""ve", + "whatre\x1F""what\x1F""re", + "whats\x1F""what\x1F""s", + "whatve\x1F""what\x1F""ve", + "what\xE2""\x80""\x99""d\x1F""what\x1F""\xE2""\x80""\x99""d", + "what\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""what\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "what\xE2""\x80""\x99""ll\x1F""what\x1F""\xE2""\x80""\x99""ll", + "what\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""what\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "what\xE2""\x80""\x99""re\x1F""what\x1F""\xE2""\x80""\x99""re", + "what\xE2""\x80""\x99""s\x1F""what\x1F""\xE2""\x80""\x99""s", + "what\xE2""\x80""\x99""ve\x1F""what\x1F""\xE2""\x80""\x99""ve", + "when'd\x1F""when\x1F""'d", + "when'd've\x1F""when\x1F""'d\x1F""'ve", + "when'll\x1F""when\x1F""'ll", + "when'll've\x1F""when\x1F""'ll\x1F""'ve", + "when're\x1F""when\x1F""'re", + "when's\x1F""when\x1F""'s", + "when've\x1F""when\x1F""'ve", + "whend\x1F""when\x1F""d", + "whendve\x1F""when\x1F""d\x1F""ve", + "whenll\x1F""when\x1F""ll", + "whenllve\x1F""when\x1F""ll\x1F""ve", + "whenre\x1F""when\x1F""re", + "whens\x1F""when\x1F""s", + "whenve\x1F""when\x1F""ve", + "when\xE2""\x80""\x99""d\x1F""when\x1F""\xE2""\x80""\x99""d", + "when\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""when\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "when\xE2""\x80""\x99""ll\x1F""when\x1F""\xE2""\x80""\x99""ll", + "when\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""when\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "when\xE2""\x80""\x99""re\x1F""when\x1F""\xE2""\x80""\x99""re", + "when\xE2""\x80""\x99""s\x1F""when\x1F""\xE2""\x80""\x99""s", + "when\xE2""\x80""\x99""ve\x1F""when\x1F""\xE2""\x80""\x99""ve", + "where'd\x1F""where\x1F""'d", + "where'd've\x1F""where\x1F""'d\x1F""'ve", + "where'll\x1F""where\x1F""'ll", + "where'll've\x1F""where\x1F""'ll\x1F""'ve", + "where're\x1F""where\x1F""'re", + "where's\x1F""where\x1F""'s", + "where've\x1F""where\x1F""'ve", + "whered\x1F""where\x1F""d", + "wheredve\x1F""where\x1F""d\x1F""ve", + "wherell\x1F""where\x1F""ll", + "wherellve\x1F""where\x1F""ll\x1F""ve", + "wherere\x1F""where\x1F""re", + "wheres\x1F""where\x1F""s", + "whereve\x1F""where\x1F""ve", + "where\xE2""\x80""\x99""d\x1F""where\x1F""\xE2""\x80""\x99""d", + "where\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""where\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "where\xE2""\x80""\x99""ll\x1F""where\x1F""\xE2""\x80""\x99""ll", + "where\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""where\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "where\xE2""\x80""\x99""re\x1F""where\x1F""\xE2""\x80""\x99""re", + "where\xE2""\x80""\x99""s\x1F""where\x1F""\xE2""\x80""\x99""s", + "where\xE2""\x80""\x99""ve\x1F""where\x1F""\xE2""\x80""\x99""ve", + "who'd\x1F""who\x1F""'d", + "who'd've\x1F""who\x1F""'d\x1F""'ve", + "who'll\x1F""who\x1F""'ll", + "who'll've\x1F""who\x1F""'ll\x1F""'ve", + "who're\x1F""who\x1F""'re", + "who's\x1F""who\x1F""'s", + "who've\x1F""who\x1F""'ve", + "whod\x1F""who\x1F""d", + "whodve\x1F""who\x1F""d\x1F""ve", + "wholl\x1F""who\x1F""ll", + "whollve\x1F""who\x1F""ll\x1F""ve", + "whos\x1F""who\x1F""s", + "whove\x1F""who\x1F""ve", + "who\xE2""\x80""\x99""d\x1F""who\x1F""\xE2""\x80""\x99""d", + "who\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""who\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "who\xE2""\x80""\x99""ll\x1F""who\x1F""\xE2""\x80""\x99""ll", + "who\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""who\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "who\xE2""\x80""\x99""re\x1F""who\x1F""\xE2""\x80""\x99""re", + "who\xE2""\x80""\x99""s\x1F""who\x1F""\xE2""\x80""\x99""s", + "who\xE2""\x80""\x99""ve\x1F""who\x1F""\xE2""\x80""\x99""ve", + "why'd\x1F""why\x1F""'d", + "why'd've\x1F""why\x1F""'d\x1F""'ve", + "why'll\x1F""why\x1F""'ll", + "why'll've\x1F""why\x1F""'ll\x1F""'ve", + "why're\x1F""why\x1F""'re", + "why's\x1F""why\x1F""'s", + "why've\x1F""why\x1F""'ve", + "whyd\x1F""why\x1F""d", + "whydve\x1F""why\x1F""d\x1F""ve", + "whyll\x1F""why\x1F""ll", + "whyllve\x1F""why\x1F""ll\x1F""ve", + "whyre\x1F""why\x1F""re", + "whys\x1F""why\x1F""s", + "whyve\x1F""why\x1F""ve", + "why\xE2""\x80""\x99""d\x1F""why\x1F""\xE2""\x80""\x99""d", + "why\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""why\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "why\xE2""\x80""\x99""ll\x1F""why\x1F""\xE2""\x80""\x99""ll", + "why\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""why\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "why\xE2""\x80""\x99""re\x1F""why\x1F""\xE2""\x80""\x99""re", + "why\xE2""\x80""\x99""s\x1F""why\x1F""\xE2""\x80""\x99""s", + "why\xE2""\x80""\x99""ve\x1F""why\x1F""\xE2""\x80""\x99""ve", + "won't\x1F""wo\x1F""n't", + "won't've\x1F""wo\x1F""n't\x1F""'ve", + "wont\x1F""wo\x1F""nt", + "wontve\x1F""wo\x1F""nt\x1F""ve", + "won\xE2""\x80""\x99""t\x1F""wo\x1F""n\xE2""\x80""\x99""t", + "won\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""wo\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "would've\x1F""would\x1F""'ve", + "wouldn't\x1F""would\x1F""n't", + "wouldn't've\x1F""would\x1F""n't\x1F""'ve", + "wouldnt\x1F""would\x1F""nt", + "wouldntve\x1F""would\x1F""nt\x1F""ve", + "wouldn\xE2""\x80""\x99""t\x1F""would\x1F""n\xE2""\x80""\x99""t", + "wouldn\xE2""\x80""\x99""t\xE2""\x80""\x99""ve\x1F""would\x1F""n\xE2""\x80""\x99""t\x1F""\xE2""\x80""\x99""ve", + "wouldve\x1F""would\x1F""ve", + "would\xE2""\x80""\x99""ve\x1F""would\x1F""\xE2""\x80""\x99""ve", + "x.\x1F""x.", + "xD\x1F""xD", + "xDD\x1F""xDD", + "y'all\x1F""y'\x1F""all", + "y.\x1F""y.", + "yall\x1F""y\x1F""all", + "you'd\x1F""you\x1F""'d", + "you'd've\x1F""you\x1F""'d\x1F""'ve", + "you'll\x1F""you\x1F""'ll", + "you'll've\x1F""you\x1F""'ll\x1F""'ve", + "you're\x1F""you\x1F""'re", + "you've\x1F""you\x1F""'ve", + "youd\x1F""you\x1F""d", + "youdve\x1F""you\x1F""d\x1F""ve", + "youll\x1F""you\x1F""ll", + "youllve\x1F""you\x1F""ll\x1F""ve", + "youre\x1F""you\x1F""re", + "youve\x1F""you\x1F""ve", + "you\xE2""\x80""\x99""d\x1F""you\x1F""\xE2""\x80""\x99""d", + "you\xE2""\x80""\x99""d\xE2""\x80""\x99""ve\x1F""you\x1F""\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""ve", + "you\xE2""\x80""\x99""ll\x1F""you\x1F""\xE2""\x80""\x99""ll", + "you\xE2""\x80""\x99""ll\xE2""\x80""\x99""ve\x1F""you\x1F""\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ve", + "you\xE2""\x80""\x99""re\x1F""you\x1F""\xE2""\x80""\x99""re", + "you\xE2""\x80""\x99""ve\x1F""you\x1F""\xE2""\x80""\x99""ve", + "y\xE2""\x80""\x99""all\x1F""y\xE2""\x80""\x99""\x1F""all", + "z.\x1F""z.", + "\xC2""\xA0""\x1F""\xC2""\xA0""", + "\xC2""\xAF""\x5C""(\xE3""\x83""\x84"")/\xC2""\xAF""\x1F""\xC2""\xAF""\x5C""(\xE3""\x83""\x84"")/\xC2""\xAF""", + "\xC2""\xB0""C.\x1F""\xC2""\xB0""\x1F""C\x1F"".", + "\xC2""\xB0""F.\x1F""\xC2""\xB0""\x1F""F\x1F"".", + "\xC2""\xB0""K.\x1F""\xC2""\xB0""\x1F""K\x1F"".", + "\xC2""\xB0""c.\x1F""\xC2""\xB0""\x1F""c\x1F"".", + "\xC2""\xB0""f.\x1F""\xC2""\xB0""\x1F""f\x1F"".", + "\xC2""\xB0""k.\x1F""\xC2""\xB0""\x1F""k\x1F"".", + "\xC3""\xA4"".\x1F""\xC3""\xA4"".", + "\xC3""\xB6"".\x1F""\xC3""\xB6"".", + "\xC3""\xBC"".\x1F""\xC3""\xBC"".", + "\xE0""\xB2""\xA0""_\xE0""\xB2""\xA0""\x1F""\xE0""\xB2""\xA0""_\xE0""\xB2""\xA0""", + "\xE0""\xB2""\xA0""\xEF""\xB8""\xB5""\xE0""\xB2""\xA0""\x1F""\xE0""\xB2""\xA0""\xEF""\xB8""\xB5""\xE0""\xB2""\xA0""", + "\xE2""\x80""\x94""\x1F""\xE2""\x80""\x94""", + "\xE2""\x80""\x98""S\x1F""\xE2""\x80""\x98""S", + "\xE2""\x80""\x98""s\x1F""\xE2""\x80""\x98""s", + "\xE2""\x80""\x99""\x1F""\xE2""\x80""\x99""", + "\xE2""\x80""\x99""Cause\x1F""\xE2""\x80""\x99""Cause", + "\xE2""\x80""\x99""Cos\x1F""\xE2""\x80""\x99""Cos", + "\xE2""\x80""\x99""Coz\x1F""\xE2""\x80""\x99""Coz", + "\xE2""\x80""\x99""Cuz\x1F""\xE2""\x80""\x99""Cuz", + "\xE2""\x80""\x99""S\x1F""\xE2""\x80""\x99""S", + "\xE2""\x80""\x99""bout\x1F""\xE2""\x80""\x99""bout", + "\xE2""\x80""\x99""cause\x1F""\xE2""\x80""\x99""cause", + "\xE2""\x80""\x99""cos\x1F""\xE2""\x80""\x99""cos", + "\xE2""\x80""\x99""coz\x1F""\xE2""\x80""\x99""coz", + "\xE2""\x80""\x99""cuz\x1F""\xE2""\x80""\x99""cuz", + "\xE2""\x80""\x99""d\x1F""\xE2""\x80""\x99""d", + "\xE2""\x80""\x99""em\x1F""\xE2""\x80""\x99""em", + "\xE2""\x80""\x99""ll\x1F""\xE2""\x80""\x99""ll", + "\xE2""\x80""\x99""nuff\x1F""\xE2""\x80""\x99""nuff", + "\xE2""\x80""\x99""re\x1F""\xE2""\x80""\x99""re", + "\xE2""\x80""\x99""s\x1F""\xE2""\x80""\x99""s", + "\xE2""\x80""\x99""\xE2""\x80""\x99""\x1F""\xE2""\x80""\x99""\xE2""\x80""\x99""", +}; diff --git a/tools/misaki-g2p/src/tagger.cpp b/tools/misaki-g2p/src/tagger.cpp new file mode 100644 index 0000000000..9de6d67669 --- /dev/null +++ b/tools/misaki-g2p/src/tagger.cpp @@ -0,0 +1,632 @@ +// SPDX-License-Identifier: Apache-2.0 +// A small rule-based Penn Treebank tagger standing in for spaCy's +// en_core_web_sm tagger. misaki reads the tag in a few places only: +// - punctuation, currency ($), dashes (:) and numbers (CD) in retokenize +// - a/an/am/I/by/in/to/the/that/used/vs special cases +// - NNP for all-caps words (spelled out unless the lexicon stresses them) +// - noun / verb / adjective / adverb / past-tense variants of about 790 +// homographs (record, present, read, use, close, live, ...) +// so the rules aim at those decisions, not at full tagging accuracy. +#include "misaki-internal.h" + +#include +#include + +namespace misaki { +namespace { + +const std::unordered_map & closed_class() { + static const std::unordered_map m = [] { + std::unordered_map t; + auto add = [&](const char * tag, std::initializer_list words) { + for (const char * w : words) t[w] = tag; + }; + add("DT", {"the", "a", "an", "this", "these", "those", "every", "each", "no", "another", "some", "any", + "all", "both", "either", "neither", "half", "an", "th'"}); + add("PDT", {"such"}); + add("PRP", {"i", "you", "he", "she", "it", "we", "they", "me", "him", "us", "them", "myself", "yourself", + "himself", "herself", "itself", "ourselves", "yourselves", "themselves", "'em", "one's"}); + add("PRP$", {"my", "your", "his", "its", "our", "their", "her"}); + add("IN", {"of", "in", "on", "at", "by", "for", "with", "from", "into", "onto", "about", "as", "than", + "after", "before", "during", "since", "until", "till", "through", "throughout", "over", "under", + "between", "among", "amongst", "against", "without", "within", "upon", "toward", "towards", + "across", "behind", "beyond", "despite", "like", "near", "per", "via", "if", "because", + "although", "though", "while", "whilst", "whether", "unless", "around", "along", "alongside", + "beside", "besides", "below", "beneath", "above", "inside", "outside", "underneath", "amid", + "amidst", "except", "unlike", "versus", "vs", "vs.", "whereas", "onto", "atop", "aboard", + "past", "o'er", "whereby", "albeit", "lest"}); + add("TO", {"to"}); + add("CC", {"and", "or", "but", "nor", "&", "plus", "yet", "either", "neither"}); + add("MD", {"can", "could", "will", "would", "shall", "should", "may", "might", "must", "'ll", "wo", "ca", + "cannot", "'d", "ought"}); + add("VB", {"be"}); + add("VBZ", {"is", "has", "does", "'s"}); + add("VBP", {"am", "are", "'re", "'m", "do", "have", "'ve"}); + add("VBD", {"was", "were", "did", "had"}); + add("VBN", {"been"}); + add("VBG", {"being", "having", "doing"}); + add("RB", {"not", "n't", "never", "also", "very", "often", "always", "just", "only", "then", "now", "here", + "too", "still", "already", "soon", "even", "again", "ever", "however", "almost", "quite", + "rather", "perhaps", "maybe", "away", "back", "later", "together", "once", "twice", "thus", + "therefore", "instead", "nearly", "else", "sometimes", "usually", "today", "tonight", + "tomorrow", "yesterday", "anyway", "otherwise", "indeed", "somewhat", "abroad", "ago", + "afterwards", "afterward", "meanwhile", "nevertheless", "nonetheless", "hence", "elsewhere", + "everywhere", "anywhere", "somewhere", "nowhere", "seldom", "rarely", "forth", "further", + "furthermore", "moreover", "much", "more", "most", "less", "least", "well", "so"}); + add("WDT", {"which", "whatever", "whichever"}); + add("WP", {"who", "whom", "what", "whoever", "whomever"}); + add("WP$", {"whose"}); + add("WRB", {"when", "where", "why", "how", "whenever", "wherever", "whereupon"}); + add("EX", {"there"}); + add("UH", {"oh", "yes", "hello", "hi", "hey", "okay", "ok", "please", "wow", "goodbye", "thanks", + "uh", "um", "ah", "yeah", "bye"}); + add("RP", {"up", "out", "off", "down"}); + add("POS", {"'", "’"}); + add("JJ", {"other", "many", "few", "several", "own", "same", "next", "last", "first", "new", "old", + "good", "great", "large", "small", "big", "little", "long", "high", "early", "late", "young", + "able", "major", "main", "various", "certain", "different", "important", "possible", "local", + "national", "public", "political", "social", "real", "sure", "free", "full", "special", + "general", "whole", "previous", "former", "original", "final", "second", "third", + "current", "single", "white", "black", "red", "green", "blue", "dark", "rare", "hard", "easy", + "fine", "quick", "brown", "lazy", "smooth", "warm", "sunny", "quiet", "ready", "due", "loud", + "best", "better", "worse", "worst"}); + add("NN", {"%"}); + return t; + }(); + return m; +} + +bool has_alpha(const u32 & s) { + for (char32_t c : s) if (py_isalpha(c)) return true; + return false; +} +bool has_digit(const u32 & s) { + for (char32_t c : s) if (c >= '0' && c <= '9') return true; + return false; +} +bool word_like(const u32 & t) { return has_alpha(t) || has_digit(t); } + +bool is_currency_symbol(const u32 & t) { + static const std::unordered_set s = {U"$", U"£", U"€", U"¥", U"₹", U"₽", U"₩", U"฿", U"US$", + U"C$", U"A$", U"₱", U"₪", U"₫", U"₴", U"₦"}; + return s.count(t) > 0; +} + +bool is_capitalized(const u32 & t) { + return !t.empty() && py_isalpha(t[0]) && py_lower(t.substr(0, 1)) != t.substr(0, 1); +} + +bool is_all_caps(const u32 & t) { + int letters = 0; + for (char32_t c : t) { + if (py_isalpha(c)) { + letters++; + if (py_lower(u32(1, c)) == u32(1, c)) return false; + } + } + return letters >= 2; +} + +bool is_quote(const u32 & t) { return t == U"\"" || t == U"“" || t == U"”" || t == U"'" || t == U"‘" || t == U"’" || t == U"`" || t == U"``" || t == U"''"; } + +std::string punct_tag(const u32 & t) { + if (t == U"." || t == U"!" || t == U"?" || t == U"?!" || t == U"!?" || t == U"!!" || t == U"??") return "."; + if (t == U",") return ","; + if (t == U"(" || t == U"[" || t == U"{") return "-LRB-"; + if (t == U")" || t == U"]" || t == U"}") return "-RRB-"; + if (t == U"“" || t == U"``" || t == U"‘" || t == U"`" || t == U"«") return "``"; + if (t == U"”" || t == U"''" || t == U"»" || t == U"’") return "''"; + if (t == U"…") return "NFP"; + if (t == U"%") return "NN"; + if (t == U"&") return "CC"; + if (t == U"#") return "NN"; + if (t == U"/" || t == U"=" || t == U"+") return "SYM"; + if (t == U"@") return "IN"; + if (t == U"*" || t == U"~" || t == U"•" || t == U"·") return "NFP"; + if (is_currency_symbol(t)) return "$"; + bool dashes = !t.empty(); + for (char32_t c : t) { + if (!(c == ';' || c == ':' || c == '-' || c == U'—' || c == U'–' || c == '.' || c == U'…')) dashes = false; + } + if (dashes) return ":"; // ; : - -- — – ... and runs of them + return "SYM"; // °, ©, ™, emoji and other symbols are read as words +} + +struct Tok { + u32 text; + u32 lower; + std::string tag; + bool space_after = false; + bool space_before = false; + bool sent_start = false; + bool closed = false; // tag came from the closed-class list +}; + +bool is_verb_tag(const std::string & t) { return t.rfind("VB", 0) == 0 || t == "MD"; } +bool is_noun_tag(const std::string & t) { return t.rfind("NN", 0) == 0; } + +bool subject_pronoun(const u32 & l) { + return l == U"i" || l == U"you" || l == U"we" || l == U"they" || l == U"he" || l == U"she" || l == U"it"; +} +bool third_person(const u32 & l) { return l == U"he" || l == U"she" || l == U"it"; } +bool is_be(const u32 & l) { + return l == U"be" || l == U"is" || l == U"are" || l == U"was" || l == U"were" || l == U"been" || l == U"being" || + l == U"am" || l == U"'s" || l == U"'re" || l == U"'m"; +} +bool is_have(const u32 & l) { return l == U"have" || l == U"has" || l == U"had" || l == U"'ve" || l == U"having"; } +bool is_do(const u32 & l) { return l == U"do" || l == U"does" || l == U"did"; } + +std::string guess_open_class(const u32 & l) { + if (ends_with(l, U"ly") && l.size() > 4) return "RB"; + if (ends_with(l, U"ing") && l.size() > 4) return "VBG"; + if (ends_with(l, U"ed") && l.size() > 3) return "VBN"; + for (const char32_t * s : {U"ous", U"ful", U"ive", U"able", U"ible", U"ic", U"less", U"ish", U"ary", U"al", U"ant", + U"ent", U"est"}) { + if (ends_with(l, s) && l.size() > u32(s).size() + 2) return "JJ"; + } + if (ends_with(l, U"s") && !ends_with(l, U"ss") && !ends_with(l, U"us") && !ends_with(l, U"is") && l.size() > 3) { + return "NNS"; + } + return "NN"; +} + +// Which readings the lexicon distinguishes for a homograph: from the word's +// own gold entry, or the entry of the stem misaki falls back to. +struct Prior { + bool any = false; + bool verb_variant = false; // DEFAULT is the noun/adjective reading + bool noun_variant = false; // DEFAULT is the verb reading + bool adj_variant = false; + bool adv_variant = false; +}; + +Prior homograph_prior(const LexFile * lex, const u32 & l) { + Prior p; + if (!lex) return p; + auto from = [&](const LexValue & v) { + if (!v.found || !v.is_dict) return false; + p.verb_variant = v.has_tag[TAG_VERB] || v.has_tag[TAG_VBD] || v.has_tag[TAG_VBN] || v.has_tag[TAG_VBP]; + p.noun_variant = v.has_tag[TAG_NOUN]; + p.adj_variant = v.has_tag[TAG_ADJ]; + p.adv_variant = v.has_tag[TAG_ADV]; + p.any = p.verb_variant || p.noun_variant || p.adj_variant || p.adv_variant; + return p.any; + }; + LexValue own = lex->gold(l); + if (own.found) { + from(own); + return p; + } + if (lex->in_silver(l)) return p; + for (const char32_t * suf : {U"s", U"es", U"ed", U"d", U"ing"}) { + if (ends_with(l, suf) && l.size() > u32(suf).size() + 2) { + u32 stem = l.substr(0, l.size() - u32(suf).size()); + if (from(lex->gold(stem))) return p; + if (u32(suf) == U"ing" && from(lex->gold(stem + U"e"))) return p; + if (u32(suf) == U"es" && ends_with(stem, U"i") && from(lex->gold(stem.substr(0, stem.size() - 1) + U"y"))) return p; + } + } + return p; +} + +} // namespace + +std::vector tag_tokens(const std::vector & in, const LexFile * lex) { + const auto & cc = closed_class(); + const size_t N = in.size(); + std::vector t(N); + for (size_t i = 0; i < N; i++) { + t[i].text = in[i].text; + t[i].lower = py_lower(in[i].text); + t[i].space_after = in[i].space_after; + t[i].space_before = i == 0 || in[i - 1].space_after; + } + for (size_t i = 0; i < N; i++) { + if (i == 0) { t[i].sent_start = true; continue; } + const u32 & p = t[i - 1].text; + if (p == U"." || p == U"!" || p == U"?" || p == U":" || p == U";" || p == U"“" || p == U"(" || p == U"\"") + t[i].sent_start = !(p == U"\"" && t[i - 1].space_after && i >= 2 && word_like(t[i - 2].text)); + } + + // pass 1: lexical tags + int dq = 0; // straight double quotes seen so far + for (size_t i = 0; i < N; i++) { + Tok & k = t[i]; + const u32 & w = k.text; + if (!word_like(w)) { + if (w == U"\"") { + // spaCy reads straight quotes mostly by parity, with a few + // context habits learned from WikiText-style spacing + bool odd = (dq % 2) == 0; + dq++; + const Tok * pv = i > 0 ? &t[i - 1] : nullptr; + const Tok * nx = i + 1 < N ? &t[i + 1] : nullptr; + bool more_quotes = false; + for (size_t j = i + 1; j < N; j++) if (t[j].text == U"\"") more_quotes = true; + if (pv && !k.space_before && (k.space_after || !nx || !word_like(nx->text))) { + k.tag = "''"; // glued to the word before it + } else if (nx && k.space_before && !k.space_after && word_like(nx->text)) { + k.tag = "``"; // glued to the word after it + } else if (!more_quotes && odd && pv && (!nx || nx->text == U".")) { + k.tag = "''"; // a lone quote closing the sentence + } else if (odd) { + k.tag = (pv && pv->text == U",") ? "''" : "``"; + } else if (pv && nx && word_like(nx->text) && + (pv->tag == "IN" || pv->tag == "DT" || pv->tag == "TO" || pv->tag == "CC" || pv->tag == "," || + pv->tag == "VBD" || pv->tag == "VBZ" || pv->tag == "VBP" || pv->tag == "VB")) { + k.tag = "``"; // follows a function word: opens a quote + } else { + k.tag = (nx && nx->text == U"," && pv && is_capitalized(pv->text)) ? "``" : "''"; + } + } else if ((w == U"'" || w == U"‘" || w == U"’") && !k.space_after && i + 1 < N && k.space_before && + (t[i + 1].text == U"ve" || t[i + 1].text == U"m" || t[i + 1].text == U"re" || t[i + 1].text == U"ll" || + t[i + 1].text == U"d" || t[i + 1].text == U"s" || + (t[i + 1].text == U"t" && i > 0 && t[i - 1].lower != U"doesn"))) { + k.tag = "XX"; // glued to the next word (WikiText " 've", "'Yeah"): resolved below + } else if (w.size() > 1 && std::all_of(w.begin(), w.end(), [](char32_t c) { return c == '-'; })) { + k.tag = ":"; + } else if (w == U"-" && !k.space_before && !k.space_after) { + k.tag = "HYPH"; + } else if (w == U"-" && !(t.back().text == U"." || t.back().text == U"!" || t.back().text == U"?" || + t.back().text == U"\"" || t.back().text == U")" || t.back().text == U"'")) { + k.tag = "HYPH"; // spaced dash in a heading or list item (no final punctuation) + } else if (w == U":" && i > 0 && !k.space_before && has_digit(t[i - 1].text) && i + 1 < N && + has_digit(t[i + 1].text) && !has_alpha(t[i + 1].text)) { + k.tag = "SYM"; // 22: 00, 3:2 + } else if ((w == U"'" || w == U"’") && i > 0 && !k.space_before && ends_with(t[i - 1].lower, U"s") && + word_like(t[i - 1].text)) { + k.tag = "POS"; // plural possessive: "the Smiths' house" + } else if (w == U"'" && i + 2 < N && t[i + 1].lower == U"n" && t[i + 2].text == U"'" && !k.space_after) { + k.tag = "CC"; // rock 'n' roll + t[i + 1].tag = "CC"; + t[i + 2].tag = "CC"; + t[i + 1].closed = t[i + 2].closed = true; + i += 2; + } else if (w == U"'" || w == U"‘" || w == U"`") { + k.tag = (k.space_before || i == 0) ? "``" : "''"; + } else { + k.tag = punct_tag(w); + } + continue; + } + if (has_digit(w) && !has_alpha(w)) { + k.tag = "CD"; + continue; + } + if (has_digit(w)) { + k.tag = (ends_with(k.lower, U"s") && !ends_with(k.lower, U"'s")) ? "NNS" : "NN"; + if (ends_with(k.lower, U"st") || ends_with(k.lower, U"nd") || ends_with(k.lower, U"rd") || ends_with(k.lower, U"th")) + k.tag = "JJ"; + continue; + } + std::string l8 = to_utf8(k.lower); + auto it = cc.find(l8); + bool cap = is_capitalized(w); + if (is_all_caps(w)) { + bool caps_run = (i > 0 && is_all_caps(t[i - 1].text)) || (i + 1 < N && is_all_caps(t[i + 1].text)); + static const std::unordered_set caps_function = { + "of", "the", "and", "in", "on", "at", "to", "for", "by", "with", "from", "or", "as", "is", "are", "a", "an"}; + if (it != cc.end() && ((caps_run && caps_function.count(l8)) || l8 == "to")) { + k.tag = it->second; + k.closed = true; + } else { + k.tag = "NNP"; + } + continue; + } + if (it != cc.end() && (!cap || k.sent_start || w == U"I")) { + k.tag = it->second; + k.closed = true; + continue; + } + if (it != cc.end() && cap) { + static const std::unordered_set namey = {"may", "will", "can", "march", "mark", "bill", + "rose", "grant", "art", "frank", "jack", "will"}; + k.tag = namey.count(l8) ? "NNP" : it->second; + k.closed = !namey.count(l8); + continue; + } + if (cap) { + bool common = k.sent_start && lex && (lex->in_gold(k.lower) || lex->in_silver(k.lower)) && + !(i + 1 < N && is_capitalized(t[i + 1].text) && !is_all_caps(t[i + 1].text)); + k.tag = common ? guess_open_class(k.lower) : "NNP"; + continue; + } + k.tag = guess_open_class(k.lower); + } + // glued apostrophes take the tag of the word they lead + for (size_t i = 0; i + 1 < N; i++) if (t[i].tag == "XX") t[i].tag = t[i + 1].tag; + // number words after a number: "$ 66 million" + for (size_t i = 1; i < N; i++) { + const u32 & l = t[i].lower; + if (t[i - 1].tag == "CD" && (l == U"hundred" || l == U"thousand" || l == U"million" || l == U"billion" || l == U"trillion")) + t[i].tag = "CD"; + } + + auto P = [&](size_t i, size_t back) -> const Tok * { return i >= back ? &t[i - back] : nullptr; }; + auto Nx = [&](size_t i, size_t fwd) -> const Tok * { return i + fwd < N ? &t[i + fwd] : nullptr; }; + auto ends_clause = [&](const Tok * n) { return !n || !word_like(n->text); }; + // "record a memo and then read it": the tag of the verb this one is coordinated with + auto coordinated_verb = [&](size_t i) -> std::string { + size_t j = i; + if (j >= 1 && t[j - 1].tag == "RB") j--; + if (j < 1 || t[j - 1].tag != "CC") return ""; + for (size_t b = j - 1; b-- > 0 && j - b <= 8;) { + const std::string & g = t[b].tag; + if (g == "VB" || g == "VBD" || g == "VBP" || g == "VBZ") return g; + if (!word_like(t[b].text) && t[b].text != U"'s") return ""; + } + return ""; + }; + + // pass 2: verbs after modals, to, do-support and subjects + for (size_t i = 0; i < N; i++) { + Tok & k = t[i]; + if (k.closed || !word_like(k.text) || k.tag == "NNP" || k.tag == "CD") continue; + const Tok * p = P(i, 1); + const Tok * n = Nx(i, 1); + if (!p) continue; + const u32 & pl = p->lower; + const u32 & l = k.lower; + bool after_not = (pl == U"not" || pl == U"n't" || pl == U"never") && i >= 2 && + (t[i - 2].tag == "MD" || is_do(t[i - 2].lower) || t[i - 2].tag == "TO"); + bool after_adv = p->tag == "RB" && i >= 2 && (t[i - 2].tag == "MD" || t[i - 2].tag == "TO"); + if (p->tag == "MD" || p->tag == "TO" || after_not || after_adv || is_do(pl) || pl == U"please") { + if (!(k.tag == "NNS" && p->tag != "MD" && p->tag != "TO") && k.tag != "RB" && k.tag != "VBG") k.tag = "VB"; + } else if (p->tag == "PRP" && subject_pronoun(pl)) { + if (ends_with(l, U"ed")) k.tag = "VBD"; + else if (k.tag == "NNS" && third_person(pl)) k.tag = "VBZ"; + else if (k.tag != "RB" && k.tag != "VBG" && k.tag != "JJ") k.tag = third_person(pl) ? "VBD" : "VBP"; + } else if (k.tag == "VBN" && (is_noun_tag(p->tag) || p->tag == "PRP") && !is_be(pl) && !is_have(pl)) { + k.tag = "VBD"; + } + if (k.tag == "VBN" && p->tag == "DT" && n && (n->tag == "NN" || n->tag == "NNS")) k.tag = "JJ"; + if (k.tag == "VBG" && (p->tag == "DT" || p->tag == "PRP$" || p->tag == "JJ")) k.tag = "NN"; + if (k.tag == "NN" && ends_with(l, U"er") && + (is_be(pl) || pl == U"much" || pl == U"even" || pl == U"far" || pl == U"still" || pl == U"no" || pl == U"any")) + k.tag = "JJR"; + (void) ends_clause; + } + + // pass 3: homographs the lexicon splits by part of speech + for (size_t i = 0; i < N; i++) { + Tok & k = t[i]; + if (k.closed || !word_like(k.text) || !has_alpha(k.text) || k.tag == "NNP" || k.tag == "NNPS") continue; + if (is_capitalized(k.text) && !k.sent_start) continue; + const u32 & l = k.lower; + Prior pr = homograph_prior(lex, l); + if (!pr.any) continue; + const Tok * p = P(i, 1); + const Tok * pp = P(i, 2); + const Tok * n = Nx(i, 1); + const u32 pl = p ? p->lower : u32(); + bool plural_s = ends_with(l, U"s") && !ends_with(l, U"ss"); + bool ed = ends_with(l, U"ed"); + bool ing = ends_with(l, U"ing"); + if (ed || ing) continue; // participles keep their pass-2 tags + // evidence + bool det_before = p && (p->tag == "DT" || p->tag == "PRP$" || p->tag == "POS" || p->tag == "CD" || + p->tag == "JJ" || p->tag == "JJS" || p->tag == "JJR" || p->tag == "PDT" || + (p->tag == "IN" && pl != U"that") || p->tag == "WP$" || p->tag == "``"); + bool of_after = n && n->lower == U"of"; + bool modal_before = false; + { + // MD / TO / do, possibly across adverbs: "could no longer conduct" + for (size_t b = 1; b <= 3 && b <= i; b++) { + const Tok & q = t[i - b]; + if (q.tag == "MD" || q.tag == "TO" || is_do(q.lower) || (b == 1 && q.lower == U"please")) { + modal_before = true; + break; + } + bool adv = q.tag == "RB" || q.lower == U"no" || q.lower == U"longer" || q.lower == U"not" || + q.lower == U"n't" || q.lower == U"never" || q.lower == U"also" || q.lower == U"still"; + if (!adv) break; + } + } + bool obj_before = p && (pl == U"me" || pl == U"him" || pl == U"us" || pl == U"them" || + ((pl == U"'s" || pl == U"’s") && pp && pp->lower == U"let")); + bool subj_before = p && ((p->tag == "PRP" && subject_pronoun(pl)) || p->tag == "WDT" || p->tag == "WP" || + (pl == U"that" && pp && is_noun_tag(pp->tag))); + bool np_before = false; // a singular noun phrase opened by a determiner: "the static friction" + if (p && is_noun_tag(p->tag) && p->tag != "NNS" && p->tag != "NNPS") { + size_t j = i - 1; + while (j > 0 && (t[j - 1].tag == "JJ" || t[j - 1].tag == "NN" || t[j - 1].tag == "NNP" || t[j - 1].tag == "VBN")) j--; + np_before = j > 0 && (t[j - 1].tag == "DT" || t[j - 1].tag == "PRP$" || t[j - 1].tag == "POS"); + } + bool noun_subj_before = p && (np_before || p->tag == "-RRB-" || + ((p->tag == "NNP" || p->tag == "NNPS") && !(i >= 2 && t[i - 2].tag == "IN"))); + bool clause_end_strict = !n || n->text == U"." || n->text == U"!" || n->text == U"?" || n->text == U";"; + bool imperative = k.sent_start && n && (n->tag == "DT" || n->tag == "PRP$" || (n->tag == "PRP" && n->lower != U"it" && n->lower != U"i")); + bool verb; + if (plural_s) { + bool next_ok = clause_end_strict || n->tag == "DT" || n->tag == "PRP$" || n->tag == "PRP" || n->tag == "CD" || + n->tag == "TO" || n->tag == "RB" || n->lower == U"that" || n->tag == "NNP" || n->tag == "CC" || + (n->tag == "IN" && n->lower != U"of" && (np_before || (p && p->sent_start))); + bool plural_subj = p && p->tag == "NNS" && pp && (pp->tag == "DT" || pp->tag == "PRP$") && ends_clause(n); + bool vbz_ctx = (p && p->tag == "PRP" && third_person(pl)) || (p && (p->tag == "WDT" || p->tag == "WP")) || + (p && p->tag == "RB" && pp && (is_noun_tag(pp->tag) || pp->tag == "-RRB-")) || + (p && p->tag == "CC" && n && (n->tag == "DT" || n->tag == "PRP$")) || + (p && (is_noun_tag(p->tag) && p->tag != "NNS") && n && (n->tag == "DT" || n->tag == "PRP$")) || + ((noun_subj_before || plural_subj) && !of_after && next_ok); + if (pr.noun_variant && !pr.verb_variant) verb = !det_before; // DEFAULT reads as a verb + else verb = vbz_ctx && !det_before; + k.tag = verb ? "VBZ" : "NNS"; + continue; + } + if (pr.noun_variant && !pr.verb_variant) { + // DEFAULT is the verb reading (use, close, combine, convert, ...) + bool noun_ctx = det_before || of_after || (p && (p->tag == "NN" || p->tag == "NNP")); + verb = !noun_ctx || modal_before || subj_before; + if (!verb) k.tag = "NN"; + else if (k.tag == "NN" || k.tag == "NNS") k.tag = modal_before ? "VB" : "VBP"; + continue; + } + if (pr.verb_variant && pr.noun_variant) { + // DEFAULT is the adjective (close): noun only as "the close (of)" + verb = modal_before || subj_before || imperative || obj_before; + if (verb) k.tag = (p && (p->tag == "MD" || p->tag == "TO")) ? "VB" : "VBP"; + else if (p && (p->tag == "DT" || p->tag == "PRP$") && (of_after || ends_clause(n))) k.tag = "NN"; + else k.tag = "JJ"; + continue; + } + if (pr.verb_variant) { + bool adv_subj = p && p->tag == "RB" && pp && (pp->tag == "NNS" || (pp->tag == "PRP" && subject_pronoun(pp->lower))); + verb = modal_before || subj_before || imperative || obj_before || adv_subj; + if (verb) k.tag = (modal_before || obj_before || imperative) ? "VB" : "VBP"; + else if (k.tag == "VB" || k.tag == "VBP") k.tag = "NN"; + continue; + } + if (pr.adj_variant) { + bool degree = p && (is_be(pl) || pl == U"very" || pl == U"more" || pl == U"most" || pl == U"so" || pl == U"too"); + bool before_noun = n && (n->tag == "NN" || n->tag == "NNS" || n->tag == "JJ" || n->tag == "NNP") && l != U"bass" && + !(p && (p->tag == "HYPH" || p->tag == "CD")); + if (degree || before_noun) k.tag = "JJ"; + else if (k.tag == "JJ") k.tag = "NN"; + continue; + } + if (pr.adv_variant) { + bool attributive = p && (p->tag == "DT" || p->tag == "PRP$" || p->tag == "POS"); + k.tag = (!attributive && (ends_clause(n) || (n && is_verb_tag(n->tag)))) ? "RB" : "JJ"; + continue; + } + } + + // pass 4: function words whose reading depends on the tag + for (size_t i = 0; i < N; i++) { + Tok & k = t[i]; + const Tok * p = P(i, 1); + const Tok * n = Nx(i, 1); + // look past a quote for the next word + const Tok * nw = n; + if (nw && is_quote(nw->text)) nw = Nx(i, 2); + const u32 & l = k.lower; + if (l == U"'s" || l == U"’s") { + if (p && (is_noun_tag(p->tag) || p->tag == "PRP" || p->tag == "CD")) { + bool pron = p->tag == "PRP" || p->lower == U"that" || p->lower == U"there" || p->lower == U"what" || + p->lower == U"who" || p->lower == U"here"; + bool verbish = n && (n->tag == "VBN" || n->tag == "VBG" || n->tag == "DT" || n->tag == "RB" || + n->tag == "IN" || n->tag == "TO"); + k.tag = pron || verbish ? "VBZ" : "POS"; + } + continue; + } + if (l == U"that" && !is_all_caps(k.text)) { + static const std::unordered_set time_nouns = { + U"day", U"night", U"morning", U"evening", U"afternoon", U"year", U"week", U"month", U"time", U"season", + U"summer", U"winter", U"spring", U"autumn", U"moment", U"point", U"era", U"decade", U"century", U"period"}; + // verbs and adjectives that take a "that" clause + static const std::unordered_set clause_takers = { + U"so", U"such", U"now", U"except", U"given", U"provided", U"said", U"say", U"says", U"believe", + U"believed", U"think", U"thought", U"know", U"knew", U"found", U"noted", U"stated", U"reported", + U"claimed", U"suggest", U"suggested", U"argued", U"felt", U"feel", U"show", U"showed", U"shows", + U"revealed", U"announced", U"realized", U"realised", U"decided", U"means", U"meant", U"ensure", + U"hoped", U"wrote", U"told", U"added", U"explained", U"indicated", U"concluded", U"concludes", + U"confirmed", U"insisted", U"recalled", U"discovered", U"learned", U"learnt", U"noticed", U"notices", + U"observed", U"feared", U"assumed", U"agreed", U"admitted", U"maintained", U"predicted", U"warned", + U"promised", U"proved", U"remembered", U"understood", U"determined", U"mentioned", U"recommended", + U"commented", U"estimated", U"testified", U"requested", U"demanded", U"suggests", U"states", U"notes", + U"argues", U"believes", U"claims", U"reports", U"thinks", U"knows", U"seems", U"seemed", U"denied", + U"denies", U"stressed", U"emphasized", U"emphasised", U"pleased", U"aware", U"sure", U"clear", + U"likely", U"possible", U"evident", U"apparent", U"true", U"fact", U"ruled", U"held", U"alleged"}; + const Tok * n2 = nw ? Nx(i, (size_t) (nw - n) + 2) : nullptr; + bool prep_before = p && (p->tag == "IN" || p->tag == "TO") && !clause_takers.count(p->lower); + bool dt; + if (nw && (nw->lower == U"of" || time_nouns.count(nw->lower))) { + dt = true; // "that of", "that year" + } else if (p && is_noun_tag(p->tag) && nw && (nw->lower == U"'s" || is_verb_tag(nw->tag))) { + dt = false; // relative: "a style that's", "the house that stood" + } else if (n && (n->text == U":" || n->text == U";")) { + dt = false; // "concludes that:" + } else if (n && n->text == U",") { + dt = prep_before || !(p && (p->tag == "IN" || is_verb_tag(p->tag) || p->tag == "," || p->tag == "CC" || p->tag == "JJ")); + } else if (!nw || !word_like(nw->text)) { + dt = !(n && is_quote(n->text)) && !(p && p->tag == ","); + } else if (nw->tag == "NNS" || nw->tag == "NNPS") { + dt = false; + } else if (nw->tag == "RB" && ends_clause(n2)) { + dt = true; // "say that again" + } else if (p && is_be(p->lower) && (nw->tag == "JJ" || nw->tag == "VBN" || nw->tag == "RB" || nw->tag == "NN")) { + dt = true; // "was that devastated", "is that quality" + } else if ((nw->lower == U"is" || nw->lower == U"was" || nw->lower == U"'s") && (!p || p->tag == "CC" || p->tag == ",")) { + dt = true; // "and that is" + } else if (prep_before && (nw->tag == "IN" || nw->tag == "VBN" || nw->tag == "RB")) { + dt = true; // "like that for years", "on that used by" + } else if (k.sent_start) { + dt = !(nw->tag == "PRP" || nw->tag == "DT"); + } else if (nw->tag == "PRP" || nw->tag == "DT" || nw->tag == "PRP$" || nw->tag == "EX" || nw->tag == "NNP" || + nw->tag == "MD" || is_verb_tag(nw->tag) || nw->tag == "IN" || nw->tag == "TO" || nw->tag == "RB" || + nw->tag == "CD" || nw->tag == "WRB" || nw->tag == "``" || nw->tag == "''") { + dt = nw->lower == U"'s"; + } else if (p && (is_noun_tag(p->tag) || p->tag == "," || p->tag == "JJ")) { + dt = false; + } else if (p && (p->tag == "IN" || is_verb_tag(p->tag) || p->tag == "CC" || p->tag == "TO")) { + dt = !clause_takers.count(p->lower); + } else { + dt = false; + } + k.tag = dt ? "DT" : (p && is_noun_tag(p->tag) ? "WDT" : "IN"); + } else if (l == U"in" && !is_all_caps(k.text)) { + const Tok * n2 = Nx(i, 2); + if (!nw || !word_like(nw->text)) { + bool final = !n || n->text == U"." || n->text == U"!" || n->text == U"?" || n->text == U"," || n->text == U";"; + k.tag = (final && !(p && p->tag == "CD")) ? "RP" : "IN"; // "plugged in." but "(16 in)" is inches + } else if (nw != n) { + k.tag = "IN"; // in " quoted words " + } else if (n->tag == "CC" || (n->tag == "RB" && (ends_clause(n2) || (n2 && (n2->tag == "CC" || n2->tag == "IN"))))) { + k.tag = "RB"; + } else if (n->lower == U"as" && p && is_verb_tag(p->tag)) { + k.tag = "RP"; // "sworn in as" + } else { + k.tag = "IN"; + } + } else if (l == U"by" && !is_all_caps(k.text)) { + k.tag = (n && word_like(n->text)) ? "IN" : "RB"; + } else if (k.text == U"a") { + k.tag = (nw && (word_like(nw->text) || is_currency_symbol(nw->text))) ? "DT" : "NN"; + } else if (k.text == U"A") { + bool letter = p && (p->tag == "NNP" || p->tag == "NN") && !k.sent_start && + (!n || !word_like(n->text) || !is_capitalized(n->text) || n->tag == "CC"); + if (!n || !word_like(n->text)) letter = true; + k.tag = letter ? "NNP" : "DT"; + } else if (k.text == U"I") { + // Roman numeral: "World War I", "Division I National", "the I Scouting Group" + bool roman = p && (p->tag == "NNP" || p->tag == "DT") && + (!n || !word_like(n->text) || n->tag == "CC" || n->tag == "IN" || (n->tag == "NNP" && is_capitalized(n->text))); + if (p && p->tag == "NNP" && p->sent_start && !(n && n->tag == "NNP")) roman = false; + k.tag = roman ? "NNP" : "PRP"; + } else if (l == U"used") { + const Tok * pb = p; + for (size_t b = 2; pb && pb->tag == "RB" && b <= 3; b++) pb = P(i, b); // "is commonly used" + if (n && n->lower == U"to") k.tag = (pb && is_be(pb->lower)) ? "VBN" : "VBD"; + else if (p && (is_be(p->lower) || is_have(p->lower))) k.tag = "VBN"; + else if (p && (is_noun_tag(p->tag) || p->tag == "PRP")) k.tag = "VBD"; + else k.tag = "VBN"; + } else if (l == U"read" || l == U"wound" || l == U"reread") { + const Tok * pp = P(i, 2); + if (p && (p->tag == "MD" || p->tag == "TO" || is_do(p->lower) || p->lower == U"please" || + ((p->lower == U"not" || p->lower == U"n't") && pp && (pp->tag == "MD" || is_do(pp->lower))))) + k.tag = "VB"; + else if (p && (p->lower == U"me" || p->lower == U"him" || p->lower == U"us" || p->lower == U"them" || + ((p->lower == U"'s" || p->lower == U"’s") && pp && pp->lower == U"let"))) + k.tag = "VB"; + else if (!coordinated_verb(i).empty()) k.tag = coordinated_verb(i); + else if (p && (is_have(p->lower) || is_be(p->lower))) k.tag = "VBN"; + else if (p && (p->tag == "DT" || p->tag == "PRP$" || p->tag == "JJ" || p->tag == "IN")) k.tag = "NN"; + else if (k.sent_start) k.tag = "VB"; + else k.tag = "VBD"; + } else if (l == U"there" && k.closed) { + k.tag = (n && (is_be(n->lower) || n->tag == "MD" || n->lower == U"seems" || n->lower == U"appears")) ? "EX" : "RB"; + } else if (l == U"her" && k.closed) { + k.tag = (n && word_like(n->text) && (n->tag == "NN" || n->tag == "NNS" || n->tag == "JJ" || n->tag == "NNP" || + n->tag == "VBG" || n->tag == "CD" || n->tag == "JJR" || n->tag == "JJS")) + ? "PRP$" + : "PRP"; + } + } + std::vector out; + out.reserve(N); + for (auto & k : t) out.push_back(k.tag); + return out; +} + +} // namespace misaki diff --git a/tools/misaki-g2p/src/tokenizer.cpp b/tools/misaki-g2p/src/tokenizer.cpp new file mode 100644 index 0000000000..690b55b751 --- /dev/null +++ b/tools/misaki-g2p/src/tokenizer.cpp @@ -0,0 +1,596 @@ +// SPDX-License-Identifier: Apache-2.0 +// Port of the spaCy 3.8 English tokenizer (spacy/tokenizer.pyx with the +// en prefix/suffix/infix rules, URL_MATCH and tokenizer exceptions; spaCy is +// MIT, LICENSES/spaCy-MIT.txt) plus misaki's subtokenize regex. +#include "misaki-internal.h" + +#include +#include +#include +#include +#include + +namespace misaki { +namespace { + +#include "spacy-en-rules.inc" + +struct Rules { + std::unordered_map> specials; + // specials that the affix rules would split, matched as token sequences + // afterwards (Tokenizer._special_matcher / _apply_special_cases) + std::map, u32> phrase; + size_t max_phrase = 0; +}; + +const u32 kConcatQuotes = U"'\"”“`‘´’‚,„»«「」『』()〔〕【】《》〈〉〈〉⟦⟧"; + +// LIST_PUNCT, LIST_ELLIPSES, LIST_QUOTES, LIST_CURRENCY in rule order (the +// ellipsis rule \.\.+ is handled by the matchers below). +const std::vector & list_punct() { + static const std::vector v = {U"…", U"……", U",", U":", U";", U"!", U"?", U"¿", U"؟", U"¡", + U"(", U")", U"[", U"]", U"{", U"}", U"<", U">", U"_", U"#", U"*", U"&", U"。", + U"?", U"!", U",", U"、", U";", U":", U"~", U"·", + U"।", U"،", U"۔", U"؛", U"٪"}; + return v; +} +const std::vector & list_quotes() { + static const std::vector v = {U"'", U"\"", U"”", U"“", U"`", U"‘", U"´", U"’", U"‚", + U",", U"„", U"»", U"«", U"「", U"」", U"『", U"』", + U"(", U")", U"〔", U"〕", U"【", U"】", U"《", U"》", + U"〈", U"〉", U"〈", U"〉", U"⟦", U"⟧"}; + return v; +} +const std::vector & list_currency() { + static const std::vector v = { + U"$", U"£", U"€", U"¥", U"฿", U"US$", U"C$", U"A$", U"₽", U"﷼", U"₴", + U"₠", U"₡", U"₢", U"₣", U"₤", U"₥", U"₦", U"₧", U"₨", U"₩", + U"₪", U"₫", U"€", U"₭", U"₮", U"₯", U"₰", U"₱", U"₲", U"₳", + U"₴", U"₵", U"₶", U"₷", U"₸", U"₹", U"₺", U"₻", U"₼", U"₽", + U"₾", U"₿"}; + return v; +} +const std::vector & list_units() { + static std::vector v; + static std::once_flag once; + std::call_once(once, [] { + const char * units = + "km|km²|km³|m|m²|m³|dm|dm²|dm³|cm|cm²|cm³|mm|mm²|mm³|ha|µm|nm|yd|in|ft|" + "kg|g|mg|µg|t|lb|oz|m/s|km/h|kmh|mph|hPa|Pa|mbar|mb|MB|kb|KB|gb|GB|tb|TB|T|G|M|K|%|" + "км|км²|км³|м|м²|м³|дм|дм²|" + "дм³|см|см²|см³|мм|мм²|мм³|" + "нм|кг|г|мг|м/с|км/ч|кПа|Па|" + "мбар|Кб|КБ|кб|Мб|МБ|мб|Гб|" + "ГБ|гб|Тб|ТБ|тбكم|كم²|كم³|" + "م|م²|م³|سم|سم²|سم³|مم|مم²|" + "مم³|كم|غرام|جرام|جم|كغ|" + "ملغ|كوب|اكواب"; + u32 all = U(units); + size_t a = 0; + for (size_t i = 0; i <= all.size(); i++) { + if (i == all.size() || all[i] == U'|') { + v.push_back(all.substr(a, i - a)); + a = i + 1; + } + } + }); + return v; +} + +bool is_digit09(char32_t c) { return c >= '0' && c <= '9'; } +bool is_nd(char32_t c) { return c < 0x80 ? is_digit09(c) : cat_Nd(c); } +bool is_space(char32_t c) { return py_isspace(c); } + +// Length of the prefix the English prefix rules split off, 0 if none. +size_t find_prefix(const u32 & s) { + if (s.empty()) return 0; + auto lit = [&](const u32 & p) { return starts_with(s, p) ? p.size() : 0; }; + for (const char32_t * p : {U"§", U"%", U"=", U"—", U"–"}) { + if (size_t n = lit(p)) return n; + } + if (s[0] == '+' && !(s.size() > 1 && is_digit09(s[1]))) return 1; + for (const u32 & p : list_punct()) if (size_t n = lit(p)) return n; + if (s.size() >= 2 && s[0] == '.' && s[1] == '.') { + size_t n = 2; + while (n < s.size() && s[n] == '.') n++; + return n; + } + if (s[0] == U'…') return 1; + for (const u32 & p : list_quotes()) if (size_t n = lit(p)) return n; + for (const u32 & p : list_currency()) if (size_t n = lit(p)) return n; + if (spacy_icon(s[0])) return 1; + return 0; +} + +// Does one suffix alternative match s[start:] exactly? +bool suffix_alt_at(const u32 & s, size_t start) { + const u32 tail = s.substr(start); + char32_t before = start > 0 ? s[start - 1] : 0; + for (const u32 & p : list_punct()) if (tail == p) return true; + if (tail.size() >= 2 && std::all_of(tail.begin(), tail.end(), [](char32_t c) { return c == '.'; })) return true; + if (tail == U"…") return true; + for (const u32 & p : list_quotes()) if (tail == p) return true; + if (tail.size() == 1 && spacy_icon(tail[0])) return true; + for (const char32_t * p : {U"'s", U"'S", U"’s", U"’S", U"—", U"–"}) if (tail == p) return true; + if (tail == U"+" && start > 0 && is_digit09(before)) return true; + if (tail == U"." && start >= 2 && s[start - 2] == U'°' && contains(U"FfCcKk", before)) return true; + if (start > 0 && is_digit09(before)) { + for (const u32 & p : list_currency()) if (tail == p) return true; + for (const u32 & p : list_units()) if (tail == p) return true; + } + if (tail == U"." && start > 0 && spacy_suffix_dot_pre(before)) return true; + if (tail == U"." && start >= 2 && spacy_alpha_upper(before) && spacy_alpha_upper(s[start - 2])) return true; + return false; +} + +size_t find_suffix(const u32 & s) { + // re.search semantics: the leftmost start where an alternative matches + // through the end. Every alternative is a literal of at most 6 code points + // except the dot run (\.\.+$), so only the last 8 positions and the start + // of the trailing dot run can match. + const size_t n = s.size(); + size_t dots = n; + while (dots > 0 && s[dots - 1] == '.') dots--; + size_t best = (n - dots >= 2) ? dots : n; + for (size_t start = n > 8 ? n - 8 : 0; start < best; start++) { + if (suffix_alt_at(s, start)) return n - start; + } + return n - best; +} + +// Infix matches (start, end) like re.finditer over the English infix rules. +std::vector> find_infix(const u32 & s) { + std::vector> out; + size_t p = 0; + const size_t n = s.size(); + auto alpha = [&](size_t i) { return i < n && spacy_alpha(s[i]); }; + while (p < n) { + size_t len = 0; + char32_t c = s[p]; + char32_t prev = p > 0 ? s[p - 1] : 0; + if (c == '.' && p + 1 < n && s[p + 1] == '.') { + len = 2; + while (p + len < n && s[p + len] == '.') len++; + } else if (c == U'…') { + len = 1; + } else if (spacy_icon(c)) { + len = 1; + } else if (p > 0 && is_digit09(prev) && contains(U"+-*^", c) && p + 1 < n && + (is_digit09(s[p + 1]) || s[p + 1] == '-')) { + len = 1; + } else if (c == '.' && p > 0 && (spacy_alpha_lower(prev) || contains(kConcatQuotes, prev)) && p + 1 < n && + (spacy_alpha_upper(s[p + 1]) || contains(kConcatQuotes, s[p + 1]))) { + len = 1; + } else if (c == ',' && p > 0 && spacy_alpha(prev) && alpha(p + 1)) { + len = 1; + } else if (p > 0 && (spacy_alpha(prev) || is_digit09(prev))) { + // (?:-|–|—|--|---|——|~)(?=[ALPHA]) tried in this order + for (const char32_t * h : {U"-", U"–", U"—", U"--", U"---", U"——", U"~"}) { + u32 hs(h); + if (s.compare(p, hs.size(), hs) == 0 && alpha(p + hs.size())) { + len = hs.size(); + break; + } + } + if (!len && contains(U":<>=/", c) && alpha(p + 1)) len = 1; + } + if (len) { + out.emplace_back(p, p + len); + p += len; + } else { + p++; + } + } + return out; +} + +// --- URL_MATCH (spacy/lang/tokenizer_exceptions.py), hand-compiled +bool url_word_char(char32_t c) { return c == '_' || py_isalpha(c) || py_digit_value(c) >= 0 || cat_L(c) || cat_Nd(c); } +bool url_label_edge(char32_t c) { return (c < 0x80 && (std::isalnum((int) c) != 0)) || (c >= 0xA1 && c <= 0xFFFF); } +bool url_label_mid(char32_t c) { return url_label_edge(c) || c == '_' || c == '-'; } + +bool url_tail(const u32 & s, size_t p) { + // (?::\d{2,5})?(?:[/?#]\S*)?$ + size_t n = s.size(); + auto path_ok = [&](size_t q) { + if (q == n) return true; + if (!contains(U"/?#", s[q])) return false; + for (size_t i = q + 1; i < n; i++) if (is_space(s[i])) return false; + return true; + }; + if (path_ok(p)) return true; + if (p < n && s[p] == ':') { + size_t q = p + 1, d = 0; + while (q < n && is_nd(s[q]) && d < 5) { q++; d++; } + // \d{2,5} is greedy but may back off; try each length + for (size_t k = d; k >= 2; k--) { + if (path_ok(p + 1 + k)) return true; + } + } + return false; +} + +bool url_host(const u32 & s, size_t p) { + size_t n = s.size(); + // IPv4 public address + { + size_t q = p; + int oct[4]; + int k = 0; + for (; k < 4; k++) { + size_t a = q; + while (q < n && is_digit09(s[q]) && q - a < 3) q++; + if (q == a) break; + oct[k] = std::stoi(to_utf8(s.substr(a, q - a))); + if (k < 3) { + if (q < n && s[q] == '.') q++; + else break; + } + } + if (k == 4) { + bool ok = oct[0] >= 1 && oct[0] <= 223 && oct[0] != 10 && oct[0] != 127 && + !(oct[0] == 169 && oct[1] == 254) && !(oct[0] == 192 && oct[1] == 168) && + !(oct[0] == 172 && oct[1] >= 16 && oct[1] <= 31) && oct[1] <= 255 && oct[2] <= 255 && + oct[3] >= 1 && oct[3] <= 254; + if (ok && url_tail(s, q)) return true; + } + } + // (label .)+ tld + size_t q = p; + while (true) { + size_t dot = s.find('.', q); + if (dot == u32::npos) return false; + size_t len = dot - q; + if (len < 1 || len > 64 || !url_label_edge(s[q]) || !url_label_edge(s[dot - 1])) return false; + for (size_t i = q + 1; i + 1 < dot; i++) if (!url_label_mid(s[i])) return false; + q = dot + 1; + size_t t = q; + while (t < n && spacy_alpha_lower(s[t]) && t - q < 63) t++; + for (size_t e = t; e >= q + 2; e--) { + if (url_tail(s, e)) return true; + } + } +} + +bool url_match(const u32 & s) { + size_t n = s.size(); + if (n > 2048) return false; // keeps the '@' scan bounded + // scheme + std::vector starts; + { + size_t sep = s.find(U"://"); + if (sep != u32::npos && sep >= 2) { + bool ok = true; + for (size_t i = 0; i < sep; i++) { + if (!(url_word_char(s[i]) || s[i] == '+' || s[i] == '-' || s[i] == '.')) { ok = false; break; } + } + if (ok) starts.push_back(sep + 3); + } + starts.push_back(0); + } + for (size_t st : starts) { + // userinfo: \S+(?::\S*)?@ -- any '@' after at least one non-space char + std::vector hosts; + for (size_t i = n; i-- > st + 1;) { + if (s[i] == '@') { + bool ok = true; + for (size_t k = st; k < i; k++) if (is_space(s[k])) { ok = false; break; } + if (ok) hosts.push_back(i + 1); + } + } + hosts.push_back(st); + for (size_t h : hosts) if (url_host(s, h)) return true; + } + return false; +} + +const Rules & rules(); + +struct Piece { + u32 text; + bool space = false; +}; + +void split_affixes(const Rules & r, u32 & s, std::vector & prefixes, std::vector & suffixes, bool specials) { + size_t last = 0; + while (!s.empty() && s.size() != last) { + if (specials && r.specials.count(s)) break; + last = s.size(); + size_t pre = find_prefix(s); + u32 prefix, minus_pre; + if (pre) { + prefix = s.substr(0, pre); + minus_pre = s.substr(pre); + if (!minus_pre.empty() && specials && r.specials.count(minus_pre)) { + s = minus_pre; + prefixes.push_back(prefix); + break; + } + } + size_t suf = find_suffix(s.substr(pre)); + u32 suffix, minus_suf; + if (suf) { + suffix = s.substr(s.size() - suf); + minus_suf = s.substr(0, s.size() - suf); + if (!minus_suf.empty() && specials && r.specials.count(minus_suf)) { + s = minus_suf; + suffixes.push_back(suffix); + break; + } + } + if (pre && suf && pre + suf <= s.size()) { + s = s.substr(pre, s.size() - pre - suf); + prefixes.push_back(prefix); + suffixes.push_back(suffix); + } else if (pre) { + s = minus_pre; + prefixes.push_back(prefix); + } else if (suf) { + s = minus_suf; + suffixes.push_back(suffix); + } + } +} + +void tokenize_span(const Rules & r, const u32 & span, std::vector & out, bool specials) { + if (specials) { + auto it = r.specials.find(span); + if (it != r.specials.end()) { + for (const u32 & t : it->second) out.push_back({t, false}); + return; + } + } + u32 s = span; + std::vector prefixes, suffixes; + split_affixes(r, s, prefixes, suffixes, specials); + for (const u32 & p : prefixes) out.push_back({p, false}); + if (!s.empty()) { + auto it = specials ? r.specials.find(s) : r.specials.end(); + if (it != r.specials.end()) { + for (const u32 & t : it->second) out.push_back({t, false}); + } else if (url_match(s)) { + out.push_back({s, false}); + } else { + auto matches = find_infix(s); + if (matches.empty()) { + out.push_back({s, false}); + } else { + size_t start = 0; + const size_t start_before = 0; + for (auto & m : matches) { + if (m.first == start_before) continue; + if (m.first != start) out.push_back({s.substr(start, m.first - start), false}); + if (m.first != m.second) out.push_back({s.substr(m.first, m.second - m.first), false}); + start = m.second; + } + if (start < s.size()) out.push_back({s.substr(start), false}); + } + } + } + for (auto it = suffixes.rbegin(); it != suffixes.rend(); ++it) out.push_back({*it, false}); +} + +std::vector tokenize_affixes(const Rules & r, const u32 & text, bool specials) { + std::vector doc; + if (text.empty()) return doc; + bool in_ws = is_space(text[0]); + size_t start = 0; + for (size_t i = 0; i < text.size(); i++) { + char32_t uc = text[i]; + if (is_space(uc) != in_ws) { + if (start < i) tokenize_span(r, text.substr(start, i - start), doc, specials); + if (uc == ' ') { + if (!doc.empty()) doc.back().space = true; + start = i + 1; + } else { + start = i; + } + in_ws = !in_ws; + } + } + if (start < text.size()) { + tokenize_span(r, text.substr(start), doc, specials); + if (!doc.empty()) doc.back().space = text.back() == ' ' && !in_ws; + } + return doc; +} + +const Rules & rules() { + static Rules r; + static std::once_flag once; + std::call_once(once, [] { + for (const char * e : kSpacyRules) { + u32 all = U(e); + std::vector parts; + size_t a = 0; + for (size_t i = 0; i <= all.size(); i++) { + if (i == all.size() || all[i] == 0x1F) { + parts.push_back(all.substr(a, i - a)); + a = i + 1; + } + } + u32 key = parts[0]; + parts.erase(parts.begin()); + r.specials[key] = parts; + } + // Tokenizer.add_special_case: with faster_heuristics, a special is + // also matched as a token sequence when affix rules would split it. + for (auto & kv : r.specials) { + const u32 & k = kv.first; + if (find_prefix(k) || !find_infix(k).empty() || find_suffix(k) || contains(k, U' ')) { + std::vector pieces = tokenize_affixes(r, k, false); + std::vector key; + for (auto & p : pieces) key.push_back(p.text); + if (key.empty()) continue; + r.max_phrase = std::max(r.max_phrase, key.size()); + r.phrase[key] = k; + } + } + }); + return r; +} + +// Tokenizer._apply_special_cases +void apply_special_cases(const Rules & r, std::vector & doc) { + struct Match { size_t start, end; u32 key; }; + std::vector matches; + for (size_t i = 0; i < doc.size(); i++) { + std::vector seq; + for (size_t j = i; j < doc.size() && j - i < r.max_phrase; j++) { + seq.push_back(doc[j].text); + auto it = r.phrase.find(seq); + if (it != r.phrase.end()) matches.push_back({i, j + 1, it->second}); + } + } + if (matches.empty()) return; + // _filter_special_spans: longest first (then later start first) + std::sort(matches.begin(), matches.end(), [](const Match & a, const Match & b) { + size_t la = a.end - a.start, lb = b.end - b.start; + return la != lb ? la < lb : a.start < b.start; + }); + std::set seen; + std::vector kept; + for (size_t k = matches.size(); k-- > 0;) { + const Match & m = matches[k]; + if (!seen.count(m.start) && !seen.count(m.end - 1)) kept.push_back(m); + for (size_t t = m.start; t < m.end; t++) seen.insert(t); + } + std::sort(kept.begin(), kept.end(), [](const Match & a, const Match & b) { return a.start < b.start; }); + std::vector out; + size_t i = 0, k = 0; + while (i < doc.size()) { + if (k < kept.size() && kept[k].start == i) { + const Match & m = kept[k++]; + // _retokenize_special_spans looks the span text up again, spaces + // included, so a match across whitespace changes nothing + u32 span_text; + for (size_t q = m.start; q < m.end; q++) { + span_text += doc[q].text; + if (q + 1 < m.end && doc[q].space) span_text += U' '; + } + auto it = r.specials.find(span_text); + if (it == r.specials.end()) { + for (size_t q = m.start; q < m.end; q++) out.push_back(doc[q]); + i = m.end; + continue; + } + bool final_space = doc[m.end - 1].space; + for (const u32 & t : it->second) out.push_back({t, false}); + out.back().space = final_space; + i = m.end; + } else { + out.push_back(doc[i++]); + } + } + doc.swap(out); +} + +} // namespace + +std::vector spacy_tokenize(const u32 & text) { + const Rules & r = rules(); + std::vector doc = tokenize_affixes(r, text, true); + apply_special_cases(r, doc); + std::vector out; + size_t pos = 0; + for (auto & p : doc) { + SpacyToken t; + t.text = p.text; + t.space_after = p.space; + t.start = pos; + pos += p.text.size() + (p.space ? 1 : 0); + out.push_back(std::move(t)); + } + return out; +} + +// misaki SUBTOKEN_REGEX: +// ^['‘’]+ | \p{Lu}(?=\p{Lu}\p{Ll}) | (?:^-)?(?:\d?[,.]?\d)+ | [-_]+ | ['‘’]{2,} +// | \p{L}*?(?:['‘’]\p{L})*?\p{Ll}(?=\p{Lu}) | \p{L}+(?:['‘’]\p{L})* | [^-_\p{L}'‘’\d] | ['‘’]+$ +std::vector subtokenize(const u32 & w) { + std::vector out; + const size_t n = w.size(); + auto q = [&](size_t i) { return i < n && (w[i] == '\'' || w[i] == U'‘' || w[i] == U'’'); }; + auto L = [&](size_t i) { return i < n && cat_L(w[i]); }; + auto Lu = [&](size_t i) { return i < n && cat_Lu(w[i]); }; + auto Ll = [&](size_t i) { return i < n && cat_Ll(w[i]); }; + auto D = [&](size_t i) { return i < n && is_nd(w[i]); }; + auto sep = [&](size_t i) { return i < n && (w[i] == ',' || w[i] == '.'); }; + size_t p = 0; + while (p < n) { + size_t len = 0; + // 1. ^['‘’]+ + if (p == 0 && q(0)) { + while (q(len)) len++; + } + // 2. \p{Lu}(?=\p{Lu}\p{Ll}) + if (!len && Lu(p) && Lu(p + 1) && Ll(p + 2)) len = 1; + // 3. (?:^-)?(?:\d?[,.]?\d)+ + if (!len) { + size_t s = p; + if (p == 0 && w[0] == '-') s = 1; + size_t e = s; + while (true) { + size_t t = e; + // try \d [,.] \d, \d \d, [,.] \d, \d in regex priority order + if (D(t) && sep(t + 1) && D(t + 2)) t += 3; + else if (D(t) && D(t + 1)) t += 2; + else if (D(t)) t += 1; // \d? consumed, [,.]? absent, then \d needed: handled by D(t+1) above + else if (sep(t) && D(t + 1)) t += 2; + else break; + // A lone digit only matches as "\d?" absent + "\d" present. + e = t; + } + if (e > s) len = e - p; + } + // 4. [-_]+ + if (!len && (w[p] == '-' || w[p] == '_')) { + while (p + len < n && (w[p + len] == '-' || w[p + len] == '_')) len++; + } + // 5. ['‘’]{2,} + if (!len && q(p) && q(p + 1)) { + while (q(p + len)) len++; + } + // 6. \p{L}*?(?:['‘’]\p{L})*?\p{Ll}(?=\p{Lu}) (lazy: shortest first) + if (!len) { + // bounded at 64 letters / apostrophe pairs so pathological input + // stays linear; natural words never come close + for (size_t a = 0; !len && a < 64 && (a == 0 || L(p + a - 1)); a++) { + size_t s = p + a; + for (size_t b = 0; b < 64; b++) { + size_t t = s + 2 * b; + if (b > 0 && !(q(t - 2) && L(t - 1))) break; + if (Ll(t) && Lu(t + 1)) { + len = t + 1 - p; + break; + } + } + if (p + a >= n) break; + } + } + // 7. \p{L}+(?:['‘’]\p{L})* + if (!len && L(p)) { + size_t t = p; + while (L(t)) t++; + while (q(t) && L(t + 1)) t += 2; + len = t - p; + } + // 8. [^-_\p{L}'‘’\d] + if (!len && !(w[p] == '-' || w[p] == '_' || L(p) || q(p) || D(p))) len = 1; + // 9. ['‘’]+$ + if (!len && q(p)) { + size_t t = p; + while (q(t)) t++; + if (t == n) len = t - p; + } + if (len) { + out.push_back(w.substr(p, len)); + p += len; + } else { + p++; + } + } + return out; +} + +} // namespace misaki diff --git a/tools/misaki-g2p/src/unicode-tables.inc b/tools/misaki-g2p/src/unicode-tables.inc new file mode 100644 index 0000000000..c7cd59f2a7 --- /dev/null +++ b/tools/misaki-g2p/src/unicode-tables.inc @@ -0,0 +1,6950 @@ +// Generated by scripts/gen_tables.py from Python 3.12.11 (Unicode 15.0.0), regex 2026.9.29 and +// spaCy 3.8.16 char_classes. Do not edit. + +static const CpRange kPyAlpha[] = { + {0x41, 0x5A}, {0x61, 0x7A}, {0xAA, 0xAA}, {0xB5, 0xB5}, {0xBA, 0xBA}, {0xC0, 0xD6}, + {0xD8, 0xF6}, {0xF8, 0x2C1}, {0x2C6, 0x2D1}, {0x2E0, 0x2E4}, {0x2EC, 0x2EC}, {0x2EE, 0x2EE}, + {0x370, 0x374}, {0x376, 0x377}, {0x37A, 0x37D}, {0x37F, 0x37F}, {0x386, 0x386}, {0x388, 0x38A}, + {0x38C, 0x38C}, {0x38E, 0x3A1}, {0x3A3, 0x3F5}, {0x3F7, 0x481}, {0x48A, 0x52F}, {0x531, 0x556}, + {0x559, 0x559}, {0x560, 0x588}, {0x5D0, 0x5EA}, {0x5EF, 0x5F2}, {0x620, 0x64A}, {0x66E, 0x66F}, + {0x671, 0x6D3}, {0x6D5, 0x6D5}, {0x6E5, 0x6E6}, {0x6EE, 0x6EF}, {0x6FA, 0x6FC}, {0x6FF, 0x6FF}, + {0x710, 0x710}, {0x712, 0x72F}, {0x74D, 0x7A5}, {0x7B1, 0x7B1}, {0x7CA, 0x7EA}, {0x7F4, 0x7F5}, + {0x7FA, 0x7FA}, {0x800, 0x815}, {0x81A, 0x81A}, {0x824, 0x824}, {0x828, 0x828}, {0x840, 0x858}, + {0x860, 0x86A}, {0x870, 0x887}, {0x889, 0x88E}, {0x8A0, 0x8C9}, {0x904, 0x939}, {0x93D, 0x93D}, + {0x950, 0x950}, {0x958, 0x961}, {0x971, 0x980}, {0x985, 0x98C}, {0x98F, 0x990}, {0x993, 0x9A8}, + {0x9AA, 0x9B0}, {0x9B2, 0x9B2}, {0x9B6, 0x9B9}, {0x9BD, 0x9BD}, {0x9CE, 0x9CE}, {0x9DC, 0x9DD}, + {0x9DF, 0x9E1}, {0x9F0, 0x9F1}, {0x9FC, 0x9FC}, {0xA05, 0xA0A}, {0xA0F, 0xA10}, {0xA13, 0xA28}, + {0xA2A, 0xA30}, {0xA32, 0xA33}, {0xA35, 0xA36}, {0xA38, 0xA39}, {0xA59, 0xA5C}, {0xA5E, 0xA5E}, + {0xA72, 0xA74}, {0xA85, 0xA8D}, {0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB2, 0xAB3}, + {0xAB5, 0xAB9}, {0xABD, 0xABD}, {0xAD0, 0xAD0}, {0xAE0, 0xAE1}, {0xAF9, 0xAF9}, {0xB05, 0xB0C}, + {0xB0F, 0xB10}, {0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB32, 0xB33}, {0xB35, 0xB39}, {0xB3D, 0xB3D}, + {0xB5C, 0xB5D}, {0xB5F, 0xB61}, {0xB71, 0xB71}, {0xB83, 0xB83}, {0xB85, 0xB8A}, {0xB8E, 0xB90}, + {0xB92, 0xB95}, {0xB99, 0xB9A}, {0xB9C, 0xB9C}, {0xB9E, 0xB9F}, {0xBA3, 0xBA4}, {0xBA8, 0xBAA}, + {0xBAE, 0xBB9}, {0xBD0, 0xBD0}, {0xC05, 0xC0C}, {0xC0E, 0xC10}, {0xC12, 0xC28}, {0xC2A, 0xC39}, + {0xC3D, 0xC3D}, {0xC58, 0xC5A}, {0xC5D, 0xC5D}, {0xC60, 0xC61}, {0xC80, 0xC80}, {0xC85, 0xC8C}, + {0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3}, {0xCB5, 0xCB9}, {0xCBD, 0xCBD}, {0xCDD, 0xCDE}, + {0xCE0, 0xCE1}, {0xCF1, 0xCF2}, {0xD04, 0xD0C}, {0xD0E, 0xD10}, {0xD12, 0xD3A}, {0xD3D, 0xD3D}, + {0xD4E, 0xD4E}, {0xD54, 0xD56}, {0xD5F, 0xD61}, {0xD7A, 0xD7F}, {0xD85, 0xD96}, {0xD9A, 0xDB1}, + {0xDB3, 0xDBB}, {0xDBD, 0xDBD}, {0xDC0, 0xDC6}, {0xE01, 0xE30}, {0xE32, 0xE33}, {0xE40, 0xE46}, + {0xE81, 0xE82}, {0xE84, 0xE84}, {0xE86, 0xE8A}, {0xE8C, 0xEA3}, {0xEA5, 0xEA5}, {0xEA7, 0xEB0}, + {0xEB2, 0xEB3}, {0xEBD, 0xEBD}, {0xEC0, 0xEC4}, {0xEC6, 0xEC6}, {0xEDC, 0xEDF}, {0xF00, 0xF00}, + {0xF40, 0xF47}, {0xF49, 0xF6C}, {0xF88, 0xF8C}, {0x1000, 0x102A}, {0x103F, 0x103F}, {0x1050, 0x1055}, + {0x105A, 0x105D}, {0x1061, 0x1061}, {0x1065, 0x1066}, {0x106E, 0x1070}, {0x1075, 0x1081}, {0x108E, 0x108E}, + {0x10A0, 0x10C5}, {0x10C7, 0x10C7}, {0x10CD, 0x10CD}, {0x10D0, 0x10FA}, {0x10FC, 0x1248}, {0x124A, 0x124D}, + {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, {0x1290, 0x12B0}, + {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6}, {0x12D8, 0x1310}, + {0x1312, 0x1315}, {0x1318, 0x135A}, {0x1380, 0x138F}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1401, 0x166C}, + {0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8}, {0x1700, 0x1711}, {0x171F, 0x1731}, + {0x1740, 0x1751}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, {0x17D7, 0x17D7}, {0x17DC, 0x17DC}, + {0x1820, 0x1878}, {0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18AA, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, + {0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x1A00, 0x1A16}, {0x1A20, 0x1A54}, + {0x1AA7, 0x1AA7}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4C}, {0x1B83, 0x1BA0}, {0x1BAE, 0x1BAF}, {0x1BBA, 0x1BE5}, + {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F}, {0x1C5A, 0x1C7D}, {0x1C80, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF}, + {0x1CE9, 0x1CEC}, {0x1CEE, 0x1CF3}, {0x1CF5, 0x1CF6}, {0x1CFA, 0x1CFA}, {0x1D00, 0x1DBF}, {0x1E00, 0x1F15}, + {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, + {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FBC}, {0x1FBE, 0x1FBE}, {0x1FC2, 0x1FC4}, + {0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, + {0x2071, 0x2071}, {0x207F, 0x207F}, {0x2090, 0x209C}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210A, 0x2113}, + {0x2115, 0x2115}, {0x2119, 0x211D}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212A, 0x212D}, + {0x212F, 0x2139}, {0x213C, 0x213F}, {0x2145, 0x2149}, {0x214E, 0x214E}, {0x2183, 0x2184}, {0x2C00, 0x2CE4}, + {0x2CEB, 0x2CEE}, {0x2CF2, 0x2CF3}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, + {0x2D6F, 0x2D6F}, {0x2D80, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, + {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2E2F, 0x2E2F}, {0x3005, 0x3006}, + {0x3031, 0x3035}, {0x303B, 0x303C}, {0x3041, 0x3096}, {0x309D, 0x309F}, {0x30A1, 0x30FA}, {0x30FC, 0x30FF}, + {0x3105, 0x312F}, {0x3131, 0x318E}, {0x31A0, 0x31BF}, {0x31F0, 0x31FF}, {0x3400, 0x4DBF}, {0x4E00, 0xA48C}, + {0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F}, {0xA62A, 0xA62B}, {0xA640, 0xA66E}, {0xA67F, 0xA69D}, + {0xA6A0, 0xA6E5}, {0xA717, 0xA71F}, {0xA722, 0xA788}, {0xA78B, 0xA7CA}, {0xA7D0, 0xA7D1}, {0xA7D3, 0xA7D3}, + {0xA7D5, 0xA7D9}, {0xA7F2, 0xA801}, {0xA803, 0xA805}, {0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873}, + {0xA882, 0xA8B3}, {0xA8F2, 0xA8F7}, {0xA8FB, 0xA8FB}, {0xA8FD, 0xA8FE}, {0xA90A, 0xA925}, {0xA930, 0xA946}, + {0xA960, 0xA97C}, {0xA984, 0xA9B2}, {0xA9CF, 0xA9CF}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF}, {0xA9FA, 0xA9FE}, + {0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B}, {0xAA60, 0xAA76}, {0xAA7A, 0xAA7A}, {0xAA7E, 0xAAAF}, + {0xAAB1, 0xAAB1}, {0xAAB5, 0xAAB6}, {0xAAB9, 0xAABD}, {0xAAC0, 0xAAC0}, {0xAAC2, 0xAAC2}, {0xAADB, 0xAADD}, + {0xAAE0, 0xAAEA}, {0xAAF2, 0xAAF4}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, + {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A}, {0xAB5C, 0xAB69}, {0xAB70, 0xABE2}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, + {0xD7CB, 0xD7FB}, {0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB1D}, + {0xFB1F, 0xFB28}, {0xFB2A, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, {0xFB43, 0xFB44}, + {0xFB46, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE70, 0xFE74}, + {0xFE76, 0xFEFC}, {0xFF21, 0xFF3A}, {0xFF41, 0xFF5A}, {0xFF66, 0xFFBE}, {0xFFC2, 0xFFC7}, {0xFFCA, 0xFFCF}, + {0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}, {0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, + {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x10300, 0x1031F}, + {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, + {0x10400, 0x1049D}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10570, 0x1057A}, + {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10594, 0x10595}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, + {0x105BB, 0x105BC}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10780, 0x10785}, {0x10787, 0x107B0}, + {0x107B2, 0x107BA}, {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C}, + {0x1083F, 0x10855}, {0x10860, 0x10876}, {0x10880, 0x1089E}, {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x10900, 0x10915}, + {0x10920, 0x10939}, {0x10980, 0x109B7}, {0x109BE, 0x109BF}, {0x10A00, 0x10A00}, {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, + {0x10A19, 0x10A35}, {0x10A60, 0x10A7C}, {0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4}, {0x10B00, 0x10B35}, + {0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91}, {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, + {0x10D00, 0x10D23}, {0x10E80, 0x10EA9}, {0x10EB0, 0x10EB1}, {0x10F00, 0x10F1C}, {0x10F27, 0x10F27}, {0x10F30, 0x10F45}, + {0x10F70, 0x10F81}, {0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6}, {0x11003, 0x11037}, {0x11071, 0x11072}, {0x11075, 0x11075}, + {0x11083, 0x110AF}, {0x110D0, 0x110E8}, {0x11103, 0x11126}, {0x11144, 0x11144}, {0x11147, 0x11147}, {0x11150, 0x11172}, + {0x11176, 0x11176}, {0x11183, 0x111B2}, {0x111C1, 0x111C4}, {0x111DA, 0x111DA}, {0x111DC, 0x111DC}, {0x11200, 0x11211}, + {0x11213, 0x1122B}, {0x1123F, 0x11240}, {0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, + {0x1129F, 0x112A8}, {0x112B0, 0x112DE}, {0x11305, 0x1130C}, {0x1130F, 0x11310}, {0x11313, 0x11328}, {0x1132A, 0x11330}, + {0x11332, 0x11333}, {0x11335, 0x11339}, {0x1133D, 0x1133D}, {0x11350, 0x11350}, {0x1135D, 0x11361}, {0x11400, 0x11434}, + {0x11447, 0x1144A}, {0x1145F, 0x11461}, {0x11480, 0x114AF}, {0x114C4, 0x114C5}, {0x114C7, 0x114C7}, {0x11580, 0x115AE}, + {0x115D8, 0x115DB}, {0x11600, 0x1162F}, {0x11644, 0x11644}, {0x11680, 0x116AA}, {0x116B8, 0x116B8}, {0x11700, 0x1171A}, + {0x11740, 0x11746}, {0x11800, 0x1182B}, {0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x11909, 0x11909}, {0x1190C, 0x11913}, + {0x11915, 0x11916}, {0x11918, 0x1192F}, {0x1193F, 0x1193F}, {0x11941, 0x11941}, {0x119A0, 0x119A7}, {0x119AA, 0x119D0}, + {0x119E1, 0x119E1}, {0x119E3, 0x119E3}, {0x11A00, 0x11A00}, {0x11A0B, 0x11A32}, {0x11A3A, 0x11A3A}, {0x11A50, 0x11A50}, + {0x11A5C, 0x11A89}, {0x11A9D, 0x11A9D}, {0x11AB0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C40, 0x11C40}, + {0x11C72, 0x11C8F}, {0x11D00, 0x11D06}, {0x11D08, 0x11D09}, {0x11D0B, 0x11D30}, {0x11D46, 0x11D46}, {0x11D60, 0x11D65}, + {0x11D67, 0x11D68}, {0x11D6A, 0x11D89}, {0x11D98, 0x11D98}, {0x11EE0, 0x11EF2}, {0x11F02, 0x11F02}, {0x11F04, 0x11F10}, + {0x11F12, 0x11F33}, {0x11FB0, 0x11FB0}, {0x12000, 0x12399}, {0x12480, 0x12543}, {0x12F90, 0x12FF0}, {0x13000, 0x1342F}, + {0x13441, 0x13446}, {0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A70, 0x16ABE}, {0x16AD0, 0x16AED}, + {0x16B00, 0x16B2F}, {0x16B40, 0x16B43}, {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A}, + {0x16F50, 0x16F50}, {0x16F93, 0x16F9F}, {0x16FE0, 0x16FE1}, {0x16FE3, 0x16FE3}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, + {0x18D00, 0x18D08}, {0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1AFFD, 0x1AFFE}, {0x1B000, 0x1B122}, {0x1B132, 0x1B132}, + {0x1B150, 0x1B152}, {0x1B155, 0x1B155}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, + {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, + {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, + {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, + {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA}, + {0x1D6FC, 0x1D714}, {0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D7A8}, + {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB}, {0x1DF00, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E030, 0x1E06D}, {0x1E100, 0x1E12C}, + {0x1E137, 0x1E13D}, {0x1E14E, 0x1E14E}, {0x1E290, 0x1E2AD}, {0x1E2C0, 0x1E2EB}, {0x1E4D0, 0x1E4EB}, {0x1E7E0, 0x1E7E6}, + {0x1E7E8, 0x1E7EB}, {0x1E7ED, 0x1E7EE}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4}, {0x1E900, 0x1E943}, {0x1E94B, 0x1E94B}, + {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, {0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32}, + {0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, {0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, + {0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, {0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, + {0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, {0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, + {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, + {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DF}, {0x2A700, 0x2B739}, {0x2B740, 0x2B81D}, + {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0x31350, 0x323AF}, +}; + +static const CpRange kPySpace[] = { + {0x9, 0xD}, {0x1C, 0x20}, {0x85, 0x85}, {0xA0, 0xA0}, {0x1680, 0x1680}, {0x2000, 0x200A}, + {0x2028, 0x2029}, {0x202F, 0x202F}, {0x205F, 0x205F}, {0x3000, 0x3000}, +}; + +static const CpDigit kPyDigit[] = { + {0x30, 0}, {0x31, 1}, {0x32, 2}, {0x33, 3}, {0x34, 4}, {0x35, 5}, {0x36, 6}, {0x37, 7}, + {0x38, 8}, {0x39, 9}, {0xB2, 2}, {0xB3, 3}, {0xB9, 1}, {0x660, 0}, {0x661, 1}, {0x662, 2}, + {0x663, 3}, {0x664, 4}, {0x665, 5}, {0x666, 6}, {0x667, 7}, {0x668, 8}, {0x669, 9}, {0x6F0, 0}, + {0x6F1, 1}, {0x6F2, 2}, {0x6F3, 3}, {0x6F4, 4}, {0x6F5, 5}, {0x6F6, 6}, {0x6F7, 7}, {0x6F8, 8}, + {0x6F9, 9}, {0x7C0, 0}, {0x7C1, 1}, {0x7C2, 2}, {0x7C3, 3}, {0x7C4, 4}, {0x7C5, 5}, {0x7C6, 6}, + {0x7C7, 7}, {0x7C8, 8}, {0x7C9, 9}, {0x966, 0}, {0x967, 1}, {0x968, 2}, {0x969, 3}, {0x96A, 4}, + {0x96B, 5}, {0x96C, 6}, {0x96D, 7}, {0x96E, 8}, {0x96F, 9}, {0x9E6, 0}, {0x9E7, 1}, {0x9E8, 2}, + {0x9E9, 3}, {0x9EA, 4}, {0x9EB, 5}, {0x9EC, 6}, {0x9ED, 7}, {0x9EE, 8}, {0x9EF, 9}, {0xA66, 0}, + {0xA67, 1}, {0xA68, 2}, {0xA69, 3}, {0xA6A, 4}, {0xA6B, 5}, {0xA6C, 6}, {0xA6D, 7}, {0xA6E, 8}, + {0xA6F, 9}, {0xAE6, 0}, {0xAE7, 1}, {0xAE8, 2}, {0xAE9, 3}, {0xAEA, 4}, {0xAEB, 5}, {0xAEC, 6}, + {0xAED, 7}, {0xAEE, 8}, {0xAEF, 9}, {0xB66, 0}, {0xB67, 1}, {0xB68, 2}, {0xB69, 3}, {0xB6A, 4}, + {0xB6B, 5}, {0xB6C, 6}, {0xB6D, 7}, {0xB6E, 8}, {0xB6F, 9}, {0xBE6, 0}, {0xBE7, 1}, {0xBE8, 2}, + {0xBE9, 3}, {0xBEA, 4}, {0xBEB, 5}, {0xBEC, 6}, {0xBED, 7}, {0xBEE, 8}, {0xBEF, 9}, {0xC66, 0}, + {0xC67, 1}, {0xC68, 2}, {0xC69, 3}, {0xC6A, 4}, {0xC6B, 5}, {0xC6C, 6}, {0xC6D, 7}, {0xC6E, 8}, + {0xC6F, 9}, {0xCE6, 0}, {0xCE7, 1}, {0xCE8, 2}, {0xCE9, 3}, {0xCEA, 4}, {0xCEB, 5}, {0xCEC, 6}, + {0xCED, 7}, {0xCEE, 8}, {0xCEF, 9}, {0xD66, 0}, {0xD67, 1}, {0xD68, 2}, {0xD69, 3}, {0xD6A, 4}, + {0xD6B, 5}, {0xD6C, 6}, {0xD6D, 7}, {0xD6E, 8}, {0xD6F, 9}, {0xDE6, 0}, {0xDE7, 1}, {0xDE8, 2}, + {0xDE9, 3}, {0xDEA, 4}, {0xDEB, 5}, {0xDEC, 6}, {0xDED, 7}, {0xDEE, 8}, {0xDEF, 9}, {0xE50, 0}, + {0xE51, 1}, {0xE52, 2}, {0xE53, 3}, {0xE54, 4}, {0xE55, 5}, {0xE56, 6}, {0xE57, 7}, {0xE58, 8}, + {0xE59, 9}, {0xED0, 0}, {0xED1, 1}, {0xED2, 2}, {0xED3, 3}, {0xED4, 4}, {0xED5, 5}, {0xED6, 6}, + {0xED7, 7}, {0xED8, 8}, {0xED9, 9}, {0xF20, 0}, {0xF21, 1}, {0xF22, 2}, {0xF23, 3}, {0xF24, 4}, + {0xF25, 5}, {0xF26, 6}, {0xF27, 7}, {0xF28, 8}, {0xF29, 9}, {0x1040, 0}, {0x1041, 1}, {0x1042, 2}, + {0x1043, 3}, {0x1044, 4}, {0x1045, 5}, {0x1046, 6}, {0x1047, 7}, {0x1048, 8}, {0x1049, 9}, {0x1090, 0}, + {0x1091, 1}, {0x1092, 2}, {0x1093, 3}, {0x1094, 4}, {0x1095, 5}, {0x1096, 6}, {0x1097, 7}, {0x1098, 8}, + {0x1099, 9}, {0x1369, 1}, {0x136A, 2}, {0x136B, 3}, {0x136C, 4}, {0x136D, 5}, {0x136E, 6}, {0x136F, 7}, + {0x1370, 8}, {0x1371, 9}, {0x17E0, 0}, {0x17E1, 1}, {0x17E2, 2}, {0x17E3, 3}, {0x17E4, 4}, {0x17E5, 5}, + {0x17E6, 6}, {0x17E7, 7}, {0x17E8, 8}, {0x17E9, 9}, {0x1810, 0}, {0x1811, 1}, {0x1812, 2}, {0x1813, 3}, + {0x1814, 4}, {0x1815, 5}, {0x1816, 6}, {0x1817, 7}, {0x1818, 8}, {0x1819, 9}, {0x1946, 0}, {0x1947, 1}, + {0x1948, 2}, {0x1949, 3}, {0x194A, 4}, {0x194B, 5}, {0x194C, 6}, {0x194D, 7}, {0x194E, 8}, {0x194F, 9}, + {0x19D0, 0}, {0x19D1, 1}, {0x19D2, 2}, {0x19D3, 3}, {0x19D4, 4}, {0x19D5, 5}, {0x19D6, 6}, {0x19D7, 7}, + {0x19D8, 8}, {0x19D9, 9}, {0x19DA, 1}, {0x1A80, 0}, {0x1A81, 1}, {0x1A82, 2}, {0x1A83, 3}, {0x1A84, 4}, + {0x1A85, 5}, {0x1A86, 6}, {0x1A87, 7}, {0x1A88, 8}, {0x1A89, 9}, {0x1A90, 0}, {0x1A91, 1}, {0x1A92, 2}, + {0x1A93, 3}, {0x1A94, 4}, {0x1A95, 5}, {0x1A96, 6}, {0x1A97, 7}, {0x1A98, 8}, {0x1A99, 9}, {0x1B50, 0}, + {0x1B51, 1}, {0x1B52, 2}, {0x1B53, 3}, {0x1B54, 4}, {0x1B55, 5}, {0x1B56, 6}, {0x1B57, 7}, {0x1B58, 8}, + {0x1B59, 9}, {0x1BB0, 0}, {0x1BB1, 1}, {0x1BB2, 2}, {0x1BB3, 3}, {0x1BB4, 4}, {0x1BB5, 5}, {0x1BB6, 6}, + {0x1BB7, 7}, {0x1BB8, 8}, {0x1BB9, 9}, {0x1C40, 0}, {0x1C41, 1}, {0x1C42, 2}, {0x1C43, 3}, {0x1C44, 4}, + {0x1C45, 5}, {0x1C46, 6}, {0x1C47, 7}, {0x1C48, 8}, {0x1C49, 9}, {0x1C50, 0}, {0x1C51, 1}, {0x1C52, 2}, + {0x1C53, 3}, {0x1C54, 4}, {0x1C55, 5}, {0x1C56, 6}, {0x1C57, 7}, {0x1C58, 8}, {0x1C59, 9}, {0x2070, 0}, + {0x2074, 4}, {0x2075, 5}, {0x2076, 6}, {0x2077, 7}, {0x2078, 8}, {0x2079, 9}, {0x2080, 0}, {0x2081, 1}, + {0x2082, 2}, {0x2083, 3}, {0x2084, 4}, {0x2085, 5}, {0x2086, 6}, {0x2087, 7}, {0x2088, 8}, {0x2089, 9}, + {0x2460, 1}, {0x2461, 2}, {0x2462, 3}, {0x2463, 4}, {0x2464, 5}, {0x2465, 6}, {0x2466, 7}, {0x2467, 8}, + {0x2468, 9}, {0x2474, 1}, {0x2475, 2}, {0x2476, 3}, {0x2477, 4}, {0x2478, 5}, {0x2479, 6}, {0x247A, 7}, + {0x247B, 8}, {0x247C, 9}, {0x2488, 1}, {0x2489, 2}, {0x248A, 3}, {0x248B, 4}, {0x248C, 5}, {0x248D, 6}, + {0x248E, 7}, {0x248F, 8}, {0x2490, 9}, {0x24EA, 0}, {0x24F5, 1}, {0x24F6, 2}, {0x24F7, 3}, {0x24F8, 4}, + {0x24F9, 5}, {0x24FA, 6}, {0x24FB, 7}, {0x24FC, 8}, {0x24FD, 9}, {0x24FF, 0}, {0x2776, 1}, {0x2777, 2}, + {0x2778, 3}, {0x2779, 4}, {0x277A, 5}, {0x277B, 6}, {0x277C, 7}, {0x277D, 8}, {0x277E, 9}, {0x2780, 1}, + {0x2781, 2}, {0x2782, 3}, {0x2783, 4}, {0x2784, 5}, {0x2785, 6}, {0x2786, 7}, {0x2787, 8}, {0x2788, 9}, + {0x278A, 1}, {0x278B, 2}, {0x278C, 3}, {0x278D, 4}, {0x278E, 5}, {0x278F, 6}, {0x2790, 7}, {0x2791, 8}, + {0x2792, 9}, {0xA620, 0}, {0xA621, 1}, {0xA622, 2}, {0xA623, 3}, {0xA624, 4}, {0xA625, 5}, {0xA626, 6}, + {0xA627, 7}, {0xA628, 8}, {0xA629, 9}, {0xA8D0, 0}, {0xA8D1, 1}, {0xA8D2, 2}, {0xA8D3, 3}, {0xA8D4, 4}, + {0xA8D5, 5}, {0xA8D6, 6}, {0xA8D7, 7}, {0xA8D8, 8}, {0xA8D9, 9}, {0xA900, 0}, {0xA901, 1}, {0xA902, 2}, + {0xA903, 3}, {0xA904, 4}, {0xA905, 5}, {0xA906, 6}, {0xA907, 7}, {0xA908, 8}, {0xA909, 9}, {0xA9D0, 0}, + {0xA9D1, 1}, {0xA9D2, 2}, {0xA9D3, 3}, {0xA9D4, 4}, {0xA9D5, 5}, {0xA9D6, 6}, {0xA9D7, 7}, {0xA9D8, 8}, + {0xA9D9, 9}, {0xA9F0, 0}, {0xA9F1, 1}, {0xA9F2, 2}, {0xA9F3, 3}, {0xA9F4, 4}, {0xA9F5, 5}, {0xA9F6, 6}, + {0xA9F7, 7}, {0xA9F8, 8}, {0xA9F9, 9}, {0xAA50, 0}, {0xAA51, 1}, {0xAA52, 2}, {0xAA53, 3}, {0xAA54, 4}, + {0xAA55, 5}, {0xAA56, 6}, {0xAA57, 7}, {0xAA58, 8}, {0xAA59, 9}, {0xABF0, 0}, {0xABF1, 1}, {0xABF2, 2}, + {0xABF3, 3}, {0xABF4, 4}, {0xABF5, 5}, {0xABF6, 6}, {0xABF7, 7}, {0xABF8, 8}, {0xABF9, 9}, {0xFF10, 0}, + {0xFF11, 1}, {0xFF12, 2}, {0xFF13, 3}, {0xFF14, 4}, {0xFF15, 5}, {0xFF16, 6}, {0xFF17, 7}, {0xFF18, 8}, + {0xFF19, 9}, {0x104A0, 0}, {0x104A1, 1}, {0x104A2, 2}, {0x104A3, 3}, {0x104A4, 4}, {0x104A5, 5}, {0x104A6, 6}, + {0x104A7, 7}, {0x104A8, 8}, {0x104A9, 9}, {0x10A40, 1}, {0x10A41, 2}, {0x10A42, 3}, {0x10A43, 4}, {0x10D30, 0}, + {0x10D31, 1}, {0x10D32, 2}, {0x10D33, 3}, {0x10D34, 4}, {0x10D35, 5}, {0x10D36, 6}, {0x10D37, 7}, {0x10D38, 8}, + {0x10D39, 9}, {0x10E60, 1}, {0x10E61, 2}, {0x10E62, 3}, {0x10E63, 4}, {0x10E64, 5}, {0x10E65, 6}, {0x10E66, 7}, + {0x10E67, 8}, {0x10E68, 9}, {0x11052, 1}, {0x11053, 2}, {0x11054, 3}, {0x11055, 4}, {0x11056, 5}, {0x11057, 6}, + {0x11058, 7}, {0x11059, 8}, {0x1105A, 9}, {0x11066, 0}, {0x11067, 1}, {0x11068, 2}, {0x11069, 3}, {0x1106A, 4}, + {0x1106B, 5}, {0x1106C, 6}, {0x1106D, 7}, {0x1106E, 8}, {0x1106F, 9}, {0x110F0, 0}, {0x110F1, 1}, {0x110F2, 2}, + {0x110F3, 3}, {0x110F4, 4}, {0x110F5, 5}, {0x110F6, 6}, {0x110F7, 7}, {0x110F8, 8}, {0x110F9, 9}, {0x11136, 0}, + {0x11137, 1}, {0x11138, 2}, {0x11139, 3}, {0x1113A, 4}, {0x1113B, 5}, {0x1113C, 6}, {0x1113D, 7}, {0x1113E, 8}, + {0x1113F, 9}, {0x111D0, 0}, {0x111D1, 1}, {0x111D2, 2}, {0x111D3, 3}, {0x111D4, 4}, {0x111D5, 5}, {0x111D6, 6}, + {0x111D7, 7}, {0x111D8, 8}, {0x111D9, 9}, {0x112F0, 0}, {0x112F1, 1}, {0x112F2, 2}, {0x112F3, 3}, {0x112F4, 4}, + {0x112F5, 5}, {0x112F6, 6}, {0x112F7, 7}, {0x112F8, 8}, {0x112F9, 9}, {0x11450, 0}, {0x11451, 1}, {0x11452, 2}, + {0x11453, 3}, {0x11454, 4}, {0x11455, 5}, {0x11456, 6}, {0x11457, 7}, {0x11458, 8}, {0x11459, 9}, {0x114D0, 0}, + {0x114D1, 1}, {0x114D2, 2}, {0x114D3, 3}, {0x114D4, 4}, {0x114D5, 5}, {0x114D6, 6}, {0x114D7, 7}, {0x114D8, 8}, + {0x114D9, 9}, {0x11650, 0}, {0x11651, 1}, {0x11652, 2}, {0x11653, 3}, {0x11654, 4}, {0x11655, 5}, {0x11656, 6}, + {0x11657, 7}, {0x11658, 8}, {0x11659, 9}, {0x116C0, 0}, {0x116C1, 1}, {0x116C2, 2}, {0x116C3, 3}, {0x116C4, 4}, + {0x116C5, 5}, {0x116C6, 6}, {0x116C7, 7}, {0x116C8, 8}, {0x116C9, 9}, {0x11730, 0}, {0x11731, 1}, {0x11732, 2}, + {0x11733, 3}, {0x11734, 4}, {0x11735, 5}, {0x11736, 6}, {0x11737, 7}, {0x11738, 8}, {0x11739, 9}, {0x118E0, 0}, + {0x118E1, 1}, {0x118E2, 2}, {0x118E3, 3}, {0x118E4, 4}, {0x118E5, 5}, {0x118E6, 6}, {0x118E7, 7}, {0x118E8, 8}, + {0x118E9, 9}, {0x11950, 0}, {0x11951, 1}, {0x11952, 2}, {0x11953, 3}, {0x11954, 4}, {0x11955, 5}, {0x11956, 6}, + {0x11957, 7}, {0x11958, 8}, {0x11959, 9}, {0x11C50, 0}, {0x11C51, 1}, {0x11C52, 2}, {0x11C53, 3}, {0x11C54, 4}, + {0x11C55, 5}, {0x11C56, 6}, {0x11C57, 7}, {0x11C58, 8}, {0x11C59, 9}, {0x11D50, 0}, {0x11D51, 1}, {0x11D52, 2}, + {0x11D53, 3}, {0x11D54, 4}, {0x11D55, 5}, {0x11D56, 6}, {0x11D57, 7}, {0x11D58, 8}, {0x11D59, 9}, {0x11DA0, 0}, + {0x11DA1, 1}, {0x11DA2, 2}, {0x11DA3, 3}, {0x11DA4, 4}, {0x11DA5, 5}, {0x11DA6, 6}, {0x11DA7, 7}, {0x11DA8, 8}, + {0x11DA9, 9}, {0x11F50, 0}, {0x11F51, 1}, {0x11F52, 2}, {0x11F53, 3}, {0x11F54, 4}, {0x11F55, 5}, {0x11F56, 6}, + {0x11F57, 7}, {0x11F58, 8}, {0x11F59, 9}, {0x16A60, 0}, {0x16A61, 1}, {0x16A62, 2}, {0x16A63, 3}, {0x16A64, 4}, + {0x16A65, 5}, {0x16A66, 6}, {0x16A67, 7}, {0x16A68, 8}, {0x16A69, 9}, {0x16AC0, 0}, {0x16AC1, 1}, {0x16AC2, 2}, + {0x16AC3, 3}, {0x16AC4, 4}, {0x16AC5, 5}, {0x16AC6, 6}, {0x16AC7, 7}, {0x16AC8, 8}, {0x16AC9, 9}, {0x16B50, 0}, + {0x16B51, 1}, {0x16B52, 2}, {0x16B53, 3}, {0x16B54, 4}, {0x16B55, 5}, {0x16B56, 6}, {0x16B57, 7}, {0x16B58, 8}, + {0x16B59, 9}, {0x1D7CE, 0}, {0x1D7CF, 1}, {0x1D7D0, 2}, {0x1D7D1, 3}, {0x1D7D2, 4}, {0x1D7D3, 5}, {0x1D7D4, 6}, + {0x1D7D5, 7}, {0x1D7D6, 8}, {0x1D7D7, 9}, {0x1D7D8, 0}, {0x1D7D9, 1}, {0x1D7DA, 2}, {0x1D7DB, 3}, {0x1D7DC, 4}, + {0x1D7DD, 5}, {0x1D7DE, 6}, {0x1D7DF, 7}, {0x1D7E0, 8}, {0x1D7E1, 9}, {0x1D7E2, 0}, {0x1D7E3, 1}, {0x1D7E4, 2}, + {0x1D7E5, 3}, {0x1D7E6, 4}, {0x1D7E7, 5}, {0x1D7E8, 6}, {0x1D7E9, 7}, {0x1D7EA, 8}, {0x1D7EB, 9}, {0x1D7EC, 0}, + {0x1D7ED, 1}, {0x1D7EE, 2}, {0x1D7EF, 3}, {0x1D7F0, 4}, {0x1D7F1, 5}, {0x1D7F2, 6}, {0x1D7F3, 7}, {0x1D7F4, 8}, + {0x1D7F5, 9}, {0x1D7F6, 0}, {0x1D7F7, 1}, {0x1D7F8, 2}, {0x1D7F9, 3}, {0x1D7FA, 4}, {0x1D7FB, 5}, {0x1D7FC, 6}, + {0x1D7FD, 7}, {0x1D7FE, 8}, {0x1D7FF, 9}, {0x1E140, 0}, {0x1E141, 1}, {0x1E142, 2}, {0x1E143, 3}, {0x1E144, 4}, + {0x1E145, 5}, {0x1E146, 6}, {0x1E147, 7}, {0x1E148, 8}, {0x1E149, 9}, {0x1E2F0, 0}, {0x1E2F1, 1}, {0x1E2F2, 2}, + {0x1E2F3, 3}, {0x1E2F4, 4}, {0x1E2F5, 5}, {0x1E2F6, 6}, {0x1E2F7, 7}, {0x1E2F8, 8}, {0x1E2F9, 9}, {0x1E4F0, 0}, + {0x1E4F1, 1}, {0x1E4F2, 2}, {0x1E4F3, 3}, {0x1E4F4, 4}, {0x1E4F5, 5}, {0x1E4F6, 6}, {0x1E4F7, 7}, {0x1E4F8, 8}, + {0x1E4F9, 9}, {0x1E950, 0}, {0x1E951, 1}, {0x1E952, 2}, {0x1E953, 3}, {0x1E954, 4}, {0x1E955, 5}, {0x1E956, 6}, + {0x1E957, 7}, {0x1E958, 8}, {0x1E959, 9}, {0x1F100, 0}, {0x1F101, 0}, {0x1F102, 1}, {0x1F103, 2}, {0x1F104, 3}, + {0x1F105, 4}, {0x1F106, 5}, {0x1F107, 6}, {0x1F108, 7}, {0x1F109, 8}, {0x1F10A, 9}, {0x1FBF0, 0}, {0x1FBF1, 1}, + {0x1FBF2, 2}, {0x1FBF3, 3}, {0x1FBF4, 4}, {0x1FBF5, 5}, {0x1FBF6, 6}, {0x1FBF7, 7}, {0x1FBF8, 8}, {0x1FBF9, 9}, +}; + +static const CpMap kPyLowerOne[] = { + {0x41, 0x61}, {0x42, 0x62}, {0x43, 0x63}, {0x44, 0x64}, {0x45, 0x65}, {0x46, 0x66}, + {0x47, 0x67}, {0x48, 0x68}, {0x49, 0x69}, {0x4A, 0x6A}, {0x4B, 0x6B}, {0x4C, 0x6C}, + {0x4D, 0x6D}, {0x4E, 0x6E}, {0x4F, 0x6F}, {0x50, 0x70}, {0x51, 0x71}, {0x52, 0x72}, + {0x53, 0x73}, {0x54, 0x74}, {0x55, 0x75}, {0x56, 0x76}, {0x57, 0x77}, {0x58, 0x78}, + {0x59, 0x79}, {0x5A, 0x7A}, {0xC0, 0xE0}, {0xC1, 0xE1}, {0xC2, 0xE2}, {0xC3, 0xE3}, + {0xC4, 0xE4}, {0xC5, 0xE5}, {0xC6, 0xE6}, {0xC7, 0xE7}, {0xC8, 0xE8}, {0xC9, 0xE9}, + {0xCA, 0xEA}, {0xCB, 0xEB}, {0xCC, 0xEC}, {0xCD, 0xED}, {0xCE, 0xEE}, {0xCF, 0xEF}, + {0xD0, 0xF0}, {0xD1, 0xF1}, {0xD2, 0xF2}, {0xD3, 0xF3}, {0xD4, 0xF4}, {0xD5, 0xF5}, + {0xD6, 0xF6}, {0xD8, 0xF8}, {0xD9, 0xF9}, {0xDA, 0xFA}, {0xDB, 0xFB}, {0xDC, 0xFC}, + {0xDD, 0xFD}, {0xDE, 0xFE}, {0x100, 0x101}, {0x102, 0x103}, {0x104, 0x105}, {0x106, 0x107}, + {0x108, 0x109}, {0x10A, 0x10B}, {0x10C, 0x10D}, {0x10E, 0x10F}, {0x110, 0x111}, {0x112, 0x113}, + {0x114, 0x115}, {0x116, 0x117}, {0x118, 0x119}, {0x11A, 0x11B}, {0x11C, 0x11D}, {0x11E, 0x11F}, + {0x120, 0x121}, {0x122, 0x123}, {0x124, 0x125}, {0x126, 0x127}, {0x128, 0x129}, {0x12A, 0x12B}, + {0x12C, 0x12D}, {0x12E, 0x12F}, {0x132, 0x133}, {0x134, 0x135}, {0x136, 0x137}, {0x139, 0x13A}, + {0x13B, 0x13C}, {0x13D, 0x13E}, {0x13F, 0x140}, {0x141, 0x142}, {0x143, 0x144}, {0x145, 0x146}, + {0x147, 0x148}, {0x14A, 0x14B}, {0x14C, 0x14D}, {0x14E, 0x14F}, {0x150, 0x151}, {0x152, 0x153}, + {0x154, 0x155}, {0x156, 0x157}, {0x158, 0x159}, {0x15A, 0x15B}, {0x15C, 0x15D}, {0x15E, 0x15F}, + {0x160, 0x161}, {0x162, 0x163}, {0x164, 0x165}, {0x166, 0x167}, {0x168, 0x169}, {0x16A, 0x16B}, + {0x16C, 0x16D}, {0x16E, 0x16F}, {0x170, 0x171}, {0x172, 0x173}, {0x174, 0x175}, {0x176, 0x177}, + {0x178, 0xFF}, {0x179, 0x17A}, {0x17B, 0x17C}, {0x17D, 0x17E}, {0x181, 0x253}, {0x182, 0x183}, + {0x184, 0x185}, {0x186, 0x254}, {0x187, 0x188}, {0x189, 0x256}, {0x18A, 0x257}, {0x18B, 0x18C}, + {0x18E, 0x1DD}, {0x18F, 0x259}, {0x190, 0x25B}, {0x191, 0x192}, {0x193, 0x260}, {0x194, 0x263}, + {0x196, 0x269}, {0x197, 0x268}, {0x198, 0x199}, {0x19C, 0x26F}, {0x19D, 0x272}, {0x19F, 0x275}, + {0x1A0, 0x1A1}, {0x1A2, 0x1A3}, {0x1A4, 0x1A5}, {0x1A6, 0x280}, {0x1A7, 0x1A8}, {0x1A9, 0x283}, + {0x1AC, 0x1AD}, {0x1AE, 0x288}, {0x1AF, 0x1B0}, {0x1B1, 0x28A}, {0x1B2, 0x28B}, {0x1B3, 0x1B4}, + {0x1B5, 0x1B6}, {0x1B7, 0x292}, {0x1B8, 0x1B9}, {0x1BC, 0x1BD}, {0x1C4, 0x1C6}, {0x1C5, 0x1C6}, + {0x1C7, 0x1C9}, {0x1C8, 0x1C9}, {0x1CA, 0x1CC}, {0x1CB, 0x1CC}, {0x1CD, 0x1CE}, {0x1CF, 0x1D0}, + {0x1D1, 0x1D2}, {0x1D3, 0x1D4}, {0x1D5, 0x1D6}, {0x1D7, 0x1D8}, {0x1D9, 0x1DA}, {0x1DB, 0x1DC}, + {0x1DE, 0x1DF}, {0x1E0, 0x1E1}, {0x1E2, 0x1E3}, {0x1E4, 0x1E5}, {0x1E6, 0x1E7}, {0x1E8, 0x1E9}, + {0x1EA, 0x1EB}, {0x1EC, 0x1ED}, {0x1EE, 0x1EF}, {0x1F1, 0x1F3}, {0x1F2, 0x1F3}, {0x1F4, 0x1F5}, + {0x1F6, 0x195}, {0x1F7, 0x1BF}, {0x1F8, 0x1F9}, {0x1FA, 0x1FB}, {0x1FC, 0x1FD}, {0x1FE, 0x1FF}, + {0x200, 0x201}, {0x202, 0x203}, {0x204, 0x205}, {0x206, 0x207}, {0x208, 0x209}, {0x20A, 0x20B}, + {0x20C, 0x20D}, {0x20E, 0x20F}, {0x210, 0x211}, {0x212, 0x213}, {0x214, 0x215}, {0x216, 0x217}, + {0x218, 0x219}, {0x21A, 0x21B}, {0x21C, 0x21D}, {0x21E, 0x21F}, {0x220, 0x19E}, {0x222, 0x223}, + {0x224, 0x225}, {0x226, 0x227}, {0x228, 0x229}, {0x22A, 0x22B}, {0x22C, 0x22D}, {0x22E, 0x22F}, + {0x230, 0x231}, {0x232, 0x233}, {0x23A, 0x2C65}, {0x23B, 0x23C}, {0x23D, 0x19A}, {0x23E, 0x2C66}, + {0x241, 0x242}, {0x243, 0x180}, {0x244, 0x289}, {0x245, 0x28C}, {0x246, 0x247}, {0x248, 0x249}, + {0x24A, 0x24B}, {0x24C, 0x24D}, {0x24E, 0x24F}, {0x370, 0x371}, {0x372, 0x373}, {0x376, 0x377}, + {0x37F, 0x3F3}, {0x386, 0x3AC}, {0x388, 0x3AD}, {0x389, 0x3AE}, {0x38A, 0x3AF}, {0x38C, 0x3CC}, + {0x38E, 0x3CD}, {0x38F, 0x3CE}, {0x391, 0x3B1}, {0x392, 0x3B2}, {0x393, 0x3B3}, {0x394, 0x3B4}, + {0x395, 0x3B5}, {0x396, 0x3B6}, {0x397, 0x3B7}, {0x398, 0x3B8}, {0x399, 0x3B9}, {0x39A, 0x3BA}, + {0x39B, 0x3BB}, {0x39C, 0x3BC}, {0x39D, 0x3BD}, {0x39E, 0x3BE}, {0x39F, 0x3BF}, {0x3A0, 0x3C0}, + {0x3A1, 0x3C1}, {0x3A3, 0x3C3}, {0x3A4, 0x3C4}, {0x3A5, 0x3C5}, {0x3A6, 0x3C6}, {0x3A7, 0x3C7}, + {0x3A8, 0x3C8}, {0x3A9, 0x3C9}, {0x3AA, 0x3CA}, {0x3AB, 0x3CB}, {0x3CF, 0x3D7}, {0x3D8, 0x3D9}, + {0x3DA, 0x3DB}, {0x3DC, 0x3DD}, {0x3DE, 0x3DF}, {0x3E0, 0x3E1}, {0x3E2, 0x3E3}, {0x3E4, 0x3E5}, + {0x3E6, 0x3E7}, {0x3E8, 0x3E9}, {0x3EA, 0x3EB}, {0x3EC, 0x3ED}, {0x3EE, 0x3EF}, {0x3F4, 0x3B8}, + {0x3F7, 0x3F8}, {0x3F9, 0x3F2}, {0x3FA, 0x3FB}, {0x3FD, 0x37B}, {0x3FE, 0x37C}, {0x3FF, 0x37D}, + {0x400, 0x450}, {0x401, 0x451}, {0x402, 0x452}, {0x403, 0x453}, {0x404, 0x454}, {0x405, 0x455}, + {0x406, 0x456}, {0x407, 0x457}, {0x408, 0x458}, {0x409, 0x459}, {0x40A, 0x45A}, {0x40B, 0x45B}, + {0x40C, 0x45C}, {0x40D, 0x45D}, {0x40E, 0x45E}, {0x40F, 0x45F}, {0x410, 0x430}, {0x411, 0x431}, + {0x412, 0x432}, {0x413, 0x433}, {0x414, 0x434}, {0x415, 0x435}, {0x416, 0x436}, {0x417, 0x437}, + {0x418, 0x438}, {0x419, 0x439}, {0x41A, 0x43A}, {0x41B, 0x43B}, {0x41C, 0x43C}, {0x41D, 0x43D}, + {0x41E, 0x43E}, {0x41F, 0x43F}, {0x420, 0x440}, {0x421, 0x441}, {0x422, 0x442}, {0x423, 0x443}, + {0x424, 0x444}, {0x425, 0x445}, {0x426, 0x446}, {0x427, 0x447}, {0x428, 0x448}, {0x429, 0x449}, + {0x42A, 0x44A}, {0x42B, 0x44B}, {0x42C, 0x44C}, {0x42D, 0x44D}, {0x42E, 0x44E}, {0x42F, 0x44F}, + {0x460, 0x461}, {0x462, 0x463}, {0x464, 0x465}, {0x466, 0x467}, {0x468, 0x469}, {0x46A, 0x46B}, + {0x46C, 0x46D}, {0x46E, 0x46F}, {0x470, 0x471}, {0x472, 0x473}, {0x474, 0x475}, {0x476, 0x477}, + {0x478, 0x479}, {0x47A, 0x47B}, {0x47C, 0x47D}, {0x47E, 0x47F}, {0x480, 0x481}, {0x48A, 0x48B}, + {0x48C, 0x48D}, {0x48E, 0x48F}, {0x490, 0x491}, {0x492, 0x493}, {0x494, 0x495}, {0x496, 0x497}, + {0x498, 0x499}, {0x49A, 0x49B}, {0x49C, 0x49D}, {0x49E, 0x49F}, {0x4A0, 0x4A1}, {0x4A2, 0x4A3}, + {0x4A4, 0x4A5}, {0x4A6, 0x4A7}, {0x4A8, 0x4A9}, {0x4AA, 0x4AB}, {0x4AC, 0x4AD}, {0x4AE, 0x4AF}, + {0x4B0, 0x4B1}, {0x4B2, 0x4B3}, {0x4B4, 0x4B5}, {0x4B6, 0x4B7}, {0x4B8, 0x4B9}, {0x4BA, 0x4BB}, + {0x4BC, 0x4BD}, {0x4BE, 0x4BF}, {0x4C0, 0x4CF}, {0x4C1, 0x4C2}, {0x4C3, 0x4C4}, {0x4C5, 0x4C6}, + {0x4C7, 0x4C8}, {0x4C9, 0x4CA}, {0x4CB, 0x4CC}, {0x4CD, 0x4CE}, {0x4D0, 0x4D1}, {0x4D2, 0x4D3}, + {0x4D4, 0x4D5}, {0x4D6, 0x4D7}, {0x4D8, 0x4D9}, {0x4DA, 0x4DB}, {0x4DC, 0x4DD}, {0x4DE, 0x4DF}, + {0x4E0, 0x4E1}, {0x4E2, 0x4E3}, {0x4E4, 0x4E5}, {0x4E6, 0x4E7}, {0x4E8, 0x4E9}, {0x4EA, 0x4EB}, + {0x4EC, 0x4ED}, {0x4EE, 0x4EF}, {0x4F0, 0x4F1}, {0x4F2, 0x4F3}, {0x4F4, 0x4F5}, {0x4F6, 0x4F7}, + {0x4F8, 0x4F9}, {0x4FA, 0x4FB}, {0x4FC, 0x4FD}, {0x4FE, 0x4FF}, {0x500, 0x501}, {0x502, 0x503}, + {0x504, 0x505}, {0x506, 0x507}, {0x508, 0x509}, {0x50A, 0x50B}, {0x50C, 0x50D}, {0x50E, 0x50F}, + {0x510, 0x511}, {0x512, 0x513}, {0x514, 0x515}, {0x516, 0x517}, {0x518, 0x519}, {0x51A, 0x51B}, + {0x51C, 0x51D}, {0x51E, 0x51F}, {0x520, 0x521}, {0x522, 0x523}, {0x524, 0x525}, {0x526, 0x527}, + {0x528, 0x529}, {0x52A, 0x52B}, {0x52C, 0x52D}, {0x52E, 0x52F}, {0x531, 0x561}, {0x532, 0x562}, + {0x533, 0x563}, {0x534, 0x564}, {0x535, 0x565}, {0x536, 0x566}, {0x537, 0x567}, {0x538, 0x568}, + {0x539, 0x569}, {0x53A, 0x56A}, {0x53B, 0x56B}, {0x53C, 0x56C}, {0x53D, 0x56D}, {0x53E, 0x56E}, + {0x53F, 0x56F}, {0x540, 0x570}, {0x541, 0x571}, {0x542, 0x572}, {0x543, 0x573}, {0x544, 0x574}, + {0x545, 0x575}, {0x546, 0x576}, {0x547, 0x577}, {0x548, 0x578}, {0x549, 0x579}, {0x54A, 0x57A}, + {0x54B, 0x57B}, {0x54C, 0x57C}, {0x54D, 0x57D}, {0x54E, 0x57E}, {0x54F, 0x57F}, {0x550, 0x580}, + {0x551, 0x581}, {0x552, 0x582}, {0x553, 0x583}, {0x554, 0x584}, {0x555, 0x585}, {0x556, 0x586}, + {0x10A0, 0x2D00}, {0x10A1, 0x2D01}, {0x10A2, 0x2D02}, {0x10A3, 0x2D03}, {0x10A4, 0x2D04}, {0x10A5, 0x2D05}, + {0x10A6, 0x2D06}, {0x10A7, 0x2D07}, {0x10A8, 0x2D08}, {0x10A9, 0x2D09}, {0x10AA, 0x2D0A}, {0x10AB, 0x2D0B}, + {0x10AC, 0x2D0C}, {0x10AD, 0x2D0D}, {0x10AE, 0x2D0E}, {0x10AF, 0x2D0F}, {0x10B0, 0x2D10}, {0x10B1, 0x2D11}, + {0x10B2, 0x2D12}, {0x10B3, 0x2D13}, {0x10B4, 0x2D14}, {0x10B5, 0x2D15}, {0x10B6, 0x2D16}, {0x10B7, 0x2D17}, + {0x10B8, 0x2D18}, {0x10B9, 0x2D19}, {0x10BA, 0x2D1A}, {0x10BB, 0x2D1B}, {0x10BC, 0x2D1C}, {0x10BD, 0x2D1D}, + {0x10BE, 0x2D1E}, {0x10BF, 0x2D1F}, {0x10C0, 0x2D20}, {0x10C1, 0x2D21}, {0x10C2, 0x2D22}, {0x10C3, 0x2D23}, + {0x10C4, 0x2D24}, {0x10C5, 0x2D25}, {0x10C7, 0x2D27}, {0x10CD, 0x2D2D}, {0x13A0, 0xAB70}, {0x13A1, 0xAB71}, + {0x13A2, 0xAB72}, {0x13A3, 0xAB73}, {0x13A4, 0xAB74}, {0x13A5, 0xAB75}, {0x13A6, 0xAB76}, {0x13A7, 0xAB77}, + {0x13A8, 0xAB78}, {0x13A9, 0xAB79}, {0x13AA, 0xAB7A}, {0x13AB, 0xAB7B}, {0x13AC, 0xAB7C}, {0x13AD, 0xAB7D}, + {0x13AE, 0xAB7E}, {0x13AF, 0xAB7F}, {0x13B0, 0xAB80}, {0x13B1, 0xAB81}, {0x13B2, 0xAB82}, {0x13B3, 0xAB83}, + {0x13B4, 0xAB84}, {0x13B5, 0xAB85}, {0x13B6, 0xAB86}, {0x13B7, 0xAB87}, {0x13B8, 0xAB88}, {0x13B9, 0xAB89}, + {0x13BA, 0xAB8A}, {0x13BB, 0xAB8B}, {0x13BC, 0xAB8C}, {0x13BD, 0xAB8D}, {0x13BE, 0xAB8E}, {0x13BF, 0xAB8F}, + {0x13C0, 0xAB90}, {0x13C1, 0xAB91}, {0x13C2, 0xAB92}, {0x13C3, 0xAB93}, {0x13C4, 0xAB94}, {0x13C5, 0xAB95}, + {0x13C6, 0xAB96}, {0x13C7, 0xAB97}, {0x13C8, 0xAB98}, {0x13C9, 0xAB99}, {0x13CA, 0xAB9A}, {0x13CB, 0xAB9B}, + {0x13CC, 0xAB9C}, {0x13CD, 0xAB9D}, {0x13CE, 0xAB9E}, {0x13CF, 0xAB9F}, {0x13D0, 0xABA0}, {0x13D1, 0xABA1}, + {0x13D2, 0xABA2}, {0x13D3, 0xABA3}, {0x13D4, 0xABA4}, {0x13D5, 0xABA5}, {0x13D6, 0xABA6}, {0x13D7, 0xABA7}, + {0x13D8, 0xABA8}, {0x13D9, 0xABA9}, {0x13DA, 0xABAA}, {0x13DB, 0xABAB}, {0x13DC, 0xABAC}, {0x13DD, 0xABAD}, + {0x13DE, 0xABAE}, {0x13DF, 0xABAF}, {0x13E0, 0xABB0}, {0x13E1, 0xABB1}, {0x13E2, 0xABB2}, {0x13E3, 0xABB3}, + {0x13E4, 0xABB4}, {0x13E5, 0xABB5}, {0x13E6, 0xABB6}, {0x13E7, 0xABB7}, {0x13E8, 0xABB8}, {0x13E9, 0xABB9}, + {0x13EA, 0xABBA}, {0x13EB, 0xABBB}, {0x13EC, 0xABBC}, {0x13ED, 0xABBD}, {0x13EE, 0xABBE}, {0x13EF, 0xABBF}, + {0x13F0, 0x13F8}, {0x13F1, 0x13F9}, {0x13F2, 0x13FA}, {0x13F3, 0x13FB}, {0x13F4, 0x13FC}, {0x13F5, 0x13FD}, + {0x1C90, 0x10D0}, {0x1C91, 0x10D1}, {0x1C92, 0x10D2}, {0x1C93, 0x10D3}, {0x1C94, 0x10D4}, {0x1C95, 0x10D5}, + {0x1C96, 0x10D6}, {0x1C97, 0x10D7}, {0x1C98, 0x10D8}, {0x1C99, 0x10D9}, {0x1C9A, 0x10DA}, {0x1C9B, 0x10DB}, + {0x1C9C, 0x10DC}, {0x1C9D, 0x10DD}, {0x1C9E, 0x10DE}, {0x1C9F, 0x10DF}, {0x1CA0, 0x10E0}, {0x1CA1, 0x10E1}, + {0x1CA2, 0x10E2}, {0x1CA3, 0x10E3}, {0x1CA4, 0x10E4}, {0x1CA5, 0x10E5}, {0x1CA6, 0x10E6}, {0x1CA7, 0x10E7}, + {0x1CA8, 0x10E8}, {0x1CA9, 0x10E9}, {0x1CAA, 0x10EA}, {0x1CAB, 0x10EB}, {0x1CAC, 0x10EC}, {0x1CAD, 0x10ED}, + {0x1CAE, 0x10EE}, {0x1CAF, 0x10EF}, {0x1CB0, 0x10F0}, {0x1CB1, 0x10F1}, {0x1CB2, 0x10F2}, {0x1CB3, 0x10F3}, + {0x1CB4, 0x10F4}, {0x1CB5, 0x10F5}, {0x1CB6, 0x10F6}, {0x1CB7, 0x10F7}, {0x1CB8, 0x10F8}, {0x1CB9, 0x10F9}, + {0x1CBA, 0x10FA}, {0x1CBD, 0x10FD}, {0x1CBE, 0x10FE}, {0x1CBF, 0x10FF}, {0x1E00, 0x1E01}, {0x1E02, 0x1E03}, + {0x1E04, 0x1E05}, {0x1E06, 0x1E07}, {0x1E08, 0x1E09}, {0x1E0A, 0x1E0B}, {0x1E0C, 0x1E0D}, {0x1E0E, 0x1E0F}, + {0x1E10, 0x1E11}, {0x1E12, 0x1E13}, {0x1E14, 0x1E15}, {0x1E16, 0x1E17}, {0x1E18, 0x1E19}, {0x1E1A, 0x1E1B}, + {0x1E1C, 0x1E1D}, {0x1E1E, 0x1E1F}, {0x1E20, 0x1E21}, {0x1E22, 0x1E23}, {0x1E24, 0x1E25}, {0x1E26, 0x1E27}, + {0x1E28, 0x1E29}, {0x1E2A, 0x1E2B}, {0x1E2C, 0x1E2D}, {0x1E2E, 0x1E2F}, {0x1E30, 0x1E31}, {0x1E32, 0x1E33}, + {0x1E34, 0x1E35}, {0x1E36, 0x1E37}, {0x1E38, 0x1E39}, {0x1E3A, 0x1E3B}, {0x1E3C, 0x1E3D}, {0x1E3E, 0x1E3F}, + {0x1E40, 0x1E41}, {0x1E42, 0x1E43}, {0x1E44, 0x1E45}, {0x1E46, 0x1E47}, {0x1E48, 0x1E49}, {0x1E4A, 0x1E4B}, + {0x1E4C, 0x1E4D}, {0x1E4E, 0x1E4F}, {0x1E50, 0x1E51}, {0x1E52, 0x1E53}, {0x1E54, 0x1E55}, {0x1E56, 0x1E57}, + {0x1E58, 0x1E59}, {0x1E5A, 0x1E5B}, {0x1E5C, 0x1E5D}, {0x1E5E, 0x1E5F}, {0x1E60, 0x1E61}, {0x1E62, 0x1E63}, + {0x1E64, 0x1E65}, {0x1E66, 0x1E67}, {0x1E68, 0x1E69}, {0x1E6A, 0x1E6B}, {0x1E6C, 0x1E6D}, {0x1E6E, 0x1E6F}, + {0x1E70, 0x1E71}, {0x1E72, 0x1E73}, {0x1E74, 0x1E75}, {0x1E76, 0x1E77}, {0x1E78, 0x1E79}, {0x1E7A, 0x1E7B}, + {0x1E7C, 0x1E7D}, {0x1E7E, 0x1E7F}, {0x1E80, 0x1E81}, {0x1E82, 0x1E83}, {0x1E84, 0x1E85}, {0x1E86, 0x1E87}, + {0x1E88, 0x1E89}, {0x1E8A, 0x1E8B}, {0x1E8C, 0x1E8D}, {0x1E8E, 0x1E8F}, {0x1E90, 0x1E91}, {0x1E92, 0x1E93}, + {0x1E94, 0x1E95}, {0x1E9E, 0xDF}, {0x1EA0, 0x1EA1}, {0x1EA2, 0x1EA3}, {0x1EA4, 0x1EA5}, {0x1EA6, 0x1EA7}, + {0x1EA8, 0x1EA9}, {0x1EAA, 0x1EAB}, {0x1EAC, 0x1EAD}, {0x1EAE, 0x1EAF}, {0x1EB0, 0x1EB1}, {0x1EB2, 0x1EB3}, + {0x1EB4, 0x1EB5}, {0x1EB6, 0x1EB7}, {0x1EB8, 0x1EB9}, {0x1EBA, 0x1EBB}, {0x1EBC, 0x1EBD}, {0x1EBE, 0x1EBF}, + {0x1EC0, 0x1EC1}, {0x1EC2, 0x1EC3}, {0x1EC4, 0x1EC5}, {0x1EC6, 0x1EC7}, {0x1EC8, 0x1EC9}, {0x1ECA, 0x1ECB}, + {0x1ECC, 0x1ECD}, {0x1ECE, 0x1ECF}, {0x1ED0, 0x1ED1}, {0x1ED2, 0x1ED3}, {0x1ED4, 0x1ED5}, {0x1ED6, 0x1ED7}, + {0x1ED8, 0x1ED9}, {0x1EDA, 0x1EDB}, {0x1EDC, 0x1EDD}, {0x1EDE, 0x1EDF}, {0x1EE0, 0x1EE1}, {0x1EE2, 0x1EE3}, + {0x1EE4, 0x1EE5}, {0x1EE6, 0x1EE7}, {0x1EE8, 0x1EE9}, {0x1EEA, 0x1EEB}, {0x1EEC, 0x1EED}, {0x1EEE, 0x1EEF}, + {0x1EF0, 0x1EF1}, {0x1EF2, 0x1EF3}, {0x1EF4, 0x1EF5}, {0x1EF6, 0x1EF7}, {0x1EF8, 0x1EF9}, {0x1EFA, 0x1EFB}, + {0x1EFC, 0x1EFD}, {0x1EFE, 0x1EFF}, {0x1F08, 0x1F00}, {0x1F09, 0x1F01}, {0x1F0A, 0x1F02}, {0x1F0B, 0x1F03}, + {0x1F0C, 0x1F04}, {0x1F0D, 0x1F05}, {0x1F0E, 0x1F06}, {0x1F0F, 0x1F07}, {0x1F18, 0x1F10}, {0x1F19, 0x1F11}, + {0x1F1A, 0x1F12}, {0x1F1B, 0x1F13}, {0x1F1C, 0x1F14}, {0x1F1D, 0x1F15}, {0x1F28, 0x1F20}, {0x1F29, 0x1F21}, + {0x1F2A, 0x1F22}, {0x1F2B, 0x1F23}, {0x1F2C, 0x1F24}, {0x1F2D, 0x1F25}, {0x1F2E, 0x1F26}, {0x1F2F, 0x1F27}, + {0x1F38, 0x1F30}, {0x1F39, 0x1F31}, {0x1F3A, 0x1F32}, {0x1F3B, 0x1F33}, {0x1F3C, 0x1F34}, {0x1F3D, 0x1F35}, + {0x1F3E, 0x1F36}, {0x1F3F, 0x1F37}, {0x1F48, 0x1F40}, {0x1F49, 0x1F41}, {0x1F4A, 0x1F42}, {0x1F4B, 0x1F43}, + {0x1F4C, 0x1F44}, {0x1F4D, 0x1F45}, {0x1F59, 0x1F51}, {0x1F5B, 0x1F53}, {0x1F5D, 0x1F55}, {0x1F5F, 0x1F57}, + {0x1F68, 0x1F60}, {0x1F69, 0x1F61}, {0x1F6A, 0x1F62}, {0x1F6B, 0x1F63}, {0x1F6C, 0x1F64}, {0x1F6D, 0x1F65}, + {0x1F6E, 0x1F66}, {0x1F6F, 0x1F67}, {0x1F88, 0x1F80}, {0x1F89, 0x1F81}, {0x1F8A, 0x1F82}, {0x1F8B, 0x1F83}, + {0x1F8C, 0x1F84}, {0x1F8D, 0x1F85}, {0x1F8E, 0x1F86}, {0x1F8F, 0x1F87}, {0x1F98, 0x1F90}, {0x1F99, 0x1F91}, + {0x1F9A, 0x1F92}, {0x1F9B, 0x1F93}, {0x1F9C, 0x1F94}, {0x1F9D, 0x1F95}, {0x1F9E, 0x1F96}, {0x1F9F, 0x1F97}, + {0x1FA8, 0x1FA0}, {0x1FA9, 0x1FA1}, {0x1FAA, 0x1FA2}, {0x1FAB, 0x1FA3}, {0x1FAC, 0x1FA4}, {0x1FAD, 0x1FA5}, + {0x1FAE, 0x1FA6}, {0x1FAF, 0x1FA7}, {0x1FB8, 0x1FB0}, {0x1FB9, 0x1FB1}, {0x1FBA, 0x1F70}, {0x1FBB, 0x1F71}, + {0x1FBC, 0x1FB3}, {0x1FC8, 0x1F72}, {0x1FC9, 0x1F73}, {0x1FCA, 0x1F74}, {0x1FCB, 0x1F75}, {0x1FCC, 0x1FC3}, + {0x1FD8, 0x1FD0}, {0x1FD9, 0x1FD1}, {0x1FDA, 0x1F76}, {0x1FDB, 0x1F77}, {0x1FE8, 0x1FE0}, {0x1FE9, 0x1FE1}, + {0x1FEA, 0x1F7A}, {0x1FEB, 0x1F7B}, {0x1FEC, 0x1FE5}, {0x1FF8, 0x1F78}, {0x1FF9, 0x1F79}, {0x1FFA, 0x1F7C}, + {0x1FFB, 0x1F7D}, {0x1FFC, 0x1FF3}, {0x2126, 0x3C9}, {0x212A, 0x6B}, {0x212B, 0xE5}, {0x2132, 0x214E}, + {0x2160, 0x2170}, {0x2161, 0x2171}, {0x2162, 0x2172}, {0x2163, 0x2173}, {0x2164, 0x2174}, {0x2165, 0x2175}, + {0x2166, 0x2176}, {0x2167, 0x2177}, {0x2168, 0x2178}, {0x2169, 0x2179}, {0x216A, 0x217A}, {0x216B, 0x217B}, + {0x216C, 0x217C}, {0x216D, 0x217D}, {0x216E, 0x217E}, {0x216F, 0x217F}, {0x2183, 0x2184}, {0x24B6, 0x24D0}, + {0x24B7, 0x24D1}, {0x24B8, 0x24D2}, {0x24B9, 0x24D3}, {0x24BA, 0x24D4}, {0x24BB, 0x24D5}, {0x24BC, 0x24D6}, + {0x24BD, 0x24D7}, {0x24BE, 0x24D8}, {0x24BF, 0x24D9}, {0x24C0, 0x24DA}, {0x24C1, 0x24DB}, {0x24C2, 0x24DC}, + {0x24C3, 0x24DD}, {0x24C4, 0x24DE}, {0x24C5, 0x24DF}, {0x24C6, 0x24E0}, {0x24C7, 0x24E1}, {0x24C8, 0x24E2}, + {0x24C9, 0x24E3}, {0x24CA, 0x24E4}, {0x24CB, 0x24E5}, {0x24CC, 0x24E6}, {0x24CD, 0x24E7}, {0x24CE, 0x24E8}, + {0x24CF, 0x24E9}, {0x2C00, 0x2C30}, {0x2C01, 0x2C31}, {0x2C02, 0x2C32}, {0x2C03, 0x2C33}, {0x2C04, 0x2C34}, + {0x2C05, 0x2C35}, {0x2C06, 0x2C36}, {0x2C07, 0x2C37}, {0x2C08, 0x2C38}, {0x2C09, 0x2C39}, {0x2C0A, 0x2C3A}, + {0x2C0B, 0x2C3B}, {0x2C0C, 0x2C3C}, {0x2C0D, 0x2C3D}, {0x2C0E, 0x2C3E}, {0x2C0F, 0x2C3F}, {0x2C10, 0x2C40}, + {0x2C11, 0x2C41}, {0x2C12, 0x2C42}, {0x2C13, 0x2C43}, {0x2C14, 0x2C44}, {0x2C15, 0x2C45}, {0x2C16, 0x2C46}, + {0x2C17, 0x2C47}, {0x2C18, 0x2C48}, {0x2C19, 0x2C49}, {0x2C1A, 0x2C4A}, {0x2C1B, 0x2C4B}, {0x2C1C, 0x2C4C}, + {0x2C1D, 0x2C4D}, {0x2C1E, 0x2C4E}, {0x2C1F, 0x2C4F}, {0x2C20, 0x2C50}, {0x2C21, 0x2C51}, {0x2C22, 0x2C52}, + {0x2C23, 0x2C53}, {0x2C24, 0x2C54}, {0x2C25, 0x2C55}, {0x2C26, 0x2C56}, {0x2C27, 0x2C57}, {0x2C28, 0x2C58}, + {0x2C29, 0x2C59}, {0x2C2A, 0x2C5A}, {0x2C2B, 0x2C5B}, {0x2C2C, 0x2C5C}, {0x2C2D, 0x2C5D}, {0x2C2E, 0x2C5E}, + {0x2C2F, 0x2C5F}, {0x2C60, 0x2C61}, {0x2C62, 0x26B}, {0x2C63, 0x1D7D}, {0x2C64, 0x27D}, {0x2C67, 0x2C68}, + {0x2C69, 0x2C6A}, {0x2C6B, 0x2C6C}, {0x2C6D, 0x251}, {0x2C6E, 0x271}, {0x2C6F, 0x250}, {0x2C70, 0x252}, + {0x2C72, 0x2C73}, {0x2C75, 0x2C76}, {0x2C7E, 0x23F}, {0x2C7F, 0x240}, {0x2C80, 0x2C81}, {0x2C82, 0x2C83}, + {0x2C84, 0x2C85}, {0x2C86, 0x2C87}, {0x2C88, 0x2C89}, {0x2C8A, 0x2C8B}, {0x2C8C, 0x2C8D}, {0x2C8E, 0x2C8F}, + {0x2C90, 0x2C91}, {0x2C92, 0x2C93}, {0x2C94, 0x2C95}, {0x2C96, 0x2C97}, {0x2C98, 0x2C99}, {0x2C9A, 0x2C9B}, + {0x2C9C, 0x2C9D}, {0x2C9E, 0x2C9F}, {0x2CA0, 0x2CA1}, {0x2CA2, 0x2CA3}, {0x2CA4, 0x2CA5}, {0x2CA6, 0x2CA7}, + {0x2CA8, 0x2CA9}, {0x2CAA, 0x2CAB}, {0x2CAC, 0x2CAD}, {0x2CAE, 0x2CAF}, {0x2CB0, 0x2CB1}, {0x2CB2, 0x2CB3}, + {0x2CB4, 0x2CB5}, {0x2CB6, 0x2CB7}, {0x2CB8, 0x2CB9}, {0x2CBA, 0x2CBB}, {0x2CBC, 0x2CBD}, {0x2CBE, 0x2CBF}, + {0x2CC0, 0x2CC1}, {0x2CC2, 0x2CC3}, {0x2CC4, 0x2CC5}, {0x2CC6, 0x2CC7}, {0x2CC8, 0x2CC9}, {0x2CCA, 0x2CCB}, + {0x2CCC, 0x2CCD}, {0x2CCE, 0x2CCF}, {0x2CD0, 0x2CD1}, {0x2CD2, 0x2CD3}, {0x2CD4, 0x2CD5}, {0x2CD6, 0x2CD7}, + {0x2CD8, 0x2CD9}, {0x2CDA, 0x2CDB}, {0x2CDC, 0x2CDD}, {0x2CDE, 0x2CDF}, {0x2CE0, 0x2CE1}, {0x2CE2, 0x2CE3}, + {0x2CEB, 0x2CEC}, {0x2CED, 0x2CEE}, {0x2CF2, 0x2CF3}, {0xA640, 0xA641}, {0xA642, 0xA643}, {0xA644, 0xA645}, + {0xA646, 0xA647}, {0xA648, 0xA649}, {0xA64A, 0xA64B}, {0xA64C, 0xA64D}, {0xA64E, 0xA64F}, {0xA650, 0xA651}, + {0xA652, 0xA653}, {0xA654, 0xA655}, {0xA656, 0xA657}, {0xA658, 0xA659}, {0xA65A, 0xA65B}, {0xA65C, 0xA65D}, + {0xA65E, 0xA65F}, {0xA660, 0xA661}, {0xA662, 0xA663}, {0xA664, 0xA665}, {0xA666, 0xA667}, {0xA668, 0xA669}, + {0xA66A, 0xA66B}, {0xA66C, 0xA66D}, {0xA680, 0xA681}, {0xA682, 0xA683}, {0xA684, 0xA685}, {0xA686, 0xA687}, + {0xA688, 0xA689}, {0xA68A, 0xA68B}, {0xA68C, 0xA68D}, {0xA68E, 0xA68F}, {0xA690, 0xA691}, {0xA692, 0xA693}, + {0xA694, 0xA695}, {0xA696, 0xA697}, {0xA698, 0xA699}, {0xA69A, 0xA69B}, {0xA722, 0xA723}, {0xA724, 0xA725}, + {0xA726, 0xA727}, {0xA728, 0xA729}, {0xA72A, 0xA72B}, {0xA72C, 0xA72D}, {0xA72E, 0xA72F}, {0xA732, 0xA733}, + {0xA734, 0xA735}, {0xA736, 0xA737}, {0xA738, 0xA739}, {0xA73A, 0xA73B}, {0xA73C, 0xA73D}, {0xA73E, 0xA73F}, + {0xA740, 0xA741}, {0xA742, 0xA743}, {0xA744, 0xA745}, {0xA746, 0xA747}, {0xA748, 0xA749}, {0xA74A, 0xA74B}, + {0xA74C, 0xA74D}, {0xA74E, 0xA74F}, {0xA750, 0xA751}, {0xA752, 0xA753}, {0xA754, 0xA755}, {0xA756, 0xA757}, + {0xA758, 0xA759}, {0xA75A, 0xA75B}, {0xA75C, 0xA75D}, {0xA75E, 0xA75F}, {0xA760, 0xA761}, {0xA762, 0xA763}, + {0xA764, 0xA765}, {0xA766, 0xA767}, {0xA768, 0xA769}, {0xA76A, 0xA76B}, {0xA76C, 0xA76D}, {0xA76E, 0xA76F}, + {0xA779, 0xA77A}, {0xA77B, 0xA77C}, {0xA77D, 0x1D79}, {0xA77E, 0xA77F}, {0xA780, 0xA781}, {0xA782, 0xA783}, + {0xA784, 0xA785}, {0xA786, 0xA787}, {0xA78B, 0xA78C}, {0xA78D, 0x265}, {0xA790, 0xA791}, {0xA792, 0xA793}, + {0xA796, 0xA797}, {0xA798, 0xA799}, {0xA79A, 0xA79B}, {0xA79C, 0xA79D}, {0xA79E, 0xA79F}, {0xA7A0, 0xA7A1}, + {0xA7A2, 0xA7A3}, {0xA7A4, 0xA7A5}, {0xA7A6, 0xA7A7}, {0xA7A8, 0xA7A9}, {0xA7AA, 0x266}, {0xA7AB, 0x25C}, + {0xA7AC, 0x261}, {0xA7AD, 0x26C}, {0xA7AE, 0x26A}, {0xA7B0, 0x29E}, {0xA7B1, 0x287}, {0xA7B2, 0x29D}, + {0xA7B3, 0xAB53}, {0xA7B4, 0xA7B5}, {0xA7B6, 0xA7B7}, {0xA7B8, 0xA7B9}, {0xA7BA, 0xA7BB}, {0xA7BC, 0xA7BD}, + {0xA7BE, 0xA7BF}, {0xA7C0, 0xA7C1}, {0xA7C2, 0xA7C3}, {0xA7C4, 0xA794}, {0xA7C5, 0x282}, {0xA7C6, 0x1D8E}, + {0xA7C7, 0xA7C8}, {0xA7C9, 0xA7CA}, {0xA7D0, 0xA7D1}, {0xA7D6, 0xA7D7}, {0xA7D8, 0xA7D9}, {0xA7F5, 0xA7F6}, + {0xFF21, 0xFF41}, {0xFF22, 0xFF42}, {0xFF23, 0xFF43}, {0xFF24, 0xFF44}, {0xFF25, 0xFF45}, {0xFF26, 0xFF46}, + {0xFF27, 0xFF47}, {0xFF28, 0xFF48}, {0xFF29, 0xFF49}, {0xFF2A, 0xFF4A}, {0xFF2B, 0xFF4B}, {0xFF2C, 0xFF4C}, + {0xFF2D, 0xFF4D}, {0xFF2E, 0xFF4E}, {0xFF2F, 0xFF4F}, {0xFF30, 0xFF50}, {0xFF31, 0xFF51}, {0xFF32, 0xFF52}, + {0xFF33, 0xFF53}, {0xFF34, 0xFF54}, {0xFF35, 0xFF55}, {0xFF36, 0xFF56}, {0xFF37, 0xFF57}, {0xFF38, 0xFF58}, + {0xFF39, 0xFF59}, {0xFF3A, 0xFF5A}, {0x10400, 0x10428}, {0x10401, 0x10429}, {0x10402, 0x1042A}, {0x10403, 0x1042B}, + {0x10404, 0x1042C}, {0x10405, 0x1042D}, {0x10406, 0x1042E}, {0x10407, 0x1042F}, {0x10408, 0x10430}, {0x10409, 0x10431}, + {0x1040A, 0x10432}, {0x1040B, 0x10433}, {0x1040C, 0x10434}, {0x1040D, 0x10435}, {0x1040E, 0x10436}, {0x1040F, 0x10437}, + {0x10410, 0x10438}, {0x10411, 0x10439}, {0x10412, 0x1043A}, {0x10413, 0x1043B}, {0x10414, 0x1043C}, {0x10415, 0x1043D}, + {0x10416, 0x1043E}, {0x10417, 0x1043F}, {0x10418, 0x10440}, {0x10419, 0x10441}, {0x1041A, 0x10442}, {0x1041B, 0x10443}, + {0x1041C, 0x10444}, {0x1041D, 0x10445}, {0x1041E, 0x10446}, {0x1041F, 0x10447}, {0x10420, 0x10448}, {0x10421, 0x10449}, + {0x10422, 0x1044A}, {0x10423, 0x1044B}, {0x10424, 0x1044C}, {0x10425, 0x1044D}, {0x10426, 0x1044E}, {0x10427, 0x1044F}, + {0x104B0, 0x104D8}, {0x104B1, 0x104D9}, {0x104B2, 0x104DA}, {0x104B3, 0x104DB}, {0x104B4, 0x104DC}, {0x104B5, 0x104DD}, + {0x104B6, 0x104DE}, {0x104B7, 0x104DF}, {0x104B8, 0x104E0}, {0x104B9, 0x104E1}, {0x104BA, 0x104E2}, {0x104BB, 0x104E3}, + {0x104BC, 0x104E4}, {0x104BD, 0x104E5}, {0x104BE, 0x104E6}, {0x104BF, 0x104E7}, {0x104C0, 0x104E8}, {0x104C1, 0x104E9}, + {0x104C2, 0x104EA}, {0x104C3, 0x104EB}, {0x104C4, 0x104EC}, {0x104C5, 0x104ED}, {0x104C6, 0x104EE}, {0x104C7, 0x104EF}, + {0x104C8, 0x104F0}, {0x104C9, 0x104F1}, {0x104CA, 0x104F2}, {0x104CB, 0x104F3}, {0x104CC, 0x104F4}, {0x104CD, 0x104F5}, + {0x104CE, 0x104F6}, {0x104CF, 0x104F7}, {0x104D0, 0x104F8}, {0x104D1, 0x104F9}, {0x104D2, 0x104FA}, {0x104D3, 0x104FB}, + {0x10570, 0x10597}, {0x10571, 0x10598}, {0x10572, 0x10599}, {0x10573, 0x1059A}, {0x10574, 0x1059B}, {0x10575, 0x1059C}, + {0x10576, 0x1059D}, {0x10577, 0x1059E}, {0x10578, 0x1059F}, {0x10579, 0x105A0}, {0x1057A, 0x105A1}, {0x1057C, 0x105A3}, + {0x1057D, 0x105A4}, {0x1057E, 0x105A5}, {0x1057F, 0x105A6}, {0x10580, 0x105A7}, {0x10581, 0x105A8}, {0x10582, 0x105A9}, + {0x10583, 0x105AA}, {0x10584, 0x105AB}, {0x10585, 0x105AC}, {0x10586, 0x105AD}, {0x10587, 0x105AE}, {0x10588, 0x105AF}, + {0x10589, 0x105B0}, {0x1058A, 0x105B1}, {0x1058C, 0x105B3}, {0x1058D, 0x105B4}, {0x1058E, 0x105B5}, {0x1058F, 0x105B6}, + {0x10590, 0x105B7}, {0x10591, 0x105B8}, {0x10592, 0x105B9}, {0x10594, 0x105BB}, {0x10595, 0x105BC}, {0x10C80, 0x10CC0}, + {0x10C81, 0x10CC1}, {0x10C82, 0x10CC2}, {0x10C83, 0x10CC3}, {0x10C84, 0x10CC4}, {0x10C85, 0x10CC5}, {0x10C86, 0x10CC6}, + {0x10C87, 0x10CC7}, {0x10C88, 0x10CC8}, {0x10C89, 0x10CC9}, {0x10C8A, 0x10CCA}, {0x10C8B, 0x10CCB}, {0x10C8C, 0x10CCC}, + {0x10C8D, 0x10CCD}, {0x10C8E, 0x10CCE}, {0x10C8F, 0x10CCF}, {0x10C90, 0x10CD0}, {0x10C91, 0x10CD1}, {0x10C92, 0x10CD2}, + {0x10C93, 0x10CD3}, {0x10C94, 0x10CD4}, {0x10C95, 0x10CD5}, {0x10C96, 0x10CD6}, {0x10C97, 0x10CD7}, {0x10C98, 0x10CD8}, + {0x10C99, 0x10CD9}, {0x10C9A, 0x10CDA}, {0x10C9B, 0x10CDB}, {0x10C9C, 0x10CDC}, {0x10C9D, 0x10CDD}, {0x10C9E, 0x10CDE}, + {0x10C9F, 0x10CDF}, {0x10CA0, 0x10CE0}, {0x10CA1, 0x10CE1}, {0x10CA2, 0x10CE2}, {0x10CA3, 0x10CE3}, {0x10CA4, 0x10CE4}, + {0x10CA5, 0x10CE5}, {0x10CA6, 0x10CE6}, {0x10CA7, 0x10CE7}, {0x10CA8, 0x10CE8}, {0x10CA9, 0x10CE9}, {0x10CAA, 0x10CEA}, + {0x10CAB, 0x10CEB}, {0x10CAC, 0x10CEC}, {0x10CAD, 0x10CED}, {0x10CAE, 0x10CEE}, {0x10CAF, 0x10CEF}, {0x10CB0, 0x10CF0}, + {0x10CB1, 0x10CF1}, {0x10CB2, 0x10CF2}, {0x118A0, 0x118C0}, {0x118A1, 0x118C1}, {0x118A2, 0x118C2}, {0x118A3, 0x118C3}, + {0x118A4, 0x118C4}, {0x118A5, 0x118C5}, {0x118A6, 0x118C6}, {0x118A7, 0x118C7}, {0x118A8, 0x118C8}, {0x118A9, 0x118C9}, + {0x118AA, 0x118CA}, {0x118AB, 0x118CB}, {0x118AC, 0x118CC}, {0x118AD, 0x118CD}, {0x118AE, 0x118CE}, {0x118AF, 0x118CF}, + {0x118B0, 0x118D0}, {0x118B1, 0x118D1}, {0x118B2, 0x118D2}, {0x118B3, 0x118D3}, {0x118B4, 0x118D4}, {0x118B5, 0x118D5}, + {0x118B6, 0x118D6}, {0x118B7, 0x118D7}, {0x118B8, 0x118D8}, {0x118B9, 0x118D9}, {0x118BA, 0x118DA}, {0x118BB, 0x118DB}, + {0x118BC, 0x118DC}, {0x118BD, 0x118DD}, {0x118BE, 0x118DE}, {0x118BF, 0x118DF}, {0x16E40, 0x16E60}, {0x16E41, 0x16E61}, + {0x16E42, 0x16E62}, {0x16E43, 0x16E63}, {0x16E44, 0x16E64}, {0x16E45, 0x16E65}, {0x16E46, 0x16E66}, {0x16E47, 0x16E67}, + {0x16E48, 0x16E68}, {0x16E49, 0x16E69}, {0x16E4A, 0x16E6A}, {0x16E4B, 0x16E6B}, {0x16E4C, 0x16E6C}, {0x16E4D, 0x16E6D}, + {0x16E4E, 0x16E6E}, {0x16E4F, 0x16E6F}, {0x16E50, 0x16E70}, {0x16E51, 0x16E71}, {0x16E52, 0x16E72}, {0x16E53, 0x16E73}, + {0x16E54, 0x16E74}, {0x16E55, 0x16E75}, {0x16E56, 0x16E76}, {0x16E57, 0x16E77}, {0x16E58, 0x16E78}, {0x16E59, 0x16E79}, + {0x16E5A, 0x16E7A}, {0x16E5B, 0x16E7B}, {0x16E5C, 0x16E7C}, {0x16E5D, 0x16E7D}, {0x16E5E, 0x16E7E}, {0x16E5F, 0x16E7F}, + {0x1E900, 0x1E922}, {0x1E901, 0x1E923}, {0x1E902, 0x1E924}, {0x1E903, 0x1E925}, {0x1E904, 0x1E926}, {0x1E905, 0x1E927}, + {0x1E906, 0x1E928}, {0x1E907, 0x1E929}, {0x1E908, 0x1E92A}, {0x1E909, 0x1E92B}, {0x1E90A, 0x1E92C}, {0x1E90B, 0x1E92D}, + {0x1E90C, 0x1E92E}, {0x1E90D, 0x1E92F}, {0x1E90E, 0x1E930}, {0x1E90F, 0x1E931}, {0x1E910, 0x1E932}, {0x1E911, 0x1E933}, + {0x1E912, 0x1E934}, {0x1E913, 0x1E935}, {0x1E914, 0x1E936}, {0x1E915, 0x1E937}, {0x1E916, 0x1E938}, {0x1E917, 0x1E939}, + {0x1E918, 0x1E93A}, {0x1E919, 0x1E93B}, {0x1E91A, 0x1E93C}, {0x1E91B, 0x1E93D}, {0x1E91C, 0x1E93E}, {0x1E91D, 0x1E93F}, + {0x1E91E, 0x1E940}, {0x1E91F, 0x1E941}, {0x1E920, 0x1E942}, {0x1E921, 0x1E943}, +}; + +static const CpMulti kPyLowerMulti[] = { + {0x130, U"\U00000069\U00000307"}, +}; + +static const CpMap kPyUpperOne[] = { + {0x61, 0x41}, {0x62, 0x42}, {0x63, 0x43}, {0x64, 0x44}, {0x65, 0x45}, {0x66, 0x46}, + {0x67, 0x47}, {0x68, 0x48}, {0x69, 0x49}, {0x6A, 0x4A}, {0x6B, 0x4B}, {0x6C, 0x4C}, + {0x6D, 0x4D}, {0x6E, 0x4E}, {0x6F, 0x4F}, {0x70, 0x50}, {0x71, 0x51}, {0x72, 0x52}, + {0x73, 0x53}, {0x74, 0x54}, {0x75, 0x55}, {0x76, 0x56}, {0x77, 0x57}, {0x78, 0x58}, + {0x79, 0x59}, {0x7A, 0x5A}, {0xB5, 0x39C}, {0xE0, 0xC0}, {0xE1, 0xC1}, {0xE2, 0xC2}, + {0xE3, 0xC3}, {0xE4, 0xC4}, {0xE5, 0xC5}, {0xE6, 0xC6}, {0xE7, 0xC7}, {0xE8, 0xC8}, + {0xE9, 0xC9}, {0xEA, 0xCA}, {0xEB, 0xCB}, {0xEC, 0xCC}, {0xED, 0xCD}, {0xEE, 0xCE}, + {0xEF, 0xCF}, {0xF0, 0xD0}, {0xF1, 0xD1}, {0xF2, 0xD2}, {0xF3, 0xD3}, {0xF4, 0xD4}, + {0xF5, 0xD5}, {0xF6, 0xD6}, {0xF8, 0xD8}, {0xF9, 0xD9}, {0xFA, 0xDA}, {0xFB, 0xDB}, + {0xFC, 0xDC}, {0xFD, 0xDD}, {0xFE, 0xDE}, {0xFF, 0x178}, {0x101, 0x100}, {0x103, 0x102}, + {0x105, 0x104}, {0x107, 0x106}, {0x109, 0x108}, {0x10B, 0x10A}, {0x10D, 0x10C}, {0x10F, 0x10E}, + {0x111, 0x110}, {0x113, 0x112}, {0x115, 0x114}, {0x117, 0x116}, {0x119, 0x118}, {0x11B, 0x11A}, + {0x11D, 0x11C}, {0x11F, 0x11E}, {0x121, 0x120}, {0x123, 0x122}, {0x125, 0x124}, {0x127, 0x126}, + {0x129, 0x128}, {0x12B, 0x12A}, {0x12D, 0x12C}, {0x12F, 0x12E}, {0x131, 0x49}, {0x133, 0x132}, + {0x135, 0x134}, {0x137, 0x136}, {0x13A, 0x139}, {0x13C, 0x13B}, {0x13E, 0x13D}, {0x140, 0x13F}, + {0x142, 0x141}, {0x144, 0x143}, {0x146, 0x145}, {0x148, 0x147}, {0x14B, 0x14A}, {0x14D, 0x14C}, + {0x14F, 0x14E}, {0x151, 0x150}, {0x153, 0x152}, {0x155, 0x154}, {0x157, 0x156}, {0x159, 0x158}, + {0x15B, 0x15A}, {0x15D, 0x15C}, {0x15F, 0x15E}, {0x161, 0x160}, {0x163, 0x162}, {0x165, 0x164}, + {0x167, 0x166}, {0x169, 0x168}, {0x16B, 0x16A}, {0x16D, 0x16C}, {0x16F, 0x16E}, {0x171, 0x170}, + {0x173, 0x172}, {0x175, 0x174}, {0x177, 0x176}, {0x17A, 0x179}, {0x17C, 0x17B}, {0x17E, 0x17D}, + {0x17F, 0x53}, {0x180, 0x243}, {0x183, 0x182}, {0x185, 0x184}, {0x188, 0x187}, {0x18C, 0x18B}, + {0x192, 0x191}, {0x195, 0x1F6}, {0x199, 0x198}, {0x19A, 0x23D}, {0x19E, 0x220}, {0x1A1, 0x1A0}, + {0x1A3, 0x1A2}, {0x1A5, 0x1A4}, {0x1A8, 0x1A7}, {0x1AD, 0x1AC}, {0x1B0, 0x1AF}, {0x1B4, 0x1B3}, + {0x1B6, 0x1B5}, {0x1B9, 0x1B8}, {0x1BD, 0x1BC}, {0x1BF, 0x1F7}, {0x1C5, 0x1C4}, {0x1C6, 0x1C4}, + {0x1C8, 0x1C7}, {0x1C9, 0x1C7}, {0x1CB, 0x1CA}, {0x1CC, 0x1CA}, {0x1CE, 0x1CD}, {0x1D0, 0x1CF}, + {0x1D2, 0x1D1}, {0x1D4, 0x1D3}, {0x1D6, 0x1D5}, {0x1D8, 0x1D7}, {0x1DA, 0x1D9}, {0x1DC, 0x1DB}, + {0x1DD, 0x18E}, {0x1DF, 0x1DE}, {0x1E1, 0x1E0}, {0x1E3, 0x1E2}, {0x1E5, 0x1E4}, {0x1E7, 0x1E6}, + {0x1E9, 0x1E8}, {0x1EB, 0x1EA}, {0x1ED, 0x1EC}, {0x1EF, 0x1EE}, {0x1F2, 0x1F1}, {0x1F3, 0x1F1}, + {0x1F5, 0x1F4}, {0x1F9, 0x1F8}, {0x1FB, 0x1FA}, {0x1FD, 0x1FC}, {0x1FF, 0x1FE}, {0x201, 0x200}, + {0x203, 0x202}, {0x205, 0x204}, {0x207, 0x206}, {0x209, 0x208}, {0x20B, 0x20A}, {0x20D, 0x20C}, + {0x20F, 0x20E}, {0x211, 0x210}, {0x213, 0x212}, {0x215, 0x214}, {0x217, 0x216}, {0x219, 0x218}, + {0x21B, 0x21A}, {0x21D, 0x21C}, {0x21F, 0x21E}, {0x223, 0x222}, {0x225, 0x224}, {0x227, 0x226}, + {0x229, 0x228}, {0x22B, 0x22A}, {0x22D, 0x22C}, {0x22F, 0x22E}, {0x231, 0x230}, {0x233, 0x232}, + {0x23C, 0x23B}, {0x23F, 0x2C7E}, {0x240, 0x2C7F}, {0x242, 0x241}, {0x247, 0x246}, {0x249, 0x248}, + {0x24B, 0x24A}, {0x24D, 0x24C}, {0x24F, 0x24E}, {0x250, 0x2C6F}, {0x251, 0x2C6D}, {0x252, 0x2C70}, + {0x253, 0x181}, {0x254, 0x186}, {0x256, 0x189}, {0x257, 0x18A}, {0x259, 0x18F}, {0x25B, 0x190}, + {0x25C, 0xA7AB}, {0x260, 0x193}, {0x261, 0xA7AC}, {0x263, 0x194}, {0x265, 0xA78D}, {0x266, 0xA7AA}, + {0x268, 0x197}, {0x269, 0x196}, {0x26A, 0xA7AE}, {0x26B, 0x2C62}, {0x26C, 0xA7AD}, {0x26F, 0x19C}, + {0x271, 0x2C6E}, {0x272, 0x19D}, {0x275, 0x19F}, {0x27D, 0x2C64}, {0x280, 0x1A6}, {0x282, 0xA7C5}, + {0x283, 0x1A9}, {0x287, 0xA7B1}, {0x288, 0x1AE}, {0x289, 0x244}, {0x28A, 0x1B1}, {0x28B, 0x1B2}, + {0x28C, 0x245}, {0x292, 0x1B7}, {0x29D, 0xA7B2}, {0x29E, 0xA7B0}, {0x345, 0x399}, {0x371, 0x370}, + {0x373, 0x372}, {0x377, 0x376}, {0x37B, 0x3FD}, {0x37C, 0x3FE}, {0x37D, 0x3FF}, {0x3AC, 0x386}, + {0x3AD, 0x388}, {0x3AE, 0x389}, {0x3AF, 0x38A}, {0x3B1, 0x391}, {0x3B2, 0x392}, {0x3B3, 0x393}, + {0x3B4, 0x394}, {0x3B5, 0x395}, {0x3B6, 0x396}, {0x3B7, 0x397}, {0x3B8, 0x398}, {0x3B9, 0x399}, + {0x3BA, 0x39A}, {0x3BB, 0x39B}, {0x3BC, 0x39C}, {0x3BD, 0x39D}, {0x3BE, 0x39E}, {0x3BF, 0x39F}, + {0x3C0, 0x3A0}, {0x3C1, 0x3A1}, {0x3C2, 0x3A3}, {0x3C3, 0x3A3}, {0x3C4, 0x3A4}, {0x3C5, 0x3A5}, + {0x3C6, 0x3A6}, {0x3C7, 0x3A7}, {0x3C8, 0x3A8}, {0x3C9, 0x3A9}, {0x3CA, 0x3AA}, {0x3CB, 0x3AB}, + {0x3CC, 0x38C}, {0x3CD, 0x38E}, {0x3CE, 0x38F}, {0x3D0, 0x392}, {0x3D1, 0x398}, {0x3D5, 0x3A6}, + {0x3D6, 0x3A0}, {0x3D7, 0x3CF}, {0x3D9, 0x3D8}, {0x3DB, 0x3DA}, {0x3DD, 0x3DC}, {0x3DF, 0x3DE}, + {0x3E1, 0x3E0}, {0x3E3, 0x3E2}, {0x3E5, 0x3E4}, {0x3E7, 0x3E6}, {0x3E9, 0x3E8}, {0x3EB, 0x3EA}, + {0x3ED, 0x3EC}, {0x3EF, 0x3EE}, {0x3F0, 0x39A}, {0x3F1, 0x3A1}, {0x3F2, 0x3F9}, {0x3F3, 0x37F}, + {0x3F5, 0x395}, {0x3F8, 0x3F7}, {0x3FB, 0x3FA}, {0x430, 0x410}, {0x431, 0x411}, {0x432, 0x412}, + {0x433, 0x413}, {0x434, 0x414}, {0x435, 0x415}, {0x436, 0x416}, {0x437, 0x417}, {0x438, 0x418}, + {0x439, 0x419}, {0x43A, 0x41A}, {0x43B, 0x41B}, {0x43C, 0x41C}, {0x43D, 0x41D}, {0x43E, 0x41E}, + {0x43F, 0x41F}, {0x440, 0x420}, {0x441, 0x421}, {0x442, 0x422}, {0x443, 0x423}, {0x444, 0x424}, + {0x445, 0x425}, {0x446, 0x426}, {0x447, 0x427}, {0x448, 0x428}, {0x449, 0x429}, {0x44A, 0x42A}, + {0x44B, 0x42B}, {0x44C, 0x42C}, {0x44D, 0x42D}, {0x44E, 0x42E}, {0x44F, 0x42F}, {0x450, 0x400}, + {0x451, 0x401}, {0x452, 0x402}, {0x453, 0x403}, {0x454, 0x404}, {0x455, 0x405}, {0x456, 0x406}, + {0x457, 0x407}, {0x458, 0x408}, {0x459, 0x409}, {0x45A, 0x40A}, {0x45B, 0x40B}, {0x45C, 0x40C}, + {0x45D, 0x40D}, {0x45E, 0x40E}, {0x45F, 0x40F}, {0x461, 0x460}, {0x463, 0x462}, {0x465, 0x464}, + {0x467, 0x466}, {0x469, 0x468}, {0x46B, 0x46A}, {0x46D, 0x46C}, {0x46F, 0x46E}, {0x471, 0x470}, + {0x473, 0x472}, {0x475, 0x474}, {0x477, 0x476}, {0x479, 0x478}, {0x47B, 0x47A}, {0x47D, 0x47C}, + {0x47F, 0x47E}, {0x481, 0x480}, {0x48B, 0x48A}, {0x48D, 0x48C}, {0x48F, 0x48E}, {0x491, 0x490}, + {0x493, 0x492}, {0x495, 0x494}, {0x497, 0x496}, {0x499, 0x498}, {0x49B, 0x49A}, {0x49D, 0x49C}, + {0x49F, 0x49E}, {0x4A1, 0x4A0}, {0x4A3, 0x4A2}, {0x4A5, 0x4A4}, {0x4A7, 0x4A6}, {0x4A9, 0x4A8}, + {0x4AB, 0x4AA}, {0x4AD, 0x4AC}, {0x4AF, 0x4AE}, {0x4B1, 0x4B0}, {0x4B3, 0x4B2}, {0x4B5, 0x4B4}, + {0x4B7, 0x4B6}, {0x4B9, 0x4B8}, {0x4BB, 0x4BA}, {0x4BD, 0x4BC}, {0x4BF, 0x4BE}, {0x4C2, 0x4C1}, + {0x4C4, 0x4C3}, {0x4C6, 0x4C5}, {0x4C8, 0x4C7}, {0x4CA, 0x4C9}, {0x4CC, 0x4CB}, {0x4CE, 0x4CD}, + {0x4CF, 0x4C0}, {0x4D1, 0x4D0}, {0x4D3, 0x4D2}, {0x4D5, 0x4D4}, {0x4D7, 0x4D6}, {0x4D9, 0x4D8}, + {0x4DB, 0x4DA}, {0x4DD, 0x4DC}, {0x4DF, 0x4DE}, {0x4E1, 0x4E0}, {0x4E3, 0x4E2}, {0x4E5, 0x4E4}, + {0x4E7, 0x4E6}, {0x4E9, 0x4E8}, {0x4EB, 0x4EA}, {0x4ED, 0x4EC}, {0x4EF, 0x4EE}, {0x4F1, 0x4F0}, + {0x4F3, 0x4F2}, {0x4F5, 0x4F4}, {0x4F7, 0x4F6}, {0x4F9, 0x4F8}, {0x4FB, 0x4FA}, {0x4FD, 0x4FC}, + {0x4FF, 0x4FE}, {0x501, 0x500}, {0x503, 0x502}, {0x505, 0x504}, {0x507, 0x506}, {0x509, 0x508}, + {0x50B, 0x50A}, {0x50D, 0x50C}, {0x50F, 0x50E}, {0x511, 0x510}, {0x513, 0x512}, {0x515, 0x514}, + {0x517, 0x516}, {0x519, 0x518}, {0x51B, 0x51A}, {0x51D, 0x51C}, {0x51F, 0x51E}, {0x521, 0x520}, + {0x523, 0x522}, {0x525, 0x524}, {0x527, 0x526}, {0x529, 0x528}, {0x52B, 0x52A}, {0x52D, 0x52C}, + {0x52F, 0x52E}, {0x561, 0x531}, {0x562, 0x532}, {0x563, 0x533}, {0x564, 0x534}, {0x565, 0x535}, + {0x566, 0x536}, {0x567, 0x537}, {0x568, 0x538}, {0x569, 0x539}, {0x56A, 0x53A}, {0x56B, 0x53B}, + {0x56C, 0x53C}, {0x56D, 0x53D}, {0x56E, 0x53E}, {0x56F, 0x53F}, {0x570, 0x540}, {0x571, 0x541}, + {0x572, 0x542}, {0x573, 0x543}, {0x574, 0x544}, {0x575, 0x545}, {0x576, 0x546}, {0x577, 0x547}, + {0x578, 0x548}, {0x579, 0x549}, {0x57A, 0x54A}, {0x57B, 0x54B}, {0x57C, 0x54C}, {0x57D, 0x54D}, + {0x57E, 0x54E}, {0x57F, 0x54F}, {0x580, 0x550}, {0x581, 0x551}, {0x582, 0x552}, {0x583, 0x553}, + {0x584, 0x554}, {0x585, 0x555}, {0x586, 0x556}, {0x10D0, 0x1C90}, {0x10D1, 0x1C91}, {0x10D2, 0x1C92}, + {0x10D3, 0x1C93}, {0x10D4, 0x1C94}, {0x10D5, 0x1C95}, {0x10D6, 0x1C96}, {0x10D7, 0x1C97}, {0x10D8, 0x1C98}, + {0x10D9, 0x1C99}, {0x10DA, 0x1C9A}, {0x10DB, 0x1C9B}, {0x10DC, 0x1C9C}, {0x10DD, 0x1C9D}, {0x10DE, 0x1C9E}, + {0x10DF, 0x1C9F}, {0x10E0, 0x1CA0}, {0x10E1, 0x1CA1}, {0x10E2, 0x1CA2}, {0x10E3, 0x1CA3}, {0x10E4, 0x1CA4}, + {0x10E5, 0x1CA5}, {0x10E6, 0x1CA6}, {0x10E7, 0x1CA7}, {0x10E8, 0x1CA8}, {0x10E9, 0x1CA9}, {0x10EA, 0x1CAA}, + {0x10EB, 0x1CAB}, {0x10EC, 0x1CAC}, {0x10ED, 0x1CAD}, {0x10EE, 0x1CAE}, {0x10EF, 0x1CAF}, {0x10F0, 0x1CB0}, + {0x10F1, 0x1CB1}, {0x10F2, 0x1CB2}, {0x10F3, 0x1CB3}, {0x10F4, 0x1CB4}, {0x10F5, 0x1CB5}, {0x10F6, 0x1CB6}, + {0x10F7, 0x1CB7}, {0x10F8, 0x1CB8}, {0x10F9, 0x1CB9}, {0x10FA, 0x1CBA}, {0x10FD, 0x1CBD}, {0x10FE, 0x1CBE}, + {0x10FF, 0x1CBF}, {0x13F8, 0x13F0}, {0x13F9, 0x13F1}, {0x13FA, 0x13F2}, {0x13FB, 0x13F3}, {0x13FC, 0x13F4}, + {0x13FD, 0x13F5}, {0x1C80, 0x412}, {0x1C81, 0x414}, {0x1C82, 0x41E}, {0x1C83, 0x421}, {0x1C84, 0x422}, + {0x1C85, 0x422}, {0x1C86, 0x42A}, {0x1C87, 0x462}, {0x1C88, 0xA64A}, {0x1D79, 0xA77D}, {0x1D7D, 0x2C63}, + {0x1D8E, 0xA7C6}, {0x1E01, 0x1E00}, {0x1E03, 0x1E02}, {0x1E05, 0x1E04}, {0x1E07, 0x1E06}, {0x1E09, 0x1E08}, + {0x1E0B, 0x1E0A}, {0x1E0D, 0x1E0C}, {0x1E0F, 0x1E0E}, {0x1E11, 0x1E10}, {0x1E13, 0x1E12}, {0x1E15, 0x1E14}, + {0x1E17, 0x1E16}, {0x1E19, 0x1E18}, {0x1E1B, 0x1E1A}, {0x1E1D, 0x1E1C}, {0x1E1F, 0x1E1E}, {0x1E21, 0x1E20}, + {0x1E23, 0x1E22}, {0x1E25, 0x1E24}, {0x1E27, 0x1E26}, {0x1E29, 0x1E28}, {0x1E2B, 0x1E2A}, {0x1E2D, 0x1E2C}, + {0x1E2F, 0x1E2E}, {0x1E31, 0x1E30}, {0x1E33, 0x1E32}, {0x1E35, 0x1E34}, {0x1E37, 0x1E36}, {0x1E39, 0x1E38}, + {0x1E3B, 0x1E3A}, {0x1E3D, 0x1E3C}, {0x1E3F, 0x1E3E}, {0x1E41, 0x1E40}, {0x1E43, 0x1E42}, {0x1E45, 0x1E44}, + {0x1E47, 0x1E46}, {0x1E49, 0x1E48}, {0x1E4B, 0x1E4A}, {0x1E4D, 0x1E4C}, {0x1E4F, 0x1E4E}, {0x1E51, 0x1E50}, + {0x1E53, 0x1E52}, {0x1E55, 0x1E54}, {0x1E57, 0x1E56}, {0x1E59, 0x1E58}, {0x1E5B, 0x1E5A}, {0x1E5D, 0x1E5C}, + {0x1E5F, 0x1E5E}, {0x1E61, 0x1E60}, {0x1E63, 0x1E62}, {0x1E65, 0x1E64}, {0x1E67, 0x1E66}, {0x1E69, 0x1E68}, + {0x1E6B, 0x1E6A}, {0x1E6D, 0x1E6C}, {0x1E6F, 0x1E6E}, {0x1E71, 0x1E70}, {0x1E73, 0x1E72}, {0x1E75, 0x1E74}, + {0x1E77, 0x1E76}, {0x1E79, 0x1E78}, {0x1E7B, 0x1E7A}, {0x1E7D, 0x1E7C}, {0x1E7F, 0x1E7E}, {0x1E81, 0x1E80}, + {0x1E83, 0x1E82}, {0x1E85, 0x1E84}, {0x1E87, 0x1E86}, {0x1E89, 0x1E88}, {0x1E8B, 0x1E8A}, {0x1E8D, 0x1E8C}, + {0x1E8F, 0x1E8E}, {0x1E91, 0x1E90}, {0x1E93, 0x1E92}, {0x1E95, 0x1E94}, {0x1E9B, 0x1E60}, {0x1EA1, 0x1EA0}, + {0x1EA3, 0x1EA2}, {0x1EA5, 0x1EA4}, {0x1EA7, 0x1EA6}, {0x1EA9, 0x1EA8}, {0x1EAB, 0x1EAA}, {0x1EAD, 0x1EAC}, + {0x1EAF, 0x1EAE}, {0x1EB1, 0x1EB0}, {0x1EB3, 0x1EB2}, {0x1EB5, 0x1EB4}, {0x1EB7, 0x1EB6}, {0x1EB9, 0x1EB8}, + {0x1EBB, 0x1EBA}, {0x1EBD, 0x1EBC}, {0x1EBF, 0x1EBE}, {0x1EC1, 0x1EC0}, {0x1EC3, 0x1EC2}, {0x1EC5, 0x1EC4}, + {0x1EC7, 0x1EC6}, {0x1EC9, 0x1EC8}, {0x1ECB, 0x1ECA}, {0x1ECD, 0x1ECC}, {0x1ECF, 0x1ECE}, {0x1ED1, 0x1ED0}, + {0x1ED3, 0x1ED2}, {0x1ED5, 0x1ED4}, {0x1ED7, 0x1ED6}, {0x1ED9, 0x1ED8}, {0x1EDB, 0x1EDA}, {0x1EDD, 0x1EDC}, + {0x1EDF, 0x1EDE}, {0x1EE1, 0x1EE0}, {0x1EE3, 0x1EE2}, {0x1EE5, 0x1EE4}, {0x1EE7, 0x1EE6}, {0x1EE9, 0x1EE8}, + {0x1EEB, 0x1EEA}, {0x1EED, 0x1EEC}, {0x1EEF, 0x1EEE}, {0x1EF1, 0x1EF0}, {0x1EF3, 0x1EF2}, {0x1EF5, 0x1EF4}, + {0x1EF7, 0x1EF6}, {0x1EF9, 0x1EF8}, {0x1EFB, 0x1EFA}, {0x1EFD, 0x1EFC}, {0x1EFF, 0x1EFE}, {0x1F00, 0x1F08}, + {0x1F01, 0x1F09}, {0x1F02, 0x1F0A}, {0x1F03, 0x1F0B}, {0x1F04, 0x1F0C}, {0x1F05, 0x1F0D}, {0x1F06, 0x1F0E}, + {0x1F07, 0x1F0F}, {0x1F10, 0x1F18}, {0x1F11, 0x1F19}, {0x1F12, 0x1F1A}, {0x1F13, 0x1F1B}, {0x1F14, 0x1F1C}, + {0x1F15, 0x1F1D}, {0x1F20, 0x1F28}, {0x1F21, 0x1F29}, {0x1F22, 0x1F2A}, {0x1F23, 0x1F2B}, {0x1F24, 0x1F2C}, + {0x1F25, 0x1F2D}, {0x1F26, 0x1F2E}, {0x1F27, 0x1F2F}, {0x1F30, 0x1F38}, {0x1F31, 0x1F39}, {0x1F32, 0x1F3A}, + {0x1F33, 0x1F3B}, {0x1F34, 0x1F3C}, {0x1F35, 0x1F3D}, {0x1F36, 0x1F3E}, {0x1F37, 0x1F3F}, {0x1F40, 0x1F48}, + {0x1F41, 0x1F49}, {0x1F42, 0x1F4A}, {0x1F43, 0x1F4B}, {0x1F44, 0x1F4C}, {0x1F45, 0x1F4D}, {0x1F51, 0x1F59}, + {0x1F53, 0x1F5B}, {0x1F55, 0x1F5D}, {0x1F57, 0x1F5F}, {0x1F60, 0x1F68}, {0x1F61, 0x1F69}, {0x1F62, 0x1F6A}, + {0x1F63, 0x1F6B}, {0x1F64, 0x1F6C}, {0x1F65, 0x1F6D}, {0x1F66, 0x1F6E}, {0x1F67, 0x1F6F}, {0x1F70, 0x1FBA}, + {0x1F71, 0x1FBB}, {0x1F72, 0x1FC8}, {0x1F73, 0x1FC9}, {0x1F74, 0x1FCA}, {0x1F75, 0x1FCB}, {0x1F76, 0x1FDA}, + {0x1F77, 0x1FDB}, {0x1F78, 0x1FF8}, {0x1F79, 0x1FF9}, {0x1F7A, 0x1FEA}, {0x1F7B, 0x1FEB}, {0x1F7C, 0x1FFA}, + {0x1F7D, 0x1FFB}, {0x1FB0, 0x1FB8}, {0x1FB1, 0x1FB9}, {0x1FBE, 0x399}, {0x1FD0, 0x1FD8}, {0x1FD1, 0x1FD9}, + {0x1FE0, 0x1FE8}, {0x1FE1, 0x1FE9}, {0x1FE5, 0x1FEC}, {0x214E, 0x2132}, {0x2170, 0x2160}, {0x2171, 0x2161}, + {0x2172, 0x2162}, {0x2173, 0x2163}, {0x2174, 0x2164}, {0x2175, 0x2165}, {0x2176, 0x2166}, {0x2177, 0x2167}, + {0x2178, 0x2168}, {0x2179, 0x2169}, {0x217A, 0x216A}, {0x217B, 0x216B}, {0x217C, 0x216C}, {0x217D, 0x216D}, + {0x217E, 0x216E}, {0x217F, 0x216F}, {0x2184, 0x2183}, {0x24D0, 0x24B6}, {0x24D1, 0x24B7}, {0x24D2, 0x24B8}, + {0x24D3, 0x24B9}, {0x24D4, 0x24BA}, {0x24D5, 0x24BB}, {0x24D6, 0x24BC}, {0x24D7, 0x24BD}, {0x24D8, 0x24BE}, + {0x24D9, 0x24BF}, {0x24DA, 0x24C0}, {0x24DB, 0x24C1}, {0x24DC, 0x24C2}, {0x24DD, 0x24C3}, {0x24DE, 0x24C4}, + {0x24DF, 0x24C5}, {0x24E0, 0x24C6}, {0x24E1, 0x24C7}, {0x24E2, 0x24C8}, {0x24E3, 0x24C9}, {0x24E4, 0x24CA}, + {0x24E5, 0x24CB}, {0x24E6, 0x24CC}, {0x24E7, 0x24CD}, {0x24E8, 0x24CE}, {0x24E9, 0x24CF}, {0x2C30, 0x2C00}, + {0x2C31, 0x2C01}, {0x2C32, 0x2C02}, {0x2C33, 0x2C03}, {0x2C34, 0x2C04}, {0x2C35, 0x2C05}, {0x2C36, 0x2C06}, + {0x2C37, 0x2C07}, {0x2C38, 0x2C08}, {0x2C39, 0x2C09}, {0x2C3A, 0x2C0A}, {0x2C3B, 0x2C0B}, {0x2C3C, 0x2C0C}, + {0x2C3D, 0x2C0D}, {0x2C3E, 0x2C0E}, {0x2C3F, 0x2C0F}, {0x2C40, 0x2C10}, {0x2C41, 0x2C11}, {0x2C42, 0x2C12}, + {0x2C43, 0x2C13}, {0x2C44, 0x2C14}, {0x2C45, 0x2C15}, {0x2C46, 0x2C16}, {0x2C47, 0x2C17}, {0x2C48, 0x2C18}, + {0x2C49, 0x2C19}, {0x2C4A, 0x2C1A}, {0x2C4B, 0x2C1B}, {0x2C4C, 0x2C1C}, {0x2C4D, 0x2C1D}, {0x2C4E, 0x2C1E}, + {0x2C4F, 0x2C1F}, {0x2C50, 0x2C20}, {0x2C51, 0x2C21}, {0x2C52, 0x2C22}, {0x2C53, 0x2C23}, {0x2C54, 0x2C24}, + {0x2C55, 0x2C25}, {0x2C56, 0x2C26}, {0x2C57, 0x2C27}, {0x2C58, 0x2C28}, {0x2C59, 0x2C29}, {0x2C5A, 0x2C2A}, + {0x2C5B, 0x2C2B}, {0x2C5C, 0x2C2C}, {0x2C5D, 0x2C2D}, {0x2C5E, 0x2C2E}, {0x2C5F, 0x2C2F}, {0x2C61, 0x2C60}, + {0x2C65, 0x23A}, {0x2C66, 0x23E}, {0x2C68, 0x2C67}, {0x2C6A, 0x2C69}, {0x2C6C, 0x2C6B}, {0x2C73, 0x2C72}, + {0x2C76, 0x2C75}, {0x2C81, 0x2C80}, {0x2C83, 0x2C82}, {0x2C85, 0x2C84}, {0x2C87, 0x2C86}, {0x2C89, 0x2C88}, + {0x2C8B, 0x2C8A}, {0x2C8D, 0x2C8C}, {0x2C8F, 0x2C8E}, {0x2C91, 0x2C90}, {0x2C93, 0x2C92}, {0x2C95, 0x2C94}, + {0x2C97, 0x2C96}, {0x2C99, 0x2C98}, {0x2C9B, 0x2C9A}, {0x2C9D, 0x2C9C}, {0x2C9F, 0x2C9E}, {0x2CA1, 0x2CA0}, + {0x2CA3, 0x2CA2}, {0x2CA5, 0x2CA4}, {0x2CA7, 0x2CA6}, {0x2CA9, 0x2CA8}, {0x2CAB, 0x2CAA}, {0x2CAD, 0x2CAC}, + {0x2CAF, 0x2CAE}, {0x2CB1, 0x2CB0}, {0x2CB3, 0x2CB2}, {0x2CB5, 0x2CB4}, {0x2CB7, 0x2CB6}, {0x2CB9, 0x2CB8}, + {0x2CBB, 0x2CBA}, {0x2CBD, 0x2CBC}, {0x2CBF, 0x2CBE}, {0x2CC1, 0x2CC0}, {0x2CC3, 0x2CC2}, {0x2CC5, 0x2CC4}, + {0x2CC7, 0x2CC6}, {0x2CC9, 0x2CC8}, {0x2CCB, 0x2CCA}, {0x2CCD, 0x2CCC}, {0x2CCF, 0x2CCE}, {0x2CD1, 0x2CD0}, + {0x2CD3, 0x2CD2}, {0x2CD5, 0x2CD4}, {0x2CD7, 0x2CD6}, {0x2CD9, 0x2CD8}, {0x2CDB, 0x2CDA}, {0x2CDD, 0x2CDC}, + {0x2CDF, 0x2CDE}, {0x2CE1, 0x2CE0}, {0x2CE3, 0x2CE2}, {0x2CEC, 0x2CEB}, {0x2CEE, 0x2CED}, {0x2CF3, 0x2CF2}, + {0x2D00, 0x10A0}, {0x2D01, 0x10A1}, {0x2D02, 0x10A2}, {0x2D03, 0x10A3}, {0x2D04, 0x10A4}, {0x2D05, 0x10A5}, + {0x2D06, 0x10A6}, {0x2D07, 0x10A7}, {0x2D08, 0x10A8}, {0x2D09, 0x10A9}, {0x2D0A, 0x10AA}, {0x2D0B, 0x10AB}, + {0x2D0C, 0x10AC}, {0x2D0D, 0x10AD}, {0x2D0E, 0x10AE}, {0x2D0F, 0x10AF}, {0x2D10, 0x10B0}, {0x2D11, 0x10B1}, + {0x2D12, 0x10B2}, {0x2D13, 0x10B3}, {0x2D14, 0x10B4}, {0x2D15, 0x10B5}, {0x2D16, 0x10B6}, {0x2D17, 0x10B7}, + {0x2D18, 0x10B8}, {0x2D19, 0x10B9}, {0x2D1A, 0x10BA}, {0x2D1B, 0x10BB}, {0x2D1C, 0x10BC}, {0x2D1D, 0x10BD}, + {0x2D1E, 0x10BE}, {0x2D1F, 0x10BF}, {0x2D20, 0x10C0}, {0x2D21, 0x10C1}, {0x2D22, 0x10C2}, {0x2D23, 0x10C3}, + {0x2D24, 0x10C4}, {0x2D25, 0x10C5}, {0x2D27, 0x10C7}, {0x2D2D, 0x10CD}, {0xA641, 0xA640}, {0xA643, 0xA642}, + {0xA645, 0xA644}, {0xA647, 0xA646}, {0xA649, 0xA648}, {0xA64B, 0xA64A}, {0xA64D, 0xA64C}, {0xA64F, 0xA64E}, + {0xA651, 0xA650}, {0xA653, 0xA652}, {0xA655, 0xA654}, {0xA657, 0xA656}, {0xA659, 0xA658}, {0xA65B, 0xA65A}, + {0xA65D, 0xA65C}, {0xA65F, 0xA65E}, {0xA661, 0xA660}, {0xA663, 0xA662}, {0xA665, 0xA664}, {0xA667, 0xA666}, + {0xA669, 0xA668}, {0xA66B, 0xA66A}, {0xA66D, 0xA66C}, {0xA681, 0xA680}, {0xA683, 0xA682}, {0xA685, 0xA684}, + {0xA687, 0xA686}, {0xA689, 0xA688}, {0xA68B, 0xA68A}, {0xA68D, 0xA68C}, {0xA68F, 0xA68E}, {0xA691, 0xA690}, + {0xA693, 0xA692}, {0xA695, 0xA694}, {0xA697, 0xA696}, {0xA699, 0xA698}, {0xA69B, 0xA69A}, {0xA723, 0xA722}, + {0xA725, 0xA724}, {0xA727, 0xA726}, {0xA729, 0xA728}, {0xA72B, 0xA72A}, {0xA72D, 0xA72C}, {0xA72F, 0xA72E}, + {0xA733, 0xA732}, {0xA735, 0xA734}, {0xA737, 0xA736}, {0xA739, 0xA738}, {0xA73B, 0xA73A}, {0xA73D, 0xA73C}, + {0xA73F, 0xA73E}, {0xA741, 0xA740}, {0xA743, 0xA742}, {0xA745, 0xA744}, {0xA747, 0xA746}, {0xA749, 0xA748}, + {0xA74B, 0xA74A}, {0xA74D, 0xA74C}, {0xA74F, 0xA74E}, {0xA751, 0xA750}, {0xA753, 0xA752}, {0xA755, 0xA754}, + {0xA757, 0xA756}, {0xA759, 0xA758}, {0xA75B, 0xA75A}, {0xA75D, 0xA75C}, {0xA75F, 0xA75E}, {0xA761, 0xA760}, + {0xA763, 0xA762}, {0xA765, 0xA764}, {0xA767, 0xA766}, {0xA769, 0xA768}, {0xA76B, 0xA76A}, {0xA76D, 0xA76C}, + {0xA76F, 0xA76E}, {0xA77A, 0xA779}, {0xA77C, 0xA77B}, {0xA77F, 0xA77E}, {0xA781, 0xA780}, {0xA783, 0xA782}, + {0xA785, 0xA784}, {0xA787, 0xA786}, {0xA78C, 0xA78B}, {0xA791, 0xA790}, {0xA793, 0xA792}, {0xA794, 0xA7C4}, + {0xA797, 0xA796}, {0xA799, 0xA798}, {0xA79B, 0xA79A}, {0xA79D, 0xA79C}, {0xA79F, 0xA79E}, {0xA7A1, 0xA7A0}, + {0xA7A3, 0xA7A2}, {0xA7A5, 0xA7A4}, {0xA7A7, 0xA7A6}, {0xA7A9, 0xA7A8}, {0xA7B5, 0xA7B4}, {0xA7B7, 0xA7B6}, + {0xA7B9, 0xA7B8}, {0xA7BB, 0xA7BA}, {0xA7BD, 0xA7BC}, {0xA7BF, 0xA7BE}, {0xA7C1, 0xA7C0}, {0xA7C3, 0xA7C2}, + {0xA7C8, 0xA7C7}, {0xA7CA, 0xA7C9}, {0xA7D1, 0xA7D0}, {0xA7D7, 0xA7D6}, {0xA7D9, 0xA7D8}, {0xA7F6, 0xA7F5}, + {0xAB53, 0xA7B3}, {0xAB70, 0x13A0}, {0xAB71, 0x13A1}, {0xAB72, 0x13A2}, {0xAB73, 0x13A3}, {0xAB74, 0x13A4}, + {0xAB75, 0x13A5}, {0xAB76, 0x13A6}, {0xAB77, 0x13A7}, {0xAB78, 0x13A8}, {0xAB79, 0x13A9}, {0xAB7A, 0x13AA}, + {0xAB7B, 0x13AB}, {0xAB7C, 0x13AC}, {0xAB7D, 0x13AD}, {0xAB7E, 0x13AE}, {0xAB7F, 0x13AF}, {0xAB80, 0x13B0}, + {0xAB81, 0x13B1}, {0xAB82, 0x13B2}, {0xAB83, 0x13B3}, {0xAB84, 0x13B4}, {0xAB85, 0x13B5}, {0xAB86, 0x13B6}, + {0xAB87, 0x13B7}, {0xAB88, 0x13B8}, {0xAB89, 0x13B9}, {0xAB8A, 0x13BA}, {0xAB8B, 0x13BB}, {0xAB8C, 0x13BC}, + {0xAB8D, 0x13BD}, {0xAB8E, 0x13BE}, {0xAB8F, 0x13BF}, {0xAB90, 0x13C0}, {0xAB91, 0x13C1}, {0xAB92, 0x13C2}, + {0xAB93, 0x13C3}, {0xAB94, 0x13C4}, {0xAB95, 0x13C5}, {0xAB96, 0x13C6}, {0xAB97, 0x13C7}, {0xAB98, 0x13C8}, + {0xAB99, 0x13C9}, {0xAB9A, 0x13CA}, {0xAB9B, 0x13CB}, {0xAB9C, 0x13CC}, {0xAB9D, 0x13CD}, {0xAB9E, 0x13CE}, + {0xAB9F, 0x13CF}, {0xABA0, 0x13D0}, {0xABA1, 0x13D1}, {0xABA2, 0x13D2}, {0xABA3, 0x13D3}, {0xABA4, 0x13D4}, + {0xABA5, 0x13D5}, {0xABA6, 0x13D6}, {0xABA7, 0x13D7}, {0xABA8, 0x13D8}, {0xABA9, 0x13D9}, {0xABAA, 0x13DA}, + {0xABAB, 0x13DB}, {0xABAC, 0x13DC}, {0xABAD, 0x13DD}, {0xABAE, 0x13DE}, {0xABAF, 0x13DF}, {0xABB0, 0x13E0}, + {0xABB1, 0x13E1}, {0xABB2, 0x13E2}, {0xABB3, 0x13E3}, {0xABB4, 0x13E4}, {0xABB5, 0x13E5}, {0xABB6, 0x13E6}, + {0xABB7, 0x13E7}, {0xABB8, 0x13E8}, {0xABB9, 0x13E9}, {0xABBA, 0x13EA}, {0xABBB, 0x13EB}, {0xABBC, 0x13EC}, + {0xABBD, 0x13ED}, {0xABBE, 0x13EE}, {0xABBF, 0x13EF}, {0xFF41, 0xFF21}, {0xFF42, 0xFF22}, {0xFF43, 0xFF23}, + {0xFF44, 0xFF24}, {0xFF45, 0xFF25}, {0xFF46, 0xFF26}, {0xFF47, 0xFF27}, {0xFF48, 0xFF28}, {0xFF49, 0xFF29}, + {0xFF4A, 0xFF2A}, {0xFF4B, 0xFF2B}, {0xFF4C, 0xFF2C}, {0xFF4D, 0xFF2D}, {0xFF4E, 0xFF2E}, {0xFF4F, 0xFF2F}, + {0xFF50, 0xFF30}, {0xFF51, 0xFF31}, {0xFF52, 0xFF32}, {0xFF53, 0xFF33}, {0xFF54, 0xFF34}, {0xFF55, 0xFF35}, + {0xFF56, 0xFF36}, {0xFF57, 0xFF37}, {0xFF58, 0xFF38}, {0xFF59, 0xFF39}, {0xFF5A, 0xFF3A}, {0x10428, 0x10400}, + {0x10429, 0x10401}, {0x1042A, 0x10402}, {0x1042B, 0x10403}, {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406}, + {0x1042F, 0x10407}, {0x10430, 0x10408}, {0x10431, 0x10409}, {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C}, + {0x10435, 0x1040D}, {0x10436, 0x1040E}, {0x10437, 0x1040F}, {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412}, + {0x1043B, 0x10413}, {0x1043C, 0x10414}, {0x1043D, 0x10415}, {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418}, + {0x10441, 0x10419}, {0x10442, 0x1041A}, {0x10443, 0x1041B}, {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E}, + {0x10447, 0x1041F}, {0x10448, 0x10420}, {0x10449, 0x10421}, {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424}, + {0x1044D, 0x10425}, {0x1044E, 0x10426}, {0x1044F, 0x10427}, {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2}, + {0x104DB, 0x104B3}, {0x104DC, 0x104B4}, {0x104DD, 0x104B5}, {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8}, + {0x104E1, 0x104B9}, {0x104E2, 0x104BA}, {0x104E3, 0x104BB}, {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE}, + {0x104E7, 0x104BF}, {0x104E8, 0x104C0}, {0x104E9, 0x104C1}, {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4}, + {0x104ED, 0x104C5}, {0x104EE, 0x104C6}, {0x104EF, 0x104C7}, {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA}, + {0x104F3, 0x104CB}, {0x104F4, 0x104CC}, {0x104F5, 0x104CD}, {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0}, + {0x104F9, 0x104D1}, {0x104FA, 0x104D2}, {0x104FB, 0x104D3}, {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572}, + {0x1059A, 0x10573}, {0x1059B, 0x10574}, {0x1059C, 0x10575}, {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578}, + {0x105A0, 0x10579}, {0x105A1, 0x1057A}, {0x105A3, 0x1057C}, {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F}, + {0x105A7, 0x10580}, {0x105A8, 0x10581}, {0x105A9, 0x10582}, {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585}, + {0x105AD, 0x10586}, {0x105AE, 0x10587}, {0x105AF, 0x10588}, {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C}, + {0x105B4, 0x1058D}, {0x105B5, 0x1058E}, {0x105B6, 0x1058F}, {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592}, + {0x105BB, 0x10594}, {0x105BC, 0x10595}, {0x10CC0, 0x10C80}, {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83}, + {0x10CC4, 0x10C84}, {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86}, {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89}, + {0x10CCA, 0x10C8A}, {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C}, {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F}, + {0x10CD0, 0x10C90}, {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92}, {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95}, + {0x10CD6, 0x10C96}, {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98}, {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B}, + {0x10CDC, 0x10C9C}, {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E}, {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1}, + {0x10CE2, 0x10CA2}, {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4}, {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7}, + {0x10CE8, 0x10CA8}, {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA}, {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD}, + {0x10CEE, 0x10CAE}, {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0}, {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x118C0, 0x118A0}, + {0x118C1, 0x118A1}, {0x118C2, 0x118A2}, {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5}, {0x118C6, 0x118A6}, + {0x118C7, 0x118A7}, {0x118C8, 0x118A8}, {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB}, {0x118CC, 0x118AC}, + {0x118CD, 0x118AD}, {0x118CE, 0x118AE}, {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1}, {0x118D2, 0x118B2}, + {0x118D3, 0x118B3}, {0x118D4, 0x118B4}, {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7}, {0x118D8, 0x118B8}, + {0x118D9, 0x118B9}, {0x118DA, 0x118BA}, {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD}, {0x118DE, 0x118BE}, + {0x118DF, 0x118BF}, {0x16E60, 0x16E40}, {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43}, {0x16E64, 0x16E44}, + {0x16E65, 0x16E45}, {0x16E66, 0x16E46}, {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49}, {0x16E6A, 0x16E4A}, + {0x16E6B, 0x16E4B}, {0x16E6C, 0x16E4C}, {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F}, {0x16E70, 0x16E50}, + {0x16E71, 0x16E51}, {0x16E72, 0x16E52}, {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55}, {0x16E76, 0x16E56}, + {0x16E77, 0x16E57}, {0x16E78, 0x16E58}, {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B}, {0x16E7C, 0x16E5C}, + {0x16E7D, 0x16E5D}, {0x16E7E, 0x16E5E}, {0x16E7F, 0x16E5F}, {0x1E922, 0x1E900}, {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, + {0x1E925, 0x1E903}, {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906}, {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, + {0x1E92B, 0x1E909}, {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C}, {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, + {0x1E931, 0x1E90F}, {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912}, {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, + {0x1E937, 0x1E915}, {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918}, {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, + {0x1E93D, 0x1E91B}, {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E}, {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, + {0x1E943, 0x1E921}, +}; + +static const CpMulti kPyUpperMulti[] = { + {0xDF, U"\U00000053\U00000053"}, + {0x149, U"\U000002BC\U0000004E"}, + {0x1F0, U"\U0000004A\U0000030C"}, + {0x390, U"\U00000399\U00000308\U00000301"}, + {0x3B0, U"\U000003A5\U00000308\U00000301"}, + {0x587, U"\U00000535\U00000552"}, + {0x1E96, U"\U00000048\U00000331"}, + {0x1E97, U"\U00000054\U00000308"}, + {0x1E98, U"\U00000057\U0000030A"}, + {0x1E99, U"\U00000059\U0000030A"}, + {0x1E9A, U"\U00000041\U000002BE"}, + {0x1F50, U"\U000003A5\U00000313"}, + {0x1F52, U"\U000003A5\U00000313\U00000300"}, + {0x1F54, U"\U000003A5\U00000313\U00000301"}, + {0x1F56, U"\U000003A5\U00000313\U00000342"}, + {0x1F80, U"\U00001F08\U00000399"}, + {0x1F81, U"\U00001F09\U00000399"}, + {0x1F82, U"\U00001F0A\U00000399"}, + {0x1F83, U"\U00001F0B\U00000399"}, + {0x1F84, U"\U00001F0C\U00000399"}, + {0x1F85, U"\U00001F0D\U00000399"}, + {0x1F86, U"\U00001F0E\U00000399"}, + {0x1F87, U"\U00001F0F\U00000399"}, + {0x1F88, U"\U00001F08\U00000399"}, + {0x1F89, U"\U00001F09\U00000399"}, + {0x1F8A, U"\U00001F0A\U00000399"}, + {0x1F8B, U"\U00001F0B\U00000399"}, + {0x1F8C, U"\U00001F0C\U00000399"}, + {0x1F8D, U"\U00001F0D\U00000399"}, + {0x1F8E, U"\U00001F0E\U00000399"}, + {0x1F8F, U"\U00001F0F\U00000399"}, + {0x1F90, U"\U00001F28\U00000399"}, + {0x1F91, U"\U00001F29\U00000399"}, + {0x1F92, U"\U00001F2A\U00000399"}, + {0x1F93, U"\U00001F2B\U00000399"}, + {0x1F94, U"\U00001F2C\U00000399"}, + {0x1F95, U"\U00001F2D\U00000399"}, + {0x1F96, U"\U00001F2E\U00000399"}, + {0x1F97, U"\U00001F2F\U00000399"}, + {0x1F98, U"\U00001F28\U00000399"}, + {0x1F99, U"\U00001F29\U00000399"}, + {0x1F9A, U"\U00001F2A\U00000399"}, + {0x1F9B, U"\U00001F2B\U00000399"}, + {0x1F9C, U"\U00001F2C\U00000399"}, + {0x1F9D, U"\U00001F2D\U00000399"}, + {0x1F9E, U"\U00001F2E\U00000399"}, + {0x1F9F, U"\U00001F2F\U00000399"}, + {0x1FA0, U"\U00001F68\U00000399"}, + {0x1FA1, U"\U00001F69\U00000399"}, + {0x1FA2, U"\U00001F6A\U00000399"}, + {0x1FA3, U"\U00001F6B\U00000399"}, + {0x1FA4, U"\U00001F6C\U00000399"}, + {0x1FA5, U"\U00001F6D\U00000399"}, + {0x1FA6, U"\U00001F6E\U00000399"}, + {0x1FA7, U"\U00001F6F\U00000399"}, + {0x1FA8, U"\U00001F68\U00000399"}, + {0x1FA9, U"\U00001F69\U00000399"}, + {0x1FAA, U"\U00001F6A\U00000399"}, + {0x1FAB, U"\U00001F6B\U00000399"}, + {0x1FAC, U"\U00001F6C\U00000399"}, + {0x1FAD, U"\U00001F6D\U00000399"}, + {0x1FAE, U"\U00001F6E\U00000399"}, + {0x1FAF, U"\U00001F6F\U00000399"}, + {0x1FB2, U"\U00001FBA\U00000399"}, + {0x1FB3, U"\U00000391\U00000399"}, + {0x1FB4, U"\U00000386\U00000399"}, + {0x1FB6, U"\U00000391\U00000342"}, + {0x1FB7, U"\U00000391\U00000342\U00000399"}, + {0x1FBC, U"\U00000391\U00000399"}, + {0x1FC2, U"\U00001FCA\U00000399"}, + {0x1FC3, U"\U00000397\U00000399"}, + {0x1FC4, U"\U00000389\U00000399"}, + {0x1FC6, U"\U00000397\U00000342"}, + {0x1FC7, U"\U00000397\U00000342\U00000399"}, + {0x1FCC, U"\U00000397\U00000399"}, + {0x1FD2, U"\U00000399\U00000308\U00000300"}, + {0x1FD3, U"\U00000399\U00000308\U00000301"}, + {0x1FD6, U"\U00000399\U00000342"}, + {0x1FD7, U"\U00000399\U00000308\U00000342"}, + {0x1FE2, U"\U000003A5\U00000308\U00000300"}, + {0x1FE3, U"\U000003A5\U00000308\U00000301"}, + {0x1FE4, U"\U000003A1\U00000313"}, + {0x1FE6, U"\U000003A5\U00000342"}, + {0x1FE7, U"\U000003A5\U00000308\U00000342"}, + {0x1FF2, U"\U00001FFA\U00000399"}, + {0x1FF3, U"\U000003A9\U00000399"}, + {0x1FF4, U"\U0000038F\U00000399"}, + {0x1FF6, U"\U000003A9\U00000342"}, + {0x1FF7, U"\U000003A9\U00000342\U00000399"}, + {0x1FFC, U"\U000003A9\U00000399"}, + {0xFB00, U"\U00000046\U00000046"}, + {0xFB01, U"\U00000046\U00000049"}, + {0xFB02, U"\U00000046\U0000004C"}, + {0xFB03, U"\U00000046\U00000046\U00000049"}, + {0xFB04, U"\U00000046\U00000046\U0000004C"}, + {0xFB05, U"\U00000053\U00000054"}, + {0xFB06, U"\U00000053\U00000054"}, + {0xFB13, U"\U00000544\U00000546"}, + {0xFB14, U"\U00000544\U00000535"}, + {0xFB15, U"\U00000544\U0000053B"}, + {0xFB16, U"\U0000054E\U00000546"}, + {0xFB17, U"\U00000544\U0000053D"}, +}; + +static const CpMap kPyTitleOne[] = { + {0x61, 0x41}, {0x62, 0x42}, {0x63, 0x43}, {0x64, 0x44}, {0x65, 0x45}, {0x66, 0x46}, + {0x67, 0x47}, {0x68, 0x48}, {0x69, 0x49}, {0x6A, 0x4A}, {0x6B, 0x4B}, {0x6C, 0x4C}, + {0x6D, 0x4D}, {0x6E, 0x4E}, {0x6F, 0x4F}, {0x70, 0x50}, {0x71, 0x51}, {0x72, 0x52}, + {0x73, 0x53}, {0x74, 0x54}, {0x75, 0x55}, {0x76, 0x56}, {0x77, 0x57}, {0x78, 0x58}, + {0x79, 0x59}, {0x7A, 0x5A}, {0xB5, 0x39C}, {0xE0, 0xC0}, {0xE1, 0xC1}, {0xE2, 0xC2}, + {0xE3, 0xC3}, {0xE4, 0xC4}, {0xE5, 0xC5}, {0xE6, 0xC6}, {0xE7, 0xC7}, {0xE8, 0xC8}, + {0xE9, 0xC9}, {0xEA, 0xCA}, {0xEB, 0xCB}, {0xEC, 0xCC}, {0xED, 0xCD}, {0xEE, 0xCE}, + {0xEF, 0xCF}, {0xF0, 0xD0}, {0xF1, 0xD1}, {0xF2, 0xD2}, {0xF3, 0xD3}, {0xF4, 0xD4}, + {0xF5, 0xD5}, {0xF6, 0xD6}, {0xF8, 0xD8}, {0xF9, 0xD9}, {0xFA, 0xDA}, {0xFB, 0xDB}, + {0xFC, 0xDC}, {0xFD, 0xDD}, {0xFE, 0xDE}, {0xFF, 0x178}, {0x101, 0x100}, {0x103, 0x102}, + {0x105, 0x104}, {0x107, 0x106}, {0x109, 0x108}, {0x10B, 0x10A}, {0x10D, 0x10C}, {0x10F, 0x10E}, + {0x111, 0x110}, {0x113, 0x112}, {0x115, 0x114}, {0x117, 0x116}, {0x119, 0x118}, {0x11B, 0x11A}, + {0x11D, 0x11C}, {0x11F, 0x11E}, {0x121, 0x120}, {0x123, 0x122}, {0x125, 0x124}, {0x127, 0x126}, + {0x129, 0x128}, {0x12B, 0x12A}, {0x12D, 0x12C}, {0x12F, 0x12E}, {0x131, 0x49}, {0x133, 0x132}, + {0x135, 0x134}, {0x137, 0x136}, {0x13A, 0x139}, {0x13C, 0x13B}, {0x13E, 0x13D}, {0x140, 0x13F}, + {0x142, 0x141}, {0x144, 0x143}, {0x146, 0x145}, {0x148, 0x147}, {0x14B, 0x14A}, {0x14D, 0x14C}, + {0x14F, 0x14E}, {0x151, 0x150}, {0x153, 0x152}, {0x155, 0x154}, {0x157, 0x156}, {0x159, 0x158}, + {0x15B, 0x15A}, {0x15D, 0x15C}, {0x15F, 0x15E}, {0x161, 0x160}, {0x163, 0x162}, {0x165, 0x164}, + {0x167, 0x166}, {0x169, 0x168}, {0x16B, 0x16A}, {0x16D, 0x16C}, {0x16F, 0x16E}, {0x171, 0x170}, + {0x173, 0x172}, {0x175, 0x174}, {0x177, 0x176}, {0x17A, 0x179}, {0x17C, 0x17B}, {0x17E, 0x17D}, + {0x17F, 0x53}, {0x180, 0x243}, {0x183, 0x182}, {0x185, 0x184}, {0x188, 0x187}, {0x18C, 0x18B}, + {0x192, 0x191}, {0x195, 0x1F6}, {0x199, 0x198}, {0x19A, 0x23D}, {0x19E, 0x220}, {0x1A1, 0x1A0}, + {0x1A3, 0x1A2}, {0x1A5, 0x1A4}, {0x1A8, 0x1A7}, {0x1AD, 0x1AC}, {0x1B0, 0x1AF}, {0x1B4, 0x1B3}, + {0x1B6, 0x1B5}, {0x1B9, 0x1B8}, {0x1BD, 0x1BC}, {0x1BF, 0x1F7}, {0x1C4, 0x1C5}, {0x1C6, 0x1C5}, + {0x1C7, 0x1C8}, {0x1C9, 0x1C8}, {0x1CA, 0x1CB}, {0x1CC, 0x1CB}, {0x1CE, 0x1CD}, {0x1D0, 0x1CF}, + {0x1D2, 0x1D1}, {0x1D4, 0x1D3}, {0x1D6, 0x1D5}, {0x1D8, 0x1D7}, {0x1DA, 0x1D9}, {0x1DC, 0x1DB}, + {0x1DD, 0x18E}, {0x1DF, 0x1DE}, {0x1E1, 0x1E0}, {0x1E3, 0x1E2}, {0x1E5, 0x1E4}, {0x1E7, 0x1E6}, + {0x1E9, 0x1E8}, {0x1EB, 0x1EA}, {0x1ED, 0x1EC}, {0x1EF, 0x1EE}, {0x1F1, 0x1F2}, {0x1F3, 0x1F2}, + {0x1F5, 0x1F4}, {0x1F9, 0x1F8}, {0x1FB, 0x1FA}, {0x1FD, 0x1FC}, {0x1FF, 0x1FE}, {0x201, 0x200}, + {0x203, 0x202}, {0x205, 0x204}, {0x207, 0x206}, {0x209, 0x208}, {0x20B, 0x20A}, {0x20D, 0x20C}, + {0x20F, 0x20E}, {0x211, 0x210}, {0x213, 0x212}, {0x215, 0x214}, {0x217, 0x216}, {0x219, 0x218}, + {0x21B, 0x21A}, {0x21D, 0x21C}, {0x21F, 0x21E}, {0x223, 0x222}, {0x225, 0x224}, {0x227, 0x226}, + {0x229, 0x228}, {0x22B, 0x22A}, {0x22D, 0x22C}, {0x22F, 0x22E}, {0x231, 0x230}, {0x233, 0x232}, + {0x23C, 0x23B}, {0x23F, 0x2C7E}, {0x240, 0x2C7F}, {0x242, 0x241}, {0x247, 0x246}, {0x249, 0x248}, + {0x24B, 0x24A}, {0x24D, 0x24C}, {0x24F, 0x24E}, {0x250, 0x2C6F}, {0x251, 0x2C6D}, {0x252, 0x2C70}, + {0x253, 0x181}, {0x254, 0x186}, {0x256, 0x189}, {0x257, 0x18A}, {0x259, 0x18F}, {0x25B, 0x190}, + {0x25C, 0xA7AB}, {0x260, 0x193}, {0x261, 0xA7AC}, {0x263, 0x194}, {0x265, 0xA78D}, {0x266, 0xA7AA}, + {0x268, 0x197}, {0x269, 0x196}, {0x26A, 0xA7AE}, {0x26B, 0x2C62}, {0x26C, 0xA7AD}, {0x26F, 0x19C}, + {0x271, 0x2C6E}, {0x272, 0x19D}, {0x275, 0x19F}, {0x27D, 0x2C64}, {0x280, 0x1A6}, {0x282, 0xA7C5}, + {0x283, 0x1A9}, {0x287, 0xA7B1}, {0x288, 0x1AE}, {0x289, 0x244}, {0x28A, 0x1B1}, {0x28B, 0x1B2}, + {0x28C, 0x245}, {0x292, 0x1B7}, {0x29D, 0xA7B2}, {0x29E, 0xA7B0}, {0x345, 0x399}, {0x371, 0x370}, + {0x373, 0x372}, {0x377, 0x376}, {0x37B, 0x3FD}, {0x37C, 0x3FE}, {0x37D, 0x3FF}, {0x3AC, 0x386}, + {0x3AD, 0x388}, {0x3AE, 0x389}, {0x3AF, 0x38A}, {0x3B1, 0x391}, {0x3B2, 0x392}, {0x3B3, 0x393}, + {0x3B4, 0x394}, {0x3B5, 0x395}, {0x3B6, 0x396}, {0x3B7, 0x397}, {0x3B8, 0x398}, {0x3B9, 0x399}, + {0x3BA, 0x39A}, {0x3BB, 0x39B}, {0x3BC, 0x39C}, {0x3BD, 0x39D}, {0x3BE, 0x39E}, {0x3BF, 0x39F}, + {0x3C0, 0x3A0}, {0x3C1, 0x3A1}, {0x3C2, 0x3A3}, {0x3C3, 0x3A3}, {0x3C4, 0x3A4}, {0x3C5, 0x3A5}, + {0x3C6, 0x3A6}, {0x3C7, 0x3A7}, {0x3C8, 0x3A8}, {0x3C9, 0x3A9}, {0x3CA, 0x3AA}, {0x3CB, 0x3AB}, + {0x3CC, 0x38C}, {0x3CD, 0x38E}, {0x3CE, 0x38F}, {0x3D0, 0x392}, {0x3D1, 0x398}, {0x3D5, 0x3A6}, + {0x3D6, 0x3A0}, {0x3D7, 0x3CF}, {0x3D9, 0x3D8}, {0x3DB, 0x3DA}, {0x3DD, 0x3DC}, {0x3DF, 0x3DE}, + {0x3E1, 0x3E0}, {0x3E3, 0x3E2}, {0x3E5, 0x3E4}, {0x3E7, 0x3E6}, {0x3E9, 0x3E8}, {0x3EB, 0x3EA}, + {0x3ED, 0x3EC}, {0x3EF, 0x3EE}, {0x3F0, 0x39A}, {0x3F1, 0x3A1}, {0x3F2, 0x3F9}, {0x3F3, 0x37F}, + {0x3F5, 0x395}, {0x3F8, 0x3F7}, {0x3FB, 0x3FA}, {0x430, 0x410}, {0x431, 0x411}, {0x432, 0x412}, + {0x433, 0x413}, {0x434, 0x414}, {0x435, 0x415}, {0x436, 0x416}, {0x437, 0x417}, {0x438, 0x418}, + {0x439, 0x419}, {0x43A, 0x41A}, {0x43B, 0x41B}, {0x43C, 0x41C}, {0x43D, 0x41D}, {0x43E, 0x41E}, + {0x43F, 0x41F}, {0x440, 0x420}, {0x441, 0x421}, {0x442, 0x422}, {0x443, 0x423}, {0x444, 0x424}, + {0x445, 0x425}, {0x446, 0x426}, {0x447, 0x427}, {0x448, 0x428}, {0x449, 0x429}, {0x44A, 0x42A}, + {0x44B, 0x42B}, {0x44C, 0x42C}, {0x44D, 0x42D}, {0x44E, 0x42E}, {0x44F, 0x42F}, {0x450, 0x400}, + {0x451, 0x401}, {0x452, 0x402}, {0x453, 0x403}, {0x454, 0x404}, {0x455, 0x405}, {0x456, 0x406}, + {0x457, 0x407}, {0x458, 0x408}, {0x459, 0x409}, {0x45A, 0x40A}, {0x45B, 0x40B}, {0x45C, 0x40C}, + {0x45D, 0x40D}, {0x45E, 0x40E}, {0x45F, 0x40F}, {0x461, 0x460}, {0x463, 0x462}, {0x465, 0x464}, + {0x467, 0x466}, {0x469, 0x468}, {0x46B, 0x46A}, {0x46D, 0x46C}, {0x46F, 0x46E}, {0x471, 0x470}, + {0x473, 0x472}, {0x475, 0x474}, {0x477, 0x476}, {0x479, 0x478}, {0x47B, 0x47A}, {0x47D, 0x47C}, + {0x47F, 0x47E}, {0x481, 0x480}, {0x48B, 0x48A}, {0x48D, 0x48C}, {0x48F, 0x48E}, {0x491, 0x490}, + {0x493, 0x492}, {0x495, 0x494}, {0x497, 0x496}, {0x499, 0x498}, {0x49B, 0x49A}, {0x49D, 0x49C}, + {0x49F, 0x49E}, {0x4A1, 0x4A0}, {0x4A3, 0x4A2}, {0x4A5, 0x4A4}, {0x4A7, 0x4A6}, {0x4A9, 0x4A8}, + {0x4AB, 0x4AA}, {0x4AD, 0x4AC}, {0x4AF, 0x4AE}, {0x4B1, 0x4B0}, {0x4B3, 0x4B2}, {0x4B5, 0x4B4}, + {0x4B7, 0x4B6}, {0x4B9, 0x4B8}, {0x4BB, 0x4BA}, {0x4BD, 0x4BC}, {0x4BF, 0x4BE}, {0x4C2, 0x4C1}, + {0x4C4, 0x4C3}, {0x4C6, 0x4C5}, {0x4C8, 0x4C7}, {0x4CA, 0x4C9}, {0x4CC, 0x4CB}, {0x4CE, 0x4CD}, + {0x4CF, 0x4C0}, {0x4D1, 0x4D0}, {0x4D3, 0x4D2}, {0x4D5, 0x4D4}, {0x4D7, 0x4D6}, {0x4D9, 0x4D8}, + {0x4DB, 0x4DA}, {0x4DD, 0x4DC}, {0x4DF, 0x4DE}, {0x4E1, 0x4E0}, {0x4E3, 0x4E2}, {0x4E5, 0x4E4}, + {0x4E7, 0x4E6}, {0x4E9, 0x4E8}, {0x4EB, 0x4EA}, {0x4ED, 0x4EC}, {0x4EF, 0x4EE}, {0x4F1, 0x4F0}, + {0x4F3, 0x4F2}, {0x4F5, 0x4F4}, {0x4F7, 0x4F6}, {0x4F9, 0x4F8}, {0x4FB, 0x4FA}, {0x4FD, 0x4FC}, + {0x4FF, 0x4FE}, {0x501, 0x500}, {0x503, 0x502}, {0x505, 0x504}, {0x507, 0x506}, {0x509, 0x508}, + {0x50B, 0x50A}, {0x50D, 0x50C}, {0x50F, 0x50E}, {0x511, 0x510}, {0x513, 0x512}, {0x515, 0x514}, + {0x517, 0x516}, {0x519, 0x518}, {0x51B, 0x51A}, {0x51D, 0x51C}, {0x51F, 0x51E}, {0x521, 0x520}, + {0x523, 0x522}, {0x525, 0x524}, {0x527, 0x526}, {0x529, 0x528}, {0x52B, 0x52A}, {0x52D, 0x52C}, + {0x52F, 0x52E}, {0x561, 0x531}, {0x562, 0x532}, {0x563, 0x533}, {0x564, 0x534}, {0x565, 0x535}, + {0x566, 0x536}, {0x567, 0x537}, {0x568, 0x538}, {0x569, 0x539}, {0x56A, 0x53A}, {0x56B, 0x53B}, + {0x56C, 0x53C}, {0x56D, 0x53D}, {0x56E, 0x53E}, {0x56F, 0x53F}, {0x570, 0x540}, {0x571, 0x541}, + {0x572, 0x542}, {0x573, 0x543}, {0x574, 0x544}, {0x575, 0x545}, {0x576, 0x546}, {0x577, 0x547}, + {0x578, 0x548}, {0x579, 0x549}, {0x57A, 0x54A}, {0x57B, 0x54B}, {0x57C, 0x54C}, {0x57D, 0x54D}, + {0x57E, 0x54E}, {0x57F, 0x54F}, {0x580, 0x550}, {0x581, 0x551}, {0x582, 0x552}, {0x583, 0x553}, + {0x584, 0x554}, {0x585, 0x555}, {0x586, 0x556}, {0x13F8, 0x13F0}, {0x13F9, 0x13F1}, {0x13FA, 0x13F2}, + {0x13FB, 0x13F3}, {0x13FC, 0x13F4}, {0x13FD, 0x13F5}, {0x1C80, 0x412}, {0x1C81, 0x414}, {0x1C82, 0x41E}, + {0x1C83, 0x421}, {0x1C84, 0x422}, {0x1C85, 0x422}, {0x1C86, 0x42A}, {0x1C87, 0x462}, {0x1C88, 0xA64A}, + {0x1D79, 0xA77D}, {0x1D7D, 0x2C63}, {0x1D8E, 0xA7C6}, {0x1E01, 0x1E00}, {0x1E03, 0x1E02}, {0x1E05, 0x1E04}, + {0x1E07, 0x1E06}, {0x1E09, 0x1E08}, {0x1E0B, 0x1E0A}, {0x1E0D, 0x1E0C}, {0x1E0F, 0x1E0E}, {0x1E11, 0x1E10}, + {0x1E13, 0x1E12}, {0x1E15, 0x1E14}, {0x1E17, 0x1E16}, {0x1E19, 0x1E18}, {0x1E1B, 0x1E1A}, {0x1E1D, 0x1E1C}, + {0x1E1F, 0x1E1E}, {0x1E21, 0x1E20}, {0x1E23, 0x1E22}, {0x1E25, 0x1E24}, {0x1E27, 0x1E26}, {0x1E29, 0x1E28}, + {0x1E2B, 0x1E2A}, {0x1E2D, 0x1E2C}, {0x1E2F, 0x1E2E}, {0x1E31, 0x1E30}, {0x1E33, 0x1E32}, {0x1E35, 0x1E34}, + {0x1E37, 0x1E36}, {0x1E39, 0x1E38}, {0x1E3B, 0x1E3A}, {0x1E3D, 0x1E3C}, {0x1E3F, 0x1E3E}, {0x1E41, 0x1E40}, + {0x1E43, 0x1E42}, {0x1E45, 0x1E44}, {0x1E47, 0x1E46}, {0x1E49, 0x1E48}, {0x1E4B, 0x1E4A}, {0x1E4D, 0x1E4C}, + {0x1E4F, 0x1E4E}, {0x1E51, 0x1E50}, {0x1E53, 0x1E52}, {0x1E55, 0x1E54}, {0x1E57, 0x1E56}, {0x1E59, 0x1E58}, + {0x1E5B, 0x1E5A}, {0x1E5D, 0x1E5C}, {0x1E5F, 0x1E5E}, {0x1E61, 0x1E60}, {0x1E63, 0x1E62}, {0x1E65, 0x1E64}, + {0x1E67, 0x1E66}, {0x1E69, 0x1E68}, {0x1E6B, 0x1E6A}, {0x1E6D, 0x1E6C}, {0x1E6F, 0x1E6E}, {0x1E71, 0x1E70}, + {0x1E73, 0x1E72}, {0x1E75, 0x1E74}, {0x1E77, 0x1E76}, {0x1E79, 0x1E78}, {0x1E7B, 0x1E7A}, {0x1E7D, 0x1E7C}, + {0x1E7F, 0x1E7E}, {0x1E81, 0x1E80}, {0x1E83, 0x1E82}, {0x1E85, 0x1E84}, {0x1E87, 0x1E86}, {0x1E89, 0x1E88}, + {0x1E8B, 0x1E8A}, {0x1E8D, 0x1E8C}, {0x1E8F, 0x1E8E}, {0x1E91, 0x1E90}, {0x1E93, 0x1E92}, {0x1E95, 0x1E94}, + {0x1E9B, 0x1E60}, {0x1EA1, 0x1EA0}, {0x1EA3, 0x1EA2}, {0x1EA5, 0x1EA4}, {0x1EA7, 0x1EA6}, {0x1EA9, 0x1EA8}, + {0x1EAB, 0x1EAA}, {0x1EAD, 0x1EAC}, {0x1EAF, 0x1EAE}, {0x1EB1, 0x1EB0}, {0x1EB3, 0x1EB2}, {0x1EB5, 0x1EB4}, + {0x1EB7, 0x1EB6}, {0x1EB9, 0x1EB8}, {0x1EBB, 0x1EBA}, {0x1EBD, 0x1EBC}, {0x1EBF, 0x1EBE}, {0x1EC1, 0x1EC0}, + {0x1EC3, 0x1EC2}, {0x1EC5, 0x1EC4}, {0x1EC7, 0x1EC6}, {0x1EC9, 0x1EC8}, {0x1ECB, 0x1ECA}, {0x1ECD, 0x1ECC}, + {0x1ECF, 0x1ECE}, {0x1ED1, 0x1ED0}, {0x1ED3, 0x1ED2}, {0x1ED5, 0x1ED4}, {0x1ED7, 0x1ED6}, {0x1ED9, 0x1ED8}, + {0x1EDB, 0x1EDA}, {0x1EDD, 0x1EDC}, {0x1EDF, 0x1EDE}, {0x1EE1, 0x1EE0}, {0x1EE3, 0x1EE2}, {0x1EE5, 0x1EE4}, + {0x1EE7, 0x1EE6}, {0x1EE9, 0x1EE8}, {0x1EEB, 0x1EEA}, {0x1EED, 0x1EEC}, {0x1EEF, 0x1EEE}, {0x1EF1, 0x1EF0}, + {0x1EF3, 0x1EF2}, {0x1EF5, 0x1EF4}, {0x1EF7, 0x1EF6}, {0x1EF9, 0x1EF8}, {0x1EFB, 0x1EFA}, {0x1EFD, 0x1EFC}, + {0x1EFF, 0x1EFE}, {0x1F00, 0x1F08}, {0x1F01, 0x1F09}, {0x1F02, 0x1F0A}, {0x1F03, 0x1F0B}, {0x1F04, 0x1F0C}, + {0x1F05, 0x1F0D}, {0x1F06, 0x1F0E}, {0x1F07, 0x1F0F}, {0x1F10, 0x1F18}, {0x1F11, 0x1F19}, {0x1F12, 0x1F1A}, + {0x1F13, 0x1F1B}, {0x1F14, 0x1F1C}, {0x1F15, 0x1F1D}, {0x1F20, 0x1F28}, {0x1F21, 0x1F29}, {0x1F22, 0x1F2A}, + {0x1F23, 0x1F2B}, {0x1F24, 0x1F2C}, {0x1F25, 0x1F2D}, {0x1F26, 0x1F2E}, {0x1F27, 0x1F2F}, {0x1F30, 0x1F38}, + {0x1F31, 0x1F39}, {0x1F32, 0x1F3A}, {0x1F33, 0x1F3B}, {0x1F34, 0x1F3C}, {0x1F35, 0x1F3D}, {0x1F36, 0x1F3E}, + {0x1F37, 0x1F3F}, {0x1F40, 0x1F48}, {0x1F41, 0x1F49}, {0x1F42, 0x1F4A}, {0x1F43, 0x1F4B}, {0x1F44, 0x1F4C}, + {0x1F45, 0x1F4D}, {0x1F51, 0x1F59}, {0x1F53, 0x1F5B}, {0x1F55, 0x1F5D}, {0x1F57, 0x1F5F}, {0x1F60, 0x1F68}, + {0x1F61, 0x1F69}, {0x1F62, 0x1F6A}, {0x1F63, 0x1F6B}, {0x1F64, 0x1F6C}, {0x1F65, 0x1F6D}, {0x1F66, 0x1F6E}, + {0x1F67, 0x1F6F}, {0x1F70, 0x1FBA}, {0x1F71, 0x1FBB}, {0x1F72, 0x1FC8}, {0x1F73, 0x1FC9}, {0x1F74, 0x1FCA}, + {0x1F75, 0x1FCB}, {0x1F76, 0x1FDA}, {0x1F77, 0x1FDB}, {0x1F78, 0x1FF8}, {0x1F79, 0x1FF9}, {0x1F7A, 0x1FEA}, + {0x1F7B, 0x1FEB}, {0x1F7C, 0x1FFA}, {0x1F7D, 0x1FFB}, {0x1F80, 0x1F88}, {0x1F81, 0x1F89}, {0x1F82, 0x1F8A}, + {0x1F83, 0x1F8B}, {0x1F84, 0x1F8C}, {0x1F85, 0x1F8D}, {0x1F86, 0x1F8E}, {0x1F87, 0x1F8F}, {0x1F90, 0x1F98}, + {0x1F91, 0x1F99}, {0x1F92, 0x1F9A}, {0x1F93, 0x1F9B}, {0x1F94, 0x1F9C}, {0x1F95, 0x1F9D}, {0x1F96, 0x1F9E}, + {0x1F97, 0x1F9F}, {0x1FA0, 0x1FA8}, {0x1FA1, 0x1FA9}, {0x1FA2, 0x1FAA}, {0x1FA3, 0x1FAB}, {0x1FA4, 0x1FAC}, + {0x1FA5, 0x1FAD}, {0x1FA6, 0x1FAE}, {0x1FA7, 0x1FAF}, {0x1FB0, 0x1FB8}, {0x1FB1, 0x1FB9}, {0x1FB3, 0x1FBC}, + {0x1FBE, 0x399}, {0x1FC3, 0x1FCC}, {0x1FD0, 0x1FD8}, {0x1FD1, 0x1FD9}, {0x1FE0, 0x1FE8}, {0x1FE1, 0x1FE9}, + {0x1FE5, 0x1FEC}, {0x1FF3, 0x1FFC}, {0x214E, 0x2132}, {0x2170, 0x2160}, {0x2171, 0x2161}, {0x2172, 0x2162}, + {0x2173, 0x2163}, {0x2174, 0x2164}, {0x2175, 0x2165}, {0x2176, 0x2166}, {0x2177, 0x2167}, {0x2178, 0x2168}, + {0x2179, 0x2169}, {0x217A, 0x216A}, {0x217B, 0x216B}, {0x217C, 0x216C}, {0x217D, 0x216D}, {0x217E, 0x216E}, + {0x217F, 0x216F}, {0x2184, 0x2183}, {0x24D0, 0x24B6}, {0x24D1, 0x24B7}, {0x24D2, 0x24B8}, {0x24D3, 0x24B9}, + {0x24D4, 0x24BA}, {0x24D5, 0x24BB}, {0x24D6, 0x24BC}, {0x24D7, 0x24BD}, {0x24D8, 0x24BE}, {0x24D9, 0x24BF}, + {0x24DA, 0x24C0}, {0x24DB, 0x24C1}, {0x24DC, 0x24C2}, {0x24DD, 0x24C3}, {0x24DE, 0x24C4}, {0x24DF, 0x24C5}, + {0x24E0, 0x24C6}, {0x24E1, 0x24C7}, {0x24E2, 0x24C8}, {0x24E3, 0x24C9}, {0x24E4, 0x24CA}, {0x24E5, 0x24CB}, + {0x24E6, 0x24CC}, {0x24E7, 0x24CD}, {0x24E8, 0x24CE}, {0x24E9, 0x24CF}, {0x2C30, 0x2C00}, {0x2C31, 0x2C01}, + {0x2C32, 0x2C02}, {0x2C33, 0x2C03}, {0x2C34, 0x2C04}, {0x2C35, 0x2C05}, {0x2C36, 0x2C06}, {0x2C37, 0x2C07}, + {0x2C38, 0x2C08}, {0x2C39, 0x2C09}, {0x2C3A, 0x2C0A}, {0x2C3B, 0x2C0B}, {0x2C3C, 0x2C0C}, {0x2C3D, 0x2C0D}, + {0x2C3E, 0x2C0E}, {0x2C3F, 0x2C0F}, {0x2C40, 0x2C10}, {0x2C41, 0x2C11}, {0x2C42, 0x2C12}, {0x2C43, 0x2C13}, + {0x2C44, 0x2C14}, {0x2C45, 0x2C15}, {0x2C46, 0x2C16}, {0x2C47, 0x2C17}, {0x2C48, 0x2C18}, {0x2C49, 0x2C19}, + {0x2C4A, 0x2C1A}, {0x2C4B, 0x2C1B}, {0x2C4C, 0x2C1C}, {0x2C4D, 0x2C1D}, {0x2C4E, 0x2C1E}, {0x2C4F, 0x2C1F}, + {0x2C50, 0x2C20}, {0x2C51, 0x2C21}, {0x2C52, 0x2C22}, {0x2C53, 0x2C23}, {0x2C54, 0x2C24}, {0x2C55, 0x2C25}, + {0x2C56, 0x2C26}, {0x2C57, 0x2C27}, {0x2C58, 0x2C28}, {0x2C59, 0x2C29}, {0x2C5A, 0x2C2A}, {0x2C5B, 0x2C2B}, + {0x2C5C, 0x2C2C}, {0x2C5D, 0x2C2D}, {0x2C5E, 0x2C2E}, {0x2C5F, 0x2C2F}, {0x2C61, 0x2C60}, {0x2C65, 0x23A}, + {0x2C66, 0x23E}, {0x2C68, 0x2C67}, {0x2C6A, 0x2C69}, {0x2C6C, 0x2C6B}, {0x2C73, 0x2C72}, {0x2C76, 0x2C75}, + {0x2C81, 0x2C80}, {0x2C83, 0x2C82}, {0x2C85, 0x2C84}, {0x2C87, 0x2C86}, {0x2C89, 0x2C88}, {0x2C8B, 0x2C8A}, + {0x2C8D, 0x2C8C}, {0x2C8F, 0x2C8E}, {0x2C91, 0x2C90}, {0x2C93, 0x2C92}, {0x2C95, 0x2C94}, {0x2C97, 0x2C96}, + {0x2C99, 0x2C98}, {0x2C9B, 0x2C9A}, {0x2C9D, 0x2C9C}, {0x2C9F, 0x2C9E}, {0x2CA1, 0x2CA0}, {0x2CA3, 0x2CA2}, + {0x2CA5, 0x2CA4}, {0x2CA7, 0x2CA6}, {0x2CA9, 0x2CA8}, {0x2CAB, 0x2CAA}, {0x2CAD, 0x2CAC}, {0x2CAF, 0x2CAE}, + {0x2CB1, 0x2CB0}, {0x2CB3, 0x2CB2}, {0x2CB5, 0x2CB4}, {0x2CB7, 0x2CB6}, {0x2CB9, 0x2CB8}, {0x2CBB, 0x2CBA}, + {0x2CBD, 0x2CBC}, {0x2CBF, 0x2CBE}, {0x2CC1, 0x2CC0}, {0x2CC3, 0x2CC2}, {0x2CC5, 0x2CC4}, {0x2CC7, 0x2CC6}, + {0x2CC9, 0x2CC8}, {0x2CCB, 0x2CCA}, {0x2CCD, 0x2CCC}, {0x2CCF, 0x2CCE}, {0x2CD1, 0x2CD0}, {0x2CD3, 0x2CD2}, + {0x2CD5, 0x2CD4}, {0x2CD7, 0x2CD6}, {0x2CD9, 0x2CD8}, {0x2CDB, 0x2CDA}, {0x2CDD, 0x2CDC}, {0x2CDF, 0x2CDE}, + {0x2CE1, 0x2CE0}, {0x2CE3, 0x2CE2}, {0x2CEC, 0x2CEB}, {0x2CEE, 0x2CED}, {0x2CF3, 0x2CF2}, {0x2D00, 0x10A0}, + {0x2D01, 0x10A1}, {0x2D02, 0x10A2}, {0x2D03, 0x10A3}, {0x2D04, 0x10A4}, {0x2D05, 0x10A5}, {0x2D06, 0x10A6}, + {0x2D07, 0x10A7}, {0x2D08, 0x10A8}, {0x2D09, 0x10A9}, {0x2D0A, 0x10AA}, {0x2D0B, 0x10AB}, {0x2D0C, 0x10AC}, + {0x2D0D, 0x10AD}, {0x2D0E, 0x10AE}, {0x2D0F, 0x10AF}, {0x2D10, 0x10B0}, {0x2D11, 0x10B1}, {0x2D12, 0x10B2}, + {0x2D13, 0x10B3}, {0x2D14, 0x10B4}, {0x2D15, 0x10B5}, {0x2D16, 0x10B6}, {0x2D17, 0x10B7}, {0x2D18, 0x10B8}, + {0x2D19, 0x10B9}, {0x2D1A, 0x10BA}, {0x2D1B, 0x10BB}, {0x2D1C, 0x10BC}, {0x2D1D, 0x10BD}, {0x2D1E, 0x10BE}, + {0x2D1F, 0x10BF}, {0x2D20, 0x10C0}, {0x2D21, 0x10C1}, {0x2D22, 0x10C2}, {0x2D23, 0x10C3}, {0x2D24, 0x10C4}, + {0x2D25, 0x10C5}, {0x2D27, 0x10C7}, {0x2D2D, 0x10CD}, {0xA641, 0xA640}, {0xA643, 0xA642}, {0xA645, 0xA644}, + {0xA647, 0xA646}, {0xA649, 0xA648}, {0xA64B, 0xA64A}, {0xA64D, 0xA64C}, {0xA64F, 0xA64E}, {0xA651, 0xA650}, + {0xA653, 0xA652}, {0xA655, 0xA654}, {0xA657, 0xA656}, {0xA659, 0xA658}, {0xA65B, 0xA65A}, {0xA65D, 0xA65C}, + {0xA65F, 0xA65E}, {0xA661, 0xA660}, {0xA663, 0xA662}, {0xA665, 0xA664}, {0xA667, 0xA666}, {0xA669, 0xA668}, + {0xA66B, 0xA66A}, {0xA66D, 0xA66C}, {0xA681, 0xA680}, {0xA683, 0xA682}, {0xA685, 0xA684}, {0xA687, 0xA686}, + {0xA689, 0xA688}, {0xA68B, 0xA68A}, {0xA68D, 0xA68C}, {0xA68F, 0xA68E}, {0xA691, 0xA690}, {0xA693, 0xA692}, + {0xA695, 0xA694}, {0xA697, 0xA696}, {0xA699, 0xA698}, {0xA69B, 0xA69A}, {0xA723, 0xA722}, {0xA725, 0xA724}, + {0xA727, 0xA726}, {0xA729, 0xA728}, {0xA72B, 0xA72A}, {0xA72D, 0xA72C}, {0xA72F, 0xA72E}, {0xA733, 0xA732}, + {0xA735, 0xA734}, {0xA737, 0xA736}, {0xA739, 0xA738}, {0xA73B, 0xA73A}, {0xA73D, 0xA73C}, {0xA73F, 0xA73E}, + {0xA741, 0xA740}, {0xA743, 0xA742}, {0xA745, 0xA744}, {0xA747, 0xA746}, {0xA749, 0xA748}, {0xA74B, 0xA74A}, + {0xA74D, 0xA74C}, {0xA74F, 0xA74E}, {0xA751, 0xA750}, {0xA753, 0xA752}, {0xA755, 0xA754}, {0xA757, 0xA756}, + {0xA759, 0xA758}, {0xA75B, 0xA75A}, {0xA75D, 0xA75C}, {0xA75F, 0xA75E}, {0xA761, 0xA760}, {0xA763, 0xA762}, + {0xA765, 0xA764}, {0xA767, 0xA766}, {0xA769, 0xA768}, {0xA76B, 0xA76A}, {0xA76D, 0xA76C}, {0xA76F, 0xA76E}, + {0xA77A, 0xA779}, {0xA77C, 0xA77B}, {0xA77F, 0xA77E}, {0xA781, 0xA780}, {0xA783, 0xA782}, {0xA785, 0xA784}, + {0xA787, 0xA786}, {0xA78C, 0xA78B}, {0xA791, 0xA790}, {0xA793, 0xA792}, {0xA794, 0xA7C4}, {0xA797, 0xA796}, + {0xA799, 0xA798}, {0xA79B, 0xA79A}, {0xA79D, 0xA79C}, {0xA79F, 0xA79E}, {0xA7A1, 0xA7A0}, {0xA7A3, 0xA7A2}, + {0xA7A5, 0xA7A4}, {0xA7A7, 0xA7A6}, {0xA7A9, 0xA7A8}, {0xA7B5, 0xA7B4}, {0xA7B7, 0xA7B6}, {0xA7B9, 0xA7B8}, + {0xA7BB, 0xA7BA}, {0xA7BD, 0xA7BC}, {0xA7BF, 0xA7BE}, {0xA7C1, 0xA7C0}, {0xA7C3, 0xA7C2}, {0xA7C8, 0xA7C7}, + {0xA7CA, 0xA7C9}, {0xA7D1, 0xA7D0}, {0xA7D7, 0xA7D6}, {0xA7D9, 0xA7D8}, {0xA7F6, 0xA7F5}, {0xAB53, 0xA7B3}, + {0xAB70, 0x13A0}, {0xAB71, 0x13A1}, {0xAB72, 0x13A2}, {0xAB73, 0x13A3}, {0xAB74, 0x13A4}, {0xAB75, 0x13A5}, + {0xAB76, 0x13A6}, {0xAB77, 0x13A7}, {0xAB78, 0x13A8}, {0xAB79, 0x13A9}, {0xAB7A, 0x13AA}, {0xAB7B, 0x13AB}, + {0xAB7C, 0x13AC}, {0xAB7D, 0x13AD}, {0xAB7E, 0x13AE}, {0xAB7F, 0x13AF}, {0xAB80, 0x13B0}, {0xAB81, 0x13B1}, + {0xAB82, 0x13B2}, {0xAB83, 0x13B3}, {0xAB84, 0x13B4}, {0xAB85, 0x13B5}, {0xAB86, 0x13B6}, {0xAB87, 0x13B7}, + {0xAB88, 0x13B8}, {0xAB89, 0x13B9}, {0xAB8A, 0x13BA}, {0xAB8B, 0x13BB}, {0xAB8C, 0x13BC}, {0xAB8D, 0x13BD}, + {0xAB8E, 0x13BE}, {0xAB8F, 0x13BF}, {0xAB90, 0x13C0}, {0xAB91, 0x13C1}, {0xAB92, 0x13C2}, {0xAB93, 0x13C3}, + {0xAB94, 0x13C4}, {0xAB95, 0x13C5}, {0xAB96, 0x13C6}, {0xAB97, 0x13C7}, {0xAB98, 0x13C8}, {0xAB99, 0x13C9}, + {0xAB9A, 0x13CA}, {0xAB9B, 0x13CB}, {0xAB9C, 0x13CC}, {0xAB9D, 0x13CD}, {0xAB9E, 0x13CE}, {0xAB9F, 0x13CF}, + {0xABA0, 0x13D0}, {0xABA1, 0x13D1}, {0xABA2, 0x13D2}, {0xABA3, 0x13D3}, {0xABA4, 0x13D4}, {0xABA5, 0x13D5}, + {0xABA6, 0x13D6}, {0xABA7, 0x13D7}, {0xABA8, 0x13D8}, {0xABA9, 0x13D9}, {0xABAA, 0x13DA}, {0xABAB, 0x13DB}, + {0xABAC, 0x13DC}, {0xABAD, 0x13DD}, {0xABAE, 0x13DE}, {0xABAF, 0x13DF}, {0xABB0, 0x13E0}, {0xABB1, 0x13E1}, + {0xABB2, 0x13E2}, {0xABB3, 0x13E3}, {0xABB4, 0x13E4}, {0xABB5, 0x13E5}, {0xABB6, 0x13E6}, {0xABB7, 0x13E7}, + {0xABB8, 0x13E8}, {0xABB9, 0x13E9}, {0xABBA, 0x13EA}, {0xABBB, 0x13EB}, {0xABBC, 0x13EC}, {0xABBD, 0x13ED}, + {0xABBE, 0x13EE}, {0xABBF, 0x13EF}, {0xFF41, 0xFF21}, {0xFF42, 0xFF22}, {0xFF43, 0xFF23}, {0xFF44, 0xFF24}, + {0xFF45, 0xFF25}, {0xFF46, 0xFF26}, {0xFF47, 0xFF27}, {0xFF48, 0xFF28}, {0xFF49, 0xFF29}, {0xFF4A, 0xFF2A}, + {0xFF4B, 0xFF2B}, {0xFF4C, 0xFF2C}, {0xFF4D, 0xFF2D}, {0xFF4E, 0xFF2E}, {0xFF4F, 0xFF2F}, {0xFF50, 0xFF30}, + {0xFF51, 0xFF31}, {0xFF52, 0xFF32}, {0xFF53, 0xFF33}, {0xFF54, 0xFF34}, {0xFF55, 0xFF35}, {0xFF56, 0xFF36}, + {0xFF57, 0xFF37}, {0xFF58, 0xFF38}, {0xFF59, 0xFF39}, {0xFF5A, 0xFF3A}, {0x10428, 0x10400}, {0x10429, 0x10401}, + {0x1042A, 0x10402}, {0x1042B, 0x10403}, {0x1042C, 0x10404}, {0x1042D, 0x10405}, {0x1042E, 0x10406}, {0x1042F, 0x10407}, + {0x10430, 0x10408}, {0x10431, 0x10409}, {0x10432, 0x1040A}, {0x10433, 0x1040B}, {0x10434, 0x1040C}, {0x10435, 0x1040D}, + {0x10436, 0x1040E}, {0x10437, 0x1040F}, {0x10438, 0x10410}, {0x10439, 0x10411}, {0x1043A, 0x10412}, {0x1043B, 0x10413}, + {0x1043C, 0x10414}, {0x1043D, 0x10415}, {0x1043E, 0x10416}, {0x1043F, 0x10417}, {0x10440, 0x10418}, {0x10441, 0x10419}, + {0x10442, 0x1041A}, {0x10443, 0x1041B}, {0x10444, 0x1041C}, {0x10445, 0x1041D}, {0x10446, 0x1041E}, {0x10447, 0x1041F}, + {0x10448, 0x10420}, {0x10449, 0x10421}, {0x1044A, 0x10422}, {0x1044B, 0x10423}, {0x1044C, 0x10424}, {0x1044D, 0x10425}, + {0x1044E, 0x10426}, {0x1044F, 0x10427}, {0x104D8, 0x104B0}, {0x104D9, 0x104B1}, {0x104DA, 0x104B2}, {0x104DB, 0x104B3}, + {0x104DC, 0x104B4}, {0x104DD, 0x104B5}, {0x104DE, 0x104B6}, {0x104DF, 0x104B7}, {0x104E0, 0x104B8}, {0x104E1, 0x104B9}, + {0x104E2, 0x104BA}, {0x104E3, 0x104BB}, {0x104E4, 0x104BC}, {0x104E5, 0x104BD}, {0x104E6, 0x104BE}, {0x104E7, 0x104BF}, + {0x104E8, 0x104C0}, {0x104E9, 0x104C1}, {0x104EA, 0x104C2}, {0x104EB, 0x104C3}, {0x104EC, 0x104C4}, {0x104ED, 0x104C5}, + {0x104EE, 0x104C6}, {0x104EF, 0x104C7}, {0x104F0, 0x104C8}, {0x104F1, 0x104C9}, {0x104F2, 0x104CA}, {0x104F3, 0x104CB}, + {0x104F4, 0x104CC}, {0x104F5, 0x104CD}, {0x104F6, 0x104CE}, {0x104F7, 0x104CF}, {0x104F8, 0x104D0}, {0x104F9, 0x104D1}, + {0x104FA, 0x104D2}, {0x104FB, 0x104D3}, {0x10597, 0x10570}, {0x10598, 0x10571}, {0x10599, 0x10572}, {0x1059A, 0x10573}, + {0x1059B, 0x10574}, {0x1059C, 0x10575}, {0x1059D, 0x10576}, {0x1059E, 0x10577}, {0x1059F, 0x10578}, {0x105A0, 0x10579}, + {0x105A1, 0x1057A}, {0x105A3, 0x1057C}, {0x105A4, 0x1057D}, {0x105A5, 0x1057E}, {0x105A6, 0x1057F}, {0x105A7, 0x10580}, + {0x105A8, 0x10581}, {0x105A9, 0x10582}, {0x105AA, 0x10583}, {0x105AB, 0x10584}, {0x105AC, 0x10585}, {0x105AD, 0x10586}, + {0x105AE, 0x10587}, {0x105AF, 0x10588}, {0x105B0, 0x10589}, {0x105B1, 0x1058A}, {0x105B3, 0x1058C}, {0x105B4, 0x1058D}, + {0x105B5, 0x1058E}, {0x105B6, 0x1058F}, {0x105B7, 0x10590}, {0x105B8, 0x10591}, {0x105B9, 0x10592}, {0x105BB, 0x10594}, + {0x105BC, 0x10595}, {0x10CC0, 0x10C80}, {0x10CC1, 0x10C81}, {0x10CC2, 0x10C82}, {0x10CC3, 0x10C83}, {0x10CC4, 0x10C84}, + {0x10CC5, 0x10C85}, {0x10CC6, 0x10C86}, {0x10CC7, 0x10C87}, {0x10CC8, 0x10C88}, {0x10CC9, 0x10C89}, {0x10CCA, 0x10C8A}, + {0x10CCB, 0x10C8B}, {0x10CCC, 0x10C8C}, {0x10CCD, 0x10C8D}, {0x10CCE, 0x10C8E}, {0x10CCF, 0x10C8F}, {0x10CD0, 0x10C90}, + {0x10CD1, 0x10C91}, {0x10CD2, 0x10C92}, {0x10CD3, 0x10C93}, {0x10CD4, 0x10C94}, {0x10CD5, 0x10C95}, {0x10CD6, 0x10C96}, + {0x10CD7, 0x10C97}, {0x10CD8, 0x10C98}, {0x10CD9, 0x10C99}, {0x10CDA, 0x10C9A}, {0x10CDB, 0x10C9B}, {0x10CDC, 0x10C9C}, + {0x10CDD, 0x10C9D}, {0x10CDE, 0x10C9E}, {0x10CDF, 0x10C9F}, {0x10CE0, 0x10CA0}, {0x10CE1, 0x10CA1}, {0x10CE2, 0x10CA2}, + {0x10CE3, 0x10CA3}, {0x10CE4, 0x10CA4}, {0x10CE5, 0x10CA5}, {0x10CE6, 0x10CA6}, {0x10CE7, 0x10CA7}, {0x10CE8, 0x10CA8}, + {0x10CE9, 0x10CA9}, {0x10CEA, 0x10CAA}, {0x10CEB, 0x10CAB}, {0x10CEC, 0x10CAC}, {0x10CED, 0x10CAD}, {0x10CEE, 0x10CAE}, + {0x10CEF, 0x10CAF}, {0x10CF0, 0x10CB0}, {0x10CF1, 0x10CB1}, {0x10CF2, 0x10CB2}, {0x118C0, 0x118A0}, {0x118C1, 0x118A1}, + {0x118C2, 0x118A2}, {0x118C3, 0x118A3}, {0x118C4, 0x118A4}, {0x118C5, 0x118A5}, {0x118C6, 0x118A6}, {0x118C7, 0x118A7}, + {0x118C8, 0x118A8}, {0x118C9, 0x118A9}, {0x118CA, 0x118AA}, {0x118CB, 0x118AB}, {0x118CC, 0x118AC}, {0x118CD, 0x118AD}, + {0x118CE, 0x118AE}, {0x118CF, 0x118AF}, {0x118D0, 0x118B0}, {0x118D1, 0x118B1}, {0x118D2, 0x118B2}, {0x118D3, 0x118B3}, + {0x118D4, 0x118B4}, {0x118D5, 0x118B5}, {0x118D6, 0x118B6}, {0x118D7, 0x118B7}, {0x118D8, 0x118B8}, {0x118D9, 0x118B9}, + {0x118DA, 0x118BA}, {0x118DB, 0x118BB}, {0x118DC, 0x118BC}, {0x118DD, 0x118BD}, {0x118DE, 0x118BE}, {0x118DF, 0x118BF}, + {0x16E60, 0x16E40}, {0x16E61, 0x16E41}, {0x16E62, 0x16E42}, {0x16E63, 0x16E43}, {0x16E64, 0x16E44}, {0x16E65, 0x16E45}, + {0x16E66, 0x16E46}, {0x16E67, 0x16E47}, {0x16E68, 0x16E48}, {0x16E69, 0x16E49}, {0x16E6A, 0x16E4A}, {0x16E6B, 0x16E4B}, + {0x16E6C, 0x16E4C}, {0x16E6D, 0x16E4D}, {0x16E6E, 0x16E4E}, {0x16E6F, 0x16E4F}, {0x16E70, 0x16E50}, {0x16E71, 0x16E51}, + {0x16E72, 0x16E52}, {0x16E73, 0x16E53}, {0x16E74, 0x16E54}, {0x16E75, 0x16E55}, {0x16E76, 0x16E56}, {0x16E77, 0x16E57}, + {0x16E78, 0x16E58}, {0x16E79, 0x16E59}, {0x16E7A, 0x16E5A}, {0x16E7B, 0x16E5B}, {0x16E7C, 0x16E5C}, {0x16E7D, 0x16E5D}, + {0x16E7E, 0x16E5E}, {0x16E7F, 0x16E5F}, {0x1E922, 0x1E900}, {0x1E923, 0x1E901}, {0x1E924, 0x1E902}, {0x1E925, 0x1E903}, + {0x1E926, 0x1E904}, {0x1E927, 0x1E905}, {0x1E928, 0x1E906}, {0x1E929, 0x1E907}, {0x1E92A, 0x1E908}, {0x1E92B, 0x1E909}, + {0x1E92C, 0x1E90A}, {0x1E92D, 0x1E90B}, {0x1E92E, 0x1E90C}, {0x1E92F, 0x1E90D}, {0x1E930, 0x1E90E}, {0x1E931, 0x1E90F}, + {0x1E932, 0x1E910}, {0x1E933, 0x1E911}, {0x1E934, 0x1E912}, {0x1E935, 0x1E913}, {0x1E936, 0x1E914}, {0x1E937, 0x1E915}, + {0x1E938, 0x1E916}, {0x1E939, 0x1E917}, {0x1E93A, 0x1E918}, {0x1E93B, 0x1E919}, {0x1E93C, 0x1E91A}, {0x1E93D, 0x1E91B}, + {0x1E93E, 0x1E91C}, {0x1E93F, 0x1E91D}, {0x1E940, 0x1E91E}, {0x1E941, 0x1E91F}, {0x1E942, 0x1E920}, {0x1E943, 0x1E921}, +}; + +static const CpRange kCatL[] = { + {0x41, 0x5A}, {0x61, 0x7A}, {0xAA, 0xAA}, {0xB5, 0xB5}, {0xBA, 0xBA}, {0xC0, 0xD6}, + {0xD8, 0xF6}, {0xF8, 0x2C1}, {0x2C6, 0x2D1}, {0x2E0, 0x2E4}, {0x2EC, 0x2EC}, {0x2EE, 0x2EE}, + {0x370, 0x374}, {0x376, 0x377}, {0x37A, 0x37D}, {0x37F, 0x37F}, {0x386, 0x386}, {0x388, 0x38A}, + {0x38C, 0x38C}, {0x38E, 0x3A1}, {0x3A3, 0x3F5}, {0x3F7, 0x481}, {0x48A, 0x52F}, {0x531, 0x556}, + {0x559, 0x559}, {0x560, 0x588}, {0x5D0, 0x5EA}, {0x5EF, 0x5F2}, {0x620, 0x64A}, {0x66E, 0x66F}, + {0x671, 0x6D3}, {0x6D5, 0x6D5}, {0x6E5, 0x6E6}, {0x6EE, 0x6EF}, {0x6FA, 0x6FC}, {0x6FF, 0x6FF}, + {0x710, 0x710}, {0x712, 0x72F}, {0x74D, 0x7A5}, {0x7B1, 0x7B1}, {0x7CA, 0x7EA}, {0x7F4, 0x7F5}, + {0x7FA, 0x7FA}, {0x800, 0x815}, {0x81A, 0x81A}, {0x824, 0x824}, {0x828, 0x828}, {0x840, 0x858}, + {0x860, 0x86A}, {0x870, 0x887}, {0x889, 0x88E}, {0x8A0, 0x8C9}, {0x904, 0x939}, {0x93D, 0x93D}, + {0x950, 0x950}, {0x958, 0x961}, {0x971, 0x980}, {0x985, 0x98C}, {0x98F, 0x990}, {0x993, 0x9A8}, + {0x9AA, 0x9B0}, {0x9B2, 0x9B2}, {0x9B6, 0x9B9}, {0x9BD, 0x9BD}, {0x9CE, 0x9CE}, {0x9DC, 0x9DD}, + {0x9DF, 0x9E1}, {0x9F0, 0x9F1}, {0x9FC, 0x9FC}, {0xA05, 0xA0A}, {0xA0F, 0xA10}, {0xA13, 0xA28}, + {0xA2A, 0xA30}, {0xA32, 0xA33}, {0xA35, 0xA36}, {0xA38, 0xA39}, {0xA59, 0xA5C}, {0xA5E, 0xA5E}, + {0xA72, 0xA74}, {0xA85, 0xA8D}, {0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB2, 0xAB3}, + {0xAB5, 0xAB9}, {0xABD, 0xABD}, {0xAD0, 0xAD0}, {0xAE0, 0xAE1}, {0xAF9, 0xAF9}, {0xB05, 0xB0C}, + {0xB0F, 0xB10}, {0xB13, 0xB28}, {0xB2A, 0xB30}, {0xB32, 0xB33}, {0xB35, 0xB39}, {0xB3D, 0xB3D}, + {0xB5C, 0xB5D}, {0xB5F, 0xB61}, {0xB71, 0xB71}, {0xB83, 0xB83}, {0xB85, 0xB8A}, {0xB8E, 0xB90}, + {0xB92, 0xB95}, {0xB99, 0xB9A}, {0xB9C, 0xB9C}, {0xB9E, 0xB9F}, {0xBA3, 0xBA4}, {0xBA8, 0xBAA}, + {0xBAE, 0xBB9}, {0xBD0, 0xBD0}, {0xC05, 0xC0C}, {0xC0E, 0xC10}, {0xC12, 0xC28}, {0xC2A, 0xC39}, + {0xC3D, 0xC3D}, {0xC58, 0xC5A}, {0xC5D, 0xC5D}, {0xC60, 0xC61}, {0xC80, 0xC80}, {0xC85, 0xC8C}, + {0xC8E, 0xC90}, {0xC92, 0xCA8}, {0xCAA, 0xCB3}, {0xCB5, 0xCB9}, {0xCBD, 0xCBD}, {0xCDD, 0xCDE}, + {0xCE0, 0xCE1}, {0xCF1, 0xCF2}, {0xD04, 0xD0C}, {0xD0E, 0xD10}, {0xD12, 0xD3A}, {0xD3D, 0xD3D}, + {0xD4E, 0xD4E}, {0xD54, 0xD56}, {0xD5F, 0xD61}, {0xD7A, 0xD7F}, {0xD85, 0xD96}, {0xD9A, 0xDB1}, + {0xDB3, 0xDBB}, {0xDBD, 0xDBD}, {0xDC0, 0xDC6}, {0xE01, 0xE30}, {0xE32, 0xE33}, {0xE40, 0xE46}, + {0xE81, 0xE82}, {0xE84, 0xE84}, {0xE86, 0xE8A}, {0xE8C, 0xEA3}, {0xEA5, 0xEA5}, {0xEA7, 0xEB0}, + {0xEB2, 0xEB3}, {0xEBD, 0xEBD}, {0xEC0, 0xEC4}, {0xEC6, 0xEC6}, {0xEDC, 0xEDF}, {0xF00, 0xF00}, + {0xF40, 0xF47}, {0xF49, 0xF6C}, {0xF88, 0xF8C}, {0x1000, 0x102A}, {0x103F, 0x103F}, {0x1050, 0x1055}, + {0x105A, 0x105D}, {0x1061, 0x1061}, {0x1065, 0x1066}, {0x106E, 0x1070}, {0x1075, 0x1081}, {0x108E, 0x108E}, + {0x10A0, 0x10C5}, {0x10C7, 0x10C7}, {0x10CD, 0x10CD}, {0x10D0, 0x10FA}, {0x10FC, 0x1248}, {0x124A, 0x124D}, + {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, {0x1290, 0x12B0}, + {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6}, {0x12D8, 0x1310}, + {0x1312, 0x1315}, {0x1318, 0x135A}, {0x1380, 0x138F}, {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1401, 0x166C}, + {0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8}, {0x1700, 0x1711}, {0x171F, 0x1731}, + {0x1740, 0x1751}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, {0x17D7, 0x17D7}, {0x17DC, 0x17DC}, + {0x1820, 0x1878}, {0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18AA, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, + {0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x1A00, 0x1A16}, {0x1A20, 0x1A54}, + {0x1AA7, 0x1AA7}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4C}, {0x1B83, 0x1BA0}, {0x1BAE, 0x1BAF}, {0x1BBA, 0x1BE5}, + {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F}, {0x1C5A, 0x1C7D}, {0x1C80, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF}, + {0x1CE9, 0x1CEC}, {0x1CEE, 0x1CF3}, {0x1CF5, 0x1CF6}, {0x1CFA, 0x1CFA}, {0x1D00, 0x1DBF}, {0x1E00, 0x1F15}, + {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, + {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FBC}, {0x1FBE, 0x1FBE}, {0x1FC2, 0x1FC4}, + {0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, + {0x2071, 0x2071}, {0x207F, 0x207F}, {0x2090, 0x209C}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210A, 0x2113}, + {0x2115, 0x2115}, {0x2119, 0x211D}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212A, 0x212D}, + {0x212F, 0x2139}, {0x213C, 0x213F}, {0x2145, 0x2149}, {0x214E, 0x214E}, {0x2183, 0x2184}, {0x2C00, 0x2CE4}, + {0x2CEB, 0x2CEE}, {0x2CF2, 0x2CF3}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, + {0x2D6F, 0x2D6F}, {0x2D80, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, + {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2E2F, 0x2E2F}, {0x3005, 0x3006}, + {0x3031, 0x3035}, {0x303B, 0x303C}, {0x3041, 0x3096}, {0x309D, 0x309F}, {0x30A1, 0x30FA}, {0x30FC, 0x30FF}, + {0x3105, 0x312F}, {0x3131, 0x318E}, {0x31A0, 0x31BF}, {0x31F0, 0x31FF}, {0x3400, 0x4DBF}, {0x4E00, 0xA48C}, + {0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F}, {0xA62A, 0xA62B}, {0xA640, 0xA66E}, {0xA67F, 0xA69D}, + {0xA6A0, 0xA6E5}, {0xA717, 0xA71F}, {0xA722, 0xA788}, {0xA78B, 0xA7CA}, {0xA7D0, 0xA7D1}, {0xA7D3, 0xA7D3}, + {0xA7D5, 0xA7D9}, {0xA7F2, 0xA801}, {0xA803, 0xA805}, {0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873}, + {0xA882, 0xA8B3}, {0xA8F2, 0xA8F7}, {0xA8FB, 0xA8FB}, {0xA8FD, 0xA8FE}, {0xA90A, 0xA925}, {0xA930, 0xA946}, + {0xA960, 0xA97C}, {0xA984, 0xA9B2}, {0xA9CF, 0xA9CF}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF}, {0xA9FA, 0xA9FE}, + {0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B}, {0xAA60, 0xAA76}, {0xAA7A, 0xAA7A}, {0xAA7E, 0xAAAF}, + {0xAAB1, 0xAAB1}, {0xAAB5, 0xAAB6}, {0xAAB9, 0xAABD}, {0xAAC0, 0xAAC0}, {0xAAC2, 0xAAC2}, {0xAADB, 0xAADD}, + {0xAAE0, 0xAAEA}, {0xAAF2, 0xAAF4}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, + {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A}, {0xAB5C, 0xAB69}, {0xAB70, 0xABE2}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, + {0xD7CB, 0xD7FB}, {0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB1D}, + {0xFB1F, 0xFB28}, {0xFB2A, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, {0xFB43, 0xFB44}, + {0xFB46, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE70, 0xFE74}, + {0xFE76, 0xFEFC}, {0xFF21, 0xFF3A}, {0xFF41, 0xFF5A}, {0xFF66, 0xFFBE}, {0xFFC2, 0xFFC7}, {0xFFCA, 0xFFCF}, + {0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}, {0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, + {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x10300, 0x1031F}, + {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, + {0x10400, 0x1049D}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10570, 0x1057A}, + {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10594, 0x10595}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, + {0x105BB, 0x105BC}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10780, 0x10785}, {0x10787, 0x107B0}, + {0x107B2, 0x107BA}, {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C}, + {0x1083F, 0x10855}, {0x10860, 0x10876}, {0x10880, 0x1089E}, {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x10900, 0x10915}, + {0x10920, 0x10939}, {0x10980, 0x109B7}, {0x109BE, 0x109BF}, {0x10A00, 0x10A00}, {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, + {0x10A19, 0x10A35}, {0x10A60, 0x10A7C}, {0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4}, {0x10B00, 0x10B35}, + {0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91}, {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, + {0x10D00, 0x10D23}, {0x10E80, 0x10EA9}, {0x10EB0, 0x10EB1}, {0x10F00, 0x10F1C}, {0x10F27, 0x10F27}, {0x10F30, 0x10F45}, + {0x10F70, 0x10F81}, {0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6}, {0x11003, 0x11037}, {0x11071, 0x11072}, {0x11075, 0x11075}, + {0x11083, 0x110AF}, {0x110D0, 0x110E8}, {0x11103, 0x11126}, {0x11144, 0x11144}, {0x11147, 0x11147}, {0x11150, 0x11172}, + {0x11176, 0x11176}, {0x11183, 0x111B2}, {0x111C1, 0x111C4}, {0x111DA, 0x111DA}, {0x111DC, 0x111DC}, {0x11200, 0x11211}, + {0x11213, 0x1122B}, {0x1123F, 0x11240}, {0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, + {0x1129F, 0x112A8}, {0x112B0, 0x112DE}, {0x11305, 0x1130C}, {0x1130F, 0x11310}, {0x11313, 0x11328}, {0x1132A, 0x11330}, + {0x11332, 0x11333}, {0x11335, 0x11339}, {0x1133D, 0x1133D}, {0x11350, 0x11350}, {0x1135D, 0x11361}, {0x11400, 0x11434}, + {0x11447, 0x1144A}, {0x1145F, 0x11461}, {0x11480, 0x114AF}, {0x114C4, 0x114C5}, {0x114C7, 0x114C7}, {0x11580, 0x115AE}, + {0x115D8, 0x115DB}, {0x11600, 0x1162F}, {0x11644, 0x11644}, {0x11680, 0x116AA}, {0x116B8, 0x116B8}, {0x11700, 0x1171A}, + {0x11740, 0x11746}, {0x11800, 0x1182B}, {0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x11909, 0x11909}, {0x1190C, 0x11913}, + {0x11915, 0x11916}, {0x11918, 0x1192F}, {0x1193F, 0x1193F}, {0x11941, 0x11941}, {0x119A0, 0x119A7}, {0x119AA, 0x119D0}, + {0x119E1, 0x119E1}, {0x119E3, 0x119E3}, {0x11A00, 0x11A00}, {0x11A0B, 0x11A32}, {0x11A3A, 0x11A3A}, {0x11A50, 0x11A50}, + {0x11A5C, 0x11A89}, {0x11A9D, 0x11A9D}, {0x11AB0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C40, 0x11C40}, + {0x11C72, 0x11C8F}, {0x11D00, 0x11D06}, {0x11D08, 0x11D09}, {0x11D0B, 0x11D30}, {0x11D46, 0x11D46}, {0x11D60, 0x11D65}, + {0x11D67, 0x11D68}, {0x11D6A, 0x11D89}, {0x11D98, 0x11D98}, {0x11EE0, 0x11EF2}, {0x11F02, 0x11F02}, {0x11F04, 0x11F10}, + {0x11F12, 0x11F33}, {0x11FB0, 0x11FB0}, {0x12000, 0x12399}, {0x12480, 0x12543}, {0x12F90, 0x12FF0}, {0x13000, 0x1342F}, + {0x13441, 0x13446}, {0x14400, 0x14646}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A70, 0x16ABE}, {0x16AD0, 0x16AED}, + {0x16B00, 0x16B2F}, {0x16B40, 0x16B43}, {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A}, + {0x16F50, 0x16F50}, {0x16F93, 0x16F9F}, {0x16FE0, 0x16FE1}, {0x16FE3, 0x16FE3}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, + {0x18D00, 0x18D08}, {0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1AFFD, 0x1AFFE}, {0x1B000, 0x1B122}, {0x1B132, 0x1B132}, + {0x1B150, 0x1B152}, {0x1B155, 0x1B155}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, + {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, + {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, + {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, + {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA}, + {0x1D6FC, 0x1D714}, {0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D7A8}, + {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB}, {0x1DF00, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E030, 0x1E06D}, {0x1E100, 0x1E12C}, + {0x1E137, 0x1E13D}, {0x1E14E, 0x1E14E}, {0x1E290, 0x1E2AD}, {0x1E2C0, 0x1E2EB}, {0x1E4D0, 0x1E4EB}, {0x1E7E0, 0x1E7E6}, + {0x1E7E8, 0x1E7EB}, {0x1E7ED, 0x1E7EE}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4}, {0x1E900, 0x1E943}, {0x1E94B, 0x1E94B}, + {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, {0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32}, + {0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, {0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, + {0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, {0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, + {0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, {0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, + {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, + {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DF}, {0x2A700, 0x2B739}, {0x2B740, 0x2B81D}, + {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0x31350, 0x323AF}, +}; + +static const CpRange kCatLu[] = { + {0x41, 0x5A}, {0xC0, 0xD6}, {0xD8, 0xDE}, {0x100, 0x100}, {0x102, 0x102}, {0x104, 0x104}, + {0x106, 0x106}, {0x108, 0x108}, {0x10A, 0x10A}, {0x10C, 0x10C}, {0x10E, 0x10E}, {0x110, 0x110}, + {0x112, 0x112}, {0x114, 0x114}, {0x116, 0x116}, {0x118, 0x118}, {0x11A, 0x11A}, {0x11C, 0x11C}, + {0x11E, 0x11E}, {0x120, 0x120}, {0x122, 0x122}, {0x124, 0x124}, {0x126, 0x126}, {0x128, 0x128}, + {0x12A, 0x12A}, {0x12C, 0x12C}, {0x12E, 0x12E}, {0x130, 0x130}, {0x132, 0x132}, {0x134, 0x134}, + {0x136, 0x136}, {0x139, 0x139}, {0x13B, 0x13B}, {0x13D, 0x13D}, {0x13F, 0x13F}, {0x141, 0x141}, + {0x143, 0x143}, {0x145, 0x145}, {0x147, 0x147}, {0x14A, 0x14A}, {0x14C, 0x14C}, {0x14E, 0x14E}, + {0x150, 0x150}, {0x152, 0x152}, {0x154, 0x154}, {0x156, 0x156}, {0x158, 0x158}, {0x15A, 0x15A}, + {0x15C, 0x15C}, {0x15E, 0x15E}, {0x160, 0x160}, {0x162, 0x162}, {0x164, 0x164}, {0x166, 0x166}, + {0x168, 0x168}, {0x16A, 0x16A}, {0x16C, 0x16C}, {0x16E, 0x16E}, {0x170, 0x170}, {0x172, 0x172}, + {0x174, 0x174}, {0x176, 0x176}, {0x178, 0x179}, {0x17B, 0x17B}, {0x17D, 0x17D}, {0x181, 0x182}, + {0x184, 0x184}, {0x186, 0x187}, {0x189, 0x18B}, {0x18E, 0x191}, {0x193, 0x194}, {0x196, 0x198}, + {0x19C, 0x19D}, {0x19F, 0x1A0}, {0x1A2, 0x1A2}, {0x1A4, 0x1A4}, {0x1A6, 0x1A7}, {0x1A9, 0x1A9}, + {0x1AC, 0x1AC}, {0x1AE, 0x1AF}, {0x1B1, 0x1B3}, {0x1B5, 0x1B5}, {0x1B7, 0x1B8}, {0x1BC, 0x1BC}, + {0x1C4, 0x1C4}, {0x1C7, 0x1C7}, {0x1CA, 0x1CA}, {0x1CD, 0x1CD}, {0x1CF, 0x1CF}, {0x1D1, 0x1D1}, + {0x1D3, 0x1D3}, {0x1D5, 0x1D5}, {0x1D7, 0x1D7}, {0x1D9, 0x1D9}, {0x1DB, 0x1DB}, {0x1DE, 0x1DE}, + {0x1E0, 0x1E0}, {0x1E2, 0x1E2}, {0x1E4, 0x1E4}, {0x1E6, 0x1E6}, {0x1E8, 0x1E8}, {0x1EA, 0x1EA}, + {0x1EC, 0x1EC}, {0x1EE, 0x1EE}, {0x1F1, 0x1F1}, {0x1F4, 0x1F4}, {0x1F6, 0x1F8}, {0x1FA, 0x1FA}, + {0x1FC, 0x1FC}, {0x1FE, 0x1FE}, {0x200, 0x200}, {0x202, 0x202}, {0x204, 0x204}, {0x206, 0x206}, + {0x208, 0x208}, {0x20A, 0x20A}, {0x20C, 0x20C}, {0x20E, 0x20E}, {0x210, 0x210}, {0x212, 0x212}, + {0x214, 0x214}, {0x216, 0x216}, {0x218, 0x218}, {0x21A, 0x21A}, {0x21C, 0x21C}, {0x21E, 0x21E}, + {0x220, 0x220}, {0x222, 0x222}, {0x224, 0x224}, {0x226, 0x226}, {0x228, 0x228}, {0x22A, 0x22A}, + {0x22C, 0x22C}, {0x22E, 0x22E}, {0x230, 0x230}, {0x232, 0x232}, {0x23A, 0x23B}, {0x23D, 0x23E}, + {0x241, 0x241}, {0x243, 0x246}, {0x248, 0x248}, {0x24A, 0x24A}, {0x24C, 0x24C}, {0x24E, 0x24E}, + {0x370, 0x370}, {0x372, 0x372}, {0x376, 0x376}, {0x37F, 0x37F}, {0x386, 0x386}, {0x388, 0x38A}, + {0x38C, 0x38C}, {0x38E, 0x38F}, {0x391, 0x3A1}, {0x3A3, 0x3AB}, {0x3CF, 0x3CF}, {0x3D2, 0x3D4}, + {0x3D8, 0x3D8}, {0x3DA, 0x3DA}, {0x3DC, 0x3DC}, {0x3DE, 0x3DE}, {0x3E0, 0x3E0}, {0x3E2, 0x3E2}, + {0x3E4, 0x3E4}, {0x3E6, 0x3E6}, {0x3E8, 0x3E8}, {0x3EA, 0x3EA}, {0x3EC, 0x3EC}, {0x3EE, 0x3EE}, + {0x3F4, 0x3F4}, {0x3F7, 0x3F7}, {0x3F9, 0x3FA}, {0x3FD, 0x42F}, {0x460, 0x460}, {0x462, 0x462}, + {0x464, 0x464}, {0x466, 0x466}, {0x468, 0x468}, {0x46A, 0x46A}, {0x46C, 0x46C}, {0x46E, 0x46E}, + {0x470, 0x470}, {0x472, 0x472}, {0x474, 0x474}, {0x476, 0x476}, {0x478, 0x478}, {0x47A, 0x47A}, + {0x47C, 0x47C}, {0x47E, 0x47E}, {0x480, 0x480}, {0x48A, 0x48A}, {0x48C, 0x48C}, {0x48E, 0x48E}, + {0x490, 0x490}, {0x492, 0x492}, {0x494, 0x494}, {0x496, 0x496}, {0x498, 0x498}, {0x49A, 0x49A}, + {0x49C, 0x49C}, {0x49E, 0x49E}, {0x4A0, 0x4A0}, {0x4A2, 0x4A2}, {0x4A4, 0x4A4}, {0x4A6, 0x4A6}, + {0x4A8, 0x4A8}, {0x4AA, 0x4AA}, {0x4AC, 0x4AC}, {0x4AE, 0x4AE}, {0x4B0, 0x4B0}, {0x4B2, 0x4B2}, + {0x4B4, 0x4B4}, {0x4B6, 0x4B6}, {0x4B8, 0x4B8}, {0x4BA, 0x4BA}, {0x4BC, 0x4BC}, {0x4BE, 0x4BE}, + {0x4C0, 0x4C1}, {0x4C3, 0x4C3}, {0x4C5, 0x4C5}, {0x4C7, 0x4C7}, {0x4C9, 0x4C9}, {0x4CB, 0x4CB}, + {0x4CD, 0x4CD}, {0x4D0, 0x4D0}, {0x4D2, 0x4D2}, {0x4D4, 0x4D4}, {0x4D6, 0x4D6}, {0x4D8, 0x4D8}, + {0x4DA, 0x4DA}, {0x4DC, 0x4DC}, {0x4DE, 0x4DE}, {0x4E0, 0x4E0}, {0x4E2, 0x4E2}, {0x4E4, 0x4E4}, + {0x4E6, 0x4E6}, {0x4E8, 0x4E8}, {0x4EA, 0x4EA}, {0x4EC, 0x4EC}, {0x4EE, 0x4EE}, {0x4F0, 0x4F0}, + {0x4F2, 0x4F2}, {0x4F4, 0x4F4}, {0x4F6, 0x4F6}, {0x4F8, 0x4F8}, {0x4FA, 0x4FA}, {0x4FC, 0x4FC}, + {0x4FE, 0x4FE}, {0x500, 0x500}, {0x502, 0x502}, {0x504, 0x504}, {0x506, 0x506}, {0x508, 0x508}, + {0x50A, 0x50A}, {0x50C, 0x50C}, {0x50E, 0x50E}, {0x510, 0x510}, {0x512, 0x512}, {0x514, 0x514}, + {0x516, 0x516}, {0x518, 0x518}, {0x51A, 0x51A}, {0x51C, 0x51C}, {0x51E, 0x51E}, {0x520, 0x520}, + {0x522, 0x522}, {0x524, 0x524}, {0x526, 0x526}, {0x528, 0x528}, {0x52A, 0x52A}, {0x52C, 0x52C}, + {0x52E, 0x52E}, {0x531, 0x556}, {0x10A0, 0x10C5}, {0x10C7, 0x10C7}, {0x10CD, 0x10CD}, {0x13A0, 0x13F5}, + {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF}, {0x1E00, 0x1E00}, {0x1E02, 0x1E02}, {0x1E04, 0x1E04}, {0x1E06, 0x1E06}, + {0x1E08, 0x1E08}, {0x1E0A, 0x1E0A}, {0x1E0C, 0x1E0C}, {0x1E0E, 0x1E0E}, {0x1E10, 0x1E10}, {0x1E12, 0x1E12}, + {0x1E14, 0x1E14}, {0x1E16, 0x1E16}, {0x1E18, 0x1E18}, {0x1E1A, 0x1E1A}, {0x1E1C, 0x1E1C}, {0x1E1E, 0x1E1E}, + {0x1E20, 0x1E20}, {0x1E22, 0x1E22}, {0x1E24, 0x1E24}, {0x1E26, 0x1E26}, {0x1E28, 0x1E28}, {0x1E2A, 0x1E2A}, + {0x1E2C, 0x1E2C}, {0x1E2E, 0x1E2E}, {0x1E30, 0x1E30}, {0x1E32, 0x1E32}, {0x1E34, 0x1E34}, {0x1E36, 0x1E36}, + {0x1E38, 0x1E38}, {0x1E3A, 0x1E3A}, {0x1E3C, 0x1E3C}, {0x1E3E, 0x1E3E}, {0x1E40, 0x1E40}, {0x1E42, 0x1E42}, + {0x1E44, 0x1E44}, {0x1E46, 0x1E46}, {0x1E48, 0x1E48}, {0x1E4A, 0x1E4A}, {0x1E4C, 0x1E4C}, {0x1E4E, 0x1E4E}, + {0x1E50, 0x1E50}, {0x1E52, 0x1E52}, {0x1E54, 0x1E54}, {0x1E56, 0x1E56}, {0x1E58, 0x1E58}, {0x1E5A, 0x1E5A}, + {0x1E5C, 0x1E5C}, {0x1E5E, 0x1E5E}, {0x1E60, 0x1E60}, {0x1E62, 0x1E62}, {0x1E64, 0x1E64}, {0x1E66, 0x1E66}, + {0x1E68, 0x1E68}, {0x1E6A, 0x1E6A}, {0x1E6C, 0x1E6C}, {0x1E6E, 0x1E6E}, {0x1E70, 0x1E70}, {0x1E72, 0x1E72}, + {0x1E74, 0x1E74}, {0x1E76, 0x1E76}, {0x1E78, 0x1E78}, {0x1E7A, 0x1E7A}, {0x1E7C, 0x1E7C}, {0x1E7E, 0x1E7E}, + {0x1E80, 0x1E80}, {0x1E82, 0x1E82}, {0x1E84, 0x1E84}, {0x1E86, 0x1E86}, {0x1E88, 0x1E88}, {0x1E8A, 0x1E8A}, + {0x1E8C, 0x1E8C}, {0x1E8E, 0x1E8E}, {0x1E90, 0x1E90}, {0x1E92, 0x1E92}, {0x1E94, 0x1E94}, {0x1E9E, 0x1E9E}, + {0x1EA0, 0x1EA0}, {0x1EA2, 0x1EA2}, {0x1EA4, 0x1EA4}, {0x1EA6, 0x1EA6}, {0x1EA8, 0x1EA8}, {0x1EAA, 0x1EAA}, + {0x1EAC, 0x1EAC}, {0x1EAE, 0x1EAE}, {0x1EB0, 0x1EB0}, {0x1EB2, 0x1EB2}, {0x1EB4, 0x1EB4}, {0x1EB6, 0x1EB6}, + {0x1EB8, 0x1EB8}, {0x1EBA, 0x1EBA}, {0x1EBC, 0x1EBC}, {0x1EBE, 0x1EBE}, {0x1EC0, 0x1EC0}, {0x1EC2, 0x1EC2}, + {0x1EC4, 0x1EC4}, {0x1EC6, 0x1EC6}, {0x1EC8, 0x1EC8}, {0x1ECA, 0x1ECA}, {0x1ECC, 0x1ECC}, {0x1ECE, 0x1ECE}, + {0x1ED0, 0x1ED0}, {0x1ED2, 0x1ED2}, {0x1ED4, 0x1ED4}, {0x1ED6, 0x1ED6}, {0x1ED8, 0x1ED8}, {0x1EDA, 0x1EDA}, + {0x1EDC, 0x1EDC}, {0x1EDE, 0x1EDE}, {0x1EE0, 0x1EE0}, {0x1EE2, 0x1EE2}, {0x1EE4, 0x1EE4}, {0x1EE6, 0x1EE6}, + {0x1EE8, 0x1EE8}, {0x1EEA, 0x1EEA}, {0x1EEC, 0x1EEC}, {0x1EEE, 0x1EEE}, {0x1EF0, 0x1EF0}, {0x1EF2, 0x1EF2}, + {0x1EF4, 0x1EF4}, {0x1EF6, 0x1EF6}, {0x1EF8, 0x1EF8}, {0x1EFA, 0x1EFA}, {0x1EFC, 0x1EFC}, {0x1EFE, 0x1EFE}, + {0x1F08, 0x1F0F}, {0x1F18, 0x1F1D}, {0x1F28, 0x1F2F}, {0x1F38, 0x1F3F}, {0x1F48, 0x1F4D}, {0x1F59, 0x1F59}, + {0x1F5B, 0x1F5B}, {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F5F}, {0x1F68, 0x1F6F}, {0x1FB8, 0x1FBB}, {0x1FC8, 0x1FCB}, + {0x1FD8, 0x1FDB}, {0x1FE8, 0x1FEC}, {0x1FF8, 0x1FFB}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210B, 0x210D}, + {0x2110, 0x2112}, {0x2115, 0x2115}, {0x2119, 0x211D}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, + {0x212A, 0x212D}, {0x2130, 0x2133}, {0x213E, 0x213F}, {0x2145, 0x2145}, {0x2183, 0x2183}, {0x2C00, 0x2C2F}, + {0x2C60, 0x2C60}, {0x2C62, 0x2C64}, {0x2C67, 0x2C67}, {0x2C69, 0x2C69}, {0x2C6B, 0x2C6B}, {0x2C6D, 0x2C70}, + {0x2C72, 0x2C72}, {0x2C75, 0x2C75}, {0x2C7E, 0x2C80}, {0x2C82, 0x2C82}, {0x2C84, 0x2C84}, {0x2C86, 0x2C86}, + {0x2C88, 0x2C88}, {0x2C8A, 0x2C8A}, {0x2C8C, 0x2C8C}, {0x2C8E, 0x2C8E}, {0x2C90, 0x2C90}, {0x2C92, 0x2C92}, + {0x2C94, 0x2C94}, {0x2C96, 0x2C96}, {0x2C98, 0x2C98}, {0x2C9A, 0x2C9A}, {0x2C9C, 0x2C9C}, {0x2C9E, 0x2C9E}, + {0x2CA0, 0x2CA0}, {0x2CA2, 0x2CA2}, {0x2CA4, 0x2CA4}, {0x2CA6, 0x2CA6}, {0x2CA8, 0x2CA8}, {0x2CAA, 0x2CAA}, + {0x2CAC, 0x2CAC}, {0x2CAE, 0x2CAE}, {0x2CB0, 0x2CB0}, {0x2CB2, 0x2CB2}, {0x2CB4, 0x2CB4}, {0x2CB6, 0x2CB6}, + {0x2CB8, 0x2CB8}, {0x2CBA, 0x2CBA}, {0x2CBC, 0x2CBC}, {0x2CBE, 0x2CBE}, {0x2CC0, 0x2CC0}, {0x2CC2, 0x2CC2}, + {0x2CC4, 0x2CC4}, {0x2CC6, 0x2CC6}, {0x2CC8, 0x2CC8}, {0x2CCA, 0x2CCA}, {0x2CCC, 0x2CCC}, {0x2CCE, 0x2CCE}, + {0x2CD0, 0x2CD0}, {0x2CD2, 0x2CD2}, {0x2CD4, 0x2CD4}, {0x2CD6, 0x2CD6}, {0x2CD8, 0x2CD8}, {0x2CDA, 0x2CDA}, + {0x2CDC, 0x2CDC}, {0x2CDE, 0x2CDE}, {0x2CE0, 0x2CE0}, {0x2CE2, 0x2CE2}, {0x2CEB, 0x2CEB}, {0x2CED, 0x2CED}, + {0x2CF2, 0x2CF2}, {0xA640, 0xA640}, {0xA642, 0xA642}, {0xA644, 0xA644}, {0xA646, 0xA646}, {0xA648, 0xA648}, + {0xA64A, 0xA64A}, {0xA64C, 0xA64C}, {0xA64E, 0xA64E}, {0xA650, 0xA650}, {0xA652, 0xA652}, {0xA654, 0xA654}, + {0xA656, 0xA656}, {0xA658, 0xA658}, {0xA65A, 0xA65A}, {0xA65C, 0xA65C}, {0xA65E, 0xA65E}, {0xA660, 0xA660}, + {0xA662, 0xA662}, {0xA664, 0xA664}, {0xA666, 0xA666}, {0xA668, 0xA668}, {0xA66A, 0xA66A}, {0xA66C, 0xA66C}, + {0xA680, 0xA680}, {0xA682, 0xA682}, {0xA684, 0xA684}, {0xA686, 0xA686}, {0xA688, 0xA688}, {0xA68A, 0xA68A}, + {0xA68C, 0xA68C}, {0xA68E, 0xA68E}, {0xA690, 0xA690}, {0xA692, 0xA692}, {0xA694, 0xA694}, {0xA696, 0xA696}, + {0xA698, 0xA698}, {0xA69A, 0xA69A}, {0xA722, 0xA722}, {0xA724, 0xA724}, {0xA726, 0xA726}, {0xA728, 0xA728}, + {0xA72A, 0xA72A}, {0xA72C, 0xA72C}, {0xA72E, 0xA72E}, {0xA732, 0xA732}, {0xA734, 0xA734}, {0xA736, 0xA736}, + {0xA738, 0xA738}, {0xA73A, 0xA73A}, {0xA73C, 0xA73C}, {0xA73E, 0xA73E}, {0xA740, 0xA740}, {0xA742, 0xA742}, + {0xA744, 0xA744}, {0xA746, 0xA746}, {0xA748, 0xA748}, {0xA74A, 0xA74A}, {0xA74C, 0xA74C}, {0xA74E, 0xA74E}, + {0xA750, 0xA750}, {0xA752, 0xA752}, {0xA754, 0xA754}, {0xA756, 0xA756}, {0xA758, 0xA758}, {0xA75A, 0xA75A}, + {0xA75C, 0xA75C}, {0xA75E, 0xA75E}, {0xA760, 0xA760}, {0xA762, 0xA762}, {0xA764, 0xA764}, {0xA766, 0xA766}, + {0xA768, 0xA768}, {0xA76A, 0xA76A}, {0xA76C, 0xA76C}, {0xA76E, 0xA76E}, {0xA779, 0xA779}, {0xA77B, 0xA77B}, + {0xA77D, 0xA77E}, {0xA780, 0xA780}, {0xA782, 0xA782}, {0xA784, 0xA784}, {0xA786, 0xA786}, {0xA78B, 0xA78B}, + {0xA78D, 0xA78D}, {0xA790, 0xA790}, {0xA792, 0xA792}, {0xA796, 0xA796}, {0xA798, 0xA798}, {0xA79A, 0xA79A}, + {0xA79C, 0xA79C}, {0xA79E, 0xA79E}, {0xA7A0, 0xA7A0}, {0xA7A2, 0xA7A2}, {0xA7A4, 0xA7A4}, {0xA7A6, 0xA7A6}, + {0xA7A8, 0xA7A8}, {0xA7AA, 0xA7AE}, {0xA7B0, 0xA7B4}, {0xA7B6, 0xA7B6}, {0xA7B8, 0xA7B8}, {0xA7BA, 0xA7BA}, + {0xA7BC, 0xA7BC}, {0xA7BE, 0xA7BE}, {0xA7C0, 0xA7C0}, {0xA7C2, 0xA7C2}, {0xA7C4, 0xA7C7}, {0xA7C9, 0xA7C9}, + {0xA7D0, 0xA7D0}, {0xA7D6, 0xA7D6}, {0xA7D8, 0xA7D8}, {0xA7F5, 0xA7F5}, {0xFF21, 0xFF3A}, {0x10400, 0x10427}, + {0x104B0, 0x104D3}, {0x10570, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10594, 0x10595}, {0x10C80, 0x10CB2}, + {0x118A0, 0x118BF}, {0x16E40, 0x16E5F}, {0x1D400, 0x1D419}, {0x1D434, 0x1D44D}, {0x1D468, 0x1D481}, {0x1D49C, 0x1D49C}, + {0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B5}, {0x1D4D0, 0x1D4E9}, + {0x1D504, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D538, 0x1D539}, {0x1D53B, 0x1D53E}, + {0x1D540, 0x1D544}, {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, {0x1D56C, 0x1D585}, {0x1D5A0, 0x1D5B9}, {0x1D5D4, 0x1D5ED}, + {0x1D608, 0x1D621}, {0x1D63C, 0x1D655}, {0x1D670, 0x1D689}, {0x1D6A8, 0x1D6C0}, {0x1D6E2, 0x1D6FA}, {0x1D71C, 0x1D734}, + {0x1D756, 0x1D76E}, {0x1D790, 0x1D7A8}, {0x1D7CA, 0x1D7CA}, {0x1E900, 0x1E921}, +}; + +static const CpRange kCatLl[] = { + {0x61, 0x7A}, {0xB5, 0xB5}, {0xDF, 0xF6}, {0xF8, 0xFF}, {0x101, 0x101}, {0x103, 0x103}, + {0x105, 0x105}, {0x107, 0x107}, {0x109, 0x109}, {0x10B, 0x10B}, {0x10D, 0x10D}, {0x10F, 0x10F}, + {0x111, 0x111}, {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, {0x11B, 0x11B}, + {0x11D, 0x11D}, {0x11F, 0x11F}, {0x121, 0x121}, {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, + {0x129, 0x129}, {0x12B, 0x12B}, {0x12D, 0x12D}, {0x12F, 0x12F}, {0x131, 0x131}, {0x133, 0x133}, + {0x135, 0x135}, {0x137, 0x138}, {0x13A, 0x13A}, {0x13C, 0x13C}, {0x13E, 0x13E}, {0x140, 0x140}, + {0x142, 0x142}, {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14B, 0x14B}, {0x14D, 0x14D}, + {0x14F, 0x14F}, {0x151, 0x151}, {0x153, 0x153}, {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, + {0x15B, 0x15B}, {0x15D, 0x15D}, {0x15F, 0x15F}, {0x161, 0x161}, {0x163, 0x163}, {0x165, 0x165}, + {0x167, 0x167}, {0x169, 0x169}, {0x16B, 0x16B}, {0x16D, 0x16D}, {0x16F, 0x16F}, {0x171, 0x171}, + {0x173, 0x173}, {0x175, 0x175}, {0x177, 0x177}, {0x17A, 0x17A}, {0x17C, 0x17C}, {0x17E, 0x180}, + {0x183, 0x183}, {0x185, 0x185}, {0x188, 0x188}, {0x18C, 0x18D}, {0x192, 0x192}, {0x195, 0x195}, + {0x199, 0x19B}, {0x19E, 0x19E}, {0x1A1, 0x1A1}, {0x1A3, 0x1A3}, {0x1A5, 0x1A5}, {0x1A8, 0x1A8}, + {0x1AA, 0x1AB}, {0x1AD, 0x1AD}, {0x1B0, 0x1B0}, {0x1B4, 0x1B4}, {0x1B6, 0x1B6}, {0x1B9, 0x1BA}, + {0x1BD, 0x1BF}, {0x1C6, 0x1C6}, {0x1C9, 0x1C9}, {0x1CC, 0x1CC}, {0x1CE, 0x1CE}, {0x1D0, 0x1D0}, + {0x1D2, 0x1D2}, {0x1D4, 0x1D4}, {0x1D6, 0x1D6}, {0x1D8, 0x1D8}, {0x1DA, 0x1DA}, {0x1DC, 0x1DD}, + {0x1DF, 0x1DF}, {0x1E1, 0x1E1}, {0x1E3, 0x1E3}, {0x1E5, 0x1E5}, {0x1E7, 0x1E7}, {0x1E9, 0x1E9}, + {0x1EB, 0x1EB}, {0x1ED, 0x1ED}, {0x1EF, 0x1F0}, {0x1F3, 0x1F3}, {0x1F5, 0x1F5}, {0x1F9, 0x1F9}, + {0x1FB, 0x1FB}, {0x1FD, 0x1FD}, {0x1FF, 0x1FF}, {0x201, 0x201}, {0x203, 0x203}, {0x205, 0x205}, + {0x207, 0x207}, {0x209, 0x209}, {0x20B, 0x20B}, {0x20D, 0x20D}, {0x20F, 0x20F}, {0x211, 0x211}, + {0x213, 0x213}, {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21B, 0x21B}, {0x21D, 0x21D}, + {0x21F, 0x21F}, {0x221, 0x221}, {0x223, 0x223}, {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, + {0x22B, 0x22B}, {0x22D, 0x22D}, {0x22F, 0x22F}, {0x231, 0x231}, {0x233, 0x239}, {0x23C, 0x23C}, + {0x23F, 0x240}, {0x242, 0x242}, {0x247, 0x247}, {0x249, 0x249}, {0x24B, 0x24B}, {0x24D, 0x24D}, + {0x24F, 0x293}, {0x295, 0x2AF}, {0x371, 0x371}, {0x373, 0x373}, {0x377, 0x377}, {0x37B, 0x37D}, + {0x390, 0x390}, {0x3AC, 0x3CE}, {0x3D0, 0x3D1}, {0x3D5, 0x3D7}, {0x3D9, 0x3D9}, {0x3DB, 0x3DB}, + {0x3DD, 0x3DD}, {0x3DF, 0x3DF}, {0x3E1, 0x3E1}, {0x3E3, 0x3E3}, {0x3E5, 0x3E5}, {0x3E7, 0x3E7}, + {0x3E9, 0x3E9}, {0x3EB, 0x3EB}, {0x3ED, 0x3ED}, {0x3EF, 0x3F3}, {0x3F5, 0x3F5}, {0x3F8, 0x3F8}, + {0x3FB, 0x3FC}, {0x430, 0x45F}, {0x461, 0x461}, {0x463, 0x463}, {0x465, 0x465}, {0x467, 0x467}, + {0x469, 0x469}, {0x46B, 0x46B}, {0x46D, 0x46D}, {0x46F, 0x46F}, {0x471, 0x471}, {0x473, 0x473}, + {0x475, 0x475}, {0x477, 0x477}, {0x479, 0x479}, {0x47B, 0x47B}, {0x47D, 0x47D}, {0x47F, 0x47F}, + {0x481, 0x481}, {0x48B, 0x48B}, {0x48D, 0x48D}, {0x48F, 0x48F}, {0x491, 0x491}, {0x493, 0x493}, + {0x495, 0x495}, {0x497, 0x497}, {0x499, 0x499}, {0x49B, 0x49B}, {0x49D, 0x49D}, {0x49F, 0x49F}, + {0x4A1, 0x4A1}, {0x4A3, 0x4A3}, {0x4A5, 0x4A5}, {0x4A7, 0x4A7}, {0x4A9, 0x4A9}, {0x4AB, 0x4AB}, + {0x4AD, 0x4AD}, {0x4AF, 0x4AF}, {0x4B1, 0x4B1}, {0x4B3, 0x4B3}, {0x4B5, 0x4B5}, {0x4B7, 0x4B7}, + {0x4B9, 0x4B9}, {0x4BB, 0x4BB}, {0x4BD, 0x4BD}, {0x4BF, 0x4BF}, {0x4C2, 0x4C2}, {0x4C4, 0x4C4}, + {0x4C6, 0x4C6}, {0x4C8, 0x4C8}, {0x4CA, 0x4CA}, {0x4CC, 0x4CC}, {0x4CE, 0x4CF}, {0x4D1, 0x4D1}, + {0x4D3, 0x4D3}, {0x4D5, 0x4D5}, {0x4D7, 0x4D7}, {0x4D9, 0x4D9}, {0x4DB, 0x4DB}, {0x4DD, 0x4DD}, + {0x4DF, 0x4DF}, {0x4E1, 0x4E1}, {0x4E3, 0x4E3}, {0x4E5, 0x4E5}, {0x4E7, 0x4E7}, {0x4E9, 0x4E9}, + {0x4EB, 0x4EB}, {0x4ED, 0x4ED}, {0x4EF, 0x4EF}, {0x4F1, 0x4F1}, {0x4F3, 0x4F3}, {0x4F5, 0x4F5}, + {0x4F7, 0x4F7}, {0x4F9, 0x4F9}, {0x4FB, 0x4FB}, {0x4FD, 0x4FD}, {0x4FF, 0x4FF}, {0x501, 0x501}, + {0x503, 0x503}, {0x505, 0x505}, {0x507, 0x507}, {0x509, 0x509}, {0x50B, 0x50B}, {0x50D, 0x50D}, + {0x50F, 0x50F}, {0x511, 0x511}, {0x513, 0x513}, {0x515, 0x515}, {0x517, 0x517}, {0x519, 0x519}, + {0x51B, 0x51B}, {0x51D, 0x51D}, {0x51F, 0x51F}, {0x521, 0x521}, {0x523, 0x523}, {0x525, 0x525}, + {0x527, 0x527}, {0x529, 0x529}, {0x52B, 0x52B}, {0x52D, 0x52D}, {0x52F, 0x52F}, {0x560, 0x588}, + {0x10D0, 0x10FA}, {0x10FD, 0x10FF}, {0x13F8, 0x13FD}, {0x1C80, 0x1C88}, {0x1D00, 0x1D2B}, {0x1D6B, 0x1D77}, + {0x1D79, 0x1D9A}, {0x1E01, 0x1E01}, {0x1E03, 0x1E03}, {0x1E05, 0x1E05}, {0x1E07, 0x1E07}, {0x1E09, 0x1E09}, + {0x1E0B, 0x1E0B}, {0x1E0D, 0x1E0D}, {0x1E0F, 0x1E0F}, {0x1E11, 0x1E11}, {0x1E13, 0x1E13}, {0x1E15, 0x1E15}, + {0x1E17, 0x1E17}, {0x1E19, 0x1E19}, {0x1E1B, 0x1E1B}, {0x1E1D, 0x1E1D}, {0x1E1F, 0x1E1F}, {0x1E21, 0x1E21}, + {0x1E23, 0x1E23}, {0x1E25, 0x1E25}, {0x1E27, 0x1E27}, {0x1E29, 0x1E29}, {0x1E2B, 0x1E2B}, {0x1E2D, 0x1E2D}, + {0x1E2F, 0x1E2F}, {0x1E31, 0x1E31}, {0x1E33, 0x1E33}, {0x1E35, 0x1E35}, {0x1E37, 0x1E37}, {0x1E39, 0x1E39}, + {0x1E3B, 0x1E3B}, {0x1E3D, 0x1E3D}, {0x1E3F, 0x1E3F}, {0x1E41, 0x1E41}, {0x1E43, 0x1E43}, {0x1E45, 0x1E45}, + {0x1E47, 0x1E47}, {0x1E49, 0x1E49}, {0x1E4B, 0x1E4B}, {0x1E4D, 0x1E4D}, {0x1E4F, 0x1E4F}, {0x1E51, 0x1E51}, + {0x1E53, 0x1E53}, {0x1E55, 0x1E55}, {0x1E57, 0x1E57}, {0x1E59, 0x1E59}, {0x1E5B, 0x1E5B}, {0x1E5D, 0x1E5D}, + {0x1E5F, 0x1E5F}, {0x1E61, 0x1E61}, {0x1E63, 0x1E63}, {0x1E65, 0x1E65}, {0x1E67, 0x1E67}, {0x1E69, 0x1E69}, + {0x1E6B, 0x1E6B}, {0x1E6D, 0x1E6D}, {0x1E6F, 0x1E6F}, {0x1E71, 0x1E71}, {0x1E73, 0x1E73}, {0x1E75, 0x1E75}, + {0x1E77, 0x1E77}, {0x1E79, 0x1E79}, {0x1E7B, 0x1E7B}, {0x1E7D, 0x1E7D}, {0x1E7F, 0x1E7F}, {0x1E81, 0x1E81}, + {0x1E83, 0x1E83}, {0x1E85, 0x1E85}, {0x1E87, 0x1E87}, {0x1E89, 0x1E89}, {0x1E8B, 0x1E8B}, {0x1E8D, 0x1E8D}, + {0x1E8F, 0x1E8F}, {0x1E91, 0x1E91}, {0x1E93, 0x1E93}, {0x1E95, 0x1E9D}, {0x1E9F, 0x1E9F}, {0x1EA1, 0x1EA1}, + {0x1EA3, 0x1EA3}, {0x1EA5, 0x1EA5}, {0x1EA7, 0x1EA7}, {0x1EA9, 0x1EA9}, {0x1EAB, 0x1EAB}, {0x1EAD, 0x1EAD}, + {0x1EAF, 0x1EAF}, {0x1EB1, 0x1EB1}, {0x1EB3, 0x1EB3}, {0x1EB5, 0x1EB5}, {0x1EB7, 0x1EB7}, {0x1EB9, 0x1EB9}, + {0x1EBB, 0x1EBB}, {0x1EBD, 0x1EBD}, {0x1EBF, 0x1EBF}, {0x1EC1, 0x1EC1}, {0x1EC3, 0x1EC3}, {0x1EC5, 0x1EC5}, + {0x1EC7, 0x1EC7}, {0x1EC9, 0x1EC9}, {0x1ECB, 0x1ECB}, {0x1ECD, 0x1ECD}, {0x1ECF, 0x1ECF}, {0x1ED1, 0x1ED1}, + {0x1ED3, 0x1ED3}, {0x1ED5, 0x1ED5}, {0x1ED7, 0x1ED7}, {0x1ED9, 0x1ED9}, {0x1EDB, 0x1EDB}, {0x1EDD, 0x1EDD}, + {0x1EDF, 0x1EDF}, {0x1EE1, 0x1EE1}, {0x1EE3, 0x1EE3}, {0x1EE5, 0x1EE5}, {0x1EE7, 0x1EE7}, {0x1EE9, 0x1EE9}, + {0x1EEB, 0x1EEB}, {0x1EED, 0x1EED}, {0x1EEF, 0x1EEF}, {0x1EF1, 0x1EF1}, {0x1EF3, 0x1EF3}, {0x1EF5, 0x1EF5}, + {0x1EF7, 0x1EF7}, {0x1EF9, 0x1EF9}, {0x1EFB, 0x1EFB}, {0x1EFD, 0x1EFD}, {0x1EFF, 0x1F07}, {0x1F10, 0x1F15}, + {0x1F20, 0x1F27}, {0x1F30, 0x1F37}, {0x1F40, 0x1F45}, {0x1F50, 0x1F57}, {0x1F60, 0x1F67}, {0x1F70, 0x1F7D}, + {0x1F80, 0x1F87}, {0x1F90, 0x1F97}, {0x1FA0, 0x1FA7}, {0x1FB0, 0x1FB4}, {0x1FB6, 0x1FB7}, {0x1FBE, 0x1FBE}, + {0x1FC2, 0x1FC4}, {0x1FC6, 0x1FC7}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FD7}, {0x1FE0, 0x1FE7}, {0x1FF2, 0x1FF4}, + {0x1FF6, 0x1FF7}, {0x210A, 0x210A}, {0x210E, 0x210F}, {0x2113, 0x2113}, {0x212F, 0x212F}, {0x2134, 0x2134}, + {0x2139, 0x2139}, {0x213C, 0x213D}, {0x2146, 0x2149}, {0x214E, 0x214E}, {0x2184, 0x2184}, {0x2C30, 0x2C5F}, + {0x2C61, 0x2C61}, {0x2C65, 0x2C66}, {0x2C68, 0x2C68}, {0x2C6A, 0x2C6A}, {0x2C6C, 0x2C6C}, {0x2C71, 0x2C71}, + {0x2C73, 0x2C74}, {0x2C76, 0x2C7B}, {0x2C81, 0x2C81}, {0x2C83, 0x2C83}, {0x2C85, 0x2C85}, {0x2C87, 0x2C87}, + {0x2C89, 0x2C89}, {0x2C8B, 0x2C8B}, {0x2C8D, 0x2C8D}, {0x2C8F, 0x2C8F}, {0x2C91, 0x2C91}, {0x2C93, 0x2C93}, + {0x2C95, 0x2C95}, {0x2C97, 0x2C97}, {0x2C99, 0x2C99}, {0x2C9B, 0x2C9B}, {0x2C9D, 0x2C9D}, {0x2C9F, 0x2C9F}, + {0x2CA1, 0x2CA1}, {0x2CA3, 0x2CA3}, {0x2CA5, 0x2CA5}, {0x2CA7, 0x2CA7}, {0x2CA9, 0x2CA9}, {0x2CAB, 0x2CAB}, + {0x2CAD, 0x2CAD}, {0x2CAF, 0x2CAF}, {0x2CB1, 0x2CB1}, {0x2CB3, 0x2CB3}, {0x2CB5, 0x2CB5}, {0x2CB7, 0x2CB7}, + {0x2CB9, 0x2CB9}, {0x2CBB, 0x2CBB}, {0x2CBD, 0x2CBD}, {0x2CBF, 0x2CBF}, {0x2CC1, 0x2CC1}, {0x2CC3, 0x2CC3}, + {0x2CC5, 0x2CC5}, {0x2CC7, 0x2CC7}, {0x2CC9, 0x2CC9}, {0x2CCB, 0x2CCB}, {0x2CCD, 0x2CCD}, {0x2CCF, 0x2CCF}, + {0x2CD1, 0x2CD1}, {0x2CD3, 0x2CD3}, {0x2CD5, 0x2CD5}, {0x2CD7, 0x2CD7}, {0x2CD9, 0x2CD9}, {0x2CDB, 0x2CDB}, + {0x2CDD, 0x2CDD}, {0x2CDF, 0x2CDF}, {0x2CE1, 0x2CE1}, {0x2CE3, 0x2CE4}, {0x2CEC, 0x2CEC}, {0x2CEE, 0x2CEE}, + {0x2CF3, 0x2CF3}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, {0xA641, 0xA641}, {0xA643, 0xA643}, + {0xA645, 0xA645}, {0xA647, 0xA647}, {0xA649, 0xA649}, {0xA64B, 0xA64B}, {0xA64D, 0xA64D}, {0xA64F, 0xA64F}, + {0xA651, 0xA651}, {0xA653, 0xA653}, {0xA655, 0xA655}, {0xA657, 0xA657}, {0xA659, 0xA659}, {0xA65B, 0xA65B}, + {0xA65D, 0xA65D}, {0xA65F, 0xA65F}, {0xA661, 0xA661}, {0xA663, 0xA663}, {0xA665, 0xA665}, {0xA667, 0xA667}, + {0xA669, 0xA669}, {0xA66B, 0xA66B}, {0xA66D, 0xA66D}, {0xA681, 0xA681}, {0xA683, 0xA683}, {0xA685, 0xA685}, + {0xA687, 0xA687}, {0xA689, 0xA689}, {0xA68B, 0xA68B}, {0xA68D, 0xA68D}, {0xA68F, 0xA68F}, {0xA691, 0xA691}, + {0xA693, 0xA693}, {0xA695, 0xA695}, {0xA697, 0xA697}, {0xA699, 0xA699}, {0xA69B, 0xA69B}, {0xA723, 0xA723}, + {0xA725, 0xA725}, {0xA727, 0xA727}, {0xA729, 0xA729}, {0xA72B, 0xA72B}, {0xA72D, 0xA72D}, {0xA72F, 0xA731}, + {0xA733, 0xA733}, {0xA735, 0xA735}, {0xA737, 0xA737}, {0xA739, 0xA739}, {0xA73B, 0xA73B}, {0xA73D, 0xA73D}, + {0xA73F, 0xA73F}, {0xA741, 0xA741}, {0xA743, 0xA743}, {0xA745, 0xA745}, {0xA747, 0xA747}, {0xA749, 0xA749}, + {0xA74B, 0xA74B}, {0xA74D, 0xA74D}, {0xA74F, 0xA74F}, {0xA751, 0xA751}, {0xA753, 0xA753}, {0xA755, 0xA755}, + {0xA757, 0xA757}, {0xA759, 0xA759}, {0xA75B, 0xA75B}, {0xA75D, 0xA75D}, {0xA75F, 0xA75F}, {0xA761, 0xA761}, + {0xA763, 0xA763}, {0xA765, 0xA765}, {0xA767, 0xA767}, {0xA769, 0xA769}, {0xA76B, 0xA76B}, {0xA76D, 0xA76D}, + {0xA76F, 0xA76F}, {0xA771, 0xA778}, {0xA77A, 0xA77A}, {0xA77C, 0xA77C}, {0xA77F, 0xA77F}, {0xA781, 0xA781}, + {0xA783, 0xA783}, {0xA785, 0xA785}, {0xA787, 0xA787}, {0xA78C, 0xA78C}, {0xA78E, 0xA78E}, {0xA791, 0xA791}, + {0xA793, 0xA795}, {0xA797, 0xA797}, {0xA799, 0xA799}, {0xA79B, 0xA79B}, {0xA79D, 0xA79D}, {0xA79F, 0xA79F}, + {0xA7A1, 0xA7A1}, {0xA7A3, 0xA7A3}, {0xA7A5, 0xA7A5}, {0xA7A7, 0xA7A7}, {0xA7A9, 0xA7A9}, {0xA7AF, 0xA7AF}, + {0xA7B5, 0xA7B5}, {0xA7B7, 0xA7B7}, {0xA7B9, 0xA7B9}, {0xA7BB, 0xA7BB}, {0xA7BD, 0xA7BD}, {0xA7BF, 0xA7BF}, + {0xA7C1, 0xA7C1}, {0xA7C3, 0xA7C3}, {0xA7C8, 0xA7C8}, {0xA7CA, 0xA7CA}, {0xA7D1, 0xA7D1}, {0xA7D3, 0xA7D3}, + {0xA7D5, 0xA7D5}, {0xA7D7, 0xA7D7}, {0xA7D9, 0xA7D9}, {0xA7F6, 0xA7F6}, {0xA7FA, 0xA7FA}, {0xAB30, 0xAB5A}, + {0xAB60, 0xAB68}, {0xAB70, 0xABBF}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFF41, 0xFF5A}, {0x10428, 0x1044F}, + {0x104D8, 0x104FB}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, {0x105BB, 0x105BC}, {0x10CC0, 0x10CF2}, + {0x118C0, 0x118DF}, {0x16E60, 0x16E7F}, {0x1D41A, 0x1D433}, {0x1D44E, 0x1D454}, {0x1D456, 0x1D467}, {0x1D482, 0x1D49B}, + {0x1D4B6, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D4CF}, {0x1D4EA, 0x1D503}, {0x1D51E, 0x1D537}, + {0x1D552, 0x1D56B}, {0x1D586, 0x1D59F}, {0x1D5BA, 0x1D5D3}, {0x1D5EE, 0x1D607}, {0x1D622, 0x1D63B}, {0x1D656, 0x1D66F}, + {0x1D68A, 0x1D6A5}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6E1}, {0x1D6FC, 0x1D714}, {0x1D716, 0x1D71B}, {0x1D736, 0x1D74E}, + {0x1D750, 0x1D755}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D78F}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7C9}, {0x1D7CB, 0x1D7CB}, + {0x1DF00, 0x1DF09}, {0x1DF0B, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E922, 0x1E943}, +}; + +static const CpRange kCatNd[] = { + {0x30, 0x39}, {0x660, 0x669}, {0x6F0, 0x6F9}, {0x7C0, 0x7C9}, {0x966, 0x96F}, {0x9E6, 0x9EF}, + {0xA66, 0xA6F}, {0xAE6, 0xAEF}, {0xB66, 0xB6F}, {0xBE6, 0xBEF}, {0xC66, 0xC6F}, {0xCE6, 0xCEF}, + {0xD66, 0xD6F}, {0xDE6, 0xDEF}, {0xE50, 0xE59}, {0xED0, 0xED9}, {0xF20, 0xF29}, {0x1040, 0x1049}, + {0x1090, 0x1099}, {0x17E0, 0x17E9}, {0x1810, 0x1819}, {0x1946, 0x194F}, {0x19D0, 0x19D9}, {0x1A80, 0x1A89}, + {0x1A90, 0x1A99}, {0x1B50, 0x1B59}, {0x1BB0, 0x1BB9}, {0x1C40, 0x1C49}, {0x1C50, 0x1C59}, {0xA620, 0xA629}, + {0xA8D0, 0xA8D9}, {0xA900, 0xA909}, {0xA9D0, 0xA9D9}, {0xA9F0, 0xA9F9}, {0xAA50, 0xAA59}, {0xABF0, 0xABF9}, + {0xFF10, 0xFF19}, {0x104A0, 0x104A9}, {0x10D30, 0x10D39}, {0x11066, 0x1106F}, {0x110F0, 0x110F9}, {0x11136, 0x1113F}, + {0x111D0, 0x111D9}, {0x112F0, 0x112F9}, {0x11450, 0x11459}, {0x114D0, 0x114D9}, {0x11650, 0x11659}, {0x116C0, 0x116C9}, + {0x11730, 0x11739}, {0x118E0, 0x118E9}, {0x11950, 0x11959}, {0x11C50, 0x11C59}, {0x11D50, 0x11D59}, {0x11DA0, 0x11DA9}, + {0x11F50, 0x11F59}, {0x16A60, 0x16A69}, {0x16AC0, 0x16AC9}, {0x16B50, 0x16B59}, {0x1D7CE, 0x1D7FF}, {0x1E140, 0x1E149}, + {0x1E2F0, 0x1E2F9}, {0x1E4F0, 0x1E4F9}, {0x1E950, 0x1E959}, {0x1FBF0, 0x1FBF9}, +}; + +static const CpMulti kNfkc[] = { + {0xA0, U"\U00000020"}, + {0xA8, U"\U00000020\U00000308"}, + {0xAA, U"\U00000061"}, + {0xAF, U"\U00000020\U00000304"}, + {0xB2, U"\U00000032"}, + {0xB3, U"\U00000033"}, + {0xB4, U"\U00000020\U00000301"}, + {0xB5, U"\U000003BC"}, + {0xB8, U"\U00000020\U00000327"}, + {0xB9, U"\U00000031"}, + {0xBA, U"\U0000006F"}, + {0xBC, U"\U00000031\U00002044\U00000034"}, + {0xBD, U"\U00000031\U00002044\U00000032"}, + {0xBE, U"\U00000033\U00002044\U00000034"}, + {0x132, U"\U00000049\U0000004A"}, + {0x133, U"\U00000069\U0000006A"}, + {0x13F, U"\U0000004C\U000000B7"}, + {0x140, U"\U0000006C\U000000B7"}, + {0x149, U"\U000002BC\U0000006E"}, + {0x17F, U"\U00000073"}, + {0x1C4, U"\U00000044\U0000017D"}, + {0x1C5, U"\U00000044\U0000017E"}, + {0x1C6, U"\U00000064\U0000017E"}, + {0x1C7, U"\U0000004C\U0000004A"}, + {0x1C8, U"\U0000004C\U0000006A"}, + {0x1C9, U"\U0000006C\U0000006A"}, + {0x1CA, U"\U0000004E\U0000004A"}, + {0x1CB, U"\U0000004E\U0000006A"}, + {0x1CC, U"\U0000006E\U0000006A"}, + {0x1F1, U"\U00000044\U0000005A"}, + {0x1F2, U"\U00000044\U0000007A"}, + {0x1F3, U"\U00000064\U0000007A"}, + {0x2B0, U"\U00000068"}, + {0x2B1, U"\U00000266"}, + {0x2B2, U"\U0000006A"}, + {0x2B3, U"\U00000072"}, + {0x2B4, U"\U00000279"}, + {0x2B5, U"\U0000027B"}, + {0x2B6, U"\U00000281"}, + {0x2B7, U"\U00000077"}, + {0x2B8, U"\U00000079"}, + {0x2D8, U"\U00000020\U00000306"}, + {0x2D9, U"\U00000020\U00000307"}, + {0x2DA, U"\U00000020\U0000030A"}, + {0x2DB, U"\U00000020\U00000328"}, + {0x2DC, U"\U00000020\U00000303"}, + {0x2DD, U"\U00000020\U0000030B"}, + {0x2E0, U"\U00000263"}, + {0x2E1, U"\U0000006C"}, + {0x2E2, U"\U00000073"}, + {0x2E3, U"\U00000078"}, + {0x2E4, U"\U00000295"}, + {0x340, U"\U00000300"}, + {0x341, U"\U00000301"}, + {0x343, U"\U00000313"}, + {0x344, U"\U00000308\U00000301"}, + {0x374, U"\U000002B9"}, + {0x37A, U"\U00000020\U00000345"}, + {0x37E, U"\U0000003B"}, + {0x384, U"\U00000020\U00000301"}, + {0x385, U"\U00000020\U00000308\U00000301"}, + {0x387, U"\U000000B7"}, + {0x3D0, U"\U000003B2"}, + {0x3D1, U"\U000003B8"}, + {0x3D2, U"\U000003A5"}, + {0x3D3, U"\U0000038E"}, + {0x3D4, U"\U000003AB"}, + {0x3D5, U"\U000003C6"}, + {0x3D6, U"\U000003C0"}, + {0x3F0, U"\U000003BA"}, + {0x3F1, U"\U000003C1"}, + {0x3F2, U"\U000003C2"}, + {0x3F4, U"\U00000398"}, + {0x3F5, U"\U000003B5"}, + {0x3F9, U"\U000003A3"}, + {0x587, U"\U00000565\U00000582"}, + {0x675, U"\U00000627\U00000674"}, + {0x676, U"\U00000648\U00000674"}, + {0x677, U"\U000006C7\U00000674"}, + {0x678, U"\U0000064A\U00000674"}, + {0x958, U"\U00000915\U0000093C"}, + {0x959, U"\U00000916\U0000093C"}, + {0x95A, U"\U00000917\U0000093C"}, + {0x95B, U"\U0000091C\U0000093C"}, + {0x95C, U"\U00000921\U0000093C"}, + {0x95D, U"\U00000922\U0000093C"}, + {0x95E, U"\U0000092B\U0000093C"}, + {0x95F, U"\U0000092F\U0000093C"}, + {0x9DC, U"\U000009A1\U000009BC"}, + {0x9DD, U"\U000009A2\U000009BC"}, + {0x9DF, U"\U000009AF\U000009BC"}, + {0xA33, U"\U00000A32\U00000A3C"}, + {0xA36, U"\U00000A38\U00000A3C"}, + {0xA59, U"\U00000A16\U00000A3C"}, + {0xA5A, U"\U00000A17\U00000A3C"}, + {0xA5B, U"\U00000A1C\U00000A3C"}, + {0xA5E, U"\U00000A2B\U00000A3C"}, + {0xB5C, U"\U00000B21\U00000B3C"}, + {0xB5D, U"\U00000B22\U00000B3C"}, + {0xE33, U"\U00000E4D\U00000E32"}, + {0xEB3, U"\U00000ECD\U00000EB2"}, + {0xEDC, U"\U00000EAB\U00000E99"}, + {0xEDD, U"\U00000EAB\U00000EA1"}, + {0xF0C, U"\U00000F0B"}, + {0xF43, U"\U00000F42\U00000FB7"}, + {0xF4D, U"\U00000F4C\U00000FB7"}, + {0xF52, U"\U00000F51\U00000FB7"}, + {0xF57, U"\U00000F56\U00000FB7"}, + {0xF5C, U"\U00000F5B\U00000FB7"}, + {0xF69, U"\U00000F40\U00000FB5"}, + {0xF73, U"\U00000F71\U00000F72"}, + {0xF75, U"\U00000F71\U00000F74"}, + {0xF76, U"\U00000FB2\U00000F80"}, + {0xF77, U"\U00000FB2\U00000F71\U00000F80"}, + {0xF78, U"\U00000FB3\U00000F80"}, + {0xF79, U"\U00000FB3\U00000F71\U00000F80"}, + {0xF81, U"\U00000F71\U00000F80"}, + {0xF93, U"\U00000F92\U00000FB7"}, + {0xF9D, U"\U00000F9C\U00000FB7"}, + {0xFA2, U"\U00000FA1\U00000FB7"}, + {0xFA7, U"\U00000FA6\U00000FB7"}, + {0xFAC, U"\U00000FAB\U00000FB7"}, + {0xFB9, U"\U00000F90\U00000FB5"}, + {0x10FC, U"\U000010DC"}, + {0x1D2C, U"\U00000041"}, + {0x1D2D, U"\U000000C6"}, + {0x1D2E, U"\U00000042"}, + {0x1D30, U"\U00000044"}, + {0x1D31, U"\U00000045"}, + {0x1D32, U"\U0000018E"}, + {0x1D33, U"\U00000047"}, + {0x1D34, U"\U00000048"}, + {0x1D35, U"\U00000049"}, + {0x1D36, U"\U0000004A"}, + {0x1D37, U"\U0000004B"}, + {0x1D38, U"\U0000004C"}, + {0x1D39, U"\U0000004D"}, + {0x1D3A, U"\U0000004E"}, + {0x1D3C, U"\U0000004F"}, + {0x1D3D, U"\U00000222"}, + {0x1D3E, U"\U00000050"}, + {0x1D3F, U"\U00000052"}, + {0x1D40, U"\U00000054"}, + {0x1D41, U"\U00000055"}, + {0x1D42, U"\U00000057"}, + {0x1D43, U"\U00000061"}, + {0x1D44, U"\U00000250"}, + {0x1D45, U"\U00000251"}, + {0x1D46, U"\U00001D02"}, + {0x1D47, U"\U00000062"}, + {0x1D48, U"\U00000064"}, + {0x1D49, U"\U00000065"}, + {0x1D4A, U"\U00000259"}, + {0x1D4B, U"\U0000025B"}, + {0x1D4C, U"\U0000025C"}, + {0x1D4D, U"\U00000067"}, + {0x1D4F, U"\U0000006B"}, + {0x1D50, U"\U0000006D"}, + {0x1D51, U"\U0000014B"}, + {0x1D52, U"\U0000006F"}, + {0x1D53, U"\U00000254"}, + {0x1D54, U"\U00001D16"}, + {0x1D55, U"\U00001D17"}, + {0x1D56, U"\U00000070"}, + {0x1D57, U"\U00000074"}, + {0x1D58, U"\U00000075"}, + {0x1D59, U"\U00001D1D"}, + {0x1D5A, U"\U0000026F"}, + {0x1D5B, U"\U00000076"}, + {0x1D5C, U"\U00001D25"}, + {0x1D5D, U"\U000003B2"}, + {0x1D5E, U"\U000003B3"}, + {0x1D5F, U"\U000003B4"}, + {0x1D60, U"\U000003C6"}, + {0x1D61, U"\U000003C7"}, + {0x1D62, U"\U00000069"}, + {0x1D63, U"\U00000072"}, + {0x1D64, U"\U00000075"}, + {0x1D65, U"\U00000076"}, + {0x1D66, U"\U000003B2"}, + {0x1D67, U"\U000003B3"}, + {0x1D68, U"\U000003C1"}, + {0x1D69, U"\U000003C6"}, + {0x1D6A, U"\U000003C7"}, + {0x1D78, U"\U0000043D"}, + {0x1D9B, U"\U00000252"}, + {0x1D9C, U"\U00000063"}, + {0x1D9D, U"\U00000255"}, + {0x1D9E, U"\U000000F0"}, + {0x1D9F, U"\U0000025C"}, + {0x1DA0, U"\U00000066"}, + {0x1DA1, U"\U0000025F"}, + {0x1DA2, U"\U00000261"}, + {0x1DA3, U"\U00000265"}, + {0x1DA4, U"\U00000268"}, + {0x1DA5, U"\U00000269"}, + {0x1DA6, U"\U0000026A"}, + {0x1DA7, U"\U00001D7B"}, + {0x1DA8, U"\U0000029D"}, + {0x1DA9, U"\U0000026D"}, + {0x1DAA, U"\U00001D85"}, + {0x1DAB, U"\U0000029F"}, + {0x1DAC, U"\U00000271"}, + {0x1DAD, U"\U00000270"}, + {0x1DAE, U"\U00000272"}, + {0x1DAF, U"\U00000273"}, + {0x1DB0, U"\U00000274"}, + {0x1DB1, U"\U00000275"}, + {0x1DB2, U"\U00000278"}, + {0x1DB3, U"\U00000282"}, + {0x1DB4, U"\U00000283"}, + {0x1DB5, U"\U000001AB"}, + {0x1DB6, U"\U00000289"}, + {0x1DB7, U"\U0000028A"}, + {0x1DB8, U"\U00001D1C"}, + {0x1DB9, U"\U0000028B"}, + {0x1DBA, U"\U0000028C"}, + {0x1DBB, U"\U0000007A"}, + {0x1DBC, U"\U00000290"}, + {0x1DBD, U"\U00000291"}, + {0x1DBE, U"\U00000292"}, + {0x1DBF, U"\U000003B8"}, + {0x1E9A, U"\U00000061\U000002BE"}, + {0x1E9B, U"\U00001E61"}, + {0x1F71, U"\U000003AC"}, + {0x1F73, U"\U000003AD"}, + {0x1F75, U"\U000003AE"}, + {0x1F77, U"\U000003AF"}, + {0x1F79, U"\U000003CC"}, + {0x1F7B, U"\U000003CD"}, + {0x1F7D, U"\U000003CE"}, + {0x1FBB, U"\U00000386"}, + {0x1FBD, U"\U00000020\U00000313"}, + {0x1FBE, U"\U000003B9"}, + {0x1FBF, U"\U00000020\U00000313"}, + {0x1FC0, U"\U00000020\U00000342"}, + {0x1FC1, U"\U00000020\U00000308\U00000342"}, + {0x1FC9, U"\U00000388"}, + {0x1FCB, U"\U00000389"}, + {0x1FCD, U"\U00000020\U00000313\U00000300"}, + {0x1FCE, U"\U00000020\U00000313\U00000301"}, + {0x1FCF, U"\U00000020\U00000313\U00000342"}, + {0x1FD3, U"\U00000390"}, + {0x1FDB, U"\U0000038A"}, + {0x1FDD, U"\U00000020\U00000314\U00000300"}, + {0x1FDE, U"\U00000020\U00000314\U00000301"}, + {0x1FDF, U"\U00000020\U00000314\U00000342"}, + {0x1FE3, U"\U000003B0"}, + {0x1FEB, U"\U0000038E"}, + {0x1FED, U"\U00000020\U00000308\U00000300"}, + {0x1FEE, U"\U00000020\U00000308\U00000301"}, + {0x1FEF, U"\U00000060"}, + {0x1FF9, U"\U0000038C"}, + {0x1FFB, U"\U0000038F"}, + {0x1FFD, U"\U00000020\U00000301"}, + {0x1FFE, U"\U00000020\U00000314"}, + {0x2000, U"\U00000020"}, + {0x2001, U"\U00000020"}, + {0x2002, U"\U00000020"}, + {0x2003, U"\U00000020"}, + {0x2004, U"\U00000020"}, + {0x2005, U"\U00000020"}, + {0x2006, U"\U00000020"}, + {0x2007, U"\U00000020"}, + {0x2008, U"\U00000020"}, + {0x2009, U"\U00000020"}, + {0x200A, U"\U00000020"}, + {0x2011, U"\U00002010"}, + {0x2017, U"\U00000020\U00000333"}, + {0x2024, U"\U0000002E"}, + {0x2025, U"\U0000002E\U0000002E"}, + {0x2026, U"\U0000002E\U0000002E\U0000002E"}, + {0x202F, U"\U00000020"}, + {0x2033, U"\U00002032\U00002032"}, + {0x2034, U"\U00002032\U00002032\U00002032"}, + {0x2036, U"\U00002035\U00002035"}, + {0x2037, U"\U00002035\U00002035\U00002035"}, + {0x203C, U"\U00000021\U00000021"}, + {0x203E, U"\U00000020\U00000305"}, + {0x2047, U"\U0000003F\U0000003F"}, + {0x2048, U"\U0000003F\U00000021"}, + {0x2049, U"\U00000021\U0000003F"}, + {0x2057, U"\U00002032\U00002032\U00002032\U00002032"}, + {0x205F, U"\U00000020"}, + {0x2070, U"\U00000030"}, + {0x2071, U"\U00000069"}, + {0x2074, U"\U00000034"}, + {0x2075, U"\U00000035"}, + {0x2076, U"\U00000036"}, + {0x2077, U"\U00000037"}, + {0x2078, U"\U00000038"}, + {0x2079, U"\U00000039"}, + {0x207A, U"\U0000002B"}, + {0x207B, U"\U00002212"}, + {0x207C, U"\U0000003D"}, + {0x207D, U"\U00000028"}, + {0x207E, U"\U00000029"}, + {0x207F, U"\U0000006E"}, + {0x2080, U"\U00000030"}, + {0x2081, U"\U00000031"}, + {0x2082, U"\U00000032"}, + {0x2083, U"\U00000033"}, + {0x2084, U"\U00000034"}, + {0x2085, U"\U00000035"}, + {0x2086, U"\U00000036"}, + {0x2087, U"\U00000037"}, + {0x2088, U"\U00000038"}, + {0x2089, U"\U00000039"}, + {0x208A, U"\U0000002B"}, + {0x208B, U"\U00002212"}, + {0x208C, U"\U0000003D"}, + {0x208D, U"\U00000028"}, + {0x208E, U"\U00000029"}, + {0x2090, U"\U00000061"}, + {0x2091, U"\U00000065"}, + {0x2092, U"\U0000006F"}, + {0x2093, U"\U00000078"}, + {0x2094, U"\U00000259"}, + {0x2095, U"\U00000068"}, + {0x2096, U"\U0000006B"}, + {0x2097, U"\U0000006C"}, + {0x2098, U"\U0000006D"}, + {0x2099, U"\U0000006E"}, + {0x209A, U"\U00000070"}, + {0x209B, U"\U00000073"}, + {0x209C, U"\U00000074"}, + {0x20A8, U"\U00000052\U00000073"}, + {0x2100, U"\U00000061\U0000002F\U00000063"}, + {0x2101, U"\U00000061\U0000002F\U00000073"}, + {0x2102, U"\U00000043"}, + {0x2103, U"\U000000B0\U00000043"}, + {0x2105, U"\U00000063\U0000002F\U0000006F"}, + {0x2106, U"\U00000063\U0000002F\U00000075"}, + {0x2107, U"\U00000190"}, + {0x2109, U"\U000000B0\U00000046"}, + {0x210A, U"\U00000067"}, + {0x210B, U"\U00000048"}, + {0x210C, U"\U00000048"}, + {0x210D, U"\U00000048"}, + {0x210E, U"\U00000068"}, + {0x210F, U"\U00000127"}, + {0x2110, U"\U00000049"}, + {0x2111, U"\U00000049"}, + {0x2112, U"\U0000004C"}, + {0x2113, U"\U0000006C"}, + {0x2115, U"\U0000004E"}, + {0x2116, U"\U0000004E\U0000006F"}, + {0x2119, U"\U00000050"}, + {0x211A, U"\U00000051"}, + {0x211B, U"\U00000052"}, + {0x211C, U"\U00000052"}, + {0x211D, U"\U00000052"}, + {0x2120, U"\U00000053\U0000004D"}, + {0x2121, U"\U00000054\U00000045\U0000004C"}, + {0x2122, U"\U00000054\U0000004D"}, + {0x2124, U"\U0000005A"}, + {0x2126, U"\U000003A9"}, + {0x2128, U"\U0000005A"}, + {0x212A, U"\U0000004B"}, + {0x212B, U"\U000000C5"}, + {0x212C, U"\U00000042"}, + {0x212D, U"\U00000043"}, + {0x212F, U"\U00000065"}, + {0x2130, U"\U00000045"}, + {0x2131, U"\U00000046"}, + {0x2133, U"\U0000004D"}, + {0x2134, U"\U0000006F"}, + {0x2135, U"\U000005D0"}, + {0x2136, U"\U000005D1"}, + {0x2137, U"\U000005D2"}, + {0x2138, U"\U000005D3"}, + {0x2139, U"\U00000069"}, + {0x213B, U"\U00000046\U00000041\U00000058"}, + {0x213C, U"\U000003C0"}, + {0x213D, U"\U000003B3"}, + {0x213E, U"\U00000393"}, + {0x213F, U"\U000003A0"}, + {0x2140, U"\U00002211"}, + {0x2145, U"\U00000044"}, + {0x2146, U"\U00000064"}, + {0x2147, U"\U00000065"}, + {0x2148, U"\U00000069"}, + {0x2149, U"\U0000006A"}, + {0x2150, U"\U00000031\U00002044\U00000037"}, + {0x2151, U"\U00000031\U00002044\U00000039"}, + {0x2152, U"\U00000031\U00002044\U00000031\U00000030"}, + {0x2153, U"\U00000031\U00002044\U00000033"}, + {0x2154, U"\U00000032\U00002044\U00000033"}, + {0x2155, U"\U00000031\U00002044\U00000035"}, + {0x2156, U"\U00000032\U00002044\U00000035"}, + {0x2157, U"\U00000033\U00002044\U00000035"}, + {0x2158, U"\U00000034\U00002044\U00000035"}, + {0x2159, U"\U00000031\U00002044\U00000036"}, + {0x215A, U"\U00000035\U00002044\U00000036"}, + {0x215B, U"\U00000031\U00002044\U00000038"}, + {0x215C, U"\U00000033\U00002044\U00000038"}, + {0x215D, U"\U00000035\U00002044\U00000038"}, + {0x215E, U"\U00000037\U00002044\U00000038"}, + {0x215F, U"\U00000031\U00002044"}, + {0x2160, U"\U00000049"}, + {0x2161, U"\U00000049\U00000049"}, + {0x2162, U"\U00000049\U00000049\U00000049"}, + {0x2163, U"\U00000049\U00000056"}, + {0x2164, U"\U00000056"}, + {0x2165, U"\U00000056\U00000049"}, + {0x2166, U"\U00000056\U00000049\U00000049"}, + {0x2167, U"\U00000056\U00000049\U00000049\U00000049"}, + {0x2168, U"\U00000049\U00000058"}, + {0x2169, U"\U00000058"}, + {0x216A, U"\U00000058\U00000049"}, + {0x216B, U"\U00000058\U00000049\U00000049"}, + {0x216C, U"\U0000004C"}, + {0x216D, U"\U00000043"}, + {0x216E, U"\U00000044"}, + {0x216F, U"\U0000004D"}, + {0x2170, U"\U00000069"}, + {0x2171, U"\U00000069\U00000069"}, + {0x2172, U"\U00000069\U00000069\U00000069"}, + {0x2173, U"\U00000069\U00000076"}, + {0x2174, U"\U00000076"}, + {0x2175, U"\U00000076\U00000069"}, + {0x2176, U"\U00000076\U00000069\U00000069"}, + {0x2177, U"\U00000076\U00000069\U00000069\U00000069"}, + {0x2178, U"\U00000069\U00000078"}, + {0x2179, U"\U00000078"}, + {0x217A, U"\U00000078\U00000069"}, + {0x217B, U"\U00000078\U00000069\U00000069"}, + {0x217C, U"\U0000006C"}, + {0x217D, U"\U00000063"}, + {0x217E, U"\U00000064"}, + {0x217F, U"\U0000006D"}, + {0x2189, U"\U00000030\U00002044\U00000033"}, + {0x222C, U"\U0000222B\U0000222B"}, + {0x222D, U"\U0000222B\U0000222B\U0000222B"}, + {0x222F, U"\U0000222E\U0000222E"}, + {0x2230, U"\U0000222E\U0000222E\U0000222E"}, + {0x2329, U"\U00003008"}, + {0x232A, U"\U00003009"}, + {0x2460, U"\U00000031"}, + {0x2461, U"\U00000032"}, + {0x2462, U"\U00000033"}, + {0x2463, U"\U00000034"}, + {0x2464, U"\U00000035"}, + {0x2465, U"\U00000036"}, + {0x2466, U"\U00000037"}, + {0x2467, U"\U00000038"}, + {0x2468, U"\U00000039"}, + {0x2469, U"\U00000031\U00000030"}, + {0x246A, U"\U00000031\U00000031"}, + {0x246B, U"\U00000031\U00000032"}, + {0x246C, U"\U00000031\U00000033"}, + {0x246D, U"\U00000031\U00000034"}, + {0x246E, U"\U00000031\U00000035"}, + {0x246F, U"\U00000031\U00000036"}, + {0x2470, U"\U00000031\U00000037"}, + {0x2471, U"\U00000031\U00000038"}, + {0x2472, U"\U00000031\U00000039"}, + {0x2473, U"\U00000032\U00000030"}, + {0x2474, U"\U00000028\U00000031\U00000029"}, + {0x2475, U"\U00000028\U00000032\U00000029"}, + {0x2476, U"\U00000028\U00000033\U00000029"}, + {0x2477, U"\U00000028\U00000034\U00000029"}, + {0x2478, U"\U00000028\U00000035\U00000029"}, + {0x2479, U"\U00000028\U00000036\U00000029"}, + {0x247A, U"\U00000028\U00000037\U00000029"}, + {0x247B, U"\U00000028\U00000038\U00000029"}, + {0x247C, U"\U00000028\U00000039\U00000029"}, + {0x247D, U"\U00000028\U00000031\U00000030\U00000029"}, + {0x247E, U"\U00000028\U00000031\U00000031\U00000029"}, + {0x247F, U"\U00000028\U00000031\U00000032\U00000029"}, + {0x2480, U"\U00000028\U00000031\U00000033\U00000029"}, + {0x2481, U"\U00000028\U00000031\U00000034\U00000029"}, + {0x2482, U"\U00000028\U00000031\U00000035\U00000029"}, + {0x2483, U"\U00000028\U00000031\U00000036\U00000029"}, + {0x2484, U"\U00000028\U00000031\U00000037\U00000029"}, + {0x2485, U"\U00000028\U00000031\U00000038\U00000029"}, + {0x2486, U"\U00000028\U00000031\U00000039\U00000029"}, + {0x2487, U"\U00000028\U00000032\U00000030\U00000029"}, + {0x2488, U"\U00000031\U0000002E"}, + {0x2489, U"\U00000032\U0000002E"}, + {0x248A, U"\U00000033\U0000002E"}, + {0x248B, U"\U00000034\U0000002E"}, + {0x248C, U"\U00000035\U0000002E"}, + {0x248D, U"\U00000036\U0000002E"}, + {0x248E, U"\U00000037\U0000002E"}, + {0x248F, U"\U00000038\U0000002E"}, + {0x2490, U"\U00000039\U0000002E"}, + {0x2491, U"\U00000031\U00000030\U0000002E"}, + {0x2492, U"\U00000031\U00000031\U0000002E"}, + {0x2493, U"\U00000031\U00000032\U0000002E"}, + {0x2494, U"\U00000031\U00000033\U0000002E"}, + {0x2495, U"\U00000031\U00000034\U0000002E"}, + {0x2496, U"\U00000031\U00000035\U0000002E"}, + {0x2497, U"\U00000031\U00000036\U0000002E"}, + {0x2498, U"\U00000031\U00000037\U0000002E"}, + {0x2499, U"\U00000031\U00000038\U0000002E"}, + {0x249A, U"\U00000031\U00000039\U0000002E"}, + {0x249B, U"\U00000032\U00000030\U0000002E"}, + {0x249C, U"\U00000028\U00000061\U00000029"}, + {0x249D, U"\U00000028\U00000062\U00000029"}, + {0x249E, U"\U00000028\U00000063\U00000029"}, + {0x249F, U"\U00000028\U00000064\U00000029"}, + {0x24A0, U"\U00000028\U00000065\U00000029"}, + {0x24A1, U"\U00000028\U00000066\U00000029"}, + {0x24A2, U"\U00000028\U00000067\U00000029"}, + {0x24A3, U"\U00000028\U00000068\U00000029"}, + {0x24A4, U"\U00000028\U00000069\U00000029"}, + {0x24A5, U"\U00000028\U0000006A\U00000029"}, + {0x24A6, U"\U00000028\U0000006B\U00000029"}, + {0x24A7, U"\U00000028\U0000006C\U00000029"}, + {0x24A8, U"\U00000028\U0000006D\U00000029"}, + {0x24A9, U"\U00000028\U0000006E\U00000029"}, + {0x24AA, U"\U00000028\U0000006F\U00000029"}, + {0x24AB, U"\U00000028\U00000070\U00000029"}, + {0x24AC, U"\U00000028\U00000071\U00000029"}, + {0x24AD, U"\U00000028\U00000072\U00000029"}, + {0x24AE, U"\U00000028\U00000073\U00000029"}, + {0x24AF, U"\U00000028\U00000074\U00000029"}, + {0x24B0, U"\U00000028\U00000075\U00000029"}, + {0x24B1, U"\U00000028\U00000076\U00000029"}, + {0x24B2, U"\U00000028\U00000077\U00000029"}, + {0x24B3, U"\U00000028\U00000078\U00000029"}, + {0x24B4, U"\U00000028\U00000079\U00000029"}, + {0x24B5, U"\U00000028\U0000007A\U00000029"}, + {0x24B6, U"\U00000041"}, + {0x24B7, U"\U00000042"}, + {0x24B8, U"\U00000043"}, + {0x24B9, U"\U00000044"}, + {0x24BA, U"\U00000045"}, + {0x24BB, U"\U00000046"}, + {0x24BC, U"\U00000047"}, + {0x24BD, U"\U00000048"}, + {0x24BE, U"\U00000049"}, + {0x24BF, U"\U0000004A"}, + {0x24C0, U"\U0000004B"}, + {0x24C1, U"\U0000004C"}, + {0x24C2, U"\U0000004D"}, + {0x24C3, U"\U0000004E"}, + {0x24C4, U"\U0000004F"}, + {0x24C5, U"\U00000050"}, + {0x24C6, U"\U00000051"}, + {0x24C7, U"\U00000052"}, + {0x24C8, U"\U00000053"}, + {0x24C9, U"\U00000054"}, + {0x24CA, U"\U00000055"}, + {0x24CB, U"\U00000056"}, + {0x24CC, U"\U00000057"}, + {0x24CD, U"\U00000058"}, + {0x24CE, U"\U00000059"}, + {0x24CF, U"\U0000005A"}, + {0x24D0, U"\U00000061"}, + {0x24D1, U"\U00000062"}, + {0x24D2, U"\U00000063"}, + {0x24D3, U"\U00000064"}, + {0x24D4, U"\U00000065"}, + {0x24D5, U"\U00000066"}, + {0x24D6, U"\U00000067"}, + {0x24D7, U"\U00000068"}, + {0x24D8, U"\U00000069"}, + {0x24D9, U"\U0000006A"}, + {0x24DA, U"\U0000006B"}, + {0x24DB, U"\U0000006C"}, + {0x24DC, U"\U0000006D"}, + {0x24DD, U"\U0000006E"}, + {0x24DE, U"\U0000006F"}, + {0x24DF, U"\U00000070"}, + {0x24E0, U"\U00000071"}, + {0x24E1, U"\U00000072"}, + {0x24E2, U"\U00000073"}, + {0x24E3, U"\U00000074"}, + {0x24E4, U"\U00000075"}, + {0x24E5, U"\U00000076"}, + {0x24E6, U"\U00000077"}, + {0x24E7, U"\U00000078"}, + {0x24E8, U"\U00000079"}, + {0x24E9, U"\U0000007A"}, + {0x24EA, U"\U00000030"}, + {0x2A0C, U"\U0000222B\U0000222B\U0000222B\U0000222B"}, + {0x2A74, U"\U0000003A\U0000003A\U0000003D"}, + {0x2A75, U"\U0000003D\U0000003D"}, + {0x2A76, U"\U0000003D\U0000003D\U0000003D"}, + {0x2ADC, U"\U00002ADD\U00000338"}, + {0x2C7C, U"\U0000006A"}, + {0x2C7D, U"\U00000056"}, + {0x2D6F, U"\U00002D61"}, + {0x2E9F, U"\U00006BCD"}, + {0x2EF3, U"\U00009F9F"}, + {0x2F00, U"\U00004E00"}, + {0x2F01, U"\U00004E28"}, + {0x2F02, U"\U00004E36"}, + {0x2F03, U"\U00004E3F"}, + {0x2F04, U"\U00004E59"}, + {0x2F05, U"\U00004E85"}, + {0x2F06, U"\U00004E8C"}, + {0x2F07, U"\U00004EA0"}, + {0x2F08, U"\U00004EBA"}, + {0x2F09, U"\U0000513F"}, + {0x2F0A, U"\U00005165"}, + {0x2F0B, U"\U0000516B"}, + {0x2F0C, U"\U00005182"}, + {0x2F0D, U"\U00005196"}, + {0x2F0E, U"\U000051AB"}, + {0x2F0F, U"\U000051E0"}, + {0x2F10, U"\U000051F5"}, + {0x2F11, U"\U00005200"}, + {0x2F12, U"\U0000529B"}, + {0x2F13, U"\U000052F9"}, + {0x2F14, U"\U00005315"}, + {0x2F15, U"\U0000531A"}, + {0x2F16, U"\U00005338"}, + {0x2F17, U"\U00005341"}, + {0x2F18, U"\U0000535C"}, + {0x2F19, U"\U00005369"}, + {0x2F1A, U"\U00005382"}, + {0x2F1B, U"\U000053B6"}, + {0x2F1C, U"\U000053C8"}, + {0x2F1D, U"\U000053E3"}, + {0x2F1E, U"\U000056D7"}, + {0x2F1F, U"\U0000571F"}, + {0x2F20, U"\U000058EB"}, + {0x2F21, U"\U00005902"}, + {0x2F22, U"\U0000590A"}, + {0x2F23, U"\U00005915"}, + {0x2F24, U"\U00005927"}, + {0x2F25, U"\U00005973"}, + {0x2F26, U"\U00005B50"}, + {0x2F27, U"\U00005B80"}, + {0x2F28, U"\U00005BF8"}, + {0x2F29, U"\U00005C0F"}, + {0x2F2A, U"\U00005C22"}, + {0x2F2B, U"\U00005C38"}, + {0x2F2C, U"\U00005C6E"}, + {0x2F2D, U"\U00005C71"}, + {0x2F2E, U"\U00005DDB"}, + {0x2F2F, U"\U00005DE5"}, + {0x2F30, U"\U00005DF1"}, + {0x2F31, U"\U00005DFE"}, + {0x2F32, U"\U00005E72"}, + {0x2F33, U"\U00005E7A"}, + {0x2F34, U"\U00005E7F"}, + {0x2F35, U"\U00005EF4"}, + {0x2F36, U"\U00005EFE"}, + {0x2F37, U"\U00005F0B"}, + {0x2F38, U"\U00005F13"}, + {0x2F39, U"\U00005F50"}, + {0x2F3A, U"\U00005F61"}, + {0x2F3B, U"\U00005F73"}, + {0x2F3C, U"\U00005FC3"}, + {0x2F3D, U"\U00006208"}, + {0x2F3E, U"\U00006236"}, + {0x2F3F, U"\U0000624B"}, + {0x2F40, U"\U0000652F"}, + {0x2F41, U"\U00006534"}, + {0x2F42, U"\U00006587"}, + {0x2F43, U"\U00006597"}, + {0x2F44, U"\U000065A4"}, + {0x2F45, U"\U000065B9"}, + {0x2F46, U"\U000065E0"}, + {0x2F47, U"\U000065E5"}, + {0x2F48, U"\U000066F0"}, + {0x2F49, U"\U00006708"}, + {0x2F4A, U"\U00006728"}, + {0x2F4B, U"\U00006B20"}, + {0x2F4C, U"\U00006B62"}, + {0x2F4D, U"\U00006B79"}, + {0x2F4E, U"\U00006BB3"}, + {0x2F4F, U"\U00006BCB"}, + {0x2F50, U"\U00006BD4"}, + {0x2F51, U"\U00006BDB"}, + {0x2F52, U"\U00006C0F"}, + {0x2F53, U"\U00006C14"}, + {0x2F54, U"\U00006C34"}, + {0x2F55, U"\U0000706B"}, + {0x2F56, U"\U0000722A"}, + {0x2F57, U"\U00007236"}, + {0x2F58, U"\U0000723B"}, + {0x2F59, U"\U0000723F"}, + {0x2F5A, U"\U00007247"}, + {0x2F5B, U"\U00007259"}, + {0x2F5C, U"\U0000725B"}, + {0x2F5D, U"\U000072AC"}, + {0x2F5E, U"\U00007384"}, + {0x2F5F, U"\U00007389"}, + {0x2F60, U"\U000074DC"}, + {0x2F61, U"\U000074E6"}, + {0x2F62, U"\U00007518"}, + {0x2F63, U"\U0000751F"}, + {0x2F64, U"\U00007528"}, + {0x2F65, U"\U00007530"}, + {0x2F66, U"\U0000758B"}, + {0x2F67, U"\U00007592"}, + {0x2F68, U"\U00007676"}, + {0x2F69, U"\U0000767D"}, + {0x2F6A, U"\U000076AE"}, + {0x2F6B, U"\U000076BF"}, + {0x2F6C, U"\U000076EE"}, + {0x2F6D, U"\U000077DB"}, + {0x2F6E, U"\U000077E2"}, + {0x2F6F, U"\U000077F3"}, + {0x2F70, U"\U0000793A"}, + {0x2F71, U"\U000079B8"}, + {0x2F72, U"\U000079BE"}, + {0x2F73, U"\U00007A74"}, + {0x2F74, U"\U00007ACB"}, + {0x2F75, U"\U00007AF9"}, + {0x2F76, U"\U00007C73"}, + {0x2F77, U"\U00007CF8"}, + {0x2F78, U"\U00007F36"}, + {0x2F79, U"\U00007F51"}, + {0x2F7A, U"\U00007F8A"}, + {0x2F7B, U"\U00007FBD"}, + {0x2F7C, U"\U00008001"}, + {0x2F7D, U"\U0000800C"}, + {0x2F7E, U"\U00008012"}, + {0x2F7F, U"\U00008033"}, + {0x2F80, U"\U0000807F"}, + {0x2F81, U"\U00008089"}, + {0x2F82, U"\U000081E3"}, + {0x2F83, U"\U000081EA"}, + {0x2F84, U"\U000081F3"}, + {0x2F85, U"\U000081FC"}, + {0x2F86, U"\U0000820C"}, + {0x2F87, U"\U0000821B"}, + {0x2F88, U"\U0000821F"}, + {0x2F89, U"\U0000826E"}, + {0x2F8A, U"\U00008272"}, + {0x2F8B, U"\U00008278"}, + {0x2F8C, U"\U0000864D"}, + {0x2F8D, U"\U0000866B"}, + {0x2F8E, U"\U00008840"}, + {0x2F8F, U"\U0000884C"}, + {0x2F90, U"\U00008863"}, + {0x2F91, U"\U0000897E"}, + {0x2F92, U"\U0000898B"}, + {0x2F93, U"\U000089D2"}, + {0x2F94, U"\U00008A00"}, + {0x2F95, U"\U00008C37"}, + {0x2F96, U"\U00008C46"}, + {0x2F97, U"\U00008C55"}, + {0x2F98, U"\U00008C78"}, + {0x2F99, U"\U00008C9D"}, + {0x2F9A, U"\U00008D64"}, + {0x2F9B, U"\U00008D70"}, + {0x2F9C, U"\U00008DB3"}, + {0x2F9D, U"\U00008EAB"}, + {0x2F9E, U"\U00008ECA"}, + {0x2F9F, U"\U00008F9B"}, + {0x2FA0, U"\U00008FB0"}, + {0x2FA1, U"\U00008FB5"}, + {0x2FA2, U"\U00009091"}, + {0x2FA3, U"\U00009149"}, + {0x2FA4, U"\U000091C6"}, + {0x2FA5, U"\U000091CC"}, + {0x2FA6, U"\U000091D1"}, + {0x2FA7, U"\U00009577"}, + {0x2FA8, U"\U00009580"}, + {0x2FA9, U"\U0000961C"}, + {0x2FAA, U"\U000096B6"}, + {0x2FAB, U"\U000096B9"}, + {0x2FAC, U"\U000096E8"}, + {0x2FAD, U"\U00009751"}, + {0x2FAE, U"\U0000975E"}, + {0x2FAF, U"\U00009762"}, + {0x2FB0, U"\U00009769"}, + {0x2FB1, U"\U000097CB"}, + {0x2FB2, U"\U000097ED"}, + {0x2FB3, U"\U000097F3"}, + {0x2FB4, U"\U00009801"}, + {0x2FB5, U"\U000098A8"}, + {0x2FB6, U"\U000098DB"}, + {0x2FB7, U"\U000098DF"}, + {0x2FB8, U"\U00009996"}, + {0x2FB9, U"\U00009999"}, + {0x2FBA, U"\U000099AC"}, + {0x2FBB, U"\U00009AA8"}, + {0x2FBC, U"\U00009AD8"}, + {0x2FBD, U"\U00009ADF"}, + {0x2FBE, U"\U00009B25"}, + {0x2FBF, U"\U00009B2F"}, + {0x2FC0, U"\U00009B32"}, + {0x2FC1, U"\U00009B3C"}, + {0x2FC2, U"\U00009B5A"}, + {0x2FC3, U"\U00009CE5"}, + {0x2FC4, U"\U00009E75"}, + {0x2FC5, U"\U00009E7F"}, + {0x2FC6, U"\U00009EA5"}, + {0x2FC7, U"\U00009EBB"}, + {0x2FC8, U"\U00009EC3"}, + {0x2FC9, U"\U00009ECD"}, + {0x2FCA, U"\U00009ED1"}, + {0x2FCB, U"\U00009EF9"}, + {0x2FCC, U"\U00009EFD"}, + {0x2FCD, U"\U00009F0E"}, + {0x2FCE, U"\U00009F13"}, + {0x2FCF, U"\U00009F20"}, + {0x2FD0, U"\U00009F3B"}, + {0x2FD1, U"\U00009F4A"}, + {0x2FD2, U"\U00009F52"}, + {0x2FD3, U"\U00009F8D"}, + {0x2FD4, U"\U00009F9C"}, + {0x2FD5, U"\U00009FA0"}, + {0x3000, U"\U00000020"}, + {0x3036, U"\U00003012"}, + {0x3038, U"\U00005341"}, + {0x3039, U"\U00005344"}, + {0x303A, U"\U00005345"}, + {0x309B, U"\U00000020\U00003099"}, + {0x309C, U"\U00000020\U0000309A"}, + {0x309F, U"\U00003088\U0000308A"}, + {0x30FF, U"\U000030B3\U000030C8"}, + {0x3131, U"\U00001100"}, + {0x3132, U"\U00001101"}, + {0x3133, U"\U000011AA"}, + {0x3134, U"\U00001102"}, + {0x3135, U"\U000011AC"}, + {0x3136, U"\U000011AD"}, + {0x3137, U"\U00001103"}, + {0x3138, U"\U00001104"}, + {0x3139, U"\U00001105"}, + {0x313A, U"\U000011B0"}, + {0x313B, U"\U000011B1"}, + {0x313C, U"\U000011B2"}, + {0x313D, U"\U000011B3"}, + {0x313E, U"\U000011B4"}, + {0x313F, U"\U000011B5"}, + {0x3140, U"\U0000111A"}, + {0x3141, U"\U00001106"}, + {0x3142, U"\U00001107"}, + {0x3143, U"\U00001108"}, + {0x3144, U"\U00001121"}, + {0x3145, U"\U00001109"}, + {0x3146, U"\U0000110A"}, + {0x3147, U"\U0000110B"}, + {0x3148, U"\U0000110C"}, + {0x3149, U"\U0000110D"}, + {0x314A, U"\U0000110E"}, + {0x314B, U"\U0000110F"}, + {0x314C, U"\U00001110"}, + {0x314D, U"\U00001111"}, + {0x314E, U"\U00001112"}, + {0x314F, U"\U00001161"}, + {0x3150, U"\U00001162"}, + {0x3151, U"\U00001163"}, + {0x3152, U"\U00001164"}, + {0x3153, U"\U00001165"}, + {0x3154, U"\U00001166"}, + {0x3155, U"\U00001167"}, + {0x3156, U"\U00001168"}, + {0x3157, U"\U00001169"}, + {0x3158, U"\U0000116A"}, + {0x3159, U"\U0000116B"}, + {0x315A, U"\U0000116C"}, + {0x315B, U"\U0000116D"}, + {0x315C, U"\U0000116E"}, + {0x315D, U"\U0000116F"}, + {0x315E, U"\U00001170"}, + {0x315F, U"\U00001171"}, + {0x3160, U"\U00001172"}, + {0x3161, U"\U00001173"}, + {0x3162, U"\U00001174"}, + {0x3163, U"\U00001175"}, + {0x3164, U"\U00001160"}, + {0x3165, U"\U00001114"}, + {0x3166, U"\U00001115"}, + {0x3167, U"\U000011C7"}, + {0x3168, U"\U000011C8"}, + {0x3169, U"\U000011CC"}, + {0x316A, U"\U000011CE"}, + {0x316B, U"\U000011D3"}, + {0x316C, U"\U000011D7"}, + {0x316D, U"\U000011D9"}, + {0x316E, U"\U0000111C"}, + {0x316F, U"\U000011DD"}, + {0x3170, U"\U000011DF"}, + {0x3171, U"\U0000111D"}, + {0x3172, U"\U0000111E"}, + {0x3173, U"\U00001120"}, + {0x3174, U"\U00001122"}, + {0x3175, U"\U00001123"}, + {0x3176, U"\U00001127"}, + {0x3177, U"\U00001129"}, + {0x3178, U"\U0000112B"}, + {0x3179, U"\U0000112C"}, + {0x317A, U"\U0000112D"}, + {0x317B, U"\U0000112E"}, + {0x317C, U"\U0000112F"}, + {0x317D, U"\U00001132"}, + {0x317E, U"\U00001136"}, + {0x317F, U"\U00001140"}, + {0x3180, U"\U00001147"}, + {0x3181, U"\U0000114C"}, + {0x3182, U"\U000011F1"}, + {0x3183, U"\U000011F2"}, + {0x3184, U"\U00001157"}, + {0x3185, U"\U00001158"}, + {0x3186, U"\U00001159"}, + {0x3187, U"\U00001184"}, + {0x3188, U"\U00001185"}, + {0x3189, U"\U00001188"}, + {0x318A, U"\U00001191"}, + {0x318B, U"\U00001192"}, + {0x318C, U"\U00001194"}, + {0x318D, U"\U0000119E"}, + {0x318E, U"\U000011A1"}, + {0x3192, U"\U00004E00"}, + {0x3193, U"\U00004E8C"}, + {0x3194, U"\U00004E09"}, + {0x3195, U"\U000056DB"}, + {0x3196, U"\U00004E0A"}, + {0x3197, U"\U00004E2D"}, + {0x3198, U"\U00004E0B"}, + {0x3199, U"\U00007532"}, + {0x319A, U"\U00004E59"}, + {0x319B, U"\U00004E19"}, + {0x319C, U"\U00004E01"}, + {0x319D, U"\U00005929"}, + {0x319E, U"\U00005730"}, + {0x319F, U"\U00004EBA"}, + {0x3200, U"\U00000028\U00001100\U00000029"}, + {0x3201, U"\U00000028\U00001102\U00000029"}, + {0x3202, U"\U00000028\U00001103\U00000029"}, + {0x3203, U"\U00000028\U00001105\U00000029"}, + {0x3204, U"\U00000028\U00001106\U00000029"}, + {0x3205, U"\U00000028\U00001107\U00000029"}, + {0x3206, U"\U00000028\U00001109\U00000029"}, + {0x3207, U"\U00000028\U0000110B\U00000029"}, + {0x3208, U"\U00000028\U0000110C\U00000029"}, + {0x3209, U"\U00000028\U0000110E\U00000029"}, + {0x320A, U"\U00000028\U0000110F\U00000029"}, + {0x320B, U"\U00000028\U00001110\U00000029"}, + {0x320C, U"\U00000028\U00001111\U00000029"}, + {0x320D, U"\U00000028\U00001112\U00000029"}, + {0x320E, U"\U00000028\U0000AC00\U00000029"}, + {0x320F, U"\U00000028\U0000B098\U00000029"}, + {0x3210, U"\U00000028\U0000B2E4\U00000029"}, + {0x3211, U"\U00000028\U0000B77C\U00000029"}, + {0x3212, U"\U00000028\U0000B9C8\U00000029"}, + {0x3213, U"\U00000028\U0000BC14\U00000029"}, + {0x3214, U"\U00000028\U0000C0AC\U00000029"}, + {0x3215, U"\U00000028\U0000C544\U00000029"}, + {0x3216, U"\U00000028\U0000C790\U00000029"}, + {0x3217, U"\U00000028\U0000CC28\U00000029"}, + {0x3218, U"\U00000028\U0000CE74\U00000029"}, + {0x3219, U"\U00000028\U0000D0C0\U00000029"}, + {0x321A, U"\U00000028\U0000D30C\U00000029"}, + {0x321B, U"\U00000028\U0000D558\U00000029"}, + {0x321C, U"\U00000028\U0000C8FC\U00000029"}, + {0x321D, U"\U00000028\U0000C624\U0000C804\U00000029"}, + {0x321E, U"\U00000028\U0000C624\U0000D6C4\U00000029"}, + {0x3220, U"\U00000028\U00004E00\U00000029"}, + {0x3221, U"\U00000028\U00004E8C\U00000029"}, + {0x3222, U"\U00000028\U00004E09\U00000029"}, + {0x3223, U"\U00000028\U000056DB\U00000029"}, + {0x3224, U"\U00000028\U00004E94\U00000029"}, + {0x3225, U"\U00000028\U0000516D\U00000029"}, + {0x3226, U"\U00000028\U00004E03\U00000029"}, + {0x3227, U"\U00000028\U0000516B\U00000029"}, + {0x3228, U"\U00000028\U00004E5D\U00000029"}, + {0x3229, U"\U00000028\U00005341\U00000029"}, + {0x322A, U"\U00000028\U00006708\U00000029"}, + {0x322B, U"\U00000028\U0000706B\U00000029"}, + {0x322C, U"\U00000028\U00006C34\U00000029"}, + {0x322D, U"\U00000028\U00006728\U00000029"}, + {0x322E, U"\U00000028\U000091D1\U00000029"}, + {0x322F, U"\U00000028\U0000571F\U00000029"}, + {0x3230, U"\U00000028\U000065E5\U00000029"}, + {0x3231, U"\U00000028\U0000682A\U00000029"}, + {0x3232, U"\U00000028\U00006709\U00000029"}, + {0x3233, U"\U00000028\U0000793E\U00000029"}, + {0x3234, U"\U00000028\U0000540D\U00000029"}, + {0x3235, U"\U00000028\U00007279\U00000029"}, + {0x3236, U"\U00000028\U00008CA1\U00000029"}, + {0x3237, U"\U00000028\U0000795D\U00000029"}, + {0x3238, U"\U00000028\U000052B4\U00000029"}, + {0x3239, U"\U00000028\U00004EE3\U00000029"}, + {0x323A, U"\U00000028\U0000547C\U00000029"}, + {0x323B, U"\U00000028\U00005B66\U00000029"}, + {0x323C, U"\U00000028\U000076E3\U00000029"}, + {0x323D, U"\U00000028\U00004F01\U00000029"}, + {0x323E, U"\U00000028\U00008CC7\U00000029"}, + {0x323F, U"\U00000028\U00005354\U00000029"}, + {0x3240, U"\U00000028\U0000796D\U00000029"}, + {0x3241, U"\U00000028\U00004F11\U00000029"}, + {0x3242, U"\U00000028\U000081EA\U00000029"}, + {0x3243, U"\U00000028\U000081F3\U00000029"}, + {0x3244, U"\U0000554F"}, + {0x3245, U"\U00005E7C"}, + {0x3246, U"\U00006587"}, + {0x3247, U"\U00007B8F"}, + {0x3250, U"\U00000050\U00000054\U00000045"}, + {0x3251, U"\U00000032\U00000031"}, + {0x3252, U"\U00000032\U00000032"}, + {0x3253, U"\U00000032\U00000033"}, + {0x3254, U"\U00000032\U00000034"}, + {0x3255, U"\U00000032\U00000035"}, + {0x3256, U"\U00000032\U00000036"}, + {0x3257, U"\U00000032\U00000037"}, + {0x3258, U"\U00000032\U00000038"}, + {0x3259, U"\U00000032\U00000039"}, + {0x325A, U"\U00000033\U00000030"}, + {0x325B, U"\U00000033\U00000031"}, + {0x325C, U"\U00000033\U00000032"}, + {0x325D, U"\U00000033\U00000033"}, + {0x325E, U"\U00000033\U00000034"}, + {0x325F, U"\U00000033\U00000035"}, + {0x3260, U"\U00001100"}, + {0x3261, U"\U00001102"}, + {0x3262, U"\U00001103"}, + {0x3263, U"\U00001105"}, + {0x3264, U"\U00001106"}, + {0x3265, U"\U00001107"}, + {0x3266, U"\U00001109"}, + {0x3267, U"\U0000110B"}, + {0x3268, U"\U0000110C"}, + {0x3269, U"\U0000110E"}, + {0x326A, U"\U0000110F"}, + {0x326B, U"\U00001110"}, + {0x326C, U"\U00001111"}, + {0x326D, U"\U00001112"}, + {0x326E, U"\U0000AC00"}, + {0x326F, U"\U0000B098"}, + {0x3270, U"\U0000B2E4"}, + {0x3271, U"\U0000B77C"}, + {0x3272, U"\U0000B9C8"}, + {0x3273, U"\U0000BC14"}, + {0x3274, U"\U0000C0AC"}, + {0x3275, U"\U0000C544"}, + {0x3276, U"\U0000C790"}, + {0x3277, U"\U0000CC28"}, + {0x3278, U"\U0000CE74"}, + {0x3279, U"\U0000D0C0"}, + {0x327A, U"\U0000D30C"}, + {0x327B, U"\U0000D558"}, + {0x327C, U"\U0000CC38\U0000ACE0"}, + {0x327D, U"\U0000C8FC\U0000C758"}, + {0x327E, U"\U0000C6B0"}, + {0x3280, U"\U00004E00"}, + {0x3281, U"\U00004E8C"}, + {0x3282, U"\U00004E09"}, + {0x3283, U"\U000056DB"}, + {0x3284, U"\U00004E94"}, + {0x3285, U"\U0000516D"}, + {0x3286, U"\U00004E03"}, + {0x3287, U"\U0000516B"}, + {0x3288, U"\U00004E5D"}, + {0x3289, U"\U00005341"}, + {0x328A, U"\U00006708"}, + {0x328B, U"\U0000706B"}, + {0x328C, U"\U00006C34"}, + {0x328D, U"\U00006728"}, + {0x328E, U"\U000091D1"}, + {0x328F, U"\U0000571F"}, + {0x3290, U"\U000065E5"}, + {0x3291, U"\U0000682A"}, + {0x3292, U"\U00006709"}, + {0x3293, U"\U0000793E"}, + {0x3294, U"\U0000540D"}, + {0x3295, U"\U00007279"}, + {0x3296, U"\U00008CA1"}, + {0x3297, U"\U0000795D"}, + {0x3298, U"\U000052B4"}, + {0x3299, U"\U000079D8"}, + {0x329A, U"\U00007537"}, + {0x329B, U"\U00005973"}, + {0x329C, U"\U00009069"}, + {0x329D, U"\U0000512A"}, + {0x329E, U"\U00005370"}, + {0x329F, U"\U00006CE8"}, + {0x32A0, U"\U00009805"}, + {0x32A1, U"\U00004F11"}, + {0x32A2, U"\U00005199"}, + {0x32A3, U"\U00006B63"}, + {0x32A4, U"\U00004E0A"}, + {0x32A5, U"\U00004E2D"}, + {0x32A6, U"\U00004E0B"}, + {0x32A7, U"\U00005DE6"}, + {0x32A8, U"\U000053F3"}, + {0x32A9, U"\U0000533B"}, + {0x32AA, U"\U00005B97"}, + {0x32AB, U"\U00005B66"}, + {0x32AC, U"\U000076E3"}, + {0x32AD, U"\U00004F01"}, + {0x32AE, U"\U00008CC7"}, + {0x32AF, U"\U00005354"}, + {0x32B0, U"\U0000591C"}, + {0x32B1, U"\U00000033\U00000036"}, + {0x32B2, U"\U00000033\U00000037"}, + {0x32B3, U"\U00000033\U00000038"}, + {0x32B4, U"\U00000033\U00000039"}, + {0x32B5, U"\U00000034\U00000030"}, + {0x32B6, U"\U00000034\U00000031"}, + {0x32B7, U"\U00000034\U00000032"}, + {0x32B8, U"\U00000034\U00000033"}, + {0x32B9, U"\U00000034\U00000034"}, + {0x32BA, U"\U00000034\U00000035"}, + {0x32BB, U"\U00000034\U00000036"}, + {0x32BC, U"\U00000034\U00000037"}, + {0x32BD, U"\U00000034\U00000038"}, + {0x32BE, U"\U00000034\U00000039"}, + {0x32BF, U"\U00000035\U00000030"}, + {0x32C0, U"\U00000031\U00006708"}, + {0x32C1, U"\U00000032\U00006708"}, + {0x32C2, U"\U00000033\U00006708"}, + {0x32C3, U"\U00000034\U00006708"}, + {0x32C4, U"\U00000035\U00006708"}, + {0x32C5, U"\U00000036\U00006708"}, + {0x32C6, U"\U00000037\U00006708"}, + {0x32C7, U"\U00000038\U00006708"}, + {0x32C8, U"\U00000039\U00006708"}, + {0x32C9, U"\U00000031\U00000030\U00006708"}, + {0x32CA, U"\U00000031\U00000031\U00006708"}, + {0x32CB, U"\U00000031\U00000032\U00006708"}, + {0x32CC, U"\U00000048\U00000067"}, + {0x32CD, U"\U00000065\U00000072\U00000067"}, + {0x32CE, U"\U00000065\U00000056"}, + {0x32CF, U"\U0000004C\U00000054\U00000044"}, + {0x32D0, U"\U000030A2"}, + {0x32D1, U"\U000030A4"}, + {0x32D2, U"\U000030A6"}, + {0x32D3, U"\U000030A8"}, + {0x32D4, U"\U000030AA"}, + {0x32D5, U"\U000030AB"}, + {0x32D6, U"\U000030AD"}, + {0x32D7, U"\U000030AF"}, + {0x32D8, U"\U000030B1"}, + {0x32D9, U"\U000030B3"}, + {0x32DA, U"\U000030B5"}, + {0x32DB, U"\U000030B7"}, + {0x32DC, U"\U000030B9"}, + {0x32DD, U"\U000030BB"}, + {0x32DE, U"\U000030BD"}, + {0x32DF, U"\U000030BF"}, + {0x32E0, U"\U000030C1"}, + {0x32E1, U"\U000030C4"}, + {0x32E2, U"\U000030C6"}, + {0x32E3, U"\U000030C8"}, + {0x32E4, U"\U000030CA"}, + {0x32E5, U"\U000030CB"}, + {0x32E6, U"\U000030CC"}, + {0x32E7, U"\U000030CD"}, + {0x32E8, U"\U000030CE"}, + {0x32E9, U"\U000030CF"}, + {0x32EA, U"\U000030D2"}, + {0x32EB, U"\U000030D5"}, + {0x32EC, U"\U000030D8"}, + {0x32ED, U"\U000030DB"}, + {0x32EE, U"\U000030DE"}, + {0x32EF, U"\U000030DF"}, + {0x32F0, U"\U000030E0"}, + {0x32F1, U"\U000030E1"}, + {0x32F2, U"\U000030E2"}, + {0x32F3, U"\U000030E4"}, + {0x32F4, U"\U000030E6"}, + {0x32F5, U"\U000030E8"}, + {0x32F6, U"\U000030E9"}, + {0x32F7, U"\U000030EA"}, + {0x32F8, U"\U000030EB"}, + {0x32F9, U"\U000030EC"}, + {0x32FA, U"\U000030ED"}, + {0x32FB, U"\U000030EF"}, + {0x32FC, U"\U000030F0"}, + {0x32FD, U"\U000030F1"}, + {0x32FE, U"\U000030F2"}, + {0x32FF, U"\U00004EE4\U0000548C"}, + {0x3300, U"\U000030A2\U000030D1\U000030FC\U000030C8"}, + {0x3301, U"\U000030A2\U000030EB\U000030D5\U000030A1"}, + {0x3302, U"\U000030A2\U000030F3\U000030DA\U000030A2"}, + {0x3303, U"\U000030A2\U000030FC\U000030EB"}, + {0x3304, U"\U000030A4\U000030CB\U000030F3\U000030B0"}, + {0x3305, U"\U000030A4\U000030F3\U000030C1"}, + {0x3306, U"\U000030A6\U000030A9\U000030F3"}, + {0x3307, U"\U000030A8\U000030B9\U000030AF\U000030FC\U000030C9"}, + {0x3308, U"\U000030A8\U000030FC\U000030AB\U000030FC"}, + {0x3309, U"\U000030AA\U000030F3\U000030B9"}, + {0x330A, U"\U000030AA\U000030FC\U000030E0"}, + {0x330B, U"\U000030AB\U000030A4\U000030EA"}, + {0x330C, U"\U000030AB\U000030E9\U000030C3\U000030C8"}, + {0x330D, U"\U000030AB\U000030ED\U000030EA\U000030FC"}, + {0x330E, U"\U000030AC\U000030ED\U000030F3"}, + {0x330F, U"\U000030AC\U000030F3\U000030DE"}, + {0x3310, U"\U000030AE\U000030AC"}, + {0x3311, U"\U000030AE\U000030CB\U000030FC"}, + {0x3312, U"\U000030AD\U000030E5\U000030EA\U000030FC"}, + {0x3313, U"\U000030AE\U000030EB\U000030C0\U000030FC"}, + {0x3314, U"\U000030AD\U000030ED"}, + {0x3315, U"\U000030AD\U000030ED\U000030B0\U000030E9\U000030E0"}, + {0x3316, U"\U000030AD\U000030ED\U000030E1\U000030FC\U000030C8\U000030EB"}, + {0x3317, U"\U000030AD\U000030ED\U000030EF\U000030C3\U000030C8"}, + {0x3318, U"\U000030B0\U000030E9\U000030E0"}, + {0x3319, U"\U000030B0\U000030E9\U000030E0\U000030C8\U000030F3"}, + {0x331A, U"\U000030AF\U000030EB\U000030BC\U000030A4\U000030ED"}, + {0x331B, U"\U000030AF\U000030ED\U000030FC\U000030CD"}, + {0x331C, U"\U000030B1\U000030FC\U000030B9"}, + {0x331D, U"\U000030B3\U000030EB\U000030CA"}, + {0x331E, U"\U000030B3\U000030FC\U000030DD"}, + {0x331F, U"\U000030B5\U000030A4\U000030AF\U000030EB"}, + {0x3320, U"\U000030B5\U000030F3\U000030C1\U000030FC\U000030E0"}, + {0x3321, U"\U000030B7\U000030EA\U000030F3\U000030B0"}, + {0x3322, U"\U000030BB\U000030F3\U000030C1"}, + {0x3323, U"\U000030BB\U000030F3\U000030C8"}, + {0x3324, U"\U000030C0\U000030FC\U000030B9"}, + {0x3325, U"\U000030C7\U000030B7"}, + {0x3326, U"\U000030C9\U000030EB"}, + {0x3327, U"\U000030C8\U000030F3"}, + {0x3328, U"\U000030CA\U000030CE"}, + {0x3329, U"\U000030CE\U000030C3\U000030C8"}, + {0x332A, U"\U000030CF\U000030A4\U000030C4"}, + {0x332B, U"\U000030D1\U000030FC\U000030BB\U000030F3\U000030C8"}, + {0x332C, U"\U000030D1\U000030FC\U000030C4"}, + {0x332D, U"\U000030D0\U000030FC\U000030EC\U000030EB"}, + {0x332E, U"\U000030D4\U000030A2\U000030B9\U000030C8\U000030EB"}, + {0x332F, U"\U000030D4\U000030AF\U000030EB"}, + {0x3330, U"\U000030D4\U000030B3"}, + {0x3331, U"\U000030D3\U000030EB"}, + {0x3332, U"\U000030D5\U000030A1\U000030E9\U000030C3\U000030C9"}, + {0x3333, U"\U000030D5\U000030A3\U000030FC\U000030C8"}, + {0x3334, U"\U000030D6\U000030C3\U000030B7\U000030A7\U000030EB"}, + {0x3335, U"\U000030D5\U000030E9\U000030F3"}, + {0x3336, U"\U000030D8\U000030AF\U000030BF\U000030FC\U000030EB"}, + {0x3337, U"\U000030DA\U000030BD"}, + {0x3338, U"\U000030DA\U000030CB\U000030D2"}, + {0x3339, U"\U000030D8\U000030EB\U000030C4"}, + {0x333A, U"\U000030DA\U000030F3\U000030B9"}, + {0x333B, U"\U000030DA\U000030FC\U000030B8"}, + {0x333C, U"\U000030D9\U000030FC\U000030BF"}, + {0x333D, U"\U000030DD\U000030A4\U000030F3\U000030C8"}, + {0x333E, U"\U000030DC\U000030EB\U000030C8"}, + {0x333F, U"\U000030DB\U000030F3"}, + {0x3340, U"\U000030DD\U000030F3\U000030C9"}, + {0x3341, U"\U000030DB\U000030FC\U000030EB"}, + {0x3342, U"\U000030DB\U000030FC\U000030F3"}, + {0x3343, U"\U000030DE\U000030A4\U000030AF\U000030ED"}, + {0x3344, U"\U000030DE\U000030A4\U000030EB"}, + {0x3345, U"\U000030DE\U000030C3\U000030CF"}, + {0x3346, U"\U000030DE\U000030EB\U000030AF"}, + {0x3347, U"\U000030DE\U000030F3\U000030B7\U000030E7\U000030F3"}, + {0x3348, U"\U000030DF\U000030AF\U000030ED\U000030F3"}, + {0x3349, U"\U000030DF\U000030EA"}, + {0x334A, U"\U000030DF\U000030EA\U000030D0\U000030FC\U000030EB"}, + {0x334B, U"\U000030E1\U000030AC"}, + {0x334C, U"\U000030E1\U000030AC\U000030C8\U000030F3"}, + {0x334D, U"\U000030E1\U000030FC\U000030C8\U000030EB"}, + {0x334E, U"\U000030E4\U000030FC\U000030C9"}, + {0x334F, U"\U000030E4\U000030FC\U000030EB"}, + {0x3350, U"\U000030E6\U000030A2\U000030F3"}, + {0x3351, U"\U000030EA\U000030C3\U000030C8\U000030EB"}, + {0x3352, U"\U000030EA\U000030E9"}, + {0x3353, U"\U000030EB\U000030D4\U000030FC"}, + {0x3354, U"\U000030EB\U000030FC\U000030D6\U000030EB"}, + {0x3355, U"\U000030EC\U000030E0"}, + {0x3356, U"\U000030EC\U000030F3\U000030C8\U000030B2\U000030F3"}, + {0x3357, U"\U000030EF\U000030C3\U000030C8"}, + {0x3358, U"\U00000030\U000070B9"}, + {0x3359, U"\U00000031\U000070B9"}, + {0x335A, U"\U00000032\U000070B9"}, + {0x335B, U"\U00000033\U000070B9"}, + {0x335C, U"\U00000034\U000070B9"}, + {0x335D, U"\U00000035\U000070B9"}, + {0x335E, U"\U00000036\U000070B9"}, + {0x335F, U"\U00000037\U000070B9"}, + {0x3360, U"\U00000038\U000070B9"}, + {0x3361, U"\U00000039\U000070B9"}, + {0x3362, U"\U00000031\U00000030\U000070B9"}, + {0x3363, U"\U00000031\U00000031\U000070B9"}, + {0x3364, U"\U00000031\U00000032\U000070B9"}, + {0x3365, U"\U00000031\U00000033\U000070B9"}, + {0x3366, U"\U00000031\U00000034\U000070B9"}, + {0x3367, U"\U00000031\U00000035\U000070B9"}, + {0x3368, U"\U00000031\U00000036\U000070B9"}, + {0x3369, U"\U00000031\U00000037\U000070B9"}, + {0x336A, U"\U00000031\U00000038\U000070B9"}, + {0x336B, U"\U00000031\U00000039\U000070B9"}, + {0x336C, U"\U00000032\U00000030\U000070B9"}, + {0x336D, U"\U00000032\U00000031\U000070B9"}, + {0x336E, U"\U00000032\U00000032\U000070B9"}, + {0x336F, U"\U00000032\U00000033\U000070B9"}, + {0x3370, U"\U00000032\U00000034\U000070B9"}, + {0x3371, U"\U00000068\U00000050\U00000061"}, + {0x3372, U"\U00000064\U00000061"}, + {0x3373, U"\U00000041\U00000055"}, + {0x3374, U"\U00000062\U00000061\U00000072"}, + {0x3375, U"\U0000006F\U00000056"}, + {0x3376, U"\U00000070\U00000063"}, + {0x3377, U"\U00000064\U0000006D"}, + {0x3378, U"\U00000064\U0000006D\U00000032"}, + {0x3379, U"\U00000064\U0000006D\U00000033"}, + {0x337A, U"\U00000049\U00000055"}, + {0x337B, U"\U00005E73\U00006210"}, + {0x337C, U"\U0000662D\U0000548C"}, + {0x337D, U"\U00005927\U00006B63"}, + {0x337E, U"\U0000660E\U00006CBB"}, + {0x337F, U"\U0000682A\U00005F0F\U00004F1A\U0000793E"}, + {0x3380, U"\U00000070\U00000041"}, + {0x3381, U"\U0000006E\U00000041"}, + {0x3382, U"\U000003BC\U00000041"}, + {0x3383, U"\U0000006D\U00000041"}, + {0x3384, U"\U0000006B\U00000041"}, + {0x3385, U"\U0000004B\U00000042"}, + {0x3386, U"\U0000004D\U00000042"}, + {0x3387, U"\U00000047\U00000042"}, + {0x3388, U"\U00000063\U00000061\U0000006C"}, + {0x3389, U"\U0000006B\U00000063\U00000061\U0000006C"}, + {0x338A, U"\U00000070\U00000046"}, + {0x338B, U"\U0000006E\U00000046"}, + {0x338C, U"\U000003BC\U00000046"}, + {0x338D, U"\U000003BC\U00000067"}, + {0x338E, U"\U0000006D\U00000067"}, + {0x338F, U"\U0000006B\U00000067"}, + {0x3390, U"\U00000048\U0000007A"}, + {0x3391, U"\U0000006B\U00000048\U0000007A"}, + {0x3392, U"\U0000004D\U00000048\U0000007A"}, + {0x3393, U"\U00000047\U00000048\U0000007A"}, + {0x3394, U"\U00000054\U00000048\U0000007A"}, + {0x3395, U"\U000003BC\U0000006C"}, + {0x3396, U"\U0000006D\U0000006C"}, + {0x3397, U"\U00000064\U0000006C"}, + {0x3398, U"\U0000006B\U0000006C"}, + {0x3399, U"\U00000066\U0000006D"}, + {0x339A, U"\U0000006E\U0000006D"}, + {0x339B, U"\U000003BC\U0000006D"}, + {0x339C, U"\U0000006D\U0000006D"}, + {0x339D, U"\U00000063\U0000006D"}, + {0x339E, U"\U0000006B\U0000006D"}, + {0x339F, U"\U0000006D\U0000006D\U00000032"}, + {0x33A0, U"\U00000063\U0000006D\U00000032"}, + {0x33A1, U"\U0000006D\U00000032"}, + {0x33A2, U"\U0000006B\U0000006D\U00000032"}, + {0x33A3, U"\U0000006D\U0000006D\U00000033"}, + {0x33A4, U"\U00000063\U0000006D\U00000033"}, + {0x33A5, U"\U0000006D\U00000033"}, + {0x33A6, U"\U0000006B\U0000006D\U00000033"}, + {0x33A7, U"\U0000006D\U00002215\U00000073"}, + {0x33A8, U"\U0000006D\U00002215\U00000073\U00000032"}, + {0x33A9, U"\U00000050\U00000061"}, + {0x33AA, U"\U0000006B\U00000050\U00000061"}, + {0x33AB, U"\U0000004D\U00000050\U00000061"}, + {0x33AC, U"\U00000047\U00000050\U00000061"}, + {0x33AD, U"\U00000072\U00000061\U00000064"}, + {0x33AE, U"\U00000072\U00000061\U00000064\U00002215\U00000073"}, + {0x33AF, U"\U00000072\U00000061\U00000064\U00002215\U00000073\U00000032"}, + {0x33B0, U"\U00000070\U00000073"}, + {0x33B1, U"\U0000006E\U00000073"}, + {0x33B2, U"\U000003BC\U00000073"}, + {0x33B3, U"\U0000006D\U00000073"}, + {0x33B4, U"\U00000070\U00000056"}, + {0x33B5, U"\U0000006E\U00000056"}, + {0x33B6, U"\U000003BC\U00000056"}, + {0x33B7, U"\U0000006D\U00000056"}, + {0x33B8, U"\U0000006B\U00000056"}, + {0x33B9, U"\U0000004D\U00000056"}, + {0x33BA, U"\U00000070\U00000057"}, + {0x33BB, U"\U0000006E\U00000057"}, + {0x33BC, U"\U000003BC\U00000057"}, + {0x33BD, U"\U0000006D\U00000057"}, + {0x33BE, U"\U0000006B\U00000057"}, + {0x33BF, U"\U0000004D\U00000057"}, + {0x33C0, U"\U0000006B\U000003A9"}, + {0x33C1, U"\U0000004D\U000003A9"}, + {0x33C2, U"\U00000061\U0000002E\U0000006D\U0000002E"}, + {0x33C3, U"\U00000042\U00000071"}, + {0x33C4, U"\U00000063\U00000063"}, + {0x33C5, U"\U00000063\U00000064"}, + {0x33C6, U"\U00000043\U00002215\U0000006B\U00000067"}, + {0x33C7, U"\U00000043\U0000006F\U0000002E"}, + {0x33C8, U"\U00000064\U00000042"}, + {0x33C9, U"\U00000047\U00000079"}, + {0x33CA, U"\U00000068\U00000061"}, + {0x33CB, U"\U00000048\U00000050"}, + {0x33CC, U"\U00000069\U0000006E"}, + {0x33CD, U"\U0000004B\U0000004B"}, + {0x33CE, U"\U0000004B\U0000004D"}, + {0x33CF, U"\U0000006B\U00000074"}, + {0x33D0, U"\U0000006C\U0000006D"}, + {0x33D1, U"\U0000006C\U0000006E"}, + {0x33D2, U"\U0000006C\U0000006F\U00000067"}, + {0x33D3, U"\U0000006C\U00000078"}, + {0x33D4, U"\U0000006D\U00000062"}, + {0x33D5, U"\U0000006D\U00000069\U0000006C"}, + {0x33D6, U"\U0000006D\U0000006F\U0000006C"}, + {0x33D7, U"\U00000050\U00000048"}, + {0x33D8, U"\U00000070\U0000002E\U0000006D\U0000002E"}, + {0x33D9, U"\U00000050\U00000050\U0000004D"}, + {0x33DA, U"\U00000050\U00000052"}, + {0x33DB, U"\U00000073\U00000072"}, + {0x33DC, U"\U00000053\U00000076"}, + {0x33DD, U"\U00000057\U00000062"}, + {0x33DE, U"\U00000056\U00002215\U0000006D"}, + {0x33DF, U"\U00000041\U00002215\U0000006D"}, + {0x33E0, U"\U00000031\U000065E5"}, + {0x33E1, U"\U00000032\U000065E5"}, + {0x33E2, U"\U00000033\U000065E5"}, + {0x33E3, U"\U00000034\U000065E5"}, + {0x33E4, U"\U00000035\U000065E5"}, + {0x33E5, U"\U00000036\U000065E5"}, + {0x33E6, U"\U00000037\U000065E5"}, + {0x33E7, U"\U00000038\U000065E5"}, + {0x33E8, U"\U00000039\U000065E5"}, + {0x33E9, U"\U00000031\U00000030\U000065E5"}, + {0x33EA, U"\U00000031\U00000031\U000065E5"}, + {0x33EB, U"\U00000031\U00000032\U000065E5"}, + {0x33EC, U"\U00000031\U00000033\U000065E5"}, + {0x33ED, U"\U00000031\U00000034\U000065E5"}, + {0x33EE, U"\U00000031\U00000035\U000065E5"}, + {0x33EF, U"\U00000031\U00000036\U000065E5"}, + {0x33F0, U"\U00000031\U00000037\U000065E5"}, + {0x33F1, U"\U00000031\U00000038\U000065E5"}, + {0x33F2, U"\U00000031\U00000039\U000065E5"}, + {0x33F3, U"\U00000032\U00000030\U000065E5"}, + {0x33F4, U"\U00000032\U00000031\U000065E5"}, + {0x33F5, U"\U00000032\U00000032\U000065E5"}, + {0x33F6, U"\U00000032\U00000033\U000065E5"}, + {0x33F7, U"\U00000032\U00000034\U000065E5"}, + {0x33F8, U"\U00000032\U00000035\U000065E5"}, + {0x33F9, U"\U00000032\U00000036\U000065E5"}, + {0x33FA, U"\U00000032\U00000037\U000065E5"}, + {0x33FB, U"\U00000032\U00000038\U000065E5"}, + {0x33FC, U"\U00000032\U00000039\U000065E5"}, + {0x33FD, U"\U00000033\U00000030\U000065E5"}, + {0x33FE, U"\U00000033\U00000031\U000065E5"}, + {0x33FF, U"\U00000067\U00000061\U0000006C"}, + {0xA69C, U"\U0000044A"}, + {0xA69D, U"\U0000044C"}, + {0xA770, U"\U0000A76F"}, + {0xA7F2, U"\U00000043"}, + {0xA7F3, U"\U00000046"}, + {0xA7F4, U"\U00000051"}, + {0xA7F8, U"\U00000126"}, + {0xA7F9, U"\U00000153"}, + {0xAB5C, U"\U0000A727"}, + {0xAB5D, U"\U0000AB37"}, + {0xAB5E, U"\U0000026B"}, + {0xAB5F, U"\U0000AB52"}, + {0xAB69, U"\U0000028D"}, + {0xF900, U"\U00008C48"}, + {0xF901, U"\U000066F4"}, + {0xF902, U"\U00008ECA"}, + {0xF903, U"\U00008CC8"}, + {0xF904, U"\U00006ED1"}, + {0xF905, U"\U00004E32"}, + {0xF906, U"\U000053E5"}, + {0xF907, U"\U00009F9C"}, + {0xF908, U"\U00009F9C"}, + {0xF909, U"\U00005951"}, + {0xF90A, U"\U000091D1"}, + {0xF90B, U"\U00005587"}, + {0xF90C, U"\U00005948"}, + {0xF90D, U"\U000061F6"}, + {0xF90E, U"\U00007669"}, + {0xF90F, U"\U00007F85"}, + {0xF910, U"\U0000863F"}, + {0xF911, U"\U000087BA"}, + {0xF912, U"\U000088F8"}, + {0xF913, U"\U0000908F"}, + {0xF914, U"\U00006A02"}, + {0xF915, U"\U00006D1B"}, + {0xF916, U"\U000070D9"}, + {0xF917, U"\U000073DE"}, + {0xF918, U"\U0000843D"}, + {0xF919, U"\U0000916A"}, + {0xF91A, U"\U000099F1"}, + {0xF91B, U"\U00004E82"}, + {0xF91C, U"\U00005375"}, + {0xF91D, U"\U00006B04"}, + {0xF91E, U"\U0000721B"}, + {0xF91F, U"\U0000862D"}, + {0xF920, U"\U00009E1E"}, + {0xF921, U"\U00005D50"}, + {0xF922, U"\U00006FEB"}, + {0xF923, U"\U000085CD"}, + {0xF924, U"\U00008964"}, + {0xF925, U"\U000062C9"}, + {0xF926, U"\U000081D8"}, + {0xF927, U"\U0000881F"}, + {0xF928, U"\U00005ECA"}, + {0xF929, U"\U00006717"}, + {0xF92A, U"\U00006D6A"}, + {0xF92B, U"\U000072FC"}, + {0xF92C, U"\U000090CE"}, + {0xF92D, U"\U00004F86"}, + {0xF92E, U"\U000051B7"}, + {0xF92F, U"\U000052DE"}, + {0xF930, U"\U000064C4"}, + {0xF931, U"\U00006AD3"}, + {0xF932, U"\U00007210"}, + {0xF933, U"\U000076E7"}, + {0xF934, U"\U00008001"}, + {0xF935, U"\U00008606"}, + {0xF936, U"\U0000865C"}, + {0xF937, U"\U00008DEF"}, + {0xF938, U"\U00009732"}, + {0xF939, U"\U00009B6F"}, + {0xF93A, U"\U00009DFA"}, + {0xF93B, U"\U0000788C"}, + {0xF93C, U"\U0000797F"}, + {0xF93D, U"\U00007DA0"}, + {0xF93E, U"\U000083C9"}, + {0xF93F, U"\U00009304"}, + {0xF940, U"\U00009E7F"}, + {0xF941, U"\U00008AD6"}, + {0xF942, U"\U000058DF"}, + {0xF943, U"\U00005F04"}, + {0xF944, U"\U00007C60"}, + {0xF945, U"\U0000807E"}, + {0xF946, U"\U00007262"}, + {0xF947, U"\U000078CA"}, + {0xF948, U"\U00008CC2"}, + {0xF949, U"\U000096F7"}, + {0xF94A, U"\U000058D8"}, + {0xF94B, U"\U00005C62"}, + {0xF94C, U"\U00006A13"}, + {0xF94D, U"\U00006DDA"}, + {0xF94E, U"\U00006F0F"}, + {0xF94F, U"\U00007D2F"}, + {0xF950, U"\U00007E37"}, + {0xF951, U"\U0000964B"}, + {0xF952, U"\U000052D2"}, + {0xF953, U"\U0000808B"}, + {0xF954, U"\U000051DC"}, + {0xF955, U"\U000051CC"}, + {0xF956, U"\U00007A1C"}, + {0xF957, U"\U00007DBE"}, + {0xF958, U"\U000083F1"}, + {0xF959, U"\U00009675"}, + {0xF95A, U"\U00008B80"}, + {0xF95B, U"\U000062CF"}, + {0xF95C, U"\U00006A02"}, + {0xF95D, U"\U00008AFE"}, + {0xF95E, U"\U00004E39"}, + {0xF95F, U"\U00005BE7"}, + {0xF960, U"\U00006012"}, + {0xF961, U"\U00007387"}, + {0xF962, U"\U00007570"}, + {0xF963, U"\U00005317"}, + {0xF964, U"\U000078FB"}, + {0xF965, U"\U00004FBF"}, + {0xF966, U"\U00005FA9"}, + {0xF967, U"\U00004E0D"}, + {0xF968, U"\U00006CCC"}, + {0xF969, U"\U00006578"}, + {0xF96A, U"\U00007D22"}, + {0xF96B, U"\U000053C3"}, + {0xF96C, U"\U0000585E"}, + {0xF96D, U"\U00007701"}, + {0xF96E, U"\U00008449"}, + {0xF96F, U"\U00008AAA"}, + {0xF970, U"\U00006BBA"}, + {0xF971, U"\U00008FB0"}, + {0xF972, U"\U00006C88"}, + {0xF973, U"\U000062FE"}, + {0xF974, U"\U000082E5"}, + {0xF975, U"\U000063A0"}, + {0xF976, U"\U00007565"}, + {0xF977, U"\U00004EAE"}, + {0xF978, U"\U00005169"}, + {0xF979, U"\U000051C9"}, + {0xF97A, U"\U00006881"}, + {0xF97B, U"\U00007CE7"}, + {0xF97C, U"\U0000826F"}, + {0xF97D, U"\U00008AD2"}, + {0xF97E, U"\U000091CF"}, + {0xF97F, U"\U000052F5"}, + {0xF980, U"\U00005442"}, + {0xF981, U"\U00005973"}, + {0xF982, U"\U00005EEC"}, + {0xF983, U"\U000065C5"}, + {0xF984, U"\U00006FFE"}, + {0xF985, U"\U0000792A"}, + {0xF986, U"\U000095AD"}, + {0xF987, U"\U00009A6A"}, + {0xF988, U"\U00009E97"}, + {0xF989, U"\U00009ECE"}, + {0xF98A, U"\U0000529B"}, + {0xF98B, U"\U000066C6"}, + {0xF98C, U"\U00006B77"}, + {0xF98D, U"\U00008F62"}, + {0xF98E, U"\U00005E74"}, + {0xF98F, U"\U00006190"}, + {0xF990, U"\U00006200"}, + {0xF991, U"\U0000649A"}, + {0xF992, U"\U00006F23"}, + {0xF993, U"\U00007149"}, + {0xF994, U"\U00007489"}, + {0xF995, U"\U000079CA"}, + {0xF996, U"\U00007DF4"}, + {0xF997, U"\U0000806F"}, + {0xF998, U"\U00008F26"}, + {0xF999, U"\U000084EE"}, + {0xF99A, U"\U00009023"}, + {0xF99B, U"\U0000934A"}, + {0xF99C, U"\U00005217"}, + {0xF99D, U"\U000052A3"}, + {0xF99E, U"\U000054BD"}, + {0xF99F, U"\U000070C8"}, + {0xF9A0, U"\U000088C2"}, + {0xF9A1, U"\U00008AAA"}, + {0xF9A2, U"\U00005EC9"}, + {0xF9A3, U"\U00005FF5"}, + {0xF9A4, U"\U0000637B"}, + {0xF9A5, U"\U00006BAE"}, + {0xF9A6, U"\U00007C3E"}, + {0xF9A7, U"\U00007375"}, + {0xF9A8, U"\U00004EE4"}, + {0xF9A9, U"\U000056F9"}, + {0xF9AA, U"\U00005BE7"}, + {0xF9AB, U"\U00005DBA"}, + {0xF9AC, U"\U0000601C"}, + {0xF9AD, U"\U000073B2"}, + {0xF9AE, U"\U00007469"}, + {0xF9AF, U"\U00007F9A"}, + {0xF9B0, U"\U00008046"}, + {0xF9B1, U"\U00009234"}, + {0xF9B2, U"\U000096F6"}, + {0xF9B3, U"\U00009748"}, + {0xF9B4, U"\U00009818"}, + {0xF9B5, U"\U00004F8B"}, + {0xF9B6, U"\U000079AE"}, + {0xF9B7, U"\U000091B4"}, + {0xF9B8, U"\U000096B8"}, + {0xF9B9, U"\U000060E1"}, + {0xF9BA, U"\U00004E86"}, + {0xF9BB, U"\U000050DA"}, + {0xF9BC, U"\U00005BEE"}, + {0xF9BD, U"\U00005C3F"}, + {0xF9BE, U"\U00006599"}, + {0xF9BF, U"\U00006A02"}, + {0xF9C0, U"\U000071CE"}, + {0xF9C1, U"\U00007642"}, + {0xF9C2, U"\U000084FC"}, + {0xF9C3, U"\U0000907C"}, + {0xF9C4, U"\U00009F8D"}, + {0xF9C5, U"\U00006688"}, + {0xF9C6, U"\U0000962E"}, + {0xF9C7, U"\U00005289"}, + {0xF9C8, U"\U0000677B"}, + {0xF9C9, U"\U000067F3"}, + {0xF9CA, U"\U00006D41"}, + {0xF9CB, U"\U00006E9C"}, + {0xF9CC, U"\U00007409"}, + {0xF9CD, U"\U00007559"}, + {0xF9CE, U"\U0000786B"}, + {0xF9CF, U"\U00007D10"}, + {0xF9D0, U"\U0000985E"}, + {0xF9D1, U"\U0000516D"}, + {0xF9D2, U"\U0000622E"}, + {0xF9D3, U"\U00009678"}, + {0xF9D4, U"\U0000502B"}, + {0xF9D5, U"\U00005D19"}, + {0xF9D6, U"\U00006DEA"}, + {0xF9D7, U"\U00008F2A"}, + {0xF9D8, U"\U00005F8B"}, + {0xF9D9, U"\U00006144"}, + {0xF9DA, U"\U00006817"}, + {0xF9DB, U"\U00007387"}, + {0xF9DC, U"\U00009686"}, + {0xF9DD, U"\U00005229"}, + {0xF9DE, U"\U0000540F"}, + {0xF9DF, U"\U00005C65"}, + {0xF9E0, U"\U00006613"}, + {0xF9E1, U"\U0000674E"}, + {0xF9E2, U"\U000068A8"}, + {0xF9E3, U"\U00006CE5"}, + {0xF9E4, U"\U00007406"}, + {0xF9E5, U"\U000075E2"}, + {0xF9E6, U"\U00007F79"}, + {0xF9E7, U"\U000088CF"}, + {0xF9E8, U"\U000088E1"}, + {0xF9E9, U"\U000091CC"}, + {0xF9EA, U"\U000096E2"}, + {0xF9EB, U"\U0000533F"}, + {0xF9EC, U"\U00006EBA"}, + {0xF9ED, U"\U0000541D"}, + {0xF9EE, U"\U000071D0"}, + {0xF9EF, U"\U00007498"}, + {0xF9F0, U"\U000085FA"}, + {0xF9F1, U"\U000096A3"}, + {0xF9F2, U"\U00009C57"}, + {0xF9F3, U"\U00009E9F"}, + {0xF9F4, U"\U00006797"}, + {0xF9F5, U"\U00006DCB"}, + {0xF9F6, U"\U000081E8"}, + {0xF9F7, U"\U00007ACB"}, + {0xF9F8, U"\U00007B20"}, + {0xF9F9, U"\U00007C92"}, + {0xF9FA, U"\U000072C0"}, + {0xF9FB, U"\U00007099"}, + {0xF9FC, U"\U00008B58"}, + {0xF9FD, U"\U00004EC0"}, + {0xF9FE, U"\U00008336"}, + {0xF9FF, U"\U0000523A"}, + {0xFA00, U"\U00005207"}, + {0xFA01, U"\U00005EA6"}, + {0xFA02, U"\U000062D3"}, + {0xFA03, U"\U00007CD6"}, + {0xFA04, U"\U00005B85"}, + {0xFA05, U"\U00006D1E"}, + {0xFA06, U"\U000066B4"}, + {0xFA07, U"\U00008F3B"}, + {0xFA08, U"\U0000884C"}, + {0xFA09, U"\U0000964D"}, + {0xFA0A, U"\U0000898B"}, + {0xFA0B, U"\U00005ED3"}, + {0xFA0C, U"\U00005140"}, + {0xFA0D, U"\U000055C0"}, + {0xFA10, U"\U0000585A"}, + {0xFA12, U"\U00006674"}, + {0xFA15, U"\U000051DE"}, + {0xFA16, U"\U0000732A"}, + {0xFA17, U"\U000076CA"}, + {0xFA18, U"\U0000793C"}, + {0xFA19, U"\U0000795E"}, + {0xFA1A, U"\U00007965"}, + {0xFA1B, U"\U0000798F"}, + {0xFA1C, U"\U00009756"}, + {0xFA1D, U"\U00007CBE"}, + {0xFA1E, U"\U00007FBD"}, + {0xFA20, U"\U00008612"}, + {0xFA22, U"\U00008AF8"}, + {0xFA25, U"\U00009038"}, + {0xFA26, U"\U000090FD"}, + {0xFA2A, U"\U000098EF"}, + {0xFA2B, U"\U000098FC"}, + {0xFA2C, U"\U00009928"}, + {0xFA2D, U"\U00009DB4"}, + {0xFA2E, U"\U000090DE"}, + {0xFA2F, U"\U000096B7"}, + {0xFA30, U"\U00004FAE"}, + {0xFA31, U"\U000050E7"}, + {0xFA32, U"\U0000514D"}, + {0xFA33, U"\U000052C9"}, + {0xFA34, U"\U000052E4"}, + {0xFA35, U"\U00005351"}, + {0xFA36, U"\U0000559D"}, + {0xFA37, U"\U00005606"}, + {0xFA38, U"\U00005668"}, + {0xFA39, U"\U00005840"}, + {0xFA3A, U"\U000058A8"}, + {0xFA3B, U"\U00005C64"}, + {0xFA3C, U"\U00005C6E"}, + {0xFA3D, U"\U00006094"}, + {0xFA3E, U"\U00006168"}, + {0xFA3F, U"\U0000618E"}, + {0xFA40, U"\U000061F2"}, + {0xFA41, U"\U0000654F"}, + {0xFA42, U"\U000065E2"}, + {0xFA43, U"\U00006691"}, + {0xFA44, U"\U00006885"}, + {0xFA45, U"\U00006D77"}, + {0xFA46, U"\U00006E1A"}, + {0xFA47, U"\U00006F22"}, + {0xFA48, U"\U0000716E"}, + {0xFA49, U"\U0000722B"}, + {0xFA4A, U"\U00007422"}, + {0xFA4B, U"\U00007891"}, + {0xFA4C, U"\U0000793E"}, + {0xFA4D, U"\U00007949"}, + {0xFA4E, U"\U00007948"}, + {0xFA4F, U"\U00007950"}, + {0xFA50, U"\U00007956"}, + {0xFA51, U"\U0000795D"}, + {0xFA52, U"\U0000798D"}, + {0xFA53, U"\U0000798E"}, + {0xFA54, U"\U00007A40"}, + {0xFA55, U"\U00007A81"}, + {0xFA56, U"\U00007BC0"}, + {0xFA57, U"\U00007DF4"}, + {0xFA58, U"\U00007E09"}, + {0xFA59, U"\U00007E41"}, + {0xFA5A, U"\U00007F72"}, + {0xFA5B, U"\U00008005"}, + {0xFA5C, U"\U000081ED"}, + {0xFA5D, U"\U00008279"}, + {0xFA5E, U"\U00008279"}, + {0xFA5F, U"\U00008457"}, + {0xFA60, U"\U00008910"}, + {0xFA61, U"\U00008996"}, + {0xFA62, U"\U00008B01"}, + {0xFA63, U"\U00008B39"}, + {0xFA64, U"\U00008CD3"}, + {0xFA65, U"\U00008D08"}, + {0xFA66, U"\U00008FB6"}, + {0xFA67, U"\U00009038"}, + {0xFA68, U"\U000096E3"}, + {0xFA69, U"\U000097FF"}, + {0xFA6A, U"\U0000983B"}, + {0xFA6B, U"\U00006075"}, + {0xFA6C, U"\U000242EE"}, + {0xFA6D, U"\U00008218"}, + {0xFA70, U"\U00004E26"}, + {0xFA71, U"\U000051B5"}, + {0xFA72, U"\U00005168"}, + {0xFA73, U"\U00004F80"}, + {0xFA74, U"\U00005145"}, + {0xFA75, U"\U00005180"}, + {0xFA76, U"\U000052C7"}, + {0xFA77, U"\U000052FA"}, + {0xFA78, U"\U0000559D"}, + {0xFA79, U"\U00005555"}, + {0xFA7A, U"\U00005599"}, + {0xFA7B, U"\U000055E2"}, + {0xFA7C, U"\U0000585A"}, + {0xFA7D, U"\U000058B3"}, + {0xFA7E, U"\U00005944"}, + {0xFA7F, U"\U00005954"}, + {0xFA80, U"\U00005A62"}, + {0xFA81, U"\U00005B28"}, + {0xFA82, U"\U00005ED2"}, + {0xFA83, U"\U00005ED9"}, + {0xFA84, U"\U00005F69"}, + {0xFA85, U"\U00005FAD"}, + {0xFA86, U"\U000060D8"}, + {0xFA87, U"\U0000614E"}, + {0xFA88, U"\U00006108"}, + {0xFA89, U"\U0000618E"}, + {0xFA8A, U"\U00006160"}, + {0xFA8B, U"\U000061F2"}, + {0xFA8C, U"\U00006234"}, + {0xFA8D, U"\U000063C4"}, + {0xFA8E, U"\U0000641C"}, + {0xFA8F, U"\U00006452"}, + {0xFA90, U"\U00006556"}, + {0xFA91, U"\U00006674"}, + {0xFA92, U"\U00006717"}, + {0xFA93, U"\U0000671B"}, + {0xFA94, U"\U00006756"}, + {0xFA95, U"\U00006B79"}, + {0xFA96, U"\U00006BBA"}, + {0xFA97, U"\U00006D41"}, + {0xFA98, U"\U00006EDB"}, + {0xFA99, U"\U00006ECB"}, + {0xFA9A, U"\U00006F22"}, + {0xFA9B, U"\U0000701E"}, + {0xFA9C, U"\U0000716E"}, + {0xFA9D, U"\U000077A7"}, + {0xFA9E, U"\U00007235"}, + {0xFA9F, U"\U000072AF"}, + {0xFAA0, U"\U0000732A"}, + {0xFAA1, U"\U00007471"}, + {0xFAA2, U"\U00007506"}, + {0xFAA3, U"\U0000753B"}, + {0xFAA4, U"\U0000761D"}, + {0xFAA5, U"\U0000761F"}, + {0xFAA6, U"\U000076CA"}, + {0xFAA7, U"\U000076DB"}, + {0xFAA8, U"\U000076F4"}, + {0xFAA9, U"\U0000774A"}, + {0xFAAA, U"\U00007740"}, + {0xFAAB, U"\U000078CC"}, + {0xFAAC, U"\U00007AB1"}, + {0xFAAD, U"\U00007BC0"}, + {0xFAAE, U"\U00007C7B"}, + {0xFAAF, U"\U00007D5B"}, + {0xFAB0, U"\U00007DF4"}, + {0xFAB1, U"\U00007F3E"}, + {0xFAB2, U"\U00008005"}, + {0xFAB3, U"\U00008352"}, + {0xFAB4, U"\U000083EF"}, + {0xFAB5, U"\U00008779"}, + {0xFAB6, U"\U00008941"}, + {0xFAB7, U"\U00008986"}, + {0xFAB8, U"\U00008996"}, + {0xFAB9, U"\U00008ABF"}, + {0xFABA, U"\U00008AF8"}, + {0xFABB, U"\U00008ACB"}, + {0xFABC, U"\U00008B01"}, + {0xFABD, U"\U00008AFE"}, + {0xFABE, U"\U00008AED"}, + {0xFABF, U"\U00008B39"}, + {0xFAC0, U"\U00008B8A"}, + {0xFAC1, U"\U00008D08"}, + {0xFAC2, U"\U00008F38"}, + {0xFAC3, U"\U00009072"}, + {0xFAC4, U"\U00009199"}, + {0xFAC5, U"\U00009276"}, + {0xFAC6, U"\U0000967C"}, + {0xFAC7, U"\U000096E3"}, + {0xFAC8, U"\U00009756"}, + {0xFAC9, U"\U000097DB"}, + {0xFACA, U"\U000097FF"}, + {0xFACB, U"\U0000980B"}, + {0xFACC, U"\U0000983B"}, + {0xFACD, U"\U00009B12"}, + {0xFACE, U"\U00009F9C"}, + {0xFACF, U"\U0002284A"}, + {0xFAD0, U"\U00022844"}, + {0xFAD1, U"\U000233D5"}, + {0xFAD2, U"\U00003B9D"}, + {0xFAD3, U"\U00004018"}, + {0xFAD4, U"\U00004039"}, + {0xFAD5, U"\U00025249"}, + {0xFAD6, U"\U00025CD0"}, + {0xFAD7, U"\U00027ED3"}, + {0xFAD8, U"\U00009F43"}, + {0xFAD9, U"\U00009F8E"}, + {0xFB00, U"\U00000066\U00000066"}, + {0xFB01, U"\U00000066\U00000069"}, + {0xFB02, U"\U00000066\U0000006C"}, + {0xFB03, U"\U00000066\U00000066\U00000069"}, + {0xFB04, U"\U00000066\U00000066\U0000006C"}, + {0xFB05, U"\U00000073\U00000074"}, + {0xFB06, U"\U00000073\U00000074"}, + {0xFB13, U"\U00000574\U00000576"}, + {0xFB14, U"\U00000574\U00000565"}, + {0xFB15, U"\U00000574\U0000056B"}, + {0xFB16, U"\U0000057E\U00000576"}, + {0xFB17, U"\U00000574\U0000056D"}, + {0xFB1D, U"\U000005D9\U000005B4"}, + {0xFB1F, U"\U000005F2\U000005B7"}, + {0xFB20, U"\U000005E2"}, + {0xFB21, U"\U000005D0"}, + {0xFB22, U"\U000005D3"}, + {0xFB23, U"\U000005D4"}, + {0xFB24, U"\U000005DB"}, + {0xFB25, U"\U000005DC"}, + {0xFB26, U"\U000005DD"}, + {0xFB27, U"\U000005E8"}, + {0xFB28, U"\U000005EA"}, + {0xFB29, U"\U0000002B"}, + {0xFB2A, U"\U000005E9\U000005C1"}, + {0xFB2B, U"\U000005E9\U000005C2"}, + {0xFB2C, U"\U000005E9\U000005BC\U000005C1"}, + {0xFB2D, U"\U000005E9\U000005BC\U000005C2"}, + {0xFB2E, U"\U000005D0\U000005B7"}, + {0xFB2F, U"\U000005D0\U000005B8"}, + {0xFB30, U"\U000005D0\U000005BC"}, + {0xFB31, U"\U000005D1\U000005BC"}, + {0xFB32, U"\U000005D2\U000005BC"}, + {0xFB33, U"\U000005D3\U000005BC"}, + {0xFB34, U"\U000005D4\U000005BC"}, + {0xFB35, U"\U000005D5\U000005BC"}, + {0xFB36, U"\U000005D6\U000005BC"}, + {0xFB38, U"\U000005D8\U000005BC"}, + {0xFB39, U"\U000005D9\U000005BC"}, + {0xFB3A, U"\U000005DA\U000005BC"}, + {0xFB3B, U"\U000005DB\U000005BC"}, + {0xFB3C, U"\U000005DC\U000005BC"}, + {0xFB3E, U"\U000005DE\U000005BC"}, + {0xFB40, U"\U000005E0\U000005BC"}, + {0xFB41, U"\U000005E1\U000005BC"}, + {0xFB43, U"\U000005E3\U000005BC"}, + {0xFB44, U"\U000005E4\U000005BC"}, + {0xFB46, U"\U000005E6\U000005BC"}, + {0xFB47, U"\U000005E7\U000005BC"}, + {0xFB48, U"\U000005E8\U000005BC"}, + {0xFB49, U"\U000005E9\U000005BC"}, + {0xFB4A, U"\U000005EA\U000005BC"}, + {0xFB4B, U"\U000005D5\U000005B9"}, + {0xFB4C, U"\U000005D1\U000005BF"}, + {0xFB4D, U"\U000005DB\U000005BF"}, + {0xFB4E, U"\U000005E4\U000005BF"}, + {0xFB4F, U"\U000005D0\U000005DC"}, + {0xFB50, U"\U00000671"}, + {0xFB51, U"\U00000671"}, + {0xFB52, U"\U0000067B"}, + {0xFB53, U"\U0000067B"}, + {0xFB54, U"\U0000067B"}, + {0xFB55, U"\U0000067B"}, + {0xFB56, U"\U0000067E"}, + {0xFB57, U"\U0000067E"}, + {0xFB58, U"\U0000067E"}, + {0xFB59, U"\U0000067E"}, + {0xFB5A, U"\U00000680"}, + {0xFB5B, U"\U00000680"}, + {0xFB5C, U"\U00000680"}, + {0xFB5D, U"\U00000680"}, + {0xFB5E, U"\U0000067A"}, + {0xFB5F, U"\U0000067A"}, + {0xFB60, U"\U0000067A"}, + {0xFB61, U"\U0000067A"}, + {0xFB62, U"\U0000067F"}, + {0xFB63, U"\U0000067F"}, + {0xFB64, U"\U0000067F"}, + {0xFB65, U"\U0000067F"}, + {0xFB66, U"\U00000679"}, + {0xFB67, U"\U00000679"}, + {0xFB68, U"\U00000679"}, + {0xFB69, U"\U00000679"}, + {0xFB6A, U"\U000006A4"}, + {0xFB6B, U"\U000006A4"}, + {0xFB6C, U"\U000006A4"}, + {0xFB6D, U"\U000006A4"}, + {0xFB6E, U"\U000006A6"}, + {0xFB6F, U"\U000006A6"}, + {0xFB70, U"\U000006A6"}, + {0xFB71, U"\U000006A6"}, + {0xFB72, U"\U00000684"}, + {0xFB73, U"\U00000684"}, + {0xFB74, U"\U00000684"}, + {0xFB75, U"\U00000684"}, + {0xFB76, U"\U00000683"}, + {0xFB77, U"\U00000683"}, + {0xFB78, U"\U00000683"}, + {0xFB79, U"\U00000683"}, + {0xFB7A, U"\U00000686"}, + {0xFB7B, U"\U00000686"}, + {0xFB7C, U"\U00000686"}, + {0xFB7D, U"\U00000686"}, + {0xFB7E, U"\U00000687"}, + {0xFB7F, U"\U00000687"}, + {0xFB80, U"\U00000687"}, + {0xFB81, U"\U00000687"}, + {0xFB82, U"\U0000068D"}, + {0xFB83, U"\U0000068D"}, + {0xFB84, U"\U0000068C"}, + {0xFB85, U"\U0000068C"}, + {0xFB86, U"\U0000068E"}, + {0xFB87, U"\U0000068E"}, + {0xFB88, U"\U00000688"}, + {0xFB89, U"\U00000688"}, + {0xFB8A, U"\U00000698"}, + {0xFB8B, U"\U00000698"}, + {0xFB8C, U"\U00000691"}, + {0xFB8D, U"\U00000691"}, + {0xFB8E, U"\U000006A9"}, + {0xFB8F, U"\U000006A9"}, + {0xFB90, U"\U000006A9"}, + {0xFB91, U"\U000006A9"}, + {0xFB92, U"\U000006AF"}, + {0xFB93, U"\U000006AF"}, + {0xFB94, U"\U000006AF"}, + {0xFB95, U"\U000006AF"}, + {0xFB96, U"\U000006B3"}, + {0xFB97, U"\U000006B3"}, + {0xFB98, U"\U000006B3"}, + {0xFB99, U"\U000006B3"}, + {0xFB9A, U"\U000006B1"}, + {0xFB9B, U"\U000006B1"}, + {0xFB9C, U"\U000006B1"}, + {0xFB9D, U"\U000006B1"}, + {0xFB9E, U"\U000006BA"}, + {0xFB9F, U"\U000006BA"}, + {0xFBA0, U"\U000006BB"}, + {0xFBA1, U"\U000006BB"}, + {0xFBA2, U"\U000006BB"}, + {0xFBA3, U"\U000006BB"}, + {0xFBA4, U"\U000006C0"}, + {0xFBA5, U"\U000006C0"}, + {0xFBA6, U"\U000006C1"}, + {0xFBA7, U"\U000006C1"}, + {0xFBA8, U"\U000006C1"}, + {0xFBA9, U"\U000006C1"}, + {0xFBAA, U"\U000006BE"}, + {0xFBAB, U"\U000006BE"}, + {0xFBAC, U"\U000006BE"}, + {0xFBAD, U"\U000006BE"}, + {0xFBAE, U"\U000006D2"}, + {0xFBAF, U"\U000006D2"}, + {0xFBB0, U"\U000006D3"}, + {0xFBB1, U"\U000006D3"}, + {0xFBD3, U"\U000006AD"}, + {0xFBD4, U"\U000006AD"}, + {0xFBD5, U"\U000006AD"}, + {0xFBD6, U"\U000006AD"}, + {0xFBD7, U"\U000006C7"}, + {0xFBD8, U"\U000006C7"}, + {0xFBD9, U"\U000006C6"}, + {0xFBDA, U"\U000006C6"}, + {0xFBDB, U"\U000006C8"}, + {0xFBDC, U"\U000006C8"}, + {0xFBDD, U"\U000006C7\U00000674"}, + {0xFBDE, U"\U000006CB"}, + {0xFBDF, U"\U000006CB"}, + {0xFBE0, U"\U000006C5"}, + {0xFBE1, U"\U000006C5"}, + {0xFBE2, U"\U000006C9"}, + {0xFBE3, U"\U000006C9"}, + {0xFBE4, U"\U000006D0"}, + {0xFBE5, U"\U000006D0"}, + {0xFBE6, U"\U000006D0"}, + {0xFBE7, U"\U000006D0"}, + {0xFBE8, U"\U00000649"}, + {0xFBE9, U"\U00000649"}, + {0xFBEA, U"\U00000626\U00000627"}, + {0xFBEB, U"\U00000626\U00000627"}, + {0xFBEC, U"\U00000626\U000006D5"}, + {0xFBED, U"\U00000626\U000006D5"}, + {0xFBEE, U"\U00000626\U00000648"}, + {0xFBEF, U"\U00000626\U00000648"}, + {0xFBF0, U"\U00000626\U000006C7"}, + {0xFBF1, U"\U00000626\U000006C7"}, + {0xFBF2, U"\U00000626\U000006C6"}, + {0xFBF3, U"\U00000626\U000006C6"}, + {0xFBF4, U"\U00000626\U000006C8"}, + {0xFBF5, U"\U00000626\U000006C8"}, + {0xFBF6, U"\U00000626\U000006D0"}, + {0xFBF7, U"\U00000626\U000006D0"}, + {0xFBF8, U"\U00000626\U000006D0"}, + {0xFBF9, U"\U00000626\U00000649"}, + {0xFBFA, U"\U00000626\U00000649"}, + {0xFBFB, U"\U00000626\U00000649"}, + {0xFBFC, U"\U000006CC"}, + {0xFBFD, U"\U000006CC"}, + {0xFBFE, U"\U000006CC"}, + {0xFBFF, U"\U000006CC"}, + {0xFC00, U"\U00000626\U0000062C"}, + {0xFC01, U"\U00000626\U0000062D"}, + {0xFC02, U"\U00000626\U00000645"}, + {0xFC03, U"\U00000626\U00000649"}, + {0xFC04, U"\U00000626\U0000064A"}, + {0xFC05, U"\U00000628\U0000062C"}, + {0xFC06, U"\U00000628\U0000062D"}, + {0xFC07, U"\U00000628\U0000062E"}, + {0xFC08, U"\U00000628\U00000645"}, + {0xFC09, U"\U00000628\U00000649"}, + {0xFC0A, U"\U00000628\U0000064A"}, + {0xFC0B, U"\U0000062A\U0000062C"}, + {0xFC0C, U"\U0000062A\U0000062D"}, + {0xFC0D, U"\U0000062A\U0000062E"}, + {0xFC0E, U"\U0000062A\U00000645"}, + {0xFC0F, U"\U0000062A\U00000649"}, + {0xFC10, U"\U0000062A\U0000064A"}, + {0xFC11, U"\U0000062B\U0000062C"}, + {0xFC12, U"\U0000062B\U00000645"}, + {0xFC13, U"\U0000062B\U00000649"}, + {0xFC14, U"\U0000062B\U0000064A"}, + {0xFC15, U"\U0000062C\U0000062D"}, + {0xFC16, U"\U0000062C\U00000645"}, + {0xFC17, U"\U0000062D\U0000062C"}, + {0xFC18, U"\U0000062D\U00000645"}, + {0xFC19, U"\U0000062E\U0000062C"}, + {0xFC1A, U"\U0000062E\U0000062D"}, + {0xFC1B, U"\U0000062E\U00000645"}, + {0xFC1C, U"\U00000633\U0000062C"}, + {0xFC1D, U"\U00000633\U0000062D"}, + {0xFC1E, U"\U00000633\U0000062E"}, + {0xFC1F, U"\U00000633\U00000645"}, + {0xFC20, U"\U00000635\U0000062D"}, + {0xFC21, U"\U00000635\U00000645"}, + {0xFC22, U"\U00000636\U0000062C"}, + {0xFC23, U"\U00000636\U0000062D"}, + {0xFC24, U"\U00000636\U0000062E"}, + {0xFC25, U"\U00000636\U00000645"}, + {0xFC26, U"\U00000637\U0000062D"}, + {0xFC27, U"\U00000637\U00000645"}, + {0xFC28, U"\U00000638\U00000645"}, + {0xFC29, U"\U00000639\U0000062C"}, + {0xFC2A, U"\U00000639\U00000645"}, + {0xFC2B, U"\U0000063A\U0000062C"}, + {0xFC2C, U"\U0000063A\U00000645"}, + {0xFC2D, U"\U00000641\U0000062C"}, + {0xFC2E, U"\U00000641\U0000062D"}, + {0xFC2F, U"\U00000641\U0000062E"}, + {0xFC30, U"\U00000641\U00000645"}, + {0xFC31, U"\U00000641\U00000649"}, + {0xFC32, U"\U00000641\U0000064A"}, + {0xFC33, U"\U00000642\U0000062D"}, + {0xFC34, U"\U00000642\U00000645"}, + {0xFC35, U"\U00000642\U00000649"}, + {0xFC36, U"\U00000642\U0000064A"}, + {0xFC37, U"\U00000643\U00000627"}, + {0xFC38, U"\U00000643\U0000062C"}, + {0xFC39, U"\U00000643\U0000062D"}, + {0xFC3A, U"\U00000643\U0000062E"}, + {0xFC3B, U"\U00000643\U00000644"}, + {0xFC3C, U"\U00000643\U00000645"}, + {0xFC3D, U"\U00000643\U00000649"}, + {0xFC3E, U"\U00000643\U0000064A"}, + {0xFC3F, U"\U00000644\U0000062C"}, + {0xFC40, U"\U00000644\U0000062D"}, + {0xFC41, U"\U00000644\U0000062E"}, + {0xFC42, U"\U00000644\U00000645"}, + {0xFC43, U"\U00000644\U00000649"}, + {0xFC44, U"\U00000644\U0000064A"}, + {0xFC45, U"\U00000645\U0000062C"}, + {0xFC46, U"\U00000645\U0000062D"}, + {0xFC47, U"\U00000645\U0000062E"}, + {0xFC48, U"\U00000645\U00000645"}, + {0xFC49, U"\U00000645\U00000649"}, + {0xFC4A, U"\U00000645\U0000064A"}, + {0xFC4B, U"\U00000646\U0000062C"}, + {0xFC4C, U"\U00000646\U0000062D"}, + {0xFC4D, U"\U00000646\U0000062E"}, + {0xFC4E, U"\U00000646\U00000645"}, + {0xFC4F, U"\U00000646\U00000649"}, + {0xFC50, U"\U00000646\U0000064A"}, + {0xFC51, U"\U00000647\U0000062C"}, + {0xFC52, U"\U00000647\U00000645"}, + {0xFC53, U"\U00000647\U00000649"}, + {0xFC54, U"\U00000647\U0000064A"}, + {0xFC55, U"\U0000064A\U0000062C"}, + {0xFC56, U"\U0000064A\U0000062D"}, + {0xFC57, U"\U0000064A\U0000062E"}, + {0xFC58, U"\U0000064A\U00000645"}, + {0xFC59, U"\U0000064A\U00000649"}, + {0xFC5A, U"\U0000064A\U0000064A"}, + {0xFC5B, U"\U00000630\U00000670"}, + {0xFC5C, U"\U00000631\U00000670"}, + {0xFC5D, U"\U00000649\U00000670"}, + {0xFC5E, U"\U00000020\U0000064C\U00000651"}, + {0xFC5F, U"\U00000020\U0000064D\U00000651"}, + {0xFC60, U"\U00000020\U0000064E\U00000651"}, + {0xFC61, U"\U00000020\U0000064F\U00000651"}, + {0xFC62, U"\U00000020\U00000650\U00000651"}, + {0xFC63, U"\U00000020\U00000651\U00000670"}, + {0xFC64, U"\U00000626\U00000631"}, + {0xFC65, U"\U00000626\U00000632"}, + {0xFC66, U"\U00000626\U00000645"}, + {0xFC67, U"\U00000626\U00000646"}, + {0xFC68, U"\U00000626\U00000649"}, + {0xFC69, U"\U00000626\U0000064A"}, + {0xFC6A, U"\U00000628\U00000631"}, + {0xFC6B, U"\U00000628\U00000632"}, + {0xFC6C, U"\U00000628\U00000645"}, + {0xFC6D, U"\U00000628\U00000646"}, + {0xFC6E, U"\U00000628\U00000649"}, + {0xFC6F, U"\U00000628\U0000064A"}, + {0xFC70, U"\U0000062A\U00000631"}, + {0xFC71, U"\U0000062A\U00000632"}, + {0xFC72, U"\U0000062A\U00000645"}, + {0xFC73, U"\U0000062A\U00000646"}, + {0xFC74, U"\U0000062A\U00000649"}, + {0xFC75, U"\U0000062A\U0000064A"}, + {0xFC76, U"\U0000062B\U00000631"}, + {0xFC77, U"\U0000062B\U00000632"}, + {0xFC78, U"\U0000062B\U00000645"}, + {0xFC79, U"\U0000062B\U00000646"}, + {0xFC7A, U"\U0000062B\U00000649"}, + {0xFC7B, U"\U0000062B\U0000064A"}, + {0xFC7C, U"\U00000641\U00000649"}, + {0xFC7D, U"\U00000641\U0000064A"}, + {0xFC7E, U"\U00000642\U00000649"}, + {0xFC7F, U"\U00000642\U0000064A"}, + {0xFC80, U"\U00000643\U00000627"}, + {0xFC81, U"\U00000643\U00000644"}, + {0xFC82, U"\U00000643\U00000645"}, + {0xFC83, U"\U00000643\U00000649"}, + {0xFC84, U"\U00000643\U0000064A"}, + {0xFC85, U"\U00000644\U00000645"}, + {0xFC86, U"\U00000644\U00000649"}, + {0xFC87, U"\U00000644\U0000064A"}, + {0xFC88, U"\U00000645\U00000627"}, + {0xFC89, U"\U00000645\U00000645"}, + {0xFC8A, U"\U00000646\U00000631"}, + {0xFC8B, U"\U00000646\U00000632"}, + {0xFC8C, U"\U00000646\U00000645"}, + {0xFC8D, U"\U00000646\U00000646"}, + {0xFC8E, U"\U00000646\U00000649"}, + {0xFC8F, U"\U00000646\U0000064A"}, + {0xFC90, U"\U00000649\U00000670"}, + {0xFC91, U"\U0000064A\U00000631"}, + {0xFC92, U"\U0000064A\U00000632"}, + {0xFC93, U"\U0000064A\U00000645"}, + {0xFC94, U"\U0000064A\U00000646"}, + {0xFC95, U"\U0000064A\U00000649"}, + {0xFC96, U"\U0000064A\U0000064A"}, + {0xFC97, U"\U00000626\U0000062C"}, + {0xFC98, U"\U00000626\U0000062D"}, + {0xFC99, U"\U00000626\U0000062E"}, + {0xFC9A, U"\U00000626\U00000645"}, + {0xFC9B, U"\U00000626\U00000647"}, + {0xFC9C, U"\U00000628\U0000062C"}, + {0xFC9D, U"\U00000628\U0000062D"}, + {0xFC9E, U"\U00000628\U0000062E"}, + {0xFC9F, U"\U00000628\U00000645"}, + {0xFCA0, U"\U00000628\U00000647"}, + {0xFCA1, U"\U0000062A\U0000062C"}, + {0xFCA2, U"\U0000062A\U0000062D"}, + {0xFCA3, U"\U0000062A\U0000062E"}, + {0xFCA4, U"\U0000062A\U00000645"}, + {0xFCA5, U"\U0000062A\U00000647"}, + {0xFCA6, U"\U0000062B\U00000645"}, + {0xFCA7, U"\U0000062C\U0000062D"}, + {0xFCA8, U"\U0000062C\U00000645"}, + {0xFCA9, U"\U0000062D\U0000062C"}, + {0xFCAA, U"\U0000062D\U00000645"}, + {0xFCAB, U"\U0000062E\U0000062C"}, + {0xFCAC, U"\U0000062E\U00000645"}, + {0xFCAD, U"\U00000633\U0000062C"}, + {0xFCAE, U"\U00000633\U0000062D"}, + {0xFCAF, U"\U00000633\U0000062E"}, + {0xFCB0, U"\U00000633\U00000645"}, + {0xFCB1, U"\U00000635\U0000062D"}, + {0xFCB2, U"\U00000635\U0000062E"}, + {0xFCB3, U"\U00000635\U00000645"}, + {0xFCB4, U"\U00000636\U0000062C"}, + {0xFCB5, U"\U00000636\U0000062D"}, + {0xFCB6, U"\U00000636\U0000062E"}, + {0xFCB7, U"\U00000636\U00000645"}, + {0xFCB8, U"\U00000637\U0000062D"}, + {0xFCB9, U"\U00000638\U00000645"}, + {0xFCBA, U"\U00000639\U0000062C"}, + {0xFCBB, U"\U00000639\U00000645"}, + {0xFCBC, U"\U0000063A\U0000062C"}, + {0xFCBD, U"\U0000063A\U00000645"}, + {0xFCBE, U"\U00000641\U0000062C"}, + {0xFCBF, U"\U00000641\U0000062D"}, + {0xFCC0, U"\U00000641\U0000062E"}, + {0xFCC1, U"\U00000641\U00000645"}, + {0xFCC2, U"\U00000642\U0000062D"}, + {0xFCC3, U"\U00000642\U00000645"}, + {0xFCC4, U"\U00000643\U0000062C"}, + {0xFCC5, U"\U00000643\U0000062D"}, + {0xFCC6, U"\U00000643\U0000062E"}, + {0xFCC7, U"\U00000643\U00000644"}, + {0xFCC8, U"\U00000643\U00000645"}, + {0xFCC9, U"\U00000644\U0000062C"}, + {0xFCCA, U"\U00000644\U0000062D"}, + {0xFCCB, U"\U00000644\U0000062E"}, + {0xFCCC, U"\U00000644\U00000645"}, + {0xFCCD, U"\U00000644\U00000647"}, + {0xFCCE, U"\U00000645\U0000062C"}, + {0xFCCF, U"\U00000645\U0000062D"}, + {0xFCD0, U"\U00000645\U0000062E"}, + {0xFCD1, U"\U00000645\U00000645"}, + {0xFCD2, U"\U00000646\U0000062C"}, + {0xFCD3, U"\U00000646\U0000062D"}, + {0xFCD4, U"\U00000646\U0000062E"}, + {0xFCD5, U"\U00000646\U00000645"}, + {0xFCD6, U"\U00000646\U00000647"}, + {0xFCD7, U"\U00000647\U0000062C"}, + {0xFCD8, U"\U00000647\U00000645"}, + {0xFCD9, U"\U00000647\U00000670"}, + {0xFCDA, U"\U0000064A\U0000062C"}, + {0xFCDB, U"\U0000064A\U0000062D"}, + {0xFCDC, U"\U0000064A\U0000062E"}, + {0xFCDD, U"\U0000064A\U00000645"}, + {0xFCDE, U"\U0000064A\U00000647"}, + {0xFCDF, U"\U00000626\U00000645"}, + {0xFCE0, U"\U00000626\U00000647"}, + {0xFCE1, U"\U00000628\U00000645"}, + {0xFCE2, U"\U00000628\U00000647"}, + {0xFCE3, U"\U0000062A\U00000645"}, + {0xFCE4, U"\U0000062A\U00000647"}, + {0xFCE5, U"\U0000062B\U00000645"}, + {0xFCE6, U"\U0000062B\U00000647"}, + {0xFCE7, U"\U00000633\U00000645"}, + {0xFCE8, U"\U00000633\U00000647"}, + {0xFCE9, U"\U00000634\U00000645"}, + {0xFCEA, U"\U00000634\U00000647"}, + {0xFCEB, U"\U00000643\U00000644"}, + {0xFCEC, U"\U00000643\U00000645"}, + {0xFCED, U"\U00000644\U00000645"}, + {0xFCEE, U"\U00000646\U00000645"}, + {0xFCEF, U"\U00000646\U00000647"}, + {0xFCF0, U"\U0000064A\U00000645"}, + {0xFCF1, U"\U0000064A\U00000647"}, + {0xFCF2, U"\U00000640\U0000064E\U00000651"}, + {0xFCF3, U"\U00000640\U0000064F\U00000651"}, + {0xFCF4, U"\U00000640\U00000650\U00000651"}, + {0xFCF5, U"\U00000637\U00000649"}, + {0xFCF6, U"\U00000637\U0000064A"}, + {0xFCF7, U"\U00000639\U00000649"}, + {0xFCF8, U"\U00000639\U0000064A"}, + {0xFCF9, U"\U0000063A\U00000649"}, + {0xFCFA, U"\U0000063A\U0000064A"}, + {0xFCFB, U"\U00000633\U00000649"}, + {0xFCFC, U"\U00000633\U0000064A"}, + {0xFCFD, U"\U00000634\U00000649"}, + {0xFCFE, U"\U00000634\U0000064A"}, + {0xFCFF, U"\U0000062D\U00000649"}, + {0xFD00, U"\U0000062D\U0000064A"}, + {0xFD01, U"\U0000062C\U00000649"}, + {0xFD02, U"\U0000062C\U0000064A"}, + {0xFD03, U"\U0000062E\U00000649"}, + {0xFD04, U"\U0000062E\U0000064A"}, + {0xFD05, U"\U00000635\U00000649"}, + {0xFD06, U"\U00000635\U0000064A"}, + {0xFD07, U"\U00000636\U00000649"}, + {0xFD08, U"\U00000636\U0000064A"}, + {0xFD09, U"\U00000634\U0000062C"}, + {0xFD0A, U"\U00000634\U0000062D"}, + {0xFD0B, U"\U00000634\U0000062E"}, + {0xFD0C, U"\U00000634\U00000645"}, + {0xFD0D, U"\U00000634\U00000631"}, + {0xFD0E, U"\U00000633\U00000631"}, + {0xFD0F, U"\U00000635\U00000631"}, + {0xFD10, U"\U00000636\U00000631"}, + {0xFD11, U"\U00000637\U00000649"}, + {0xFD12, U"\U00000637\U0000064A"}, + {0xFD13, U"\U00000639\U00000649"}, + {0xFD14, U"\U00000639\U0000064A"}, + {0xFD15, U"\U0000063A\U00000649"}, + {0xFD16, U"\U0000063A\U0000064A"}, + {0xFD17, U"\U00000633\U00000649"}, + {0xFD18, U"\U00000633\U0000064A"}, + {0xFD19, U"\U00000634\U00000649"}, + {0xFD1A, U"\U00000634\U0000064A"}, + {0xFD1B, U"\U0000062D\U00000649"}, + {0xFD1C, U"\U0000062D\U0000064A"}, + {0xFD1D, U"\U0000062C\U00000649"}, + {0xFD1E, U"\U0000062C\U0000064A"}, + {0xFD1F, U"\U0000062E\U00000649"}, + {0xFD20, U"\U0000062E\U0000064A"}, + {0xFD21, U"\U00000635\U00000649"}, + {0xFD22, U"\U00000635\U0000064A"}, + {0xFD23, U"\U00000636\U00000649"}, + {0xFD24, U"\U00000636\U0000064A"}, + {0xFD25, U"\U00000634\U0000062C"}, + {0xFD26, U"\U00000634\U0000062D"}, + {0xFD27, U"\U00000634\U0000062E"}, + {0xFD28, U"\U00000634\U00000645"}, + {0xFD29, U"\U00000634\U00000631"}, + {0xFD2A, U"\U00000633\U00000631"}, + {0xFD2B, U"\U00000635\U00000631"}, + {0xFD2C, U"\U00000636\U00000631"}, + {0xFD2D, U"\U00000634\U0000062C"}, + {0xFD2E, U"\U00000634\U0000062D"}, + {0xFD2F, U"\U00000634\U0000062E"}, + {0xFD30, U"\U00000634\U00000645"}, + {0xFD31, U"\U00000633\U00000647"}, + {0xFD32, U"\U00000634\U00000647"}, + {0xFD33, U"\U00000637\U00000645"}, + {0xFD34, U"\U00000633\U0000062C"}, + {0xFD35, U"\U00000633\U0000062D"}, + {0xFD36, U"\U00000633\U0000062E"}, + {0xFD37, U"\U00000634\U0000062C"}, + {0xFD38, U"\U00000634\U0000062D"}, + {0xFD39, U"\U00000634\U0000062E"}, + {0xFD3A, U"\U00000637\U00000645"}, + {0xFD3B, U"\U00000638\U00000645"}, + {0xFD3C, U"\U00000627\U0000064B"}, + {0xFD3D, U"\U00000627\U0000064B"}, + {0xFD50, U"\U0000062A\U0000062C\U00000645"}, + {0xFD51, U"\U0000062A\U0000062D\U0000062C"}, + {0xFD52, U"\U0000062A\U0000062D\U0000062C"}, + {0xFD53, U"\U0000062A\U0000062D\U00000645"}, + {0xFD54, U"\U0000062A\U0000062E\U00000645"}, + {0xFD55, U"\U0000062A\U00000645\U0000062C"}, + {0xFD56, U"\U0000062A\U00000645\U0000062D"}, + {0xFD57, U"\U0000062A\U00000645\U0000062E"}, + {0xFD58, U"\U0000062C\U00000645\U0000062D"}, + {0xFD59, U"\U0000062C\U00000645\U0000062D"}, + {0xFD5A, U"\U0000062D\U00000645\U0000064A"}, + {0xFD5B, U"\U0000062D\U00000645\U00000649"}, + {0xFD5C, U"\U00000633\U0000062D\U0000062C"}, + {0xFD5D, U"\U00000633\U0000062C\U0000062D"}, + {0xFD5E, U"\U00000633\U0000062C\U00000649"}, + {0xFD5F, U"\U00000633\U00000645\U0000062D"}, + {0xFD60, U"\U00000633\U00000645\U0000062D"}, + {0xFD61, U"\U00000633\U00000645\U0000062C"}, + {0xFD62, U"\U00000633\U00000645\U00000645"}, + {0xFD63, U"\U00000633\U00000645\U00000645"}, + {0xFD64, U"\U00000635\U0000062D\U0000062D"}, + {0xFD65, U"\U00000635\U0000062D\U0000062D"}, + {0xFD66, U"\U00000635\U00000645\U00000645"}, + {0xFD67, U"\U00000634\U0000062D\U00000645"}, + {0xFD68, U"\U00000634\U0000062D\U00000645"}, + {0xFD69, U"\U00000634\U0000062C\U0000064A"}, + {0xFD6A, U"\U00000634\U00000645\U0000062E"}, + {0xFD6B, U"\U00000634\U00000645\U0000062E"}, + {0xFD6C, U"\U00000634\U00000645\U00000645"}, + {0xFD6D, U"\U00000634\U00000645\U00000645"}, + {0xFD6E, U"\U00000636\U0000062D\U00000649"}, + {0xFD6F, U"\U00000636\U0000062E\U00000645"}, + {0xFD70, U"\U00000636\U0000062E\U00000645"}, + {0xFD71, U"\U00000637\U00000645\U0000062D"}, + {0xFD72, U"\U00000637\U00000645\U0000062D"}, + {0xFD73, U"\U00000637\U00000645\U00000645"}, + {0xFD74, U"\U00000637\U00000645\U0000064A"}, + {0xFD75, U"\U00000639\U0000062C\U00000645"}, + {0xFD76, U"\U00000639\U00000645\U00000645"}, + {0xFD77, U"\U00000639\U00000645\U00000645"}, + {0xFD78, U"\U00000639\U00000645\U00000649"}, + {0xFD79, U"\U0000063A\U00000645\U00000645"}, + {0xFD7A, U"\U0000063A\U00000645\U0000064A"}, + {0xFD7B, U"\U0000063A\U00000645\U00000649"}, + {0xFD7C, U"\U00000641\U0000062E\U00000645"}, + {0xFD7D, U"\U00000641\U0000062E\U00000645"}, + {0xFD7E, U"\U00000642\U00000645\U0000062D"}, + {0xFD7F, U"\U00000642\U00000645\U00000645"}, + {0xFD80, U"\U00000644\U0000062D\U00000645"}, + {0xFD81, U"\U00000644\U0000062D\U0000064A"}, + {0xFD82, U"\U00000644\U0000062D\U00000649"}, + {0xFD83, U"\U00000644\U0000062C\U0000062C"}, + {0xFD84, U"\U00000644\U0000062C\U0000062C"}, + {0xFD85, U"\U00000644\U0000062E\U00000645"}, + {0xFD86, U"\U00000644\U0000062E\U00000645"}, + {0xFD87, U"\U00000644\U00000645\U0000062D"}, + {0xFD88, U"\U00000644\U00000645\U0000062D"}, + {0xFD89, U"\U00000645\U0000062D\U0000062C"}, + {0xFD8A, U"\U00000645\U0000062D\U00000645"}, + {0xFD8B, U"\U00000645\U0000062D\U0000064A"}, + {0xFD8C, U"\U00000645\U0000062C\U0000062D"}, + {0xFD8D, U"\U00000645\U0000062C\U00000645"}, + {0xFD8E, U"\U00000645\U0000062E\U0000062C"}, + {0xFD8F, U"\U00000645\U0000062E\U00000645"}, + {0xFD92, U"\U00000645\U0000062C\U0000062E"}, + {0xFD93, U"\U00000647\U00000645\U0000062C"}, + {0xFD94, U"\U00000647\U00000645\U00000645"}, + {0xFD95, U"\U00000646\U0000062D\U00000645"}, + {0xFD96, U"\U00000646\U0000062D\U00000649"}, + {0xFD97, U"\U00000646\U0000062C\U00000645"}, + {0xFD98, U"\U00000646\U0000062C\U00000645"}, + {0xFD99, U"\U00000646\U0000062C\U00000649"}, + {0xFD9A, U"\U00000646\U00000645\U0000064A"}, + {0xFD9B, U"\U00000646\U00000645\U00000649"}, + {0xFD9C, U"\U0000064A\U00000645\U00000645"}, + {0xFD9D, U"\U0000064A\U00000645\U00000645"}, + {0xFD9E, U"\U00000628\U0000062E\U0000064A"}, + {0xFD9F, U"\U0000062A\U0000062C\U0000064A"}, + {0xFDA0, U"\U0000062A\U0000062C\U00000649"}, + {0xFDA1, U"\U0000062A\U0000062E\U0000064A"}, + {0xFDA2, U"\U0000062A\U0000062E\U00000649"}, + {0xFDA3, U"\U0000062A\U00000645\U0000064A"}, + {0xFDA4, U"\U0000062A\U00000645\U00000649"}, + {0xFDA5, U"\U0000062C\U00000645\U0000064A"}, + {0xFDA6, U"\U0000062C\U0000062D\U00000649"}, + {0xFDA7, U"\U0000062C\U00000645\U00000649"}, + {0xFDA8, U"\U00000633\U0000062E\U00000649"}, + {0xFDA9, U"\U00000635\U0000062D\U0000064A"}, + {0xFDAA, U"\U00000634\U0000062D\U0000064A"}, + {0xFDAB, U"\U00000636\U0000062D\U0000064A"}, + {0xFDAC, U"\U00000644\U0000062C\U0000064A"}, + {0xFDAD, U"\U00000644\U00000645\U0000064A"}, + {0xFDAE, U"\U0000064A\U0000062D\U0000064A"}, + {0xFDAF, U"\U0000064A\U0000062C\U0000064A"}, + {0xFDB0, U"\U0000064A\U00000645\U0000064A"}, + {0xFDB1, U"\U00000645\U00000645\U0000064A"}, + {0xFDB2, U"\U00000642\U00000645\U0000064A"}, + {0xFDB3, U"\U00000646\U0000062D\U0000064A"}, + {0xFDB4, U"\U00000642\U00000645\U0000062D"}, + {0xFDB5, U"\U00000644\U0000062D\U00000645"}, + {0xFDB6, U"\U00000639\U00000645\U0000064A"}, + {0xFDB7, U"\U00000643\U00000645\U0000064A"}, + {0xFDB8, U"\U00000646\U0000062C\U0000062D"}, + {0xFDB9, U"\U00000645\U0000062E\U0000064A"}, + {0xFDBA, U"\U00000644\U0000062C\U00000645"}, + {0xFDBB, U"\U00000643\U00000645\U00000645"}, + {0xFDBC, U"\U00000644\U0000062C\U00000645"}, + {0xFDBD, U"\U00000646\U0000062C\U0000062D"}, + {0xFDBE, U"\U0000062C\U0000062D\U0000064A"}, + {0xFDBF, U"\U0000062D\U0000062C\U0000064A"}, + {0xFDC0, U"\U00000645\U0000062C\U0000064A"}, + {0xFDC1, U"\U00000641\U00000645\U0000064A"}, + {0xFDC2, U"\U00000628\U0000062D\U0000064A"}, + {0xFDC3, U"\U00000643\U00000645\U00000645"}, + {0xFDC4, U"\U00000639\U0000062C\U00000645"}, + {0xFDC5, U"\U00000635\U00000645\U00000645"}, + {0xFDC6, U"\U00000633\U0000062E\U0000064A"}, + {0xFDC7, U"\U00000646\U0000062C\U0000064A"}, + {0xFDF0, U"\U00000635\U00000644\U000006D2"}, + {0xFDF1, U"\U00000642\U00000644\U000006D2"}, + {0xFDF2, U"\U00000627\U00000644\U00000644\U00000647"}, + {0xFDF3, U"\U00000627\U00000643\U00000628\U00000631"}, + {0xFDF4, U"\U00000645\U0000062D\U00000645\U0000062F"}, + {0xFDF5, U"\U00000635\U00000644\U00000639\U00000645"}, + {0xFDF6, U"\U00000631\U00000633\U00000648\U00000644"}, + {0xFDF7, U"\U00000639\U00000644\U0000064A\U00000647"}, + {0xFDF8, U"\U00000648\U00000633\U00000644\U00000645"}, + {0xFDF9, U"\U00000635\U00000644\U00000649"}, + {0xFDFA, U"\U00000635\U00000644\U00000649\U00000020\U00000627\U00000644\U00000644\U00000647\U00000020\U00000639\U00000644\U0000064A\U00000647\U00000020\U00000648\U00000633\U00000644\U00000645"}, + {0xFDFB, U"\U0000062C\U00000644\U00000020\U0000062C\U00000644\U00000627\U00000644\U00000647"}, + {0xFDFC, U"\U00000631\U000006CC\U00000627\U00000644"}, + {0xFE10, U"\U0000002C"}, + {0xFE11, U"\U00003001"}, + {0xFE12, U"\U00003002"}, + {0xFE13, U"\U0000003A"}, + {0xFE14, U"\U0000003B"}, + {0xFE15, U"\U00000021"}, + {0xFE16, U"\U0000003F"}, + {0xFE17, U"\U00003016"}, + {0xFE18, U"\U00003017"}, + {0xFE19, U"\U0000002E\U0000002E\U0000002E"}, + {0xFE30, U"\U0000002E\U0000002E"}, + {0xFE31, U"\U00002014"}, + {0xFE32, U"\U00002013"}, + {0xFE33, U"\U0000005F"}, + {0xFE34, U"\U0000005F"}, + {0xFE35, U"\U00000028"}, + {0xFE36, U"\U00000029"}, + {0xFE37, U"\U0000007B"}, + {0xFE38, U"\U0000007D"}, + {0xFE39, U"\U00003014"}, + {0xFE3A, U"\U00003015"}, + {0xFE3B, U"\U00003010"}, + {0xFE3C, U"\U00003011"}, + {0xFE3D, U"\U0000300A"}, + {0xFE3E, U"\U0000300B"}, + {0xFE3F, U"\U00003008"}, + {0xFE40, U"\U00003009"}, + {0xFE41, U"\U0000300C"}, + {0xFE42, U"\U0000300D"}, + {0xFE43, U"\U0000300E"}, + {0xFE44, U"\U0000300F"}, + {0xFE47, U"\U0000005B"}, + {0xFE48, U"\U0000005D"}, + {0xFE49, U"\U00000020\U00000305"}, + {0xFE4A, U"\U00000020\U00000305"}, + {0xFE4B, U"\U00000020\U00000305"}, + {0xFE4C, U"\U00000020\U00000305"}, + {0xFE4D, U"\U0000005F"}, + {0xFE4E, U"\U0000005F"}, + {0xFE4F, U"\U0000005F"}, + {0xFE50, U"\U0000002C"}, + {0xFE51, U"\U00003001"}, + {0xFE52, U"\U0000002E"}, + {0xFE54, U"\U0000003B"}, + {0xFE55, U"\U0000003A"}, + {0xFE56, U"\U0000003F"}, + {0xFE57, U"\U00000021"}, + {0xFE58, U"\U00002014"}, + {0xFE59, U"\U00000028"}, + {0xFE5A, U"\U00000029"}, + {0xFE5B, U"\U0000007B"}, + {0xFE5C, U"\U0000007D"}, + {0xFE5D, U"\U00003014"}, + {0xFE5E, U"\U00003015"}, + {0xFE5F, U"\U00000023"}, + {0xFE60, U"\U00000026"}, + {0xFE61, U"\U0000002A"}, + {0xFE62, U"\U0000002B"}, + {0xFE63, U"\U0000002D"}, + {0xFE64, U"\U0000003C"}, + {0xFE65, U"\U0000003E"}, + {0xFE66, U"\U0000003D"}, + {0xFE68, U"\U0000005C"}, + {0xFE69, U"\U00000024"}, + {0xFE6A, U"\U00000025"}, + {0xFE6B, U"\U00000040"}, + {0xFE70, U"\U00000020\U0000064B"}, + {0xFE71, U"\U00000640\U0000064B"}, + {0xFE72, U"\U00000020\U0000064C"}, + {0xFE74, U"\U00000020\U0000064D"}, + {0xFE76, U"\U00000020\U0000064E"}, + {0xFE77, U"\U00000640\U0000064E"}, + {0xFE78, U"\U00000020\U0000064F"}, + {0xFE79, U"\U00000640\U0000064F"}, + {0xFE7A, U"\U00000020\U00000650"}, + {0xFE7B, U"\U00000640\U00000650"}, + {0xFE7C, U"\U00000020\U00000651"}, + {0xFE7D, U"\U00000640\U00000651"}, + {0xFE7E, U"\U00000020\U00000652"}, + {0xFE7F, U"\U00000640\U00000652"}, + {0xFE80, U"\U00000621"}, + {0xFE81, U"\U00000622"}, + {0xFE82, U"\U00000622"}, + {0xFE83, U"\U00000623"}, + {0xFE84, U"\U00000623"}, + {0xFE85, U"\U00000624"}, + {0xFE86, U"\U00000624"}, + {0xFE87, U"\U00000625"}, + {0xFE88, U"\U00000625"}, + {0xFE89, U"\U00000626"}, + {0xFE8A, U"\U00000626"}, + {0xFE8B, U"\U00000626"}, + {0xFE8C, U"\U00000626"}, + {0xFE8D, U"\U00000627"}, + {0xFE8E, U"\U00000627"}, + {0xFE8F, U"\U00000628"}, + {0xFE90, U"\U00000628"}, + {0xFE91, U"\U00000628"}, + {0xFE92, U"\U00000628"}, + {0xFE93, U"\U00000629"}, + {0xFE94, U"\U00000629"}, + {0xFE95, U"\U0000062A"}, + {0xFE96, U"\U0000062A"}, + {0xFE97, U"\U0000062A"}, + {0xFE98, U"\U0000062A"}, + {0xFE99, U"\U0000062B"}, + {0xFE9A, U"\U0000062B"}, + {0xFE9B, U"\U0000062B"}, + {0xFE9C, U"\U0000062B"}, + {0xFE9D, U"\U0000062C"}, + {0xFE9E, U"\U0000062C"}, + {0xFE9F, U"\U0000062C"}, + {0xFEA0, U"\U0000062C"}, + {0xFEA1, U"\U0000062D"}, + {0xFEA2, U"\U0000062D"}, + {0xFEA3, U"\U0000062D"}, + {0xFEA4, U"\U0000062D"}, + {0xFEA5, U"\U0000062E"}, + {0xFEA6, U"\U0000062E"}, + {0xFEA7, U"\U0000062E"}, + {0xFEA8, U"\U0000062E"}, + {0xFEA9, U"\U0000062F"}, + {0xFEAA, U"\U0000062F"}, + {0xFEAB, U"\U00000630"}, + {0xFEAC, U"\U00000630"}, + {0xFEAD, U"\U00000631"}, + {0xFEAE, U"\U00000631"}, + {0xFEAF, U"\U00000632"}, + {0xFEB0, U"\U00000632"}, + {0xFEB1, U"\U00000633"}, + {0xFEB2, U"\U00000633"}, + {0xFEB3, U"\U00000633"}, + {0xFEB4, U"\U00000633"}, + {0xFEB5, U"\U00000634"}, + {0xFEB6, U"\U00000634"}, + {0xFEB7, U"\U00000634"}, + {0xFEB8, U"\U00000634"}, + {0xFEB9, U"\U00000635"}, + {0xFEBA, U"\U00000635"}, + {0xFEBB, U"\U00000635"}, + {0xFEBC, U"\U00000635"}, + {0xFEBD, U"\U00000636"}, + {0xFEBE, U"\U00000636"}, + {0xFEBF, U"\U00000636"}, + {0xFEC0, U"\U00000636"}, + {0xFEC1, U"\U00000637"}, + {0xFEC2, U"\U00000637"}, + {0xFEC3, U"\U00000637"}, + {0xFEC4, U"\U00000637"}, + {0xFEC5, U"\U00000638"}, + {0xFEC6, U"\U00000638"}, + {0xFEC7, U"\U00000638"}, + {0xFEC8, U"\U00000638"}, + {0xFEC9, U"\U00000639"}, + {0xFECA, U"\U00000639"}, + {0xFECB, U"\U00000639"}, + {0xFECC, U"\U00000639"}, + {0xFECD, U"\U0000063A"}, + {0xFECE, U"\U0000063A"}, + {0xFECF, U"\U0000063A"}, + {0xFED0, U"\U0000063A"}, + {0xFED1, U"\U00000641"}, + {0xFED2, U"\U00000641"}, + {0xFED3, U"\U00000641"}, + {0xFED4, U"\U00000641"}, + {0xFED5, U"\U00000642"}, + {0xFED6, U"\U00000642"}, + {0xFED7, U"\U00000642"}, + {0xFED8, U"\U00000642"}, + {0xFED9, U"\U00000643"}, + {0xFEDA, U"\U00000643"}, + {0xFEDB, U"\U00000643"}, + {0xFEDC, U"\U00000643"}, + {0xFEDD, U"\U00000644"}, + {0xFEDE, U"\U00000644"}, + {0xFEDF, U"\U00000644"}, + {0xFEE0, U"\U00000644"}, + {0xFEE1, U"\U00000645"}, + {0xFEE2, U"\U00000645"}, + {0xFEE3, U"\U00000645"}, + {0xFEE4, U"\U00000645"}, + {0xFEE5, U"\U00000646"}, + {0xFEE6, U"\U00000646"}, + {0xFEE7, U"\U00000646"}, + {0xFEE8, U"\U00000646"}, + {0xFEE9, U"\U00000647"}, + {0xFEEA, U"\U00000647"}, + {0xFEEB, U"\U00000647"}, + {0xFEEC, U"\U00000647"}, + {0xFEED, U"\U00000648"}, + {0xFEEE, U"\U00000648"}, + {0xFEEF, U"\U00000649"}, + {0xFEF0, U"\U00000649"}, + {0xFEF1, U"\U0000064A"}, + {0xFEF2, U"\U0000064A"}, + {0xFEF3, U"\U0000064A"}, + {0xFEF4, U"\U0000064A"}, + {0xFEF5, U"\U00000644\U00000622"}, + {0xFEF6, U"\U00000644\U00000622"}, + {0xFEF7, U"\U00000644\U00000623"}, + {0xFEF8, U"\U00000644\U00000623"}, + {0xFEF9, U"\U00000644\U00000625"}, + {0xFEFA, U"\U00000644\U00000625"}, + {0xFEFB, U"\U00000644\U00000627"}, + {0xFEFC, U"\U00000644\U00000627"}, + {0xFF01, U"\U00000021"}, + {0xFF02, U"\U00000022"}, + {0xFF03, U"\U00000023"}, + {0xFF04, U"\U00000024"}, + {0xFF05, U"\U00000025"}, + {0xFF06, U"\U00000026"}, + {0xFF07, U"\U00000027"}, + {0xFF08, U"\U00000028"}, + {0xFF09, U"\U00000029"}, + {0xFF0A, U"\U0000002A"}, + {0xFF0B, U"\U0000002B"}, + {0xFF0C, U"\U0000002C"}, + {0xFF0D, U"\U0000002D"}, + {0xFF0E, U"\U0000002E"}, + {0xFF0F, U"\U0000002F"}, + {0xFF10, U"\U00000030"}, + {0xFF11, U"\U00000031"}, + {0xFF12, U"\U00000032"}, + {0xFF13, U"\U00000033"}, + {0xFF14, U"\U00000034"}, + {0xFF15, U"\U00000035"}, + {0xFF16, U"\U00000036"}, + {0xFF17, U"\U00000037"}, + {0xFF18, U"\U00000038"}, + {0xFF19, U"\U00000039"}, + {0xFF1A, U"\U0000003A"}, + {0xFF1B, U"\U0000003B"}, + {0xFF1C, U"\U0000003C"}, + {0xFF1D, U"\U0000003D"}, + {0xFF1E, U"\U0000003E"}, + {0xFF1F, U"\U0000003F"}, + {0xFF20, U"\U00000040"}, + {0xFF21, U"\U00000041"}, + {0xFF22, U"\U00000042"}, + {0xFF23, U"\U00000043"}, + {0xFF24, U"\U00000044"}, + {0xFF25, U"\U00000045"}, + {0xFF26, U"\U00000046"}, + {0xFF27, U"\U00000047"}, + {0xFF28, U"\U00000048"}, + {0xFF29, U"\U00000049"}, + {0xFF2A, U"\U0000004A"}, + {0xFF2B, U"\U0000004B"}, + {0xFF2C, U"\U0000004C"}, + {0xFF2D, U"\U0000004D"}, + {0xFF2E, U"\U0000004E"}, + {0xFF2F, U"\U0000004F"}, + {0xFF30, U"\U00000050"}, + {0xFF31, U"\U00000051"}, + {0xFF32, U"\U00000052"}, + {0xFF33, U"\U00000053"}, + {0xFF34, U"\U00000054"}, + {0xFF35, U"\U00000055"}, + {0xFF36, U"\U00000056"}, + {0xFF37, U"\U00000057"}, + {0xFF38, U"\U00000058"}, + {0xFF39, U"\U00000059"}, + {0xFF3A, U"\U0000005A"}, + {0xFF3B, U"\U0000005B"}, + {0xFF3C, U"\U0000005C"}, + {0xFF3D, U"\U0000005D"}, + {0xFF3E, U"\U0000005E"}, + {0xFF3F, U"\U0000005F"}, + {0xFF40, U"\U00000060"}, + {0xFF41, U"\U00000061"}, + {0xFF42, U"\U00000062"}, + {0xFF43, U"\U00000063"}, + {0xFF44, U"\U00000064"}, + {0xFF45, U"\U00000065"}, + {0xFF46, U"\U00000066"}, + {0xFF47, U"\U00000067"}, + {0xFF48, U"\U00000068"}, + {0xFF49, U"\U00000069"}, + {0xFF4A, U"\U0000006A"}, + {0xFF4B, U"\U0000006B"}, + {0xFF4C, U"\U0000006C"}, + {0xFF4D, U"\U0000006D"}, + {0xFF4E, U"\U0000006E"}, + {0xFF4F, U"\U0000006F"}, + {0xFF50, U"\U00000070"}, + {0xFF51, U"\U00000071"}, + {0xFF52, U"\U00000072"}, + {0xFF53, U"\U00000073"}, + {0xFF54, U"\U00000074"}, + {0xFF55, U"\U00000075"}, + {0xFF56, U"\U00000076"}, + {0xFF57, U"\U00000077"}, + {0xFF58, U"\U00000078"}, + {0xFF59, U"\U00000079"}, + {0xFF5A, U"\U0000007A"}, + {0xFF5B, U"\U0000007B"}, + {0xFF5C, U"\U0000007C"}, + {0xFF5D, U"\U0000007D"}, + {0xFF5E, U"\U0000007E"}, + {0xFF5F, U"\U00002985"}, + {0xFF60, U"\U00002986"}, + {0xFF61, U"\U00003002"}, + {0xFF62, U"\U0000300C"}, + {0xFF63, U"\U0000300D"}, + {0xFF64, U"\U00003001"}, + {0xFF65, U"\U000030FB"}, + {0xFF66, U"\U000030F2"}, + {0xFF67, U"\U000030A1"}, + {0xFF68, U"\U000030A3"}, + {0xFF69, U"\U000030A5"}, + {0xFF6A, U"\U000030A7"}, + {0xFF6B, U"\U000030A9"}, + {0xFF6C, U"\U000030E3"}, + {0xFF6D, U"\U000030E5"}, + {0xFF6E, U"\U000030E7"}, + {0xFF6F, U"\U000030C3"}, + {0xFF70, U"\U000030FC"}, + {0xFF71, U"\U000030A2"}, + {0xFF72, U"\U000030A4"}, + {0xFF73, U"\U000030A6"}, + {0xFF74, U"\U000030A8"}, + {0xFF75, U"\U000030AA"}, + {0xFF76, U"\U000030AB"}, + {0xFF77, U"\U000030AD"}, + {0xFF78, U"\U000030AF"}, + {0xFF79, U"\U000030B1"}, + {0xFF7A, U"\U000030B3"}, + {0xFF7B, U"\U000030B5"}, + {0xFF7C, U"\U000030B7"}, + {0xFF7D, U"\U000030B9"}, + {0xFF7E, U"\U000030BB"}, + {0xFF7F, U"\U000030BD"}, + {0xFF80, U"\U000030BF"}, + {0xFF81, U"\U000030C1"}, + {0xFF82, U"\U000030C4"}, + {0xFF83, U"\U000030C6"}, + {0xFF84, U"\U000030C8"}, + {0xFF85, U"\U000030CA"}, + {0xFF86, U"\U000030CB"}, + {0xFF87, U"\U000030CC"}, + {0xFF88, U"\U000030CD"}, + {0xFF89, U"\U000030CE"}, + {0xFF8A, U"\U000030CF"}, + {0xFF8B, U"\U000030D2"}, + {0xFF8C, U"\U000030D5"}, + {0xFF8D, U"\U000030D8"}, + {0xFF8E, U"\U000030DB"}, + {0xFF8F, U"\U000030DE"}, + {0xFF90, U"\U000030DF"}, + {0xFF91, U"\U000030E0"}, + {0xFF92, U"\U000030E1"}, + {0xFF93, U"\U000030E2"}, + {0xFF94, U"\U000030E4"}, + {0xFF95, U"\U000030E6"}, + {0xFF96, U"\U000030E8"}, + {0xFF97, U"\U000030E9"}, + {0xFF98, U"\U000030EA"}, + {0xFF99, U"\U000030EB"}, + {0xFF9A, U"\U000030EC"}, + {0xFF9B, U"\U000030ED"}, + {0xFF9C, U"\U000030EF"}, + {0xFF9D, U"\U000030F3"}, + {0xFF9E, U"\U00003099"}, + {0xFF9F, U"\U0000309A"}, + {0xFFA0, U"\U00001160"}, + {0xFFA1, U"\U00001100"}, + {0xFFA2, U"\U00001101"}, + {0xFFA3, U"\U000011AA"}, + {0xFFA4, U"\U00001102"}, + {0xFFA5, U"\U000011AC"}, + {0xFFA6, U"\U000011AD"}, + {0xFFA7, U"\U00001103"}, + {0xFFA8, U"\U00001104"}, + {0xFFA9, U"\U00001105"}, + {0xFFAA, U"\U000011B0"}, + {0xFFAB, U"\U000011B1"}, + {0xFFAC, U"\U000011B2"}, + {0xFFAD, U"\U000011B3"}, + {0xFFAE, U"\U000011B4"}, + {0xFFAF, U"\U000011B5"}, + {0xFFB0, U"\U0000111A"}, + {0xFFB1, U"\U00001106"}, + {0xFFB2, U"\U00001107"}, + {0xFFB3, U"\U00001108"}, + {0xFFB4, U"\U00001121"}, + {0xFFB5, U"\U00001109"}, + {0xFFB6, U"\U0000110A"}, + {0xFFB7, U"\U0000110B"}, + {0xFFB8, U"\U0000110C"}, + {0xFFB9, U"\U0000110D"}, + {0xFFBA, U"\U0000110E"}, + {0xFFBB, U"\U0000110F"}, + {0xFFBC, U"\U00001110"}, + {0xFFBD, U"\U00001111"}, + {0xFFBE, U"\U00001112"}, + {0xFFC2, U"\U00001161"}, + {0xFFC3, U"\U00001162"}, + {0xFFC4, U"\U00001163"}, + {0xFFC5, U"\U00001164"}, + {0xFFC6, U"\U00001165"}, + {0xFFC7, U"\U00001166"}, + {0xFFCA, U"\U00001167"}, + {0xFFCB, U"\U00001168"}, + {0xFFCC, U"\U00001169"}, + {0xFFCD, U"\U0000116A"}, + {0xFFCE, U"\U0000116B"}, + {0xFFCF, U"\U0000116C"}, + {0xFFD2, U"\U0000116D"}, + {0xFFD3, U"\U0000116E"}, + {0xFFD4, U"\U0000116F"}, + {0xFFD5, U"\U00001170"}, + {0xFFD6, U"\U00001171"}, + {0xFFD7, U"\U00001172"}, + {0xFFDA, U"\U00001173"}, + {0xFFDB, U"\U00001174"}, + {0xFFDC, U"\U00001175"}, + {0xFFE0, U"\U000000A2"}, + {0xFFE1, U"\U000000A3"}, + {0xFFE2, U"\U000000AC"}, + {0xFFE3, U"\U00000020\U00000304"}, + {0xFFE4, U"\U000000A6"}, + {0xFFE5, U"\U000000A5"}, + {0xFFE6, U"\U000020A9"}, + {0xFFE8, U"\U00002502"}, + {0xFFE9, U"\U00002190"}, + {0xFFEA, U"\U00002191"}, + {0xFFEB, U"\U00002192"}, + {0xFFEC, U"\U00002193"}, + {0xFFED, U"\U000025A0"}, + {0xFFEE, U"\U000025CB"}, + {0x10781, U"\U000002D0"}, + {0x10782, U"\U000002D1"}, + {0x10783, U"\U000000E6"}, + {0x10784, U"\U00000299"}, + {0x10785, U"\U00000253"}, + {0x10787, U"\U000002A3"}, + {0x10788, U"\U0000AB66"}, + {0x10789, U"\U000002A5"}, + {0x1078A, U"\U000002A4"}, + {0x1078B, U"\U00000256"}, + {0x1078C, U"\U00000257"}, + {0x1078D, U"\U00001D91"}, + {0x1078E, U"\U00000258"}, + {0x1078F, U"\U0000025E"}, + {0x10790, U"\U000002A9"}, + {0x10791, U"\U00000264"}, + {0x10792, U"\U00000262"}, + {0x10793, U"\U00000260"}, + {0x10794, U"\U0000029B"}, + {0x10795, U"\U00000127"}, + {0x10796, U"\U0000029C"}, + {0x10797, U"\U00000267"}, + {0x10798, U"\U00000284"}, + {0x10799, U"\U000002AA"}, + {0x1079A, U"\U000002AB"}, + {0x1079B, U"\U0000026C"}, + {0x1079C, U"\U0001DF04"}, + {0x1079D, U"\U0000A78E"}, + {0x1079E, U"\U0000026E"}, + {0x1079F, U"\U0001DF05"}, + {0x107A0, U"\U0000028E"}, + {0x107A1, U"\U0001DF06"}, + {0x107A2, U"\U000000F8"}, + {0x107A3, U"\U00000276"}, + {0x107A4, U"\U00000277"}, + {0x107A5, U"\U00000071"}, + {0x107A6, U"\U0000027A"}, + {0x107A7, U"\U0001DF08"}, + {0x107A8, U"\U0000027D"}, + {0x107A9, U"\U0000027E"}, + {0x107AA, U"\U00000280"}, + {0x107AB, U"\U000002A8"}, + {0x107AC, U"\U000002A6"}, + {0x107AD, U"\U0000AB67"}, + {0x107AE, U"\U000002A7"}, + {0x107AF, U"\U00000288"}, + {0x107B0, U"\U00002C71"}, + {0x107B2, U"\U0000028F"}, + {0x107B3, U"\U000002A1"}, + {0x107B4, U"\U000002A2"}, + {0x107B5, U"\U00000298"}, + {0x107B6, U"\U000001C0"}, + {0x107B7, U"\U000001C1"}, + {0x107B8, U"\U000001C2"}, + {0x107B9, U"\U0001DF0A"}, + {0x107BA, U"\U0001DF1E"}, + {0x1D15E, U"\U0001D157\U0001D165"}, + {0x1D15F, U"\U0001D158\U0001D165"}, + {0x1D160, U"\U0001D158\U0001D165\U0001D16E"}, + {0x1D161, U"\U0001D158\U0001D165\U0001D16F"}, + {0x1D162, U"\U0001D158\U0001D165\U0001D170"}, + {0x1D163, U"\U0001D158\U0001D165\U0001D171"}, + {0x1D164, U"\U0001D158\U0001D165\U0001D172"}, + {0x1D1BB, U"\U0001D1B9\U0001D165"}, + {0x1D1BC, U"\U0001D1BA\U0001D165"}, + {0x1D1BD, U"\U0001D1B9\U0001D165\U0001D16E"}, + {0x1D1BE, U"\U0001D1BA\U0001D165\U0001D16E"}, + {0x1D1BF, U"\U0001D1B9\U0001D165\U0001D16F"}, + {0x1D1C0, U"\U0001D1BA\U0001D165\U0001D16F"}, + {0x1D400, U"\U00000041"}, + {0x1D401, U"\U00000042"}, + {0x1D402, U"\U00000043"}, + {0x1D403, U"\U00000044"}, + {0x1D404, U"\U00000045"}, + {0x1D405, U"\U00000046"}, + {0x1D406, U"\U00000047"}, + {0x1D407, U"\U00000048"}, + {0x1D408, U"\U00000049"}, + {0x1D409, U"\U0000004A"}, + {0x1D40A, U"\U0000004B"}, + {0x1D40B, U"\U0000004C"}, + {0x1D40C, U"\U0000004D"}, + {0x1D40D, U"\U0000004E"}, + {0x1D40E, U"\U0000004F"}, + {0x1D40F, U"\U00000050"}, + {0x1D410, U"\U00000051"}, + {0x1D411, U"\U00000052"}, + {0x1D412, U"\U00000053"}, + {0x1D413, U"\U00000054"}, + {0x1D414, U"\U00000055"}, + {0x1D415, U"\U00000056"}, + {0x1D416, U"\U00000057"}, + {0x1D417, U"\U00000058"}, + {0x1D418, U"\U00000059"}, + {0x1D419, U"\U0000005A"}, + {0x1D41A, U"\U00000061"}, + {0x1D41B, U"\U00000062"}, + {0x1D41C, U"\U00000063"}, + {0x1D41D, U"\U00000064"}, + {0x1D41E, U"\U00000065"}, + {0x1D41F, U"\U00000066"}, + {0x1D420, U"\U00000067"}, + {0x1D421, U"\U00000068"}, + {0x1D422, U"\U00000069"}, + {0x1D423, U"\U0000006A"}, + {0x1D424, U"\U0000006B"}, + {0x1D425, U"\U0000006C"}, + {0x1D426, U"\U0000006D"}, + {0x1D427, U"\U0000006E"}, + {0x1D428, U"\U0000006F"}, + {0x1D429, U"\U00000070"}, + {0x1D42A, U"\U00000071"}, + {0x1D42B, U"\U00000072"}, + {0x1D42C, U"\U00000073"}, + {0x1D42D, U"\U00000074"}, + {0x1D42E, U"\U00000075"}, + {0x1D42F, U"\U00000076"}, + {0x1D430, U"\U00000077"}, + {0x1D431, U"\U00000078"}, + {0x1D432, U"\U00000079"}, + {0x1D433, U"\U0000007A"}, + {0x1D434, U"\U00000041"}, + {0x1D435, U"\U00000042"}, + {0x1D436, U"\U00000043"}, + {0x1D437, U"\U00000044"}, + {0x1D438, U"\U00000045"}, + {0x1D439, U"\U00000046"}, + {0x1D43A, U"\U00000047"}, + {0x1D43B, U"\U00000048"}, + {0x1D43C, U"\U00000049"}, + {0x1D43D, U"\U0000004A"}, + {0x1D43E, U"\U0000004B"}, + {0x1D43F, U"\U0000004C"}, + {0x1D440, U"\U0000004D"}, + {0x1D441, U"\U0000004E"}, + {0x1D442, U"\U0000004F"}, + {0x1D443, U"\U00000050"}, + {0x1D444, U"\U00000051"}, + {0x1D445, U"\U00000052"}, + {0x1D446, U"\U00000053"}, + {0x1D447, U"\U00000054"}, + {0x1D448, U"\U00000055"}, + {0x1D449, U"\U00000056"}, + {0x1D44A, U"\U00000057"}, + {0x1D44B, U"\U00000058"}, + {0x1D44C, U"\U00000059"}, + {0x1D44D, U"\U0000005A"}, + {0x1D44E, U"\U00000061"}, + {0x1D44F, U"\U00000062"}, + {0x1D450, U"\U00000063"}, + {0x1D451, U"\U00000064"}, + {0x1D452, U"\U00000065"}, + {0x1D453, U"\U00000066"}, + {0x1D454, U"\U00000067"}, + {0x1D456, U"\U00000069"}, + {0x1D457, U"\U0000006A"}, + {0x1D458, U"\U0000006B"}, + {0x1D459, U"\U0000006C"}, + {0x1D45A, U"\U0000006D"}, + {0x1D45B, U"\U0000006E"}, + {0x1D45C, U"\U0000006F"}, + {0x1D45D, U"\U00000070"}, + {0x1D45E, U"\U00000071"}, + {0x1D45F, U"\U00000072"}, + {0x1D460, U"\U00000073"}, + {0x1D461, U"\U00000074"}, + {0x1D462, U"\U00000075"}, + {0x1D463, U"\U00000076"}, + {0x1D464, U"\U00000077"}, + {0x1D465, U"\U00000078"}, + {0x1D466, U"\U00000079"}, + {0x1D467, U"\U0000007A"}, + {0x1D468, U"\U00000041"}, + {0x1D469, U"\U00000042"}, + {0x1D46A, U"\U00000043"}, + {0x1D46B, U"\U00000044"}, + {0x1D46C, U"\U00000045"}, + {0x1D46D, U"\U00000046"}, + {0x1D46E, U"\U00000047"}, + {0x1D46F, U"\U00000048"}, + {0x1D470, U"\U00000049"}, + {0x1D471, U"\U0000004A"}, + {0x1D472, U"\U0000004B"}, + {0x1D473, U"\U0000004C"}, + {0x1D474, U"\U0000004D"}, + {0x1D475, U"\U0000004E"}, + {0x1D476, U"\U0000004F"}, + {0x1D477, U"\U00000050"}, + {0x1D478, U"\U00000051"}, + {0x1D479, U"\U00000052"}, + {0x1D47A, U"\U00000053"}, + {0x1D47B, U"\U00000054"}, + {0x1D47C, U"\U00000055"}, + {0x1D47D, U"\U00000056"}, + {0x1D47E, U"\U00000057"}, + {0x1D47F, U"\U00000058"}, + {0x1D480, U"\U00000059"}, + {0x1D481, U"\U0000005A"}, + {0x1D482, U"\U00000061"}, + {0x1D483, U"\U00000062"}, + {0x1D484, U"\U00000063"}, + {0x1D485, U"\U00000064"}, + {0x1D486, U"\U00000065"}, + {0x1D487, U"\U00000066"}, + {0x1D488, U"\U00000067"}, + {0x1D489, U"\U00000068"}, + {0x1D48A, U"\U00000069"}, + {0x1D48B, U"\U0000006A"}, + {0x1D48C, U"\U0000006B"}, + {0x1D48D, U"\U0000006C"}, + {0x1D48E, U"\U0000006D"}, + {0x1D48F, U"\U0000006E"}, + {0x1D490, U"\U0000006F"}, + {0x1D491, U"\U00000070"}, + {0x1D492, U"\U00000071"}, + {0x1D493, U"\U00000072"}, + {0x1D494, U"\U00000073"}, + {0x1D495, U"\U00000074"}, + {0x1D496, U"\U00000075"}, + {0x1D497, U"\U00000076"}, + {0x1D498, U"\U00000077"}, + {0x1D499, U"\U00000078"}, + {0x1D49A, U"\U00000079"}, + {0x1D49B, U"\U0000007A"}, + {0x1D49C, U"\U00000041"}, + {0x1D49E, U"\U00000043"}, + {0x1D49F, U"\U00000044"}, + {0x1D4A2, U"\U00000047"}, + {0x1D4A5, U"\U0000004A"}, + {0x1D4A6, U"\U0000004B"}, + {0x1D4A9, U"\U0000004E"}, + {0x1D4AA, U"\U0000004F"}, + {0x1D4AB, U"\U00000050"}, + {0x1D4AC, U"\U00000051"}, + {0x1D4AE, U"\U00000053"}, + {0x1D4AF, U"\U00000054"}, + {0x1D4B0, U"\U00000055"}, + {0x1D4B1, U"\U00000056"}, + {0x1D4B2, U"\U00000057"}, + {0x1D4B3, U"\U00000058"}, + {0x1D4B4, U"\U00000059"}, + {0x1D4B5, U"\U0000005A"}, + {0x1D4B6, U"\U00000061"}, + {0x1D4B7, U"\U00000062"}, + {0x1D4B8, U"\U00000063"}, + {0x1D4B9, U"\U00000064"}, + {0x1D4BB, U"\U00000066"}, + {0x1D4BD, U"\U00000068"}, + {0x1D4BE, U"\U00000069"}, + {0x1D4BF, U"\U0000006A"}, + {0x1D4C0, U"\U0000006B"}, + {0x1D4C1, U"\U0000006C"}, + {0x1D4C2, U"\U0000006D"}, + {0x1D4C3, U"\U0000006E"}, + {0x1D4C5, U"\U00000070"}, + {0x1D4C6, U"\U00000071"}, + {0x1D4C7, U"\U00000072"}, + {0x1D4C8, U"\U00000073"}, + {0x1D4C9, U"\U00000074"}, + {0x1D4CA, U"\U00000075"}, + {0x1D4CB, U"\U00000076"}, + {0x1D4CC, U"\U00000077"}, + {0x1D4CD, U"\U00000078"}, + {0x1D4CE, U"\U00000079"}, + {0x1D4CF, U"\U0000007A"}, + {0x1D4D0, U"\U00000041"}, + {0x1D4D1, U"\U00000042"}, + {0x1D4D2, U"\U00000043"}, + {0x1D4D3, U"\U00000044"}, + {0x1D4D4, U"\U00000045"}, + {0x1D4D5, U"\U00000046"}, + {0x1D4D6, U"\U00000047"}, + {0x1D4D7, U"\U00000048"}, + {0x1D4D8, U"\U00000049"}, + {0x1D4D9, U"\U0000004A"}, + {0x1D4DA, U"\U0000004B"}, + {0x1D4DB, U"\U0000004C"}, + {0x1D4DC, U"\U0000004D"}, + {0x1D4DD, U"\U0000004E"}, + {0x1D4DE, U"\U0000004F"}, + {0x1D4DF, U"\U00000050"}, + {0x1D4E0, U"\U00000051"}, + {0x1D4E1, U"\U00000052"}, + {0x1D4E2, U"\U00000053"}, + {0x1D4E3, U"\U00000054"}, + {0x1D4E4, U"\U00000055"}, + {0x1D4E5, U"\U00000056"}, + {0x1D4E6, U"\U00000057"}, + {0x1D4E7, U"\U00000058"}, + {0x1D4E8, U"\U00000059"}, + {0x1D4E9, U"\U0000005A"}, + {0x1D4EA, U"\U00000061"}, + {0x1D4EB, U"\U00000062"}, + {0x1D4EC, U"\U00000063"}, + {0x1D4ED, U"\U00000064"}, + {0x1D4EE, U"\U00000065"}, + {0x1D4EF, U"\U00000066"}, + {0x1D4F0, U"\U00000067"}, + {0x1D4F1, U"\U00000068"}, + {0x1D4F2, U"\U00000069"}, + {0x1D4F3, U"\U0000006A"}, + {0x1D4F4, U"\U0000006B"}, + {0x1D4F5, U"\U0000006C"}, + {0x1D4F6, U"\U0000006D"}, + {0x1D4F7, U"\U0000006E"}, + {0x1D4F8, U"\U0000006F"}, + {0x1D4F9, U"\U00000070"}, + {0x1D4FA, U"\U00000071"}, + {0x1D4FB, U"\U00000072"}, + {0x1D4FC, U"\U00000073"}, + {0x1D4FD, U"\U00000074"}, + {0x1D4FE, U"\U00000075"}, + {0x1D4FF, U"\U00000076"}, + {0x1D500, U"\U00000077"}, + {0x1D501, U"\U00000078"}, + {0x1D502, U"\U00000079"}, + {0x1D503, U"\U0000007A"}, + {0x1D504, U"\U00000041"}, + {0x1D505, U"\U00000042"}, + {0x1D507, U"\U00000044"}, + {0x1D508, U"\U00000045"}, + {0x1D509, U"\U00000046"}, + {0x1D50A, U"\U00000047"}, + {0x1D50D, U"\U0000004A"}, + {0x1D50E, U"\U0000004B"}, + {0x1D50F, U"\U0000004C"}, + {0x1D510, U"\U0000004D"}, + {0x1D511, U"\U0000004E"}, + {0x1D512, U"\U0000004F"}, + {0x1D513, U"\U00000050"}, + {0x1D514, U"\U00000051"}, + {0x1D516, U"\U00000053"}, + {0x1D517, U"\U00000054"}, + {0x1D518, U"\U00000055"}, + {0x1D519, U"\U00000056"}, + {0x1D51A, U"\U00000057"}, + {0x1D51B, U"\U00000058"}, + {0x1D51C, U"\U00000059"}, + {0x1D51E, U"\U00000061"}, + {0x1D51F, U"\U00000062"}, + {0x1D520, U"\U00000063"}, + {0x1D521, U"\U00000064"}, + {0x1D522, U"\U00000065"}, + {0x1D523, U"\U00000066"}, + {0x1D524, U"\U00000067"}, + {0x1D525, U"\U00000068"}, + {0x1D526, U"\U00000069"}, + {0x1D527, U"\U0000006A"}, + {0x1D528, U"\U0000006B"}, + {0x1D529, U"\U0000006C"}, + {0x1D52A, U"\U0000006D"}, + {0x1D52B, U"\U0000006E"}, + {0x1D52C, U"\U0000006F"}, + {0x1D52D, U"\U00000070"}, + {0x1D52E, U"\U00000071"}, + {0x1D52F, U"\U00000072"}, + {0x1D530, U"\U00000073"}, + {0x1D531, U"\U00000074"}, + {0x1D532, U"\U00000075"}, + {0x1D533, U"\U00000076"}, + {0x1D534, U"\U00000077"}, + {0x1D535, U"\U00000078"}, + {0x1D536, U"\U00000079"}, + {0x1D537, U"\U0000007A"}, + {0x1D538, U"\U00000041"}, + {0x1D539, U"\U00000042"}, + {0x1D53B, U"\U00000044"}, + {0x1D53C, U"\U00000045"}, + {0x1D53D, U"\U00000046"}, + {0x1D53E, U"\U00000047"}, + {0x1D540, U"\U00000049"}, + {0x1D541, U"\U0000004A"}, + {0x1D542, U"\U0000004B"}, + {0x1D543, U"\U0000004C"}, + {0x1D544, U"\U0000004D"}, + {0x1D546, U"\U0000004F"}, + {0x1D54A, U"\U00000053"}, + {0x1D54B, U"\U00000054"}, + {0x1D54C, U"\U00000055"}, + {0x1D54D, U"\U00000056"}, + {0x1D54E, U"\U00000057"}, + {0x1D54F, U"\U00000058"}, + {0x1D550, U"\U00000059"}, + {0x1D552, U"\U00000061"}, + {0x1D553, U"\U00000062"}, + {0x1D554, U"\U00000063"}, + {0x1D555, U"\U00000064"}, + {0x1D556, U"\U00000065"}, + {0x1D557, U"\U00000066"}, + {0x1D558, U"\U00000067"}, + {0x1D559, U"\U00000068"}, + {0x1D55A, U"\U00000069"}, + {0x1D55B, U"\U0000006A"}, + {0x1D55C, U"\U0000006B"}, + {0x1D55D, U"\U0000006C"}, + {0x1D55E, U"\U0000006D"}, + {0x1D55F, U"\U0000006E"}, + {0x1D560, U"\U0000006F"}, + {0x1D561, U"\U00000070"}, + {0x1D562, U"\U00000071"}, + {0x1D563, U"\U00000072"}, + {0x1D564, U"\U00000073"}, + {0x1D565, U"\U00000074"}, + {0x1D566, U"\U00000075"}, + {0x1D567, U"\U00000076"}, + {0x1D568, U"\U00000077"}, + {0x1D569, U"\U00000078"}, + {0x1D56A, U"\U00000079"}, + {0x1D56B, U"\U0000007A"}, + {0x1D56C, U"\U00000041"}, + {0x1D56D, U"\U00000042"}, + {0x1D56E, U"\U00000043"}, + {0x1D56F, U"\U00000044"}, + {0x1D570, U"\U00000045"}, + {0x1D571, U"\U00000046"}, + {0x1D572, U"\U00000047"}, + {0x1D573, U"\U00000048"}, + {0x1D574, U"\U00000049"}, + {0x1D575, U"\U0000004A"}, + {0x1D576, U"\U0000004B"}, + {0x1D577, U"\U0000004C"}, + {0x1D578, U"\U0000004D"}, + {0x1D579, U"\U0000004E"}, + {0x1D57A, U"\U0000004F"}, + {0x1D57B, U"\U00000050"}, + {0x1D57C, U"\U00000051"}, + {0x1D57D, U"\U00000052"}, + {0x1D57E, U"\U00000053"}, + {0x1D57F, U"\U00000054"}, + {0x1D580, U"\U00000055"}, + {0x1D581, U"\U00000056"}, + {0x1D582, U"\U00000057"}, + {0x1D583, U"\U00000058"}, + {0x1D584, U"\U00000059"}, + {0x1D585, U"\U0000005A"}, + {0x1D586, U"\U00000061"}, + {0x1D587, U"\U00000062"}, + {0x1D588, U"\U00000063"}, + {0x1D589, U"\U00000064"}, + {0x1D58A, U"\U00000065"}, + {0x1D58B, U"\U00000066"}, + {0x1D58C, U"\U00000067"}, + {0x1D58D, U"\U00000068"}, + {0x1D58E, U"\U00000069"}, + {0x1D58F, U"\U0000006A"}, + {0x1D590, U"\U0000006B"}, + {0x1D591, U"\U0000006C"}, + {0x1D592, U"\U0000006D"}, + {0x1D593, U"\U0000006E"}, + {0x1D594, U"\U0000006F"}, + {0x1D595, U"\U00000070"}, + {0x1D596, U"\U00000071"}, + {0x1D597, U"\U00000072"}, + {0x1D598, U"\U00000073"}, + {0x1D599, U"\U00000074"}, + {0x1D59A, U"\U00000075"}, + {0x1D59B, U"\U00000076"}, + {0x1D59C, U"\U00000077"}, + {0x1D59D, U"\U00000078"}, + {0x1D59E, U"\U00000079"}, + {0x1D59F, U"\U0000007A"}, + {0x1D5A0, U"\U00000041"}, + {0x1D5A1, U"\U00000042"}, + {0x1D5A2, U"\U00000043"}, + {0x1D5A3, U"\U00000044"}, + {0x1D5A4, U"\U00000045"}, + {0x1D5A5, U"\U00000046"}, + {0x1D5A6, U"\U00000047"}, + {0x1D5A7, U"\U00000048"}, + {0x1D5A8, U"\U00000049"}, + {0x1D5A9, U"\U0000004A"}, + {0x1D5AA, U"\U0000004B"}, + {0x1D5AB, U"\U0000004C"}, + {0x1D5AC, U"\U0000004D"}, + {0x1D5AD, U"\U0000004E"}, + {0x1D5AE, U"\U0000004F"}, + {0x1D5AF, U"\U00000050"}, + {0x1D5B0, U"\U00000051"}, + {0x1D5B1, U"\U00000052"}, + {0x1D5B2, U"\U00000053"}, + {0x1D5B3, U"\U00000054"}, + {0x1D5B4, U"\U00000055"}, + {0x1D5B5, U"\U00000056"}, + {0x1D5B6, U"\U00000057"}, + {0x1D5B7, U"\U00000058"}, + {0x1D5B8, U"\U00000059"}, + {0x1D5B9, U"\U0000005A"}, + {0x1D5BA, U"\U00000061"}, + {0x1D5BB, U"\U00000062"}, + {0x1D5BC, U"\U00000063"}, + {0x1D5BD, U"\U00000064"}, + {0x1D5BE, U"\U00000065"}, + {0x1D5BF, U"\U00000066"}, + {0x1D5C0, U"\U00000067"}, + {0x1D5C1, U"\U00000068"}, + {0x1D5C2, U"\U00000069"}, + {0x1D5C3, U"\U0000006A"}, + {0x1D5C4, U"\U0000006B"}, + {0x1D5C5, U"\U0000006C"}, + {0x1D5C6, U"\U0000006D"}, + {0x1D5C7, U"\U0000006E"}, + {0x1D5C8, U"\U0000006F"}, + {0x1D5C9, U"\U00000070"}, + {0x1D5CA, U"\U00000071"}, + {0x1D5CB, U"\U00000072"}, + {0x1D5CC, U"\U00000073"}, + {0x1D5CD, U"\U00000074"}, + {0x1D5CE, U"\U00000075"}, + {0x1D5CF, U"\U00000076"}, + {0x1D5D0, U"\U00000077"}, + {0x1D5D1, U"\U00000078"}, + {0x1D5D2, U"\U00000079"}, + {0x1D5D3, U"\U0000007A"}, + {0x1D5D4, U"\U00000041"}, + {0x1D5D5, U"\U00000042"}, + {0x1D5D6, U"\U00000043"}, + {0x1D5D7, U"\U00000044"}, + {0x1D5D8, U"\U00000045"}, + {0x1D5D9, U"\U00000046"}, + {0x1D5DA, U"\U00000047"}, + {0x1D5DB, U"\U00000048"}, + {0x1D5DC, U"\U00000049"}, + {0x1D5DD, U"\U0000004A"}, + {0x1D5DE, U"\U0000004B"}, + {0x1D5DF, U"\U0000004C"}, + {0x1D5E0, U"\U0000004D"}, + {0x1D5E1, U"\U0000004E"}, + {0x1D5E2, U"\U0000004F"}, + {0x1D5E3, U"\U00000050"}, + {0x1D5E4, U"\U00000051"}, + {0x1D5E5, U"\U00000052"}, + {0x1D5E6, U"\U00000053"}, + {0x1D5E7, U"\U00000054"}, + {0x1D5E8, U"\U00000055"}, + {0x1D5E9, U"\U00000056"}, + {0x1D5EA, U"\U00000057"}, + {0x1D5EB, U"\U00000058"}, + {0x1D5EC, U"\U00000059"}, + {0x1D5ED, U"\U0000005A"}, + {0x1D5EE, U"\U00000061"}, + {0x1D5EF, U"\U00000062"}, + {0x1D5F0, U"\U00000063"}, + {0x1D5F1, U"\U00000064"}, + {0x1D5F2, U"\U00000065"}, + {0x1D5F3, U"\U00000066"}, + {0x1D5F4, U"\U00000067"}, + {0x1D5F5, U"\U00000068"}, + {0x1D5F6, U"\U00000069"}, + {0x1D5F7, U"\U0000006A"}, + {0x1D5F8, U"\U0000006B"}, + {0x1D5F9, U"\U0000006C"}, + {0x1D5FA, U"\U0000006D"}, + {0x1D5FB, U"\U0000006E"}, + {0x1D5FC, U"\U0000006F"}, + {0x1D5FD, U"\U00000070"}, + {0x1D5FE, U"\U00000071"}, + {0x1D5FF, U"\U00000072"}, + {0x1D600, U"\U00000073"}, + {0x1D601, U"\U00000074"}, + {0x1D602, U"\U00000075"}, + {0x1D603, U"\U00000076"}, + {0x1D604, U"\U00000077"}, + {0x1D605, U"\U00000078"}, + {0x1D606, U"\U00000079"}, + {0x1D607, U"\U0000007A"}, + {0x1D608, U"\U00000041"}, + {0x1D609, U"\U00000042"}, + {0x1D60A, U"\U00000043"}, + {0x1D60B, U"\U00000044"}, + {0x1D60C, U"\U00000045"}, + {0x1D60D, U"\U00000046"}, + {0x1D60E, U"\U00000047"}, + {0x1D60F, U"\U00000048"}, + {0x1D610, U"\U00000049"}, + {0x1D611, U"\U0000004A"}, + {0x1D612, U"\U0000004B"}, + {0x1D613, U"\U0000004C"}, + {0x1D614, U"\U0000004D"}, + {0x1D615, U"\U0000004E"}, + {0x1D616, U"\U0000004F"}, + {0x1D617, U"\U00000050"}, + {0x1D618, U"\U00000051"}, + {0x1D619, U"\U00000052"}, + {0x1D61A, U"\U00000053"}, + {0x1D61B, U"\U00000054"}, + {0x1D61C, U"\U00000055"}, + {0x1D61D, U"\U00000056"}, + {0x1D61E, U"\U00000057"}, + {0x1D61F, U"\U00000058"}, + {0x1D620, U"\U00000059"}, + {0x1D621, U"\U0000005A"}, + {0x1D622, U"\U00000061"}, + {0x1D623, U"\U00000062"}, + {0x1D624, U"\U00000063"}, + {0x1D625, U"\U00000064"}, + {0x1D626, U"\U00000065"}, + {0x1D627, U"\U00000066"}, + {0x1D628, U"\U00000067"}, + {0x1D629, U"\U00000068"}, + {0x1D62A, U"\U00000069"}, + {0x1D62B, U"\U0000006A"}, + {0x1D62C, U"\U0000006B"}, + {0x1D62D, U"\U0000006C"}, + {0x1D62E, U"\U0000006D"}, + {0x1D62F, U"\U0000006E"}, + {0x1D630, U"\U0000006F"}, + {0x1D631, U"\U00000070"}, + {0x1D632, U"\U00000071"}, + {0x1D633, U"\U00000072"}, + {0x1D634, U"\U00000073"}, + {0x1D635, U"\U00000074"}, + {0x1D636, U"\U00000075"}, + {0x1D637, U"\U00000076"}, + {0x1D638, U"\U00000077"}, + {0x1D639, U"\U00000078"}, + {0x1D63A, U"\U00000079"}, + {0x1D63B, U"\U0000007A"}, + {0x1D63C, U"\U00000041"}, + {0x1D63D, U"\U00000042"}, + {0x1D63E, U"\U00000043"}, + {0x1D63F, U"\U00000044"}, + {0x1D640, U"\U00000045"}, + {0x1D641, U"\U00000046"}, + {0x1D642, U"\U00000047"}, + {0x1D643, U"\U00000048"}, + {0x1D644, U"\U00000049"}, + {0x1D645, U"\U0000004A"}, + {0x1D646, U"\U0000004B"}, + {0x1D647, U"\U0000004C"}, + {0x1D648, U"\U0000004D"}, + {0x1D649, U"\U0000004E"}, + {0x1D64A, U"\U0000004F"}, + {0x1D64B, U"\U00000050"}, + {0x1D64C, U"\U00000051"}, + {0x1D64D, U"\U00000052"}, + {0x1D64E, U"\U00000053"}, + {0x1D64F, U"\U00000054"}, + {0x1D650, U"\U00000055"}, + {0x1D651, U"\U00000056"}, + {0x1D652, U"\U00000057"}, + {0x1D653, U"\U00000058"}, + {0x1D654, U"\U00000059"}, + {0x1D655, U"\U0000005A"}, + {0x1D656, U"\U00000061"}, + {0x1D657, U"\U00000062"}, + {0x1D658, U"\U00000063"}, + {0x1D659, U"\U00000064"}, + {0x1D65A, U"\U00000065"}, + {0x1D65B, U"\U00000066"}, + {0x1D65C, U"\U00000067"}, + {0x1D65D, U"\U00000068"}, + {0x1D65E, U"\U00000069"}, + {0x1D65F, U"\U0000006A"}, + {0x1D660, U"\U0000006B"}, + {0x1D661, U"\U0000006C"}, + {0x1D662, U"\U0000006D"}, + {0x1D663, U"\U0000006E"}, + {0x1D664, U"\U0000006F"}, + {0x1D665, U"\U00000070"}, + {0x1D666, U"\U00000071"}, + {0x1D667, U"\U00000072"}, + {0x1D668, U"\U00000073"}, + {0x1D669, U"\U00000074"}, + {0x1D66A, U"\U00000075"}, + {0x1D66B, U"\U00000076"}, + {0x1D66C, U"\U00000077"}, + {0x1D66D, U"\U00000078"}, + {0x1D66E, U"\U00000079"}, + {0x1D66F, U"\U0000007A"}, + {0x1D670, U"\U00000041"}, + {0x1D671, U"\U00000042"}, + {0x1D672, U"\U00000043"}, + {0x1D673, U"\U00000044"}, + {0x1D674, U"\U00000045"}, + {0x1D675, U"\U00000046"}, + {0x1D676, U"\U00000047"}, + {0x1D677, U"\U00000048"}, + {0x1D678, U"\U00000049"}, + {0x1D679, U"\U0000004A"}, + {0x1D67A, U"\U0000004B"}, + {0x1D67B, U"\U0000004C"}, + {0x1D67C, U"\U0000004D"}, + {0x1D67D, U"\U0000004E"}, + {0x1D67E, U"\U0000004F"}, + {0x1D67F, U"\U00000050"}, + {0x1D680, U"\U00000051"}, + {0x1D681, U"\U00000052"}, + {0x1D682, U"\U00000053"}, + {0x1D683, U"\U00000054"}, + {0x1D684, U"\U00000055"}, + {0x1D685, U"\U00000056"}, + {0x1D686, U"\U00000057"}, + {0x1D687, U"\U00000058"}, + {0x1D688, U"\U00000059"}, + {0x1D689, U"\U0000005A"}, + {0x1D68A, U"\U00000061"}, + {0x1D68B, U"\U00000062"}, + {0x1D68C, U"\U00000063"}, + {0x1D68D, U"\U00000064"}, + {0x1D68E, U"\U00000065"}, + {0x1D68F, U"\U00000066"}, + {0x1D690, U"\U00000067"}, + {0x1D691, U"\U00000068"}, + {0x1D692, U"\U00000069"}, + {0x1D693, U"\U0000006A"}, + {0x1D694, U"\U0000006B"}, + {0x1D695, U"\U0000006C"}, + {0x1D696, U"\U0000006D"}, + {0x1D697, U"\U0000006E"}, + {0x1D698, U"\U0000006F"}, + {0x1D699, U"\U00000070"}, + {0x1D69A, U"\U00000071"}, + {0x1D69B, U"\U00000072"}, + {0x1D69C, U"\U00000073"}, + {0x1D69D, U"\U00000074"}, + {0x1D69E, U"\U00000075"}, + {0x1D69F, U"\U00000076"}, + {0x1D6A0, U"\U00000077"}, + {0x1D6A1, U"\U00000078"}, + {0x1D6A2, U"\U00000079"}, + {0x1D6A3, U"\U0000007A"}, + {0x1D6A4, U"\U00000131"}, + {0x1D6A5, U"\U00000237"}, + {0x1D6A8, U"\U00000391"}, + {0x1D6A9, U"\U00000392"}, + {0x1D6AA, U"\U00000393"}, + {0x1D6AB, U"\U00000394"}, + {0x1D6AC, U"\U00000395"}, + {0x1D6AD, U"\U00000396"}, + {0x1D6AE, U"\U00000397"}, + {0x1D6AF, U"\U00000398"}, + {0x1D6B0, U"\U00000399"}, + {0x1D6B1, U"\U0000039A"}, + {0x1D6B2, U"\U0000039B"}, + {0x1D6B3, U"\U0000039C"}, + {0x1D6B4, U"\U0000039D"}, + {0x1D6B5, U"\U0000039E"}, + {0x1D6B6, U"\U0000039F"}, + {0x1D6B7, U"\U000003A0"}, + {0x1D6B8, U"\U000003A1"}, + {0x1D6B9, U"\U00000398"}, + {0x1D6BA, U"\U000003A3"}, + {0x1D6BB, U"\U000003A4"}, + {0x1D6BC, U"\U000003A5"}, + {0x1D6BD, U"\U000003A6"}, + {0x1D6BE, U"\U000003A7"}, + {0x1D6BF, U"\U000003A8"}, + {0x1D6C0, U"\U000003A9"}, + {0x1D6C1, U"\U00002207"}, + {0x1D6C2, U"\U000003B1"}, + {0x1D6C3, U"\U000003B2"}, + {0x1D6C4, U"\U000003B3"}, + {0x1D6C5, U"\U000003B4"}, + {0x1D6C6, U"\U000003B5"}, + {0x1D6C7, U"\U000003B6"}, + {0x1D6C8, U"\U000003B7"}, + {0x1D6C9, U"\U000003B8"}, + {0x1D6CA, U"\U000003B9"}, + {0x1D6CB, U"\U000003BA"}, + {0x1D6CC, U"\U000003BB"}, + {0x1D6CD, U"\U000003BC"}, + {0x1D6CE, U"\U000003BD"}, + {0x1D6CF, U"\U000003BE"}, + {0x1D6D0, U"\U000003BF"}, + {0x1D6D1, U"\U000003C0"}, + {0x1D6D2, U"\U000003C1"}, + {0x1D6D3, U"\U000003C2"}, + {0x1D6D4, U"\U000003C3"}, + {0x1D6D5, U"\U000003C4"}, + {0x1D6D6, U"\U000003C5"}, + {0x1D6D7, U"\U000003C6"}, + {0x1D6D8, U"\U000003C7"}, + {0x1D6D9, U"\U000003C8"}, + {0x1D6DA, U"\U000003C9"}, + {0x1D6DB, U"\U00002202"}, + {0x1D6DC, U"\U000003B5"}, + {0x1D6DD, U"\U000003B8"}, + {0x1D6DE, U"\U000003BA"}, + {0x1D6DF, U"\U000003C6"}, + {0x1D6E0, U"\U000003C1"}, + {0x1D6E1, U"\U000003C0"}, + {0x1D6E2, U"\U00000391"}, + {0x1D6E3, U"\U00000392"}, + {0x1D6E4, U"\U00000393"}, + {0x1D6E5, U"\U00000394"}, + {0x1D6E6, U"\U00000395"}, + {0x1D6E7, U"\U00000396"}, + {0x1D6E8, U"\U00000397"}, + {0x1D6E9, U"\U00000398"}, + {0x1D6EA, U"\U00000399"}, + {0x1D6EB, U"\U0000039A"}, + {0x1D6EC, U"\U0000039B"}, + {0x1D6ED, U"\U0000039C"}, + {0x1D6EE, U"\U0000039D"}, + {0x1D6EF, U"\U0000039E"}, + {0x1D6F0, U"\U0000039F"}, + {0x1D6F1, U"\U000003A0"}, + {0x1D6F2, U"\U000003A1"}, + {0x1D6F3, U"\U00000398"}, + {0x1D6F4, U"\U000003A3"}, + {0x1D6F5, U"\U000003A4"}, + {0x1D6F6, U"\U000003A5"}, + {0x1D6F7, U"\U000003A6"}, + {0x1D6F8, U"\U000003A7"}, + {0x1D6F9, U"\U000003A8"}, + {0x1D6FA, U"\U000003A9"}, + {0x1D6FB, U"\U00002207"}, + {0x1D6FC, U"\U000003B1"}, + {0x1D6FD, U"\U000003B2"}, + {0x1D6FE, U"\U000003B3"}, + {0x1D6FF, U"\U000003B4"}, + {0x1D700, U"\U000003B5"}, + {0x1D701, U"\U000003B6"}, + {0x1D702, U"\U000003B7"}, + {0x1D703, U"\U000003B8"}, + {0x1D704, U"\U000003B9"}, + {0x1D705, U"\U000003BA"}, + {0x1D706, U"\U000003BB"}, + {0x1D707, U"\U000003BC"}, + {0x1D708, U"\U000003BD"}, + {0x1D709, U"\U000003BE"}, + {0x1D70A, U"\U000003BF"}, + {0x1D70B, U"\U000003C0"}, + {0x1D70C, U"\U000003C1"}, + {0x1D70D, U"\U000003C2"}, + {0x1D70E, U"\U000003C3"}, + {0x1D70F, U"\U000003C4"}, + {0x1D710, U"\U000003C5"}, + {0x1D711, U"\U000003C6"}, + {0x1D712, U"\U000003C7"}, + {0x1D713, U"\U000003C8"}, + {0x1D714, U"\U000003C9"}, + {0x1D715, U"\U00002202"}, + {0x1D716, U"\U000003B5"}, + {0x1D717, U"\U000003B8"}, + {0x1D718, U"\U000003BA"}, + {0x1D719, U"\U000003C6"}, + {0x1D71A, U"\U000003C1"}, + {0x1D71B, U"\U000003C0"}, + {0x1D71C, U"\U00000391"}, + {0x1D71D, U"\U00000392"}, + {0x1D71E, U"\U00000393"}, + {0x1D71F, U"\U00000394"}, + {0x1D720, U"\U00000395"}, + {0x1D721, U"\U00000396"}, + {0x1D722, U"\U00000397"}, + {0x1D723, U"\U00000398"}, + {0x1D724, U"\U00000399"}, + {0x1D725, U"\U0000039A"}, + {0x1D726, U"\U0000039B"}, + {0x1D727, U"\U0000039C"}, + {0x1D728, U"\U0000039D"}, + {0x1D729, U"\U0000039E"}, + {0x1D72A, U"\U0000039F"}, + {0x1D72B, U"\U000003A0"}, + {0x1D72C, U"\U000003A1"}, + {0x1D72D, U"\U00000398"}, + {0x1D72E, U"\U000003A3"}, + {0x1D72F, U"\U000003A4"}, + {0x1D730, U"\U000003A5"}, + {0x1D731, U"\U000003A6"}, + {0x1D732, U"\U000003A7"}, + {0x1D733, U"\U000003A8"}, + {0x1D734, U"\U000003A9"}, + {0x1D735, U"\U00002207"}, + {0x1D736, U"\U000003B1"}, + {0x1D737, U"\U000003B2"}, + {0x1D738, U"\U000003B3"}, + {0x1D739, U"\U000003B4"}, + {0x1D73A, U"\U000003B5"}, + {0x1D73B, U"\U000003B6"}, + {0x1D73C, U"\U000003B7"}, + {0x1D73D, U"\U000003B8"}, + {0x1D73E, U"\U000003B9"}, + {0x1D73F, U"\U000003BA"}, + {0x1D740, U"\U000003BB"}, + {0x1D741, U"\U000003BC"}, + {0x1D742, U"\U000003BD"}, + {0x1D743, U"\U000003BE"}, + {0x1D744, U"\U000003BF"}, + {0x1D745, U"\U000003C0"}, + {0x1D746, U"\U000003C1"}, + {0x1D747, U"\U000003C2"}, + {0x1D748, U"\U000003C3"}, + {0x1D749, U"\U000003C4"}, + {0x1D74A, U"\U000003C5"}, + {0x1D74B, U"\U000003C6"}, + {0x1D74C, U"\U000003C7"}, + {0x1D74D, U"\U000003C8"}, + {0x1D74E, U"\U000003C9"}, + {0x1D74F, U"\U00002202"}, + {0x1D750, U"\U000003B5"}, + {0x1D751, U"\U000003B8"}, + {0x1D752, U"\U000003BA"}, + {0x1D753, U"\U000003C6"}, + {0x1D754, U"\U000003C1"}, + {0x1D755, U"\U000003C0"}, + {0x1D756, U"\U00000391"}, + {0x1D757, U"\U00000392"}, + {0x1D758, U"\U00000393"}, + {0x1D759, U"\U00000394"}, + {0x1D75A, U"\U00000395"}, + {0x1D75B, U"\U00000396"}, + {0x1D75C, U"\U00000397"}, + {0x1D75D, U"\U00000398"}, + {0x1D75E, U"\U00000399"}, + {0x1D75F, U"\U0000039A"}, + {0x1D760, U"\U0000039B"}, + {0x1D761, U"\U0000039C"}, + {0x1D762, U"\U0000039D"}, + {0x1D763, U"\U0000039E"}, + {0x1D764, U"\U0000039F"}, + {0x1D765, U"\U000003A0"}, + {0x1D766, U"\U000003A1"}, + {0x1D767, U"\U00000398"}, + {0x1D768, U"\U000003A3"}, + {0x1D769, U"\U000003A4"}, + {0x1D76A, U"\U000003A5"}, + {0x1D76B, U"\U000003A6"}, + {0x1D76C, U"\U000003A7"}, + {0x1D76D, U"\U000003A8"}, + {0x1D76E, U"\U000003A9"}, + {0x1D76F, U"\U00002207"}, + {0x1D770, U"\U000003B1"}, + {0x1D771, U"\U000003B2"}, + {0x1D772, U"\U000003B3"}, + {0x1D773, U"\U000003B4"}, + {0x1D774, U"\U000003B5"}, + {0x1D775, U"\U000003B6"}, + {0x1D776, U"\U000003B7"}, + {0x1D777, U"\U000003B8"}, + {0x1D778, U"\U000003B9"}, + {0x1D779, U"\U000003BA"}, + {0x1D77A, U"\U000003BB"}, + {0x1D77B, U"\U000003BC"}, + {0x1D77C, U"\U000003BD"}, + {0x1D77D, U"\U000003BE"}, + {0x1D77E, U"\U000003BF"}, + {0x1D77F, U"\U000003C0"}, + {0x1D780, U"\U000003C1"}, + {0x1D781, U"\U000003C2"}, + {0x1D782, U"\U000003C3"}, + {0x1D783, U"\U000003C4"}, + {0x1D784, U"\U000003C5"}, + {0x1D785, U"\U000003C6"}, + {0x1D786, U"\U000003C7"}, + {0x1D787, U"\U000003C8"}, + {0x1D788, U"\U000003C9"}, + {0x1D789, U"\U00002202"}, + {0x1D78A, U"\U000003B5"}, + {0x1D78B, U"\U000003B8"}, + {0x1D78C, U"\U000003BA"}, + {0x1D78D, U"\U000003C6"}, + {0x1D78E, U"\U000003C1"}, + {0x1D78F, U"\U000003C0"}, + {0x1D790, U"\U00000391"}, + {0x1D791, U"\U00000392"}, + {0x1D792, U"\U00000393"}, + {0x1D793, U"\U00000394"}, + {0x1D794, U"\U00000395"}, + {0x1D795, U"\U00000396"}, + {0x1D796, U"\U00000397"}, + {0x1D797, U"\U00000398"}, + {0x1D798, U"\U00000399"}, + {0x1D799, U"\U0000039A"}, + {0x1D79A, U"\U0000039B"}, + {0x1D79B, U"\U0000039C"}, + {0x1D79C, U"\U0000039D"}, + {0x1D79D, U"\U0000039E"}, + {0x1D79E, U"\U0000039F"}, + {0x1D79F, U"\U000003A0"}, + {0x1D7A0, U"\U000003A1"}, + {0x1D7A1, U"\U00000398"}, + {0x1D7A2, U"\U000003A3"}, + {0x1D7A3, U"\U000003A4"}, + {0x1D7A4, U"\U000003A5"}, + {0x1D7A5, U"\U000003A6"}, + {0x1D7A6, U"\U000003A7"}, + {0x1D7A7, U"\U000003A8"}, + {0x1D7A8, U"\U000003A9"}, + {0x1D7A9, U"\U00002207"}, + {0x1D7AA, U"\U000003B1"}, + {0x1D7AB, U"\U000003B2"}, + {0x1D7AC, U"\U000003B3"}, + {0x1D7AD, U"\U000003B4"}, + {0x1D7AE, U"\U000003B5"}, + {0x1D7AF, U"\U000003B6"}, + {0x1D7B0, U"\U000003B7"}, + {0x1D7B1, U"\U000003B8"}, + {0x1D7B2, U"\U000003B9"}, + {0x1D7B3, U"\U000003BA"}, + {0x1D7B4, U"\U000003BB"}, + {0x1D7B5, U"\U000003BC"}, + {0x1D7B6, U"\U000003BD"}, + {0x1D7B7, U"\U000003BE"}, + {0x1D7B8, U"\U000003BF"}, + {0x1D7B9, U"\U000003C0"}, + {0x1D7BA, U"\U000003C1"}, + {0x1D7BB, U"\U000003C2"}, + {0x1D7BC, U"\U000003C3"}, + {0x1D7BD, U"\U000003C4"}, + {0x1D7BE, U"\U000003C5"}, + {0x1D7BF, U"\U000003C6"}, + {0x1D7C0, U"\U000003C7"}, + {0x1D7C1, U"\U000003C8"}, + {0x1D7C2, U"\U000003C9"}, + {0x1D7C3, U"\U00002202"}, + {0x1D7C4, U"\U000003B5"}, + {0x1D7C5, U"\U000003B8"}, + {0x1D7C6, U"\U000003BA"}, + {0x1D7C7, U"\U000003C6"}, + {0x1D7C8, U"\U000003C1"}, + {0x1D7C9, U"\U000003C0"}, + {0x1D7CA, U"\U000003DC"}, + {0x1D7CB, U"\U000003DD"}, + {0x1D7CE, U"\U00000030"}, + {0x1D7CF, U"\U00000031"}, + {0x1D7D0, U"\U00000032"}, + {0x1D7D1, U"\U00000033"}, + {0x1D7D2, U"\U00000034"}, + {0x1D7D3, U"\U00000035"}, + {0x1D7D4, U"\U00000036"}, + {0x1D7D5, U"\U00000037"}, + {0x1D7D6, U"\U00000038"}, + {0x1D7D7, U"\U00000039"}, + {0x1D7D8, U"\U00000030"}, + {0x1D7D9, U"\U00000031"}, + {0x1D7DA, U"\U00000032"}, + {0x1D7DB, U"\U00000033"}, + {0x1D7DC, U"\U00000034"}, + {0x1D7DD, U"\U00000035"}, + {0x1D7DE, U"\U00000036"}, + {0x1D7DF, U"\U00000037"}, + {0x1D7E0, U"\U00000038"}, + {0x1D7E1, U"\U00000039"}, + {0x1D7E2, U"\U00000030"}, + {0x1D7E3, U"\U00000031"}, + {0x1D7E4, U"\U00000032"}, + {0x1D7E5, U"\U00000033"}, + {0x1D7E6, U"\U00000034"}, + {0x1D7E7, U"\U00000035"}, + {0x1D7E8, U"\U00000036"}, + {0x1D7E9, U"\U00000037"}, + {0x1D7EA, U"\U00000038"}, + {0x1D7EB, U"\U00000039"}, + {0x1D7EC, U"\U00000030"}, + {0x1D7ED, U"\U00000031"}, + {0x1D7EE, U"\U00000032"}, + {0x1D7EF, U"\U00000033"}, + {0x1D7F0, U"\U00000034"}, + {0x1D7F1, U"\U00000035"}, + {0x1D7F2, U"\U00000036"}, + {0x1D7F3, U"\U00000037"}, + {0x1D7F4, U"\U00000038"}, + {0x1D7F5, U"\U00000039"}, + {0x1D7F6, U"\U00000030"}, + {0x1D7F7, U"\U00000031"}, + {0x1D7F8, U"\U00000032"}, + {0x1D7F9, U"\U00000033"}, + {0x1D7FA, U"\U00000034"}, + {0x1D7FB, U"\U00000035"}, + {0x1D7FC, U"\U00000036"}, + {0x1D7FD, U"\U00000037"}, + {0x1D7FE, U"\U00000038"}, + {0x1D7FF, U"\U00000039"}, + {0x1E030, U"\U00000430"}, + {0x1E031, U"\U00000431"}, + {0x1E032, U"\U00000432"}, + {0x1E033, U"\U00000433"}, + {0x1E034, U"\U00000434"}, + {0x1E035, U"\U00000435"}, + {0x1E036, U"\U00000436"}, + {0x1E037, U"\U00000437"}, + {0x1E038, U"\U00000438"}, + {0x1E039, U"\U0000043A"}, + {0x1E03A, U"\U0000043B"}, + {0x1E03B, U"\U0000043C"}, + {0x1E03C, U"\U0000043E"}, + {0x1E03D, U"\U0000043F"}, + {0x1E03E, U"\U00000440"}, + {0x1E03F, U"\U00000441"}, + {0x1E040, U"\U00000442"}, + {0x1E041, U"\U00000443"}, + {0x1E042, U"\U00000444"}, + {0x1E043, U"\U00000445"}, + {0x1E044, U"\U00000446"}, + {0x1E045, U"\U00000447"}, + {0x1E046, U"\U00000448"}, + {0x1E047, U"\U0000044B"}, + {0x1E048, U"\U0000044D"}, + {0x1E049, U"\U0000044E"}, + {0x1E04A, U"\U0000A689"}, + {0x1E04B, U"\U000004D9"}, + {0x1E04C, U"\U00000456"}, + {0x1E04D, U"\U00000458"}, + {0x1E04E, U"\U000004E9"}, + {0x1E04F, U"\U000004AF"}, + {0x1E050, U"\U000004CF"}, + {0x1E051, U"\U00000430"}, + {0x1E052, U"\U00000431"}, + {0x1E053, U"\U00000432"}, + {0x1E054, U"\U00000433"}, + {0x1E055, U"\U00000434"}, + {0x1E056, U"\U00000435"}, + {0x1E057, U"\U00000436"}, + {0x1E058, U"\U00000437"}, + {0x1E059, U"\U00000438"}, + {0x1E05A, U"\U0000043A"}, + {0x1E05B, U"\U0000043B"}, + {0x1E05C, U"\U0000043E"}, + {0x1E05D, U"\U0000043F"}, + {0x1E05E, U"\U00000441"}, + {0x1E05F, U"\U00000443"}, + {0x1E060, U"\U00000444"}, + {0x1E061, U"\U00000445"}, + {0x1E062, U"\U00000446"}, + {0x1E063, U"\U00000447"}, + {0x1E064, U"\U00000448"}, + {0x1E065, U"\U0000044A"}, + {0x1E066, U"\U0000044B"}, + {0x1E067, U"\U00000491"}, + {0x1E068, U"\U00000456"}, + {0x1E069, U"\U00000455"}, + {0x1E06A, U"\U0000045F"}, + {0x1E06B, U"\U000004AB"}, + {0x1E06C, U"\U0000A651"}, + {0x1E06D, U"\U000004B1"}, + {0x1EE00, U"\U00000627"}, + {0x1EE01, U"\U00000628"}, + {0x1EE02, U"\U0000062C"}, + {0x1EE03, U"\U0000062F"}, + {0x1EE05, U"\U00000648"}, + {0x1EE06, U"\U00000632"}, + {0x1EE07, U"\U0000062D"}, + {0x1EE08, U"\U00000637"}, + {0x1EE09, U"\U0000064A"}, + {0x1EE0A, U"\U00000643"}, + {0x1EE0B, U"\U00000644"}, + {0x1EE0C, U"\U00000645"}, + {0x1EE0D, U"\U00000646"}, + {0x1EE0E, U"\U00000633"}, + {0x1EE0F, U"\U00000639"}, + {0x1EE10, U"\U00000641"}, + {0x1EE11, U"\U00000635"}, + {0x1EE12, U"\U00000642"}, + {0x1EE13, U"\U00000631"}, + {0x1EE14, U"\U00000634"}, + {0x1EE15, U"\U0000062A"}, + {0x1EE16, U"\U0000062B"}, + {0x1EE17, U"\U0000062E"}, + {0x1EE18, U"\U00000630"}, + {0x1EE19, U"\U00000636"}, + {0x1EE1A, U"\U00000638"}, + {0x1EE1B, U"\U0000063A"}, + {0x1EE1C, U"\U0000066E"}, + {0x1EE1D, U"\U000006BA"}, + {0x1EE1E, U"\U000006A1"}, + {0x1EE1F, U"\U0000066F"}, + {0x1EE21, U"\U00000628"}, + {0x1EE22, U"\U0000062C"}, + {0x1EE24, U"\U00000647"}, + {0x1EE27, U"\U0000062D"}, + {0x1EE29, U"\U0000064A"}, + {0x1EE2A, U"\U00000643"}, + {0x1EE2B, U"\U00000644"}, + {0x1EE2C, U"\U00000645"}, + {0x1EE2D, U"\U00000646"}, + {0x1EE2E, U"\U00000633"}, + {0x1EE2F, U"\U00000639"}, + {0x1EE30, U"\U00000641"}, + {0x1EE31, U"\U00000635"}, + {0x1EE32, U"\U00000642"}, + {0x1EE34, U"\U00000634"}, + {0x1EE35, U"\U0000062A"}, + {0x1EE36, U"\U0000062B"}, + {0x1EE37, U"\U0000062E"}, + {0x1EE39, U"\U00000636"}, + {0x1EE3B, U"\U0000063A"}, + {0x1EE42, U"\U0000062C"}, + {0x1EE47, U"\U0000062D"}, + {0x1EE49, U"\U0000064A"}, + {0x1EE4B, U"\U00000644"}, + {0x1EE4D, U"\U00000646"}, + {0x1EE4E, U"\U00000633"}, + {0x1EE4F, U"\U00000639"}, + {0x1EE51, U"\U00000635"}, + {0x1EE52, U"\U00000642"}, + {0x1EE54, U"\U00000634"}, + {0x1EE57, U"\U0000062E"}, + {0x1EE59, U"\U00000636"}, + {0x1EE5B, U"\U0000063A"}, + {0x1EE5D, U"\U000006BA"}, + {0x1EE5F, U"\U0000066F"}, + {0x1EE61, U"\U00000628"}, + {0x1EE62, U"\U0000062C"}, + {0x1EE64, U"\U00000647"}, + {0x1EE67, U"\U0000062D"}, + {0x1EE68, U"\U00000637"}, + {0x1EE69, U"\U0000064A"}, + {0x1EE6A, U"\U00000643"}, + {0x1EE6C, U"\U00000645"}, + {0x1EE6D, U"\U00000646"}, + {0x1EE6E, U"\U00000633"}, + {0x1EE6F, U"\U00000639"}, + {0x1EE70, U"\U00000641"}, + {0x1EE71, U"\U00000635"}, + {0x1EE72, U"\U00000642"}, + {0x1EE74, U"\U00000634"}, + {0x1EE75, U"\U0000062A"}, + {0x1EE76, U"\U0000062B"}, + {0x1EE77, U"\U0000062E"}, + {0x1EE79, U"\U00000636"}, + {0x1EE7A, U"\U00000638"}, + {0x1EE7B, U"\U0000063A"}, + {0x1EE7C, U"\U0000066E"}, + {0x1EE7E, U"\U000006A1"}, + {0x1EE80, U"\U00000627"}, + {0x1EE81, U"\U00000628"}, + {0x1EE82, U"\U0000062C"}, + {0x1EE83, U"\U0000062F"}, + {0x1EE84, U"\U00000647"}, + {0x1EE85, U"\U00000648"}, + {0x1EE86, U"\U00000632"}, + {0x1EE87, U"\U0000062D"}, + {0x1EE88, U"\U00000637"}, + {0x1EE89, U"\U0000064A"}, + {0x1EE8B, U"\U00000644"}, + {0x1EE8C, U"\U00000645"}, + {0x1EE8D, U"\U00000646"}, + {0x1EE8E, U"\U00000633"}, + {0x1EE8F, U"\U00000639"}, + {0x1EE90, U"\U00000641"}, + {0x1EE91, U"\U00000635"}, + {0x1EE92, U"\U00000642"}, + {0x1EE93, U"\U00000631"}, + {0x1EE94, U"\U00000634"}, + {0x1EE95, U"\U0000062A"}, + {0x1EE96, U"\U0000062B"}, + {0x1EE97, U"\U0000062E"}, + {0x1EE98, U"\U00000630"}, + {0x1EE99, U"\U00000636"}, + {0x1EE9A, U"\U00000638"}, + {0x1EE9B, U"\U0000063A"}, + {0x1EEA1, U"\U00000628"}, + {0x1EEA2, U"\U0000062C"}, + {0x1EEA3, U"\U0000062F"}, + {0x1EEA5, U"\U00000648"}, + {0x1EEA6, U"\U00000632"}, + {0x1EEA7, U"\U0000062D"}, + {0x1EEA8, U"\U00000637"}, + {0x1EEA9, U"\U0000064A"}, + {0x1EEAB, U"\U00000644"}, + {0x1EEAC, U"\U00000645"}, + {0x1EEAD, U"\U00000646"}, + {0x1EEAE, U"\U00000633"}, + {0x1EEAF, U"\U00000639"}, + {0x1EEB0, U"\U00000641"}, + {0x1EEB1, U"\U00000635"}, + {0x1EEB2, U"\U00000642"}, + {0x1EEB3, U"\U00000631"}, + {0x1EEB4, U"\U00000634"}, + {0x1EEB5, U"\U0000062A"}, + {0x1EEB6, U"\U0000062B"}, + {0x1EEB7, U"\U0000062E"}, + {0x1EEB8, U"\U00000630"}, + {0x1EEB9, U"\U00000636"}, + {0x1EEBA, U"\U00000638"}, + {0x1EEBB, U"\U0000063A"}, + {0x1F100, U"\U00000030\U0000002E"}, + {0x1F101, U"\U00000030\U0000002C"}, + {0x1F102, U"\U00000031\U0000002C"}, + {0x1F103, U"\U00000032\U0000002C"}, + {0x1F104, U"\U00000033\U0000002C"}, + {0x1F105, U"\U00000034\U0000002C"}, + {0x1F106, U"\U00000035\U0000002C"}, + {0x1F107, U"\U00000036\U0000002C"}, + {0x1F108, U"\U00000037\U0000002C"}, + {0x1F109, U"\U00000038\U0000002C"}, + {0x1F10A, U"\U00000039\U0000002C"}, + {0x1F110, U"\U00000028\U00000041\U00000029"}, + {0x1F111, U"\U00000028\U00000042\U00000029"}, + {0x1F112, U"\U00000028\U00000043\U00000029"}, + {0x1F113, U"\U00000028\U00000044\U00000029"}, + {0x1F114, U"\U00000028\U00000045\U00000029"}, + {0x1F115, U"\U00000028\U00000046\U00000029"}, + {0x1F116, U"\U00000028\U00000047\U00000029"}, + {0x1F117, U"\U00000028\U00000048\U00000029"}, + {0x1F118, U"\U00000028\U00000049\U00000029"}, + {0x1F119, U"\U00000028\U0000004A\U00000029"}, + {0x1F11A, U"\U00000028\U0000004B\U00000029"}, + {0x1F11B, U"\U00000028\U0000004C\U00000029"}, + {0x1F11C, U"\U00000028\U0000004D\U00000029"}, + {0x1F11D, U"\U00000028\U0000004E\U00000029"}, + {0x1F11E, U"\U00000028\U0000004F\U00000029"}, + {0x1F11F, U"\U00000028\U00000050\U00000029"}, + {0x1F120, U"\U00000028\U00000051\U00000029"}, + {0x1F121, U"\U00000028\U00000052\U00000029"}, + {0x1F122, U"\U00000028\U00000053\U00000029"}, + {0x1F123, U"\U00000028\U00000054\U00000029"}, + {0x1F124, U"\U00000028\U00000055\U00000029"}, + {0x1F125, U"\U00000028\U00000056\U00000029"}, + {0x1F126, U"\U00000028\U00000057\U00000029"}, + {0x1F127, U"\U00000028\U00000058\U00000029"}, + {0x1F128, U"\U00000028\U00000059\U00000029"}, + {0x1F129, U"\U00000028\U0000005A\U00000029"}, + {0x1F12A, U"\U00003014\U00000053\U00003015"}, + {0x1F12B, U"\U00000043"}, + {0x1F12C, U"\U00000052"}, + {0x1F12D, U"\U00000043\U00000044"}, + {0x1F12E, U"\U00000057\U0000005A"}, + {0x1F130, U"\U00000041"}, + {0x1F131, U"\U00000042"}, + {0x1F132, U"\U00000043"}, + {0x1F133, U"\U00000044"}, + {0x1F134, U"\U00000045"}, + {0x1F135, U"\U00000046"}, + {0x1F136, U"\U00000047"}, + {0x1F137, U"\U00000048"}, + {0x1F138, U"\U00000049"}, + {0x1F139, U"\U0000004A"}, + {0x1F13A, U"\U0000004B"}, + {0x1F13B, U"\U0000004C"}, + {0x1F13C, U"\U0000004D"}, + {0x1F13D, U"\U0000004E"}, + {0x1F13E, U"\U0000004F"}, + {0x1F13F, U"\U00000050"}, + {0x1F140, U"\U00000051"}, + {0x1F141, U"\U00000052"}, + {0x1F142, U"\U00000053"}, + {0x1F143, U"\U00000054"}, + {0x1F144, U"\U00000055"}, + {0x1F145, U"\U00000056"}, + {0x1F146, U"\U00000057"}, + {0x1F147, U"\U00000058"}, + {0x1F148, U"\U00000059"}, + {0x1F149, U"\U0000005A"}, + {0x1F14A, U"\U00000048\U00000056"}, + {0x1F14B, U"\U0000004D\U00000056"}, + {0x1F14C, U"\U00000053\U00000044"}, + {0x1F14D, U"\U00000053\U00000053"}, + {0x1F14E, U"\U00000050\U00000050\U00000056"}, + {0x1F14F, U"\U00000057\U00000043"}, + {0x1F16A, U"\U0000004D\U00000043"}, + {0x1F16B, U"\U0000004D\U00000044"}, + {0x1F16C, U"\U0000004D\U00000052"}, + {0x1F190, U"\U00000044\U0000004A"}, + {0x1F200, U"\U0000307B\U0000304B"}, + {0x1F201, U"\U000030B3\U000030B3"}, + {0x1F202, U"\U000030B5"}, + {0x1F210, U"\U0000624B"}, + {0x1F211, U"\U00005B57"}, + {0x1F212, U"\U000053CC"}, + {0x1F213, U"\U000030C7"}, + {0x1F214, U"\U00004E8C"}, + {0x1F215, U"\U0000591A"}, + {0x1F216, U"\U000089E3"}, + {0x1F217, U"\U00005929"}, + {0x1F218, U"\U00004EA4"}, + {0x1F219, U"\U00006620"}, + {0x1F21A, U"\U00007121"}, + {0x1F21B, U"\U00006599"}, + {0x1F21C, U"\U0000524D"}, + {0x1F21D, U"\U00005F8C"}, + {0x1F21E, U"\U0000518D"}, + {0x1F21F, U"\U000065B0"}, + {0x1F220, U"\U0000521D"}, + {0x1F221, U"\U00007D42"}, + {0x1F222, U"\U0000751F"}, + {0x1F223, U"\U00008CA9"}, + {0x1F224, U"\U000058F0"}, + {0x1F225, U"\U00005439"}, + {0x1F226, U"\U00006F14"}, + {0x1F227, U"\U00006295"}, + {0x1F228, U"\U00006355"}, + {0x1F229, U"\U00004E00"}, + {0x1F22A, U"\U00004E09"}, + {0x1F22B, U"\U0000904A"}, + {0x1F22C, U"\U00005DE6"}, + {0x1F22D, U"\U00004E2D"}, + {0x1F22E, U"\U000053F3"}, + {0x1F22F, U"\U00006307"}, + {0x1F230, U"\U00008D70"}, + {0x1F231, U"\U00006253"}, + {0x1F232, U"\U00007981"}, + {0x1F233, U"\U00007A7A"}, + {0x1F234, U"\U00005408"}, + {0x1F235, U"\U00006E80"}, + {0x1F236, U"\U00006709"}, + {0x1F237, U"\U00006708"}, + {0x1F238, U"\U00007533"}, + {0x1F239, U"\U00005272"}, + {0x1F23A, U"\U000055B6"}, + {0x1F23B, U"\U0000914D"}, + {0x1F240, U"\U00003014\U0000672C\U00003015"}, + {0x1F241, U"\U00003014\U00004E09\U00003015"}, + {0x1F242, U"\U00003014\U00004E8C\U00003015"}, + {0x1F243, U"\U00003014\U00005B89\U00003015"}, + {0x1F244, U"\U00003014\U000070B9\U00003015"}, + {0x1F245, U"\U00003014\U00006253\U00003015"}, + {0x1F246, U"\U00003014\U000076D7\U00003015"}, + {0x1F247, U"\U00003014\U000052DD\U00003015"}, + {0x1F248, U"\U00003014\U00006557\U00003015"}, + {0x1F250, U"\U00005F97"}, + {0x1F251, U"\U000053EF"}, + {0x1FBF0, U"\U00000030"}, + {0x1FBF1, U"\U00000031"}, + {0x1FBF2, U"\U00000032"}, + {0x1FBF3, U"\U00000033"}, + {0x1FBF4, U"\U00000034"}, + {0x1FBF5, U"\U00000035"}, + {0x1FBF6, U"\U00000036"}, + {0x1FBF7, U"\U00000037"}, + {0x1FBF8, U"\U00000038"}, + {0x1FBF9, U"\U00000039"}, + {0x2F800, U"\U00004E3D"}, + {0x2F801, U"\U00004E38"}, + {0x2F802, U"\U00004E41"}, + {0x2F803, U"\U00020122"}, + {0x2F804, U"\U00004F60"}, + {0x2F805, U"\U00004FAE"}, + {0x2F806, U"\U00004FBB"}, + {0x2F807, U"\U00005002"}, + {0x2F808, U"\U0000507A"}, + {0x2F809, U"\U00005099"}, + {0x2F80A, U"\U000050E7"}, + {0x2F80B, U"\U000050CF"}, + {0x2F80C, U"\U0000349E"}, + {0x2F80D, U"\U0002063A"}, + {0x2F80E, U"\U0000514D"}, + {0x2F80F, U"\U00005154"}, + {0x2F810, U"\U00005164"}, + {0x2F811, U"\U00005177"}, + {0x2F812, U"\U0002051C"}, + {0x2F813, U"\U000034B9"}, + {0x2F814, U"\U00005167"}, + {0x2F815, U"\U0000518D"}, + {0x2F816, U"\U0002054B"}, + {0x2F817, U"\U00005197"}, + {0x2F818, U"\U000051A4"}, + {0x2F819, U"\U00004ECC"}, + {0x2F81A, U"\U000051AC"}, + {0x2F81B, U"\U000051B5"}, + {0x2F81C, U"\U000291DF"}, + {0x2F81D, U"\U000051F5"}, + {0x2F81E, U"\U00005203"}, + {0x2F81F, U"\U000034DF"}, + {0x2F820, U"\U0000523B"}, + {0x2F821, U"\U00005246"}, + {0x2F822, U"\U00005272"}, + {0x2F823, U"\U00005277"}, + {0x2F824, U"\U00003515"}, + {0x2F825, U"\U000052C7"}, + {0x2F826, U"\U000052C9"}, + {0x2F827, U"\U000052E4"}, + {0x2F828, U"\U000052FA"}, + {0x2F829, U"\U00005305"}, + {0x2F82A, U"\U00005306"}, + {0x2F82B, U"\U00005317"}, + {0x2F82C, U"\U00005349"}, + {0x2F82D, U"\U00005351"}, + {0x2F82E, U"\U0000535A"}, + {0x2F82F, U"\U00005373"}, + {0x2F830, U"\U0000537D"}, + {0x2F831, U"\U0000537F"}, + {0x2F832, U"\U0000537F"}, + {0x2F833, U"\U0000537F"}, + {0x2F834, U"\U00020A2C"}, + {0x2F835, U"\U00007070"}, + {0x2F836, U"\U000053CA"}, + {0x2F837, U"\U000053DF"}, + {0x2F838, U"\U00020B63"}, + {0x2F839, U"\U000053EB"}, + {0x2F83A, U"\U000053F1"}, + {0x2F83B, U"\U00005406"}, + {0x2F83C, U"\U0000549E"}, + {0x2F83D, U"\U00005438"}, + {0x2F83E, U"\U00005448"}, + {0x2F83F, U"\U00005468"}, + {0x2F840, U"\U000054A2"}, + {0x2F841, U"\U000054F6"}, + {0x2F842, U"\U00005510"}, + {0x2F843, U"\U00005553"}, + {0x2F844, U"\U00005563"}, + {0x2F845, U"\U00005584"}, + {0x2F846, U"\U00005584"}, + {0x2F847, U"\U00005599"}, + {0x2F848, U"\U000055AB"}, + {0x2F849, U"\U000055B3"}, + {0x2F84A, U"\U000055C2"}, + {0x2F84B, U"\U00005716"}, + {0x2F84C, U"\U00005606"}, + {0x2F84D, U"\U00005717"}, + {0x2F84E, U"\U00005651"}, + {0x2F84F, U"\U00005674"}, + {0x2F850, U"\U00005207"}, + {0x2F851, U"\U000058EE"}, + {0x2F852, U"\U000057CE"}, + {0x2F853, U"\U000057F4"}, + {0x2F854, U"\U0000580D"}, + {0x2F855, U"\U0000578B"}, + {0x2F856, U"\U00005832"}, + {0x2F857, U"\U00005831"}, + {0x2F858, U"\U000058AC"}, + {0x2F859, U"\U000214E4"}, + {0x2F85A, U"\U000058F2"}, + {0x2F85B, U"\U000058F7"}, + {0x2F85C, U"\U00005906"}, + {0x2F85D, U"\U0000591A"}, + {0x2F85E, U"\U00005922"}, + {0x2F85F, U"\U00005962"}, + {0x2F860, U"\U000216A8"}, + {0x2F861, U"\U000216EA"}, + {0x2F862, U"\U000059EC"}, + {0x2F863, U"\U00005A1B"}, + {0x2F864, U"\U00005A27"}, + {0x2F865, U"\U000059D8"}, + {0x2F866, U"\U00005A66"}, + {0x2F867, U"\U000036EE"}, + {0x2F868, U"\U000036FC"}, + {0x2F869, U"\U00005B08"}, + {0x2F86A, U"\U00005B3E"}, + {0x2F86B, U"\U00005B3E"}, + {0x2F86C, U"\U000219C8"}, + {0x2F86D, U"\U00005BC3"}, + {0x2F86E, U"\U00005BD8"}, + {0x2F86F, U"\U00005BE7"}, + {0x2F870, U"\U00005BF3"}, + {0x2F871, U"\U00021B18"}, + {0x2F872, U"\U00005BFF"}, + {0x2F873, U"\U00005C06"}, + {0x2F874, U"\U00005F53"}, + {0x2F875, U"\U00005C22"}, + {0x2F876, U"\U00003781"}, + {0x2F877, U"\U00005C60"}, + {0x2F878, U"\U00005C6E"}, + {0x2F879, U"\U00005CC0"}, + {0x2F87A, U"\U00005C8D"}, + {0x2F87B, U"\U00021DE4"}, + {0x2F87C, U"\U00005D43"}, + {0x2F87D, U"\U00021DE6"}, + {0x2F87E, U"\U00005D6E"}, + {0x2F87F, U"\U00005D6B"}, + {0x2F880, U"\U00005D7C"}, + {0x2F881, U"\U00005DE1"}, + {0x2F882, U"\U00005DE2"}, + {0x2F883, U"\U0000382F"}, + {0x2F884, U"\U00005DFD"}, + {0x2F885, U"\U00005E28"}, + {0x2F886, U"\U00005E3D"}, + {0x2F887, U"\U00005E69"}, + {0x2F888, U"\U00003862"}, + {0x2F889, U"\U00022183"}, + {0x2F88A, U"\U0000387C"}, + {0x2F88B, U"\U00005EB0"}, + {0x2F88C, U"\U00005EB3"}, + {0x2F88D, U"\U00005EB6"}, + {0x2F88E, U"\U00005ECA"}, + {0x2F88F, U"\U0002A392"}, + {0x2F890, U"\U00005EFE"}, + {0x2F891, U"\U00022331"}, + {0x2F892, U"\U00022331"}, + {0x2F893, U"\U00008201"}, + {0x2F894, U"\U00005F22"}, + {0x2F895, U"\U00005F22"}, + {0x2F896, U"\U000038C7"}, + {0x2F897, U"\U000232B8"}, + {0x2F898, U"\U000261DA"}, + {0x2F899, U"\U00005F62"}, + {0x2F89A, U"\U00005F6B"}, + {0x2F89B, U"\U000038E3"}, + {0x2F89C, U"\U00005F9A"}, + {0x2F89D, U"\U00005FCD"}, + {0x2F89E, U"\U00005FD7"}, + {0x2F89F, U"\U00005FF9"}, + {0x2F8A0, U"\U00006081"}, + {0x2F8A1, U"\U0000393A"}, + {0x2F8A2, U"\U0000391C"}, + {0x2F8A3, U"\U00006094"}, + {0x2F8A4, U"\U000226D4"}, + {0x2F8A5, U"\U000060C7"}, + {0x2F8A6, U"\U00006148"}, + {0x2F8A7, U"\U0000614C"}, + {0x2F8A8, U"\U0000614E"}, + {0x2F8A9, U"\U0000614C"}, + {0x2F8AA, U"\U0000617A"}, + {0x2F8AB, U"\U0000618E"}, + {0x2F8AC, U"\U000061B2"}, + {0x2F8AD, U"\U000061A4"}, + {0x2F8AE, U"\U000061AF"}, + {0x2F8AF, U"\U000061DE"}, + {0x2F8B0, U"\U000061F2"}, + {0x2F8B1, U"\U000061F6"}, + {0x2F8B2, U"\U00006210"}, + {0x2F8B3, U"\U0000621B"}, + {0x2F8B4, U"\U0000625D"}, + {0x2F8B5, U"\U000062B1"}, + {0x2F8B6, U"\U000062D4"}, + {0x2F8B7, U"\U00006350"}, + {0x2F8B8, U"\U00022B0C"}, + {0x2F8B9, U"\U0000633D"}, + {0x2F8BA, U"\U000062FC"}, + {0x2F8BB, U"\U00006368"}, + {0x2F8BC, U"\U00006383"}, + {0x2F8BD, U"\U000063E4"}, + {0x2F8BE, U"\U00022BF1"}, + {0x2F8BF, U"\U00006422"}, + {0x2F8C0, U"\U000063C5"}, + {0x2F8C1, U"\U000063A9"}, + {0x2F8C2, U"\U00003A2E"}, + {0x2F8C3, U"\U00006469"}, + {0x2F8C4, U"\U0000647E"}, + {0x2F8C5, U"\U0000649D"}, + {0x2F8C6, U"\U00006477"}, + {0x2F8C7, U"\U00003A6C"}, + {0x2F8C8, U"\U0000654F"}, + {0x2F8C9, U"\U0000656C"}, + {0x2F8CA, U"\U0002300A"}, + {0x2F8CB, U"\U000065E3"}, + {0x2F8CC, U"\U000066F8"}, + {0x2F8CD, U"\U00006649"}, + {0x2F8CE, U"\U00003B19"}, + {0x2F8CF, U"\U00006691"}, + {0x2F8D0, U"\U00003B08"}, + {0x2F8D1, U"\U00003AE4"}, + {0x2F8D2, U"\U00005192"}, + {0x2F8D3, U"\U00005195"}, + {0x2F8D4, U"\U00006700"}, + {0x2F8D5, U"\U0000669C"}, + {0x2F8D6, U"\U000080AD"}, + {0x2F8D7, U"\U000043D9"}, + {0x2F8D8, U"\U00006717"}, + {0x2F8D9, U"\U0000671B"}, + {0x2F8DA, U"\U00006721"}, + {0x2F8DB, U"\U0000675E"}, + {0x2F8DC, U"\U00006753"}, + {0x2F8DD, U"\U000233C3"}, + {0x2F8DE, U"\U00003B49"}, + {0x2F8DF, U"\U000067FA"}, + {0x2F8E0, U"\U00006785"}, + {0x2F8E1, U"\U00006852"}, + {0x2F8E2, U"\U00006885"}, + {0x2F8E3, U"\U0002346D"}, + {0x2F8E4, U"\U0000688E"}, + {0x2F8E5, U"\U0000681F"}, + {0x2F8E6, U"\U00006914"}, + {0x2F8E7, U"\U00003B9D"}, + {0x2F8E8, U"\U00006942"}, + {0x2F8E9, U"\U000069A3"}, + {0x2F8EA, U"\U000069EA"}, + {0x2F8EB, U"\U00006AA8"}, + {0x2F8EC, U"\U000236A3"}, + {0x2F8ED, U"\U00006ADB"}, + {0x2F8EE, U"\U00003C18"}, + {0x2F8EF, U"\U00006B21"}, + {0x2F8F0, U"\U000238A7"}, + {0x2F8F1, U"\U00006B54"}, + {0x2F8F2, U"\U00003C4E"}, + {0x2F8F3, U"\U00006B72"}, + {0x2F8F4, U"\U00006B9F"}, + {0x2F8F5, U"\U00006BBA"}, + {0x2F8F6, U"\U00006BBB"}, + {0x2F8F7, U"\U00023A8D"}, + {0x2F8F8, U"\U00021D0B"}, + {0x2F8F9, U"\U00023AFA"}, + {0x2F8FA, U"\U00006C4E"}, + {0x2F8FB, U"\U00023CBC"}, + {0x2F8FC, U"\U00006CBF"}, + {0x2F8FD, U"\U00006CCD"}, + {0x2F8FE, U"\U00006C67"}, + {0x2F8FF, U"\U00006D16"}, + {0x2F900, U"\U00006D3E"}, + {0x2F901, U"\U00006D77"}, + {0x2F902, U"\U00006D41"}, + {0x2F903, U"\U00006D69"}, + {0x2F904, U"\U00006D78"}, + {0x2F905, U"\U00006D85"}, + {0x2F906, U"\U00023D1E"}, + {0x2F907, U"\U00006D34"}, + {0x2F908, U"\U00006E2F"}, + {0x2F909, U"\U00006E6E"}, + {0x2F90A, U"\U00003D33"}, + {0x2F90B, U"\U00006ECB"}, + {0x2F90C, U"\U00006EC7"}, + {0x2F90D, U"\U00023ED1"}, + {0x2F90E, U"\U00006DF9"}, + {0x2F90F, U"\U00006F6E"}, + {0x2F910, U"\U00023F5E"}, + {0x2F911, U"\U00023F8E"}, + {0x2F912, U"\U00006FC6"}, + {0x2F913, U"\U00007039"}, + {0x2F914, U"\U0000701E"}, + {0x2F915, U"\U0000701B"}, + {0x2F916, U"\U00003D96"}, + {0x2F917, U"\U0000704A"}, + {0x2F918, U"\U0000707D"}, + {0x2F919, U"\U00007077"}, + {0x2F91A, U"\U000070AD"}, + {0x2F91B, U"\U00020525"}, + {0x2F91C, U"\U00007145"}, + {0x2F91D, U"\U00024263"}, + {0x2F91E, U"\U0000719C"}, + {0x2F91F, U"\U000243AB"}, + {0x2F920, U"\U00007228"}, + {0x2F921, U"\U00007235"}, + {0x2F922, U"\U00007250"}, + {0x2F923, U"\U00024608"}, + {0x2F924, U"\U00007280"}, + {0x2F925, U"\U00007295"}, + {0x2F926, U"\U00024735"}, + {0x2F927, U"\U00024814"}, + {0x2F928, U"\U0000737A"}, + {0x2F929, U"\U0000738B"}, + {0x2F92A, U"\U00003EAC"}, + {0x2F92B, U"\U000073A5"}, + {0x2F92C, U"\U00003EB8"}, + {0x2F92D, U"\U00003EB8"}, + {0x2F92E, U"\U00007447"}, + {0x2F92F, U"\U0000745C"}, + {0x2F930, U"\U00007471"}, + {0x2F931, U"\U00007485"}, + {0x2F932, U"\U000074CA"}, + {0x2F933, U"\U00003F1B"}, + {0x2F934, U"\U00007524"}, + {0x2F935, U"\U00024C36"}, + {0x2F936, U"\U0000753E"}, + {0x2F937, U"\U00024C92"}, + {0x2F938, U"\U00007570"}, + {0x2F939, U"\U0002219F"}, + {0x2F93A, U"\U00007610"}, + {0x2F93B, U"\U00024FA1"}, + {0x2F93C, U"\U00024FB8"}, + {0x2F93D, U"\U00025044"}, + {0x2F93E, U"\U00003FFC"}, + {0x2F93F, U"\U00004008"}, + {0x2F940, U"\U000076F4"}, + {0x2F941, U"\U000250F3"}, + {0x2F942, U"\U000250F2"}, + {0x2F943, U"\U00025119"}, + {0x2F944, U"\U00025133"}, + {0x2F945, U"\U0000771E"}, + {0x2F946, U"\U0000771F"}, + {0x2F947, U"\U0000771F"}, + {0x2F948, U"\U0000774A"}, + {0x2F949, U"\U00004039"}, + {0x2F94A, U"\U0000778B"}, + {0x2F94B, U"\U00004046"}, + {0x2F94C, U"\U00004096"}, + {0x2F94D, U"\U0002541D"}, + {0x2F94E, U"\U0000784E"}, + {0x2F94F, U"\U0000788C"}, + {0x2F950, U"\U000078CC"}, + {0x2F951, U"\U000040E3"}, + {0x2F952, U"\U00025626"}, + {0x2F953, U"\U00007956"}, + {0x2F954, U"\U0002569A"}, + {0x2F955, U"\U000256C5"}, + {0x2F956, U"\U0000798F"}, + {0x2F957, U"\U000079EB"}, + {0x2F958, U"\U0000412F"}, + {0x2F959, U"\U00007A40"}, + {0x2F95A, U"\U00007A4A"}, + {0x2F95B, U"\U00007A4F"}, + {0x2F95C, U"\U0002597C"}, + {0x2F95D, U"\U00025AA7"}, + {0x2F95E, U"\U00025AA7"}, + {0x2F95F, U"\U00007AEE"}, + {0x2F960, U"\U00004202"}, + {0x2F961, U"\U00025BAB"}, + {0x2F962, U"\U00007BC6"}, + {0x2F963, U"\U00007BC9"}, + {0x2F964, U"\U00004227"}, + {0x2F965, U"\U00025C80"}, + {0x2F966, U"\U00007CD2"}, + {0x2F967, U"\U000042A0"}, + {0x2F968, U"\U00007CE8"}, + {0x2F969, U"\U00007CE3"}, + {0x2F96A, U"\U00007D00"}, + {0x2F96B, U"\U00025F86"}, + {0x2F96C, U"\U00007D63"}, + {0x2F96D, U"\U00004301"}, + {0x2F96E, U"\U00007DC7"}, + {0x2F96F, U"\U00007E02"}, + {0x2F970, U"\U00007E45"}, + {0x2F971, U"\U00004334"}, + {0x2F972, U"\U00026228"}, + {0x2F973, U"\U00026247"}, + {0x2F974, U"\U00004359"}, + {0x2F975, U"\U000262D9"}, + {0x2F976, U"\U00007F7A"}, + {0x2F977, U"\U0002633E"}, + {0x2F978, U"\U00007F95"}, + {0x2F979, U"\U00007FFA"}, + {0x2F97A, U"\U00008005"}, + {0x2F97B, U"\U000264DA"}, + {0x2F97C, U"\U00026523"}, + {0x2F97D, U"\U00008060"}, + {0x2F97E, U"\U000265A8"}, + {0x2F97F, U"\U00008070"}, + {0x2F980, U"\U0002335F"}, + {0x2F981, U"\U000043D5"}, + {0x2F982, U"\U000080B2"}, + {0x2F983, U"\U00008103"}, + {0x2F984, U"\U0000440B"}, + {0x2F985, U"\U0000813E"}, + {0x2F986, U"\U00005AB5"}, + {0x2F987, U"\U000267A7"}, + {0x2F988, U"\U000267B5"}, + {0x2F989, U"\U00023393"}, + {0x2F98A, U"\U0002339C"}, + {0x2F98B, U"\U00008201"}, + {0x2F98C, U"\U00008204"}, + {0x2F98D, U"\U00008F9E"}, + {0x2F98E, U"\U0000446B"}, + {0x2F98F, U"\U00008291"}, + {0x2F990, U"\U0000828B"}, + {0x2F991, U"\U0000829D"}, + {0x2F992, U"\U000052B3"}, + {0x2F993, U"\U000082B1"}, + {0x2F994, U"\U000082B3"}, + {0x2F995, U"\U000082BD"}, + {0x2F996, U"\U000082E6"}, + {0x2F997, U"\U00026B3C"}, + {0x2F998, U"\U000082E5"}, + {0x2F999, U"\U0000831D"}, + {0x2F99A, U"\U00008363"}, + {0x2F99B, U"\U000083AD"}, + {0x2F99C, U"\U00008323"}, + {0x2F99D, U"\U000083BD"}, + {0x2F99E, U"\U000083E7"}, + {0x2F99F, U"\U00008457"}, + {0x2F9A0, U"\U00008353"}, + {0x2F9A1, U"\U000083CA"}, + {0x2F9A2, U"\U000083CC"}, + {0x2F9A3, U"\U000083DC"}, + {0x2F9A4, U"\U00026C36"}, + {0x2F9A5, U"\U00026D6B"}, + {0x2F9A6, U"\U00026CD5"}, + {0x2F9A7, U"\U0000452B"}, + {0x2F9A8, U"\U000084F1"}, + {0x2F9A9, U"\U000084F3"}, + {0x2F9AA, U"\U00008516"}, + {0x2F9AB, U"\U000273CA"}, + {0x2F9AC, U"\U00008564"}, + {0x2F9AD, U"\U00026F2C"}, + {0x2F9AE, U"\U0000455D"}, + {0x2F9AF, U"\U00004561"}, + {0x2F9B0, U"\U00026FB1"}, + {0x2F9B1, U"\U000270D2"}, + {0x2F9B2, U"\U0000456B"}, + {0x2F9B3, U"\U00008650"}, + {0x2F9B4, U"\U0000865C"}, + {0x2F9B5, U"\U00008667"}, + {0x2F9B6, U"\U00008669"}, + {0x2F9B7, U"\U000086A9"}, + {0x2F9B8, U"\U00008688"}, + {0x2F9B9, U"\U0000870E"}, + {0x2F9BA, U"\U000086E2"}, + {0x2F9BB, U"\U00008779"}, + {0x2F9BC, U"\U00008728"}, + {0x2F9BD, U"\U0000876B"}, + {0x2F9BE, U"\U00008786"}, + {0x2F9BF, U"\U000045D7"}, + {0x2F9C0, U"\U000087E1"}, + {0x2F9C1, U"\U00008801"}, + {0x2F9C2, U"\U000045F9"}, + {0x2F9C3, U"\U00008860"}, + {0x2F9C4, U"\U00008863"}, + {0x2F9C5, U"\U00027667"}, + {0x2F9C6, U"\U000088D7"}, + {0x2F9C7, U"\U000088DE"}, + {0x2F9C8, U"\U00004635"}, + {0x2F9C9, U"\U000088FA"}, + {0x2F9CA, U"\U000034BB"}, + {0x2F9CB, U"\U000278AE"}, + {0x2F9CC, U"\U00027966"}, + {0x2F9CD, U"\U000046BE"}, + {0x2F9CE, U"\U000046C7"}, + {0x2F9CF, U"\U00008AA0"}, + {0x2F9D0, U"\U00008AED"}, + {0x2F9D1, U"\U00008B8A"}, + {0x2F9D2, U"\U00008C55"}, + {0x2F9D3, U"\U00027CA8"}, + {0x2F9D4, U"\U00008CAB"}, + {0x2F9D5, U"\U00008CC1"}, + {0x2F9D6, U"\U00008D1B"}, + {0x2F9D7, U"\U00008D77"}, + {0x2F9D8, U"\U00027F2F"}, + {0x2F9D9, U"\U00020804"}, + {0x2F9DA, U"\U00008DCB"}, + {0x2F9DB, U"\U00008DBC"}, + {0x2F9DC, U"\U00008DF0"}, + {0x2F9DD, U"\U000208DE"}, + {0x2F9DE, U"\U00008ED4"}, + {0x2F9DF, U"\U00008F38"}, + {0x2F9E0, U"\U000285D2"}, + {0x2F9E1, U"\U000285ED"}, + {0x2F9E2, U"\U00009094"}, + {0x2F9E3, U"\U000090F1"}, + {0x2F9E4, U"\U00009111"}, + {0x2F9E5, U"\U0002872E"}, + {0x2F9E6, U"\U0000911B"}, + {0x2F9E7, U"\U00009238"}, + {0x2F9E8, U"\U000092D7"}, + {0x2F9E9, U"\U000092D8"}, + {0x2F9EA, U"\U0000927C"}, + {0x2F9EB, U"\U000093F9"}, + {0x2F9EC, U"\U00009415"}, + {0x2F9ED, U"\U00028BFA"}, + {0x2F9EE, U"\U0000958B"}, + {0x2F9EF, U"\U00004995"}, + {0x2F9F0, U"\U000095B7"}, + {0x2F9F1, U"\U00028D77"}, + {0x2F9F2, U"\U000049E6"}, + {0x2F9F3, U"\U000096C3"}, + {0x2F9F4, U"\U00005DB2"}, + {0x2F9F5, U"\U00009723"}, + {0x2F9F6, U"\U00029145"}, + {0x2F9F7, U"\U0002921A"}, + {0x2F9F8, U"\U00004A6E"}, + {0x2F9F9, U"\U00004A76"}, + {0x2F9FA, U"\U000097E0"}, + {0x2F9FB, U"\U0002940A"}, + {0x2F9FC, U"\U00004AB2"}, + {0x2F9FD, U"\U00029496"}, + {0x2F9FE, U"\U0000980B"}, + {0x2F9FF, U"\U0000980B"}, + {0x2FA00, U"\U00009829"}, + {0x2FA01, U"\U000295B6"}, + {0x2FA02, U"\U000098E2"}, + {0x2FA03, U"\U00004B33"}, + {0x2FA04, U"\U00009929"}, + {0x2FA05, U"\U000099A7"}, + {0x2FA06, U"\U000099C2"}, + {0x2FA07, U"\U000099FE"}, + {0x2FA08, U"\U00004BCE"}, + {0x2FA09, U"\U00029B30"}, + {0x2FA0A, U"\U00009B12"}, + {0x2FA0B, U"\U00009C40"}, + {0x2FA0C, U"\U00009CFD"}, + {0x2FA0D, U"\U00004CCE"}, + {0x2FA0E, U"\U00004CED"}, + {0x2FA0F, U"\U00009D67"}, + {0x2FA10, U"\U0002A0CE"}, + {0x2FA11, U"\U00004CF8"}, + {0x2FA12, U"\U0002A105"}, + {0x2FA13, U"\U0002A20E"}, + {0x2FA14, U"\U0002A291"}, + {0x2FA15, U"\U00009EBB"}, + {0x2FA16, U"\U00004D56"}, + {0x2FA17, U"\U00009EF9"}, + {0x2FA18, U"\U00009EFE"}, + {0x2FA19, U"\U00009F05"}, + {0x2FA1A, U"\U00009F0F"}, + {0x2FA1B, U"\U00009F16"}, + {0x2FA1C, U"\U00009F3B"}, + {0x2FA1D, U"\U0002A600"}, +}; + +static const CpCompose kCompose[] = { + {0x3C, 0x338, 0x226E}, {0x3D, 0x338, 0x2260}, {0x3E, 0x338, 0x226F}, {0x41, 0x300, 0xC0}, + {0x41, 0x301, 0xC1}, {0x41, 0x302, 0xC2}, {0x41, 0x303, 0xC3}, {0x41, 0x304, 0x100}, + {0x41, 0x306, 0x102}, {0x41, 0x307, 0x226}, {0x41, 0x308, 0xC4}, {0x41, 0x309, 0x1EA2}, + {0x41, 0x30A, 0xC5}, {0x41, 0x30C, 0x1CD}, {0x41, 0x30F, 0x200}, {0x41, 0x311, 0x202}, + {0x41, 0x323, 0x1EA0}, {0x41, 0x325, 0x1E00}, {0x41, 0x328, 0x104}, {0x42, 0x307, 0x1E02}, + {0x42, 0x323, 0x1E04}, {0x42, 0x331, 0x1E06}, {0x43, 0x301, 0x106}, {0x43, 0x302, 0x108}, + {0x43, 0x307, 0x10A}, {0x43, 0x30C, 0x10C}, {0x43, 0x327, 0xC7}, {0x44, 0x307, 0x1E0A}, + {0x44, 0x30C, 0x10E}, {0x44, 0x323, 0x1E0C}, {0x44, 0x327, 0x1E10}, {0x44, 0x32D, 0x1E12}, + {0x44, 0x331, 0x1E0E}, {0x45, 0x300, 0xC8}, {0x45, 0x301, 0xC9}, {0x45, 0x302, 0xCA}, + {0x45, 0x303, 0x1EBC}, {0x45, 0x304, 0x112}, {0x45, 0x306, 0x114}, {0x45, 0x307, 0x116}, + {0x45, 0x308, 0xCB}, {0x45, 0x309, 0x1EBA}, {0x45, 0x30C, 0x11A}, {0x45, 0x30F, 0x204}, + {0x45, 0x311, 0x206}, {0x45, 0x323, 0x1EB8}, {0x45, 0x327, 0x228}, {0x45, 0x328, 0x118}, + {0x45, 0x32D, 0x1E18}, {0x45, 0x330, 0x1E1A}, {0x46, 0x307, 0x1E1E}, {0x47, 0x301, 0x1F4}, + {0x47, 0x302, 0x11C}, {0x47, 0x304, 0x1E20}, {0x47, 0x306, 0x11E}, {0x47, 0x307, 0x120}, + {0x47, 0x30C, 0x1E6}, {0x47, 0x327, 0x122}, {0x48, 0x302, 0x124}, {0x48, 0x307, 0x1E22}, + {0x48, 0x308, 0x1E26}, {0x48, 0x30C, 0x21E}, {0x48, 0x323, 0x1E24}, {0x48, 0x327, 0x1E28}, + {0x48, 0x32E, 0x1E2A}, {0x49, 0x300, 0xCC}, {0x49, 0x301, 0xCD}, {0x49, 0x302, 0xCE}, + {0x49, 0x303, 0x128}, {0x49, 0x304, 0x12A}, {0x49, 0x306, 0x12C}, {0x49, 0x307, 0x130}, + {0x49, 0x308, 0xCF}, {0x49, 0x309, 0x1EC8}, {0x49, 0x30C, 0x1CF}, {0x49, 0x30F, 0x208}, + {0x49, 0x311, 0x20A}, {0x49, 0x323, 0x1ECA}, {0x49, 0x328, 0x12E}, {0x49, 0x330, 0x1E2C}, + {0x4A, 0x302, 0x134}, {0x4B, 0x301, 0x1E30}, {0x4B, 0x30C, 0x1E8}, {0x4B, 0x323, 0x1E32}, + {0x4B, 0x327, 0x136}, {0x4B, 0x331, 0x1E34}, {0x4C, 0x301, 0x139}, {0x4C, 0x30C, 0x13D}, + {0x4C, 0x323, 0x1E36}, {0x4C, 0x327, 0x13B}, {0x4C, 0x32D, 0x1E3C}, {0x4C, 0x331, 0x1E3A}, + {0x4D, 0x301, 0x1E3E}, {0x4D, 0x307, 0x1E40}, {0x4D, 0x323, 0x1E42}, {0x4E, 0x300, 0x1F8}, + {0x4E, 0x301, 0x143}, {0x4E, 0x303, 0xD1}, {0x4E, 0x307, 0x1E44}, {0x4E, 0x30C, 0x147}, + {0x4E, 0x323, 0x1E46}, {0x4E, 0x327, 0x145}, {0x4E, 0x32D, 0x1E4A}, {0x4E, 0x331, 0x1E48}, + {0x4F, 0x300, 0xD2}, {0x4F, 0x301, 0xD3}, {0x4F, 0x302, 0xD4}, {0x4F, 0x303, 0xD5}, + {0x4F, 0x304, 0x14C}, {0x4F, 0x306, 0x14E}, {0x4F, 0x307, 0x22E}, {0x4F, 0x308, 0xD6}, + {0x4F, 0x309, 0x1ECE}, {0x4F, 0x30B, 0x150}, {0x4F, 0x30C, 0x1D1}, {0x4F, 0x30F, 0x20C}, + {0x4F, 0x311, 0x20E}, {0x4F, 0x31B, 0x1A0}, {0x4F, 0x323, 0x1ECC}, {0x4F, 0x328, 0x1EA}, + {0x50, 0x301, 0x1E54}, {0x50, 0x307, 0x1E56}, {0x52, 0x301, 0x154}, {0x52, 0x307, 0x1E58}, + {0x52, 0x30C, 0x158}, {0x52, 0x30F, 0x210}, {0x52, 0x311, 0x212}, {0x52, 0x323, 0x1E5A}, + {0x52, 0x327, 0x156}, {0x52, 0x331, 0x1E5E}, {0x53, 0x301, 0x15A}, {0x53, 0x302, 0x15C}, + {0x53, 0x307, 0x1E60}, {0x53, 0x30C, 0x160}, {0x53, 0x323, 0x1E62}, {0x53, 0x326, 0x218}, + {0x53, 0x327, 0x15E}, {0x54, 0x307, 0x1E6A}, {0x54, 0x30C, 0x164}, {0x54, 0x323, 0x1E6C}, + {0x54, 0x326, 0x21A}, {0x54, 0x327, 0x162}, {0x54, 0x32D, 0x1E70}, {0x54, 0x331, 0x1E6E}, + {0x55, 0x300, 0xD9}, {0x55, 0x301, 0xDA}, {0x55, 0x302, 0xDB}, {0x55, 0x303, 0x168}, + {0x55, 0x304, 0x16A}, {0x55, 0x306, 0x16C}, {0x55, 0x308, 0xDC}, {0x55, 0x309, 0x1EE6}, + {0x55, 0x30A, 0x16E}, {0x55, 0x30B, 0x170}, {0x55, 0x30C, 0x1D3}, {0x55, 0x30F, 0x214}, + {0x55, 0x311, 0x216}, {0x55, 0x31B, 0x1AF}, {0x55, 0x323, 0x1EE4}, {0x55, 0x324, 0x1E72}, + {0x55, 0x328, 0x172}, {0x55, 0x32D, 0x1E76}, {0x55, 0x330, 0x1E74}, {0x56, 0x303, 0x1E7C}, + {0x56, 0x323, 0x1E7E}, {0x57, 0x300, 0x1E80}, {0x57, 0x301, 0x1E82}, {0x57, 0x302, 0x174}, + {0x57, 0x307, 0x1E86}, {0x57, 0x308, 0x1E84}, {0x57, 0x323, 0x1E88}, {0x58, 0x307, 0x1E8A}, + {0x58, 0x308, 0x1E8C}, {0x59, 0x300, 0x1EF2}, {0x59, 0x301, 0xDD}, {0x59, 0x302, 0x176}, + {0x59, 0x303, 0x1EF8}, {0x59, 0x304, 0x232}, {0x59, 0x307, 0x1E8E}, {0x59, 0x308, 0x178}, + {0x59, 0x309, 0x1EF6}, {0x59, 0x323, 0x1EF4}, {0x5A, 0x301, 0x179}, {0x5A, 0x302, 0x1E90}, + {0x5A, 0x307, 0x17B}, {0x5A, 0x30C, 0x17D}, {0x5A, 0x323, 0x1E92}, {0x5A, 0x331, 0x1E94}, + {0x61, 0x300, 0xE0}, {0x61, 0x301, 0xE1}, {0x61, 0x302, 0xE2}, {0x61, 0x303, 0xE3}, + {0x61, 0x304, 0x101}, {0x61, 0x306, 0x103}, {0x61, 0x307, 0x227}, {0x61, 0x308, 0xE4}, + {0x61, 0x309, 0x1EA3}, {0x61, 0x30A, 0xE5}, {0x61, 0x30C, 0x1CE}, {0x61, 0x30F, 0x201}, + {0x61, 0x311, 0x203}, {0x61, 0x323, 0x1EA1}, {0x61, 0x325, 0x1E01}, {0x61, 0x328, 0x105}, + {0x62, 0x307, 0x1E03}, {0x62, 0x323, 0x1E05}, {0x62, 0x331, 0x1E07}, {0x63, 0x301, 0x107}, + {0x63, 0x302, 0x109}, {0x63, 0x307, 0x10B}, {0x63, 0x30C, 0x10D}, {0x63, 0x327, 0xE7}, + {0x64, 0x307, 0x1E0B}, {0x64, 0x30C, 0x10F}, {0x64, 0x323, 0x1E0D}, {0x64, 0x327, 0x1E11}, + {0x64, 0x32D, 0x1E13}, {0x64, 0x331, 0x1E0F}, {0x65, 0x300, 0xE8}, {0x65, 0x301, 0xE9}, + {0x65, 0x302, 0xEA}, {0x65, 0x303, 0x1EBD}, {0x65, 0x304, 0x113}, {0x65, 0x306, 0x115}, + {0x65, 0x307, 0x117}, {0x65, 0x308, 0xEB}, {0x65, 0x309, 0x1EBB}, {0x65, 0x30C, 0x11B}, + {0x65, 0x30F, 0x205}, {0x65, 0x311, 0x207}, {0x65, 0x323, 0x1EB9}, {0x65, 0x327, 0x229}, + {0x65, 0x328, 0x119}, {0x65, 0x32D, 0x1E19}, {0x65, 0x330, 0x1E1B}, {0x66, 0x307, 0x1E1F}, + {0x67, 0x301, 0x1F5}, {0x67, 0x302, 0x11D}, {0x67, 0x304, 0x1E21}, {0x67, 0x306, 0x11F}, + {0x67, 0x307, 0x121}, {0x67, 0x30C, 0x1E7}, {0x67, 0x327, 0x123}, {0x68, 0x302, 0x125}, + {0x68, 0x307, 0x1E23}, {0x68, 0x308, 0x1E27}, {0x68, 0x30C, 0x21F}, {0x68, 0x323, 0x1E25}, + {0x68, 0x327, 0x1E29}, {0x68, 0x32E, 0x1E2B}, {0x68, 0x331, 0x1E96}, {0x69, 0x300, 0xEC}, + {0x69, 0x301, 0xED}, {0x69, 0x302, 0xEE}, {0x69, 0x303, 0x129}, {0x69, 0x304, 0x12B}, + {0x69, 0x306, 0x12D}, {0x69, 0x308, 0xEF}, {0x69, 0x309, 0x1EC9}, {0x69, 0x30C, 0x1D0}, + {0x69, 0x30F, 0x209}, {0x69, 0x311, 0x20B}, {0x69, 0x323, 0x1ECB}, {0x69, 0x328, 0x12F}, + {0x69, 0x330, 0x1E2D}, {0x6A, 0x302, 0x135}, {0x6A, 0x30C, 0x1F0}, {0x6B, 0x301, 0x1E31}, + {0x6B, 0x30C, 0x1E9}, {0x6B, 0x323, 0x1E33}, {0x6B, 0x327, 0x137}, {0x6B, 0x331, 0x1E35}, + {0x6C, 0x301, 0x13A}, {0x6C, 0x30C, 0x13E}, {0x6C, 0x323, 0x1E37}, {0x6C, 0x327, 0x13C}, + {0x6C, 0x32D, 0x1E3D}, {0x6C, 0x331, 0x1E3B}, {0x6D, 0x301, 0x1E3F}, {0x6D, 0x307, 0x1E41}, + {0x6D, 0x323, 0x1E43}, {0x6E, 0x300, 0x1F9}, {0x6E, 0x301, 0x144}, {0x6E, 0x303, 0xF1}, + {0x6E, 0x307, 0x1E45}, {0x6E, 0x30C, 0x148}, {0x6E, 0x323, 0x1E47}, {0x6E, 0x327, 0x146}, + {0x6E, 0x32D, 0x1E4B}, {0x6E, 0x331, 0x1E49}, {0x6F, 0x300, 0xF2}, {0x6F, 0x301, 0xF3}, + {0x6F, 0x302, 0xF4}, {0x6F, 0x303, 0xF5}, {0x6F, 0x304, 0x14D}, {0x6F, 0x306, 0x14F}, + {0x6F, 0x307, 0x22F}, {0x6F, 0x308, 0xF6}, {0x6F, 0x309, 0x1ECF}, {0x6F, 0x30B, 0x151}, + {0x6F, 0x30C, 0x1D2}, {0x6F, 0x30F, 0x20D}, {0x6F, 0x311, 0x20F}, {0x6F, 0x31B, 0x1A1}, + {0x6F, 0x323, 0x1ECD}, {0x6F, 0x328, 0x1EB}, {0x70, 0x301, 0x1E55}, {0x70, 0x307, 0x1E57}, + {0x72, 0x301, 0x155}, {0x72, 0x307, 0x1E59}, {0x72, 0x30C, 0x159}, {0x72, 0x30F, 0x211}, + {0x72, 0x311, 0x213}, {0x72, 0x323, 0x1E5B}, {0x72, 0x327, 0x157}, {0x72, 0x331, 0x1E5F}, + {0x73, 0x301, 0x15B}, {0x73, 0x302, 0x15D}, {0x73, 0x307, 0x1E61}, {0x73, 0x30C, 0x161}, + {0x73, 0x323, 0x1E63}, {0x73, 0x326, 0x219}, {0x73, 0x327, 0x15F}, {0x74, 0x307, 0x1E6B}, + {0x74, 0x308, 0x1E97}, {0x74, 0x30C, 0x165}, {0x74, 0x323, 0x1E6D}, {0x74, 0x326, 0x21B}, + {0x74, 0x327, 0x163}, {0x74, 0x32D, 0x1E71}, {0x74, 0x331, 0x1E6F}, {0x75, 0x300, 0xF9}, + {0x75, 0x301, 0xFA}, {0x75, 0x302, 0xFB}, {0x75, 0x303, 0x169}, {0x75, 0x304, 0x16B}, + {0x75, 0x306, 0x16D}, {0x75, 0x308, 0xFC}, {0x75, 0x309, 0x1EE7}, {0x75, 0x30A, 0x16F}, + {0x75, 0x30B, 0x171}, {0x75, 0x30C, 0x1D4}, {0x75, 0x30F, 0x215}, {0x75, 0x311, 0x217}, + {0x75, 0x31B, 0x1B0}, {0x75, 0x323, 0x1EE5}, {0x75, 0x324, 0x1E73}, {0x75, 0x328, 0x173}, + {0x75, 0x32D, 0x1E77}, {0x75, 0x330, 0x1E75}, {0x76, 0x303, 0x1E7D}, {0x76, 0x323, 0x1E7F}, + {0x77, 0x300, 0x1E81}, {0x77, 0x301, 0x1E83}, {0x77, 0x302, 0x175}, {0x77, 0x307, 0x1E87}, + {0x77, 0x308, 0x1E85}, {0x77, 0x30A, 0x1E98}, {0x77, 0x323, 0x1E89}, {0x78, 0x307, 0x1E8B}, + {0x78, 0x308, 0x1E8D}, {0x79, 0x300, 0x1EF3}, {0x79, 0x301, 0xFD}, {0x79, 0x302, 0x177}, + {0x79, 0x303, 0x1EF9}, {0x79, 0x304, 0x233}, {0x79, 0x307, 0x1E8F}, {0x79, 0x308, 0xFF}, + {0x79, 0x309, 0x1EF7}, {0x79, 0x30A, 0x1E99}, {0x79, 0x323, 0x1EF5}, {0x7A, 0x301, 0x17A}, + {0x7A, 0x302, 0x1E91}, {0x7A, 0x307, 0x17C}, {0x7A, 0x30C, 0x17E}, {0x7A, 0x323, 0x1E93}, + {0x7A, 0x331, 0x1E95}, {0xA8, 0x300, 0x1FED}, {0xA8, 0x301, 0x385}, {0xA8, 0x342, 0x1FC1}, + {0xC2, 0x300, 0x1EA6}, {0xC2, 0x301, 0x1EA4}, {0xC2, 0x303, 0x1EAA}, {0xC2, 0x309, 0x1EA8}, + {0xC4, 0x304, 0x1DE}, {0xC5, 0x301, 0x1FA}, {0xC6, 0x301, 0x1FC}, {0xC6, 0x304, 0x1E2}, + {0xC7, 0x301, 0x1E08}, {0xCA, 0x300, 0x1EC0}, {0xCA, 0x301, 0x1EBE}, {0xCA, 0x303, 0x1EC4}, + {0xCA, 0x309, 0x1EC2}, {0xCF, 0x301, 0x1E2E}, {0xD4, 0x300, 0x1ED2}, {0xD4, 0x301, 0x1ED0}, + {0xD4, 0x303, 0x1ED6}, {0xD4, 0x309, 0x1ED4}, {0xD5, 0x301, 0x1E4C}, {0xD5, 0x304, 0x22C}, + {0xD5, 0x308, 0x1E4E}, {0xD6, 0x304, 0x22A}, {0xD8, 0x301, 0x1FE}, {0xDC, 0x300, 0x1DB}, + {0xDC, 0x301, 0x1D7}, {0xDC, 0x304, 0x1D5}, {0xDC, 0x30C, 0x1D9}, {0xE2, 0x300, 0x1EA7}, + {0xE2, 0x301, 0x1EA5}, {0xE2, 0x303, 0x1EAB}, {0xE2, 0x309, 0x1EA9}, {0xE4, 0x304, 0x1DF}, + {0xE5, 0x301, 0x1FB}, {0xE6, 0x301, 0x1FD}, {0xE6, 0x304, 0x1E3}, {0xE7, 0x301, 0x1E09}, + {0xEA, 0x300, 0x1EC1}, {0xEA, 0x301, 0x1EBF}, {0xEA, 0x303, 0x1EC5}, {0xEA, 0x309, 0x1EC3}, + {0xEF, 0x301, 0x1E2F}, {0xF4, 0x300, 0x1ED3}, {0xF4, 0x301, 0x1ED1}, {0xF4, 0x303, 0x1ED7}, + {0xF4, 0x309, 0x1ED5}, {0xF5, 0x301, 0x1E4D}, {0xF5, 0x304, 0x22D}, {0xF5, 0x308, 0x1E4F}, + {0xF6, 0x304, 0x22B}, {0xF8, 0x301, 0x1FF}, {0xFC, 0x300, 0x1DC}, {0xFC, 0x301, 0x1D8}, + {0xFC, 0x304, 0x1D6}, {0xFC, 0x30C, 0x1DA}, {0x102, 0x300, 0x1EB0}, {0x102, 0x301, 0x1EAE}, + {0x102, 0x303, 0x1EB4}, {0x102, 0x309, 0x1EB2}, {0x103, 0x300, 0x1EB1}, {0x103, 0x301, 0x1EAF}, + {0x103, 0x303, 0x1EB5}, {0x103, 0x309, 0x1EB3}, {0x112, 0x300, 0x1E14}, {0x112, 0x301, 0x1E16}, + {0x113, 0x300, 0x1E15}, {0x113, 0x301, 0x1E17}, {0x14C, 0x300, 0x1E50}, {0x14C, 0x301, 0x1E52}, + {0x14D, 0x300, 0x1E51}, {0x14D, 0x301, 0x1E53}, {0x15A, 0x307, 0x1E64}, {0x15B, 0x307, 0x1E65}, + {0x160, 0x307, 0x1E66}, {0x161, 0x307, 0x1E67}, {0x168, 0x301, 0x1E78}, {0x169, 0x301, 0x1E79}, + {0x16A, 0x308, 0x1E7A}, {0x16B, 0x308, 0x1E7B}, {0x17F, 0x307, 0x1E9B}, {0x1A0, 0x300, 0x1EDC}, + {0x1A0, 0x301, 0x1EDA}, {0x1A0, 0x303, 0x1EE0}, {0x1A0, 0x309, 0x1EDE}, {0x1A0, 0x323, 0x1EE2}, + {0x1A1, 0x300, 0x1EDD}, {0x1A1, 0x301, 0x1EDB}, {0x1A1, 0x303, 0x1EE1}, {0x1A1, 0x309, 0x1EDF}, + {0x1A1, 0x323, 0x1EE3}, {0x1AF, 0x300, 0x1EEA}, {0x1AF, 0x301, 0x1EE8}, {0x1AF, 0x303, 0x1EEE}, + {0x1AF, 0x309, 0x1EEC}, {0x1AF, 0x323, 0x1EF0}, {0x1B0, 0x300, 0x1EEB}, {0x1B0, 0x301, 0x1EE9}, + {0x1B0, 0x303, 0x1EEF}, {0x1B0, 0x309, 0x1EED}, {0x1B0, 0x323, 0x1EF1}, {0x1B7, 0x30C, 0x1EE}, + {0x1EA, 0x304, 0x1EC}, {0x1EB, 0x304, 0x1ED}, {0x226, 0x304, 0x1E0}, {0x227, 0x304, 0x1E1}, + {0x228, 0x306, 0x1E1C}, {0x229, 0x306, 0x1E1D}, {0x22E, 0x304, 0x230}, {0x22F, 0x304, 0x231}, + {0x292, 0x30C, 0x1EF}, {0x391, 0x300, 0x1FBA}, {0x391, 0x301, 0x386}, {0x391, 0x304, 0x1FB9}, + {0x391, 0x306, 0x1FB8}, {0x391, 0x313, 0x1F08}, {0x391, 0x314, 0x1F09}, {0x391, 0x345, 0x1FBC}, + {0x395, 0x300, 0x1FC8}, {0x395, 0x301, 0x388}, {0x395, 0x313, 0x1F18}, {0x395, 0x314, 0x1F19}, + {0x397, 0x300, 0x1FCA}, {0x397, 0x301, 0x389}, {0x397, 0x313, 0x1F28}, {0x397, 0x314, 0x1F29}, + {0x397, 0x345, 0x1FCC}, {0x399, 0x300, 0x1FDA}, {0x399, 0x301, 0x38A}, {0x399, 0x304, 0x1FD9}, + {0x399, 0x306, 0x1FD8}, {0x399, 0x308, 0x3AA}, {0x399, 0x313, 0x1F38}, {0x399, 0x314, 0x1F39}, + {0x39F, 0x300, 0x1FF8}, {0x39F, 0x301, 0x38C}, {0x39F, 0x313, 0x1F48}, {0x39F, 0x314, 0x1F49}, + {0x3A1, 0x314, 0x1FEC}, {0x3A5, 0x300, 0x1FEA}, {0x3A5, 0x301, 0x38E}, {0x3A5, 0x304, 0x1FE9}, + {0x3A5, 0x306, 0x1FE8}, {0x3A5, 0x308, 0x3AB}, {0x3A5, 0x314, 0x1F59}, {0x3A9, 0x300, 0x1FFA}, + {0x3A9, 0x301, 0x38F}, {0x3A9, 0x313, 0x1F68}, {0x3A9, 0x314, 0x1F69}, {0x3A9, 0x345, 0x1FFC}, + {0x3AC, 0x345, 0x1FB4}, {0x3AE, 0x345, 0x1FC4}, {0x3B1, 0x300, 0x1F70}, {0x3B1, 0x301, 0x3AC}, + {0x3B1, 0x304, 0x1FB1}, {0x3B1, 0x306, 0x1FB0}, {0x3B1, 0x313, 0x1F00}, {0x3B1, 0x314, 0x1F01}, + {0x3B1, 0x342, 0x1FB6}, {0x3B1, 0x345, 0x1FB3}, {0x3B5, 0x300, 0x1F72}, {0x3B5, 0x301, 0x3AD}, + {0x3B5, 0x313, 0x1F10}, {0x3B5, 0x314, 0x1F11}, {0x3B7, 0x300, 0x1F74}, {0x3B7, 0x301, 0x3AE}, + {0x3B7, 0x313, 0x1F20}, {0x3B7, 0x314, 0x1F21}, {0x3B7, 0x342, 0x1FC6}, {0x3B7, 0x345, 0x1FC3}, + {0x3B9, 0x300, 0x1F76}, {0x3B9, 0x301, 0x3AF}, {0x3B9, 0x304, 0x1FD1}, {0x3B9, 0x306, 0x1FD0}, + {0x3B9, 0x308, 0x3CA}, {0x3B9, 0x313, 0x1F30}, {0x3B9, 0x314, 0x1F31}, {0x3B9, 0x342, 0x1FD6}, + {0x3BF, 0x300, 0x1F78}, {0x3BF, 0x301, 0x3CC}, {0x3BF, 0x313, 0x1F40}, {0x3BF, 0x314, 0x1F41}, + {0x3C1, 0x313, 0x1FE4}, {0x3C1, 0x314, 0x1FE5}, {0x3C5, 0x300, 0x1F7A}, {0x3C5, 0x301, 0x3CD}, + {0x3C5, 0x304, 0x1FE1}, {0x3C5, 0x306, 0x1FE0}, {0x3C5, 0x308, 0x3CB}, {0x3C5, 0x313, 0x1F50}, + {0x3C5, 0x314, 0x1F51}, {0x3C5, 0x342, 0x1FE6}, {0x3C9, 0x300, 0x1F7C}, {0x3C9, 0x301, 0x3CE}, + {0x3C9, 0x313, 0x1F60}, {0x3C9, 0x314, 0x1F61}, {0x3C9, 0x342, 0x1FF6}, {0x3C9, 0x345, 0x1FF3}, + {0x3CA, 0x300, 0x1FD2}, {0x3CA, 0x301, 0x390}, {0x3CA, 0x342, 0x1FD7}, {0x3CB, 0x300, 0x1FE2}, + {0x3CB, 0x301, 0x3B0}, {0x3CB, 0x342, 0x1FE7}, {0x3CE, 0x345, 0x1FF4}, {0x3D2, 0x301, 0x3D3}, + {0x3D2, 0x308, 0x3D4}, {0x406, 0x308, 0x407}, {0x410, 0x306, 0x4D0}, {0x410, 0x308, 0x4D2}, + {0x413, 0x301, 0x403}, {0x415, 0x300, 0x400}, {0x415, 0x306, 0x4D6}, {0x415, 0x308, 0x401}, + {0x416, 0x306, 0x4C1}, {0x416, 0x308, 0x4DC}, {0x417, 0x308, 0x4DE}, {0x418, 0x300, 0x40D}, + {0x418, 0x304, 0x4E2}, {0x418, 0x306, 0x419}, {0x418, 0x308, 0x4E4}, {0x41A, 0x301, 0x40C}, + {0x41E, 0x308, 0x4E6}, {0x423, 0x304, 0x4EE}, {0x423, 0x306, 0x40E}, {0x423, 0x308, 0x4F0}, + {0x423, 0x30B, 0x4F2}, {0x427, 0x308, 0x4F4}, {0x42B, 0x308, 0x4F8}, {0x42D, 0x308, 0x4EC}, + {0x430, 0x306, 0x4D1}, {0x430, 0x308, 0x4D3}, {0x433, 0x301, 0x453}, {0x435, 0x300, 0x450}, + {0x435, 0x306, 0x4D7}, {0x435, 0x308, 0x451}, {0x436, 0x306, 0x4C2}, {0x436, 0x308, 0x4DD}, + {0x437, 0x308, 0x4DF}, {0x438, 0x300, 0x45D}, {0x438, 0x304, 0x4E3}, {0x438, 0x306, 0x439}, + {0x438, 0x308, 0x4E5}, {0x43A, 0x301, 0x45C}, {0x43E, 0x308, 0x4E7}, {0x443, 0x304, 0x4EF}, + {0x443, 0x306, 0x45E}, {0x443, 0x308, 0x4F1}, {0x443, 0x30B, 0x4F3}, {0x447, 0x308, 0x4F5}, + {0x44B, 0x308, 0x4F9}, {0x44D, 0x308, 0x4ED}, {0x456, 0x308, 0x457}, {0x474, 0x30F, 0x476}, + {0x475, 0x30F, 0x477}, {0x4D8, 0x308, 0x4DA}, {0x4D9, 0x308, 0x4DB}, {0x4E8, 0x308, 0x4EA}, + {0x4E9, 0x308, 0x4EB}, {0x627, 0x653, 0x622}, {0x627, 0x654, 0x623}, {0x627, 0x655, 0x625}, + {0x648, 0x654, 0x624}, {0x64A, 0x654, 0x626}, {0x6C1, 0x654, 0x6C2}, {0x6D2, 0x654, 0x6D3}, + {0x6D5, 0x654, 0x6C0}, {0x928, 0x93C, 0x929}, {0x930, 0x93C, 0x931}, {0x933, 0x93C, 0x934}, + {0x9C7, 0x9BE, 0x9CB}, {0x9C7, 0x9D7, 0x9CC}, {0xB47, 0xB3E, 0xB4B}, {0xB47, 0xB56, 0xB48}, + {0xB47, 0xB57, 0xB4C}, {0xB92, 0xBD7, 0xB94}, {0xBC6, 0xBBE, 0xBCA}, {0xBC6, 0xBD7, 0xBCC}, + {0xBC7, 0xBBE, 0xBCB}, {0xC46, 0xC56, 0xC48}, {0xCBF, 0xCD5, 0xCC0}, {0xCC6, 0xCC2, 0xCCA}, + {0xCC6, 0xCD5, 0xCC7}, {0xCC6, 0xCD6, 0xCC8}, {0xCCA, 0xCD5, 0xCCB}, {0xD46, 0xD3E, 0xD4A}, + {0xD46, 0xD57, 0xD4C}, {0xD47, 0xD3E, 0xD4B}, {0xDD9, 0xDCA, 0xDDA}, {0xDD9, 0xDCF, 0xDDC}, + {0xDD9, 0xDDF, 0xDDE}, {0xDDC, 0xDCA, 0xDDD}, {0x1025, 0x102E, 0x1026}, {0x1B05, 0x1B35, 0x1B06}, + {0x1B07, 0x1B35, 0x1B08}, {0x1B09, 0x1B35, 0x1B0A}, {0x1B0B, 0x1B35, 0x1B0C}, {0x1B0D, 0x1B35, 0x1B0E}, + {0x1B11, 0x1B35, 0x1B12}, {0x1B3A, 0x1B35, 0x1B3B}, {0x1B3C, 0x1B35, 0x1B3D}, {0x1B3E, 0x1B35, 0x1B40}, + {0x1B3F, 0x1B35, 0x1B41}, {0x1B42, 0x1B35, 0x1B43}, {0x1E36, 0x304, 0x1E38}, {0x1E37, 0x304, 0x1E39}, + {0x1E5A, 0x304, 0x1E5C}, {0x1E5B, 0x304, 0x1E5D}, {0x1E62, 0x307, 0x1E68}, {0x1E63, 0x307, 0x1E69}, + {0x1EA0, 0x302, 0x1EAC}, {0x1EA0, 0x306, 0x1EB6}, {0x1EA1, 0x302, 0x1EAD}, {0x1EA1, 0x306, 0x1EB7}, + {0x1EB8, 0x302, 0x1EC6}, {0x1EB9, 0x302, 0x1EC7}, {0x1ECC, 0x302, 0x1ED8}, {0x1ECD, 0x302, 0x1ED9}, + {0x1F00, 0x300, 0x1F02}, {0x1F00, 0x301, 0x1F04}, {0x1F00, 0x342, 0x1F06}, {0x1F00, 0x345, 0x1F80}, + {0x1F01, 0x300, 0x1F03}, {0x1F01, 0x301, 0x1F05}, {0x1F01, 0x342, 0x1F07}, {0x1F01, 0x345, 0x1F81}, + {0x1F02, 0x345, 0x1F82}, {0x1F03, 0x345, 0x1F83}, {0x1F04, 0x345, 0x1F84}, {0x1F05, 0x345, 0x1F85}, + {0x1F06, 0x345, 0x1F86}, {0x1F07, 0x345, 0x1F87}, {0x1F08, 0x300, 0x1F0A}, {0x1F08, 0x301, 0x1F0C}, + {0x1F08, 0x342, 0x1F0E}, {0x1F08, 0x345, 0x1F88}, {0x1F09, 0x300, 0x1F0B}, {0x1F09, 0x301, 0x1F0D}, + {0x1F09, 0x342, 0x1F0F}, {0x1F09, 0x345, 0x1F89}, {0x1F0A, 0x345, 0x1F8A}, {0x1F0B, 0x345, 0x1F8B}, + {0x1F0C, 0x345, 0x1F8C}, {0x1F0D, 0x345, 0x1F8D}, {0x1F0E, 0x345, 0x1F8E}, {0x1F0F, 0x345, 0x1F8F}, + {0x1F10, 0x300, 0x1F12}, {0x1F10, 0x301, 0x1F14}, {0x1F11, 0x300, 0x1F13}, {0x1F11, 0x301, 0x1F15}, + {0x1F18, 0x300, 0x1F1A}, {0x1F18, 0x301, 0x1F1C}, {0x1F19, 0x300, 0x1F1B}, {0x1F19, 0x301, 0x1F1D}, + {0x1F20, 0x300, 0x1F22}, {0x1F20, 0x301, 0x1F24}, {0x1F20, 0x342, 0x1F26}, {0x1F20, 0x345, 0x1F90}, + {0x1F21, 0x300, 0x1F23}, {0x1F21, 0x301, 0x1F25}, {0x1F21, 0x342, 0x1F27}, {0x1F21, 0x345, 0x1F91}, + {0x1F22, 0x345, 0x1F92}, {0x1F23, 0x345, 0x1F93}, {0x1F24, 0x345, 0x1F94}, {0x1F25, 0x345, 0x1F95}, + {0x1F26, 0x345, 0x1F96}, {0x1F27, 0x345, 0x1F97}, {0x1F28, 0x300, 0x1F2A}, {0x1F28, 0x301, 0x1F2C}, + {0x1F28, 0x342, 0x1F2E}, {0x1F28, 0x345, 0x1F98}, {0x1F29, 0x300, 0x1F2B}, {0x1F29, 0x301, 0x1F2D}, + {0x1F29, 0x342, 0x1F2F}, {0x1F29, 0x345, 0x1F99}, {0x1F2A, 0x345, 0x1F9A}, {0x1F2B, 0x345, 0x1F9B}, + {0x1F2C, 0x345, 0x1F9C}, {0x1F2D, 0x345, 0x1F9D}, {0x1F2E, 0x345, 0x1F9E}, {0x1F2F, 0x345, 0x1F9F}, + {0x1F30, 0x300, 0x1F32}, {0x1F30, 0x301, 0x1F34}, {0x1F30, 0x342, 0x1F36}, {0x1F31, 0x300, 0x1F33}, + {0x1F31, 0x301, 0x1F35}, {0x1F31, 0x342, 0x1F37}, {0x1F38, 0x300, 0x1F3A}, {0x1F38, 0x301, 0x1F3C}, + {0x1F38, 0x342, 0x1F3E}, {0x1F39, 0x300, 0x1F3B}, {0x1F39, 0x301, 0x1F3D}, {0x1F39, 0x342, 0x1F3F}, + {0x1F40, 0x300, 0x1F42}, {0x1F40, 0x301, 0x1F44}, {0x1F41, 0x300, 0x1F43}, {0x1F41, 0x301, 0x1F45}, + {0x1F48, 0x300, 0x1F4A}, {0x1F48, 0x301, 0x1F4C}, {0x1F49, 0x300, 0x1F4B}, {0x1F49, 0x301, 0x1F4D}, + {0x1F50, 0x300, 0x1F52}, {0x1F50, 0x301, 0x1F54}, {0x1F50, 0x342, 0x1F56}, {0x1F51, 0x300, 0x1F53}, + {0x1F51, 0x301, 0x1F55}, {0x1F51, 0x342, 0x1F57}, {0x1F59, 0x300, 0x1F5B}, {0x1F59, 0x301, 0x1F5D}, + {0x1F59, 0x342, 0x1F5F}, {0x1F60, 0x300, 0x1F62}, {0x1F60, 0x301, 0x1F64}, {0x1F60, 0x342, 0x1F66}, + {0x1F60, 0x345, 0x1FA0}, {0x1F61, 0x300, 0x1F63}, {0x1F61, 0x301, 0x1F65}, {0x1F61, 0x342, 0x1F67}, + {0x1F61, 0x345, 0x1FA1}, {0x1F62, 0x345, 0x1FA2}, {0x1F63, 0x345, 0x1FA3}, {0x1F64, 0x345, 0x1FA4}, + {0x1F65, 0x345, 0x1FA5}, {0x1F66, 0x345, 0x1FA6}, {0x1F67, 0x345, 0x1FA7}, {0x1F68, 0x300, 0x1F6A}, + {0x1F68, 0x301, 0x1F6C}, {0x1F68, 0x342, 0x1F6E}, {0x1F68, 0x345, 0x1FA8}, {0x1F69, 0x300, 0x1F6B}, + {0x1F69, 0x301, 0x1F6D}, {0x1F69, 0x342, 0x1F6F}, {0x1F69, 0x345, 0x1FA9}, {0x1F6A, 0x345, 0x1FAA}, + {0x1F6B, 0x345, 0x1FAB}, {0x1F6C, 0x345, 0x1FAC}, {0x1F6D, 0x345, 0x1FAD}, {0x1F6E, 0x345, 0x1FAE}, + {0x1F6F, 0x345, 0x1FAF}, {0x1F70, 0x345, 0x1FB2}, {0x1F74, 0x345, 0x1FC2}, {0x1F7C, 0x345, 0x1FF2}, + {0x1FB6, 0x345, 0x1FB7}, {0x1FBF, 0x300, 0x1FCD}, {0x1FBF, 0x301, 0x1FCE}, {0x1FBF, 0x342, 0x1FCF}, + {0x1FC6, 0x345, 0x1FC7}, {0x1FF6, 0x345, 0x1FF7}, {0x1FFE, 0x300, 0x1FDD}, {0x1FFE, 0x301, 0x1FDE}, + {0x1FFE, 0x342, 0x1FDF}, {0x2190, 0x338, 0x219A}, {0x2192, 0x338, 0x219B}, {0x2194, 0x338, 0x21AE}, + {0x21D0, 0x338, 0x21CD}, {0x21D2, 0x338, 0x21CF}, {0x21D4, 0x338, 0x21CE}, {0x2203, 0x338, 0x2204}, + {0x2208, 0x338, 0x2209}, {0x220B, 0x338, 0x220C}, {0x2223, 0x338, 0x2224}, {0x2225, 0x338, 0x2226}, + {0x223C, 0x338, 0x2241}, {0x2243, 0x338, 0x2244}, {0x2245, 0x338, 0x2247}, {0x2248, 0x338, 0x2249}, + {0x224D, 0x338, 0x226D}, {0x2261, 0x338, 0x2262}, {0x2264, 0x338, 0x2270}, {0x2265, 0x338, 0x2271}, + {0x2272, 0x338, 0x2274}, {0x2273, 0x338, 0x2275}, {0x2276, 0x338, 0x2278}, {0x2277, 0x338, 0x2279}, + {0x227A, 0x338, 0x2280}, {0x227B, 0x338, 0x2281}, {0x227C, 0x338, 0x22E0}, {0x227D, 0x338, 0x22E1}, + {0x2282, 0x338, 0x2284}, {0x2283, 0x338, 0x2285}, {0x2286, 0x338, 0x2288}, {0x2287, 0x338, 0x2289}, + {0x2291, 0x338, 0x22E2}, {0x2292, 0x338, 0x22E3}, {0x22A2, 0x338, 0x22AC}, {0x22A8, 0x338, 0x22AD}, + {0x22A9, 0x338, 0x22AE}, {0x22AB, 0x338, 0x22AF}, {0x22B2, 0x338, 0x22EA}, {0x22B3, 0x338, 0x22EB}, + {0x22B4, 0x338, 0x22EC}, {0x22B5, 0x338, 0x22ED}, {0x3046, 0x3099, 0x3094}, {0x304B, 0x3099, 0x304C}, + {0x304D, 0x3099, 0x304E}, {0x304F, 0x3099, 0x3050}, {0x3051, 0x3099, 0x3052}, {0x3053, 0x3099, 0x3054}, + {0x3055, 0x3099, 0x3056}, {0x3057, 0x3099, 0x3058}, {0x3059, 0x3099, 0x305A}, {0x305B, 0x3099, 0x305C}, + {0x305D, 0x3099, 0x305E}, {0x305F, 0x3099, 0x3060}, {0x3061, 0x3099, 0x3062}, {0x3064, 0x3099, 0x3065}, + {0x3066, 0x3099, 0x3067}, {0x3068, 0x3099, 0x3069}, {0x306F, 0x3099, 0x3070}, {0x306F, 0x309A, 0x3071}, + {0x3072, 0x3099, 0x3073}, {0x3072, 0x309A, 0x3074}, {0x3075, 0x3099, 0x3076}, {0x3075, 0x309A, 0x3077}, + {0x3078, 0x3099, 0x3079}, {0x3078, 0x309A, 0x307A}, {0x307B, 0x3099, 0x307C}, {0x307B, 0x309A, 0x307D}, + {0x309D, 0x3099, 0x309E}, {0x30A6, 0x3099, 0x30F4}, {0x30AB, 0x3099, 0x30AC}, {0x30AD, 0x3099, 0x30AE}, + {0x30AF, 0x3099, 0x30B0}, {0x30B1, 0x3099, 0x30B2}, {0x30B3, 0x3099, 0x30B4}, {0x30B5, 0x3099, 0x30B6}, + {0x30B7, 0x3099, 0x30B8}, {0x30B9, 0x3099, 0x30BA}, {0x30BB, 0x3099, 0x30BC}, {0x30BD, 0x3099, 0x30BE}, + {0x30BF, 0x3099, 0x30C0}, {0x30C1, 0x3099, 0x30C2}, {0x30C4, 0x3099, 0x30C5}, {0x30C6, 0x3099, 0x30C7}, + {0x30C8, 0x3099, 0x30C9}, {0x30CF, 0x3099, 0x30D0}, {0x30CF, 0x309A, 0x30D1}, {0x30D2, 0x3099, 0x30D3}, + {0x30D2, 0x309A, 0x30D4}, {0x30D5, 0x3099, 0x30D6}, {0x30D5, 0x309A, 0x30D7}, {0x30D8, 0x3099, 0x30D9}, + {0x30D8, 0x309A, 0x30DA}, {0x30DB, 0x3099, 0x30DC}, {0x30DB, 0x309A, 0x30DD}, {0x30EF, 0x3099, 0x30F7}, + {0x30F0, 0x3099, 0x30F8}, {0x30F1, 0x3099, 0x30F9}, {0x30F2, 0x3099, 0x30FA}, {0x30FD, 0x3099, 0x30FE}, + {0x11099, 0x110BA, 0x1109A}, {0x1109B, 0x110BA, 0x1109C}, {0x110A5, 0x110BA, 0x110AB}, {0x11131, 0x11127, 0x1112E}, + {0x11132, 0x11127, 0x1112F}, {0x11347, 0x1133E, 0x1134B}, {0x11347, 0x11357, 0x1134C}, {0x114B9, 0x114B0, 0x114BC}, + {0x114B9, 0x114BA, 0x114BB}, {0x114B9, 0x114BD, 0x114BE}, {0x115B8, 0x115AF, 0x115BA}, {0x115B9, 0x115AF, 0x115BB}, + {0x11935, 0x11930, 0x11938}, +}; + +static const CpMap kCombiningClass[] = { + {0x300, 230}, {0x301, 230}, {0x302, 230}, {0x303, 230}, {0x304, 230}, {0x305, 230}, {0x306, 230}, {0x307, 230}, + {0x308, 230}, {0x309, 230}, {0x30A, 230}, {0x30B, 230}, {0x30C, 230}, {0x30D, 230}, {0x30E, 230}, {0x30F, 230}, + {0x310, 230}, {0x311, 230}, {0x312, 230}, {0x313, 230}, {0x314, 230}, {0x315, 232}, {0x316, 220}, {0x317, 220}, + {0x318, 220}, {0x319, 220}, {0x31A, 232}, {0x31B, 216}, {0x31C, 220}, {0x31D, 220}, {0x31E, 220}, {0x31F, 220}, + {0x320, 220}, {0x321, 202}, {0x322, 202}, {0x323, 220}, {0x324, 220}, {0x325, 220}, {0x326, 220}, {0x327, 202}, + {0x328, 202}, {0x329, 220}, {0x32A, 220}, {0x32B, 220}, {0x32C, 220}, {0x32D, 220}, {0x32E, 220}, {0x32F, 220}, + {0x330, 220}, {0x331, 220}, {0x332, 220}, {0x333, 220}, {0x334, 1}, {0x335, 1}, {0x336, 1}, {0x337, 1}, + {0x338, 1}, {0x339, 220}, {0x33A, 220}, {0x33B, 220}, {0x33C, 220}, {0x33D, 230}, {0x33E, 230}, {0x33F, 230}, + {0x340, 230}, {0x341, 230}, {0x342, 230}, {0x343, 230}, {0x344, 230}, {0x345, 240}, {0x346, 230}, {0x347, 220}, + {0x348, 220}, {0x349, 220}, {0x34A, 230}, {0x34B, 230}, {0x34C, 230}, {0x34D, 220}, {0x34E, 220}, {0x350, 230}, + {0x351, 230}, {0x352, 230}, {0x353, 220}, {0x354, 220}, {0x355, 220}, {0x356, 220}, {0x357, 230}, {0x358, 232}, + {0x359, 220}, {0x35A, 220}, {0x35B, 230}, {0x35C, 233}, {0x35D, 234}, {0x35E, 234}, {0x35F, 233}, {0x360, 234}, + {0x361, 234}, {0x362, 233}, {0x363, 230}, {0x364, 230}, {0x365, 230}, {0x366, 230}, {0x367, 230}, {0x368, 230}, + {0x369, 230}, {0x36A, 230}, {0x36B, 230}, {0x36C, 230}, {0x36D, 230}, {0x36E, 230}, {0x36F, 230}, {0x483, 230}, + {0x484, 230}, {0x485, 230}, {0x486, 230}, {0x487, 230}, {0x591, 220}, {0x592, 230}, {0x593, 230}, {0x594, 230}, + {0x595, 230}, {0x596, 220}, {0x597, 230}, {0x598, 230}, {0x599, 230}, {0x59A, 222}, {0x59B, 220}, {0x59C, 230}, + {0x59D, 230}, {0x59E, 230}, {0x59F, 230}, {0x5A0, 230}, {0x5A1, 230}, {0x5A2, 220}, {0x5A3, 220}, {0x5A4, 220}, + {0x5A5, 220}, {0x5A6, 220}, {0x5A7, 220}, {0x5A8, 230}, {0x5A9, 230}, {0x5AA, 220}, {0x5AB, 230}, {0x5AC, 230}, + {0x5AD, 222}, {0x5AE, 228}, {0x5AF, 230}, {0x5B0, 10}, {0x5B1, 11}, {0x5B2, 12}, {0x5B3, 13}, {0x5B4, 14}, + {0x5B5, 15}, {0x5B6, 16}, {0x5B7, 17}, {0x5B8, 18}, {0x5B9, 19}, {0x5BA, 19}, {0x5BB, 20}, {0x5BC, 21}, + {0x5BD, 22}, {0x5BF, 23}, {0x5C1, 24}, {0x5C2, 25}, {0x5C4, 230}, {0x5C5, 220}, {0x5C7, 18}, {0x610, 230}, + {0x611, 230}, {0x612, 230}, {0x613, 230}, {0x614, 230}, {0x615, 230}, {0x616, 230}, {0x617, 230}, {0x618, 30}, + {0x619, 31}, {0x61A, 32}, {0x64B, 27}, {0x64C, 28}, {0x64D, 29}, {0x64E, 30}, {0x64F, 31}, {0x650, 32}, + {0x651, 33}, {0x652, 34}, {0x653, 230}, {0x654, 230}, {0x655, 220}, {0x656, 220}, {0x657, 230}, {0x658, 230}, + {0x659, 230}, {0x65A, 230}, {0x65B, 230}, {0x65C, 220}, {0x65D, 230}, {0x65E, 230}, {0x65F, 220}, {0x670, 35}, + {0x6D6, 230}, {0x6D7, 230}, {0x6D8, 230}, {0x6D9, 230}, {0x6DA, 230}, {0x6DB, 230}, {0x6DC, 230}, {0x6DF, 230}, + {0x6E0, 230}, {0x6E1, 230}, {0x6E2, 230}, {0x6E3, 220}, {0x6E4, 230}, {0x6E7, 230}, {0x6E8, 230}, {0x6EA, 220}, + {0x6EB, 230}, {0x6EC, 230}, {0x6ED, 220}, {0x711, 36}, {0x730, 230}, {0x731, 220}, {0x732, 230}, {0x733, 230}, + {0x734, 220}, {0x735, 230}, {0x736, 230}, {0x737, 220}, {0x738, 220}, {0x739, 220}, {0x73A, 230}, {0x73B, 220}, + {0x73C, 220}, {0x73D, 230}, {0x73E, 220}, {0x73F, 230}, {0x740, 230}, {0x741, 230}, {0x742, 220}, {0x743, 230}, + {0x744, 220}, {0x745, 230}, {0x746, 220}, {0x747, 230}, {0x748, 220}, {0x749, 230}, {0x74A, 230}, {0x7EB, 230}, + {0x7EC, 230}, {0x7ED, 230}, {0x7EE, 230}, {0x7EF, 230}, {0x7F0, 230}, {0x7F1, 230}, {0x7F2, 220}, {0x7F3, 230}, + {0x7FD, 220}, {0x816, 230}, {0x817, 230}, {0x818, 230}, {0x819, 230}, {0x81B, 230}, {0x81C, 230}, {0x81D, 230}, + {0x81E, 230}, {0x81F, 230}, {0x820, 230}, {0x821, 230}, {0x822, 230}, {0x823, 230}, {0x825, 230}, {0x826, 230}, + {0x827, 230}, {0x829, 230}, {0x82A, 230}, {0x82B, 230}, {0x82C, 230}, {0x82D, 230}, {0x859, 220}, {0x85A, 220}, + {0x85B, 220}, {0x898, 230}, {0x899, 220}, {0x89A, 220}, {0x89B, 220}, {0x89C, 230}, {0x89D, 230}, {0x89E, 230}, + {0x89F, 230}, {0x8CA, 230}, {0x8CB, 230}, {0x8CC, 230}, {0x8CD, 230}, {0x8CE, 230}, {0x8CF, 220}, {0x8D0, 220}, + {0x8D1, 220}, {0x8D2, 220}, {0x8D3, 220}, {0x8D4, 230}, {0x8D5, 230}, {0x8D6, 230}, {0x8D7, 230}, {0x8D8, 230}, + {0x8D9, 230}, {0x8DA, 230}, {0x8DB, 230}, {0x8DC, 230}, {0x8DD, 230}, {0x8DE, 230}, {0x8DF, 230}, {0x8E0, 230}, + {0x8E1, 230}, {0x8E3, 220}, {0x8E4, 230}, {0x8E5, 230}, {0x8E6, 220}, {0x8E7, 230}, {0x8E8, 230}, {0x8E9, 220}, + {0x8EA, 230}, {0x8EB, 230}, {0x8EC, 230}, {0x8ED, 220}, {0x8EE, 220}, {0x8EF, 220}, {0x8F0, 27}, {0x8F1, 28}, + {0x8F2, 29}, {0x8F3, 230}, {0x8F4, 230}, {0x8F5, 230}, {0x8F6, 220}, {0x8F7, 230}, {0x8F8, 230}, {0x8F9, 220}, + {0x8FA, 220}, {0x8FB, 230}, {0x8FC, 230}, {0x8FD, 230}, {0x8FE, 230}, {0x8FF, 230}, {0x93C, 7}, {0x94D, 9}, + {0x951, 230}, {0x952, 220}, {0x953, 230}, {0x954, 230}, {0x9BC, 7}, {0x9CD, 9}, {0x9FE, 230}, {0xA3C, 7}, + {0xA4D, 9}, {0xABC, 7}, {0xACD, 9}, {0xB3C, 7}, {0xB4D, 9}, {0xBCD, 9}, {0xC3C, 7}, {0xC4D, 9}, + {0xC55, 84}, {0xC56, 91}, {0xCBC, 7}, {0xCCD, 9}, {0xD3B, 9}, {0xD3C, 9}, {0xD4D, 9}, {0xDCA, 9}, + {0xE38, 103}, {0xE39, 103}, {0xE3A, 9}, {0xE48, 107}, {0xE49, 107}, {0xE4A, 107}, {0xE4B, 107}, {0xEB8, 118}, + {0xEB9, 118}, {0xEBA, 9}, {0xEC8, 122}, {0xEC9, 122}, {0xECA, 122}, {0xECB, 122}, {0xF18, 220}, {0xF19, 220}, + {0xF35, 220}, {0xF37, 220}, {0xF39, 216}, {0xF71, 129}, {0xF72, 130}, {0xF74, 132}, {0xF7A, 130}, {0xF7B, 130}, + {0xF7C, 130}, {0xF7D, 130}, {0xF80, 130}, {0xF82, 230}, {0xF83, 230}, {0xF84, 9}, {0xF86, 230}, {0xF87, 230}, + {0xFC6, 220}, {0x1037, 7}, {0x1039, 9}, {0x103A, 9}, {0x108D, 220}, {0x135D, 230}, {0x135E, 230}, {0x135F, 230}, + {0x1714, 9}, {0x1715, 9}, {0x1734, 9}, {0x17D2, 9}, {0x17DD, 230}, {0x18A9, 228}, {0x1939, 222}, {0x193A, 230}, + {0x193B, 220}, {0x1A17, 230}, {0x1A18, 220}, {0x1A60, 9}, {0x1A75, 230}, {0x1A76, 230}, {0x1A77, 230}, {0x1A78, 230}, + {0x1A79, 230}, {0x1A7A, 230}, {0x1A7B, 230}, {0x1A7C, 230}, {0x1A7F, 220}, {0x1AB0, 230}, {0x1AB1, 230}, {0x1AB2, 230}, + {0x1AB3, 230}, {0x1AB4, 230}, {0x1AB5, 220}, {0x1AB6, 220}, {0x1AB7, 220}, {0x1AB8, 220}, {0x1AB9, 220}, {0x1ABA, 220}, + {0x1ABB, 230}, {0x1ABC, 230}, {0x1ABD, 220}, {0x1ABF, 220}, {0x1AC0, 220}, {0x1AC1, 230}, {0x1AC2, 230}, {0x1AC3, 220}, + {0x1AC4, 220}, {0x1AC5, 230}, {0x1AC6, 230}, {0x1AC7, 230}, {0x1AC8, 230}, {0x1AC9, 230}, {0x1ACA, 220}, {0x1ACB, 230}, + {0x1ACC, 230}, {0x1ACD, 230}, {0x1ACE, 230}, {0x1B34, 7}, {0x1B44, 9}, {0x1B6B, 230}, {0x1B6C, 220}, {0x1B6D, 230}, + {0x1B6E, 230}, {0x1B6F, 230}, {0x1B70, 230}, {0x1B71, 230}, {0x1B72, 230}, {0x1B73, 230}, {0x1BAA, 9}, {0x1BAB, 9}, + {0x1BE6, 7}, {0x1BF2, 9}, {0x1BF3, 9}, {0x1C37, 7}, {0x1CD0, 230}, {0x1CD1, 230}, {0x1CD2, 230}, {0x1CD4, 1}, + {0x1CD5, 220}, {0x1CD6, 220}, {0x1CD7, 220}, {0x1CD8, 220}, {0x1CD9, 220}, {0x1CDA, 230}, {0x1CDB, 230}, {0x1CDC, 220}, + {0x1CDD, 220}, {0x1CDE, 220}, {0x1CDF, 220}, {0x1CE0, 230}, {0x1CE2, 1}, {0x1CE3, 1}, {0x1CE4, 1}, {0x1CE5, 1}, + {0x1CE6, 1}, {0x1CE7, 1}, {0x1CE8, 1}, {0x1CED, 220}, {0x1CF4, 230}, {0x1CF8, 230}, {0x1CF9, 230}, {0x1DC0, 230}, + {0x1DC1, 230}, {0x1DC2, 220}, {0x1DC3, 230}, {0x1DC4, 230}, {0x1DC5, 230}, {0x1DC6, 230}, {0x1DC7, 230}, {0x1DC8, 230}, + {0x1DC9, 230}, {0x1DCA, 220}, {0x1DCB, 230}, {0x1DCC, 230}, {0x1DCD, 234}, {0x1DCE, 214}, {0x1DCF, 220}, {0x1DD0, 202}, + {0x1DD1, 230}, {0x1DD2, 230}, {0x1DD3, 230}, {0x1DD4, 230}, {0x1DD5, 230}, {0x1DD6, 230}, {0x1DD7, 230}, {0x1DD8, 230}, + {0x1DD9, 230}, {0x1DDA, 230}, {0x1DDB, 230}, {0x1DDC, 230}, {0x1DDD, 230}, {0x1DDE, 230}, {0x1DDF, 230}, {0x1DE0, 230}, + {0x1DE1, 230}, {0x1DE2, 230}, {0x1DE3, 230}, {0x1DE4, 230}, {0x1DE5, 230}, {0x1DE6, 230}, {0x1DE7, 230}, {0x1DE8, 230}, + {0x1DE9, 230}, {0x1DEA, 230}, {0x1DEB, 230}, {0x1DEC, 230}, {0x1DED, 230}, {0x1DEE, 230}, {0x1DEF, 230}, {0x1DF0, 230}, + {0x1DF1, 230}, {0x1DF2, 230}, {0x1DF3, 230}, {0x1DF4, 230}, {0x1DF5, 230}, {0x1DF6, 232}, {0x1DF7, 228}, {0x1DF8, 228}, + {0x1DF9, 220}, {0x1DFA, 218}, {0x1DFB, 230}, {0x1DFC, 233}, {0x1DFD, 220}, {0x1DFE, 230}, {0x1DFF, 220}, {0x20D0, 230}, + {0x20D1, 230}, {0x20D2, 1}, {0x20D3, 1}, {0x20D4, 230}, {0x20D5, 230}, {0x20D6, 230}, {0x20D7, 230}, {0x20D8, 1}, + {0x20D9, 1}, {0x20DA, 1}, {0x20DB, 230}, {0x20DC, 230}, {0x20E1, 230}, {0x20E5, 1}, {0x20E6, 1}, {0x20E7, 230}, + {0x20E8, 220}, {0x20E9, 230}, {0x20EA, 1}, {0x20EB, 1}, {0x20EC, 220}, {0x20ED, 220}, {0x20EE, 220}, {0x20EF, 220}, + {0x20F0, 230}, {0x2CEF, 230}, {0x2CF0, 230}, {0x2CF1, 230}, {0x2D7F, 9}, {0x2DE0, 230}, {0x2DE1, 230}, {0x2DE2, 230}, + {0x2DE3, 230}, {0x2DE4, 230}, {0x2DE5, 230}, {0x2DE6, 230}, {0x2DE7, 230}, {0x2DE8, 230}, {0x2DE9, 230}, {0x2DEA, 230}, + {0x2DEB, 230}, {0x2DEC, 230}, {0x2DED, 230}, {0x2DEE, 230}, {0x2DEF, 230}, {0x2DF0, 230}, {0x2DF1, 230}, {0x2DF2, 230}, + {0x2DF3, 230}, {0x2DF4, 230}, {0x2DF5, 230}, {0x2DF6, 230}, {0x2DF7, 230}, {0x2DF8, 230}, {0x2DF9, 230}, {0x2DFA, 230}, + {0x2DFB, 230}, {0x2DFC, 230}, {0x2DFD, 230}, {0x2DFE, 230}, {0x2DFF, 230}, {0x302A, 218}, {0x302B, 228}, {0x302C, 232}, + {0x302D, 222}, {0x302E, 224}, {0x302F, 224}, {0x3099, 8}, {0x309A, 8}, {0xA66F, 230}, {0xA674, 230}, {0xA675, 230}, + {0xA676, 230}, {0xA677, 230}, {0xA678, 230}, {0xA679, 230}, {0xA67A, 230}, {0xA67B, 230}, {0xA67C, 230}, {0xA67D, 230}, + {0xA69E, 230}, {0xA69F, 230}, {0xA6F0, 230}, {0xA6F1, 230}, {0xA806, 9}, {0xA82C, 9}, {0xA8C4, 9}, {0xA8E0, 230}, + {0xA8E1, 230}, {0xA8E2, 230}, {0xA8E3, 230}, {0xA8E4, 230}, {0xA8E5, 230}, {0xA8E6, 230}, {0xA8E7, 230}, {0xA8E8, 230}, + {0xA8E9, 230}, {0xA8EA, 230}, {0xA8EB, 230}, {0xA8EC, 230}, {0xA8ED, 230}, {0xA8EE, 230}, {0xA8EF, 230}, {0xA8F0, 230}, + {0xA8F1, 230}, {0xA92B, 220}, {0xA92C, 220}, {0xA92D, 220}, {0xA953, 9}, {0xA9B3, 7}, {0xA9C0, 9}, {0xAAB0, 230}, + {0xAAB2, 230}, {0xAAB3, 230}, {0xAAB4, 220}, {0xAAB7, 230}, {0xAAB8, 230}, {0xAABE, 230}, {0xAABF, 230}, {0xAAC1, 230}, + {0xAAF6, 9}, {0xABED, 9}, {0xFB1E, 26}, {0xFE20, 230}, {0xFE21, 230}, {0xFE22, 230}, {0xFE23, 230}, {0xFE24, 230}, + {0xFE25, 230}, {0xFE26, 230}, {0xFE27, 220}, {0xFE28, 220}, {0xFE29, 220}, {0xFE2A, 220}, {0xFE2B, 220}, {0xFE2C, 220}, + {0xFE2D, 220}, {0xFE2E, 230}, {0xFE2F, 230}, {0x101FD, 220}, {0x102E0, 220}, {0x10376, 230}, {0x10377, 230}, {0x10378, 230}, + {0x10379, 230}, {0x1037A, 230}, {0x10A0D, 220}, {0x10A0F, 230}, {0x10A38, 230}, {0x10A39, 1}, {0x10A3A, 220}, {0x10A3F, 9}, + {0x10AE5, 230}, {0x10AE6, 220}, {0x10D24, 230}, {0x10D25, 230}, {0x10D26, 230}, {0x10D27, 230}, {0x10EAB, 230}, {0x10EAC, 230}, + {0x10EFD, 220}, {0x10EFE, 220}, {0x10EFF, 220}, {0x10F46, 220}, {0x10F47, 220}, {0x10F48, 230}, {0x10F49, 230}, {0x10F4A, 230}, + {0x10F4B, 220}, {0x10F4C, 230}, {0x10F4D, 220}, {0x10F4E, 220}, {0x10F4F, 220}, {0x10F50, 220}, {0x10F82, 230}, {0x10F83, 220}, + {0x10F84, 230}, {0x10F85, 220}, {0x11046, 9}, {0x11070, 9}, {0x1107F, 9}, {0x110B9, 9}, {0x110BA, 7}, {0x11100, 230}, + {0x11101, 230}, {0x11102, 230}, {0x11133, 9}, {0x11134, 9}, {0x11173, 7}, {0x111C0, 9}, {0x111CA, 7}, {0x11235, 9}, + {0x11236, 7}, {0x112E9, 7}, {0x112EA, 9}, {0x1133B, 7}, {0x1133C, 7}, {0x1134D, 9}, {0x11366, 230}, {0x11367, 230}, + {0x11368, 230}, {0x11369, 230}, {0x1136A, 230}, {0x1136B, 230}, {0x1136C, 230}, {0x11370, 230}, {0x11371, 230}, {0x11372, 230}, + {0x11373, 230}, {0x11374, 230}, {0x11442, 9}, {0x11446, 7}, {0x1145E, 230}, {0x114C2, 9}, {0x114C3, 7}, {0x115BF, 9}, + {0x115C0, 7}, {0x1163F, 9}, {0x116B6, 9}, {0x116B7, 7}, {0x1172B, 9}, {0x11839, 9}, {0x1183A, 7}, {0x1193D, 9}, + {0x1193E, 9}, {0x11943, 7}, {0x119E0, 9}, {0x11A34, 9}, {0x11A47, 9}, {0x11A99, 9}, {0x11C3F, 9}, {0x11D42, 7}, + {0x11D44, 9}, {0x11D45, 9}, {0x11D97, 9}, {0x11F41, 9}, {0x11F42, 9}, {0x16AF0, 1}, {0x16AF1, 1}, {0x16AF2, 1}, + {0x16AF3, 1}, {0x16AF4, 1}, {0x16B30, 230}, {0x16B31, 230}, {0x16B32, 230}, {0x16B33, 230}, {0x16B34, 230}, {0x16B35, 230}, + {0x16B36, 230}, {0x16FF0, 6}, {0x16FF1, 6}, {0x1BC9E, 1}, {0x1D165, 216}, {0x1D166, 216}, {0x1D167, 1}, {0x1D168, 1}, + {0x1D169, 1}, {0x1D16D, 226}, {0x1D16E, 216}, {0x1D16F, 216}, {0x1D170, 216}, {0x1D171, 216}, {0x1D172, 216}, {0x1D17B, 220}, + {0x1D17C, 220}, {0x1D17D, 220}, {0x1D17E, 220}, {0x1D17F, 220}, {0x1D180, 220}, {0x1D181, 220}, {0x1D182, 220}, {0x1D185, 230}, + {0x1D186, 230}, {0x1D187, 230}, {0x1D188, 230}, {0x1D189, 230}, {0x1D18A, 220}, {0x1D18B, 220}, {0x1D1AA, 230}, {0x1D1AB, 230}, + {0x1D1AC, 230}, {0x1D1AD, 230}, {0x1D242, 230}, {0x1D243, 230}, {0x1D244, 230}, {0x1E000, 230}, {0x1E001, 230}, {0x1E002, 230}, + {0x1E003, 230}, {0x1E004, 230}, {0x1E005, 230}, {0x1E006, 230}, {0x1E008, 230}, {0x1E009, 230}, {0x1E00A, 230}, {0x1E00B, 230}, + {0x1E00C, 230}, {0x1E00D, 230}, {0x1E00E, 230}, {0x1E00F, 230}, {0x1E010, 230}, {0x1E011, 230}, {0x1E012, 230}, {0x1E013, 230}, + {0x1E014, 230}, {0x1E015, 230}, {0x1E016, 230}, {0x1E017, 230}, {0x1E018, 230}, {0x1E01B, 230}, {0x1E01C, 230}, {0x1E01D, 230}, + {0x1E01E, 230}, {0x1E01F, 230}, {0x1E020, 230}, {0x1E021, 230}, {0x1E023, 230}, {0x1E024, 230}, {0x1E026, 230}, {0x1E027, 230}, + {0x1E028, 230}, {0x1E029, 230}, {0x1E02A, 230}, {0x1E08F, 230}, {0x1E130, 230}, {0x1E131, 230}, {0x1E132, 230}, {0x1E133, 230}, + {0x1E134, 230}, {0x1E135, 230}, {0x1E136, 230}, {0x1E2AE, 230}, {0x1E2EC, 230}, {0x1E2ED, 230}, {0x1E2EE, 230}, {0x1E2EF, 230}, + {0x1E4EC, 232}, {0x1E4ED, 232}, {0x1E4EE, 220}, {0x1E4EF, 230}, {0x1E8D0, 220}, {0x1E8D1, 220}, {0x1E8D2, 220}, {0x1E8D3, 220}, + {0x1E8D4, 220}, {0x1E8D5, 220}, {0x1E8D6, 220}, {0x1E944, 230}, {0x1E945, 230}, {0x1E946, 230}, {0x1E947, 230}, {0x1E948, 230}, + {0x1E949, 230}, {0x1E94A, 7}, +}; + +static const CpRange kSpacyAlpha[] = { + {0x41, 0x5A}, {0x61, 0x7A}, {0xC0, 0xD6}, {0xD8, 0xF6}, {0xF8, 0x1BF}, {0x1C4, 0x2AF}, + {0x386, 0x386}, {0x388, 0x38A}, {0x38C, 0x38C}, {0x38E, 0x38F}, {0x391, 0x3A9}, {0x3AC, 0x3AF}, + {0x3B1, 0x3C9}, {0x3CC, 0x3CE}, {0x400, 0x401}, {0x403, 0x40A}, {0x40C, 0x40D}, {0x410, 0x451}, + {0x453, 0x45A}, {0x45C, 0x45D}, {0x490, 0x491}, {0x496, 0x497}, {0x4A2, 0x4A3}, {0x4AE, 0x4AF}, + {0x4BA, 0x4BB}, {0x4D8, 0x4D9}, {0x4E8, 0x4E9}, {0x591, 0x5F4}, {0x620, 0x64A}, {0x66E, 0x6D5}, + {0x6E5, 0x6FF}, {0x750, 0x77F}, {0x8A0, 0x8BD}, {0x900, 0x9FF}, {0xB80, 0xCFF}, {0xD80, 0xDFF}, + {0x1100, 0x137F}, {0x1D00, 0x1D25}, {0x1D6B, 0x1D77}, {0x1D79, 0x1D9A}, {0x1E00, 0x1EFF}, {0x2C60, 0x2C7B}, + {0x2C7E, 0x2C7F}, {0x2E80, 0x2FDF}, {0x2FF0, 0x30FF}, {0x31C0, 0x31EF}, {0x3200, 0x4DBF}, {0x4E00, 0x9FFF}, + {0xA722, 0xA76F}, {0xA771, 0xA787}, {0xA78B, 0xA78E}, {0xA790, 0xA7B9}, {0xA7FA, 0xA7FA}, {0xAB30, 0xAB5A}, + {0xAB60, 0xAB64}, {0xAC00, 0xD7AF}, {0xF900, 0xFAFF}, {0xFB1D, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFDC7}, + {0xFDF0, 0xFDFB}, {0xFE30, 0xFE4F}, {0xFE70, 0xFEFC}, {0xFF21, 0xFF3A}, {0xFF41, 0xFF5A}, {0x1EE00, 0x1EEBB}, + {0x1F200, 0x1F2FF}, {0x20000, 0x2A6DF}, {0x2A700, 0x2EBEF}, {0x2F800, 0x2FA1F}, +}; + +static const CpRange kSpacyAlphaLower[] = { + {0x61, 0x7A}, {0xDF, 0xF6}, {0xF8, 0xFF}, {0x101, 0x101}, {0x103, 0x103}, {0x105, 0x105}, + {0x107, 0x107}, {0x109, 0x109}, {0x10B, 0x10B}, {0x10D, 0x10D}, {0x10F, 0x10F}, {0x111, 0x111}, + {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, {0x11B, 0x11B}, {0x11D, 0x11D}, + {0x11F, 0x11F}, {0x121, 0x121}, {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, {0x129, 0x129}, + {0x12B, 0x12B}, {0x12D, 0x12D}, {0x12F, 0x12F}, {0x131, 0x131}, {0x133, 0x133}, {0x135, 0x135}, + {0x137, 0x138}, {0x13A, 0x13A}, {0x13C, 0x13C}, {0x13E, 0x13E}, {0x140, 0x140}, {0x142, 0x142}, + {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14B, 0x14B}, {0x14D, 0x14D}, {0x14F, 0x14F}, + {0x151, 0x151}, {0x153, 0x153}, {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, {0x15B, 0x15B}, + {0x15D, 0x15D}, {0x15F, 0x15F}, {0x161, 0x161}, {0x163, 0x163}, {0x165, 0x165}, {0x167, 0x167}, + {0x169, 0x169}, {0x16B, 0x16B}, {0x16D, 0x16D}, {0x16F, 0x16F}, {0x171, 0x171}, {0x173, 0x173}, + {0x175, 0x175}, {0x177, 0x177}, {0x17A, 0x17A}, {0x17C, 0x17C}, {0x17E, 0x180}, {0x183, 0x183}, + {0x185, 0x185}, {0x188, 0x188}, {0x18C, 0x18D}, {0x192, 0x192}, {0x195, 0x195}, {0x199, 0x19B}, + {0x19E, 0x19E}, {0x1A1, 0x1A1}, {0x1A3, 0x1A3}, {0x1A5, 0x1A5}, {0x1A8, 0x1A8}, {0x1AA, 0x1AB}, + {0x1AD, 0x1AD}, {0x1B0, 0x1B0}, {0x1B4, 0x1B4}, {0x1B6, 0x1B6}, {0x1B9, 0x1BA}, {0x1BD, 0x1BF}, + {0x1C6, 0x1C6}, {0x1C9, 0x1C9}, {0x1CC, 0x1CC}, {0x1CE, 0x1CE}, {0x1D0, 0x1D0}, {0x1D2, 0x1D2}, + {0x1D4, 0x1D4}, {0x1D6, 0x1D6}, {0x1D8, 0x1D8}, {0x1DA, 0x1DA}, {0x1DC, 0x1DD}, {0x1DF, 0x1DF}, + {0x1E1, 0x1E1}, {0x1E3, 0x1E3}, {0x1E5, 0x1E5}, {0x1E7, 0x1E7}, {0x1E9, 0x1E9}, {0x1EB, 0x1EB}, + {0x1ED, 0x1ED}, {0x1EF, 0x1F0}, {0x1F3, 0x1F3}, {0x1F5, 0x1F5}, {0x1F9, 0x1F9}, {0x1FB, 0x1FB}, + {0x1FD, 0x1FD}, {0x1FF, 0x1FF}, {0x201, 0x201}, {0x203, 0x203}, {0x205, 0x205}, {0x207, 0x207}, + {0x209, 0x209}, {0x20B, 0x20B}, {0x20D, 0x20D}, {0x20F, 0x20F}, {0x211, 0x211}, {0x213, 0x213}, + {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21B, 0x21B}, {0x21D, 0x21D}, {0x21F, 0x21F}, + {0x221, 0x221}, {0x223, 0x223}, {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, {0x22B, 0x22B}, + {0x22D, 0x22D}, {0x22F, 0x22F}, {0x231, 0x231}, {0x233, 0x239}, {0x23C, 0x23C}, {0x23F, 0x240}, + {0x242, 0x242}, {0x247, 0x247}, {0x249, 0x249}, {0x24B, 0x24B}, {0x24D, 0x24D}, {0x24F, 0x2AF}, + {0x3AC, 0x3AF}, {0x3B1, 0x3C9}, {0x3CC, 0x3CE}, {0x430, 0x451}, {0x453, 0x45A}, {0x45C, 0x45D}, + {0x491, 0x491}, {0x497, 0x497}, {0x4A3, 0x4A3}, {0x4AF, 0x4AF}, {0x4BB, 0x4BB}, {0x4D9, 0x4D9}, + {0x4E9, 0x4E9}, {0x591, 0x5F4}, {0x620, 0x64A}, {0x66E, 0x6D5}, {0x6E5, 0x6FF}, {0x750, 0x77F}, + {0x8A0, 0x8BD}, {0x900, 0x9FF}, {0xB80, 0xCFF}, {0xD80, 0xDFF}, {0x1100, 0x137F}, {0x1D00, 0x1D25}, + {0x1D6B, 0x1D77}, {0x1D79, 0x1D9A}, {0x1E01, 0x1E01}, {0x1E03, 0x1E03}, {0x1E05, 0x1E05}, {0x1E07, 0x1E07}, + {0x1E09, 0x1E09}, {0x1E0B, 0x1E0B}, {0x1E0D, 0x1E0D}, {0x1E0F, 0x1E0F}, {0x1E11, 0x1E11}, {0x1E13, 0x1E13}, + {0x1E15, 0x1E15}, {0x1E17, 0x1E17}, {0x1E19, 0x1E19}, {0x1E1B, 0x1E1B}, {0x1E1D, 0x1E1D}, {0x1E1F, 0x1E1F}, + {0x1E21, 0x1E21}, {0x1E23, 0x1E23}, {0x1E25, 0x1E25}, {0x1E27, 0x1E27}, {0x1E29, 0x1E29}, {0x1E2B, 0x1E2B}, + {0x1E2D, 0x1E2D}, {0x1E2F, 0x1E2F}, {0x1E31, 0x1E31}, {0x1E33, 0x1E33}, {0x1E35, 0x1E35}, {0x1E37, 0x1E37}, + {0x1E39, 0x1E39}, {0x1E3B, 0x1E3B}, {0x1E3D, 0x1E3D}, {0x1E3F, 0x1E3F}, {0x1E41, 0x1E41}, {0x1E43, 0x1E43}, + {0x1E45, 0x1E45}, {0x1E47, 0x1E47}, {0x1E49, 0x1E49}, {0x1E4B, 0x1E4B}, {0x1E4D, 0x1E4D}, {0x1E4F, 0x1E4F}, + {0x1E51, 0x1E51}, {0x1E53, 0x1E53}, {0x1E55, 0x1E55}, {0x1E57, 0x1E57}, {0x1E59, 0x1E59}, {0x1E5B, 0x1E5B}, + {0x1E5D, 0x1E5D}, {0x1E5F, 0x1E5F}, {0x1E61, 0x1E61}, {0x1E63, 0x1E63}, {0x1E65, 0x1E65}, {0x1E67, 0x1E67}, + {0x1E69, 0x1E69}, {0x1E6B, 0x1E6B}, {0x1E6D, 0x1E6D}, {0x1E6F, 0x1E6F}, {0x1E71, 0x1E71}, {0x1E73, 0x1E73}, + {0x1E75, 0x1E75}, {0x1E77, 0x1E77}, {0x1E79, 0x1E79}, {0x1E7B, 0x1E7B}, {0x1E7D, 0x1E7D}, {0x1E7F, 0x1E7F}, + {0x1E81, 0x1E81}, {0x1E83, 0x1E83}, {0x1E85, 0x1E85}, {0x1E87, 0x1E87}, {0x1E89, 0x1E89}, {0x1E8B, 0x1E8B}, + {0x1E8D, 0x1E8D}, {0x1E8F, 0x1E8F}, {0x1E91, 0x1E91}, {0x1E93, 0x1E93}, {0x1E95, 0x1E9D}, {0x1E9F, 0x1E9F}, + {0x1EA1, 0x1EA1}, {0x1EA3, 0x1EA3}, {0x1EA5, 0x1EA5}, {0x1EA7, 0x1EA7}, {0x1EA9, 0x1EA9}, {0x1EAB, 0x1EAB}, + {0x1EAD, 0x1EAD}, {0x1EAF, 0x1EAF}, {0x1EB1, 0x1EB1}, {0x1EB3, 0x1EB3}, {0x1EB5, 0x1EB5}, {0x1EB7, 0x1EB7}, + {0x1EB9, 0x1EB9}, {0x1EBB, 0x1EBB}, {0x1EBD, 0x1EBD}, {0x1EBF, 0x1EBF}, {0x1EC1, 0x1EC1}, {0x1EC3, 0x1EC3}, + {0x1EC5, 0x1EC5}, {0x1EC7, 0x1EC7}, {0x1EC9, 0x1EC9}, {0x1ECB, 0x1ECB}, {0x1ECD, 0x1ECD}, {0x1ECF, 0x1ECF}, + {0x1ED1, 0x1ED1}, {0x1ED3, 0x1ED3}, {0x1ED5, 0x1ED5}, {0x1ED7, 0x1ED7}, {0x1ED9, 0x1ED9}, {0x1EDB, 0x1EDB}, + {0x1EDD, 0x1EDD}, {0x1EDF, 0x1EDF}, {0x1EE1, 0x1EE1}, {0x1EE3, 0x1EE3}, {0x1EE5, 0x1EE5}, {0x1EE7, 0x1EE7}, + {0x1EE9, 0x1EE9}, {0x1EEB, 0x1EEB}, {0x1EED, 0x1EED}, {0x1EEF, 0x1EEF}, {0x1EF1, 0x1EF1}, {0x1EF3, 0x1EF3}, + {0x1EF5, 0x1EF5}, {0x1EF7, 0x1EF7}, {0x1EF9, 0x1EF9}, {0x1EFB, 0x1EFB}, {0x1EFD, 0x1EFD}, {0x1EFF, 0x1EFF}, + {0x2C61, 0x2C61}, {0x2C65, 0x2C66}, {0x2C68, 0x2C68}, {0x2C6A, 0x2C6A}, {0x2C6C, 0x2C6C}, {0x2C71, 0x2C71}, + {0x2C73, 0x2C74}, {0x2C76, 0x2C7B}, {0x2E80, 0x2FDF}, {0x2FF0, 0x30FF}, {0x31C0, 0x31EF}, {0x3200, 0x4DBF}, + {0x4E00, 0x9FFF}, {0xA723, 0xA723}, {0xA725, 0xA725}, {0xA727, 0xA727}, {0xA729, 0xA729}, {0xA72B, 0xA72B}, + {0xA72D, 0xA72D}, {0xA72F, 0xA731}, {0xA733, 0xA733}, {0xA735, 0xA735}, {0xA737, 0xA737}, {0xA739, 0xA739}, + {0xA73B, 0xA73B}, {0xA73D, 0xA73D}, {0xA73F, 0xA73F}, {0xA741, 0xA741}, {0xA743, 0xA743}, {0xA745, 0xA745}, + {0xA747, 0xA747}, {0xA749, 0xA749}, {0xA74B, 0xA74B}, {0xA74D, 0xA74D}, {0xA74F, 0xA74F}, {0xA751, 0xA751}, + {0xA753, 0xA753}, {0xA755, 0xA755}, {0xA757, 0xA757}, {0xA759, 0xA759}, {0xA75B, 0xA75B}, {0xA75D, 0xA75D}, + {0xA75F, 0xA75F}, {0xA761, 0xA761}, {0xA763, 0xA763}, {0xA765, 0xA765}, {0xA767, 0xA767}, {0xA769, 0xA769}, + {0xA76B, 0xA76B}, {0xA76D, 0xA76D}, {0xA76F, 0xA76F}, {0xA771, 0xA778}, {0xA77A, 0xA77A}, {0xA77C, 0xA77C}, + {0xA77F, 0xA77F}, {0xA781, 0xA781}, {0xA783, 0xA783}, {0xA785, 0xA785}, {0xA787, 0xA787}, {0xA78C, 0xA78C}, + {0xA78E, 0xA78E}, {0xA791, 0xA791}, {0xA793, 0xA795}, {0xA797, 0xA797}, {0xA799, 0xA799}, {0xA79B, 0xA79B}, + {0xA79D, 0xA79D}, {0xA79F, 0xA79F}, {0xA7A1, 0xA7A1}, {0xA7A3, 0xA7A3}, {0xA7A5, 0xA7A5}, {0xA7A7, 0xA7A7}, + {0xA7A9, 0xA7A9}, {0xA7AF, 0xA7AF}, {0xA7B5, 0xA7B5}, {0xA7B7, 0xA7B7}, {0xA7B9, 0xA7B9}, {0xA7FA, 0xA7FA}, + {0xAB30, 0xAB5A}, {0xAB60, 0xAB64}, {0xAC00, 0xD7AF}, {0xF900, 0xFAFF}, {0xFB1D, 0xFBB1}, {0xFBD3, 0xFD3D}, + {0xFD50, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE30, 0xFE4F}, {0xFE70, 0xFEFC}, {0xFF41, 0xFF5A}, {0x1EE00, 0x1EEBB}, + {0x1F200, 0x1F2FF}, {0x20000, 0x2A6DF}, {0x2A700, 0x2EBEF}, {0x2F800, 0x2FA1F}, +}; + +static const CpRange kSpacyAlphaUpper[] = { + {0x41, 0x5A}, {0xC0, 0xD6}, {0xD8, 0xDE}, {0x100, 0x100}, {0x102, 0x102}, {0x104, 0x104}, + {0x106, 0x106}, {0x108, 0x108}, {0x10A, 0x10A}, {0x10C, 0x10C}, {0x10E, 0x10E}, {0x110, 0x110}, + {0x112, 0x112}, {0x114, 0x114}, {0x116, 0x116}, {0x118, 0x118}, {0x11A, 0x11A}, {0x11C, 0x11C}, + {0x11E, 0x11E}, {0x120, 0x120}, {0x122, 0x122}, {0x124, 0x124}, {0x126, 0x126}, {0x128, 0x128}, + {0x12A, 0x12A}, {0x12C, 0x12C}, {0x12E, 0x12E}, {0x130, 0x130}, {0x132, 0x132}, {0x134, 0x134}, + {0x136, 0x136}, {0x139, 0x139}, {0x13B, 0x13B}, {0x13D, 0x13D}, {0x13F, 0x13F}, {0x141, 0x141}, + {0x143, 0x143}, {0x145, 0x145}, {0x147, 0x147}, {0x14A, 0x14A}, {0x14C, 0x14C}, {0x14E, 0x14E}, + {0x150, 0x150}, {0x152, 0x152}, {0x154, 0x154}, {0x156, 0x156}, {0x158, 0x158}, {0x15A, 0x15A}, + {0x15C, 0x15C}, {0x15E, 0x15E}, {0x160, 0x160}, {0x162, 0x162}, {0x164, 0x164}, {0x166, 0x166}, + {0x168, 0x168}, {0x16A, 0x16A}, {0x16C, 0x16C}, {0x16E, 0x16E}, {0x170, 0x170}, {0x172, 0x172}, + {0x174, 0x174}, {0x176, 0x176}, {0x178, 0x179}, {0x17B, 0x17B}, {0x17D, 0x17D}, {0x181, 0x182}, + {0x184, 0x184}, {0x186, 0x187}, {0x189, 0x18B}, {0x18E, 0x191}, {0x193, 0x194}, {0x196, 0x198}, + {0x19C, 0x19D}, {0x19F, 0x1A0}, {0x1A2, 0x1A2}, {0x1A4, 0x1A4}, {0x1A6, 0x1A7}, {0x1A9, 0x1A9}, + {0x1AC, 0x1AC}, {0x1AE, 0x1AF}, {0x1B1, 0x1B3}, {0x1B5, 0x1B5}, {0x1B7, 0x1B8}, {0x1BC, 0x1BC}, + {0x1C4, 0x1C4}, {0x1C7, 0x1C7}, {0x1CA, 0x1CA}, {0x1CD, 0x1CD}, {0x1CF, 0x1CF}, {0x1D1, 0x1D1}, + {0x1D3, 0x1D3}, {0x1D5, 0x1D5}, {0x1D7, 0x1D7}, {0x1D9, 0x1D9}, {0x1DB, 0x1DB}, {0x1DE, 0x1DE}, + {0x1E0, 0x1E0}, {0x1E2, 0x1E2}, {0x1E4, 0x1E4}, {0x1E6, 0x1E6}, {0x1E8, 0x1E8}, {0x1EA, 0x1EA}, + {0x1EC, 0x1EC}, {0x1EE, 0x1EE}, {0x1F1, 0x1F1}, {0x1F4, 0x1F4}, {0x1F6, 0x1F8}, {0x1FA, 0x1FA}, + {0x1FC, 0x1FC}, {0x1FE, 0x1FE}, {0x200, 0x200}, {0x202, 0x202}, {0x204, 0x204}, {0x206, 0x206}, + {0x208, 0x208}, {0x20A, 0x20A}, {0x20C, 0x20C}, {0x20E, 0x20E}, {0x210, 0x210}, {0x212, 0x212}, + {0x214, 0x214}, {0x216, 0x216}, {0x218, 0x218}, {0x21A, 0x21A}, {0x21C, 0x21C}, {0x21E, 0x21E}, + {0x220, 0x220}, {0x222, 0x222}, {0x224, 0x224}, {0x226, 0x226}, {0x228, 0x228}, {0x22A, 0x22A}, + {0x22C, 0x22C}, {0x22E, 0x22E}, {0x230, 0x230}, {0x232, 0x232}, {0x23A, 0x23B}, {0x23D, 0x23E}, + {0x241, 0x241}, {0x243, 0x246}, {0x248, 0x248}, {0x24A, 0x24A}, {0x24C, 0x24C}, {0x24E, 0x24E}, + {0x386, 0x386}, {0x388, 0x38A}, {0x38C, 0x38C}, {0x38E, 0x38F}, {0x391, 0x3A9}, {0x400, 0x401}, + {0x403, 0x40A}, {0x40C, 0x40D}, {0x410, 0x42F}, {0x490, 0x490}, {0x496, 0x496}, {0x4A2, 0x4A2}, + {0x4AE, 0x4AE}, {0x4BA, 0x4BA}, {0x4D8, 0x4D8}, {0x4E8, 0x4E8}, {0x591, 0x5F4}, {0x620, 0x64A}, + {0x66E, 0x6D5}, {0x6E5, 0x6FF}, {0x750, 0x77F}, {0x8A0, 0x8BD}, {0x900, 0x9FF}, {0xB80, 0xCFF}, + {0xD80, 0xDFF}, {0x1100, 0x137F}, {0x1E00, 0x1E00}, {0x1E02, 0x1E02}, {0x1E04, 0x1E04}, {0x1E06, 0x1E06}, + {0x1E08, 0x1E08}, {0x1E0A, 0x1E0A}, {0x1E0C, 0x1E0C}, {0x1E0E, 0x1E0E}, {0x1E10, 0x1E10}, {0x1E12, 0x1E12}, + {0x1E14, 0x1E14}, {0x1E16, 0x1E16}, {0x1E18, 0x1E18}, {0x1E1A, 0x1E1A}, {0x1E1C, 0x1E1C}, {0x1E1E, 0x1E1E}, + {0x1E20, 0x1E20}, {0x1E22, 0x1E22}, {0x1E24, 0x1E24}, {0x1E26, 0x1E26}, {0x1E28, 0x1E28}, {0x1E2A, 0x1E2A}, + {0x1E2C, 0x1E2C}, {0x1E2E, 0x1E2E}, {0x1E30, 0x1E30}, {0x1E32, 0x1E32}, {0x1E34, 0x1E34}, {0x1E36, 0x1E36}, + {0x1E38, 0x1E38}, {0x1E3A, 0x1E3A}, {0x1E3C, 0x1E3C}, {0x1E3E, 0x1E3E}, {0x1E40, 0x1E40}, {0x1E42, 0x1E42}, + {0x1E44, 0x1E44}, {0x1E46, 0x1E46}, {0x1E48, 0x1E48}, {0x1E4A, 0x1E4A}, {0x1E4C, 0x1E4C}, {0x1E4E, 0x1E4E}, + {0x1E50, 0x1E50}, {0x1E52, 0x1E52}, {0x1E54, 0x1E54}, {0x1E56, 0x1E56}, {0x1E58, 0x1E58}, {0x1E5A, 0x1E5A}, + {0x1E5C, 0x1E5C}, {0x1E5E, 0x1E5E}, {0x1E60, 0x1E60}, {0x1E62, 0x1E62}, {0x1E64, 0x1E64}, {0x1E66, 0x1E66}, + {0x1E68, 0x1E68}, {0x1E6A, 0x1E6A}, {0x1E6C, 0x1E6C}, {0x1E6E, 0x1E6E}, {0x1E70, 0x1E70}, {0x1E72, 0x1E72}, + {0x1E74, 0x1E74}, {0x1E76, 0x1E76}, {0x1E78, 0x1E78}, {0x1E7A, 0x1E7A}, {0x1E7C, 0x1E7C}, {0x1E7E, 0x1E7E}, + {0x1E80, 0x1E80}, {0x1E82, 0x1E82}, {0x1E84, 0x1E84}, {0x1E86, 0x1E86}, {0x1E88, 0x1E88}, {0x1E8A, 0x1E8A}, + {0x1E8C, 0x1E8C}, {0x1E8E, 0x1E8E}, {0x1E90, 0x1E90}, {0x1E92, 0x1E92}, {0x1E94, 0x1E94}, {0x1E9E, 0x1E9E}, + {0x1EA0, 0x1EA0}, {0x1EA2, 0x1EA2}, {0x1EA4, 0x1EA4}, {0x1EA6, 0x1EA6}, {0x1EA8, 0x1EA8}, {0x1EAA, 0x1EAA}, + {0x1EAC, 0x1EAC}, {0x1EAE, 0x1EAE}, {0x1EB0, 0x1EB0}, {0x1EB2, 0x1EB2}, {0x1EB4, 0x1EB4}, {0x1EB6, 0x1EB6}, + {0x1EB8, 0x1EB8}, {0x1EBA, 0x1EBA}, {0x1EBC, 0x1EBC}, {0x1EBE, 0x1EBE}, {0x1EC0, 0x1EC0}, {0x1EC2, 0x1EC2}, + {0x1EC4, 0x1EC4}, {0x1EC6, 0x1EC6}, {0x1EC8, 0x1EC8}, {0x1ECA, 0x1ECA}, {0x1ECC, 0x1ECC}, {0x1ECE, 0x1ECE}, + {0x1ED0, 0x1ED0}, {0x1ED2, 0x1ED2}, {0x1ED4, 0x1ED4}, {0x1ED6, 0x1ED6}, {0x1ED8, 0x1ED8}, {0x1EDA, 0x1EDA}, + {0x1EDC, 0x1EDC}, {0x1EDE, 0x1EDE}, {0x1EE0, 0x1EE0}, {0x1EE2, 0x1EE2}, {0x1EE4, 0x1EE4}, {0x1EE6, 0x1EE6}, + {0x1EE8, 0x1EE8}, {0x1EEA, 0x1EEA}, {0x1EEC, 0x1EEC}, {0x1EEE, 0x1EEE}, {0x1EF0, 0x1EF0}, {0x1EF2, 0x1EF2}, + {0x1EF4, 0x1EF4}, {0x1EF6, 0x1EF6}, {0x1EF8, 0x1EF8}, {0x1EFA, 0x1EFA}, {0x1EFC, 0x1EFC}, {0x1EFE, 0x1EFE}, + {0x2C60, 0x2C60}, {0x2C62, 0x2C64}, {0x2C67, 0x2C67}, {0x2C69, 0x2C69}, {0x2C6B, 0x2C6B}, {0x2C6D, 0x2C70}, + {0x2C72, 0x2C72}, {0x2C75, 0x2C75}, {0x2C7E, 0x2C7F}, {0x2E80, 0x2FDF}, {0x2FF0, 0x30FF}, {0x31C0, 0x31EF}, + {0x3200, 0x4DBF}, {0x4E00, 0x9FFF}, {0xA722, 0xA722}, {0xA724, 0xA724}, {0xA726, 0xA726}, {0xA728, 0xA728}, + {0xA72A, 0xA72A}, {0xA72C, 0xA72C}, {0xA72E, 0xA72E}, {0xA732, 0xA732}, {0xA734, 0xA734}, {0xA736, 0xA736}, + {0xA738, 0xA738}, {0xA73A, 0xA73A}, {0xA73C, 0xA73C}, {0xA73E, 0xA73E}, {0xA740, 0xA740}, {0xA742, 0xA742}, + {0xA744, 0xA744}, {0xA746, 0xA746}, {0xA748, 0xA748}, {0xA74A, 0xA74A}, {0xA74C, 0xA74C}, {0xA74E, 0xA74E}, + {0xA750, 0xA750}, {0xA752, 0xA752}, {0xA754, 0xA754}, {0xA756, 0xA756}, {0xA758, 0xA758}, {0xA75A, 0xA75A}, + {0xA75C, 0xA75C}, {0xA75E, 0xA75E}, {0xA760, 0xA760}, {0xA762, 0xA762}, {0xA764, 0xA764}, {0xA766, 0xA766}, + {0xA768, 0xA768}, {0xA76A, 0xA76A}, {0xA76C, 0xA76C}, {0xA76E, 0xA76E}, {0xA779, 0xA779}, {0xA77B, 0xA77B}, + {0xA77D, 0xA77E}, {0xA780, 0xA780}, {0xA782, 0xA782}, {0xA784, 0xA784}, {0xA786, 0xA786}, {0xA78B, 0xA78B}, + {0xA78D, 0xA78D}, {0xA790, 0xA790}, {0xA792, 0xA792}, {0xA796, 0xA796}, {0xA798, 0xA798}, {0xA79A, 0xA79A}, + {0xA79C, 0xA79C}, {0xA79E, 0xA79E}, {0xA7A0, 0xA7A0}, {0xA7A2, 0xA7A2}, {0xA7A4, 0xA7A4}, {0xA7A6, 0xA7A6}, + {0xA7A8, 0xA7A8}, {0xA7AA, 0xA7AE}, {0xA7B0, 0xA7B4}, {0xA7B6, 0xA7B6}, {0xA7B8, 0xA7B8}, {0xAC00, 0xD7AF}, + {0xF900, 0xFAFF}, {0xFB1D, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE30, 0xFE4F}, + {0xFE70, 0xFEFC}, {0xFF21, 0xFF3A}, {0x1EE00, 0x1EEBB}, {0x1F200, 0x1F2FF}, {0x20000, 0x2A6DF}, {0x2A700, 0x2EBEF}, + {0x2F800, 0x2FA1F}, +}; + +static const CpRange kSpacySuffixDotPre[] = { + {0x21, 0x23}, {0x25, 0x2D}, {0x30, 0x3C}, {0x3E, 0x3F}, {0x5B, 0x5B}, {0x5D, 0x5D}, + {0x5F, 0x7D}, {0xA1, 0xA1}, {0xAB, 0xAB}, {0xB2, 0xB2}, {0xB4, 0xB4}, {0xB7, 0xB7}, + {0xBB, 0xBB}, {0xBF, 0xBF}, {0xDF, 0xF6}, {0xF8, 0xFF}, {0x101, 0x101}, {0x103, 0x103}, + {0x105, 0x105}, {0x107, 0x107}, {0x109, 0x109}, {0x10B, 0x10B}, {0x10D, 0x10D}, {0x10F, 0x10F}, + {0x111, 0x111}, {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, {0x11B, 0x11B}, + {0x11D, 0x11D}, {0x11F, 0x11F}, {0x121, 0x121}, {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, + {0x129, 0x129}, {0x12B, 0x12B}, {0x12D, 0x12D}, {0x12F, 0x12F}, {0x131, 0x131}, {0x133, 0x133}, + {0x135, 0x135}, {0x137, 0x138}, {0x13A, 0x13A}, {0x13C, 0x13C}, {0x13E, 0x13E}, {0x140, 0x140}, + {0x142, 0x142}, {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14B, 0x14B}, {0x14D, 0x14D}, + {0x14F, 0x14F}, {0x151, 0x151}, {0x153, 0x153}, {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, + {0x15B, 0x15B}, {0x15D, 0x15D}, {0x15F, 0x15F}, {0x161, 0x161}, {0x163, 0x163}, {0x165, 0x165}, + {0x167, 0x167}, {0x169, 0x169}, {0x16B, 0x16B}, {0x16D, 0x16D}, {0x16F, 0x16F}, {0x171, 0x171}, + {0x173, 0x173}, {0x175, 0x175}, {0x177, 0x177}, {0x17A, 0x17A}, {0x17C, 0x17C}, {0x17E, 0x180}, + {0x183, 0x183}, {0x185, 0x185}, {0x188, 0x188}, {0x18C, 0x18D}, {0x192, 0x192}, {0x195, 0x195}, + {0x199, 0x19B}, {0x19E, 0x19E}, {0x1A1, 0x1A1}, {0x1A3, 0x1A3}, {0x1A5, 0x1A5}, {0x1A8, 0x1A8}, + {0x1AA, 0x1AB}, {0x1AD, 0x1AD}, {0x1B0, 0x1B0}, {0x1B4, 0x1B4}, {0x1B6, 0x1B6}, {0x1B9, 0x1BA}, + {0x1BD, 0x1BF}, {0x1C6, 0x1C6}, {0x1C9, 0x1C9}, {0x1CC, 0x1CC}, {0x1CE, 0x1CE}, {0x1D0, 0x1D0}, + {0x1D2, 0x1D2}, {0x1D4, 0x1D4}, {0x1D6, 0x1D6}, {0x1D8, 0x1D8}, {0x1DA, 0x1DA}, {0x1DC, 0x1DD}, + {0x1DF, 0x1DF}, {0x1E1, 0x1E1}, {0x1E3, 0x1E3}, {0x1E5, 0x1E5}, {0x1E7, 0x1E7}, {0x1E9, 0x1E9}, + {0x1EB, 0x1EB}, {0x1ED, 0x1ED}, {0x1EF, 0x1F0}, {0x1F3, 0x1F3}, {0x1F5, 0x1F5}, {0x1F9, 0x1F9}, + {0x1FB, 0x1FB}, {0x1FD, 0x1FD}, {0x1FF, 0x1FF}, {0x201, 0x201}, {0x203, 0x203}, {0x205, 0x205}, + {0x207, 0x207}, {0x209, 0x209}, {0x20B, 0x20B}, {0x20D, 0x20D}, {0x20F, 0x20F}, {0x211, 0x211}, + {0x213, 0x213}, {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21B, 0x21B}, {0x21D, 0x21D}, + {0x21F, 0x21F}, {0x221, 0x221}, {0x223, 0x223}, {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, + {0x22B, 0x22B}, {0x22D, 0x22D}, {0x22F, 0x22F}, {0x231, 0x231}, {0x233, 0x239}, {0x23C, 0x23C}, + {0x23F, 0x240}, {0x242, 0x242}, {0x247, 0x247}, {0x249, 0x249}, {0x24B, 0x24B}, {0x24D, 0x24D}, + {0x24F, 0x2AF}, {0x3AC, 0x3AF}, {0x3B1, 0x3C9}, {0x3CC, 0x3CE}, {0x430, 0x451}, {0x453, 0x45A}, + {0x45C, 0x45D}, {0x491, 0x491}, {0x497, 0x497}, {0x4A3, 0x4A3}, {0x4AF, 0x4AF}, {0x4BB, 0x4BB}, + {0x4D9, 0x4D9}, {0x4E9, 0x4E9}, {0x591, 0x5F4}, {0x60C, 0x60C}, {0x61B, 0x61B}, {0x61F, 0x64A}, + {0x66A, 0x66A}, {0x66E, 0x6D5}, {0x6E5, 0x6FF}, {0x750, 0x77F}, {0x8A0, 0x8BD}, {0x900, 0x9FF}, + {0xB80, 0xCFF}, {0xD80, 0xDFF}, {0x1100, 0x137F}, {0x1D00, 0x1D25}, {0x1D6B, 0x1D77}, {0x1D79, 0x1D9A}, + {0x1E01, 0x1E01}, {0x1E03, 0x1E03}, {0x1E05, 0x1E05}, {0x1E07, 0x1E07}, {0x1E09, 0x1E09}, {0x1E0B, 0x1E0B}, + {0x1E0D, 0x1E0D}, {0x1E0F, 0x1E0F}, {0x1E11, 0x1E11}, {0x1E13, 0x1E13}, {0x1E15, 0x1E15}, {0x1E17, 0x1E17}, + {0x1E19, 0x1E19}, {0x1E1B, 0x1E1B}, {0x1E1D, 0x1E1D}, {0x1E1F, 0x1E1F}, {0x1E21, 0x1E21}, {0x1E23, 0x1E23}, + {0x1E25, 0x1E25}, {0x1E27, 0x1E27}, {0x1E29, 0x1E29}, {0x1E2B, 0x1E2B}, {0x1E2D, 0x1E2D}, {0x1E2F, 0x1E2F}, + {0x1E31, 0x1E31}, {0x1E33, 0x1E33}, {0x1E35, 0x1E35}, {0x1E37, 0x1E37}, {0x1E39, 0x1E39}, {0x1E3B, 0x1E3B}, + {0x1E3D, 0x1E3D}, {0x1E3F, 0x1E3F}, {0x1E41, 0x1E41}, {0x1E43, 0x1E43}, {0x1E45, 0x1E45}, {0x1E47, 0x1E47}, + {0x1E49, 0x1E49}, {0x1E4B, 0x1E4B}, {0x1E4D, 0x1E4D}, {0x1E4F, 0x1E4F}, {0x1E51, 0x1E51}, {0x1E53, 0x1E53}, + {0x1E55, 0x1E55}, {0x1E57, 0x1E57}, {0x1E59, 0x1E59}, {0x1E5B, 0x1E5B}, {0x1E5D, 0x1E5D}, {0x1E5F, 0x1E5F}, + {0x1E61, 0x1E61}, {0x1E63, 0x1E63}, {0x1E65, 0x1E65}, {0x1E67, 0x1E67}, {0x1E69, 0x1E69}, {0x1E6B, 0x1E6B}, + {0x1E6D, 0x1E6D}, {0x1E6F, 0x1E6F}, {0x1E71, 0x1E71}, {0x1E73, 0x1E73}, {0x1E75, 0x1E75}, {0x1E77, 0x1E77}, + {0x1E79, 0x1E79}, {0x1E7B, 0x1E7B}, {0x1E7D, 0x1E7D}, {0x1E7F, 0x1E7F}, {0x1E81, 0x1E81}, {0x1E83, 0x1E83}, + {0x1E85, 0x1E85}, {0x1E87, 0x1E87}, {0x1E89, 0x1E89}, {0x1E8B, 0x1E8B}, {0x1E8D, 0x1E8D}, {0x1E8F, 0x1E8F}, + {0x1E91, 0x1E91}, {0x1E93, 0x1E93}, {0x1E95, 0x1E9D}, {0x1E9F, 0x1E9F}, {0x1EA1, 0x1EA1}, {0x1EA3, 0x1EA3}, + {0x1EA5, 0x1EA5}, {0x1EA7, 0x1EA7}, {0x1EA9, 0x1EA9}, {0x1EAB, 0x1EAB}, {0x1EAD, 0x1EAD}, {0x1EAF, 0x1EAF}, + {0x1EB1, 0x1EB1}, {0x1EB3, 0x1EB3}, {0x1EB5, 0x1EB5}, {0x1EB7, 0x1EB7}, {0x1EB9, 0x1EB9}, {0x1EBB, 0x1EBB}, + {0x1EBD, 0x1EBD}, {0x1EBF, 0x1EBF}, {0x1EC1, 0x1EC1}, {0x1EC3, 0x1EC3}, {0x1EC5, 0x1EC5}, {0x1EC7, 0x1EC7}, + {0x1EC9, 0x1EC9}, {0x1ECB, 0x1ECB}, {0x1ECD, 0x1ECD}, {0x1ECF, 0x1ECF}, {0x1ED1, 0x1ED1}, {0x1ED3, 0x1ED3}, + {0x1ED5, 0x1ED5}, {0x1ED7, 0x1ED7}, {0x1ED9, 0x1ED9}, {0x1EDB, 0x1EDB}, {0x1EDD, 0x1EDD}, {0x1EDF, 0x1EDF}, + {0x1EE1, 0x1EE1}, {0x1EE3, 0x1EE3}, {0x1EE5, 0x1EE5}, {0x1EE7, 0x1EE7}, {0x1EE9, 0x1EE9}, {0x1EEB, 0x1EEB}, + {0x1EED, 0x1EED}, {0x1EEF, 0x1EEF}, {0x1EF1, 0x1EF1}, {0x1EF3, 0x1EF3}, {0x1EF5, 0x1EF5}, {0x1EF7, 0x1EF7}, + {0x1EF9, 0x1EF9}, {0x1EFB, 0x1EFB}, {0x1EFD, 0x1EFD}, {0x1EFF, 0x1EFF}, {0x2018, 0x201A}, {0x201C, 0x201E}, + {0x2026, 0x2026}, {0x2329, 0x232A}, {0x27E6, 0x27E7}, {0x2C61, 0x2C61}, {0x2C65, 0x2C66}, {0x2C68, 0x2C68}, + {0x2C6A, 0x2C6A}, {0x2C6C, 0x2C6C}, {0x2C71, 0x2C71}, {0x2C73, 0x2C74}, {0x2C76, 0x2C7B}, {0x2E80, 0x2FDF}, + {0x2FF0, 0x30FF}, {0x31C0, 0x31EF}, {0x3200, 0x4DBF}, {0x4E00, 0x9FFF}, {0xA723, 0xA723}, {0xA725, 0xA725}, + {0xA727, 0xA727}, {0xA729, 0xA729}, {0xA72B, 0xA72B}, {0xA72D, 0xA72D}, {0xA72F, 0xA731}, {0xA733, 0xA733}, + {0xA735, 0xA735}, {0xA737, 0xA737}, {0xA739, 0xA739}, {0xA73B, 0xA73B}, {0xA73D, 0xA73D}, {0xA73F, 0xA73F}, + {0xA741, 0xA741}, {0xA743, 0xA743}, {0xA745, 0xA745}, {0xA747, 0xA747}, {0xA749, 0xA749}, {0xA74B, 0xA74B}, + {0xA74D, 0xA74D}, {0xA74F, 0xA74F}, {0xA751, 0xA751}, {0xA753, 0xA753}, {0xA755, 0xA755}, {0xA757, 0xA757}, + {0xA759, 0xA759}, {0xA75B, 0xA75B}, {0xA75D, 0xA75D}, {0xA75F, 0xA75F}, {0xA761, 0xA761}, {0xA763, 0xA763}, + {0xA765, 0xA765}, {0xA767, 0xA767}, {0xA769, 0xA769}, {0xA76B, 0xA76B}, {0xA76D, 0xA76D}, {0xA76F, 0xA76F}, + {0xA771, 0xA778}, {0xA77A, 0xA77A}, {0xA77C, 0xA77C}, {0xA77F, 0xA77F}, {0xA781, 0xA781}, {0xA783, 0xA783}, + {0xA785, 0xA785}, {0xA787, 0xA787}, {0xA78C, 0xA78C}, {0xA78E, 0xA78E}, {0xA791, 0xA791}, {0xA793, 0xA795}, + {0xA797, 0xA797}, {0xA799, 0xA799}, {0xA79B, 0xA79B}, {0xA79D, 0xA79D}, {0xA79F, 0xA79F}, {0xA7A1, 0xA7A1}, + {0xA7A3, 0xA7A3}, {0xA7A5, 0xA7A5}, {0xA7A7, 0xA7A7}, {0xA7A9, 0xA7A9}, {0xA7AF, 0xA7AF}, {0xA7B5, 0xA7B5}, + {0xA7B7, 0xA7B7}, {0xA7B9, 0xA7B9}, {0xA7FA, 0xA7FA}, {0xAB30, 0xAB5A}, {0xAB60, 0xAB64}, {0xAC00, 0xD7AF}, + {0xF900, 0xFAFF}, {0xFB1D, 0xFBB1}, {0xFBD3, 0xFD3D}, {0xFD50, 0xFDC7}, {0xFDF0, 0xFDFB}, {0xFE30, 0xFE4F}, + {0xFE70, 0xFEFC}, {0xFF01, 0xFF01}, {0xFF08, 0xFF09}, {0xFF0C, 0xFF0C}, {0xFF1A, 0xFF1B}, {0xFF1F, 0xFF1F}, + {0xFF41, 0xFF5A}, {0xFF5E, 0xFF5E}, {0x1EE00, 0x1EEBB}, {0x1F200, 0x1F2FF}, {0x20000, 0x2A6DF}, {0x2A700, 0x2EBEF}, + {0x2F800, 0x2FA1F}, +}; + +static const CpRange kSpacyIcons[] = { + {0xA6, 0xA6}, {0xA9, 0xA9}, {0xAE, 0xAE}, {0xB0, 0xB0}, {0x482, 0x482}, {0x58D, 0x58E}, + {0x60E, 0x60F}, {0x6DE, 0x6DE}, {0x6E9, 0x6E9}, {0x6FD, 0x6FE}, {0x7F6, 0x7F6}, {0x9FA, 0x9FA}, + {0xB70, 0xB70}, {0xBF3, 0xBF8}, {0xBFA, 0xBFA}, {0xC7F, 0xC7F}, {0xD4F, 0xD4F}, {0xD79, 0xD79}, + {0xF01, 0xF03}, {0xF13, 0xF13}, {0xF15, 0xF17}, {0xF1A, 0xF1F}, {0xF34, 0xF34}, {0xF36, 0xF36}, + {0xF38, 0xF38}, {0xFBE, 0xFC5}, {0xFC7, 0xFCC}, {0xFCE, 0xFCF}, {0xFD5, 0xFD8}, {0x109E, 0x109F}, + {0x1390, 0x1399}, {0x1940, 0x1940}, {0x19DE, 0x19FF}, {0x1B61, 0x1B6A}, {0x1B74, 0x1B7C}, {0x2100, 0x2101}, + {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2117}, {0x211E, 0x2123}, {0x2125, 0x2125}, + {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212E, 0x212E}, {0x213A, 0x213B}, {0x214A, 0x214A}, {0x214C, 0x214D}, + {0x214F, 0x214F}, {0x218A, 0x218B}, {0x2195, 0x2199}, {0x219C, 0x219F}, {0x21A1, 0x21A2}, {0x21A4, 0x21A5}, + {0x21A7, 0x21AD}, {0x21AF, 0x21CD}, {0x21D0, 0x21D1}, {0x21D3, 0x21D3}, {0x21D5, 0x21F3}, {0x2300, 0x2307}, + {0x230C, 0x231F}, {0x2322, 0x2328}, {0x232B, 0x237B}, {0x237D, 0x239A}, {0x23B4, 0x23DB}, {0x23E2, 0x2426}, + {0x2440, 0x244A}, {0x249C, 0x24E9}, {0x2500, 0x25B6}, {0x25B8, 0x25C0}, {0x25C2, 0x25F7}, {0x2600, 0x266E}, + {0x2670, 0x2767}, {0x2794, 0x27BF}, {0x2800, 0x28FF}, {0x2B00, 0x2B2F}, {0x2B45, 0x2B46}, {0x2B4D, 0x2B73}, + {0x2B76, 0x2B95}, {0x2B98, 0x2BC8}, {0x2BCA, 0x2BFE}, {0x2CE5, 0x2CEA}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, + {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, + {0x303E, 0x303F}, {0x3190, 0x3191}, {0x3196, 0x319F}, {0x31C0, 0x31E3}, {0x3200, 0x321E}, {0x322A, 0x3247}, + {0x3250, 0x3250}, {0x3260, 0x327F}, {0x328A, 0x32B0}, {0x32C0, 0x32FE}, {0x3300, 0x33FF}, {0x4DC0, 0x4DFF}, + {0xA490, 0xA4C6}, {0xA828, 0xA82B}, {0xA836, 0xA837}, {0xA839, 0xA839}, {0xAA77, 0xAA79}, {0xFDFD, 0xFDFD}, + {0xFFE4, 0xFFE4}, {0xFFE8, 0xFFE8}, {0xFFED, 0xFFEE}, {0xFFFC, 0xFFFD}, {0x10137, 0x1013F}, {0x10179, 0x10189}, + {0x1018C, 0x1018E}, {0x10190, 0x1019B}, {0x101A0, 0x101A0}, {0x101D0, 0x101FC}, {0x10877, 0x10878}, {0x10AC8, 0x10AC8}, + {0x1173F, 0x1173F}, {0x16B3C, 0x16B3F}, {0x16B45, 0x16B45}, {0x1BC9C, 0x1BC9C}, {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, + {0x1D129, 0x1D164}, {0x1D16A, 0x1D16C}, {0x1D183, 0x1D184}, {0x1D18C, 0x1D1A9}, {0x1D1AE, 0x1D1E8}, {0x1D200, 0x1D241}, + {0x1D245, 0x1D245}, {0x1D300, 0x1D356}, {0x1D800, 0x1D9FF}, {0x1DA37, 0x1DA3A}, {0x1DA6D, 0x1DA74}, {0x1DA76, 0x1DA83}, + {0x1DA85, 0x1DA86}, {0x1ECAC, 0x1ECAC}, {0x1F000, 0x1F02B}, {0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, + {0x1F0C1, 0x1F0CF}, {0x1F0D1, 0x1F0F5}, {0x1F110, 0x1F16B}, {0x1F170, 0x1F1AC}, {0x1F1E6, 0x1F202}, {0x1F210, 0x1F23B}, + {0x1F240, 0x1F248}, {0x1F250, 0x1F251}, {0x1F260, 0x1F265}, {0x1F300, 0x1F3FA}, {0x1F400, 0x1F6D4}, {0x1F6E0, 0x1F6EC}, + {0x1F6F0, 0x1F6F9}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D8}, {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, + {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0x1F900, 0x1F90B}, {0x1F910, 0x1F93E}, {0x1F940, 0x1F970}, {0x1F973, 0x1F976}, + {0x1F97A, 0x1F97A}, {0x1F97C, 0x1F9A2}, {0x1F9B0, 0x1F9B9}, {0x1F9C0, 0x1F9C2}, {0x1F9D0, 0x1F9FF}, {0x1FA60, 0x1FA6D}, +}; + diff --git a/tools/misaki-g2p/src/unicode.cpp b/tools/misaki-g2p/src/unicode.cpp new file mode 100644 index 0000000000..d37c89d650 --- /dev/null +++ b/tools/misaki-g2p/src/unicode.cpp @@ -0,0 +1,258 @@ +// SPDX-License-Identifier: Apache-2.0 +// Python string semantics and spaCy character classes from generated tables. +#include "misaki-internal.h" + +#include + +namespace misaki { +namespace { + +struct CpRange { char32_t lo, hi; }; +struct CpDigit { char32_t cp; int value; }; +struct CpMap { char32_t from, to; }; +struct CpMulti { char32_t from; const char32_t * to; }; +struct CpCompose { char32_t a, b, c; }; + +#include "unicode-tables.inc" + +template +bool in_ranges(const CpRange (&t)[N], char32_t c) { + size_t lo = 0, hi = N; + while (lo < hi) { + size_t mid = (lo + hi) / 2; + if (c < t[mid].lo) hi = mid; + else if (c > t[mid].hi) lo = mid + 1; + else return true; + } + return false; +} + +template +const CpMap * find_map(const CpMap (&t)[N], char32_t c) { + auto it = std::lower_bound(t, t + N, c, [](const CpMap & m, char32_t v) { return m.from < v; }); + return (it != t + N && it->from == c) ? it : nullptr; +} + +template +const CpMulti * find_multi(const CpMulti (&t)[N], char32_t c) { + auto it = std::lower_bound(t, t + N, c, [](const CpMulti & m, char32_t v) { return m.from < v; }); + return (it != t + N && it->from == c) ? it : nullptr; +} + +int ccc(char32_t c) { + const CpMap * m = find_map(kCombiningClass, c); + return m ? (int) m->to : 0; +} + +bool compose_pair(char32_t a, char32_t b, char32_t & out) { + auto it = std::lower_bound(kCompose, kCompose + sizeof(kCompose) / sizeof(kCompose[0]), std::make_pair(a, b), + [](const CpCompose & m, const std::pair & v) { + return m.a < v.first || (m.a == v.first && m.b < v.second); + }); + if (it != kCompose + sizeof(kCompose) / sizeof(kCompose[0]) && it->a == a && it->b == b) { + out = it->c; + return true; + } + return false; +} + +} // namespace + +std::string to_utf8(const u32 & s) { + std::string out; + out.reserve(s.size()); + for (char32_t c : s) { + if (c < 0x80) { + out += (char) c; + } else if (c < 0x800) { + out += (char) (0xC0 | (c >> 6)); + out += (char) (0x80 | (c & 0x3F)); + } else if (c < 0x10000) { + out += (char) (0xE0 | (c >> 12)); + out += (char) (0x80 | ((c >> 6) & 0x3F)); + out += (char) (0x80 | (c & 0x3F)); + } else { + out += (char) (0xF0 | (c >> 18)); + out += (char) (0x80 | ((c >> 12) & 0x3F)); + out += (char) (0x80 | ((c >> 6) & 0x3F)); + out += (char) (0x80 | (c & 0x3F)); + } + } + return out; +} + +u32 from_utf8(const char * p, size_t n) { + u32 out; + out.reserve(n); + const auto * s = (const unsigned char *) p; + size_t i = 0; + while (i < n) { + unsigned char b = s[i]; + char32_t c; + size_t len; + if (b < 0x80) { c = b; len = 1; } + else if ((b & 0xE0) == 0xC0) { c = b & 0x1F; len = 2; } + else if ((b & 0xF0) == 0xE0) { c = b & 0x0F; len = 3; } + else if ((b & 0xF8) == 0xF0) { c = b & 0x07; len = 4; } + else { out += 0xFFFD; i++; continue; } + if (i + len > n) { out += 0xFFFD; break; } + bool ok = true; + for (size_t k = 1; k < len; k++) { + if ((s[i + k] & 0xC0) != 0x80) { ok = false; break; } + c = (c << 6) | (s[i + k] & 0x3F); + } + if (!ok || (len == 2 && c < 0x80) || (len == 3 && c < 0x800) || (len == 4 && (c < 0x10000 || c > 0x10FFFF)) || + (c >= 0xD800 && c <= 0xDFFF)) { + out += 0xFFFD; + i++; + continue; + } + out += c; + i += len; + } + return out; +} + +u32 U(const char * utf8) { return from_utf8(utf8, std::char_traits::length(utf8)); } + +bool py_isalpha(char32_t c) { return c < 0x80 ? ((c | 0x20) >= 'a' && (c | 0x20) <= 'z') : in_ranges(kPyAlpha, c); } +bool py_isspace(char32_t c) { return in_ranges(kPySpace, c); } + +int py_digit_value(char32_t c) { + if (c >= '0' && c <= '9') return (int) (c - '0'); + auto it = std::lower_bound(kPyDigit, kPyDigit + sizeof(kPyDigit) / sizeof(kPyDigit[0]), c, + [](const CpDigit & d, char32_t v) { return d.cp < v; }); + if (it != kPyDigit + sizeof(kPyDigit) / sizeof(kPyDigit[0]) && it->cp == c) return it->value; + return -1; +} + +bool py_str_isalpha(const u32 & s) { + if (s.empty()) return false; + for (char32_t c : s) if (!py_isalpha(c)) return false; + return true; +} + +bool py_str_isdigit(const u32 & s) { + if (s.empty()) return false; + for (char32_t c : s) if (py_digit_value(c) < 0) return false; + return true; +} + +static void append_case(u32 & out, char32_t c, bool lower) { + if (c < 0x80) { + if (lower && c >= 'A' && c <= 'Z') c += 32; + else if (!lower && c >= 'a' && c <= 'z') c -= 32; + out += c; + return; + } + if (lower) { + // U+03A3 final sigma is context-dependent in CPython; it is not a + // letter misaki ever looks up, so the plain mapping is used. + if (const CpMulti * m = find_multi(kPyLowerMulti, c)) { out += m->to; return; } + if (const CpMap * m = find_map(kPyLowerOne, c)) { out += m->to; return; } + } else { + if (const CpMulti * m = find_multi(kPyUpperMulti, c)) { out += m->to; return; } + if (const CpMap * m = find_map(kPyUpperOne, c)) { out += m->to; return; } + } + out += c; +} + +u32 py_lower(const u32 & s) { + u32 out; + out.reserve(s.size()); + for (char32_t c : s) append_case(out, c, true); + return out; +} + +u32 py_upper(const u32 & s) { + u32 out; + out.reserve(s.size()); + for (char32_t c : s) append_case(out, c, false); + return out; +} + +u32 py_capitalize(const u32 & s) { + if (s.empty()) return s; + u32 out; + char32_t c = s[0]; + if (c < 0x80) { + out += (c >= 'a' && c <= 'z') ? c - 32 : c; + } else if (const CpMap * m = find_map(kPyTitleOne, c)) { + out += m->to; + } else { + append_case(out, c, false); + } + out += py_lower(s.substr(1)); + return out; +} + +u32 py_strip(const u32 & s) { + size_t a = 0, b = s.size(); + while (a < b && py_isspace(s[a])) a++; + while (b > a && py_isspace(s[b - 1])) b--; + return s.substr(a, b - a); +} + +u32 nfkc(const u32 & s) { + bool ascii = true; + for (char32_t c : s) if (c >= 0x80) { ascii = false; break; } + if (ascii) return s; + // 1. per-code-point compatibility mapping (each mapping is already NFKC) + u32 d; + for (char32_t c : s) { + if (const CpMulti * m = find_multi(kNfkc, c)) d += m->to; + else d += c; + } + // 2. canonical ordering of combining marks + for (size_t i = 0; i < d.size();) { + if (ccc(d[i]) == 0) { i++; continue; } + size_t j = i; + while (j < d.size() && ccc(d[j]) != 0) j++; + std::stable_sort(d.begin() + i, d.begin() + j, [](char32_t a, char32_t b) { return ccc(a) < ccc(b); }); + i = j; + } + // 3. canonical composition + u32 out; + size_t starter = u32::npos; + int last_ccc = -1; + for (char32_t c : d) { + int cc = ccc(c); + char32_t comp; + if (starter != u32::npos && (last_ccc < cc || (last_ccc == 0 && out.size() == starter + 1)) && + compose_pair(out[starter], c, comp)) { + out[starter] = comp; + continue; + } + if (cc == 0) { + starter = out.size(); + last_ccc = 0; + } else { + last_ccc = cc; + } + out += c; + } + return out; +} + +bool cat_L(char32_t c) { return in_ranges(kCatL, c); } +bool cat_Lu(char32_t c) { return in_ranges(kCatLu, c); } +bool cat_Ll(char32_t c) { return in_ranges(kCatLl, c); } +bool cat_Nd(char32_t c) { return in_ranges(kCatNd, c); } + +bool spacy_alpha(char32_t c) { return in_ranges(kSpacyAlpha, c); } +bool spacy_alpha_lower(char32_t c) { return in_ranges(kSpacyAlphaLower, c); } +bool spacy_alpha_upper(char32_t c) { return in_ranges(kSpacyAlphaUpper, c); } +bool spacy_icon(char32_t c) { return in_ranges(kSpacyIcons, c); } +bool spacy_suffix_dot_pre(char32_t c) { return in_ranges(kSpacySuffixDotPre, c); } + +u32 replace_all(u32 s, const u32 & from, const u32 & to) { + if (from.empty()) return s; + size_t pos = 0; + while ((pos = s.find(from, pos)) != u32::npos) { + s.replace(pos, from.size(), to); + pos += to.size(); + } + return s; +} + +} // namespace misaki diff --git a/tools/misaki-g2p/tests/CMakeLists.txt b/tools/misaki-g2p/tests/CMakeLists.txt new file mode 100644 index 0000000000..3f2d82bbfc --- /dev/null +++ b/tools/misaki-g2p/tests/CMakeLists.txt @@ -0,0 +1,75 @@ +# misaki-g2p tests +# +# misaki_g2p_unit pure functions + C API on a small lexicon built from +# tests/data (no network, no eSpeak needed) +# misaki_g2p_agreement the agreement gate: native output against the pinned +# Python misaki 0.9.4 reference in fixtures/reference.txt +# (>= 99.5% of words and >= 98% of sentences identical); +# needs the full lexicon and libespeak-ng 1.52.0 data +# misaki_g2p_agent the same gate on assistant-style sentences +# (fixtures/agent_style.txt) +# +# The full lexicon comes from MISAKI_G2P_LEXICON, or is built by the +# misaki_g2p_lexicon fixture (convert_misaki_lexicon.py --fetch: Python 3 and +# network access to raw.githubusercontent.com, sha256-checked). + +find_package(Python3 COMPONENTS Interpreter) + +set(MISAKI_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..) +set(MISAKI_TEST_DATA ${CMAKE_CURRENT_SOURCE_DIR}/data) + +add_executable(test-misaki-g2p test_misaki_g2p.cpp) +target_include_directories(test-misaki-g2p PRIVATE ${MISAKI_ROOT}/src) +target_link_libraries(test-misaki-g2p PRIVATE misaki_g2p) + +add_executable(test-misaki-g2p-agreement test_agreement.cpp) +target_include_directories(test-misaki-g2p-agreement PRIVATE ${MISAKI_ROOT}/src) +target_link_libraries(test-misaki-g2p-agreement PRIVATE misaki_g2p) + +if (NOT Python3_Interpreter_FOUND) + message(STATUS "misaki-g2p: Python 3 not found, lexicon-based tests are not registered") + return() +endif() + +set(MINI_LEX ${CMAKE_CURRENT_BINARY_DIR}/mini.lex) +add_test(NAME misaki_g2p_mini_lexicon + COMMAND ${Python3_EXECUTABLE} ${MISAKI_ROOT}/convert_misaki_lexicon.py --allow-unpinned + --gold ${MISAKI_TEST_DATA}/mini_gold.json --silver ${MISAKI_TEST_DATA}/mini_silver.json -o ${MINI_LEX}) +set_tests_properties(misaki_g2p_mini_lexicon PROPERTIES FIXTURES_SETUP misaki_mini_lex) + +add_test(NAME misaki_g2p_unit COMMAND test-misaki-g2p ${MINI_LEX} ${MISAKI_TEST_DATA}) +set_tests_properties(misaki_g2p_unit PROPERTIES FIXTURES_REQUIRED misaki_mini_lex) + +if (MISAKI_G2P_LEXICON) + set(FULL_LEX ${MISAKI_G2P_LEXICON}) +else() + set(FULL_LEX ${CMAKE_CURRENT_BINARY_DIR}/misaki-en-us.lex) + add_test(NAME misaki_g2p_lexicon + COMMAND ${Python3_EXECUTABLE} ${MISAKI_ROOT}/convert_misaki_lexicon.py + --fetch ${CMAKE_CURRENT_BINARY_DIR}/misaki-data -o ${FULL_LEX}) + set_tests_properties(misaki_g2p_lexicon PROPERTIES FIXTURES_SETUP misaki_full_lex TIMEOUT 600) +endif() + +# eSpeak NG data for the gate: explicit, else next to the linked library +set(GATE_ESPEAK_DATA "${MISAKI_G2P_ESPEAK_DATA}") +if (NOT GATE_ESPEAK_DATA AND MISAKI_ESPEAK_LIBRARY) + get_filename_component(_espeak_libdir ${MISAKI_ESPEAK_LIBRARY} DIRECTORY) + if (EXISTS ${_espeak_libdir}/../share/espeak-ng-data/phontab) + get_filename_component(GATE_ESPEAK_DATA ${_espeak_libdir}/../share/espeak-ng-data ABSOLUTE) + endif() +endif() + +foreach(gate agreement agent) + if (gate STREQUAL "agreement") + set(fixture ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/reference.txt) + else() + set(fixture ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/agent_style.txt) + endif() + add_test(NAME misaki_g2p_${gate} + COMMAND test-misaki-g2p-agreement --lex ${FULL_LEX} --fixture ${fixture} + --espeak "${GATE_ESPEAK_DATA}" --report ${CMAKE_CURRENT_BINARY_DIR}/${gate}-report.txt) + set_tests_properties(misaki_g2p_${gate} PROPERTIES SKIP_RETURN_CODE 77) + if (NOT MISAKI_G2P_LEXICON) + set_tests_properties(misaki_g2p_${gate} PROPERTIES FIXTURES_REQUIRED misaki_full_lex) + endif() +endforeach() diff --git a/tools/misaki-g2p/tests/compare_misaki.py b/tools/misaki-g2p/tests/compare_misaki.py new file mode 100644 index 0000000000..b3b7ecb5ed --- /dev/null +++ b/tools/misaki-g2p/tests/compare_misaki.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +"""Agreement gate between the native misaki_g2p and the pinned Python misaki. + +Paradee-8M was trained on phonemes from misaki 0.9.4 configured as in +paradee/tts.py. This script runs that exact configuration (versions pinned in +../pins.json, "reference_python") and the native misaki-g2p-cli, and compares +them per word and per sentence. + + reference run Python misaki on the corpus and write the fixture + (tests/fixtures/reference.txt + .sha256) the CTest gate reads + compare run misaki-g2p-cli --dump and score it against a fixture, + writing a report that lists every mismatch + extended reference + compare on more WikiText sentences (not a gate: + shows how well the rules generalise beyond the gate corpus) + numbers check the native number words against num2words + +Reference environment (Python 3.12): + pip install misaki==0.9.4 spacy==3.8.16 num2words==0.5.14 phonemizer-fork==3.3.2 \\ + espeakng-loader==0.2.4 addict regex \\ + https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl +num2words is LGPL-2.1 and only used here; the native number code is independent. +""" +import argparse +import hashlib +import json +import os +import subprocess +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.dirname(HERE) +PINS = json.load(open(os.path.join(ROOT, "pins.json"), encoding="utf-8")) +CORPUS = [ + ("paradee_samples", os.path.join(HERE, "corpus", "paradee_samples.txt")), + ("wikitext_heldout_200", os.path.join(HERE, "corpus", "wikitext_heldout_200.txt")), + ("eliza_android_sentences", os.path.join(HERE, "corpus", "eliza_android_sentences.txt")), +] +AGENT_CORPUS = [("agent_style", os.path.join(HERE, "corpus", "agent_style.txt"))] +WORD_GATE = 0.995 +SENTENCE_GATE = 0.98 + + +def paradee_vocab(): + # Paradee-8M v1.0 config.json vocab keys (see pins.json paradee_model) + return set(";:,.!?—…\"()“” ̃ʣʥʦʨᵝꭧAIOQSTWYᵊ" + "abcdefhijklmnopqrstuvwxyzɑɐɒæβɔɕçɖðʤə" + "ɚɛɜɟɡɥɨɪʝɯɰŋɳɲɴø" + "ɸθœɹɾɻʁɽʂʃʈʧʊʋʌɣ" + "ɤχʎʒʔˈˌːʰʲ↓→↗↘ᵻ") + + +VOCAB = paradee_vocab() + + +def vocab_filter(s): + """What paradee feeds the model: generate_from_phonemes keeps `c in vocab`.""" + return "".join(c for c in s if c in VOCAB) + + +def load_corpus(corpus=CORPUS): + out = [] + for name, path in corpus: + with open(path, encoding="utf-8") as f: + for i, line in enumerate(f): + line = line.rstrip("\n") + if line.strip(): + out.append((f"{name}:{i + 1}", line)) + return out + + +def make_g2p(): + """misaki exactly as paradee/tts.py builds it.""" + import importlib.metadata as md + want = PINS["reference_python"] + got = {k: md.version(k) for k in ("misaki", "spacy", "num2words", "phonemizer-fork", "espeakng-loader", "en_core_web_sm")} + for k, v in got.items(): + pin = want[k] if k in want else None + if pin and v != pin: + raise SystemExit(f"{k} {v} != pinned {pin}") + import espeakng_loader + import shutil + import tempfile + from phonemizer.backend.espeak.wrapper import EspeakWrapper + data = espeakng_loader.get_data_path() + if len(data) > 120: + # libespeak-ng keeps the data path in a 160-byte buffer; long venv + # paths fail with a misleading "No such file" error. + tmp = tempfile.mkdtemp(prefix="espeak") + shutil.copytree(data, os.path.join(tmp, "espeak-ng-data")) + data = os.path.join(tmp, "espeak-ng-data") + from misaki import en, espeak # noqa: E402 (misaki/espeak.py sets the library on import) + EspeakWrapper.set_data_path(data) + return en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk="") + + +def paradee_chunks(phonemize, text, max_phonemes=510): + import re + for sentence in re.split(r"(?<=[.!?…])\s+|\n+", text.strip()): + if not sentence.strip(): + continue + ps = phonemize(sentence) + while len(ps) > max_phonemes: + cut = ps.rfind(" ", 0, max_phonemes) + cut = cut if cut > 0 else max_phonemes + yield ps[:cut] + ps = ps[cut:].lstrip() + if ps: + yield ps + + +def run_reference(items): + g2p = make_g2p() + recs = [] + for sid, text in items: + ps, toks = g2p(text) + chunks = list(paradee_chunks(lambda s: g2p(s)[0], text)) + recs.append(dict(id=sid, text=text, ps=ps, chunks=chunks, + toks=[(t.text, t.phonemes or "", t.whitespace, t.tag) for t in toks])) + return recs + + +def write_fixture(recs, path): + lines = [ + "# misaki 0.9.4 reference phonemes for tools/misaki-g2p (generated by tests/compare_misaki.py reference).", + "# Configuration: en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk='')", + "# Lines: S idtext, P phonemes, C paradee chunk, T tokenphonemeswhitespacetag.", + "# Phonemes are as misaki returns them; the gate compares them after Paradee's vocab filter.", + ] + for r in recs: + for field in (r["text"],) + tuple(r["chunks"]): + if "\t" in field or "\n" in field: + raise SystemExit(f"{r['id']}: tab or newline in fixture field") + lines.append(f"S\t{r['id']}\t{r['text']}") + lines.append(f"P\t{r['ps']}") + for c in r["chunks"]: + lines.append(f"C\t{c}") + for t in r["toks"]: + lines.append("T\t" + "\t".join(t)) + data = ("\n".join(lines) + "\n").encode("utf-8") + with open(path, "wb") as f: + f.write(data) + digest = hashlib.sha256(data).hexdigest() + with open(path + ".sha256", "w") as f: + f.write(f"{digest} {os.path.basename(path)}\n") + return digest + + +def read_fixture(path): + recs = [] + with open(path, encoding="utf-8") as f: + for line in f: + line = line.rstrip("\n") + if not line or line.startswith("#"): + continue + kind, _, rest = line.partition("\t") + if kind == "S": + sid, _, text = rest.partition("\t") + recs.append(dict(id=sid, text=text, ps="", chunks=[], toks=[])) + elif kind == "P": + recs[-1]["ps"] = rest + elif kind == "C": + recs[-1]["chunks"].append(rest) + elif kind == "T": + parts = rest.split("\t") + while len(parts) < 4: + parts.append("") + recs[-1]["toks"].append(tuple(parts[:4])) + return recs + + +def run_native(cli, lex, espeak, texts): + cmd = [cli, "--lex", lex, "--dump"] + if espeak: + cmd += ["--espeak", espeak] + out = subprocess.run(cmd, input="\n".join(texts) + "\n", capture_output=True, text=True, check=True).stdout + recs = [] + for line in out.split("\n"): + if not line: + continue + kind, _, rest = line.partition("\t") + if kind == "S": + recs.append(dict(text=rest, ps="", chunks=[], toks=[])) + elif kind == "P": + recs[-1]["ps"] = rest + elif kind == "C": + recs[-1]["chunks"].append(rest) + elif kind == "T": + parts = rest.split("\t") + while len(parts) < 4: + parts.append("") + recs[-1]["toks"].append(tuple(parts[:4])) + if len(recs) != len(texts): + raise SystemExit(f"native produced {len(recs)} records for {len(texts)} inputs") + return recs + + +def align(a, b): + """LCS alignment of two token-text sequences -> list of (i, j).""" + n, m = len(a), len(b) + dp = [[0] * (m + 1) for _ in range(n + 1)] + for i in range(n - 1, -1, -1): + for j in range(m - 1, -1, -1): + dp[i][j] = dp[i + 1][j + 1] + 1 if a[i] == b[j] else max(dp[i + 1][j], dp[i][j + 1]) + i = j = 0 + pairs = [] + while i < n and j < m: + if a[i] == b[j]: + pairs.append((i, j)) + i += 1 + j += 1 + elif dp[i + 1][j] >= dp[i][j + 1]: + i += 1 + else: + j += 1 + return pairs + + +def is_word(text): + return any(c.isalnum() for c in text) + + +def score(ref, nat): + words = word_ok = sents = sent_ok = 0 + mismatches = [] + for r, n in zip(ref, nat): + sents += 1 + want = vocab_filter(r["ps"]) + ok = want == n["ps"] and [vocab_filter(c) for c in r["chunks"]] == n["chunks"] + sent_ok += ok + rt = [t[0] for t in r["toks"]] + nt = [t[0] for t in n["toks"]] + pairs = dict(align(rt, nt)) + bad = [] + for i, tok in enumerate(r["toks"]): + if not is_word(tok[0]): + continue + words += 1 + j = pairs.get(i) + got = n["toks"][j][1] if j is not None else None + if got is not None and vocab_filter(tok[1]) == got: + word_ok += 1 + else: + bad.append((tok[0], tok[3], vocab_filter(tok[1]), got, n["toks"][j][3] if j is not None else "-")) + if not ok or bad: + mismatches.append(dict(id=r.get("id", ""), text=r["text"], ref=want, nat=n["ps"], words=bad)) + return dict(words=words, word_ok=word_ok, sents=sents, sent_ok=sent_ok, mismatches=mismatches) + + +def report(s, path, title): + wr = s["word_ok"] / max(1, s["words"]) + sr = s["sent_ok"] / max(1, s["sents"]) + passed = wr >= WORD_GATE and sr >= SENTENCE_GATE + lines = [f"# {title}", "", + f"words: {s['word_ok']}/{s['words']} = {wr:.4%} (gate >= {WORD_GATE:.1%})", + f"sentences: {s['sent_ok']}/{s['sents']} = {sr:.4%} (gate >= {SENTENCE_GATE:.0%})", + f"result: {'PASS' if passed else 'FAIL'}", "", + f"## mismatches ({len(s['mismatches'])} sentences)", ""] + for m in s["mismatches"]: + lines.append(f"- {m['id']} {m['text']}") + lines.append(f" misaki: {m['ref']}") + lines.append(f" native: {m['nat']}") + for w, tag, want, got, ntag in m["words"]: + lines.append(f" word {w!r} [{tag} / native {ntag}]: misaki {want!r} native {got!r}") + text = "\n".join(lines) + "\n" + if path: + with open(path, "w", encoding="utf-8") as f: + f.write(text) + print("\n".join(lines[:5])) + return passed + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + sub = ap.add_subparsers(dest="cmd", required=True) + r = sub.add_parser("reference") + r.add_argument("--out", default=os.path.join(HERE, "fixtures", "reference.txt")) + c = sub.add_parser("compare") + c.add_argument("--cli", required=True) + c.add_argument("--lex", required=True) + c.add_argument("--espeak", required=True, help="espeak-ng-data directory (eSpeak NG 1.52.0)") + c.add_argument("--fixture", default=os.path.join(HERE, "fixtures", "reference.txt")) + c.add_argument("--report") + e = sub.add_parser("extended") + e.add_argument("--cli", required=True) + e.add_argument("--lex", required=True) + e.add_argument("--espeak", required=True) + e.add_argument("--wikitext", required=True, help="paradee training/data/wikitext_sents.json") + e.add_argument("--start", type=int, default=200) + e.add_argument("--count", type=int, default=1000) + e.add_argument("--report") + nm = sub.add_parser("numbers") + nm.add_argument("--cli", required=True) + a = ap.parse_args() + + if a.cmd == "reference": + recs = run_reference(load_corpus()) + digest = write_fixture(recs, a.out) + print(f"{a.out}: {len(recs)} sentences, sha256 {digest}") + agent_out = os.path.join(os.path.dirname(a.out), "agent_style.txt") + recs = run_reference(load_corpus(AGENT_CORPUS)) + digest = write_fixture(recs, agent_out) + print(f"{agent_out}: {len(recs)} sentences, sha256 {digest}") + elif a.cmd == "compare": + ref = read_fixture(a.fixture) + nat = run_native(a.cli, a.lex, a.espeak, [x["text"] for x in ref]) + ok = report(score(ref, nat), a.report, "misaki-g2p agreement gate") + sys.exit(0 if ok else 1) + elif a.cmd == "extended": + data = open(a.wikitext, "rb").read() + if hashlib.sha256(data).hexdigest() != PINS["paradee"]["wikitext_sents_json"]["sha256"]: + raise SystemExit("wikitext_sents.json does not match the pin") + sents = json.loads(data)[a.start:a.start + a.count] + ref = run_reference([(f"wikitext:{a.start + i}", s) for i, s in enumerate(sents)]) + nat = run_native(a.cli, a.lex, a.espeak, [x["text"] for x in ref]) + report(score(ref, nat), a.report, f"misaki-g2p extended check (wikitext {a.start}..{a.start + a.count})") + elif a.cmd == "numbers": + from num2words import num2words + import random + rnd = random.Random(1234) + cases = [] + vals = list(range(0, 2101)) + [rnd.randrange(0, 10 ** rnd.randrange(1, 37)) for _ in range(3000)] + for v in vals: + cases.append(("cardinal", str(v), num2words(v))) + cases.append(("ordinal", str(v), num2words(v, to="ordinal"))) + for v in range(1, 10000): + cases.append(("year", str(v), num2words(v, to="year"))) + for _ in range(2000): + ip = rnd.randrange(0, 10 ** rnd.randrange(1, 7)) + fp = str(rnd.randrange(0, 10 ** rnd.randrange(1, 6))).rjust(rnd.randrange(1, 6), "0") + txt = f"{ip}.{fp}" + cases.append(("float", txt, num2words(float(txt)))) + out = subprocess.run([a.cli, "--numbers"], input="\n".join(f"{k} {v}" for k, v, _ in cases) + "\n", + capture_output=True, text=True, check=True).stdout.split("\n") + bad = [(k, v, want, got) for (k, v, want), got in zip(cases, out) if want != got] + for b in bad[:40]: + print("MISMATCH", b) + print(f"numbers: {len(cases) - len(bad)}/{len(cases)} equal to num2words") + sys.exit(1 if bad else 0) + + +if __name__ == "__main__": + main() diff --git a/tools/misaki-g2p/tests/corpus/agent_style.txt b/tools/misaki-g2p/tests/corpus/agent_style.txt new file mode 100644 index 0000000000..a4c7c1b096 --- /dev/null +++ b/tools/misaki-g2p/tests/corpus/agent_style.txt @@ -0,0 +1,70 @@ +I'm on it. Your appointment is at 3:30 PM tomorrow. +It's 72°F and sunny in San Francisco right now. +You have 3 new emails and 1 missed call from Dr. Patel. +The total comes to $45.99, including a 15% tip. +I couldn't find that contact. Do you want me to try again? +Your flight UA 1234 departs at 6:05 a.m. on March 21st. +Sure! I've set a timer for 10 minutes. +The meeting was moved to Friday, June 14, 2024. +Here's the address: 1600 Amphitheatre Parkway, Mountain View, CA 94043. +Battery is at 87%, and Wi-Fi is connected. +I'll remind you to call Mom at 5 o'clock. +That's about 2.5 miles, or roughly a 10-minute drive. +You said "buy milk" — I added it to your list. +Your package from Amazon will arrive between 2 and 4 p.m. +Visit https://example.com/help for more details. +Email me at jane.doe@example.com if anything changes. +The score is 3-2 with five minutes left in the 2nd half. +I don't have access to your camera right now. +NASA and the FBI both released statements on Tuesday. +Turn left onto Main St. in 500 feet. +Your heart rate averaged 64 bpm over the last 24 hours. +Let's record a quick voice memo and then read it back. +We live close to the station, so it's a short walk. +He read the report yesterday; I'll read it today. +The lead singer used to live in a small town near the lead mine. +It costs €20 or about £17. +Temperatures will drop to -5 degrees overnight. +I'm sorry, I didn't catch that. Could you repeat it? +Please present your ID at the front desk. +The 1990s were a great decade for music. +OK, I've turned off the lights in the living room and the kitchen. +Your next reminder: take the blue pill with water. +Call 911 if this is an emergency. +The project is 75 percent complete and on schedule. +What's the weather like this weekend? +I've opened YouTube for you. +Version 2.0.1 fixes three bugs. +The Smiths' house is the one with the red door. +Rock 'n' roll never dies. +She said, “I'll be there by noon.” +Good evening! You've got two meetings left today. +Your Uber is 4 minutes away, a white Toyota Camry. +I've added eggs, bread, and coffee to your shopping list. +The stock closed at $182.50, up 1.2% from yesterday. +Can you hear me okay? The connection seems weak. +Alarm set for 7:15 AM on weekdays. +Your daughter Emma sent a photo at 2:47 PM. +I'm not sure, but I can look it up for you. +It's going to rain on Saturday, so bring an umbrella. +The museum opens at 9 and closes at 5:30. +You walked 8,432 steps today — great job! +Dinner reservations for four at 7 p.m. are confirmed. +Would you like me to read your messages aloud? +The update will install overnight and restart your phone. +I've muted notifications until 8 o'clock tomorrow morning. +The next train to Boston leaves from platform 3B. +Your prescription refill is ready at CVS on Elm St. +It's Mike's birthday on the 3rd of July. +Here are the top 5 results for "Italian restaurants near me". +The volume is now at 60 percent. +You spent $1,250 on groceries last month. +I can't do that yet, but I'm learning. +Press and hold the power button for 10 seconds. +Your password must be at least 12 characters long. +The U.S. Open starts on August 26th. +I'd recommend leaving by 4:15 to avoid traffic. +Mr. and Mrs. Johnson will arrive at noon. +That's a 30% discount on the original price. +The kids' soccer game was rescheduled to Sunday. +Your calendar is clear for the rest of the week. diff --git a/tools/misaki-g2p/tests/corpus/eliza_android_sentences.txt b/tools/misaki-g2p/tests/corpus/eliza_android_sentences.txt new file mode 100644 index 0000000000..4893933f0f --- /dev/null +++ b/tools/misaki-g2p/tests/corpus/eliza_android_sentences.txt @@ -0,0 +1,25 @@ +Good morning. Let us set up your tablet together. +Please connect to your home wireless network. +Tap the large green button when you are ready. +Your electric bill is due next Friday. +I can read your mail out loud whenever you like. +Would you like me to call your daughter? +The weather today is sunny and warm. +Remember to take your medicine after lunch. +Your doctor appointment is on Tuesday morning. +I did not hear you clearly. Could you say that again? +Please type the code that was sent to your email. +Your payment was received and you are all set. +We can stop here and finish this later. +Thank you for your patience while I check that. +Turn the volume up if my voice is too quiet. +This tablet works best when it stays plugged in. +Goodbye for now. I will be here when you need me. +The birch canoe slid on the smooth planks. +Glue the sheet to the dark blue background. +It is easy to tell the depth of a well. +These days a chicken leg is a rare dish. +Rice is often served in round bowls. +The quick brown fox jumps over the lazy dog. +A large size in stockings is hard to sell. +The juice of lemons makes fine punch. diff --git a/tools/misaki-g2p/tests/corpus/paradee_samples.txt b/tools/misaki-g2p/tests/corpus/paradee_samples.txt new file mode 100644 index 0000000000..94e18b8046 --- /dev/null +++ b/tools/misaki-g2p/tests/corpus/paradee_samples.txt @@ -0,0 +1,5 @@ +As of August 2015, there were 169 proposed targets for these goals and 304 proposed indicators to show compliance. +White dwarf stars, if they have a near companion, may then become Type Ia supernovae. +According to Herodotus, this was because they had decided in council that they could not beat the Allies in a naval battle. +In 1997 Hurlbut's career focused on light as applied to photography and film, and he owned a lighting business in Pasadena, California. +Harvey ended with a century on his Ashes debut, scoring 112 from 183 balls in an innings noted for powerful driving on both sides of the wicket. diff --git a/tools/misaki-g2p/tests/corpus/wikitext_heldout_200.txt b/tools/misaki-g2p/tests/corpus/wikitext_heldout_200.txt new file mode 100644 index 0000000000..482b7e0010 --- /dev/null +++ b/tools/misaki-g2p/tests/corpus/wikitext_heldout_200.txt @@ -0,0 +1,200 @@ +As of August 2015, there were 169 proposed targets for these goals and 304 proposed indicators to show compliance. +White dwarf stars, if they have a near companion, may then become Type Ia supernovae. +According to Herodotus, this was because they had decided in council that they could not beat the Allies in a naval battle. +The ashes were later taken to Veluvana, where they were enshrined in a silver stupa. +Ten priests of the Evangelical Lutheran Church of Finland and 90 (moderate) socialists were executed also. +In 1997 Hurlbut's career focused on light as applied to photography and film, and he owned a lighting business in Pasadena, California. +In the Canadian Hot 100, the peaked and debuted at number 73 on the week ending August 9, 2008 due to digital downloads. +The gateway was opened on December 4, 1924, by the Viceroy, the Earl of Reading. +The original traction motors were used in the construction of the 20 C type'Desert Gold'cars which were being built at the same time. +Harvey ended with a century on his Ashes debut, scoring 112 from 183 balls in an innings noted for powerful driving on both sides of the wicket. +She described it as " an upbeat song. +The video begins with Brown singing alone in a desert in front of a sunset backdrop. +The most common approach to turn this intuitive idea into a precise definition is to define the derivative as a limit of difference quotients of real numbers. +Before the conquest, this territory contained a number of competing Mesoamerican kingdoms, the majority of which were Maya. +The oil was moved in earthenware vessels to the river bank where it was then poured into boat holds for transportation to Britain. +Details surrounding the accident are slowly revealed as the series progresses. +Also at this time, the route was widened into a divided highway from the Christiana Mall north to Stanton. +After telling Thalaba to turn to the darker powers, Thalaba leaves. +His father ran a family trucking company, and his mother was a secretary. +WWE Divas Championship (3 times) +The Welsh were also early adopters of roasting cheese. +He reveals he felt guilty for hurting her, so he explained his behavior to her new friends and asked them to sign her yearbook. +Snowfall occurs occasionally and can cause travel disruption when this happens. +The Minister for Local Government dismissed the Council and its Mayor, Rob Drew, and appointed an administrator upon receiving the inquiry's report. +Lita joined the two in the segment, making this the first time the three had been seen together on WWE television since February 2003. +The League took control of much of northern France to secure French ports for his armada. +School on Saturdays was abolished at the Prep School in 1999. +The game's corporate sponsor is Dr Pepper. +Despite the new leadership in the city, there were still conservative strongholds. +John Wilson (1847) writes that the tomb lies about two or three hundred yards to the north of Jacob's Well, across the valley. +It is, however, impossible to know exactly how the Naxians became aware of the invasion, but undoubtedly they were aware, and began to make preparations. +Similar judgments have been made by other critics when they reviewed the preceding works by Ebner, such as Wolfgang Ratz about Auf der Kippe or Julia Rafael about Lose. +Out in the bay, the Alta Vista Reef can be spotted from this location. +The text of the Gospels is largely drawn from the Vulgate, although it also includes several passages drawn from the earlier versions of the Bible known as the Vetus Latina. +The hurricane killed two people when it passed near Aruba. +Arnold was buried at St. +A newspaper inquiry was published that requested " fresh blood " to the flock which had now ceased breeding. +James Cameron has said that he " tried to make a film that would touch people's spirituality across the broad spectrum. +Metastases often have a characteristic round appearance on chest radiograph. +Within North America, the distribution of attacks is not uniform. +The game's commercial failure and resulting effects on Atari are frequently cited as a contributing factor to the video game industry crash of 1983. +The first commercially viable process for producing liquid oxygen was independently developed in 1895 by German engineer Carl von Linde and British engineer William Hampson. +The gray allotrope of selenium is made from spirals on selenium atoms, while one of the red allotropes is made of stacks of selenium rings (Se8). +Xenoceratops - (Alberta, Canada) +The name " Missoula " came from the Salish name for the Clark Fork River, " nmesuletkw ", which roughly translates as " place of frozen water ". +He gets all the credit for it! +On May 19, 2011, West joined the Golden State Warriors as an executive board member, reporting directly to new owners Joe Lacob and Peter Guber. +Themes of the boards include dreams of toys and treasure hunting, among others. +In one rare instance, a female wood turtle hybridized with a male Blanding's turtle. +On 3 July 2012, US Secretary of State Hillary Clinton officially, however briefly, apologized for the losses suffered by the Pakistani military. +At Chenonceau, she added waterfalls, menageries, and aviaries, laid out three parks, and planted mulberry trees for silkworms. +This town hall stood on " pillars and arches of hewen stone " and under it was the exchange for merchants and traders to carry out their business. +Retrieved 4 March 2016. +John then gives Sam and Dean a loving smile before becoming engulfed in a white light. +Subsequently, he went to the United Kingdom to study, majoring in sculpture. +Charles Babbage, the Victorian mathematician and computer pioneer, was probably born at 44 Crosby Row, now Larcom Street, Walworth Road on 26 December 1791. +They were elected to the Western League in 1973 but were relegated three years later in 1976. +At the confluence of the Mersey and Irwell near Irlam, the canal follows the old course of the River Irwell into Manchester. +The Japanese naval forces lingered near the northern Solomons, out of range of the U.S. +Soring is an act of animal cruelty that gives practitioners an unfair advantage over other competitors. +The executives enjoyed the story: Michael Roberts, a senior executive, called the episode's plot " great " and noted that " the conceit is really cool ". +Melee is a crossover action game developed by HAL Laboratory and published by Nintendo for the GameCube video game console. +Godwin himself did not seem particularly ready for parenthood and he now had two small children to raise and no steady source of income. +Given the planet's high mass, the planet is a gas giant with no solid surface. +The Virgin Islands experienced heavy damage, as well. +Shoji's 1st Battalion, 230th Infantry Regiment " stumbled " into Puller's lines about 22: 00 and were driven off by Puller's men. +Then he becomes a complex individual with fears and desires. +On November 22, a tropical depression developed near Chuuk and moved westward. +The ship settled to the bottom, but the water was so shallow as to aid salvage efforts. +Guts and Glory took the early lead when Mabel pinned Prichard after performing a crossbody from the second rope. +I was born and raised in iron ore country, where you could breathe it and smell it every day. +The businesses involved indicated at the time that they would revise their proposals and reapply. +Cohen, Roger (November 22, 1994). +After the Passamaquoddy project fell through, Casey served with the Boston Engineer District on flood control surveys of the Connecticut River Valley. +Since Tubas is the capital and largest city in the Tubas Governorate, it acts as the main provider of services to the towns and villages of the governorate. +Although Brutus defeated Octavian, Antony defeated Cassius, who committed suicide. +In 1947, a young disk jockey in Charlotte, North Carolina who worked the overnight shift had recently received some older records which he brought to work with him. +The album was on the Billboard Independent Albums Chart for four weeks, peaking at No. +On all flights, passengers are provided with food and complimentary beverages on board, in both classes. +The President of the United States takes pleasure in presenting the MEDAL OF HONOR to +There is no documentation detailing exactly when Kentucky's provisional government ceased operation. +The station would have featured six 170 feet (52 m) high cooling towers. +The Medal of Honor with the flag was presented by President George W. +Pliny lists over 900 drugs, compared to 600 in Dioscorides's De Materia Medica, 550 in Theophrastus, and 650 in Galen. +Firstly, he reviews the evidence about how serious the situation is already and how much worse it will get. +Caroline begins to descend, and both Mac and Guy grab hold of one her legs to bring her down, but instead they are lifted into the air with her. +Some features of the skull are variable between individuals; for example, the thickness of the upper border of the orbit and the height of the posterior maxilla. +Michael Schiavo opposed the Governor's intervention in Schiavo's case, and was represented, in part, by the American Civil Liberties Union (ACLU). +We do however know and so does Formby, that certain lines in the lyric must not be broadcast ". +Thompson, a producer for 60 Minutes, was a former US Navy officer and naval gunfire spotter who had served two tours of duty during the Vietnam War. +A polygamist, Idi Amin married at least six women, three of whom he divorced. +The family is invited to Burns'castle in Pennsylvania, where Bart and Lisa discover a secret staircase descending to an eerie basement filled with coffins. +He added that a war is not as straightforward and immature as it is portrayed in various shooters. +It was cancelled permanently after the third season and it went into broadcast syndication. +It was replaced by Blackwood Field in the Hermitage community, which operated between 1921 and 1928. +Any of these changes may result in back pain. +When the other guests have left, Bond remarks that if he ever marries, he imagines it would be nice to marry an air hostess. +He is considered the precursor of Argentine journalism. +Mickiewicz's childhood environment exerted a major influence on his literary work. +Cross discovered the truth, went rogue, and started killing Fraternity members to keep them away from his son. +At the north end of the city, White Sands Boulevard and the Charles T. +In 1917 Parsons travelled to Roswell, New Mexico to take the United States Naval Academy exam for one of the appointments by Senator Andrieus A. +The Noronha skink (Trachylepis atlantica) is a species of skink from the island of Fernando de Noronha off northeastern Brazil. +Reverend Sampson (Howard Bell) then invites everyone to stand as Charlene and Henry begin their walk up the aisle. +Malaysia agreed to this in 1994. +Around 1009, Samuel or his father married a sister of Stephen I, the first King of Hungary. +The Magistrates'Court in the city was inaugurated in 1963. +She had previously been in A Hoosier Romance, also based on Riley's work. +Arca pennantiana Leach in Gray, 1852: synonym of Striarca lactea (Linnaeus, 1758) +The video was shot in Cape Town, South Africa in early September 2012. +As Carey handed him the record, Tommy Mottola quickly grabbed the tape, insisting that he would deal with " the project ". +In the novel, Hemingway presents his notion that the " Lost Generation ", considered to have been decadent, dissolute and irretrievably damaged by World War I, was resilient and strong. +Though he tries not to harm other people, someone or something always ends up burning. +Rehman signed a deal with Hong Kong First Division League side Kitchee on 11 January 2012. +The above procedure can be performed for any choice of a. +In the end they decided to localize it, which was considered a big risk for the company. +Jones became the first foreigner to coach the English side. +He preached moderation in socializing, including avoiding alcohol, to his players. +Later in 2002, Linkin Park released an album entitled Reanimation. +The issue of piracy cropped up when a news article published in The Indian Express exposed the dark side of the film market. +The UK Defence Secretary, Michael Heseltine, who had supported the Agusta deal, resigned in protest. +Keyes, a television producer and director, who remained with the role for many years. +Large quantities of gold from Mexico also passed through its port annually. +It features production from Aftermath Entertainment producer DJ Khalil, who helped write the song along with Eminem, Erik Alcock, and Columbus " Rahki " Smith. +One of the best examples of this was the defense of Ternovaya, where defending German units absolutely refused to surrender. +Muter and Sebastian never filed formal charges against Marshall for perjury. +A steel line engraving of the painting by the engraver Edward Goodall was also commissioned. +Kirk, Alpa, Jeff, and Kevin discover Flaming Dragon's heroin factory. +Later, Gavin escapes from house arrest and shows up at the 30 Rock studios. +And they practically raise themselves, what with the Internet and all ", from " Eight Misbehavin'" (season 11, 1999). +Retrieved May 5, 2015. +The students rebelled and went on strike, an event Pierce was suspected of leading. +He had intended to stay in Dublin for a week, but Boycott was advised to cut his stay short. +She was the eldest daughter of Edward IV, and all their children were his cognatic heirs. +Early notable games were Play Zone!'s PC game Animaniacs Game Pack! +When first entering the queue, guests are taken past a number of banners for the Triwizard Tournament showing support for the four contestants. +That's also why my work is inimitable. +The BBC further defended the episode, by stating the Muslim involvement towards making it, and that it does not suggest that mosques breed terrorists. +Kasagi took Yashima in tow, but the battleship's list continued to increase and she capsized about three hours later. +The escaping steam sprayed through the living compartments and decks. +The scenes at Reiden Lake were actually shot on a parking lot, and the crew placed a covering over it to simulate the cracks normally on a lake. +NY 122 serves as a northerly bypass of the village of Malone, situated 6 miles (10 km) to the south. +At the same time, Banner dreams that Chris committed the murders. +It is revealed that Bill Mulder and the Smoking Man are two of the agents who are interviewing the crewman. +John tries his best to make something good in his life, but most of it leading to failure. +The composers started their writing separately, Cornell in his apartment in Paris, and Arnold in his house in London. +When opened on the left, the front doors of the cabinet exposed a number of gears and cogs similar to clockwork. +Of the past 20 Grand Slam drawsheets, they have been drawn in the same half 16 times. +Stone assigned these individuals to handle his business dealings, find drugs and protect him from those he considered enemies, among them his own bandmates and staff. +In TNA, he is the manager for former TNA X Division Champion Trevor Lee. +On 21 August, Newland led his company in an assault on a series of trenches slightly north east of the farm. +Anouska Hempel as an Australian girl. +Sledd died deep in debt, having lost the family home to foreclosure after the salaries of Candler professors were cut when financial support of the school fell during the 1930s. +They found a deserted village, as the St Kildans, fearing pirates, had fled to caves to the west. +The diver obtains the depth and duration of each stop from a dive computer, decompression tables or dive planning computer software. +Water pressure unseated the valve and allowed the compartment to flood as the receiving pipe had earlier been removed for repair. +After Percy is attacked by a monster which shouldn 't have gotten through the camp's borders, Percy is publicly claimed by his father, the god Poseidon. +Congress on bankruptcy law. +The Queen's School of Business has received significant recognition in the past years. +DE 2 was routed to bypass Newark and DE 2 Bus. +Martha and Clark drive up and catch him as he stumbles to the ground. +The society ends up before the female mayor who jails all of them, save for Jack who she proposes to. +I 've always felt the best kinds of songs are the ones where anybody can listen to it, put themselves in it and say,'Yeah, that's me.'" +The leak and subsequent events in the same match brought varied opinions from journalists and former players on Bodyline into the newspapers, both for and against Bodyline tactics. +According to court testimony, the defendant in speaking made a gesture of sighting down the barrel of a rifle. +Although Kublai would not forget this slight of imprisoning his ambassadors, he nonetheless had to focus on more pressing affairs with the threat of his brother and rival Khan. +Credits adapted from the liner notes of Rated R, Def Jam Recordings, SRP. +In 1970, American paddlefish were stocked in several rivers in Europe and Asia. +It's a race, I 'm here to win and so I approach it the same. +She was hit twice in return, however; the first hit caused minimal damage, but the second struck her third funnel. +The launch track is equipped with retractable magnetic braking fins which are raised after the train is launched in order to slow one that did not crest the hill. +Although Lady Penelope and Parker (the latter voiced by Graham) were among the first characters developed, neither was conceived as a major role. +After ten years, clearly struggling with his conscience, Wooden Leg resigned the post, but was later persuaded to take it on again by a new Indian agent. +During the dance, Grey and Shepherd escape Dandridge and Montgomery to have a heated argument that leads to sexual intercourse. +Meanwhile, the other Huaorani warriors, led by Gikita, attacked the three missionaries still on the beach, spearing Saint first, then McCully as he rushed to stop them. +The military band began to play the Victorian hymn " My Faith Looks Up to Thee " as the Reagan children said their goodbyes. +Following the divorce, Jackson would go on to have a third child. +Fluor Corporation is a multinational engineering and construction firm headquartered in Irving, Texas. +The following credits are from AllMusic and from the Romance liner notes: +The Somerset Miners'Association was founded in 1872, later becoming an area of the National Union of Mineworkers. +The name Chataan means " rainy day " in the Chamorro language, which is spoken on Guam. +The family home is now a museum. +She reveals her errand, Kep sees through the fox's plan at once, and finds out from Jemima where the fox lives. +The Bible is central in Zwingli's work as a reformer and is crucial in the development of his theology. +The classification of Deinocheirus was long uncertain, and it was initially placed in the theropod group carnosauria, but similarities with ornithomimosaurians were soon noted. +You 've seen a lot of people die. +With the Army of the Potomac in disarray and the Confederates on the offensive, an attack on Washington was expected at any moment. +On one hand, due to a less specialized design, an OBO suffers more from wear and tear during dry cargo onload than a bulker. +This skull was taken out of Mr. +Against his advice, Susan climbs a tall ladder next to the dinosaur to be closer to him. +Brett Myers retired the first two batters in the top of the eighth, but Hideki Matsui then hit a solo home run pinch hitting for Chamberlain. +Nicola Stephenson as Julie Fitzjohn, Staff Nurse, Darwin +Much of the prison was demolished in the 1870s, though parts of it were used as shops and rooms into the 20th century. +Bollinger became the 19th President of Columbia University on June 1, 2002. +Paton made 22 visits to the site, of a total duration of 267 days. +On 26 February, Nasser accepted the resignation, put Naguib under house arrest, and the RCC proclaimed Nasser as both RCC chairman and prime minister. +Since then, no serious attempt to restore the Stuart heir has been made. +He qualified in 22nd place for the Italian Grand Prix, and finished 12 places higher. +A viewer complained that the celebrities were likely to have used the US version of Proactiv, which differs from the UK version. +Most of the inhabitants of these provinces were Monophysites who rejected the Council of Chalcedon. diff --git a/tools/misaki-g2p/tests/data/e2m.tsv b/tools/misaki-g2p/tests/data/e2m.tsv new file mode 100644 index 0000000000..0f491e2b8a --- /dev/null +++ b/tools/misaki-g2p/tests/data/e2m.tsv @@ -0,0 +1,24 @@ +hˈɜːlbʌts hˈɜɹlbʌts +v^ɛlʊvˈɑːnə vɛlʊvˈɑnə +ɹˈæfa^ɪˈɛl ɹˈæfIˈɛl +t^ʃˈuːk ʧˈuk +kˈo^ʊən kˈOən +nˈɪkələ nˈɪkələ +mˈɛdə^l mˈɛdᵊl +bˈʌʔn̩ bˈʌtn +ɹˈiːdɚ ɹˈidəɹ +lˈɪndɪ lˈɪndɪ +ɡɹæn d^ʒˈɑːn ɡɹæn ʤˈɑn +ʔˌn̩ wˈʌn tn wˈʌn +xˈɑːn kˈɑn +ɬˈɑː lˈɑ +ɔ^ɪl Yl +a^ʊt Wt +e^ɪ A +fˈiːʲo fˈijɔ +bˈɜːɹd bˈɜɹd +ɪə iə +sˈe sˈA +ɐbˈaʊt əbˈaʊt +ɾˈæ Tˈæ +kɐ̃ kə diff --git a/tools/misaki-g2p/tests/data/mini_gold.json b/tools/misaki-g2p/tests/data/mini_gold.json new file mode 100644 index 0000000000..085fa93c72 --- /dev/null +++ b/tools/misaki-g2p/tests/data/mini_gold.json @@ -0,0 +1,86 @@ +{ +"A": "ˈA", +"B": "bˈi", +"C": "sˈi", +"D": "dˈi", +"E": "ˈi", +"F": "ˈɛf", +"G": "ʤˈi", +"H": "ˈAʧ", +"I": "ˈI", +"J": "ʤˈA", +"K": "kˈA", +"L": "ˈɛl", +"M": "ˈɛm", +"N": "ˈɛn", +"O": "ˈO", +"P": "pˈi", +"Q": "kjˈu", +"R": "ˈɑɹ", +"S": "ˈɛs", +"T": "tˈi", +"U": "jˈu", +"V": "vˈi", +"W": "dˈʌbᵊlju", +"X": "ˈɛks", +"Y": "wˈI", +"Z": "zˈi", +"a": "A", +"am": "æm", +"and": "ænd", +"cat": "kˈæt", +"cent": "sˈɛnt", +"dollar": "dˈɑləɹ", +"dot": "dˈɑt", +"eight": "ˈAt", +"five": "fˈIv", +"four": "fˈɔɹ", +"hello": "həlˈO", +"hundred": "hˈʌndɹəd", +"in": "ɪn", +"is": "ɪz", +"it": "ɪt", +"minus": "mˈInəs", +"nine": "nˈIn", +"one": "wˈʌn", +"percent": "pəɹsˈɛnt", +"point": "pˈYnt", +"read": { +"ADJ": "ɹˈɛd", +"DEFAULT": "ɹˈid", +"VBD": "ɹˈɛd", +"VBN": "ɹˈɛd", +"VBP": "ɹˈɛd" +}, +"record": { +"DEFAULT": "ɹˈɛkəɹd", +"VERB": "ɹəkˈɔɹd" +}, +"seven": "sˈɛvən", +"six": "sˈɪks", +"slash": "slˈæʃ", +"ten": "tˈɛn", +"test": "tˈɛst", +"that": { +"DEFAULT": "ðæt", +"DT": "ðˈæt" +}, +"the": "ði", +"this": { +"DEFAULT": "ðɪs", +"None": "ðˈɪs" +}, +"thousand": "θˈWzᵊnd", +"three": "θɹˈi", +"to": "tu", +"twenty": "twˈɛnti", +"two": "tˈu", +"used": { +"DEFAULT": "jˈuzd", +"VBD": "jˈust" +}, +"versus": "vˈɜɹsəs", +"walk": "wˈɔk", +"world": "wˈɜɹld", +"zero": "zˈɪɹO" +} diff --git a/tools/misaki-g2p/tests/data/mini_silver.json b/tools/misaki-g2p/tests/data/mini_silver.json new file mode 100644 index 0000000000..55c3f4bc90 --- /dev/null +++ b/tools/misaki-g2p/tests/data/mini_silver.json @@ -0,0 +1,4 @@ +{ +"cats": "kˈæts", +"dollars": "dˈɑləɹz" +} diff --git a/tools/misaki-g2p/tests/data/stress.tsv b/tools/misaki-g2p/tests/data/stress.tsv new file mode 100644 index 0000000000..5f16ed7456 --- /dev/null +++ b/tools/misaki-g2p/tests/data/stress.tsv @@ -0,0 +1,18 @@ +hɛlˈO None hɛlˈO +hɛlˈO -2 hɛlO +hɛlˈO -1 hɛlˌO +hɛlˈO 0 hɛlˌO +hɛlˈO 0.5 hɛlˈO +hɛlˈO 1 hɛlˈO +hɛlˈO 2 hɛlˈO +ðə 0 ðˌə +ðə 0.5 ðˌə +ðə 2 ðˈə +bʌt 1 bˌʌt +tˌu 1 tˈu +tˌu 2 tˈu +tˌu -0.5 tˌu +kˈæt -0.5 kˌæt +bdk 2 bdk +ɐ 0.5 ɐ +ˌænd -1 ænd diff --git a/tools/misaki-g2p/tests/data/subtokenize.tsv b/tools/misaki-g2p/tests/data/subtokenize.tsv new file mode 100644 index 0000000000..d205ab7c66 --- /dev/null +++ b/tools/misaki-g2p/tests/data/subtokenize.tsv @@ -0,0 +1,27 @@ +McCully McCully +co-founded co-founded +don't don't +rock'n'roll rock'n'roll +iPhone iPhone +USA USA +NASA's NASA's +1,000.50 1,000.50 +-5 -5 +3.14 3.14 +'90s '90s +Ma'am Ma'am +''quoted'' ''quoted'' +hello--world hello--world +snake_case snake_case +ABCDef ABCDef +e.g. e.g. +U.S. U.S. +x2y x2y +Se8 Se8 +Heroes'Cemetery Heroes'Cemetery +O'Brien O'Brien +fine fine +naïve naïve +über über +72°F 72°F +a-b-c a-b-c diff --git a/tools/misaki-g2p/tests/data/tokenizer.tsv b/tools/misaki-g2p/tests/data/tokenizer.tsv new file mode 100644 index 0000000000..4ce6d17d03 --- /dev/null +++ b/tools/misaki-g2p/tests/data/tokenizer.tsv @@ -0,0 +1,20 @@ +I'm on it. I'monit. +Don't stop, I can't hear you! Don'tstop,Ican'thearyou! +The U.S. Army and e.g. 10am or 5pm. TheU.S.Armyande.g.10amor5pm. +It costs $5.99 (about €5). Itcosts$5.99(about€5). +She co-founded the well-known start-up in 2015-16. Sheco-foundedthewell-knownstart-upin2015-16. +Xenoceratops - (Alberta, Canada) Xenoceratops-(Alberta,Canada) +Visit https://example.com/help?x=1 today. Visithttps://example.com/help?x=1today. +Email bob@example.com, please. Emailbob@example.com,please. +Meet at 3:30 or 10:45. Meetat3:30or10:45. +He said "hello" and left... Hesaid"hello"andleft... +Rock 'n' roll, y'all. Rock'n'roll,y'all. +Mr. Smith vs. Mrs. Jones at St. Paul's. Mr.Smithvs.Mrs.JonesatSt.Paul's. +It's 72°F outside :) It's72°Foutside:) +Wait—what? Really… Wait—what?Really… +The 1990s and the '80s. The1990sandthe'80s. +Ph.D. students in N.Y. Ph.D.studentsinN.Y. +A 10-minute drive, 2.5 km/h, 30% off. A10-minutedrive,2.5km/h,30%off. +Gold'cars and type'Desert Gold'carsandtype'Desert +I 've seen it , it 's fine . I'veseenit,it'sfine. +C++ and C# are languages; so is F#. C++andC#arelanguages;soisF#. diff --git a/tools/misaki-g2p/tests/fixtures/agent_style.txt b/tools/misaki-g2p/tests/fixtures/agent_style.txt new file mode 100644 index 0000000000..24d7f79aee --- /dev/null +++ b/tools/misaki-g2p/tests/fixtures/agent_style.txt @@ -0,0 +1,953 @@ +# misaki 0.9.4 reference phonemes for tools/misaki-g2p (generated by tests/compare_misaki.py reference). +# Configuration: en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk='') +# Lines: S idtext, P phonemes, C paradee chunk, T tokenphonemeswhitespacetag. +# Phonemes are as misaki returns them; the gate compares them after Paradee's vocab filter. +S agent_style:1 I'm on it. Your appointment is at 3:30 PM tomorrow. +P ˌIm ˌɔn ɪt. jˌʊɹ əpˈYntmənt ɪz æt θɹˈi:θˈɜɹTi pˌiˈɛm təmˈɑɹO. +C ˌIm ˌɔn ɪt. +C jˌʊɹ əpˈYntmənt ɪz æt θɹˈi:θˈɜɹTi pˌiˈɛm təmˈɑɹO. +T I'm ˌIm PRP +T on ˌɔn IN +T it ɪt PRP +T . . . +T Your jˌʊɹ PRP$ +T appointment əpˈYntmənt NN +T is ɪz VBZ +T at æt IN +T 3:30 θɹˈi:θˈɜɹTi CD +T PM pˌiˈɛm NN +T tomorrow təmˈɑɹO NN +T . . . +S agent_style:2 It's 72°F and sunny in San Francisco right now. +P ˌɪts sˈɛvənti tˈu dᵻɡɹˈiz ˈɛf ænd sˈʌni ɪn sˈæn fɹænsˈɪskO ɹˈIt nˈW. +C ˌɪts sˈɛvənti tˈu dᵻɡɹˈiz ˈɛf ænd sˈʌni ɪn sˈæn fɹænsˈɪskO ɹˈIt nˈW. +T It's ˌɪts PRP +T 72°F sˈɛvənti tˈu dᵻɡɹˈiz ˈɛf CD +T and ænd CC +T sunny sˈʌni JJ +T in ɪn IN +T San sˈæn NNP +T Francisco fɹænsˈɪskO NNP +T right ɹˈIt RB +T now nˈW RB +T . . . +S agent_style:3 You have 3 new emails and 1 missed call from Dr. Patel. +P jˌu hæv θɹˈi nˈu ˈimˌAlz ænd wˈʌn mˈɪst kˈɔl fɹʌm dˈɑktəɹ pətˈɛl. +C jˌu hæv θɹˈi nˈu ˈimˌAlz ænd wˈʌn mˈɪst kˈɔl fɹʌm dˈɑktəɹ +C pətˈɛl. +T You jˌu PRP +T have hæv VBP +T 3 θɹˈi CD +T new nˈu JJ +T emails ˈimˌAlz NNS +T and ænd CC +T 1 wˈʌn CD +T missed mˈɪst VBN +T call kˈɔl NN +T from fɹʌm IN +T Dr. dˈɑktəɹ NNP +T Patel pətˈɛl NNP +T . . . +S agent_style:4 The total comes to $45.99, including a 15% tip. +P ðə tˈOTᵊl kˈʌmz tə fˈɔɹTi fˈIv dˈɑləɹz ænd nˈIndi nˈIn sˈɛnts, ɪnklˈudɪŋ ɐ fˌɪftˈin pəɹsˈɛnt tˈɪp. +C ðə tˈOTᵊl kˈʌmz tə fˈɔɹTi fˈIv dˈɑləɹz ænd nˈIndi nˈIn sˈɛnts, ɪnklˈudɪŋ ɐ fˌɪftˈin pəɹsˈɛnt tˈɪp. +T The ðə DT +T total tˈOTᵊl NN +T comes kˈʌmz VBZ +T to tə IN +T $ $ +T 45.99 fˈɔɹTi fˈIv dˈɑləɹz ænd nˈIndi nˈIn sˈɛnts CD +T , , , +T including ɪnklˈudɪŋ VBG +T a ɐ DT +T 15% fˌɪftˈin pəɹsˈɛnt CD +T tip tˈɪp NN +T . . . +S agent_style:5 I couldn't find that contact. Do you want me to try again? +P ˌI kˌʊdᵊnt fˈInd ðˈæt kˈɑntækt. dˈu ju wˈɑnt mˌi tə tɹˈI əɡˈɛn? +C ˌI kˌʊdᵊnt fˈInd ðˈæt kˈɑntækt. +C dˈu ju wˈɑnt mˌi tə tɹˈI əɡˈɛn? +T I ˌI PRP +T couldn't kˌʊdᵊnt MD +T find fˈInd VB +T that ðˈæt DT +T contact kˈɑntækt NN +T . . . +T Do dˈu VBP +T you ju PRP +T want wˈɑnt VB +T me mˌi PRP +T to tə TO +T try tɹˈI VB +T again əɡˈɛn RB +T ? ? . +S agent_style:6 Your flight UA 1234 departs at 6:05 a.m. on March 21st. +P jˌʊɹ flˈIt jˌuˈA twˈɛlv θˈɜɹTi fˈɔɹ dəpˈɑɹts æt sˈɪks:zˈiəɹO fˈIv ˌAˈɛm ˌɔn mˈɑɹʧ twˈɛnti fˈɜɹst. +C jˌʊɹ flˈIt jˌuˈA twˈɛlv θˈɜɹTi fˈɔɹ dəpˈɑɹts æt sˈɪks:zˈiəɹO fˈIv ˌAˈɛm +C ˌɔn mˈɑɹʧ twˈɛnti fˈɜɹst. +T Your jˌʊɹ PRP$ +T flight flˈIt NN +T UA jˌuˈA NNP +T 1234 twˈɛlv θˈɜɹTi fˈɔɹ CD +T departs dəpˈɑɹts NNS +T at æt IN +T 6:05 sˈɪks:zˈiəɹO fˈIv CD +T a.m. ˌAˈɛm NN +T on ˌɔn IN +T March mˈɑɹʧ NNP +T 21st twˈɛnti fˈɜɹst NN +T . . . +S agent_style:7 Sure! I've set a timer for 10 minutes. +P ʃˈʊɹ! ˌIv sˈɛt ɐ tˈIməɹ fɔɹ tˈɛn mˈɪnəts. +C ʃˈʊɹ! +C ˌIv sˈɛt ɐ tˈIməɹ fɔɹ tˈɛn mˈɪnəts. +T Sure ʃˈʊɹ UH +T ! ! . +T I've ˌIv PRP +T set sˈɛt VBN +T a ɐ DT +T timer tˈIməɹ NN +T for fɔɹ IN +T 10 tˈɛn CD +T minutes mˈɪnəts NNS +T . . . +S agent_style:8 The meeting was moved to Friday, June 14, 2024. +P ðə mˈiTɪŋ wʌz mˈuvd tə fɹˈIdˌA, ʤˈun fˌɔɹtˈin, twˈɛnti twˈɛnti fˈɔɹ. +C ðə mˈiTɪŋ wʌz mˈuvd tə fɹˈIdˌA, ʤˈun fˌɔɹtˈin, twˈɛnti twˈɛnti fˈɔɹ. +T The ðə DT +T meeting mˈiTɪŋ NN +T was wʌz VBD +T moved mˈuvd VBN +T to tə IN +T Friday fɹˈIdˌA NNP +T , , , +T June ʤˈun NNP +T 14 fˌɔɹtˈin CD +T , , , +T 2024 twˈɛnti twˈɛnti fˈɔɹ CD +T . . . +S agent_style:9 Here's the address: 1600 Amphitheatre Parkway, Mountain View, CA 94043. +P hˈɪɹz ði ədɹˈɛs: sˌɪkstˈin hˈʌndɹəd ˈæmpfəθˌiəTəɹ pˈɑɹkwˌA, mˈWntᵊn vjˈu, sˌiˈA nˈIndi fˈɔɹ θˈWzᵊnd fˈɔɹTi θɹˈi. +C hˈɪɹz ði ədɹˈɛs: sˌɪkstˈin hˈʌndɹəd ˈæmpfəθˌiəTəɹ pˈɑɹkwˌA, mˈWntᵊn vjˈu, sˌiˈA nˈIndi fˈɔɹ θˈWzᵊnd fˈɔɹTi θɹˈi. +T Here's hˈɪɹz RB +T the ði DT +T address ədɹˈɛs NN +T : : : +T 1600 sˌɪkstˈin hˈʌndɹəd CD +T Amphitheatre ˈæmpfəθˌiəTəɹ NNP +T Parkway pˈɑɹkwˌA NNP +T , , , +T Mountain mˈWntᵊn NNP +T View vjˈu NNP +T , , , +T CA sˌiˈA NNP +T 94043 nˈIndi fˈɔɹ θˈWzᵊnd fˈɔɹTi θɹˈi CD +T . . . +S agent_style:10 Battery is at 87%, and Wi-Fi is connected. +P bˈæTəɹi ɪz æt ˈATi sˈɛvən pəɹsˈɛnt, ænd wˈIfˌI ɪz kənˈɛktᵻd. +C bˈæTəɹi ɪz æt ˈATi sˈɛvən pəɹsˈɛnt, ænd wˈIfˌI ɪz kənˈɛktᵻd. +T Battery bˈæTəɹi NN +T is ɪz VBZ +T at æt IN +T 87% ˈATi sˈɛvən pəɹsˈɛnt CD +T , , , +T and ænd CC +T Wi-Fi wˈIfˌI NNP +T is ɪz VBZ +T connected kənˈɛktᵻd VBN +T . . . +S agent_style:11 I'll remind you to call Mom at 5 o'clock. +P ˌIl ɹəmˈInd ju tə kˈɔl mˈɑm æt fˈIv əklˈɑk. +C ˌIl ɹəmˈInd ju tə kˈɔl mˈɑm æt fˈIv əklˈɑk. +T I'll ˌIl PRP +T remind ɹəmˈInd VB +T you ju PRP +T to tə TO +T call kˈɔl VB +T Mom mˈɑm NNP +T at æt IN +T 5 fˈIv CD +T o'clock əklˈɑk NN +T . . . +S agent_style:12 That's about 2.5 miles, or roughly a 10-minute drive. +P ðˈæts əbˈWt tˈu pYnt fˈIv mˈIlz, ɔɹ ɹˈʌfli ɐ tˈɛn mˈɪnət dɹˈIv. +C ðˈæts əbˈWt tˈu pYnt fˈIv mˈIlz, ɔɹ ɹˈʌfli ɐ tˈɛn mˈɪnət dɹˈIv. +T That's ðˈæts DT +T about əbˈWt RB +T 2.5 tˈu pYnt fˈIv CD +T miles mˈIlz NNS +T , , , +T or ɔɹ CC +T roughly ɹˈʌfli RB +T a ɐ DT +T 10-minute tˈɛn mˈɪnət NN +T drive dɹˈIv NN +T . . . +S agent_style:13 You said "buy milk" — I added it to your list. +P jˌu sˈɛd “bˈI mˈɪlk” — ˌI ˈædᵻd ɪt tə jʊɹ lˈɪst. +C jˌu sˈɛd “bˈI mˈɪlk” — ˌI ˈædᵻd ɪt tə jʊɹ lˈɪst. +T You jˌu PRP +T said sˈɛd VBD +T " “ `` +T buy bˈI VB +T milk mˈɪlk NN +T " ” '' +T — — : +T I ˌI PRP +T added ˈædᵻd VBD +T it ɪt PRP +T to tə IN +T your jʊɹ PRP$ +T list lˈɪst NN +T . . . +S agent_style:14 Your package from Amazon will arrive between 2 and 4 p.m. +P jˌʊɹ pˈækɪʤ fɹʌm ˈæməzˌɑn wɪl əɹˈIv bətwˈin tˈu ænd fˈɔɹ pˌiˈɛm +C jˌʊɹ pˈækɪʤ fɹʌm ˈæməzˌɑn wɪl əɹˈIv bətwˈin tˈu ænd fˈɔɹ pˌiˈɛm +T Your jˌʊɹ PRP$ +T package pˈækɪʤ NN +T from fɹʌm IN +T Amazon ˈæməzˌɑn NNP +T will wɪl MD +T arrive əɹˈIv VB +T between bətwˈin IN +T 2 tˈu CD +T and ænd CC +T 4 fˈɔɹ CD +T p.m. pˌiˈɛm NN +S agent_style:15 Visit https://example.com/help for more details. +P vˈɪzət ˌAʧtˌitˈipˌiˈɛs:slˈæʃslæʃ ɛɡzˈæmpᵊl.kˈɑm slˈæʃ hˈɛlp fɔɹ mˈɔɹ dətˈAlz. +C vˈɪzət ˌAʧtˌitˈipˌiˈɛs:slˈæʃslæʃ ɛɡzˈæmpᵊl.kˈɑm slˈæʃ hˈɛlp fɔɹ mˈɔɹ dətˈAlz. +T Visit vˈɪzət VB +T https://example.com/help ˌAʧtˌitˈipˌiˈɛs:slˈæʃslæʃ ɛɡzˈæmpᵊl.kˈɑm slˈæʃ hˈɛlp NNP +T for fɔɹ IN +T more mˈɔɹ JJR +T details dətˈAlz NNS +T . . . +S agent_style:16 Email me at jane.doe@example.com if anything changes. +P ˈimˌAl mˌi æt ʤˈAn dˈO æt ɪɡzˈæmpəl kˈɑm ɪf ˈɛniθˌɪŋ ʧˈAnʤᵻz. +C ˈimˌAl mˌi æt ʤˈAn dˈO æt ɪɡzˈæmpəl kˈɑm ɪf ˈɛniθˌɪŋ ʧˈAnʤᵻz. +T Email ˈimˌAl VB +T me mˌi PRP +T at æt IN +T jane.doe@example.com ʤˈAn dˈO æt ɪɡzˈæmpəl kˈɑm NNP +T if ɪf IN +T anything ˈɛniθˌɪŋ NN +T changes ʧˈAnʤᵻz VBZ +T . . . +S agent_style:17 The score is 3-2 with five minutes left in the 2nd half. +P ðə skˈɔɹ ɪz θɹˈitˌu wɪð fˈIv mˈɪnəts lˈɛft ɪn ðə sˈɛkənd hˈæf. +C ðə skˈɔɹ ɪz θɹˈitˌu wɪð fˈIv mˈɪnəts lˈɛft ɪn ðə sˈɛkənd hˈæf. +T The ðə DT +T score skˈɔɹ NN +T is ɪz VBZ +T 3-2 θɹˈitˌu CD +T with wɪð IN +T five fˈIv CD +T minutes mˈɪnəts NNS +T left lˈɛft VBN +T in ɪn IN +T the ðə DT +T 2nd sˈɛkənd JJ +T half hˈæf NN +T . . . +S agent_style:18 I don't have access to your camera right now. +P ˌI dˈOnt hæv ˈæksˌɛs tə jʊɹ kˈæməɹə ɹˈIt nˈW. +C ˌI dˈOnt hæv ˈæksˌɛs tə jʊɹ kˈæməɹə ɹˈIt nˈW. +T I ˌI PRP +T don't dˈOnt RB +T have hæv VB +T access ˈæksˌɛs NN +T to tə IN +T your jʊɹ PRP$ +T camera kˈæməɹə NN +T right ɹˈIt RB +T now nˈW RB +T . . . +S agent_style:19 NASA and the FBI both released statements on Tuesday. +P nˈæsə ænd ði ˌɛfbˌiˈI bˈOθ ɹəlˈist stˈAtmənts ˌɔn tˈuzdˌA. +C nˈæsə ænd ði ˌɛfbˌiˈI bˈOθ ɹəlˈist stˈAtmənts ˌɔn tˈuzdˌA. +T NASA nˈæsə NNP +T and ænd CC +T the ði DT +T FBI ˌɛfbˌiˈI NNP +T both bˈOθ DT +T released ɹəlˈist VBD +T statements stˈAtmənts NNS +T on ˌɔn IN +T Tuesday tˈuzdˌA NNP +T . . . +S agent_style:20 Turn left onto Main St. in 500 feet. +P tˈɜɹn lˈɛft ˈɑntˌu mˈAn sənt. ɪn fˈIv hˈʌndɹəd fˈit. +C tˈɜɹn lˈɛft ˈɑntˌu mˈAn sənt. +C ɪn fˈIv hˈʌndɹəd fˈit. +T Turn tˈɜɹn NN +T left lˈɛft VBN +T onto ˈɑntˌu IN +T Main mˈAn NNP +T St. sənt. NNP +T in ɪn IN +T 500 fˈIv hˈʌndɹəd CD +T feet fˈit NNS +T . . . +S agent_style:21 Your heart rate averaged 64 bpm over the last 24 hours. +P jˌʊɹ hˈɑɹt ɹˈAt ˈævəɹɪʤd sˈɪksti fˈɔɹ bˌipˌiˈɛm ˈOvəɹ ðə lˈæst twˈɛnti fˈɔɹ ˈWəɹz. +C jˌʊɹ hˈɑɹt ɹˈAt ˈævəɹɪʤd sˈɪksti fˈɔɹ bˌipˌiˈɛm ˈOvəɹ ðə lˈæst twˈɛnti fˈɔɹ ˈWəɹz. +T Your jˌʊɹ PRP$ +T heart hˈɑɹt NN +T rate ɹˈAt NN +T averaged ˈævəɹɪʤd VBD +T 64 sˈɪksti fˈɔɹ CD +T bpm bˌipˌiˈɛm NN +T over ˈOvəɹ IN +T the ðə DT +T last lˈæst JJ +T 24 twˈɛnti fˈɔɹ CD +T hours ˈWəɹz NNS +T . . . +S agent_style:22 Let's record a quick voice memo and then read it back. +P lˈɛts ɹəkˈɔɹd ɐ kwˈɪk vˈYs mˈɛmO ænd ðˈɛn ɹˈid ɪt bˈæk. +C lˈɛts ɹəkˈɔɹd ɐ kwˈɪk vˈYs mˈɛmO ænd ðˈɛn ɹˈid ɪt bˈæk. +T Let's lˈɛts VB +T record ɹəkˈɔɹd VB +T a ɐ DT +T quick kwˈɪk JJ +T voice vˈYs NN +T memo mˈɛmO NN +T and ænd CC +T then ðˈɛn RB +T read ɹˈid VB +T it ɪt PRP +T back bˈæk RP +T . . . +S agent_style:23 We live close to the station, so it's a short walk. +P wˌi lˈɪv klˈOs tə ðə stˈAʃən, sˌO ɪts ɐ ʃˈɔɹt wˈɔk. +C wˌi lˈɪv klˈOs tə ðə stˈAʃən, sˌO ɪts ɐ ʃˈɔɹt wˈɔk. +T We wˌi PRP +T live lˈɪv VBP +T close klˈOs RB +T to tə IN +T the ðə DT +T station stˈAʃən NN +T , , , +T so sˌO IN +T it's ɪts PRP +T a ɐ DT +T short ʃˈɔɹt JJ +T walk wˈɔk NN +T . . . +S agent_style:24 He read the report yesterday; I'll read it today. +P hˌi ɹˈɛd ðə ɹəpˈɔɹt jˈɛstəɹdˌA; ˌIl ɹˈid ɪt tədˈA. +C hˌi ɹˈɛd ðə ɹəpˈɔɹt jˈɛstəɹdˌA; ˌIl ɹˈid ɪt tədˈA. +T He hˌi PRP +T read ɹˈɛd VBD +T the ðə DT +T report ɹəpˈɔɹt NN +T yesterday jˈɛstəɹdˌA NN +T ; ; : +T I'll ˌIl PRP +T read ɹˈid VB +T it ɪt PRP +T today tədˈA NN +T . . . +S agent_style:25 The lead singer used to live in a small town near the lead mine. +P ðə lˈid sˈɪŋəɹ jˈust tə lˈɪv ɪn ɐ smˈɔl tˈWn nˌɪɹ ðə lˈid mˈIn. +C ðə lˈid sˈɪŋəɹ jˈust tə lˈɪv ɪn ɐ smˈɔl tˈWn nˌɪɹ ðə lˈid mˈIn. +T The ðə DT +T lead lˈid NN +T singer sˈɪŋəɹ NN +T used jˈust VBD +T to tə TO +T live lˈɪv VB +T in ɪn IN +T a ɐ DT +T small smˈɔl JJ +T town tˈWn NN +T near nˌɪɹ IN +T the ðə DT +T lead lˈid JJ +T mine mˈIn NN +T . . . +S agent_style:26 It costs €20 or about £17. +P ˌɪt kˈɔsts twˈɛnti jˈʊɹOz ɔɹ əbˈWt sˌɛvəntˈin pˈWndz. +C ˌɪt kˈɔsts twˈɛnti jˈʊɹOz ɔɹ əbˈWt sˌɛvəntˈin pˈWndz. +T It ˌɪt PRP +T costs kˈɔsts VBZ +T € $ +T 20 twˈɛnti jˈʊɹOz CD +T or ɔɹ CC +T about əbˈWt RB +T £ $ +T 17 sˌɛvəntˈin pˈWndz CD +T . . . +S agent_style:27 Temperatures will drop to -5 degrees overnight. +P tˈɛmpɹəʧəɹz wɪl dɹˈɑp tə mˈInəs fˈIv dəɡɹˈiz ˌOvəɹnˈIt. +C tˈɛmpɹəʧəɹz wɪl dɹˈɑp tə mˈInəs fˈIv dəɡɹˈiz ˌOvəɹnˈIt. +T Temperatures tˈɛmpɹəʧəɹz NNS +T will wɪl MD +T drop dɹˈɑp VB +T to tə TO +T -5 mˈInəs fˈIv VB +T degrees dəɡɹˈiz NNS +T overnight ˌOvəɹnˈIt RB +T . . . +S agent_style:28 I'm sorry, I didn't catch that. Could you repeat it? +P ˌIm sˈɔɹi, ˌI dˈɪdᵊnt kˈɛʧ ðˈæt. kˌʊd ju ɹəpˈit ɪt? +C ˌIm sˈɔɹi, ˌI dˈɪdᵊnt kˈɛʧ ðˈæt. +C kˌʊd ju ɹəpˈit ɪt? +T I'm ˌIm PRP +T sorry sˈɔɹi JJ +T , , , +T I ˌI PRP +T didn't dˈɪdᵊnt VBD +T catch kˈɛʧ VB +T that ðˈæt DT +T . . . +T Could kˌʊd MD +T you ju PRP +T repeat ɹəpˈit VB +T it ɪt PRP +T ? ? . +S agent_style:29 Please present your ID at the front desk. +P plˈiz pɹizˈɛnt jʊɹ ˌIdˈi æt ðə fɹˈʌnt dˈɛsk. +C plˈiz pɹizˈɛnt jʊɹ ˌIdˈi æt ðə fɹˈʌnt dˈɛsk. +T Please plˈiz UH +T present pɹizˈɛnt VB +T your jʊɹ PRP$ +T ID ˌIdˈi NNP +T at æt IN +T the ðə DT +T front fɹˈʌnt JJ +T desk dˈɛsk NN +T . . . +S agent_style:30 The 1990s were a great decade for music. +P ðə nˌIntˈin nˈIndiz wɜɹ ɐ ɡɹˈAt dˈɛkˌAd fɔɹ mjˈuzɪk. +C ðə nˌIntˈin nˈIndiz wɜɹ ɐ ɡɹˈAt dˈɛkˌAd fɔɹ mjˈuzɪk. +T The ðə DT +T 1990s nˌIntˈin nˈIndiz NNS +T were wɜɹ VBD +T a ɐ DT +T great ɡɹˈAt JJ +T decade dˈɛkˌAd NN +T for fɔɹ IN +T music mjˈuzɪk NN +T . . . +S agent_style:31 OK, I've turned off the lights in the living room and the kitchen. +P ˌOkˈA, ˌIv tˈɜɹnd ˈɔf ðə lˈIts ɪn ðə lˈɪvɪŋ ɹˈum ænd ðə kˈɪʧᵊn. +C ˌOkˈA, ˌIv tˈɜɹnd ˈɔf ðə lˈIts ɪn ðə lˈɪvɪŋ ɹˈum ænd ðə kˈɪʧᵊn. +T OK ˌOkˈA UH +T , , , +T I've ˌIv PRP +T turned tˈɜɹnd VBN +T off ˈɔf RP +T the ðə DT +T lights lˈIts NNS +T in ɪn IN +T the ðə DT +T living lˈɪvɪŋ NN +T room ɹˈum NN +T and ænd CC +T the ðə DT +T kitchen kˈɪʧᵊn NN +T . . . +S agent_style:32 Your next reminder: take the blue pill with water. +P jˌʊɹ nˈɛkst ɹəmˈIndəɹ: tˈAk ðə blˈu pˈɪl wɪð wˈɔTəɹ. +C jˌʊɹ nˈɛkst ɹəmˈIndəɹ: tˈAk ðə blˈu pˈɪl wɪð wˈɔTəɹ. +T Your jˌʊɹ PRP$ +T next nˈɛkst JJ +T reminder ɹəmˈIndəɹ NN +T : : : +T take tˈAk VB +T the ðə DT +T blue blˈu JJ +T pill pˈɪl NN +T with wɪð IN +T water wˈɔTəɹ NN +T . . . +S agent_style:33 Call 911 if this is an emergency. +P kˈɔl nˈIn hˈʌndɹəd əlˈɛvᵊn ɪf ðɪs ɪz ɐn əmˈɜɹʤənsi. +C kˈɔl nˈIn hˈʌndɹəd əlˈɛvᵊn ɪf ðɪs ɪz ɐn əmˈɜɹʤənsi. +T Call kˈɔl VB +T 911 nˈIn hˈʌndɹəd əlˈɛvᵊn CD +T if ɪf IN +T this ðɪs DT +T is ɪz VBZ +T an ɐn DT +T emergency əmˈɜɹʤənsi NN +T . . . +S agent_style:34 The project is 75 percent complete and on schedule. +P ðə pɹˈɑʤˌɛkt ɪz sˈɛvənti fˈIv pəɹsˈɛnt kəmplˈit ænd ˌɔn skˈɛʤˌul. +C ðə pɹˈɑʤˌɛkt ɪz sˈɛvənti fˈIv pəɹsˈɛnt kəmplˈit ænd ˌɔn skˈɛʤˌul. +T The ðə DT +T project pɹˈɑʤˌɛkt NN +T is ɪz VBZ +T 75 sˈɛvənti fˈIv CD +T percent pəɹsˈɛnt NN +T complete kəmplˈit JJ +T and ænd CC +T on ˌɔn IN +T schedule skˈɛʤˌul NN +T . . . +S agent_style:35 What's the weather like this weekend? +P wˌʌts ðə wˈɛðəɹ lˈIk ðɪs wˈikˌɛnd? +C wˌʌts ðə wˈɛðəɹ lˈIk ðɪs wˈikˌɛnd? +T What's wˌʌts WP +T the ðə DT +T weather wˈɛðəɹ NN +T like lˈIk IN +T this ðɪs DT +T weekend wˈikˌɛnd NN +T ? ? . +S agent_style:36 I've opened YouTube for you. +P ˌIv ˈOpᵊnd jˈutˌub fɔɹ ju. +C ˌIv ˈOpᵊnd jˈutˌub fɔɹ ju. +T I've ˌIv PRP +T opened ˈOpᵊnd VBN +T YouTube jˈutˌub NNP +T for fɔɹ IN +T you ju PRP +T . . . +S agent_style:37 Version 2.0.1 fixes three bugs. +P vˈɜɹʒən tˈu zˈɪɹO wˈʌn fˈɪksᵻz θɹˈi bˈʌɡz. +C vˈɜɹʒən tˈu zˈɪɹO wˈʌn fˈɪksᵻz θɹˈi bˈʌɡz. +T Version vˈɜɹʒən NN +T 2.0.1 tˈu zˈɪɹO wˈʌn CD +T fixes fˈɪksᵻz VBZ +T three θɹˈi CD +T bugs bˈʌɡz NNS +T . . . +S agent_style:38 The Smiths' house is the one with the red door. +P ðə smˈɪθs hˈWs ɪz ðə wˈʌn wɪð ðə ɹˈɛd dˈɔɹ. +C ðə smˈɪθs hˈWs ɪz ðə wˈʌn wɪð ðə ɹˈɛd dˈɔɹ. +T The ðə DT +T Smiths' smˈɪθs NNPS +T house hˈWs NN +T is ɪz VBZ +T the ðə DT +T one wˈʌn CD +T with wɪð IN +T the ðə DT +T red ɹˈɛd JJ +T door dˈɔɹ NN +T . . . +S agent_style:39 Rock 'n' roll never dies. +P ɹˈɑk ən ɹˈOl nˈɛvəɹ dˈIz. +C ɹˈɑk ən ɹˈOl nˈɛvəɹ dˈIz. +T Rock ɹˈɑk NNP +T 'n' ən CC +T roll ɹˈOl NN +T never nˈɛvəɹ RB +T dies dˈIz VBZ +T . . . +S agent_style:40 She said, “I'll be there by noon.” +P ʃˌi sˈɛd, “ˌIl bi ðɛɹ bI nˈun.” +C ʃˌi sˈɛd, “ˌIl bi ðɛɹ bI nˈun.” +T She ʃˌi PRP +T said sˈɛd VBD +T , , , +T “ “ `` +T I'll ˌIl PRP +T be bi VB +T there ðɛɹ RB +T by bI IN +T noon nˈun NN +T . . . +T ” ” '' +S agent_style:41 Good evening! You've got two meetings left today. +P ɡˈʊd ˈivnɪŋ! jˌuv ɡɑt tˈu mˈiTɪŋz lˈɛft tədˈA. +C ɡˈʊd ˈivnɪŋ! +C jˌuv ɡɑt tˈu mˈiTɪŋz lˈɛft tədˈA. +T Good ɡˈʊd JJ +T evening ˈivnɪŋ NN +T ! ! . +T You've jˌuv PRP +T got ɡɑt VBD +T two tˈu CD +T meetings mˈiTɪŋz NNS +T left lˈɛft VBN +T today tədˈA NN +T . . . +S agent_style:42 Your Uber is 4 minutes away, a white Toyota Camry. +P jˌʊɹ jˈubəɹ ɪz fˈɔɹ mˈɪnəts əwˈA, ɐ wˈIt tYˈOTə kˈæmɹi. +C jˌʊɹ jˈubəɹ ɪz fˈɔɹ mˈɪnəts əwˈA, ɐ wˈIt tYˈOTə kˈæmɹi. +T Your jˌʊɹ PRP$ +T Uber jˈubəɹ NNP +T is ɪz VBZ +T 4 fˈɔɹ CD +T minutes mˈɪnəts NNS +T away əwˈA RB +T , , , +T a ɐ DT +T white wˈIt JJ +T Toyota tYˈOTə NNP +T Camry kˈæmɹi NNP +T . . . +S agent_style:43 I've added eggs, bread, and coffee to your shopping list. +P ˌIv ˈædᵻd ˈɛɡz, bɹˈɛd, ænd kˈɔfi tə jʊɹ ʃˈɑpɪŋ lˈɪst. +C ˌIv ˈædᵻd ˈɛɡz, bɹˈɛd, ænd kˈɔfi tə jʊɹ ʃˈɑpɪŋ lˈɪst. +T I've ˌIv PRP +T added ˈædᵻd VBN +T eggs ˈɛɡz NNS +T , , , +T bread bɹˈɛd NN +T , , , +T and ænd CC +T coffee kˈɔfi NN +T to tə IN +T your jʊɹ PRP$ +T shopping ʃˈɑpɪŋ NN +T list lˈɪst NN +T . . . +S agent_style:44 The stock closed at $182.50, up 1.2% from yesterday. +P ðə stˈɑk klˈOzd æt wˈʌn hˈʌndɹəd ˈATi tˈu dˈɑləɹz ænd fˈɪfti sˈɛnts, ˌʌp wˈʌn pYnt tˈu pəɹsˈɛnt fɹʌm jˈɛstəɹdˌA. +C ðə stˈɑk klˈOzd æt wˈʌn hˈʌndɹəd ˈATi tˈu dˈɑləɹz ænd fˈɪfti sˈɛnts, ˌʌp wˈʌn pYnt tˈu pəɹsˈɛnt fɹʌm jˈɛstəɹdˌA. +T The ðə DT +T stock stˈɑk NN +T closed klˈOzd VBD +T at æt IN +T $ $ +T 182.50 wˈʌn hˈʌndɹəd ˈATi tˈu dˈɑləɹz ænd fˈɪfti sˈɛnts CD +T , , , +T up ˌʌp RB +T 1.2% wˈʌn pYnt tˈu pəɹsˈɛnt CD +T from fɹʌm IN +T yesterday jˈɛstəɹdˌA NN +T . . . +S agent_style:45 Can you hear me okay? The connection seems weak. +P kˌæn ju hˈɪɹ mˌi ˌOkˈA? ðə kənˈɛkʃən sˈimz wˈik. +C kˌæn ju hˈɪɹ mˌi ˌOkˈA? +C ðə kənˈɛkʃən sˈimz wˈik. +T Can kˌæn MD +T you ju PRP +T hear hˈɪɹ VB +T me mˌi PRP +T okay ˌOkˈA JJ +T ? ? . +T The ðə DT +T connection kənˈɛkʃən NN +T seems sˈimz VBZ +T weak wˈik JJ +T . . . +S agent_style:46 Alarm set for 7:15 AM on weekdays. +P əlˈɑɹm sˈɛt fɔɹ sˈɛvən:fˈɪftin ˌAˈɛm ˌɔn wˈikdˌAz. +C əlˈɑɹm sˈɛt fɔɹ sˈɛvən:fˈɪftin ˌAˈɛm ˌɔn wˈikdˌAz. +T Alarm əlˈɑɹm NNP +T set sˈɛt VBD +T for fɔɹ IN +T 7:15 sˈɛvən:fˈɪftin CD +T AM ˌAˈɛm NN +T on ˌɔn IN +T weekdays wˈikdˌAz NNS +T . . . +S agent_style:47 Your daughter Emma sent a photo at 2:47 PM. +P jˌʊɹ dˈɔTəɹ ˈɛmə sˈɛnt ɐ fˈOTO æt tˈu:fˈɔɹTi sˈɛvən pˌiˈɛm. +C jˌʊɹ dˈɔTəɹ ˈɛmə sˈɛnt ɐ fˈOTO æt tˈu:fˈɔɹTi sˈɛvən pˌiˈɛm. +T Your jˌʊɹ PRP$ +T daughter dˈɔTəɹ NN +T Emma ˈɛmə NNP +T sent sˈɛnt VBD +T a ɐ DT +T photo fˈOTO NN +T at æt IN +T 2:47 tˈu:fˈɔɹTi sˈɛvən CD +T PM pˌiˈɛm NNP +T . . . +S agent_style:48 I'm not sure, but I can look it up for you. +P ˌIm nˌɑt ʃˈʊɹ, bˌʌt ˌI kæn lˈʊk ɪt ˌʌp fɔɹ ju. +C ˌIm nˌɑt ʃˈʊɹ, bˌʌt ˌI kæn lˈʊk ɪt ˌʌp fɔɹ ju. +T I'm ˌIm PRP +T not nˌɑt RB +T sure ʃˈʊɹ JJ +T , , , +T but bˌʌt CC +T I ˌI PRP +T can kæn MD +T look lˈʊk VB +T it ɪt PRP +T up ˌʌp RP +T for fɔɹ IN +T you ju PRP +T . . . +S agent_style:49 It's going to rain on Saturday, so bring an umbrella. +P ˌɪts ɡˈOɪŋ tə ɹˈAn ˌɔn sˈæTəɹdˌA, sˌO bɹˈɪŋ ɐn ˌʌmbɹˈɛlə. +C ˌɪts ɡˈOɪŋ tə ɹˈAn ˌɔn sˈæTəɹdˌA, sˌO bɹˈɪŋ ɐn ˌʌmbɹˈɛlə. +T It's ˌɪts PRP +T going ɡˈOɪŋ VBG +T to tə TO +T rain ɹˈAn VB +T on ˌɔn IN +T Saturday sˈæTəɹdˌA NNP +T , , , +T so sˌO RB +T bring bɹˈɪŋ VB +T an ɐn DT +T umbrella ˌʌmbɹˈɛlə NN +T . . . +S agent_style:50 The museum opens at 9 and closes at 5:30. +P ðə mjuzˈiəm ˈOpᵊnz æt nˈIn ænd klˈOzᵻz æt fˈIv:θˈɜɹTi. +C ðə mjuzˈiəm ˈOpᵊnz æt nˈIn ænd klˈOzᵻz æt fˈIv:θˈɜɹTi. +T The ðə DT +T museum mjuzˈiəm NN +T opens ˈOpᵊnz VBZ +T at æt IN +T 9 nˈIn CD +T and ænd CC +T closes klˈOzᵻz VBZ +T at æt IN +T 5:30 fˈIv:θˈɜɹTi CD +T . . . +S agent_style:51 You walked 8,432 steps today — great job! +P jˌu wˈɔkt ˈAt θˈWzᵊnd fˈɔɹ hˈʌndɹəd θˈɜɹTi tˈu stˈɛps tədˈA — ɡɹˈAt ʤˈɑb! +C jˌu wˈɔkt ˈAt θˈWzᵊnd fˈɔɹ hˈʌndɹəd θˈɜɹTi tˈu stˈɛps tədˈA — ɡɹˈAt ʤˈɑb! +T You jˌu PRP +T walked wˈɔkt VBD +T 8,432 ˈAt θˈWzᵊnd fˈɔɹ hˈʌndɹəd θˈɜɹTi tˈu CD +T steps stˈɛps NNS +T today tədˈA NN +T — — : +T great ɡɹˈAt JJ +T job ʤˈɑb NN +T ! ! . +S agent_style:52 Dinner reservations for four at 7 p.m. are confirmed. +P dˈɪnəɹ ɹˌɛzəɹvˈAʃənz fɔɹ fˈɔɹ æt sˈɛvən pˌiˈɛm ɑɹ kənfˈɜɹmd. +C dˈɪnəɹ ɹˌɛzəɹvˈAʃənz fɔɹ fˈɔɹ æt sˈɛvən pˌiˈɛm +C ɑɹ kənfˈɜɹmd. +T Dinner dˈɪnəɹ NN +T reservations ɹˌɛzəɹvˈAʃənz NNS +T for fɔɹ IN +T four fˈɔɹ CD +T at æt IN +T 7 sˈɛvən CD +T p.m. pˌiˈɛm NN +T are ɑɹ VBP +T confirmed kənfˈɜɹmd VBN +T . . . +S agent_style:53 Would you like me to read your messages aloud? +P wˌʊd ju lˈIk mˌi tə ɹˈid jʊɹ mˈɛsɪʤᵻz əlˈWd? +C wˌʊd ju lˈIk mˌi tə ɹˈid jʊɹ mˈɛsɪʤᵻz əlˈWd? +T Would wˌʊd MD +T you ju PRP +T like lˈIk VB +T me mˌi PRP +T to tə TO +T read ɹˈid VB +T your jʊɹ PRP$ +T messages mˈɛsɪʤᵻz NNS +T aloud əlˈWd JJ +T ? ? . +S agent_style:54 The update will install overnight and restart your phone. +P ði ˈʌpdˌAt wɪl ɪnstˈɔl ˌOvəɹnˈIt ænd ɹistˈɑɹt jʊɹ fˈOn. +C ði ˈʌpdˌAt wɪl ɪnstˈɔl ˌOvəɹnˈIt ænd ɹistˈɑɹt jʊɹ fˈOn. +T The ði DT +T update ˈʌpdˌAt NN +T will wɪl MD +T install ɪnstˈɔl VB +T overnight ˌOvəɹnˈIt RB +T and ænd CC +T restart ɹistˈɑɹt VB +T your jʊɹ PRP$ +T phone fˈOn NN +T . . . +S agent_style:55 I've muted notifications until 8 o'clock tomorrow morning. +P ˌIv mjˈuTᵻd nˌOTəfəkˈAʃənz ˌʌntˈɪl ˈAt əklˈɑk təmˈɑɹO mˈɔɹnɪŋ. +C ˌIv mjˈuTᵻd nˌOTəfəkˈAʃənz ˌʌntˈɪl ˈAt əklˈɑk təmˈɑɹO mˈɔɹnɪŋ. +T I've ˌIv PRP +T muted mjˈuTᵻd VBN +T notifications nˌOTəfəkˈAʃənz NNS +T until ˌʌntˈɪl IN +T 8 ˈAt CD +T o'clock əklˈɑk NN +T tomorrow təmˈɑɹO NN +T morning mˈɔɹnɪŋ NN +T . . . +S agent_style:56 The next train to Boston leaves from platform 3B. +P ðə nˈɛkst tɹˈAn tə bˈɔstən lˈivz fɹʌm plˈætfˌɔɹm θɹˈi bˈi +C ðə nˈɛkst tɹˈAn tə bˈɔstən lˈivz fɹʌm plˈætfˌɔɹm θɹˈi bˈi +T The ðə DT +T next nˈɛkst JJ +T train tɹˈAn NN +T to tə IN +T Boston bˈɔstən NNP +T leaves lˈivz NNS +T from fɹʌm IN +T platform plˈætfˌɔɹm NN +T 3B. θɹˈi bˈi CD +S agent_style:57 Your prescription refill is ready at CVS on Elm St. +P jˌʊɹ pɹiskɹˈɪpʃən ɹˈifˌɪl ɪz ɹˈɛdi æt sˌivˌiˈɛs ˌɔn ˈɛlm sənt. +C jˌʊɹ pɹiskɹˈɪpʃən ɹˈifˌɪl ɪz ɹˈɛdi æt sˌivˌiˈɛs ˌɔn ˈɛlm sənt. +T Your jˌʊɹ PRP$ +T prescription pɹiskɹˈɪpʃən NN +T refill ɹˈifˌɪl NN +T is ɪz VBZ +T ready ɹˈɛdi JJ +T at æt IN +T CVS sˌivˌiˈɛs NNP +T on ˌɔn IN +T Elm ˈɛlm NNP +T St. sənt. NNP +S agent_style:58 It's Mike's birthday on the 3rd of July. +P ˌɪts mˈIks bˈɜɹθdˌA ˌɔn ðə θˈɜɹd ʌv ʤəlˈI. +C ˌɪts mˈIks bˈɜɹθdˌA ˌɔn ðə θˈɜɹd ʌv ʤəlˈI. +T It's ˌɪts PRP +T Mike's mˈIks NNP +T birthday bˈɜɹθdˌA NN +T on ˌɔn IN +T the ðə DT +T 3rd θˈɜɹd NN +T of ʌv IN +T July ʤəlˈI NNP +T . . . +S agent_style:59 Here are the top 5 results for "Italian restaurants near me". +P hˈɪɹ ɑɹ ðə tˈɑp fˈIv ɹəzˈʌlts fɔɹ “ɪtˈæljən ɹˈɛstəɹənts nˌɪɹ mˌi”. +C hˈɪɹ ɑɹ ðə tˈɑp fˈIv ɹəzˈʌlts fɔɹ “ɪtˈæljən ɹˈɛstəɹənts nˌɪɹ mˌi”. +T Here hˈɪɹ RB +T are ɑɹ VBP +T the ðə DT +T top tˈɑp JJ +T 5 fˈIv CD +T results ɹəzˈʌlts NNS +T for fɔɹ IN +T " “ `` +T Italian ɪtˈæljən JJ +T restaurants ɹˈɛstəɹənts NNS +T near nˌɪɹ IN +T me mˌi PRP +T " ” '' +T . . . +S agent_style:60 The volume is now at 60 percent. +P ðə vˈɑljˌum ɪz nˈW æt sˈɪksti pəɹsˈɛnt. +C ðə vˈɑljˌum ɪz nˈW æt sˈɪksti pəɹsˈɛnt. +T The ðə DT +T volume vˈɑljˌum NN +T is ɪz VBZ +T now nˈW RB +T at æt IN +T 60 sˈɪksti CD +T percent pəɹsˈɛnt NN +T . . . +S agent_style:61 You spent $1,250 on groceries last month. +P jˌu spˈɛnt wˈʌn θˈWzᵊnd tˈu hˈʌndɹəd fˈɪfti dˈɑləɹz ˌɔn ɡɹˈOsəɹiz lˈæst mˈʌnθ. +C jˌu spˈɛnt wˈʌn θˈWzᵊnd tˈu hˈʌndɹəd fˈɪfti dˈɑləɹz ˌɔn ɡɹˈOsəɹiz lˈæst mˈʌnθ. +T You jˌu PRP +T spent spˈɛnt VBD +T $ $ +T 1,250 wˈʌn θˈWzᵊnd tˈu hˈʌndɹəd fˈɪfti dˈɑləɹz CD +T on ˌɔn IN +T groceries ɡɹˈOsəɹiz NNS +T last lˈæst JJ +T month mˈʌnθ NN +T . . . +S agent_style:62 I can't do that yet, but I'm learning. +P ˌI kˈænt dˈu ðˈæt jˈɛt, bˌʌt ˌIm lˈɜɹnɪŋ. +C ˌI kˈænt dˈu ðˈæt jˈɛt, bˌʌt ˌIm lˈɜɹnɪŋ. +T I ˌI PRP +T can't kˈænt RB +T do dˈu VB +T that ðˈæt DT +T yet jˈɛt RB +T , , , +T but bˌʌt CC +T I'm ˌIm PRP +T learning lˈɜɹnɪŋ VBG +T . . . +S agent_style:63 Press and hold the power button for 10 seconds. +P pɹˈɛs ænd hˈOld ðə pˈWəɹ bˈʌtn fɔɹ tˈɛn sˈɛkəndz. +C pɹˈɛs ænd hˈOld ðə pˈWəɹ bˈʌtn fɔɹ tˈɛn sˈɛkəndz. +T Press pɹˈɛs VB +T and ænd CC +T hold hˈOld VB +T the ðə DT +T power pˈWəɹ NN +T button bˈʌtn NN +T for fɔɹ IN +T 10 tˈɛn CD +T seconds sˈɛkəndz NNS +T . . . +S agent_style:64 Your password must be at least 12 characters long. +P jˌʊɹ pˈæswˌɜɹd mˈʌst bi æt lˈist twˈɛlv kˈɛɹəktəɹz lˈɔŋ. +C jˌʊɹ pˈæswˌɜɹd mˈʌst bi æt lˈist twˈɛlv kˈɛɹəktəɹz lˈɔŋ. +T Your jˌʊɹ PRP$ +T password pˈæswˌɜɹd NN +T must mˈʌst MD +T be bi VB +T at æt RB +T least lˈist RBS +T 12 twˈɛlv CD +T characters kˈɛɹəktəɹz NNS +T long lˈɔŋ RB +T . . . +S agent_style:65 The U.S. Open starts on August 26th. +P ðə jˌuˈɛs ˈOpᵊn stˈɑɹts ˌɔn ˈɔɡəst twˈɛnti sˈɪksθ. +C ðə jˌuˈɛs +C ˈOpᵊn stˈɑɹts ˌɔn ˈɔɡəst twˈɛnti sˈɪksθ. +T The ðə DT +T U.S. jˌuˈɛs NNP +T Open ˈOpᵊn NNP +T starts stˈɑɹts VBZ +T on ˌɔn IN +T August ˈɔɡəst NNP +T 26th twˈɛnti sˈɪksθ NN +T . . . +S agent_style:66 I'd recommend leaving by 4:15 to avoid traffic. +P ˌId ɹˌɛkəmˈɛnd lˈivɪŋ bI fˈɔɹ:fˈɪftin tʊ əvˈYd tɹˈæfɪk. +C ˌId ɹˌɛkəmˈɛnd lˈivɪŋ bI fˈɔɹ:fˈɪftin tʊ əvˈYd tɹˈæfɪk. +T I'd ˌId PRP +T recommend ɹˌɛkəmˈɛnd VB +T leaving lˈivɪŋ VBG +T by bI IN +T 4:15 fˈɔɹ:fˈɪftin CD +T to tʊ TO +T avoid əvˈYd VB +T traffic tɹˈæfɪk NN +T . . . +S agent_style:67 Mr. and Mrs. Johnson will arrive at noon. +P mˈɪstəɹ ænd mˈɪsɪz ʤˈɑnsᵊn wɪl əɹˈIv æt nˈun. +C mˈɪstəɹ +C ænd mˈɪsɪz +C ʤˈɑnsᵊn wɪl əɹˈIv æt nˈun. +T Mr. mˈɪstəɹ NNP +T and ænd CC +T Mrs. mˈɪsɪz NNP +T Johnson ʤˈɑnsᵊn NNP +T will wɪl MD +T arrive əɹˈIv VB +T at æt IN +T noon nˈun NN +T . . . +S agent_style:68 That's a 30% discount on the original price. +P ðˈæts ɐ θˈɜɹTi pəɹsˈɛnt dˈɪskˌWnt ˌɔn ði əɹˈɪʤənᵊl pɹˈIs. +C ðˈæts ɐ θˈɜɹTi pəɹsˈɛnt dˈɪskˌWnt ˌɔn ði əɹˈɪʤənᵊl pɹˈIs. +T That's ðˈæts DT +T a ɐ DT +T 30% θˈɜɹTi pəɹsˈɛnt CD +T discount dˈɪskˌWnt NN +T on ˌɔn IN +T the ði DT +T original əɹˈɪʤənᵊl JJ +T price pɹˈIs NN +T . . . +S agent_style:69 The kids' soccer game was rescheduled to Sunday. +P ðə kˈɪdz sˈɑkəɹ ɡˈAm wʌz ɹiskˈɛʤəld tə sˈʌndˌA. +C ðə kˈɪdz sˈɑkəɹ ɡˈAm wʌz ɹiskˈɛʤəld tə sˈʌndˌA. +T The ðə DT +T kids' kˈɪdz NNS +T soccer sˈɑkəɹ NN +T game ɡˈAm NN +T was wʌz VBD +T rescheduled ɹiskˈɛʤəld VBN +T to tə IN +T Sunday sˈʌndˌA NNP +T . . . +S agent_style:70 Your calendar is clear for the rest of the week. +P jˌʊɹ kˈæləndəɹ ɪz klˈɪɹ fɔɹ ðə ɹˈɛst ʌv ðə wˈik. +C jˌʊɹ kˈæləndəɹ ɪz klˈɪɹ fɔɹ ðə ɹˈɛst ʌv ðə wˈik. +T Your jˌʊɹ PRP$ +T calendar kˈæləndəɹ NN +T is ɪz VBZ +T clear klˈɪɹ JJ +T for fɔɹ IN +T the ðə DT +T rest ɹˈɛst NN +T of ʌv IN +T the ðə DT +T week wˈik NN +T . . . diff --git a/tools/misaki-g2p/tests/fixtures/agent_style.txt.sha256 b/tools/misaki-g2p/tests/fixtures/agent_style.txt.sha256 new file mode 100644 index 0000000000..a82febdafd --- /dev/null +++ b/tools/misaki-g2p/tests/fixtures/agent_style.txt.sha256 @@ -0,0 +1 @@ +de406bbe3d4a388e596f36d1da9ff4103dfb1e52494172c5a162e5720f514654 agent_style.txt diff --git a/tools/misaki-g2p/tests/fixtures/reference.txt b/tools/misaki-g2p/tests/fixtures/reference.txt new file mode 100644 index 0000000000..53b2d6573f --- /dev/null +++ b/tools/misaki-g2p/tests/fixtures/reference.txt @@ -0,0 +1,4951 @@ +# misaki 0.9.4 reference phonemes for tools/misaki-g2p (generated by tests/compare_misaki.py reference). +# Configuration: en.G2P(trf=False, british=False, fallback=espeak.EspeakFallback(british=False), unk='') +# Lines: S idtext, P phonemes, C paradee chunk, T tokenphonemeswhitespacetag. +# Phonemes are as misaki returns them; the gate compares them after Paradee's vocab filter. +S paradee_samples:1 As of August 2015, there were 169 proposed targets for these goals and 304 proposed indicators to show compliance. +P ˌæz ʌv ˈɔɡəst twˈɛnti fˌɪftˈin, ðɛɹ wɜɹ wˈʌn hˈʌndɹəd sˈɪksti nˈIn pɹəpˈOzd tˈɑɹɡəts fɔɹ ðiz ɡˈOlz ænd θɹˈi hˈʌndɹəd fˈɔɹ pɹəpˈOzd ˈɪndəkˌATəɹz tə ʃˈO kəmplˈIəns. +C ˌæz ʌv ˈɔɡəst twˈɛnti fˌɪftˈin, ðɛɹ wɜɹ wˈʌn hˈʌndɹəd sˈɪksti nˈIn pɹəpˈOzd tˈɑɹɡəts fɔɹ ðiz ɡˈOlz ænd θɹˈi hˈʌndɹəd fˈɔɹ pɹəpˈOzd ˈɪndəkˌATəɹz tə ʃˈO kəmplˈIəns. +T As ˌæz IN +T of ʌv IN +T August ˈɔɡəst NNP +T 2015 twˈɛnti fˌɪftˈin CD +T , , , +T there ðɛɹ EX +T were wɜɹ VBD +T 169 wˈʌn hˈʌndɹəd sˈɪksti nˈIn CD +T proposed pɹəpˈOzd VBN +T targets tˈɑɹɡəts NNS +T for fɔɹ IN +T these ðiz DT +T goals ɡˈOlz NNS +T and ænd CC +T 304 θɹˈi hˈʌndɹəd fˈɔɹ CD +T proposed pɹəpˈOzd VBN +T indicators ˈɪndəkˌATəɹz NNS +T to tə TO +T show ʃˈO VB +T compliance kəmplˈIəns NN +T . . . +S paradee_samples:2 White dwarf stars, if they have a near companion, may then become Type Ia supernovae. +P wˈIt dwˈɔɹf stˈɑɹz, ɪf ðA hæv ɐ nˌɪɹ kəmpˈænjən, mˈA ðˈɛn bəkˈʌm tˈIp ˈIə sˌupəɹnˈOvˌi. +C wˈIt dwˈɔɹf stˈɑɹz, ɪf ðA hæv ɐ nˌɪɹ kəmpˈænjən, mˈA ðˈɛn bəkˈʌm tˈIp ˈIə sˌupəɹnˈOvˌi. +T White wˈIt JJ +T dwarf dwˈɔɹf NN +T stars stˈɑɹz NNS +T , , , +T if ɪf IN +T they ðA PRP +T have hæv VBP +T a ɐ DT +T near nˌɪɹ JJ +T companion kəmpˈænjən NN +T , , , +T may mˈA MD +T then ðˈɛn RB +T become bəkˈʌm VB +T Type tˈIp NNP +T Ia ˈIə NNP +T supernovae sˌupəɹnˈOvˌi JJ +T . . . +S paradee_samples:3 According to Herodotus, this was because they had decided in council that they could not beat the Allies in a naval battle. +P əkˈɔɹdɪŋ tə hɛɹˈɑdəTəs, ðɪs wʌz bəkˈʌz ðA hæd dəsˈIdᵻd ɪn kˈWnsᵊl ðæt ðA kʊd nˌɑt bˈit ði ˈælˌIz ɪn ɐ nˈAvᵊl bˈæTᵊl. +C əkˈɔɹdɪŋ tə hɛɹˈɑdəTəs, ðɪs wʌz bəkˈʌz ðA hæd dəsˈIdᵻd ɪn kˈWnsᵊl ðæt ðA kʊd nˌɑt bˈit ði ˈælˌIz ɪn ɐ nˈAvᵊl bˈæTᵊl. +T According əkˈɔɹdɪŋ VBG +T to tə IN +T Herodotus hɛɹˈɑdəTəs NNP +T , , , +T this ðɪs DT +T was wʌz VBD +T because bəkˈʌz IN +T they ðA PRP +T had hæd VBD +T decided dəsˈIdᵻd VBN +T in ɪn IN +T council kˈWnsᵊl NN +T that ðæt IN +T they ðA PRP +T could kʊd MD +T not nˌɑt RB +T beat bˈit VB +T the ði DT +T Allies ˈælˌIz NNPS +T in ɪn IN +T a ɐ DT +T naval nˈAvᵊl JJ +T battle bˈæTᵊl NN +T . . . +S paradee_samples:4 In 1997 Hurlbut's career focused on light as applied to photography and film, and he owned a lighting business in Pasadena, California. +P ɪn nˌIntˈin nˈIndi sˈɛvən hˈɜɹlbʌts kəɹˈɪɹ fˈOkəst ˌɔn lˈIt æz əplˈId tə fətˈɑɡɹəfi ænd fˈɪlm, ænd hi ˈOnd ɐ lˈITɪŋ bˈɪznəs ɪn pˌæsədˈinə, kˌæləfˈɔɹnjə. +C ɪn nˌIntˈin nˈIndi sˈɛvən hˈɜɹlbʌts kəɹˈɪɹ fˈOkəst ˌɔn lˈIt æz əplˈId tə fətˈɑɡɹəfi ænd fˈɪlm, ænd hi ˈOnd ɐ lˈITɪŋ bˈɪznəs ɪn pˌæsədˈinə, kˌæləfˈɔɹnjə. +T In ɪn IN +T 1997 nˌIntˈin nˈIndi sˈɛvən CD +T Hurlbut's hˈɜɹlbʌts NNP +T career kəɹˈɪɹ NN +T focused fˈOkəst VBD +T on ˌɔn IN +T light lˈIt NN +T as æz IN +T applied əplˈId VBN +T to tə IN +T photography fətˈɑɡɹəfi NN +T and ænd CC +T film fˈɪlm NN +T , , , +T and ænd CC +T he hi PRP +T owned ˈOnd VBD +T a ɐ DT +T lighting lˈITɪŋ NN +T business bˈɪznəs NN +T in ɪn IN +T Pasadena pˌæsədˈinə NNP +T , , , +T California kˌæləfˈɔɹnjə NNP +T . . . +S paradee_samples:5 Harvey ended with a century on his Ashes debut, scoring 112 from 183 balls in an innings noted for powerful driving on both sides of the wicket. +P hˈɑɹvi ˈɛndᵻd wɪð ɐ sˈɛnʧəɹi ˌɔn hɪz ˈæʃᵻz dAbjˈu, skˈɔɹɪŋ wˈʌn hˈʌndɹəd twˈɛlv fɹʌm wˈʌn hˈʌndɹəd ˈATi θɹˈi bˈɔlz ɪn ɐn ˈɪnɪŋz nˈOTᵻd fɔɹ pˈWəɹfᵊl dɹˈIvɪŋ ˌɔn bˈOθ sˈIdz ʌv ðə wˈɪkət. +C hˈɑɹvi ˈɛndᵻd wɪð ɐ sˈɛnʧəɹi ˌɔn hɪz ˈæʃᵻz dAbjˈu, skˈɔɹɪŋ wˈʌn hˈʌndɹəd twˈɛlv fɹʌm wˈʌn hˈʌndɹəd ˈATi θɹˈi bˈɔlz ɪn ɐn ˈɪnɪŋz nˈOTᵻd fɔɹ pˈWəɹfᵊl dɹˈIvɪŋ ˌɔn bˈOθ sˈIdz ʌv ðə wˈɪkət. +T Harvey hˈɑɹvi NN +T ended ˈɛndᵻd VBD +T with wɪð IN +T a ɐ DT +T century sˈɛnʧəɹi NN +T on ˌɔn IN +T his hɪz PRP$ +T Ashes ˈæʃᵻz NNPS +T debut dAbjˈu NN +T , , , +T scoring skˈɔɹɪŋ VBG +T 112 wˈʌn hˈʌndɹəd twˈɛlv CD +T from fɹʌm IN +T 183 wˈʌn hˈʌndɹəd ˈATi θɹˈi CD +T balls bˈɔlz NNS +T in ɪn IN +T an ɐn DT +T innings ˈɪnɪŋz NN +T noted nˈOTᵻd VBN +T for fɔɹ IN +T powerful pˈWəɹfᵊl JJ +T driving dɹˈIvɪŋ NN +T on ˌɔn IN +T both bˈOθ DT +T sides sˈIdz NNS +T of ʌv IN +T the ðə DT +T wicket wˈɪkət NN +T . . . +S wikitext_heldout_200:1 As of August 2015, there were 169 proposed targets for these goals and 304 proposed indicators to show compliance. +P ˌæz ʌv ˈɔɡəst twˈɛnti fˌɪftˈin, ðɛɹ wɜɹ wˈʌn hˈʌndɹəd sˈɪksti nˈIn pɹəpˈOzd tˈɑɹɡəts fɔɹ ðiz ɡˈOlz ænd θɹˈi hˈʌndɹəd fˈɔɹ pɹəpˈOzd ˈɪndəkˌATəɹz tə ʃˈO kəmplˈIəns. +C ˌæz ʌv ˈɔɡəst twˈɛnti fˌɪftˈin, ðɛɹ wɜɹ wˈʌn hˈʌndɹəd sˈɪksti nˈIn pɹəpˈOzd tˈɑɹɡəts fɔɹ ðiz ɡˈOlz ænd θɹˈi hˈʌndɹəd fˈɔɹ pɹəpˈOzd ˈɪndəkˌATəɹz tə ʃˈO kəmplˈIəns. +T As ˌæz IN +T of ʌv IN +T August ˈɔɡəst NNP +T 2015 twˈɛnti fˌɪftˈin CD +T , , , +T there ðɛɹ EX +T were wɜɹ VBD +T 169 wˈʌn hˈʌndɹəd sˈɪksti nˈIn CD +T proposed pɹəpˈOzd VBN +T targets tˈɑɹɡəts NNS +T for fɔɹ IN +T these ðiz DT +T goals ɡˈOlz NNS +T and ænd CC +T 304 θɹˈi hˈʌndɹəd fˈɔɹ CD +T proposed pɹəpˈOzd VBN +T indicators ˈɪndəkˌATəɹz NNS +T to tə TO +T show ʃˈO VB +T compliance kəmplˈIəns NN +T . . . +S wikitext_heldout_200:2 White dwarf stars, if they have a near companion, may then become Type Ia supernovae. +P wˈIt dwˈɔɹf stˈɑɹz, ɪf ðA hæv ɐ nˌɪɹ kəmpˈænjən, mˈA ðˈɛn bəkˈʌm tˈIp ˈIə sˌupəɹnˈOvˌi. +C wˈIt dwˈɔɹf stˈɑɹz, ɪf ðA hæv ɐ nˌɪɹ kəmpˈænjən, mˈA ðˈɛn bəkˈʌm tˈIp ˈIə sˌupəɹnˈOvˌi. +T White wˈIt JJ +T dwarf dwˈɔɹf NN +T stars stˈɑɹz NNS +T , , , +T if ɪf IN +T they ðA PRP +T have hæv VBP +T a ɐ DT +T near nˌɪɹ JJ +T companion kəmpˈænjən NN +T , , , +T may mˈA MD +T then ðˈɛn RB +T become bəkˈʌm VB +T Type tˈIp NNP +T Ia ˈIə NNP +T supernovae sˌupəɹnˈOvˌi JJ +T . . . +S wikitext_heldout_200:3 According to Herodotus, this was because they had decided in council that they could not beat the Allies in a naval battle. +P əkˈɔɹdɪŋ tə hɛɹˈɑdəTəs, ðɪs wʌz bəkˈʌz ðA hæd dəsˈIdᵻd ɪn kˈWnsᵊl ðæt ðA kʊd nˌɑt bˈit ði ˈælˌIz ɪn ɐ nˈAvᵊl bˈæTᵊl. +C əkˈɔɹdɪŋ tə hɛɹˈɑdəTəs, ðɪs wʌz bəkˈʌz ðA hæd dəsˈIdᵻd ɪn kˈWnsᵊl ðæt ðA kʊd nˌɑt bˈit ði ˈælˌIz ɪn ɐ nˈAvᵊl bˈæTᵊl. +T According əkˈɔɹdɪŋ VBG +T to tə IN +T Herodotus hɛɹˈɑdəTəs NNP +T , , , +T this ðɪs DT +T was wʌz VBD +T because bəkˈʌz IN +T they ðA PRP +T had hæd VBD +T decided dəsˈIdᵻd VBN +T in ɪn IN +T council kˈWnsᵊl NN +T that ðæt IN +T they ðA PRP +T could kʊd MD +T not nˌɑt RB +T beat bˈit VB +T the ði DT +T Allies ˈælˌIz NNPS +T in ɪn IN +T a ɐ DT +T naval nˈAvᵊl JJ +T battle bˈæTᵊl NN +T . . . +S wikitext_heldout_200:4 The ashes were later taken to Veluvana, where they were enshrined in a silver stupa. +P ði ˈæʃᵻz wɜɹ lˈATəɹ tˈAkən tə vˌɛluvˈɑnə, wˌɛɹ ðA wɜɹ ɪnʃɹˈInd ɪn ɐ sˈɪlvəɹ stˈupə. +C ði ˈæʃᵻz wɜɹ lˈATəɹ tˈAkən tə vˌɛluvˈɑnə, wˌɛɹ ðA wɜɹ ɪnʃɹˈInd ɪn ɐ sˈɪlvəɹ stˈupə. +T The ði DT +T ashes ˈæʃᵻz NNS +T were wɜɹ VBD +T later lˈATəɹ RB +T taken tˈAkən VBN +T to tə IN +T Veluvana vˌɛluvˈɑnə NNP +T , , , +T where wˌɛɹ WRB +T they ðA PRP +T were wɜɹ VBD +T enshrined ɪnʃɹˈInd VBN +T in ɪn IN +T a ɐ DT +T silver sˈɪlvəɹ NN +T stupa stˈupə RB +T . . . +S wikitext_heldout_200:5 Ten priests of the Evangelical Lutheran Church of Finland and 90 (moderate) socialists were executed also. +P tˈɛn pɹˈists ʌv ði ˌivˌænʤˈɛləkᵊl lˈuθəɹən ʧˈɜɹʧ ʌv fˈɪnlənd ænd nˈIndi (mˈɑdəɹət) sˈOʃəlɪsts wɜɹ ˈɛksəkjˌuTᵻd ˈɔlsO. +C tˈɛn pɹˈists ʌv ði ˌivˌænʤˈɛləkᵊl lˈuθəɹən ʧˈɜɹʧ ʌv fˈɪnlənd ænd nˈIndi (mˈɑdəɹət) sˈOʃəlɪsts wɜɹ ˈɛksəkjˌuTᵻd ˈɔlsO. +T Ten tˈɛn CD +T priests pɹˈists NNS +T of ʌv IN +T the ði DT +T Evangelical ˌivˌænʤˈɛləkᵊl NNP +T Lutheran lˈuθəɹən NNP +T Church ʧˈɜɹʧ NNP +T of ʌv IN +T Finland fˈɪnlənd NNP +T and ænd CC +T 90 nˈIndi CD +T ( ( -LRB- +T moderate mˈɑdəɹət JJ +T ) ) -RRB- +T socialists sˈOʃəlɪsts NNS +T were wɜɹ VBD +T executed ˈɛksəkjˌuTᵻd VBN +T also ˈɔlsO RB +T . . . +S wikitext_heldout_200:6 In 1997 Hurlbut's career focused on light as applied to photography and film, and he owned a lighting business in Pasadena, California. +P ɪn nˌIntˈin nˈIndi sˈɛvən hˈɜɹlbʌts kəɹˈɪɹ fˈOkəst ˌɔn lˈIt æz əplˈId tə fətˈɑɡɹəfi ænd fˈɪlm, ænd hi ˈOnd ɐ lˈITɪŋ bˈɪznəs ɪn pˌæsədˈinə, kˌæləfˈɔɹnjə. +C ɪn nˌIntˈin nˈIndi sˈɛvən hˈɜɹlbʌts kəɹˈɪɹ fˈOkəst ˌɔn lˈIt æz əplˈId tə fətˈɑɡɹəfi ænd fˈɪlm, ænd hi ˈOnd ɐ lˈITɪŋ bˈɪznəs ɪn pˌæsədˈinə, kˌæləfˈɔɹnjə. +T In ɪn IN +T 1997 nˌIntˈin nˈIndi sˈɛvən CD +T Hurlbut's hˈɜɹlbʌts NNP +T career kəɹˈɪɹ NN +T focused fˈOkəst VBD +T on ˌɔn IN +T light lˈIt NN +T as æz IN +T applied əplˈId VBN +T to tə IN +T photography fətˈɑɡɹəfi NN +T and ænd CC +T film fˈɪlm NN +T , , , +T and ænd CC +T he hi PRP +T owned ˈOnd VBD +T a ɐ DT +T lighting lˈITɪŋ NN +T business bˈɪznəs NN +T in ɪn IN +T Pasadena pˌæsədˈinə NNP +T , , , +T California kˌæləfˈɔɹnjə NNP +T . . . +S wikitext_heldout_200:7 In the Canadian Hot 100, the peaked and debuted at number 73 on the week ending August 9, 2008 due to digital downloads. +P ɪn ðə kənˈAdiən hˈɑt wˈʌn hˈʌndɹəd, ðə pˈikt ænd dAbjˈud æt nˈʌmbəɹ sˈɛvənti θɹˈi ˌɔn ðə wˈik ˈɛndɪŋ ˈɔɡəst nˈIn, tˈu θˈWzᵊnd ˈAt dˈu tə dˈɪʤəTᵊl dˈWnlˌOdz. +C ɪn ðə kənˈAdiən hˈɑt wˈʌn hˈʌndɹəd, ðə pˈikt ænd dAbjˈud æt nˈʌmbəɹ sˈɛvənti θɹˈi ˌɔn ðə wˈik ˈɛndɪŋ ˈɔɡəst nˈIn, tˈu θˈWzᵊnd ˈAt dˈu tə dˈɪʤəTᵊl dˈWnlˌOdz. +T In ɪn IN +T the ðə DT +T Canadian kənˈAdiən NNP +T Hot hˈɑt NNP +T 100 wˈʌn hˈʌndɹəd CD +T , , , +T the ðə DT +T peaked pˈikt JJ +T and ænd CC +T debuted dAbjˈud VBD +T at æt IN +T number nˈʌmbəɹ NN +T 73 sˈɛvənti θɹˈi CD +T on ˌɔn IN +T the ðə DT +T week wˈik NN +T ending ˈɛndɪŋ VBG +T August ˈɔɡəst NNP +T 9 nˈIn CD +T , , , +T 2008 tˈu θˈWzᵊnd ˈAt CD +T due dˈu IN +T to tə IN +T digital dˈɪʤəTᵊl JJ +T downloads dˈWnlˌOdz NNS +T . . . +S wikitext_heldout_200:8 The gateway was opened on December 4, 1924, by the Viceroy, the Earl of Reading. +P ðə ɡˈAtwˌA wʌz ˈOpᵊnd ˌɔn disˈɛmbəɹ fˈɔɹ, nˌIntˈin twˈɛnti fˈɔɹ, bI ðə vˈIsɹˌY, ði ˈɜɹᵊl ʌv ɹˈidɪŋ. +C ðə ɡˈAtwˌA wʌz ˈOpᵊnd ˌɔn disˈɛmbəɹ fˈɔɹ, nˌIntˈin twˈɛnti fˈɔɹ, bI ðə vˈIsɹˌY, ði ˈɜɹᵊl ʌv ɹˈidɪŋ. +T The ðə DT +T gateway ɡˈAtwˌA NN +T was wʌz VBD +T opened ˈOpᵊnd VBN +T on ˌɔn IN +T December disˈɛmbəɹ NNP +T 4 fˈɔɹ CD +T , , , +T 1924 nˌIntˈin twˈɛnti fˈɔɹ CD +T , , , +T by bI IN +T the ðə DT +T Viceroy vˈIsɹˌY NNP +T , , , +T the ði DT +T Earl ˈɜɹᵊl NNP +T of ʌv IN +T Reading ɹˈidɪŋ NNP +T . . . +S wikitext_heldout_200:9 The original traction motors were used in the construction of the 20 C type'Desert Gold'cars which were being built at the same time. +P ði əɹˈɪʤənᵊl tɹˈækʃən mˈOTəɹz wɜɹ jˈuzd ɪn ðə kənstɹˈʌkʃən ʌv ðə twˈɛnti sˈi tˈIpdɛsəɹt ɡˈOldkɑɹz wˌɪʧ wɜɹ bˈiɪŋ bˈɪlt æt ðə sˈAm tˈIm. +C ði əɹˈɪʤənᵊl tɹˈækʃən mˈOTəɹz wɜɹ jˈuzd ɪn ðə kənstɹˈʌkʃən ʌv ðə twˈɛnti sˈi tˈIpdɛsəɹt ɡˈOldkɑɹz wˌɪʧ wɜɹ bˈiɪŋ bˈɪlt æt ðə sˈAm tˈIm. +T The ði DT +T original əɹˈɪʤənᵊl JJ +T traction tɹˈækʃən NN +T motors mˈOTəɹz NNS +T were wɜɹ VBD +T used jˈuzd VBN +T in ɪn IN +T the ðə DT +T construction kənstɹˈʌkʃən NN +T of ʌv IN +T the ðə DT +T 20 twˈɛnti CD +T C sˈi NN +T type'Desert tˈIpdɛsəɹt NN +T Gold'cars ɡˈOldkɑɹz NNP +T which wˌɪʧ WDT +T were wɜɹ VBD +T being bˈiɪŋ VBG +T built bˈɪlt VBN +T at æt IN +T the ðə DT +T same sˈAm JJ +T time tˈIm NN +T . . . +S wikitext_heldout_200:10 Harvey ended with a century on his Ashes debut, scoring 112 from 183 balls in an innings noted for powerful driving on both sides of the wicket. +P hˈɑɹvi ˈɛndᵻd wɪð ɐ sˈɛnʧəɹi ˌɔn hɪz ˈæʃᵻz dAbjˈu, skˈɔɹɪŋ wˈʌn hˈʌndɹəd twˈɛlv fɹʌm wˈʌn hˈʌndɹəd ˈATi θɹˈi bˈɔlz ɪn ɐn ˈɪnɪŋz nˈOTᵻd fɔɹ pˈWəɹfᵊl dɹˈIvɪŋ ˌɔn bˈOθ sˈIdz ʌv ðə wˈɪkət. +C hˈɑɹvi ˈɛndᵻd wɪð ɐ sˈɛnʧəɹi ˌɔn hɪz ˈæʃᵻz dAbjˈu, skˈɔɹɪŋ wˈʌn hˈʌndɹəd twˈɛlv fɹʌm wˈʌn hˈʌndɹəd ˈATi θɹˈi bˈɔlz ɪn ɐn ˈɪnɪŋz nˈOTᵻd fɔɹ pˈWəɹfᵊl dɹˈIvɪŋ ˌɔn bˈOθ sˈIdz ʌv ðə wˈɪkət. +T Harvey hˈɑɹvi NN +T ended ˈɛndᵻd VBD +T with wɪð IN +T a ɐ DT +T century sˈɛnʧəɹi NN +T on ˌɔn IN +T his hɪz PRP$ +T Ashes ˈæʃᵻz NNPS +T debut dAbjˈu NN +T , , , +T scoring skˈɔɹɪŋ VBG +T 112 wˈʌn hˈʌndɹəd twˈɛlv CD +T from fɹʌm IN +T 183 wˈʌn hˈʌndɹəd ˈATi θɹˈi CD +T balls bˈɔlz NNS +T in ɪn IN +T an ɐn DT +T innings ˈɪnɪŋz NN +T noted nˈOTᵻd VBN +T for fɔɹ IN +T powerful pˈWəɹfᵊl JJ +T driving dɹˈIvɪŋ NN +T on ˌɔn IN +T both bˈOθ DT +T sides sˈIdz NNS +T of ʌv IN +T the ðə DT +T wicket wˈɪkət NN +T . . . +S wikitext_heldout_200:11 She described it as " an upbeat song. +P ʃˌi dəskɹˈIbd ɪt æz “ ɐn ˈʌpbˌit sˈɔŋ. +C ʃˌi dəskɹˈIbd ɪt æz “ ɐn ˈʌpbˌit sˈɔŋ. +T She ʃˌi PRP +T described dəskɹˈIbd VBD +T it ɪt PRP +T as æz IN +T " “ `` +T an ɐn DT +T upbeat ˈʌpbˌit JJ +T song sˈɔŋ NN +T . . . +S wikitext_heldout_200:12 The video begins with Brown singing alone in a desert in front of a sunset backdrop. +P ðə vˈɪdiO bəɡˈɪnz wɪð bɹˈWn sˈɪŋɪŋ əlˈOn ɪn ɐ dˈɛzəɹt ɪn fɹˈʌnt ʌv ɐ sˈʌnsˌɛt bˈækdɹˌɑp. +C ðə vˈɪdiO bəɡˈɪnz wɪð bɹˈWn sˈɪŋɪŋ əlˈOn ɪn ɐ dˈɛzəɹt ɪn fɹˈʌnt ʌv ɐ sˈʌnsˌɛt bˈækdɹˌɑp. +T The ðə DT +T video vˈɪdiO NN +T begins bəɡˈɪnz VBZ +T with wɪð IN +T Brown bɹˈWn NNP +T singing sˈɪŋɪŋ NN +T alone əlˈOn RB +T in ɪn IN +T a ɐ DT +T desert dˈɛzəɹt NN +T in ɪn IN +T front fɹˈʌnt NN +T of ʌv IN +T a ɐ DT +T sunset sˈʌnsˌɛt NN +T backdrop bˈækdɹˌɑp NN +T . . . +S wikitext_heldout_200:13 The most common approach to turn this intuitive idea into a precise definition is to define the derivative as a limit of difference quotients of real numbers. +P ðə mˈOst kˈɑmən əpɹˈOʧ tə tˈɜɹn ðɪs ɪntˈuəTɪv Idˈiə ˈɪntu ɐ pɹisˈIs dˌɛfənˈɪʃən ɪz tə dəfˈIn ðə dəɹˈɪvəTɪv æz ɐ lˈɪmət ʌv dˈɪfəɹəns kwˈOʃənts ʌv ɹˈiᵊl nˈʌmbəɹz. +C ðə mˈOst kˈɑmən əpɹˈOʧ tə tˈɜɹn ðɪs ɪntˈuəTɪv Idˈiə ˈɪntu ɐ pɹisˈIs dˌɛfənˈɪʃən ɪz tə dəfˈIn ðə dəɹˈɪvəTɪv æz ɐ lˈɪmət ʌv dˈɪfəɹəns kwˈOʃənts ʌv ɹˈiᵊl nˈʌmbəɹz. +T The ðə DT +T most mˈOst RBS +T common kˈɑmən JJ +T approach əpɹˈOʧ NN +T to tə TO +T turn tˈɜɹn VB +T this ðɪs DT +T intuitive ɪntˈuəTɪv JJ +T idea Idˈiə NN +T into ˈɪntu IN +T a ɐ DT +T precise pɹisˈIs JJ +T definition dˌɛfənˈɪʃən NN +T is ɪz VBZ +T to tə TO +T define dəfˈIn VB +T the ðə DT +T derivative dəɹˈɪvəTɪv NN +T as æz IN +T a ɐ DT +T limit lˈɪmət NN +T of ʌv IN +T difference dˈɪfəɹəns NN +T quotients kwˈOʃənts NNS +T of ʌv IN +T real ɹˈiᵊl JJ +T numbers nˈʌmbəɹz NNS +T . . . +S wikitext_heldout_200:14 Before the conquest, this territory contained a number of competing Mesoamerican kingdoms, the majority of which were Maya. +P bəfˈɔɹ ðə kˈɑnkwˌɛst, ðɪs tˈɛɹətˌɔɹi kəntˈAnd ɐ nˈʌmbəɹ ʌv kəmpˈiTɪŋ mˌɛsOəmˈɛɹɪkən kˈɪŋdəmz, ðə məʤˈɑɹəTi ʌv wˌɪʧ wɜɹ mˈIə. +C bəfˈɔɹ ðə kˈɑnkwˌɛst, ðɪs tˈɛɹətˌɔɹi kəntˈAnd ɐ nˈʌmbəɹ ʌv kəmpˈiTɪŋ mˌɛsOəmˈɛɹɪkən kˈɪŋdəmz, ðə məʤˈɑɹəTi ʌv wˌɪʧ wɜɹ mˈIə. +T Before bəfˈɔɹ IN +T the ðə DT +T conquest kˈɑnkwˌɛst NN +T , , , +T this ðɪs DT +T territory tˈɛɹətˌɔɹi NN +T contained kəntˈAnd VBD +T a ɐ DT +T number nˈʌmbəɹ NN +T of ʌv IN +T competing kəmpˈiTɪŋ VBG +T Mesoamerican mˌɛsOəmˈɛɹɪkən NNP +T kingdoms kˈɪŋdəmz NNS +T , , , +T the ðə DT +T majority məʤˈɑɹəTi NN +T of ʌv IN +T which wˌɪʧ WDT +T were wɜɹ VBD +T Maya mˈIə NNP +T . . . +S wikitext_heldout_200:15 The oil was moved in earthenware vessels to the river bank where it was then poured into boat holds for transportation to Britain. +P ði ˈYl wʌz mˈuvd ɪn ˈɜɹθənwˌɛɹ vˈɛsᵊlz tə ðə ɹˈɪvəɹ bˈæŋk wˌɛɹ ɪt wʌz ðˈɛn pˈɔɹd ˈɪntu bˈOt hˈOldz fɔɹ tɹˌænspəɹtˈAʃən tə bɹˈɪtᵊn. +C ði ˈYl wʌz mˈuvd ɪn ˈɜɹθənwˌɛɹ vˈɛsᵊlz tə ðə ɹˈɪvəɹ bˈæŋk wˌɛɹ ɪt wʌz ðˈɛn pˈɔɹd ˈɪntu bˈOt hˈOldz fɔɹ tɹˌænspəɹtˈAʃən tə bɹˈɪtᵊn. +T The ði DT +T oil ˈYl NN +T was wʌz VBD +T moved mˈuvd VBN +T in ɪn IN +T earthenware ˈɜɹθənwˌɛɹ NN +T vessels vˈɛsᵊlz NNS +T to tə IN +T the ðə DT +T river ɹˈɪvəɹ NN +T bank bˈæŋk NN +T where wˌɛɹ WRB +T it ɪt PRP +T was wʌz VBD +T then ðˈɛn RB +T poured pˈɔɹd VBN +T into ˈɪntu IN +T boat bˈOt NN +T holds hˈOldz VBZ +T for fɔɹ IN +T transportation tɹˌænspəɹtˈAʃən NN +T to tə IN +T Britain bɹˈɪtᵊn NNP +T . . . +S wikitext_heldout_200:16 Details surrounding the accident are slowly revealed as the series progresses. +P dətˈAlz səɹˈWndɪŋ ði ˈæksədᵊnt ɑɹ slˈOli ɹəvˈild æz ðə sˈɪɹiz pɹəɡɹˈɛsᵻz. +C dətˈAlz səɹˈWndɪŋ ði ˈæksədᵊnt ɑɹ slˈOli ɹəvˈild æz ðə sˈɪɹiz pɹəɡɹˈɛsᵻz. +T Details dətˈAlz NNS +T surrounding səɹˈWndɪŋ VBG +T the ði DT +T accident ˈæksədᵊnt NN +T are ɑɹ VBP +T slowly slˈOli RB +T revealed ɹəvˈild VBN +T as æz IN +T the ðə DT +T series sˈɪɹiz NN +T progresses pɹəɡɹˈɛsᵻz VBZ +T . . . +S wikitext_heldout_200:17 Also at this time, the route was widened into a divided highway from the Christiana Mall north to Stanton. +P ˈɔlsO æt ðɪs tˈIm, ðə ɹˈut wʌz wˈIdənd ˈɪntu ɐ dəvˈIdᵻd hˈIwˌA fɹʌm ðə kɹˌɪstɪˈɑnə mˈɔl nˈɔɹθ tə stˈæntən. +C ˈɔlsO æt ðɪs tˈIm, ðə ɹˈut wʌz wˈIdənd ˈɪntu ɐ dəvˈIdᵻd hˈIwˌA fɹʌm ðə kɹˌɪstɪˈɑnə mˈɔl nˈɔɹθ tə stˈæntən. +T Also ˈɔlsO RB +T at æt IN +T this ðɪs DT +T time tˈIm NN +T , , , +T the ðə DT +T route ɹˈut NN +T was wʌz VBD +T widened wˈIdənd VBN +T into ˈɪntu IN +T a ɐ DT +T divided dəvˈIdᵻd JJ +T highway hˈIwˌA NN +T from fɹʌm IN +T the ðə DT +T Christiana kɹˌɪstɪˈɑnə NNP +T Mall mˈɔl NNP +T north nˈɔɹθ NN +T to tə IN +T Stanton stˈæntən NNP +T . . . +S wikitext_heldout_200:18 After telling Thalaba to turn to the darker powers, Thalaba leaves. +P ˈæftəɹ tˈɛlɪŋ θælˈɑbə tə tˈɜɹn tə ðə dˈɑɹkəɹ pˈWəɹz, θælˈɑbə lˈivz. +C ˈæftəɹ tˈɛlɪŋ θælˈɑbə tə tˈɜɹn tə ðə dˈɑɹkəɹ pˈWəɹz, θælˈɑbə lˈivz. +T After ˈæftəɹ IN +T telling tˈɛlɪŋ VBG +T Thalaba θælˈɑbə NNP +T to tə TO +T turn tˈɜɹn VB +T to tə IN +T the ðə DT +T darker dˈɑɹkəɹ JJR +T powers pˈWəɹz NNS +T , , , +T Thalaba θælˈɑbə NNP +T leaves lˈivz VBZ +T . . . +S wikitext_heldout_200:19 His father ran a family trucking company, and his mother was a secretary. +P hˌɪz fˈɑðəɹ ɹˈæn ɐ fˈæmᵊli tɹˈʌkɪŋ kˈʌmpᵊni, ænd hɪz mˈʌðəɹ wʌz ɐ sˈɛkɹətˌɛɹi. +C hˌɪz fˈɑðəɹ ɹˈæn ɐ fˈæmᵊli tɹˈʌkɪŋ kˈʌmpᵊni, ænd hɪz mˈʌðəɹ wʌz ɐ sˈɛkɹətˌɛɹi. +T His hˌɪz PRP$ +T father fˈɑðəɹ NN +T ran ɹˈæn VBD +T a ɐ DT +T family fˈæmᵊli NN +T trucking tɹˈʌkɪŋ NN +T company kˈʌmpᵊni NN +T , , , +T and ænd CC +T his hɪz PRP$ +T mother mˈʌðəɹ NN +T was wʌz VBD +T a ɐ DT +T secretary sˈɛkɹətˌɛɹi NN +T . . . +S wikitext_heldout_200:20 WWE Divas Championship (3 times) +P dˌʌbᵊljudˌʌbᵊljuˈi dˈivəz ʧˈæmpiənʃˌɪp (θɹˈi tˈImz) +C dˌʌbᵊljudˌʌbᵊljuˈi dˈivəz ʧˈæmpiənʃˌɪp (θɹˈi tˈImz) +T WWE dˌʌbᵊljudˌʌbᵊljuˈi NNP +T Divas dˈivəz NNP +T Championship ʧˈæmpiənʃˌɪp NNP +T ( ( -LRB- +T 3 θɹˈi CD +T times tˈImz NNS +T ) ) -RRB- +S wikitext_heldout_200:21 The Welsh were also early adopters of roasting cheese. +P ðə wˈɛlʃ wɜɹ ˈɔlsO ˈɜɹli ədˈɑptəɹz ʌv ɹˈOstɪŋ ʧˈiz. +C ðə wˈɛlʃ wɜɹ ˈɔlsO ˈɜɹli ədˈɑptəɹz ʌv ɹˈOstɪŋ ʧˈiz. +T The ðə DT +T Welsh wˈɛlʃ NNP +T were wɜɹ VBD +T also ˈɔlsO RB +T early ˈɜɹli JJ +T adopters ədˈɑptəɹz NNS +T of ʌv IN +T roasting ɹˈOstɪŋ VBG +T cheese ʧˈiz NN +T . . . +S wikitext_heldout_200:22 He reveals he felt guilty for hurting her, so he explained his behavior to her new friends and asked them to sign her yearbook. +P hˌi ɹəvˈilz hi fˈɛlt ɡˈɪlti fɔɹ hˈɜɹTɪŋ hˌɜɹ, sˌO hi ɪksplˈAnd hɪz bəhˈAvjəɹ tə hɜɹ nˈu fɹˈɛndz ænd ˈæskt ðˌɛm tə sˈIn hɜɹ jˈɪɹbˌʊk. +C hˌi ɹəvˈilz hi fˈɛlt ɡˈɪlti fɔɹ hˈɜɹTɪŋ hˌɜɹ, sˌO hi ɪksplˈAnd hɪz bəhˈAvjəɹ tə hɜɹ nˈu fɹˈɛndz ænd ˈæskt ðˌɛm tə sˈIn hɜɹ jˈɪɹbˌʊk. +T He hˌi PRP +T reveals ɹəvˈilz VBZ +T he hi PRP +T felt fˈɛlt VBD +T guilty ɡˈɪlti JJ +T for fɔɹ IN +T hurting hˈɜɹTɪŋ VBG +T her hˌɜɹ PRP +T , , , +T so sˌO RB +T he hi PRP +T explained ɪksplˈAnd VBD +T his hɪz PRP$ +T behavior bəhˈAvjəɹ NN +T to tə IN +T her hɜɹ PRP$ +T new nˈu JJ +T friends fɹˈɛndz NNS +T and ænd CC +T asked ˈæskt VBD +T them ðˌɛm PRP +T to tə TO +T sign sˈIn VB +T her hɜɹ PRP$ +T yearbook jˈɪɹbˌʊk NN +T . . . +S wikitext_heldout_200:23 Snowfall occurs occasionally and can cause travel disruption when this happens. +P snˈOfˌɔl əkˈɜɹz əkˈAʒᵊnəli ænd kæn kˈɔz tɹˈævᵊl dɪsɹˈʌpʃən wˌɛn ðɪs hˈæpənz. +C snˈOfˌɔl əkˈɜɹz əkˈAʒᵊnəli ænd kæn kˈɔz tɹˈævᵊl dɪsɹˈʌpʃən wˌɛn ðɪs hˈæpənz. +T Snowfall snˈOfˌɔl NN +T occurs əkˈɜɹz VBZ +T occasionally əkˈAʒᵊnəli RB +T and ænd CC +T can kæn MD +T cause kˈɔz VB +T travel tɹˈævᵊl NN +T disruption dɪsɹˈʌpʃən NN +T when wˌɛn WRB +T this ðɪs DT +T happens hˈæpənz VBZ +T . . . +S wikitext_heldout_200:24 The Minister for Local Government dismissed the Council and its Mayor, Rob Drew, and appointed an administrator upon receiving the inquiry's report. +P ðə mˈɪnəstəɹ fɔɹ lˈOkəl ɡˈʌvəɹnmənt dəsmˈɪst ðə kˈWnsᵊl ænd ɪts mˈAəɹ, ɹˈɑb dɹˈu, ænd əpˈYntᵻd ɐn ədmˈɪnəstɹˌATəɹ əpˈɑn ɹᵻsˈivɪŋ ði ˈɪnkwˌIɹiz ɹəpˈɔɹt. +C ðə mˈɪnəstəɹ fɔɹ lˈOkəl ɡˈʌvəɹnmənt dəsmˈɪst ðə kˈWnsᵊl ænd ɪts mˈAəɹ, ɹˈɑb dɹˈu, ænd əpˈYntᵻd ɐn ədmˈɪnəstɹˌATəɹ əpˈɑn ɹᵻsˈivɪŋ ði ˈɪnkwˌIɹiz ɹəpˈɔɹt. +T The ðə DT +T Minister mˈɪnəstəɹ NNP +T for fɔɹ IN +T Local lˈOkəl NNP +T Government ɡˈʌvəɹnmənt NNP +T dismissed dəsmˈɪst VBD +T the ðə DT +T Council kˈWnsᵊl NNP +T and ænd CC +T its ɪts PRP$ +T Mayor mˈAəɹ NNP +T , , , +T Rob ɹˈɑb NNP +T Drew dɹˈu NNP +T , , , +T and ænd CC +T appointed əpˈYntᵻd VBD +T an ɐn DT +T administrator ədmˈɪnəstɹˌATəɹ NN +T upon əpˈɑn IN +T receiving ɹᵻsˈivɪŋ VBG +T the ði DT +T inquiry's ˈɪnkwˌIɹiz NN +T report ɹəpˈɔɹt NN +T . . . +S wikitext_heldout_200:25 Lita joined the two in the segment, making this the first time the three had been seen together on WWE television since February 2003. +P lˈiTə ʤˈYnd ðə tˈu ɪn ðə sˈɛɡmᵊnt, mˈAkɪŋ ðɪs ðə fˈɜɹst tˈIm ðə θɹˈi hæd bɪn sˈin təɡˈɛðəɹ ˌɔn dˌʌbᵊljudˌʌbᵊljuˈi tˈɛləvˌɪʒən sˈɪns fˈɛbjəwˌɛɹi tˈu θˈWzᵊnd θɹˈi. +C lˈiTə ʤˈYnd ðə tˈu ɪn ðə sˈɛɡmᵊnt, mˈAkɪŋ ðɪs ðə fˈɜɹst tˈIm ðə θɹˈi hæd bɪn sˈin təɡˈɛðəɹ ˌɔn dˌʌbᵊljudˌʌbᵊljuˈi tˈɛləvˌɪʒən sˈɪns fˈɛbjəwˌɛɹi tˈu θˈWzᵊnd θɹˈi. +T Lita lˈiTə NNP +T joined ʤˈYnd VBD +T the ðə DT +T two tˈu CD +T in ɪn IN +T the ðə DT +T segment sˈɛɡmᵊnt NN +T , , , +T making mˈAkɪŋ VBG +T this ðɪs DT +T the ðə DT +T first fˈɜɹst JJ +T time tˈIm NN +T the ðə DT +T three θɹˈi CD +T had hæd VBD +T been bɪn VBN +T seen sˈin VBN +T together təɡˈɛðəɹ RB +T on ˌɔn IN +T WWE dˌʌbᵊljudˌʌbᵊljuˈi NNP +T television tˈɛləvˌɪʒən NN +T since sˈɪns IN +T February fˈɛbjəwˌɛɹi NNP +T 2003 tˈu θˈWzᵊnd θɹˈi CD +T . . . +S wikitext_heldout_200:26 The League took control of much of northern France to secure French ports for his armada. +P ðə lˈiɡ tˈʊk kəntɹˈOl ʌv mˈʌʧ ʌv nˈɔɹðəɹn fɹˈæns tə səkjˈʊɹ fɹˈɛnʧ pˈɔɹts fɔɹ hɪz ɑɹmˈɑdə. +C ðə lˈiɡ tˈʊk kəntɹˈOl ʌv mˈʌʧ ʌv nˈɔɹðəɹn fɹˈæns tə səkjˈʊɹ fɹˈɛnʧ pˈɔɹts fɔɹ hɪz ɑɹmˈɑdə. +T The ðə DT +T League lˈiɡ NNP +T took tˈʊk VBD +T control kəntɹˈOl NN +T of ʌv IN +T much mˈʌʧ JJ +T of ʌv IN +T northern nˈɔɹðəɹn JJ +T France fɹˈæns NNP +T to tə TO +T secure səkjˈʊɹ VB +T French fɹˈɛnʧ JJ +T ports pˈɔɹts NNS +T for fɔɹ IN +T his hɪz PRP$ +T armada ɑɹmˈɑdə NN +T . . . +S wikitext_heldout_200:27 School on Saturdays was abolished at the Prep School in 1999. +P skˈul ˌɔn sˈæTəɹdˌAz wʌz əbˈɑlɪʃt æt ðə pɹˈɛp skˈul ɪn nˌIntˈin nˈIndi nˈIn. +C skˈul ˌɔn sˈæTəɹdˌAz wʌz əbˈɑlɪʃt æt ðə pɹˈɛp skˈul ɪn nˌIntˈin nˈIndi nˈIn. +T School skˈul NN +T on ˌɔn IN +T Saturdays sˈæTəɹdˌAz NNP +T was wʌz VBD +T abolished əbˈɑlɪʃt VBN +T at æt IN +T the ðə DT +T Prep pɹˈɛp NNP +T School skˈul NNP +T in ɪn IN +T 1999 nˌIntˈin nˈIndi nˈIn CD +T . . . +S wikitext_heldout_200:28 The game's corporate sponsor is Dr Pepper. +P ðə ɡˈAmz kˈɔɹpəɹət spˈɑnsəɹ ɪz dˈɑktəɹ pˈɛpəɹ. +C ðə ɡˈAmz kˈɔɹpəɹət spˈɑnsəɹ ɪz dˈɑktəɹ pˈɛpəɹ. +T The ðə DT +T game's ɡˈAmz NN +T corporate kˈɔɹpəɹət JJ +T sponsor spˈɑnsəɹ NN +T is ɪz VBZ +T Dr dˈɑktəɹ NNP +T Pepper pˈɛpəɹ NNP +T . . . +S wikitext_heldout_200:29 Despite the new leadership in the city, there were still conservative strongholds. +P dəspˈIt ðə nˈu lˈidəɹʃˌɪp ɪn ðə sˈɪTi, ðɛɹ wɜɹ stˈɪl kənsˈɜɹvəTɪv stɹˈɔŋhˌOldz. +C dəspˈIt ðə nˈu lˈidəɹʃˌɪp ɪn ðə sˈɪTi, ðɛɹ wɜɹ stˈɪl kənsˈɜɹvəTɪv stɹˈɔŋhˌOldz. +T Despite dəspˈIt IN +T the ðə DT +T new nˈu JJ +T leadership lˈidəɹʃˌɪp NN +T in ɪn IN +T the ðə DT +T city sˈɪTi NN +T , , , +T there ðɛɹ EX +T were wɜɹ VBD +T still stˈɪl RB +T conservative kənsˈɜɹvəTɪv JJ +T strongholds stɹˈɔŋhˌOldz NNS +T . . . +S wikitext_heldout_200:30 John Wilson (1847) writes that the tomb lies about two or three hundred yards to the north of Jacob's Well, across the valley. +P ʤˈɑn wˈɪlsᵊn (ˌAtˈin fˈɔɹTi sˈɛvən) ɹˈIts ðæt ðə tˈum lˈIz əbˈWt tˈu ɔɹ θɹˈi hˈʌndɹəd jˈɑɹdz tə ðə nˈɔɹθ ʌv ʤˈAkəbz wˈɛl, əkɹˈɔs ðə vˈæli. +C ʤˈɑn wˈɪlsᵊn (ˌAtˈin fˈɔɹTi sˈɛvən) ɹˈIts ðæt ðə tˈum lˈIz əbˈWt tˈu ɔɹ θɹˈi hˈʌndɹəd jˈɑɹdz tə ðə nˈɔɹθ ʌv ʤˈAkəbz wˈɛl, əkɹˈɔs ðə vˈæli. +T John ʤˈɑn NNP +T Wilson wˈɪlsᵊn NNP +T ( ( -LRB- +T 1847 ˌAtˈin fˈɔɹTi sˈɛvən CD +T ) ) -RRB- +T writes ɹˈIts VBZ +T that ðæt IN +T the ðə DT +T tomb tˈum NN +T lies lˈIz VBZ +T about əbˈWt RB +T two tˈu CD +T or ɔɹ CC +T three θɹˈi CD +T hundred hˈʌndɹəd CD +T yards jˈɑɹdz NNS +T to tə IN +T the ðə DT +T north nˈɔɹθ NN +T of ʌv IN +T Jacob's ʤˈAkəbz NNP +T Well wˈɛl NNP +T , , , +T across əkɹˈɔs IN +T the ðə DT +T valley vˈæli NN +T . . . +S wikitext_heldout_200:31 It is, however, impossible to know exactly how the Naxians became aware of the invasion, but undoubtedly they were aware, and began to make preparations. +P ˌɪt ɪz, hWˈɛvəɹ, ɪmpˈɑsəbᵊl tə nˈO ɪɡzˈæktli hˌW ðə nˈæksiənz bəkˈAm əwˈɛɹ ʌv ði ɪnvˈAʒən, bˌʌt ˌʌndˈWTədli ðA wɜɹ əwˈɛɹ, ænd bəɡˈæn tə mˌAk pɹˌɛpəɹˈAʃənz. +C ˌɪt ɪz, hWˈɛvəɹ, ɪmpˈɑsəbᵊl tə nˈO ɪɡzˈæktli hˌW ðə nˈæksiənz bəkˈAm əwˈɛɹ ʌv ði ɪnvˈAʒən, bˌʌt ˌʌndˈWTədli ðA wɜɹ əwˈɛɹ, ænd bəɡˈæn tə mˌAk pɹˌɛpəɹˈAʃənz. +T It ˌɪt PRP +T is ɪz VBZ +T , , , +T however hWˈɛvəɹ RB +T , , , +T impossible ɪmpˈɑsəbᵊl JJ +T to tə TO +T know nˈO VB +T exactly ɪɡzˈæktli RB +T how hˌW WRB +T the ðə DT +T Naxians nˈæksiənz NNPS +T became bəkˈAm VBD +T aware əwˈɛɹ JJ +T of ʌv IN +T the ði DT +T invasion ɪnvˈAʒən NN +T , , , +T but bˌʌt CC +T undoubtedly ˌʌndˈWTədli RB +T they ðA PRP +T were wɜɹ VBD +T aware əwˈɛɹ JJ +T , , , +T and ænd CC +T began bəɡˈæn VBD +T to tə TO +T make mˌAk VB +T preparations pɹˌɛpəɹˈAʃənz NNS +T . . . +S wikitext_heldout_200:32 Similar judgments have been made by other critics when they reviewed the preceding works by Ebner, such as Wolfgang Ratz about Auf der Kippe or Julia Rafael about Lose. +P sˈɪmᵊləɹ ʤˈʌʤmənts hæv bɪn mˌAd bI ˈʌðəɹ kɹˈɪTɪks wˌɛn ðA ɹəvjˈud ðə pɹisˈidɪŋ wˈɜɹks bI ˈɛbnəɹ, sˈʌʧ æz wˈʊlfɡæŋ ɹˈæts əbˈWt ˈɔf dˈɛɹ kˈɪp ɔɹ ʤˈuljə ɹˌɑfIˈɛl əbˈWt lˈuz. +C sˈɪmᵊləɹ ʤˈʌʤmənts hæv bɪn mˌAd bI ˈʌðəɹ kɹˈɪTɪks wˌɛn ðA ɹəvjˈud ðə pɹisˈidɪŋ wˈɜɹks bI ˈɛbnəɹ, sˈʌʧ æz wˈʊlfɡæŋ ɹˈæts əbˈWt ˈɔf dˈɛɹ kˈɪp ɔɹ ʤˈuljə ɹˌɑfIˈɛl əbˈWt lˈuz. +T Similar sˈɪmᵊləɹ JJ +T judgments ʤˈʌʤmənts NNS +T have hæv VBP +T been bɪn VBN +T made mˌAd VBN +T by bI IN +T other ˈʌðəɹ JJ +T critics kɹˈɪTɪks NNS +T when wˌɛn WRB +T they ðA PRP +T reviewed ɹəvjˈud VBD +T the ðə DT +T preceding pɹisˈidɪŋ VBG +T works wˈɜɹks NNS +T by bI IN +T Ebner ˈɛbnəɹ NNP +T , , , +T such sˈʌʧ JJ +T as æz IN +T Wolfgang wˈʊlfɡæŋ NNP +T Ratz ɹˈæts NNP +T about əbˈWt IN +T Auf ˈɔf NNP +T der dˈɛɹ NN +T Kippe kˈɪp NNP +T or ɔɹ CC +T Julia ʤˈuljə NNP +T Rafael ɹˌɑfIˈɛl NNP +T about əbˈWt IN +T Lose lˈuz NNP +T . . . +S wikitext_heldout_200:33 Out in the bay, the Alta Vista Reef can be spotted from this location. +P ˈWt ɪn ðə bˈA, ði ˈɔltə vˈɪstə ɹˈif kæn bi spˈɑTᵻd fɹʌm ðɪs lOkˈAʃən. +C ˈWt ɪn ðə bˈA, ði ˈɔltə vˈɪstə ɹˈif kæn bi spˈɑTᵻd fɹʌm ðɪs lOkˈAʃən. +T Out ˈWt IN +T in ɪn IN +T the ðə DT +T bay bˈA NN +T , , , +T the ði DT +T Alta ˈɔltə NNP +T Vista vˈɪstə NNP +T Reef ɹˈif NNP +T can kæn MD +T be bi VB +T spotted spˈɑTᵻd VBN +T from fɹʌm IN +T this ðɪs DT +T location lOkˈAʃən NN +T . . . +S wikitext_heldout_200:34 The text of the Gospels is largely drawn from the Vulgate, although it also includes several passages drawn from the earlier versions of the Bible known as the Vetus Latina. +P ðə tˈɛkst ʌv ðə ɡˈɑspᵊlz ɪz lˈɑɹʤli dɹˈɔn fɹʌm ðə vˈʌlɡˌAt, ɔlðˈO ɪt ˈɔlsO ɪnklˈudz sˈɛvəɹəl pˈæsɪʤᵻz dɹˈɔn fɹʌm ði ˈɜɹliəɹ vˈɜɹʒənz ʌv ðə bˈIbᵊl nˈOn æz ðə vˈɛTəs lətˈinə. +C ðə tˈɛkst ʌv ðə ɡˈɑspᵊlz ɪz lˈɑɹʤli dɹˈɔn fɹʌm ðə vˈʌlɡˌAt, ɔlðˈO ɪt ˈɔlsO ɪnklˈudz sˈɛvəɹəl pˈæsɪʤᵻz dɹˈɔn fɹʌm ði ˈɜɹliəɹ vˈɜɹʒənz ʌv ðə bˈIbᵊl nˈOn æz ðə vˈɛTəs lətˈinə. +T The ðə DT +T text tˈɛkst NN +T of ʌv IN +T the ðə DT +T Gospels ɡˈɑspᵊlz NNPS +T is ɪz VBZ +T largely lˈɑɹʤli RB +T drawn dɹˈɔn VBN +T from fɹʌm IN +T the ðə DT +T Vulgate vˈʌlɡˌAt NNP +T , , , +T although ɔlðˈO IN +T it ɪt PRP +T also ˈɔlsO RB +T includes ɪnklˈudz VBZ +T several sˈɛvəɹəl JJ +T passages pˈæsɪʤᵻz NNS +T drawn dɹˈɔn VBN +T from fɹʌm IN +T the ði DT +T earlier ˈɜɹliəɹ JJR +T versions vˈɜɹʒənz NNS +T of ʌv IN +T the ðə DT +T Bible bˈIbᵊl NNP +T known nˈOn VBN +T as æz IN +T the ðə DT +T Vetus vˈɛTəs NNP +T Latina lətˈinə NNP +T . . . +S wikitext_heldout_200:35 The hurricane killed two people when it passed near Aruba. +P ðə hˈɜɹəkˌAn kˈɪld tˈu pˈipᵊl wˌɛn ɪt pˈæst nˌɪɹ əɹˈubə. +C ðə hˈɜɹəkˌAn kˈɪld tˈu pˈipᵊl wˌɛn ɪt pˈæst nˌɪɹ əɹˈubə. +T The ðə DT +T hurricane hˈɜɹəkˌAn NN +T killed kˈɪld VBD +T two tˈu CD +T people pˈipᵊl NNS +T when wˌɛn WRB +T it ɪt PRP +T passed pˈæst VBD +T near nˌɪɹ IN +T Aruba əɹˈubə NNP +T . . . +S wikitext_heldout_200:36 Arnold was buried at St. +P ˈɑɹnᵊld wʌz bˈɛɹid æt sənt. +C ˈɑɹnᵊld wʌz bˈɛɹid æt sənt. +T Arnold ˈɑɹnᵊld NNP +T was wʌz VBD +T buried bˈɛɹid VBN +T at æt IN +T St. sənt. NNP +S wikitext_heldout_200:37 A newspaper inquiry was published that requested " fresh blood " to the flock which had now ceased breeding. +P ɐ nˈuzpˌApəɹ ˈɪnkwˌIɹi wʌz pˈʌblɪʃt ðæt ɹəkwˈɛstᵻd “ fɹˈɛʃ blˈʌd ” tə ðə flˈɑk wˌɪʧ hæd nˈW sˈist bɹˈidɪŋ. +C ɐ nˈuzpˌApəɹ ˈɪnkwˌIɹi wʌz pˈʌblɪʃt ðæt ɹəkwˈɛstᵻd “ fɹˈɛʃ blˈʌd ” tə ðə flˈɑk wˌɪʧ hæd nˈW sˈist bɹˈidɪŋ. +T A ɐ DT +T newspaper nˈuzpˌApəɹ NN +T inquiry ˈɪnkwˌIɹi NN +T was wʌz VBD +T published pˈʌblɪʃt VBN +T that ðæt WDT +T requested ɹəkwˈɛstᵻd VBD +T " “ `` +T fresh fɹˈɛʃ JJ +T blood blˈʌd NN +T " ” '' +T to tə IN +T the ðə DT +T flock flˈɑk NN +T which wˌɪʧ WDT +T had hæd VBD +T now nˈW RB +T ceased sˈist VBN +T breeding bɹˈidɪŋ NN +T . . . +S wikitext_heldout_200:38 James Cameron has said that he " tried to make a film that would touch people's spirituality across the broad spectrum. +P ʤˈAmz kˈæməɹɹən hæz sˈɛd ðæt hi “ tɹˈId tə mˌAk ɐ fˈɪlm ðæt wʊd tˈʌʧ pˈipᵊlz spˌɪɹəʧəwˈæləTi əkɹˈɔs ðə bɹˈɔd spˈɛktɹəm. +C ʤˈAmz kˈæməɹɹən hæz sˈɛd ðæt hi “ tɹˈId tə mˌAk ɐ fˈɪlm ðæt wʊd tˈʌʧ pˈipᵊlz spˌɪɹəʧəwˈæləTi əkɹˈɔs ðə bɹˈɔd spˈɛktɹəm. +T James ʤˈAmz NNP +T Cameron kˈæməɹɹən NNP +T has hæz VBZ +T said sˈɛd VBN +T that ðæt IN +T he hi PRP +T " “ `` +T tried tɹˈId VBD +T to tə TO +T make mˌAk VB +T a ɐ DT +T film fˈɪlm NN +T that ðæt WDT +T would wʊd MD +T touch tˈʌʧ VB +T people's pˈipᵊlz NNS +T spirituality spˌɪɹəʧəwˈæləTi NN +T across əkɹˈɔs IN +T the ðə DT +T broad bɹˈɔd JJ +T spectrum spˈɛktɹəm NN +T . . . +S wikitext_heldout_200:39 Metastases often have a characteristic round appearance on chest radiograph. +P mətˈæstəsiz ˈɔfᵊn hæv ɐ kˌɛɹəktəɹˈɪstɪk ɹˈWnd əpˈɪɹəns ˌɔn ʧˈɛst ɹˈAdiəɡɹˌæf. +C mətˈæstəsiz ˈɔfᵊn hæv ɐ kˌɛɹəktəɹˈɪstɪk ɹˈWnd əpˈɪɹəns ˌɔn ʧˈɛst ɹˈAdiəɡɹˌæf. +T Metastases mətˈæstəsiz NNS +T often ˈɔfᵊn RB +T have hæv VBP +T a ɐ DT +T characteristic kˌɛɹəktəɹˈɪstɪk JJ +T round ɹˈWnd JJ +T appearance əpˈɪɹəns NN +T on ˌɔn IN +T chest ʧˈɛst NNP +T radiograph ɹˈAdiəɡɹˌæf NN +T . . . +S wikitext_heldout_200:40 Within North America, the distribution of attacks is not uniform. +P wɪðˈɪn nˈɔɹθ əmˈɛɹəkə, ðə dˌɪstɹəbjˈuʃən ʌv ətˈæks ɪz nˌɑt jˈunəfˌɔɹm. +C wɪðˈɪn nˈɔɹθ əmˈɛɹəkə, ðə dˌɪstɹəbjˈuʃən ʌv ətˈæks ɪz nˌɑt jˈunəfˌɔɹm. +T Within wɪðˈɪn IN +T North nˈɔɹθ NNP +T America əmˈɛɹəkə NNP +T , , , +T the ðə DT +T distribution dˌɪstɹəbjˈuʃən NN +T of ʌv IN +T attacks ətˈæks NNS +T is ɪz VBZ +T not nˌɑt RB +T uniform jˈunəfˌɔɹm JJ +T . . . +S wikitext_heldout_200:41 The game's commercial failure and resulting effects on Atari are frequently cited as a contributing factor to the video game industry crash of 1983. +P ðə ɡˈAmz kəmˈɜɹʃəl fˈAljəɹ ænd ɹəzˈʌltɪŋ əfˈɛkts ˌɔn ætˈɑɹɹi ɑɹ fɹˈikwəntli sˈITᵻd æz ɐ kəntɹˈɪbjuTɪŋ fˈæktəɹ tə ðə vˈɪdiO ɡˈAm ˈɪndəstɹi kɹˈæʃ ʌv nˌIntˈin ˈATi θɹˈi. +C ðə ɡˈAmz kəmˈɜɹʃəl fˈAljəɹ ænd ɹəzˈʌltɪŋ əfˈɛkts ˌɔn ætˈɑɹɹi ɑɹ fɹˈikwəntli sˈITᵻd æz ɐ kəntɹˈɪbjuTɪŋ fˈæktəɹ tə ðə vˈɪdiO ɡˈAm ˈɪndəstɹi kɹˈæʃ ʌv nˌIntˈin ˈATi θɹˈi. +T The ðə DT +T game's ɡˈAmz NN +T commercial kəmˈɜɹʃəl JJ +T failure fˈAljəɹ NN +T and ænd CC +T resulting ɹəzˈʌltɪŋ VBG +T effects əfˈɛkts NNS +T on ˌɔn IN +T Atari ætˈɑɹɹi NNP +T are ɑɹ VBP +T frequently fɹˈikwəntli RB +T cited sˈITᵻd VBN +T as æz IN +T a ɐ DT +T contributing kəntɹˈɪbjuTɪŋ VBG +T factor fˈæktəɹ NN +T to tə IN +T the ðə DT +T video vˈɪdiO NN +T game ɡˈAm NN +T industry ˈɪndəstɹi NN +T crash kɹˈæʃ NN +T of ʌv IN +T 1983 nˌIntˈin ˈATi θɹˈi CD +T . . . +S wikitext_heldout_200:42 The first commercially viable process for producing liquid oxygen was independently developed in 1895 by German engineer Carl von Linde and British engineer William Hampson. +P ðə fˈɜɹst kəmˈɜɹʃəli vˈIəbᵊl pɹˈɑsˌɛs fɔɹ pɹədˈusɪŋ lˈɪkwəd ˈɑksəʤᵊn wʌz ˌɪndəpˈɛndəntli dəvˈɛləpt ɪn ˌAtˈin nˈIndi fˈIv bI ʤˈɜɹmən ˌɛnʤənˈɪɹ kˈɑɹl vˈɑn lˈɪnd ænd bɹˈɪTɪʃ ˌɛnʤənˈɪɹ wˈɪljəm hˈæmpsən. +C ðə fˈɜɹst kəmˈɜɹʃəli vˈIəbᵊl pɹˈɑsˌɛs fɔɹ pɹədˈusɪŋ lˈɪkwəd ˈɑksəʤᵊn wʌz ˌɪndəpˈɛndəntli dəvˈɛləpt ɪn ˌAtˈin nˈIndi fˈIv bI ʤˈɜɹmən ˌɛnʤənˈɪɹ kˈɑɹl vˈɑn lˈɪnd ænd bɹˈɪTɪʃ ˌɛnʤənˈɪɹ wˈɪljəm hˈæmpsən. +T The ðə DT +T first fˈɜɹst JJ +T commercially kəmˈɜɹʃəli RB +T viable vˈIəbᵊl JJ +T process pɹˈɑsˌɛs NN +T for fɔɹ IN +T producing pɹədˈusɪŋ VBG +T liquid lˈɪkwəd JJ +T oxygen ˈɑksəʤᵊn NN +T was wʌz VBD +T independently ˌɪndəpˈɛndəntli RB +T developed dəvˈɛləpt VBN +T in ɪn IN +T 1895 ˌAtˈin nˈIndi fˈIv CD +T by bI IN +T German ʤˈɜɹmən JJ +T engineer ˌɛnʤənˈɪɹ NN +T Carl kˈɑɹl NNP +T von vˈɑn NNP +T Linde lˈɪnd NNP +T and ænd CC +T British bɹˈɪTɪʃ JJ +T engineer ˌɛnʤənˈɪɹ NN +T William wˈɪljəm NNP +T Hampson hˈæmpsən NNP +T . . . +S wikitext_heldout_200:43 The gray allotrope of selenium is made from spirals on selenium atoms, while one of the red allotropes is made of stacks of selenium rings (Se8). +P ðə ɡɹˈA ˈælətɹˌOp ʌv səlˈiniəm ɪz mˌAd fɹʌm spˈIɹəlz ˌɔn səlˈiniəm ˈæTəmz, wˌIl wˈʌn ʌv ðə ɹˈɛd ˈælətɹˌOps ɪz mˌAd ʌv stˈæks ʌv səlˈiniəm ɹˈɪŋz (sˈi ˈAt). +C ðə ɡɹˈA ˈælətɹˌOp ʌv səlˈiniəm ɪz mˌAd fɹʌm spˈIɹəlz ˌɔn səlˈiniəm ˈæTəmz, wˌIl wˈʌn ʌv ðə ɹˈɛd ˈælətɹˌOps ɪz mˌAd ʌv stˈæks ʌv səlˈiniəm ɹˈɪŋz (sˈi ˈAt). +T The ðə DT +T gray ɡɹˈA JJ +T allotrope ˈælətɹˌOp NN +T of ʌv IN +T selenium səlˈiniəm NN +T is ɪz VBZ +T made mˌAd VBN +T from fɹʌm IN +T spirals spˈIɹəlz NNS +T on ˌɔn IN +T selenium səlˈiniəm NN +T atoms ˈæTəmz NNS +T , , , +T while wˌIl IN +T one wˈʌn CD +T of ʌv IN +T the ðə DT +T red ɹˈɛd JJ +T allotropes ˈælətɹˌOps NNS +T is ɪz VBZ +T made mˌAd VBN +T of ʌv IN +T stacks stˈæks NNS +T of ʌv IN +T selenium səlˈiniəm NN +T rings ɹˈɪŋz NNS +T ( ( -LRB- +T Se8 sˈi ˈAt NNP +T ) ) -RRB- +T . . . +S wikitext_heldout_200:44 Xenoceratops - (Alberta, Canada) +P zˈɛnOsəɹɹˌætɑps (ælbˈɜɹTə, kˈænədə) +C zˈɛnOsəɹɹˌætɑps (ælbˈɜɹTə, kˈænədə) +T Xenoceratops zˈɛnOsəɹɹˌætɑps NNP +T - . +T ( ( -LRB- +T Alberta ælbˈɜɹTə NNP +T , , , +T Canada kˈænədə NNP +T ) ) -RRB- +S wikitext_heldout_200:45 The name " Missoula " came from the Salish name for the Clark Fork River, " nmesuletkw ", which roughly translates as " place of frozen water ". +P ðə nˈAm “ məzˈulə ” kˈAm fɹʌm ðə sˈAlɪʃ nˈAm fɔɹ ðə klˈɑɹk fˈɔɹk ɹˈɪvəɹ, ” ˈɛnmˈɛsulˌɛtkwə “, wˌɪʧ ɹˈʌfli tɹænzlˈAts æz “ plˈAs ʌv fɹˈOzən wˈɔTəɹ ”. +C ðə nˈAm “ məzˈulə ” kˈAm fɹʌm ðə sˈAlɪʃ nˈAm fɔɹ ðə klˈɑɹk fˈɔɹk ɹˈɪvəɹ, ” ˈɛnmˈɛsulˌɛtkwə “, wˌɪʧ ɹˈʌfli tɹænzlˈAts æz “ plˈAs ʌv fɹˈOzən wˈɔTəɹ ”. +T The ðə DT +T name nˈAm NN +T " “ `` +T Missoula məzˈulə NNP +T " ” '' +T came kˈAm VBD +T from fɹʌm IN +T the ðə DT +T Salish sˈAlɪʃ JJ +T name nˈAm NN +T for fɔɹ IN +T the ðə DT +T Clark klˈɑɹk NNP +T Fork fˈɔɹk NNP +T River ɹˈɪvəɹ NNP +T , , , +T " ” '' +T nmesuletkw ˈɛnmˈɛsulˌɛtkwə JJ +T " “ `` +T , , , +T which wˌɪʧ WDT +T roughly ɹˈʌfli RB +T translates tɹænzlˈAts VBZ +T as æz IN +T " “ `` +T place plˈAs NN +T of ʌv IN +T frozen fɹˈOzən JJ +T water wˈɔTəɹ NN +T " ” '' +T . . . +S wikitext_heldout_200:46 He gets all the credit for it! +P hˌi ɡɛts ˈɔl ðə kɹˈɛdət fɔɹ ɪt! +C hˌi ɡɛts ˈɔl ðə kɹˈɛdət fɔɹ ɪt! +T He hˌi PRP +T gets ɡɛts VBZ +T all ˈɔl PDT +T the ðə DT +T credit kɹˈɛdət NN +T for fɔɹ IN +T it ɪt PRP +T ! ! . +S wikitext_heldout_200:47 On May 19, 2011, West joined the Golden State Warriors as an executive board member, reporting directly to new owners Joe Lacob and Peter Guber. +P ˌɔn mˈA nˌIntˈin, twˈɛnti əlˈɛvᵊn, wˈɛst ʤˈYnd ðə ɡˈOldən stˈAt wˈɔɹiəɹz æz ɐn ɪɡzˈɛkjəTɪv bˈɔɹd mˈɛmbəɹ, ɹᵻpˈɔɹTɪŋ dəɹˈɛktli tə nˈu ˈOnəɹz ʤˈO lˈækɑb ænd pˈiTəɹ ɡˈubəɹ. +C ˌɔn mˈA nˌIntˈin, twˈɛnti əlˈɛvᵊn, wˈɛst ʤˈYnd ðə ɡˈOldən stˈAt wˈɔɹiəɹz æz ɐn ɪɡzˈɛkjəTɪv bˈɔɹd mˈɛmbəɹ, ɹᵻpˈɔɹTɪŋ dəɹˈɛktli tə nˈu ˈOnəɹz ʤˈO lˈækɑb ænd pˈiTəɹ ɡˈubəɹ. +T On ˌɔn IN +T May mˈA NNP +T 19 nˌIntˈin CD +T , , , +T 2011 twˈɛnti əlˈɛvᵊn CD +T , , , +T West wˈɛst NNP +T joined ʤˈYnd VBD +T the ðə DT +T Golden ɡˈOldən NNP +T State stˈAt NNP +T Warriors wˈɔɹiəɹz NNPS +T as æz IN +T an ɐn DT +T executive ɪɡzˈɛkjəTɪv JJ +T board bˈɔɹd NN +T member mˈɛmbəɹ NN +T , , , +T reporting ɹᵻpˈɔɹTɪŋ VBG +T directly dəɹˈɛktli RB +T to tə IN +T new nˈu JJ +T owners ˈOnəɹz NNS +T Joe ʤˈO NNP +T Lacob lˈækɑb NNP +T and ænd CC +T Peter pˈiTəɹ NNP +T Guber ɡˈubəɹ NNP +T . . . +S wikitext_heldout_200:48 Themes of the boards include dreams of toys and treasure hunting, among others. +P θˈimz ʌv ðə bˈɔɹdz ɪnklˈud dɹˈimz ʌv tˈYz ænd tɹˈɛʒəɹ hˈʌntɪŋ, əmˈʌŋ ˈʌðəɹz. +C θˈimz ʌv ðə bˈɔɹdz ɪnklˈud dɹˈimz ʌv tˈYz ænd tɹˈɛʒəɹ hˈʌntɪŋ, əmˈʌŋ ˈʌðəɹz. +T Themes θˈimz NNS +T of ʌv IN +T the ðə DT +T boards bˈɔɹdz NNS +T include ɪnklˈud VBP +T dreams dɹˈimz NNS +T of ʌv IN +T toys tˈYz NNS +T and ænd CC +T treasure tɹˈɛʒəɹ NN +T hunting hˈʌntɪŋ NN +T , , , +T among əmˈʌŋ IN +T others ˈʌðəɹz NNS +T . . . +S wikitext_heldout_200:49 In one rare instance, a female wood turtle hybridized with a male Blanding's turtle. +P ɪn wˈʌn ɹˈɛɹ ˈɪnstᵊns, ɐ fˈimˌAl wˈʊd tˈɜɹTᵊl hˈIbɹədˌIzd wɪð ɐ mˈAl blˈændɪŋs tˈɜɹTᵊl. +C ɪn wˈʌn ɹˈɛɹ ˈɪnstᵊns, ɐ fˈimˌAl wˈʊd tˈɜɹTᵊl hˈIbɹədˌIzd wɪð ɐ mˈAl blˈændɪŋs tˈɜɹTᵊl. +T In ɪn IN +T one wˈʌn CD +T rare ɹˈɛɹ JJ +T instance ˈɪnstᵊns NN +T , , , +T a ɐ DT +T female fˈimˌAl JJ +T wood wˈʊd NN +T turtle tˈɜɹTᵊl NN +T hybridized hˈIbɹədˌIzd VBN +T with wɪð IN +T a ɐ DT +T male mˈAl JJ +T Blanding's blˈændɪŋs NNP +T turtle tˈɜɹTᵊl NN +T . . . +S wikitext_heldout_200:50 On 3 July 2012, US Secretary of State Hillary Clinton officially, however briefly, apologized for the losses suffered by the Pakistani military. +P ˌɔn θɹˈi ʤəlˈI twˈɛnti twˈɛlv, jˌuˈɛs sˈɛkɹətˌɛɹi ʌv stˈAt hˈɪləɹi klˈɪntᵊn əfˈɪʃəli, hWˈɛvəɹ bɹˈifli, əpˈɑləʤˌIzd fɔɹ ðə lˈɔsᵻz sˈʌfəɹd bI ðə pˌækəstˈæni mˈɪlətˌɛɹi. +C ˌɔn θɹˈi ʤəlˈI twˈɛnti twˈɛlv, jˌuˈɛs sˈɛkɹətˌɛɹi ʌv stˈAt hˈɪləɹi klˈɪntᵊn əfˈɪʃəli, hWˈɛvəɹ bɹˈifli, əpˈɑləʤˌIzd fɔɹ ðə lˈɔsᵻz sˈʌfəɹd bI ðə pˌækəstˈæni mˈɪlətˌɛɹi. +T On ˌɔn IN +T 3 θɹˈi CD +T July ʤəlˈI NNP +T 2012 twˈɛnti twˈɛlv CD +T , , , +T US jˌuˈɛs NNP +T Secretary sˈɛkɹətˌɛɹi NNP +T of ʌv IN +T State stˈAt NNP +T Hillary hˈɪləɹi NNP +T Clinton klˈɪntᵊn NNP +T officially əfˈɪʃəli RB +T , , , +T however hWˈɛvəɹ RB +T briefly bɹˈifli RB +T , , , +T apologized əpˈɑləʤˌIzd VBD +T for fɔɹ IN +T the ðə DT +T losses lˈɔsᵻz NNS +T suffered sˈʌfəɹd VBN +T by bI IN +T the ðə DT +T Pakistani pˌækəstˈæni JJ +T military mˈɪlətˌɛɹi NN +T . . . +S wikitext_heldout_200:51 At Chenonceau, she added waterfalls, menageries, and aviaries, laid out three parks, and planted mulberry trees for silkworms. +P ˌæt ʧˈɛnənsˌO, ʃi ˈædᵻd wˈɔTəɹfˌɔlz, mənˈæʤəɹiz, ænd ˈAviˌɛɹiz, lˈAd ˈWt θɹˈi pˈɑɹks, ænd plˈæntᵻd mˈʌlbˌɛɹi tɹˈiz fɔɹ sˈɪlkwˌɜɹmz. +C ˌæt ʧˈɛnənsˌO, ʃi ˈædᵻd wˈɔTəɹfˌɔlz, mənˈæʤəɹiz, ænd ˈAviˌɛɹiz, lˈAd ˈWt θɹˈi pˈɑɹks, ænd plˈæntᵻd mˈʌlbˌɛɹi tɹˈiz fɔɹ sˈɪlkwˌɜɹmz. +T At ˌæt IN +T Chenonceau ʧˈɛnənsˌO NNP +T , , , +T she ʃi PRP +T added ˈædᵻd VBD +T waterfalls wˈɔTəɹfˌɔlz NNS +T , , , +T menageries mənˈæʤəɹiz NNS +T , , , +T and ænd CC +T aviaries ˈAviˌɛɹiz NNS +T , , , +T laid lˈAd VBD +T out ˈWt RP +T three θɹˈi CD +T parks pˈɑɹks NNS +T , , , +T and ænd CC +T planted plˈæntᵻd VBD +T mulberry mˈʌlbˌɛɹi NN +T trees tɹˈiz NNS +T for fɔɹ IN +T silkworms sˈɪlkwˌɜɹmz NNS +T . . . +S wikitext_heldout_200:52 This town hall stood on " pillars and arches of hewen stone " and under it was the exchange for merchants and traders to carry out their business. +P ðˌɪs tˈWn hˈɔl stˈʊd ˌɔn “ pˈɪləɹz ænd ˈɑɹʧᵻz ʌv hjˈuən stˈOn ” ænd ˈʌndəɹ ɪt wʌz ði ɪksʧˈAnʤ fɔɹ mˈɜɹʧənts ænd tɹˈAdəɹz tə kˈɛɹi ˈWt ðɛɹ bˈɪznəs. +C ðˌɪs tˈWn hˈɔl stˈʊd ˌɔn “ pˈɪləɹz ænd ˈɑɹʧᵻz ʌv hjˈuən stˈOn ” ænd ˈʌndəɹ ɪt wʌz ði ɪksʧˈAnʤ fɔɹ mˈɜɹʧənts ænd tɹˈAdəɹz tə kˈɛɹi ˈWt ðɛɹ bˈɪznəs. +T This ðˌɪs DT +T town tˈWn NN +T hall hˈɔl NN +T stood stˈʊd VBD +T on ˌɔn IN +T " “ `` +T pillars pˈɪləɹz NNS +T and ænd CC +T arches ˈɑɹʧᵻz NNS +T of ʌv IN +T hewen hjˈuən JJ +T stone stˈOn NN +T " ” '' +T and ænd CC +T under ˈʌndəɹ IN +T it ɪt PRP +T was wʌz VBD +T the ði DT +T exchange ɪksʧˈAnʤ NN +T for fɔɹ IN +T merchants mˈɜɹʧənts NNS +T and ænd CC +T traders tɹˈAdəɹz NNS +T to tə TO +T carry kˈɛɹi VB +T out ˈWt RP +T their ðɛɹ PRP$ +T business bˈɪznəs NN +T . . . +S wikitext_heldout_200:53 Retrieved 4 March 2016. +P ɹətɹˈivd fˈɔɹ mˈɑɹʧ twˈɛnti sˌɪkstˈin. +C ɹətɹˈivd fˈɔɹ mˈɑɹʧ twˈɛnti sˌɪkstˈin. +T Retrieved ɹətɹˈivd VBD +T 4 fˈɔɹ CD +T March mˈɑɹʧ NNP +T 2016 twˈɛnti sˌɪkstˈin CD +T . . . +S wikitext_heldout_200:54 John then gives Sam and Dean a loving smile before becoming engulfed in a white light. +P ʤˈɑn ðˈɛn ɡˈɪvz sˈæm ænd dˈin ɐ lˈʌvɪŋ smˈIl bəfˈɔɹ bəkˈʌmɪŋ ɪnɡˈʌlft ɪn ɐ wˈIt lˈIt. +C ʤˈɑn ðˈɛn ɡˈɪvz sˈæm ænd dˈin ɐ lˈʌvɪŋ smˈIl bəfˈɔɹ bəkˈʌmɪŋ ɪnɡˈʌlft ɪn ɐ wˈIt lˈIt. +T John ʤˈɑn NNP +T then ðˈɛn RB +T gives ɡˈɪvz VBZ +T Sam sˈæm NNP +T and ænd CC +T Dean dˈin NNP +T a ɐ DT +T loving lˈʌvɪŋ VBG +T smile smˈIl NN +T before bəfˈɔɹ IN +T becoming bəkˈʌmɪŋ VBG +T engulfed ɪnɡˈʌlft VBN +T in ɪn IN +T a ɐ DT +T white wˈIt JJ +T light lˈIt NN +T . . . +S wikitext_heldout_200:55 Subsequently, he went to the United Kingdom to study, majoring in sculpture. +P sˈʌbsəkwəntli, hi wˈɛnt tə ðə junˈITᵻd kˈɪŋdəm tə stˈʌdi, mˈAʤəɹɪŋ ɪn skˈʌlpʧəɹ. +C sˈʌbsəkwəntli, hi wˈɛnt tə ðə junˈITᵻd kˈɪŋdəm tə stˈʌdi, mˈAʤəɹɪŋ ɪn skˈʌlpʧəɹ. +T Subsequently sˈʌbsəkwəntli RB +T , , , +T he hi PRP +T went wˈɛnt VBD +T to tə IN +T the ðə DT +T United junˈITᵻd NNP +T Kingdom kˈɪŋdəm NNP +T to tə TO +T study stˈʌdi VB +T , , , +T majoring mˈAʤəɹɪŋ VBG +T in ɪn IN +T sculpture skˈʌlpʧəɹ NN +T . . . +S wikitext_heldout_200:56 Charles Babbage, the Victorian mathematician and computer pioneer, was probably born at 44 Crosby Row, now Larcom Street, Walworth Road on 26 December 1791. +P ʧˈɑɹlz bˈæbɪʤ, ðə vɪktˈɔɹiən mˌæθᵊmətˈɪʃən ænd kəmpjˈuTəɹ pˌIənˈɪɹ, wʌz pɹˈɑbəbli bˈɔɹn æt fˈɔɹTi fˈɔɹ kɹˈɑsbi ɹˈO, nˈW lˈɑɹkɑm stɹˈit, wˈɔlwɜɹθ ɹˈOd ˌɔn twˈɛnti sˈɪks disˈɛmbəɹ sˌɛvəntˈin nˈIndi wˈʌn. +C ʧˈɑɹlz bˈæbɪʤ, ðə vɪktˈɔɹiən mˌæθᵊmətˈɪʃən ænd kəmpjˈuTəɹ pˌIənˈɪɹ, wʌz pɹˈɑbəbli bˈɔɹn æt fˈɔɹTi fˈɔɹ kɹˈɑsbi ɹˈO, nˈW lˈɑɹkɑm stɹˈit, wˈɔlwɜɹθ ɹˈOd ˌɔn twˈɛnti sˈɪks disˈɛmbəɹ sˌɛvəntˈin nˈIndi wˈʌn. +T Charles ʧˈɑɹlz NNP +T Babbage bˈæbɪʤ NNP +T , , , +T the ðə DT +T Victorian vɪktˈɔɹiən JJ +T mathematician mˌæθᵊmətˈɪʃən NN +T and ænd CC +T computer kəmpjˈuTəɹ NN +T pioneer pˌIənˈɪɹ NN +T , , , +T was wʌz VBD +T probably pɹˈɑbəbli RB +T born bˈɔɹn VBN +T at æt IN +T 44 fˈɔɹTi fˈɔɹ CD +T Crosby kɹˈɑsbi NNP +T Row ɹˈO NN +T , , , +T now nˈW RB +T Larcom lˈɑɹkɑm NNP +T Street stɹˈit NNP +T , , , +T Walworth wˈɔlwɜɹθ NNP +T Road ɹˈOd NNP +T on ˌɔn IN +T 26 twˈɛnti sˈɪks CD +T December disˈɛmbəɹ NNP +T 1791 sˌɛvəntˈin nˈIndi wˈʌn CD +T . . . +S wikitext_heldout_200:57 They were elected to the Western League in 1973 but were relegated three years later in 1976. +P ðˌA wɜɹ əlˈɛktᵻd tə ðə wˈɛstəɹn lˈiɡ ɪn nˌIntˈin sˈɛvənti θɹˈi bˌʌt wɜɹ ɹˈɛləɡˌATᵻd θɹˈi jˈɪɹz lˈATəɹ ɪn nˌIntˈin sˈɛvənti sˈɪks. +C ðˌA wɜɹ əlˈɛktᵻd tə ðə wˈɛstəɹn lˈiɡ ɪn nˌIntˈin sˈɛvənti θɹˈi bˌʌt wɜɹ ɹˈɛləɡˌATᵻd θɹˈi jˈɪɹz lˈATəɹ ɪn nˌIntˈin sˈɛvənti sˈɪks. +T They ðˌA PRP +T were wɜɹ VBD +T elected əlˈɛktᵻd VBN +T to tə IN +T the ðə DT +T Western wˈɛstəɹn NNP +T League lˈiɡ NNP +T in ɪn IN +T 1973 nˌIntˈin sˈɛvənti θɹˈi CD +T but bˌʌt CC +T were wɜɹ VBD +T relegated ɹˈɛləɡˌATᵻd VBN +T three θɹˈi CD +T years jˈɪɹz NNS +T later lˈATəɹ RB +T in ɪn IN +T 1976 nˌIntˈin sˈɛvənti sˈɪks CD +T . . . +S wikitext_heldout_200:58 At the confluence of the Mersey and Irwell near Irlam, the canal follows the old course of the River Irwell into Manchester. +P ˌæt ðə kˈɑnfləwəns ʌv ðə mˈɜɹzi ænd ˈɜɹwɛl nˌɪɹ ˈɜɹlæm, ðə kənˈæl fˈɑlOz ði ˈOld kˈɔɹs ʌv ðə ɹˈɪvəɹ ˈɜɹwɛl ˈɪntu mˈænʧəstəɹ. +C ˌæt ðə kˈɑnfləwəns ʌv ðə mˈɜɹzi ænd ˈɜɹwɛl nˌɪɹ ˈɜɹlæm, ðə kənˈæl fˈɑlOz ði ˈOld kˈɔɹs ʌv ðə ɹˈɪvəɹ ˈɜɹwɛl ˈɪntu mˈænʧəstəɹ. +T At ˌæt IN +T the ðə DT +T confluence kˈɑnfləwəns NN +T of ʌv IN +T the ðə DT +T Mersey mˈɜɹzi NNP +T and ænd CC +T Irwell ˈɜɹwɛl NNP +T near nˌɪɹ IN +T Irlam ˈɜɹlæm NNP +T , , , +T the ðə DT +T canal kənˈæl NN +T follows fˈɑlOz VBZ +T the ði DT +T old ˈOld JJ +T course kˈɔɹs NN +T of ʌv IN +T the ðə DT +T River ɹˈɪvəɹ NNP +T Irwell ˈɜɹwɛl NNP +T into ˈɪntu IN +T Manchester mˈænʧəstəɹ NNP +T . . . +S wikitext_heldout_200:59 The Japanese naval forces lingered near the northern Solomons, out of range of the U.S. +P ðə ʤˌæpənˈiz nˈAvᵊl fˈɔɹsᵻz lˈɪŋɡəɹd nˌɪɹ ðə nˈɔɹðəɹn sˈɑləmənz, ˈWt ʌv ɹˈAnʤ ʌv ðə jˌuˈɛs +C ðə ʤˌæpənˈiz nˈAvᵊl fˈɔɹsᵻz lˈɪŋɡəɹd nˌɪɹ ðə nˈɔɹðəɹn sˈɑləmənz, ˈWt ʌv ɹˈAnʤ ʌv ðə jˌuˈɛs +T The ðə DT +T Japanese ʤˌæpənˈiz JJ +T naval nˈAvᵊl JJ +T forces fˈɔɹsᵻz NNS +T lingered lˈɪŋɡəɹd VBD +T near nˌɪɹ IN +T the ðə DT +T northern nˈɔɹðəɹn JJ +T Solomons sˈɑləmənz NNPS +T , , , +T out ˈWt IN +T of ʌv IN +T range ɹˈAnʤ NN +T of ʌv IN +T the ðə DT +T U.S. jˌuˈɛs NNP +S wikitext_heldout_200:60 Soring is an act of animal cruelty that gives practitioners an unfair advantage over other competitors. +P sˈɔɹɪŋ ɪz ɐn ˈækt ʌv ˈænəmᵊl kɹˈuᵊlti ðæt ɡˈɪvz pɹˌæktˈɪʃᵊnəɹz ɐn ˌʌnfˈɛɹ ədvˈæntɪʤ ˈOvəɹ ˈʌðəɹ kəmpˈɛTəTəɹz. +C sˈɔɹɪŋ ɪz ɐn ˈækt ʌv ˈænəmᵊl kɹˈuᵊlti ðæt ɡˈɪvz pɹˌæktˈɪʃᵊnəɹz ɐn ˌʌnfˈɛɹ ədvˈæntɪʤ ˈOvəɹ ˈʌðəɹ kəmpˈɛTəTəɹz. +T Soring sˈɔɹɪŋ NN +T is ɪz VBZ +T an ɐn DT +T act ˈækt NN +T of ʌv IN +T animal ˈænəmᵊl NN +T cruelty kɹˈuᵊlti NN +T that ðæt WDT +T gives ɡˈɪvz VBZ +T practitioners pɹˌæktˈɪʃᵊnəɹz NNS +T an ɐn DT +T unfair ˌʌnfˈɛɹ JJ +T advantage ədvˈæntɪʤ NN +T over ˈOvəɹ IN +T other ˈʌðəɹ JJ +T competitors kəmpˈɛTəTəɹz NNS +T . . . +S wikitext_heldout_200:61 The executives enjoyed the story: Michael Roberts, a senior executive, called the episode's plot " great " and noted that " the conceit is really cool ". +P ði ɪɡzˈɛkjəTɪvz ɪnʤˈYd ðə stˈɔɹi: mˈIkᵊl ɹˈɑbəɹts, ɐ sˈinjəɹ ɪɡzˈɛkjəTɪv, kˈɔld ði ˈɛpəsˌOdz plˈɑt “ ɡɹˈAt ” ænd nˈOTᵻd ðæt “ ðə kənsˈit ɪz ɹˈiᵊli kˈul ”. +C ði ɪɡzˈɛkjəTɪvz ɪnʤˈYd ðə stˈɔɹi: mˈIkᵊl ɹˈɑbəɹts, ɐ sˈinjəɹ ɪɡzˈɛkjəTɪv, kˈɔld ði ˈɛpəsˌOdz plˈɑt “ ɡɹˈAt ” ænd nˈOTᵻd ðæt “ ðə kənsˈit ɪz ɹˈiᵊli kˈul ”. +T The ði DT +T executives ɪɡzˈɛkjəTɪvz NNS +T enjoyed ɪnʤˈYd VBD +T the ðə DT +T story stˈɔɹi NN +T : : : +T Michael mˈIkᵊl NNP +T Roberts ɹˈɑbəɹts NNP +T , , , +T a ɐ DT +T senior sˈinjəɹ JJ +T executive ɪɡzˈɛkjəTɪv NN +T , , , +T called kˈɔld VBD +T the ði DT +T episode's ˈɛpəsˌOdz NN +T plot plˈɑt NN +T " “ `` +T great ɡɹˈAt JJ +T " ” '' +T and ænd CC +T noted nˈOTᵻd VBD +T that ðæt IN +T " “ `` +T the ðə DT +T conceit kənsˈit NN +T is ɪz VBZ +T really ɹˈiᵊli RB +T cool kˈul JJ +T " ” '' +T . . . +S wikitext_heldout_200:62 Melee is a crossover action game developed by HAL Laboratory and published by Nintendo for the GameCube video game console. +P mˈAlA ɪz ɐ kɹˈɔsˌOvəɹ ˈækʃən ɡˈAm dəvˈɛləpt bI ˌAʧˌAˈɛl lˈæbɹətˌɔɹi ænd pˈʌblɪʃt bI nɪntˈɛndO fɔɹ ðə ɡˌAmkjˈub vˈɪdiO ɡˈAm kˈɑnsˌOl. +C mˈAlA ɪz ɐ kɹˈɔsˌOvəɹ ˈækʃən ɡˈAm dəvˈɛləpt bI ˌAʧˌAˈɛl lˈæbɹətˌɔɹi ænd pˈʌblɪʃt bI nɪntˈɛndO fɔɹ ðə ɡˌAmkjˈub vˈɪdiO ɡˈAm kˈɑnsˌOl. +T Melee mˈAlA NNP +T is ɪz VBZ +T a ɐ DT +T crossover kɹˈɔsˌOvəɹ JJ +T action ˈækʃən NN +T game ɡˈAm NN +T developed dəvˈɛləpt VBN +T by bI IN +T HAL ˌAʧˌAˈɛl NNP +T Laboratory lˈæbɹətˌɔɹi NNP +T and ænd CC +T published pˈʌblɪʃt VBN +T by bI IN +T Nintendo nɪntˈɛndO NNP +T for fɔɹ IN +T the ðə DT +T GameCube ɡˌAmkjˈub NNP +T video vˈɪdiO NN +T game ɡˈAm NN +T console kˈɑnsˌOl NN +T . . . +S wikitext_heldout_200:63 Godwin himself did not seem particularly ready for parenthood and he now had two small children to raise and no steady source of income. +P ɡˈɑdwɪn hɪmsˈɛlf dˈɪd nˌɑt sˈim pəɹtˈɪkjələɹli ɹˈɛdi fɔɹ pˈɛɹənthˌʊd ænd hi nˈW hæd tˈu smˈɔl ʧˈɪldɹᵊn tə ɹˈAz ænd nˈO stˈɛdi sˈɔɹs ʌv ˈɪnkˌʌm. +C ɡˈɑdwɪn hɪmsˈɛlf dˈɪd nˌɑt sˈim pəɹtˈɪkjələɹli ɹˈɛdi fɔɹ pˈɛɹənthˌʊd ænd hi nˈW hæd tˈu smˈɔl ʧˈɪldɹᵊn tə ɹˈAz ænd nˈO stˈɛdi sˈɔɹs ʌv ˈɪnkˌʌm. +T Godwin ɡˈɑdwɪn NNP +T himself hɪmsˈɛlf PRP +T did dˈɪd VBD +T not nˌɑt RB +T seem sˈim VB +T particularly pəɹtˈɪkjələɹli RB +T ready ɹˈɛdi JJ +T for fɔɹ IN +T parenthood pˈɛɹənthˌʊd NN +T and ænd CC +T he hi PRP +T now nˈW RB +T had hæd VBD +T two tˈu CD +T small smˈɔl JJ +T children ʧˈɪldɹᵊn NNS +T to tə TO +T raise ɹˈAz VB +T and ænd CC +T no nˈO DT +T steady stˈɛdi JJ +T source sˈɔɹs NN +T of ʌv IN +T income ˈɪnkˌʌm NN +T . . . +S wikitext_heldout_200:64 Given the planet's high mass, the planet is a gas giant with no solid surface. +P ɡˈɪvən ðə plˈænəts hˈI mˈæs, ðə plˈænət ɪz ɐ ɡˈæs ʤˈIənt wɪð nˈO sˈɑləd sˈɜɹfəs. +C ɡˈɪvən ðə plˈænəts hˈI mˈæs, ðə plˈænət ɪz ɐ ɡˈæs ʤˈIənt wɪð nˈO sˈɑləd sˈɜɹfəs. +T Given ɡˈɪvən VBN +T the ðə DT +T planet's plˈænəts NN +T high hˈI JJ +T mass mˈæs NN +T , , , +T the ðə DT +T planet plˈænət NN +T is ɪz VBZ +T a ɐ DT +T gas ɡˈæs NN +T giant ʤˈIənt NN +T with wɪð IN +T no nˈO DT +T solid sˈɑləd JJ +T surface sˈɜɹfəs NN +T . . . +S wikitext_heldout_200:65 The Virgin Islands experienced heavy damage, as well. +P ðə vˈɜɹʤən ˈIləndz ɪkspˈɪɹiənst hˈɛvi dˈæmɪʤ, æz wˈɛl. +C ðə vˈɜɹʤən ˈIləndz ɪkspˈɪɹiənst hˈɛvi dˈæmɪʤ, æz wˈɛl. +T The ðə DT +T Virgin vˈɜɹʤən NNP +T Islands ˈIləndz NNP +T experienced ɪkspˈɪɹiənst VBD +T heavy hˈɛvi JJ +T damage dˈæmɪʤ NN +T , , , +T as æz RB +T well wˈɛl RB +T . . . +S wikitext_heldout_200:66 Shoji's 1st Battalion, 230th Infantry Regiment " stumbled " into Puller's lines about 22: 00 and were driven off by Puller's men. +P ʃˈOʤiz fˈɜɹst bətˈæljən, tˈu hˈʌndɹəd θˈɜɹTiəθ ˈɪnfəntɹi ɹˈɛʤəmᵊnt ” stˈʌmbᵊld ” ˈɪntu pˈʊləɹz lˈInz əbˈWt twˈɛnti tˈu: zˈɪɹO ænd wɜɹ dɹˈɪvən ˈɔf bI pˈʊləɹz mˈɛn. +C ʃˈOʤiz fˈɜɹst bətˈæljən, tˈu hˈʌndɹəd θˈɜɹTiəθ ˈɪnfəntɹi ɹˈɛʤəmᵊnt ” stˈʌmbᵊld ” ˈɪntu pˈʊləɹz lˈInz əbˈWt twˈɛnti tˈu: zˈɪɹO ænd wɜɹ dɹˈɪvən ˈɔf bI pˈʊləɹz mˈɛn. +T Shoji's ʃˈOʤiz NNP +T 1st fˈɜɹst NNP +T Battalion bətˈæljən NNP +T , , , +T 230th tˈu hˈʌndɹəd θˈɜɹTiəθ JJ +T Infantry ˈɪnfəntɹi NNP +T Regiment ɹˈɛʤəmᵊnt NNP +T " ” '' +T stumbled stˈʌmbᵊld VBD +T " ” '' +T into ˈɪntu IN +T Puller's pˈʊləɹz NNP +T lines lˈInz NNS +T about əbˈWt RB +T 22: twˈɛnti tˈu: CD +T 00 zˈɪɹO CD +T and ænd CC +T were wɜɹ VBD +T driven dɹˈɪvən VBN +T off ˈɔf RP +T by bI IN +T Puller's pˈʊləɹz NNP +T men mˈɛn NNS +T . . . +S wikitext_heldout_200:67 Then he becomes a complex individual with fears and desires. +P ðˈɛn hi bəkˈʌmz ɐ kˈɑmplˌɛks ˌɪndəvˈɪʤəwəl wɪð fˈɪɹz ænd dəzˈIəɹz. +C ðˈɛn hi bəkˈʌmz ɐ kˈɑmplˌɛks ˌɪndəvˈɪʤəwəl wɪð fˈɪɹz ænd dəzˈIəɹz. +T Then ðˈɛn RB +T he hi PRP +T becomes bəkˈʌmz VBZ +T a ɐ DT +T complex kˈɑmplˌɛks JJ +T individual ˌɪndəvˈɪʤəwəl NN +T with wɪð IN +T fears fˈɪɹz NNS +T and ænd CC +T desires dəzˈIəɹz NNS +T . . . +S wikitext_heldout_200:68 On November 22, a tropical depression developed near Chuuk and moved westward. +P ˌɔn nOvˈɛmbəɹ twˈɛnti tˈu, ɐ tɹˈɑpəkəl dəpɹˈɛʃən dəvˈɛləpt nˌɪɹ ʧˈuk ænd mˈuvd wˈɛstwəɹd. +C ˌɔn nOvˈɛmbəɹ twˈɛnti tˈu, ɐ tɹˈɑpəkəl dəpɹˈɛʃən dəvˈɛləpt nˌɪɹ ʧˈuk ænd mˈuvd wˈɛstwəɹd. +T On ˌɔn IN +T November nOvˈɛmbəɹ NNP +T 22 twˈɛnti tˈu CD +T , , , +T a ɐ DT +T tropical tɹˈɑpəkəl JJ +T depression dəpɹˈɛʃən NN +T developed dəvˈɛləpt VBD +T near nˌɪɹ IN +T Chuuk ʧˈuk NNP +T and ænd CC +T moved mˈuvd VBD +T westward wˈɛstwəɹd RB +T . . . +S wikitext_heldout_200:69 The ship settled to the bottom, but the water was so shallow as to aid salvage efforts. +P ðə ʃˈɪp sˈɛTᵊld tə ðə bˈɑTəm, bˌʌt ðə wˈɔTəɹ wʌz sˌO ʃˈælO æz tʊ ˈAd sˈælvɪʤ ˈɛfəɹts. +C ðə ʃˈɪp sˈɛTᵊld tə ðə bˈɑTəm, bˌʌt ðə wˈɔTəɹ wʌz sˌO ʃˈælO æz tʊ ˈAd sˈælvɪʤ ˈɛfəɹts. +T The ðə DT +T ship ʃˈɪp NN +T settled sˈɛTᵊld VBD +T to tə IN +T the ðə DT +T bottom bˈɑTəm NN +T , , , +T but bˌʌt CC +T the ðə DT +T water wˈɔTəɹ NN +T was wʌz VBD +T so sˌO RB +T shallow ʃˈælO JJ +T as æz IN +T to tʊ TO +T aid ˈAd VB +T salvage sˈælvɪʤ NN +T efforts ˈɛfəɹts NNS +T . . . +S wikitext_heldout_200:70 Guts and Glory took the early lead when Mabel pinned Prichard after performing a crossbody from the second rope. +P ɡˈʌts ænd ɡlˈɔɹi tˈʊk ði ˈɜɹli lˈid wˌɛn mˈAbᵊl pˈɪnd pɹˈɪʧəɹd ˈæftəɹ pəɹfˈɔɹmɪŋ ɐ kɹˈɔsbɑdi fɹʌm ðə sˈɛkənd ɹˈOp. +C ɡˈʌts ænd ɡlˈɔɹi tˈʊk ði ˈɜɹli lˈid wˌɛn mˈAbᵊl pˈɪnd pɹˈɪʧəɹd ˈæftəɹ pəɹfˈɔɹmɪŋ ɐ kɹˈɔsbɑdi fɹʌm ðə sˈɛkənd ɹˈOp. +T Guts ɡˈʌts NNS +T and ænd CC +T Glory ɡlˈɔɹi NNP +T took tˈʊk VBD +T the ði DT +T early ˈɜɹli JJ +T lead lˈid NN +T when wˌɛn WRB +T Mabel mˈAbᵊl NNP +T pinned pˈɪnd VBD +T Prichard pɹˈɪʧəɹd NNP +T after ˈæftəɹ IN +T performing pəɹfˈɔɹmɪŋ VBG +T a ɐ DT +T crossbody kɹˈɔsbɑdi NN +T from fɹʌm IN +T the ðə DT +T second sˈɛkənd JJ +T rope ɹˈOp NN +T . . . +S wikitext_heldout_200:71 I was born and raised in iron ore country, where you could breathe it and smell it every day. +P ˌI wʌz bˈɔɹn ænd ɹˈAzd ɪn ˈIəɹn ˈɔɹ kˈʌntɹi, wˌɛɹ ju kʊd bɹˈið ɪt ænd smˈɛl ɪt ˈɛvəɹi dˈA. +C ˌI wʌz bˈɔɹn ænd ɹˈAzd ɪn ˈIəɹn ˈɔɹ kˈʌntɹi, wˌɛɹ ju kʊd bɹˈið ɪt ænd smˈɛl ɪt ˈɛvəɹi dˈA. +T I ˌI PRP +T was wʌz VBD +T born bˈɔɹn VBN +T and ænd CC +T raised ɹˈAzd VBN +T in ɪn IN +T iron ˈIəɹn NN +T ore ˈɔɹ NN +T country kˈʌntɹi NN +T , , , +T where wˌɛɹ WRB +T you ju PRP +T could kʊd MD +T breathe bɹˈið VB +T it ɪt PRP +T and ænd CC +T smell smˈɛl VB +T it ɪt PRP +T every ˈɛvəɹi DT +T day dˈA NN +T . . . +S wikitext_heldout_200:72 The businesses involved indicated at the time that they would revise their proposals and reapply. +P ðə bˈɪznəsᵻz ɪnvˈɑlvd ˈɪndəkˌATᵻd æt ðə tˈIm ðæt ðA wʊd ɹəvˈIz ðɛɹ pɹəpˈOzᵊlz ænd ɹˌiəplˈI. +C ðə bˈɪznəsᵻz ɪnvˈɑlvd ˈɪndəkˌATᵻd æt ðə tˈIm ðæt ðA wʊd ɹəvˈIz ðɛɹ pɹəpˈOzᵊlz ænd ɹˌiəplˈI. +T The ðə DT +T businesses bˈɪznəsᵻz NNS +T involved ɪnvˈɑlvd VBN +T indicated ˈɪndəkˌATᵻd VBD +T at æt IN +T the ðə DT +T time tˈIm NN +T that ðæt WDT +T they ðA PRP +T would wʊd MD +T revise ɹəvˈIz VB +T their ðɛɹ PRP$ +T proposals pɹəpˈOzᵊlz NNS +T and ænd CC +T reapply ɹˌiəplˈI NN +T . . . +S wikitext_heldout_200:73 Cohen, Roger (November 22, 1994). +P kˈOən, ɹˈɑʤəɹ (nOvˈɛmbəɹ twˈɛnti tˈu, nˌIntˈin nˈIndi fˈɔɹ). +C kˈOən, ɹˈɑʤəɹ (nOvˈɛmbəɹ twˈɛnti tˈu, nˌIntˈin nˈIndi fˈɔɹ). +T Cohen kˈOən NNP +T , , , +T Roger ɹˈɑʤəɹ NNP +T ( ( -LRB- +T November nOvˈɛmbəɹ NNP +T 22 twˈɛnti tˈu CD +T , , , +T 1994 nˌIntˈin nˈIndi fˈɔɹ CD +T ) ) -RRB- +T . . . +S wikitext_heldout_200:74 After the Passamaquoddy project fell through, Casey served with the Boston Engineer District on flood control surveys of the Connecticut River Valley. +P ˈæftəɹ ðə pˌæsəməkwˈɑdi pɹˈɑʤˌɛkt fˈɛl θɹˈu, kˈAsi sˈɜɹvd wɪð ðə bˈɔstən ˌɛnʤənˈɪɹ dˈɪstɹɪkt ˌɔn flˈʌd kəntɹˈOl sˈɜɹvˌAz ʌv ðə kənˈɛTəkət ɹˈɪvəɹ vˈæli. +C ˈæftəɹ ðə pˌæsəməkwˈɑdi pɹˈɑʤˌɛkt fˈɛl θɹˈu, kˈAsi sˈɜɹvd wɪð ðə bˈɔstən ˌɛnʤənˈɪɹ dˈɪstɹɪkt ˌɔn flˈʌd kəntɹˈOl sˈɜɹvˌAz ʌv ðə kənˈɛTəkət ɹˈɪvəɹ vˈæli. +T After ˈæftəɹ IN +T the ðə DT +T Passamaquoddy pˌæsəməkwˈɑdi NNP +T project pɹˈɑʤˌɛkt NN +T fell fˈɛl VBD +T through θɹˈu RB +T , , , +T Casey kˈAsi NNP +T served sˈɜɹvd VBD +T with wɪð IN +T the ðə DT +T Boston bˈɔstən NNP +T Engineer ˌɛnʤənˈɪɹ NNP +T District dˈɪstɹɪkt NNP +T on ˌɔn IN +T flood flˈʌd NN +T control kəntɹˈOl NN +T surveys sˈɜɹvˌAz NNS +T of ʌv IN +T the ðə DT +T Connecticut kənˈɛTəkət NNP +T River ɹˈɪvəɹ NNP +T Valley vˈæli NNP +T . . . +S wikitext_heldout_200:75 Since Tubas is the capital and largest city in the Tubas Governorate, it acts as the main provider of services to the towns and villages of the governorate. +P sˈɪns tˈubəz ɪz ðə kˈæpəTᵊl ænd lˈɑɹʤᵻst sˈɪTi ɪn ðə tˈubəz ɡˈʌvᵊnəɹət, ɪt ˈækts æz ðə mˈAn pɹəvˈIdəɹ ʌv sˈɜɹvəsᵻz tə ðə tˈWnz ænd vˈɪlɪʤᵻz ʌv ðə ɡˈʌvᵊnəɹət. +C sˈɪns tˈubəz ɪz ðə kˈæpəTᵊl ænd lˈɑɹʤᵻst sˈɪTi ɪn ðə tˈubəz ɡˈʌvᵊnəɹət, ɪt ˈækts æz ðə mˈAn pɹəvˈIdəɹ ʌv sˈɜɹvəsᵻz tə ðə tˈWnz ænd vˈɪlɪʤᵻz ʌv ðə ɡˈʌvᵊnəɹət. +T Since sˈɪns IN +T Tubas tˈubəz NNP +T is ɪz VBZ +T the ðə DT +T capital kˈæpəTᵊl NN +T and ænd CC +T largest lˈɑɹʤᵻst JJS +T city sˈɪTi NN +T in ɪn IN +T the ðə DT +T Tubas tˈubəz NNP +T Governorate ɡˈʌvᵊnəɹət NNP +T , , , +T it ɪt PRP +T acts ˈækts VBZ +T as æz IN +T the ðə DT +T main mˈAn JJ +T provider pɹəvˈIdəɹ NN +T of ʌv IN +T services sˈɜɹvəsᵻz NNS +T to tə IN +T the ðə DT +T towns tˈWnz NNS +T and ænd CC +T villages vˈɪlɪʤᵻz NNS +T of ʌv IN +T the ðə DT +T governorate ɡˈʌvᵊnəɹət NN +T . . . +S wikitext_heldout_200:76 Although Brutus defeated Octavian, Antony defeated Cassius, who committed suicide. +P ɔlðˈO bɹˈuTəs dəfˈiTᵻd ɑktˈAviən, ˈæntəni dəfˈiTᵻd kˈæsiəs, hˌu kəmˈɪTᵻd sˈuəsˌId. +C ɔlðˈO bɹˈuTəs dəfˈiTᵻd ɑktˈAviən, ˈæntəni dəfˈiTᵻd kˈæsiəs, hˌu kəmˈɪTᵻd sˈuəsˌId. +T Although ɔlðˈO IN +T Brutus bɹˈuTəs NNP +T defeated dəfˈiTᵻd VBD +T Octavian ɑktˈAviən NNP +T , , , +T Antony ˈæntəni NNP +T defeated dəfˈiTᵻd VBD +T Cassius kˈæsiəs NNP +T , , , +T who hˌu WP +T committed kəmˈɪTᵻd VBD +T suicide sˈuəsˌId NN +T . . . +S wikitext_heldout_200:77 In 1947, a young disk jockey in Charlotte, North Carolina who worked the overnight shift had recently received some older records which he brought to work with him. +P ɪn nˌIntˈin fˈɔɹTi sˈɛvən, ɐ jˈʌŋ dˈɪsk ʤˈɑki ɪn ʃˈɑɹlət, nˈɔɹθ kˌɛɹəlˈInə hˌu wˈɜɹkt ði ˌOvəɹnˈIt ʃˈɪft hæd ɹˈisᵊntli ɹəsˈivd sˌʌm ˈOldəɹ ɹˈɛkəɹdz wˌɪʧ hi bɹˈɔt tə wˈɜɹk wɪð hˌɪm. +C ɪn nˌIntˈin fˈɔɹTi sˈɛvən, ɐ jˈʌŋ dˈɪsk ʤˈɑki ɪn ʃˈɑɹlət, nˈɔɹθ kˌɛɹəlˈInə hˌu wˈɜɹkt ði ˌOvəɹnˈIt ʃˈɪft hæd ɹˈisᵊntli ɹəsˈivd sˌʌm ˈOldəɹ ɹˈɛkəɹdz wˌɪʧ hi bɹˈɔt tə wˈɜɹk wɪð hˌɪm. +T In ɪn IN +T 1947 nˌIntˈin fˈɔɹTi sˈɛvən CD +T , , , +T a ɐ DT +T young jˈʌŋ JJ +T disk dˈɪsk NN +T jockey ʤˈɑki NN +T in ɪn IN +T Charlotte ʃˈɑɹlət NNP +T , , , +T North nˈɔɹθ NNP +T Carolina kˌɛɹəlˈInə NNP +T who hˌu WP +T worked wˈɜɹkt VBD +T the ði DT +T overnight ˌOvəɹnˈIt JJ +T shift ʃˈɪft NN +T had hæd VBD +T recently ɹˈisᵊntli RB +T received ɹəsˈivd VBN +T some sˌʌm DT +T older ˈOldəɹ JJR +T records ɹˈɛkəɹdz NNS +T which wˌɪʧ WDT +T he hi PRP +T brought bɹˈɔt VBD +T to tə IN +T work wˈɜɹk VB +T with wɪð IN +T him hˌɪm PRP +T . . . +S wikitext_heldout_200:78 The album was on the Billboard Independent Albums Chart for four weeks, peaking at No. +P ði ˈælbəm wʌz ˌɔn ðə bˈɪlbˌɔɹd ˌɪndəpˈɛndənt ˈælbəmz ʧˈɑɹt fɔɹ fˈɔɹ wˈiks, pˈikɪŋ æt nˈO. +C ði ˈælbəm wʌz ˌɔn ðə bˈɪlbˌɔɹd ˌɪndəpˈɛndənt ˈælbəmz ʧˈɑɹt fɔɹ fˈɔɹ wˈiks, pˈikɪŋ æt nˈO. +T The ði DT +T album ˈælbəm NN +T was wʌz VBD +T on ˌɔn IN +T the ðə DT +T Billboard bˈɪlbˌɔɹd NNP +T Independent ˌɪndəpˈɛndənt NNP +T Albums ˈælbəmz NNP +T Chart ʧˈɑɹt NNP +T for fɔɹ IN +T four fˈɔɹ CD +T weeks wˈiks NNS +T , , , +T peaking pˈikɪŋ VBG +T at æt IN +T No nˈO NN +T . . . +S wikitext_heldout_200:79 On all flights, passengers are provided with food and complimentary beverages on board, in both classes. +P ˌɔn ˈɔl flˈIts, pˈæsᵊnʤəɹz ɑɹ pɹəvˈIdᵻd wɪð fˈud ænd kˌɑmpləmˈɛntəɹi bˈɛvəɹɪʤᵻz ˌɔn bˈɔɹd, ɪn bˈOθ klˈæsᵻz. +C ˌɔn ˈɔl flˈIts, pˈæsᵊnʤəɹz ɑɹ pɹəvˈIdᵻd wɪð fˈud ænd kˌɑmpləmˈɛntəɹi bˈɛvəɹɪʤᵻz ˌɔn bˈɔɹd, ɪn bˈOθ klˈæsᵻz. +T On ˌɔn IN +T all ˈɔl DT +T flights flˈIts NNS +T , , , +T passengers pˈæsᵊnʤəɹz NNS +T are ɑɹ VBP +T provided pɹəvˈIdᵻd VBN +T with wɪð IN +T food fˈud NN +T and ænd CC +T complimentary kˌɑmpləmˈɛntəɹi JJ +T beverages bˈɛvəɹɪʤᵻz NNS +T on ˌɔn IN +T board bˈɔɹd NN +T , , , +T in ɪn IN +T both bˈOθ DT +T classes klˈæsᵻz NNS +T . . . +S wikitext_heldout_200:80 The President of the United States takes pleasure in presenting the MEDAL OF HONOR to +P ðə pɹˈɛzədˌɛnt ʌv ðə junˈITᵻd stˈAts tˈAks plˈɛʒəɹ ɪn pɹizˈɛntɪŋ ðə mˈɛdᵊl ˈʌv ˈɑnəɹ tu +C ðə pɹˈɛzədˌɛnt ʌv ðə junˈITᵻd stˈAts tˈAks plˈɛʒəɹ ɪn pɹizˈɛntɪŋ ðə mˈɛdᵊl ˈʌv ˈɑnəɹ tu +T The ðə DT +T President pɹˈɛzədˌɛnt NNP +T of ʌv IN +T the ðə DT +T United junˈITᵻd NNP +T States stˈAts NNP +T takes tˈAks VBZ +T pleasure plˈɛʒəɹ NN +T in ɪn IN +T presenting pɹizˈɛntɪŋ VBG +T the ðə DT +T MEDAL mˈɛdᵊl NNS +T OF ˈʌv IN +T HONOR ˈɑnəɹ NNP +T to tu TO +S wikitext_heldout_200:81 There is no documentation detailing exactly when Kentucky's provisional government ceased operation. +P ðˌɛɹ ɪz nˈO dˌɑkjəməntˈAʃən dətˈAlɪŋ ɪɡzˈæktli wˌɛn kəntˈʌkiz pɹəvˈɪʒᵊnəl ɡˈʌvəɹnmənt sˈist ˌɑpəɹˈAʃən. +C ðˌɛɹ ɪz nˈO dˌɑkjəməntˈAʃən dətˈAlɪŋ ɪɡzˈæktli wˌɛn kəntˈʌkiz pɹəvˈɪʒᵊnəl ɡˈʌvəɹnmənt sˈist ˌɑpəɹˈAʃən. +T There ðˌɛɹ EX +T is ɪz VBZ +T no nˈO DT +T documentation dˌɑkjəməntˈAʃən NN +T detailing dətˈAlɪŋ VBG +T exactly ɪɡzˈæktli RB +T when wˌɛn WRB +T Kentucky's kəntˈʌkiz NNP +T provisional pɹəvˈɪʒᵊnəl JJ +T government ɡˈʌvəɹnmənt NN +T ceased sˈist VBD +T operation ˌɑpəɹˈAʃən NN +T . . . +S wikitext_heldout_200:82 The station would have featured six 170 feet (52 m) high cooling towers. +P ðə stˈAʃən wʊd hæv fˈiʧəɹd sˈɪks wˈʌn hˈʌndɹəd sˈɛvənti fˈit (fˈɪfti tˈu ˈɛm) hˈI kˈulɪŋ tˈWəɹz. +C ðə stˈAʃən wʊd hæv fˈiʧəɹd sˈɪks wˈʌn hˈʌndɹəd sˈɛvənti fˈit (fˈɪfti tˈu ˈɛm) hˈI kˈulɪŋ tˈWəɹz. +T The ðə DT +T station stˈAʃən NN +T would wʊd MD +T have hæv VB +T featured fˈiʧəɹd VBN +T six sˈɪks CD +T 170 wˈʌn hˈʌndɹəd sˈɛvənti CD +T feet fˈit NNS +T ( ( -LRB- +T 52 fˈɪfti tˈu CD +T m ˈɛm CD +T ) ) -RRB- +T high hˈI JJ +T cooling kˈulɪŋ VBG +T towers tˈWəɹz NNS +T . . . +S wikitext_heldout_200:83 The Medal of Honor with the flag was presented by President George W. +P ðə mˈɛdᵊl ʌv ˈɑnəɹ wɪð ðə flˈæɡ wʌz pɹizˈɛntᵻd bI pɹˈɛzədˌɛnt ʤˈɔɹʤ dˈʌbᵊlju +C ðə mˈɛdᵊl ʌv ˈɑnəɹ wɪð ðə flˈæɡ wʌz pɹizˈɛntᵻd bI pɹˈɛzədˌɛnt ʤˈɔɹʤ dˈʌbᵊlju +T The ðə DT +T Medal mˈɛdᵊl NNP +T of ʌv IN +T Honor ˈɑnəɹ NNP +T with wɪð IN +T the ðə DT +T flag flˈæɡ NN +T was wʌz VBD +T presented pɹizˈɛntᵻd VBN +T by bI IN +T President pɹˈɛzədˌɛnt NNP +T George ʤˈɔɹʤ NNP +T W. dˈʌbᵊlju NNP +S wikitext_heldout_200:84 Pliny lists over 900 drugs, compared to 600 in Dioscorides's De Materia Medica, 550 in Theophrastus, and 650 in Galen. +P plˈɪni lˈɪsts ˈOvəɹ nˈIn hˈʌndɹəd dɹˈʌɡz, kəmpˈɛɹd tə sˈɪks hˈʌndɹəd ɪn dɪˈɑskɔɹˌIdzᵻz də mətˈɪɹiə mˈɛdɪkə, fˈIv hˈʌndɹəd fˈɪfti ɪn θˌiəfɹˈæstəs, ænd sˈɪks hˈʌndɹəd fˈɪfti ɪn ɡˈAlən. +C plˈɪni lˈɪsts ˈOvəɹ nˈIn hˈʌndɹəd dɹˈʌɡz, kəmpˈɛɹd tə sˈɪks hˈʌndɹəd ɪn dɪˈɑskɔɹˌIdzᵻz də mətˈɪɹiə mˈɛdɪkə, fˈIv hˈʌndɹəd fˈɪfti ɪn θˌiəfɹˈæstəs, ænd sˈɪks hˈʌndɹəd fˈɪfti ɪn ɡˈAlən. +T Pliny plˈɪni NN +T lists lˈɪsts VBZ +T over ˈOvəɹ IN +T 900 nˈIn hˈʌndɹəd CD +T drugs dɹˈʌɡz NNS +T , , , +T compared kəmpˈɛɹd VBN +T to tə IN +T 600 sˈɪks hˈʌndɹəd CD +T in ɪn IN +T Dioscorides's dɪˈɑskɔɹˌIdzᵻz NNP +T De də NNP +T Materia mətˈɪɹiə NNP +T Medica mˈɛdɪkə NNP +T , , , +T 550 fˈIv hˈʌndɹəd fˈɪfti CD +T in ɪn IN +T Theophrastus θˌiəfɹˈæstəs NNP +T , , , +T and ænd CC +T 650 sˈɪks hˈʌndɹəd fˈɪfti CD +T in ɪn IN +T Galen ɡˈAlən NNP +T . . . +S wikitext_heldout_200:85 Firstly, he reviews the evidence about how serious the situation is already and how much worse it will get. +P fˈɜɹstli, hi ɹəvjˈuz ði ˈɛvədᵊns əbˈWt hˌW sˈɪɹiəs ðə sˌɪʧəwˈAʃən ɪz ˌɔlɹˈɛdi ænd hˌW mˈʌʧ wˈɜɹs ɪt wɪl ɡˈɛt. +C fˈɜɹstli, hi ɹəvjˈuz ði ˈɛvədᵊns əbˈWt hˌW sˈɪɹiəs ðə sˌɪʧəwˈAʃən ɪz ˌɔlɹˈɛdi ænd hˌW mˈʌʧ wˈɜɹs ɪt wɪl ɡˈɛt. +T Firstly fˈɜɹstli RB +T , , , +T he hi PRP +T reviews ɹəvjˈuz VBZ +T the ði DT +T evidence ˈɛvədᵊns NN +T about əbˈWt IN +T how hˌW WRB +T serious sˈɪɹiəs JJ +T the ðə DT +T situation sˌɪʧəwˈAʃən NN +T is ɪz VBZ +T already ˌɔlɹˈɛdi RB +T and ænd CC +T how hˌW WRB +T much mˈʌʧ RB +T worse wˈɜɹs JJR +T it ɪt PRP +T will wɪl MD +T get ɡˈɛt VB +T . . . +S wikitext_heldout_200:86 Caroline begins to descend, and both Mac and Guy grab hold of one her legs to bring her down, but instead they are lifted into the air with her. +P kˈɛɹəlˌIn bəɡˈɪnz tə dəsˈɛnd, ænd bˈOθ mˈæk ænd ɡˈI ɡɹˈæb hˈOld ʌv wˈʌn hɜɹ lˈɛɡz tə bɹˈɪŋ hɜɹ dˌWn, bˌʌt ɪnstˈɛd ðA ɑɹ lˈɪftᵻd ˈɪntu ði ˈɛɹ wɪð hˌɜɹ. +C kˈɛɹəlˌIn bəɡˈɪnz tə dəsˈɛnd, ænd bˈOθ mˈæk ænd ɡˈI ɡɹˈæb hˈOld ʌv wˈʌn hɜɹ lˈɛɡz tə bɹˈɪŋ hɜɹ dˌWn, bˌʌt ɪnstˈɛd ðA ɑɹ lˈɪftᵻd ˈɪntu ði ˈɛɹ wɪð hˌɜɹ. +T Caroline kˈɛɹəlˌIn NN +T begins bəɡˈɪnz VBZ +T to tə TO +T descend dəsˈɛnd VB +T , , , +T and ænd CC +T both bˈOθ CC +T Mac mˈæk NNP +T and ænd CC +T Guy ɡˈI NNP +T grab ɡɹˈæb VB +T hold hˈOld NN +T of ʌv IN +T one wˈʌn CD +T her hɜɹ PRP$ +T legs lˈɛɡz NNS +T to tə TO +T bring bɹˈɪŋ VB +T her hɜɹ PRP +T down dˌWn RP +T , , , +T but bˌʌt CC +T instead ɪnstˈɛd RB +T they ðA PRP +T are ɑɹ VBP +T lifted lˈɪftᵻd VBN +T into ˈɪntu IN +T the ði DT +T air ˈɛɹ NN +T with wɪð IN +T her hˌɜɹ PRP +T . . . +S wikitext_heldout_200:87 Some features of the skull are variable between individuals; for example, the thickness of the upper border of the orbit and the height of the posterior maxilla. +P sˌʌm fˈiʧəɹz ʌv ðə skˈʌl ɑɹ vˈɛɹiəbᵊl bətwˈin ˌɪndəvˈɪʤəwəlz; fɔɹ ɪɡzˈæmpəl, ðə θˈɪknəs ʌv ði ˈʌpəɹ bˈɔɹdəɹ ʌv ði ˈɔɹbət ænd ðə hˈIt ʌv ðə pɑstˈɪɹiəɹ mæksˈɪlə. +C sˌʌm fˈiʧəɹz ʌv ðə skˈʌl ɑɹ vˈɛɹiəbᵊl bətwˈin ˌɪndəvˈɪʤəwəlz; fɔɹ ɪɡzˈæmpəl, ðə θˈɪknəs ʌv ði ˈʌpəɹ bˈɔɹdəɹ ʌv ði ˈɔɹbət ænd ðə hˈIt ʌv ðə pɑstˈɪɹiəɹ mæksˈɪlə. +T Some sˌʌm DT +T features fˈiʧəɹz NNS +T of ʌv IN +T the ðə DT +T skull skˈʌl NN +T are ɑɹ VBP +T variable vˈɛɹiəbᵊl JJ +T between bətwˈin IN +T individuals ˌɪndəvˈɪʤəwəlz NNS +T ; ; : +T for fɔɹ IN +T example ɪɡzˈæmpəl NN +T , , , +T the ðə DT +T thickness θˈɪknəs NN +T of ʌv IN +T the ði DT +T upper ˈʌpəɹ JJ +T border bˈɔɹdəɹ NN +T of ʌv IN +T the ði DT +T orbit ˈɔɹbət NN +T and ænd CC +T the ðə DT +T height hˈIt NN +T of ʌv IN +T the ðə DT +T posterior pɑstˈɪɹiəɹ JJ +T maxilla mæksˈɪlə NN +T . . . +S wikitext_heldout_200:88 Michael Schiavo opposed the Governor's intervention in Schiavo's case, and was represented, in part, by the American Civil Liberties Union (ACLU). +P mˈIkᵊl skˈIəvˌO əpˈOzd ðə ɡˈʌvᵊnəɹz ˌɪntəɹvˈɛnʧᵊn ɪn skˈIəvˌOz kˈAs, ænd wʌz ɹˌɛpɹəzˈɛntᵻd, ɪn pˈɑɹt, bI ði əmˈɛɹəkᵊn sˈɪvəl lˈɪbəɹTiz jˈunjən (ˌAsˌiˌɛljˈu). +C mˈIkᵊl skˈIəvˌO əpˈOzd ðə ɡˈʌvᵊnəɹz ˌɪntəɹvˈɛnʧᵊn ɪn skˈIəvˌOz kˈAs, ænd wʌz ɹˌɛpɹəzˈɛntᵻd, ɪn pˈɑɹt, bI ði əmˈɛɹəkᵊn sˈɪvəl lˈɪbəɹTiz jˈunjən (ˌAsˌiˌɛljˈu). +T Michael mˈIkᵊl NNP +T Schiavo skˈIəvˌO NNP +T opposed əpˈOzd VBD +T the ðə DT +T Governor's ɡˈʌvᵊnəɹz NNP +T intervention ˌɪntəɹvˈɛnʧᵊn NN +T in ɪn IN +T Schiavo's skˈIəvˌOz NNP +T case kˈAs NN +T , , , +T and ænd CC +T was wʌz VBD +T represented ɹˌɛpɹəzˈɛntᵻd VBN +T , , , +T in ɪn IN +T part pˈɑɹt NN +T , , , +T by bI IN +T the ði DT +T American əmˈɛɹəkᵊn NNP +T Civil sˈɪvəl NNP +T Liberties lˈɪbəɹTiz NNPS +T Union jˈunjən NNP +T ( ( -LRB- +T ACLU ˌAsˌiˌɛljˈu NNP +T ) ) -RRB- +T . . . +S wikitext_heldout_200:89 We do however know and so does Formby, that certain lines in the lyric must not be broadcast ". +P wˌi dˈu hWˈɛvəɹ nˈO ænd sˌO dˈʌz fˈɔɹmbi, ðæt sˈɜɹtn lˈInz ɪn ðə lˈɪɹɪk mˈʌst nˌɑt bi bɹˈɔdkˌæst ”. +C wˌi dˈu hWˈɛvəɹ nˈO ænd sˌO dˈʌz fˈɔɹmbi, ðæt sˈɜɹtn lˈInz ɪn ðə lˈɪɹɪk mˈʌst nˌɑt bi bɹˈɔdkˌæst ”. +T We wˌi PRP +T do dˈu VBP +T however hWˈɛvəɹ RB +T know nˈO VB +T and ænd CC +T so sˌO RB +T does dˈʌz VBZ +T Formby fˈɔɹmbi NNP +T , , , +T that ðæt IN +T certain sˈɜɹtn JJ +T lines lˈInz NNS +T in ɪn IN +T the ðə DT +T lyric lˈɪɹɪk NN +T must mˈʌst MD +T not nˌɑt RB +T be bi VB +T broadcast bɹˈɔdkˌæst VBN +T " ” '' +T . . . +S wikitext_heldout_200:90 Thompson, a producer for 60 Minutes, was a former US Navy officer and naval gunfire spotter who had served two tours of duty during the Vietnam War. +P tˈɑmpsən, ɐ pɹədˈusəɹ fɔɹ sˈɪksti mˈɪnəts, wʌz ɐ fˈɔɹməɹ jˌuˈɛs nˈAvi ˈɔfəsəɹ ænd nˈAvᵊl ɡˈʌnfˌIəɹ spˈɑTəɹ hˌu hæd sˈɜɹvd tˈu tˈʊɹ ʌv dˈuTi dˈʊɹɪŋ ðə vˌiɛtnˈɑm wˈɔɹ. +C tˈɑmpsən, ɐ pɹədˈusəɹ fɔɹ sˈɪksti mˈɪnəts, wʌz ɐ fˈɔɹməɹ jˌuˈɛs nˈAvi ˈɔfəsəɹ ænd nˈAvᵊl ɡˈʌnfˌIəɹ spˈɑTəɹ hˌu hæd sˈɜɹvd tˈu tˈʊɹ ʌv dˈuTi dˈʊɹɪŋ ðə vˌiɛtnˈɑm wˈɔɹ. +T Thompson tˈɑmpsən NNP +T , , , +T a ɐ DT +T producer pɹədˈusəɹ NN +T for fɔɹ IN +T 60 sˈɪksti CD +T Minutes mˈɪnəts NNP +T , , , +T was wʌz VBD +T a ɐ DT +T former fˈɔɹməɹ JJ +T US jˌuˈɛs NNP +T Navy nˈAvi NNP +T officer ˈɔfəsəɹ NN +T and ænd CC +T naval nˈAvᵊl JJ +T gunfire ɡˈʌnfˌIəɹ NN +T spotter spˈɑTəɹ NN +T who hˌu WP +T had hæd VBD +T served sˈɜɹvd VBN +T two tˈu CD +T tours tˈʊɹ NNS +T of ʌv IN +T duty dˈuTi NN +T during dˈʊɹɪŋ IN +T the ðə DT +T Vietnam vˌiɛtnˈɑm NNP +T War wˈɔɹ NNP +T . . . +S wikitext_heldout_200:91 A polygamist, Idi Amin married at least six women, three of whom he divorced. +P ɐ pəlˈɪɡəmɪst, ˈɪdi ˈæmɪn mˈɛɹid æt lˈist sˈɪks wˈɪmən, θɹˈi ʌv hˈum hi dəvˈɔɹst. +C ɐ pəlˈɪɡəmɪst, ˈɪdi ˈæmɪn mˈɛɹid æt lˈist sˈɪks wˈɪmən, θɹˈi ʌv hˈum hi dəvˈɔɹst. +T A ɐ DT +T polygamist pəlˈɪɡəmɪst NN +T , , , +T Idi ˈɪdi NNP +T Amin ˈæmɪn NNP +T married mˈɛɹid VBD +T at æt RB +T least lˈist JJS +T six sˈɪks CD +T women wˈɪmən NNS +T , , , +T three θɹˈi CD +T of ʌv IN +T whom hˈum WP +T he hi PRP +T divorced dəvˈɔɹst VBD +T . . . +S wikitext_heldout_200:92 The family is invited to Burns'castle in Pennsylvania, where Bart and Lisa discover a secret staircase descending to an eerie basement filled with coffins. +P ðə fˈæmᵊli ɪz ɪnvˈITᵻd tʊ bˈɜɹnskæsᵊl ɪn pˌɛnsəlvˈAnjə, wˌɛɹ bˈɑɹt ænd lˈisə dəskˈʌvəɹ ɐ sˈikɹət stˈɛɹkˌAs dəsˈɛndɪŋ tə ɐn ˈɪɹi bˈAsmᵊnt fˈɪld wɪð kˈɔfənz. +C ðə fˈæmᵊli ɪz ɪnvˈITᵻd tʊ bˈɜɹnskæsᵊl ɪn pˌɛnsəlvˈAnjə, wˌɛɹ bˈɑɹt ænd lˈisə dəskˈʌvəɹ ɐ sˈikɹət stˈɛɹkˌAs dəsˈɛndɪŋ tə ɐn ˈɪɹi bˈAsmᵊnt fˈɪld wɪð kˈɔfənz. +T The ðə DT +T family fˈæmᵊli NN +T is ɪz VBZ +T invited ɪnvˈITᵻd VBN +T to tʊ IN +T Burns'castle bˈɜɹnskæsᵊl NNP +T in ɪn IN +T Pennsylvania pˌɛnsəlvˈAnjə NNP +T , , , +T where wˌɛɹ WRB +T Bart bˈɑɹt NNP +T and ænd CC +T Lisa lˈisə NNP +T discover dəskˈʌvəɹ VBP +T a ɐ DT +T secret sˈikɹət JJ +T staircase stˈɛɹkˌAs NN +T descending dəsˈɛndɪŋ VBG +T to tə IN +T an ɐn DT +T eerie ˈɪɹi JJ +T basement bˈAsmᵊnt NN +T filled fˈɪld VBN +T with wɪð IN +T coffins kˈɔfənz NNS +T . . . +S wikitext_heldout_200:93 He added that a war is not as straightforward and immature as it is portrayed in various shooters. +P hˌi ˈædᵻd ðæt ɐ wˈɔɹ ɪz nˌɑt æz stɹˌAtfˈɔɹwəɹd ænd ˌɪmətˈʊɹ æz ɪt ɪz pɔɹtɹˈAd ɪn vˈɛɹiəs ʃˈuTəɹz. +C hˌi ˈædᵻd ðæt ɐ wˈɔɹ ɪz nˌɑt æz stɹˌAtfˈɔɹwəɹd ænd ˌɪmətˈʊɹ æz ɪt ɪz pɔɹtɹˈAd ɪn vˈɛɹiəs ʃˈuTəɹz. +T He hˌi PRP +T added ˈædᵻd VBD +T that ðæt IN +T a ɐ DT +T war wˈɔɹ NN +T is ɪz VBZ +T not nˌɑt RB +T as æz RB +T straightforward stɹˌAtfˈɔɹwəɹd JJ +T and ænd CC +T immature ˌɪmətˈʊɹ JJ +T as æz IN +T it ɪt PRP +T is ɪz VBZ +T portrayed pɔɹtɹˈAd VBN +T in ɪn IN +T various vˈɛɹiəs JJ +T shooters ʃˈuTəɹz NNS +T . . . +S wikitext_heldout_200:94 It was cancelled permanently after the third season and it went into broadcast syndication. +P ˌɪt wʌz kˈænsəld pˈɜɹmᵊnəntli ˈæftəɹ ðə θˈɜɹd sˈizᵊn ænd ɪt wˈɛnt ˈɪntu bɹˈɔdkˌæst sˌɪndəkˈAʃən. +C ˌɪt wʌz kˈænsəld pˈɜɹmᵊnəntli ˈæftəɹ ðə θˈɜɹd sˈizᵊn ænd ɪt wˈɛnt ˈɪntu bɹˈɔdkˌæst sˌɪndəkˈAʃən. +T It ˌɪt PRP +T was wʌz VBD +T cancelled kˈænsəld VBN +T permanently pˈɜɹmᵊnəntli RB +T after ˈæftəɹ IN +T the ðə DT +T third θˈɜɹd JJ +T season sˈizᵊn NN +T and ænd CC +T it ɪt PRP +T went wˈɛnt VBD +T into ˈɪntu IN +T broadcast bɹˈɔdkˌæst NN +T syndication sˌɪndəkˈAʃən NN +T . . . +S wikitext_heldout_200:95 It was replaced by Blackwood Field in the Hermitage community, which operated between 1921 and 1928. +P ˌɪt wʌz ɹəplˈAst bI blˈækwʊd fˈild ɪn ðə hˈɜɹməTɪʤ kəmjˈunəTi, wˌɪʧ ˈɑpəɹˌATᵻd bətwˈin nˌIntˈin twˈɛnti wˈʌn ænd nˌIntˈin twˈɛnti ˈAt. +C ˌɪt wʌz ɹəplˈAst bI blˈækwʊd fˈild ɪn ðə hˈɜɹməTɪʤ kəmjˈunəTi, wˌɪʧ ˈɑpəɹˌATᵻd bətwˈin nˌIntˈin twˈɛnti wˈʌn ænd nˌIntˈin twˈɛnti ˈAt. +T It ˌɪt PRP +T was wʌz VBD +T replaced ɹəplˈAst VBN +T by bI IN +T Blackwood blˈækwʊd NNP +T Field fˈild NNP +T in ɪn IN +T the ðə DT +T Hermitage hˈɜɹməTɪʤ NNP +T community kəmjˈunəTi NN +T , , , +T which wˌɪʧ WDT +T operated ˈɑpəɹˌATᵻd VBD +T between bətwˈin IN +T 1921 nˌIntˈin twˈɛnti wˈʌn CD +T and ænd CC +T 1928 nˌIntˈin twˈɛnti ˈAt CD +T . . . +S wikitext_heldout_200:96 Any of these changes may result in back pain. +P ˈɛni ʌv ðiz ʧˈAnʤᵻz mˈA ɹəzˈʌlt ɪn bˈæk pˈAn. +C ˈɛni ʌv ðiz ʧˈAnʤᵻz mˈA ɹəzˈʌlt ɪn bˈæk pˈAn. +T Any ˈɛni DT +T of ʌv IN +T these ðiz DT +T changes ʧˈAnʤᵻz NNS +T may mˈA MD +T result ɹəzˈʌlt VB +T in ɪn IN +T back bˈæk JJ +T pain pˈAn NN +T . . . +S wikitext_heldout_200:97 When the other guests have left, Bond remarks that if he ever marries, he imagines it would be nice to marry an air hostess. +P wˌɛn ði ˈʌðəɹ ɡˈɛsts hæv lˈɛft, bˈɑnd ɹəmˈɑɹks ðæt ɪf hi ˈɛvəɹ mˈɛɹiz, hi ɪmˈAʤənˌiz ɪt wʊd bi nˈIs tə mˈɛɹi ɐn ˈɛɹ hˈOstəs. +C wˌɛn ði ˈʌðəɹ ɡˈɛsts hæv lˈɛft, bˈɑnd ɹəmˈɑɹks ðæt ɪf hi ˈɛvəɹ mˈɛɹiz, hi ɪmˈAʤənˌiz ɪt wʊd bi nˈIs tə mˈɛɹi ɐn ˈɛɹ hˈOstəs. +T When wˌɛn WRB +T the ði DT +T other ˈʌðəɹ JJ +T guests ɡˈɛsts NNS +T have hæv VBP +T left lˈɛft VBN +T , , , +T Bond bˈɑnd NN +T remarks ɹəmˈɑɹks VBZ +T that ðæt IN +T if ɪf IN +T he hi PRP +T ever ˈɛvəɹ RB +T marries mˈɛɹiz VBZ +T , , , +T he hi PRP +T imagines ɪmˈAʤənˌiz VBZ +T it ɪt PRP +T would wʊd MD +T be bi VB +T nice nˈIs JJ +T to tə TO +T marry mˈɛɹi VB +T an ɐn DT +T air ˈɛɹ NN +T hostess hˈOstəs NN +T . . . +S wikitext_heldout_200:98 He is considered the precursor of Argentine journalism. +P hˌi ɪz kənsˈɪdəɹd ðə pɹˈikˌɜɹsəɹ ʌv ˈɑɹʤəntIn ʤˈɜɹnᵊlˌɪzəm. +C hˌi ɪz kənsˈɪdəɹd ðə pɹˈikˌɜɹsəɹ ʌv ˈɑɹʤəntIn ʤˈɜɹnᵊlˌɪzəm. +T He hˌi PRP +T is ɪz VBZ +T considered kənsˈɪdəɹd VBN +T the ðə DT +T precursor pɹˈikˌɜɹsəɹ NN +T of ʌv IN +T Argentine ˈɑɹʤəntIn JJ +T journalism ʤˈɜɹnᵊlˌɪzəm NN +T . . . +S wikitext_heldout_200:99 Mickiewicz's childhood environment exerted a major influence on his literary work. +P mˈɪkjuˌɪkzᵻz ʧˈIldhˌʊd ənvˈIɹənmᵊnt ɪɡzˈɜɹTᵻd ɐ mˈAʤəɹ ˈɪnflʊəns ˌɔn hɪz lˈɪTəɹˌɛɹi wˈɜɹk. +C mˈɪkjuˌɪkzᵻz ʧˈIldhˌʊd ənvˈIɹənmᵊnt ɪɡzˈɜɹTᵻd ɐ mˈAʤəɹ ˈɪnflʊəns ˌɔn hɪz lˈɪTəɹˌɛɹi wˈɜɹk. +T Mickiewicz's mˈɪkjuˌɪkzᵻz NNP +T childhood ʧˈIldhˌʊd NN +T environment ənvˈIɹənmᵊnt NN +T exerted ɪɡzˈɜɹTᵻd VBD +T a ɐ DT +T major mˈAʤəɹ JJ +T influence ˈɪnflʊəns NN +T on ˌɔn IN +T his hɪz PRP$ +T literary lˈɪTəɹˌɛɹi JJ +T work wˈɜɹk NN +T . . . +S wikitext_heldout_200:100 Cross discovered the truth, went rogue, and started killing Fraternity members to keep them away from his son. +P kɹˈɔs dəskˈʌvəɹd ðə tɹˈuθ, wˈɛnt ɹˈOɡ, ænd stˈɑɹTᵻd kˈɪlɪŋ fɹətˈɜɹnəTi mˈɛmbəɹz tə kˈip ðˌɛm əwˈA fɹʌm hɪz sˈʌn. +C kɹˈɔs dəskˈʌvəɹd ðə tɹˈuθ, wˈɛnt ɹˈOɡ, ænd stˈɑɹTᵻd kˈɪlɪŋ fɹətˈɜɹnəTi mˈɛmbəɹz tə kˈip ðˌɛm əwˈA fɹʌm hɪz sˈʌn. +T Cross kɹˈɔs NNP +T discovered dəskˈʌvəɹd VBD +T the ðə DT +T truth tɹˈuθ NN +T , , , +T went wˈɛnt VBD +T rogue ɹˈOɡ NN +T , , , +T and ænd CC +T started stˈɑɹTᵻd VBD +T killing kˈɪlɪŋ VBG +T Fraternity fɹətˈɜɹnəTi NNP +T members mˈɛmbəɹz NNS +T to tə TO +T keep kˈip VB +T them ðˌɛm PRP +T away əwˈA RB +T from fɹʌm IN +T his hɪz PRP$ +T son sˈʌn NN +T . . . +S wikitext_heldout_200:101 At the north end of the city, White Sands Boulevard and the Charles T. +P ˌæt ðə nˈɔɹθ ˈɛnd ʌv ðə sˈɪTi, wˈIt sˈændz bˈʊləvˌɑɹd ænd ðə ʧˈɑɹlz tˈi +C ˌæt ðə nˈɔɹθ ˈɛnd ʌv ðə sˈɪTi, wˈIt sˈændz bˈʊləvˌɑɹd ænd ðə ʧˈɑɹlz tˈi +T At ˌæt IN +T the ðə DT +T north nˈɔɹθ NN +T end ˈɛnd NN +T of ʌv IN +T the ðə DT +T city sˈɪTi NN +T , , , +T White wˈIt NNP +T Sands sˈændz NNPS +T Boulevard bˈʊləvˌɑɹd NNP +T and ænd CC +T the ðə DT +T Charles ʧˈɑɹlz NNP +T T. tˈi NNP +S wikitext_heldout_200:102 In 1917 Parsons travelled to Roswell, New Mexico to take the United States Naval Academy exam for one of the appointments by Senator Andrieus A. +P ɪn nˌIntˈin sˌɛvəntˈin pˈɑɹsᵊnz tɹˈævəld tə ɹˈɑzwˌɛl, nˈu mˈɛksəkO tə tˈAk ðə junˈITᵻd stˈAts nˈAvᵊl əkˈædəmi ɪɡzˈæm fɔɹ wˈʌn ʌv ði əpˈYntmənts bI sˈɛnəTəɹ ˈændɹiəs ˈA +C ɪn nˌIntˈin sˌɛvəntˈin pˈɑɹsᵊnz tɹˈævəld tə ɹˈɑzwˌɛl, nˈu mˈɛksəkO tə tˈAk ðə junˈITᵻd stˈAts nˈAvᵊl əkˈædəmi ɪɡzˈæm fɔɹ wˈʌn ʌv ði əpˈYntmənts bI sˈɛnəTəɹ ˈændɹiəs ˈA +T In ɪn IN +T 1917 nˌIntˈin sˌɛvəntˈin CD +T Parsons pˈɑɹsᵊnz NNS +T travelled tɹˈævəld VBD +T to tə IN +T Roswell ɹˈɑzwˌɛl NNP +T , , , +T New nˈu NNP +T Mexico mˈɛksəkO NNP +T to tə TO +T take tˈAk VB +T the ðə DT +T United junˈITᵻd NNP +T States stˈAts NNP +T Naval nˈAvᵊl NNP +T Academy əkˈædəmi NNP +T exam ɪɡzˈæm NN +T for fɔɹ IN +T one wˈʌn CD +T of ʌv IN +T the ði DT +T appointments əpˈYntmənts NNS +T by bI IN +T Senator sˈɛnəTəɹ NNP +T Andrieus ˈændɹiəs NNP +T A. ˈA NNP +S wikitext_heldout_200:103 The Noronha skink (Trachylepis atlantica) is a species of skink from the island of Fernando de Noronha off northeastern Brazil. +P ðə nˈɔɹɑnhə skˈɪŋk (tɹˈækIlpiz ətlˈæntɪkə) ɪz ɐ spˈiʃiz ʌv skˈɪŋk fɹʌm ði ˈIlənd ʌv fɜɹnˈændO də nˈɔɹɑnhə ˈɔf nˌɔɹθˈistəɹn bɹəzˈɪl. +C ðə nˈɔɹɑnhə skˈɪŋk (tɹˈækIlpiz ətlˈæntɪkə) ɪz ɐ spˈiʃiz ʌv skˈɪŋk fɹʌm ði ˈIlənd ʌv fɜɹnˈændO də nˈɔɹɑnhə ˈɔf nˌɔɹθˈistəɹn bɹəzˈɪl. +T The ðə DT +T Noronha nˈɔɹɑnhə NNPS +T skink skˈɪŋk NN +T ( ( -LRB- +T Trachylepis tɹˈækIlpiz NNP +T atlantica ətlˈæntɪkə NNP +T ) ) -RRB- +T is ɪz VBZ +T a ɐ DT +T species spˈiʃiz NN +T of ʌv IN +T skink skˈɪŋk NN +T from fɹʌm IN +T the ði DT +T island ˈIlənd NN +T of ʌv IN +T Fernando fɜɹnˈændO NNP +T de də NNP +T Noronha nˈɔɹɑnhə NNP +T off ˈɔf IN +T northeastern nˌɔɹθˈistəɹn JJ +T Brazil bɹəzˈɪl NNP +T . . . +S wikitext_heldout_200:104 Reverend Sampson (Howard Bell) then invites everyone to stand as Charlene and Henry begin their walk up the aisle. +P ɹˈɛvəɹənd sˈæmpsən (hˈWəɹd bˈɛl) ðˈɛn ɪnvˈIts ˈɛvɹiwən tə stˈænd æz ʧˈɑɹlin ænd hˈɛnɹi bəɡˈɪn ðɛɹ wˈɔk ˌʌp ði ˈIl. +C ɹˈɛvəɹənd sˈæmpsən (hˈWəɹd bˈɛl) ðˈɛn ɪnvˈIts ˈɛvɹiwən tə stˈænd æz ʧˈɑɹlin ænd hˈɛnɹi bəɡˈɪn ðɛɹ wˈɔk ˌʌp ði ˈIl. +T Reverend ɹˈɛvəɹənd NNP +T Sampson sˈæmpsən NNP +T ( ( -LRB- +T Howard hˈWəɹd NNP +T Bell bˈɛl NNP +T ) ) -RRB- +T then ðˈɛn RB +T invites ɪnvˈIts VBZ +T everyone ˈɛvɹiwən NN +T to tə TO +T stand stˈænd VB +T as æz IN +T Charlene ʧˈɑɹlin NNP +T and ænd CC +T Henry hˈɛnɹi NNP +T begin bəɡˈɪn VBP +T their ðɛɹ PRP$ +T walk wˈɔk NN +T up ˌʌp IN +T the ði DT +T aisle ˈIl NN +T . . . +S wikitext_heldout_200:105 Malaysia agreed to this in 1994. +P məlˈAʒə əɡɹˈid tə ðɪs ɪn nˌIntˈin nˈIndi fˈɔɹ. +C məlˈAʒə əɡɹˈid tə ðɪs ɪn nˌIntˈin nˈIndi fˈɔɹ. +T Malaysia məlˈAʒə NNP +T agreed əɡɹˈid VBD +T to tə IN +T this ðɪs DT +T in ɪn IN +T 1994 nˌIntˈin nˈIndi fˈɔɹ CD +T . . . +S wikitext_heldout_200:106 Around 1009, Samuel or his father married a sister of Stephen I, the first King of Hungary. +P əɹˈWnd wˈʌn θˈWzᵊnd nˈIn, sˈæmjəwəl ɔɹ hɪz fˈɑðəɹ mˈɛɹid ɐ sˈɪstəɹ ʌv stˈivᵊn ˈI, ðə fˈɜɹst kˈɪŋ ʌv hˈʌŋɡəɹi. +C əɹˈWnd wˈʌn θˈWzᵊnd nˈIn, sˈæmjəwəl ɔɹ hɪz fˈɑðəɹ mˈɛɹid ɐ sˈɪstəɹ ʌv stˈivᵊn ˈI, ðə fˈɜɹst kˈɪŋ ʌv hˈʌŋɡəɹi. +T Around əɹˈWnd IN +T 1009 wˈʌn θˈWzᵊnd nˈIn CD +T , , , +T Samuel sˈæmjəwəl NNP +T or ɔɹ CC +T his hɪz PRP$ +T father fˈɑðəɹ NN +T married mˈɛɹid VBD +T a ɐ DT +T sister sˈɪstəɹ NN +T of ʌv IN +T Stephen stˈivᵊn NNP +T I ˈI NNP +T , , , +T the ðə DT +T first fˈɜɹst JJ +T King kˈɪŋ NN +T of ʌv IN +T Hungary hˈʌŋɡəɹi NNP +T . . . +S wikitext_heldout_200:107 The Magistrates'Court in the city was inaugurated in 1963. +P ði mˈæʤɪstɹˌAtskɔɹt ɪn ðə sˈɪTi wʌz ɪnˈɔɡjəɹˌATᵻd ɪn nˌIntˈin sˈɪksti θɹˈi. +C ði mˈæʤɪstɹˌAtskɔɹt ɪn ðə sˈɪTi wʌz ɪnˈɔɡjəɹˌATᵻd ɪn nˌIntˈin sˈɪksti θɹˈi. +T The ði DT +T Magistrates'Court mˈæʤɪstɹˌAtskɔɹt NN +T in ɪn IN +T the ðə DT +T city sˈɪTi NN +T was wʌz VBD +T inaugurated ɪnˈɔɡjəɹˌATᵻd VBN +T in ɪn IN +T 1963 nˌIntˈin sˈɪksti θɹˈi CD +T . . . +S wikitext_heldout_200:108 She had previously been in A Hoosier Romance, also based on Riley's work. +P ʃˌi hæd pɹˈiviəsli bɪn ɪn ɐ hˈuʒəɹ ɹOmˈæns, ˈɔlsO bˈAst ˌɔn ɹˈIliz wˈɜɹk. +C ʃˌi hæd pɹˈiviəsli bɪn ɪn ɐ hˈuʒəɹ ɹOmˈæns, ˈɔlsO bˈAst ˌɔn ɹˈIliz wˈɜɹk. +T She ʃˌi PRP +T had hæd VBD +T previously pɹˈiviəsli RB +T been bɪn VBN +T in ɪn IN +T A ɐ DT +T Hoosier hˈuʒəɹ NNP +T Romance ɹOmˈæns NNP +T , , , +T also ˈɔlsO RB +T based bˈAst VBN +T on ˌɔn IN +T Riley's ɹˈIliz NNP +T work wˈɜɹk NN +T . . . +S wikitext_heldout_200:109 Arca pennantiana Leach in Gray, 1852: synonym of Striarca lactea (Linnaeus, 1758) +P ˈɑɹkə pˌɛnənʃiˈɑnə lˈiʧ ɪn ɡɹˈA, ˌAtˈin fˈɪfti tˈu: sˈɪnənˌɪm ʌv stɹˈIəɹkə lˈæktiə (lˈɪniəs, sˌɛvəntˈin fˈɪfti ˈAt) +C ˈɑɹkə pˌɛnənʃiˈɑnə lˈiʧ ɪn ɡɹˈA, ˌAtˈin fˈɪfti tˈu: sˈɪnənˌɪm ʌv stɹˈIəɹkə lˈæktiə (lˈɪniəs, sˌɛvəntˈin fˈɪfti ˈAt) +T Arca ˈɑɹkə NNP +T pennantiana pˌɛnənʃiˈɑnə NN +T Leach lˈiʧ NNP +T in ɪn IN +T Gray ɡɹˈA NNP +T , , , +T 1852 ˌAtˈin fˈɪfti tˈu CD +T : : : +T synonym sˈɪnənˌɪm NN +T of ʌv IN +T Striarca stɹˈIəɹkə NNP +T lactea lˈæktiə NN +T ( ( -LRB- +T Linnaeus lˈɪniəs NNP +T , , , +T 1758 sˌɛvəntˈin fˈɪfti ˈAt CD +T ) ) -RRB- +S wikitext_heldout_200:110 The video was shot in Cape Town, South Africa in early September 2012. +P ðə vˈɪdiO wʌz ʃˈɑt ɪn kˈAp tˈWn, sˈWθ ˈæfɹəkə ɪn ˈɜɹli sɛptˈɛmbəɹ twˈɛnti twˈɛlv. +C ðə vˈɪdiO wʌz ʃˈɑt ɪn kˈAp tˈWn, sˈWθ ˈæfɹəkə ɪn ˈɜɹli sɛptˈɛmbəɹ twˈɛnti twˈɛlv. +T The ðə DT +T video vˈɪdiO NN +T was wʌz VBD +T shot ʃˈɑt VBN +T in ɪn IN +T Cape kˈAp NNP +T Town tˈWn NNP +T , , , +T South sˈWθ NNP +T Africa ˈæfɹəkə NNP +T in ɪn IN +T early ˈɜɹli JJ +T September sɛptˈɛmbəɹ NNP +T 2012 twˈɛnti twˈɛlv CD +T . . . +S wikitext_heldout_200:111 As Carey handed him the record, Tommy Mottola quickly grabbed the tape, insisting that he would deal with " the project ". +P ˌæz kˈɛɹi hˈændᵻd hˌɪm ðə ɹˈɛkəɹd, tˈɑmi mətˈOlə kwˈɪkli ɡɹˈæbd ðə tˈAp, ɪnsˈɪstɪŋ ðæt hi wʊd dˈil wɪð “ ðə pɹˈɑʤˌɛkt ”. +C ˌæz kˈɛɹi hˈændᵻd hˌɪm ðə ɹˈɛkəɹd, tˈɑmi mətˈOlə kwˈɪkli ɡɹˈæbd ðə tˈAp, ɪnsˈɪstɪŋ ðæt hi wʊd dˈil wɪð “ ðə pɹˈɑʤˌɛkt ”. +T As ˌæz IN +T Carey kˈɛɹi NNP +T handed hˈændᵻd VBD +T him hˌɪm PRP +T the ðə DT +T record ɹˈɛkəɹd NN +T , , , +T Tommy tˈɑmi NNP +T Mottola mətˈOlə NNP +T quickly kwˈɪkli RB +T grabbed ɡɹˈæbd VBD +T the ðə DT +T tape tˈAp NN +T , , , +T insisting ɪnsˈɪstɪŋ VBG +T that ðæt IN +T he hi PRP +T would wʊd MD +T deal dˈil VB +T with wɪð IN +T " “ `` +T the ðə DT +T project pɹˈɑʤˌɛkt NN +T " ” '' +T . . . +S wikitext_heldout_200:112 In the novel, Hemingway presents his notion that the " Lost Generation ", considered to have been decadent, dissolute and irretrievably damaged by World War I, was resilient and strong. +P ɪn ðə nˈɑvᵊl, hˈɛmɪŋwˌA pɹizˈɛnts hɪz nˈOʃən ðæt ðə “ lˈɔst ʤˌɛnəɹˈAʃən “, kənsˈɪdəɹd tə hæv bɪn dˈɛkədᵊnt, dˈɪsəlˌut ænd ˌɪɹɹətɹˈivəbli dˈæmɪʤd bI wˈɜɹld wˈɔɹ ˈI, wʌz ɹəzˈɪliənt ænd stɹˈɔŋ. +C ɪn ðə nˈɑvᵊl, hˈɛmɪŋwˌA pɹizˈɛnts hɪz nˈOʃən ðæt ðə “ lˈɔst ʤˌɛnəɹˈAʃən “, kənsˈɪdəɹd tə hæv bɪn dˈɛkədᵊnt, dˈɪsəlˌut ænd ˌɪɹɹətɹˈivəbli dˈæmɪʤd bI wˈɜɹld wˈɔɹ ˈI, wʌz ɹəzˈɪliənt ænd stɹˈɔŋ. +T In ɪn IN +T the ðə DT +T novel nˈɑvᵊl NN +T , , , +T Hemingway hˈɛmɪŋwˌA NNP +T presents pɹizˈɛnts VBZ +T his hɪz PRP$ +T notion nˈOʃən NN +T that ðæt IN +T the ðə DT +T " “ `` +T Lost lˈɔst NNP +T Generation ʤˌɛnəɹˈAʃən NNP +T " “ `` +T , , , +T considered kənsˈɪdəɹd VBN +T to tə TO +T have hæv VB +T been bɪn VBN +T decadent dˈɛkədᵊnt JJ +T , , , +T dissolute dˈɪsəlˌut VB +T and ænd CC +T irretrievably ˌɪɹɹətɹˈivəbli RB +T damaged dˈæmɪʤd VBN +T by bI IN +T World wˈɜɹld NNP +T War wˈɔɹ NNP +T I ˈI NNP +T , , , +T was wʌz VBD +T resilient ɹəzˈɪliənt JJ +T and ænd CC +T strong stɹˈɔŋ JJ +T . . . +S wikitext_heldout_200:113 Though he tries not to harm other people, someone or something always ends up burning. +P ðˌO hi tɹˈIz nˌɑt tə hˈɑɹm ˈʌðəɹ pˈipᵊl, sˈʌmwˌʌn ɔɹ sˈʌmθˌɪŋ ˈɔlwˌAz ˈɛndz ˌʌp bˈɜɹnɪŋ. +C ðˌO hi tɹˈIz nˌɑt tə hˈɑɹm ˈʌðəɹ pˈipᵊl, sˈʌmwˌʌn ɔɹ sˈʌmθˌɪŋ ˈɔlwˌAz ˈɛndz ˌʌp bˈɜɹnɪŋ. +T Though ðˌO IN +T he hi PRP +T tries tɹˈIz VBZ +T not nˌɑt RB +T to tə TO +T harm hˈɑɹm VB +T other ˈʌðəɹ JJ +T people pˈipᵊl NNS +T , , , +T someone sˈʌmwˌʌn NN +T or ɔɹ CC +T something sˈʌmθˌɪŋ NN +T always ˈɔlwˌAz RB +T ends ˈɛndz VBZ +T up ˌʌp RP +T burning bˈɜɹnɪŋ VBG +T . . . +S wikitext_heldout_200:114 Rehman signed a deal with Hong Kong First Division League side Kitchee on 11 January 2012. +P ɹᵻhmˈæn sˈInd ɐ dˈil wɪð hˈɑŋ kˈɑŋ fˈɜɹst dəvˈɪʒən lˈiɡ sˈId kˈɪʧi ˌɔn əlˈɛvᵊn ʤˈænjəwˌɛɹi twˈɛnti twˈɛlv. +C ɹᵻhmˈæn sˈInd ɐ dˈil wɪð hˈɑŋ kˈɑŋ fˈɜɹst dəvˈɪʒən lˈiɡ sˈId kˈɪʧi ˌɔn əlˈɛvᵊn ʤˈænjəwˌɛɹi twˈɛnti twˈɛlv. +T Rehman ɹᵻhmˈæn NNP +T signed sˈInd VBD +T a ɐ DT +T deal dˈil NN +T with wɪð IN +T Hong hˈɑŋ NNP +T Kong kˈɑŋ NNP +T First fˈɜɹst NNP +T Division dəvˈɪʒən NNP +T League lˈiɡ NNP +T side sˈId NN +T Kitchee kˈɪʧi NNP +T on ˌɔn IN +T 11 əlˈɛvᵊn CD +T January ʤˈænjəwˌɛɹi NNP +T 2012 twˈɛnti twˈɛlv CD +T . . . +S wikitext_heldout_200:115 The above procedure can be performed for any choice of a. +P ði əbˈʌv pɹəsˈiʤəɹ kæn bi pəɹfˈɔɹmd fɔɹ ˈɛni ʧˈYs ʌv ˈA +C ði əbˈʌv pɹəsˈiʤəɹ kæn bi pəɹfˈɔɹmd fɔɹ ˈɛni ʧˈYs ʌv ˈA +T The ði DT +T above əbˈʌv JJ +T procedure pɹəsˈiʤəɹ NN +T can kæn MD +T be bi VB +T performed pəɹfˈɔɹmd VBN +T for fɔɹ IN +T any ˈɛni DT +T choice ʧˈYs NN +T of ʌv IN +T a. ˈA NN +S wikitext_heldout_200:116 In the end they decided to localize it, which was considered a big risk for the company. +P ɪn ði ˈɛnd ðA dəsˈIdᵻd tə lˈOkəlˌIz ɪt, wˌɪʧ wʌz kənsˈɪdəɹd ɐ bˈɪɡ ɹˈɪsk fɔɹ ðə kˈʌmpᵊni. +C ɪn ði ˈɛnd ðA dəsˈIdᵻd tə lˈOkəlˌIz ɪt, wˌɪʧ wʌz kənsˈɪdəɹd ɐ bˈɪɡ ɹˈɪsk fɔɹ ðə kˈʌmpᵊni. +T In ɪn IN +T the ði DT +T end ˈɛnd NN +T they ðA PRP +T decided dəsˈIdᵻd VBD +T to tə TO +T localize lˈOkəlˌIz VB +T it ɪt PRP +T , , , +T which wˌɪʧ WDT +T was wʌz VBD +T considered kənsˈɪdəɹd VBN +T a ɐ DT +T big bˈɪɡ JJ +T risk ɹˈɪsk NN +T for fɔɹ IN +T the ðə DT +T company kˈʌmpᵊni NN +T . . . +S wikitext_heldout_200:117 Jones became the first foreigner to coach the English side. +P ʤˈOnz bəkˈAm ðə fˈɜɹst fˈɔɹənəɹ tə kˈOʧ ði ˈɪŋɡlɪʃ sˈId. +C ʤˈOnz bəkˈAm ðə fˈɜɹst fˈɔɹənəɹ tə kˈOʧ ði ˈɪŋɡlɪʃ sˈId. +T Jones ʤˈOnz NNP +T became bəkˈAm VBD +T the ðə DT +T first fˈɜɹst JJ +T foreigner fˈɔɹənəɹ NN +T to tə TO +T coach kˈOʧ VB +T the ði DT +T English ˈɪŋɡlɪʃ JJ +T side sˈId NN +T . . . +S wikitext_heldout_200:118 He preached moderation in socializing, including avoiding alcohol, to his players. +P hˌi pɹˈiʧt mˌɑdəɹˈAʃən ɪn sˈOʃəlˌIzɪŋ, ɪnklˈudɪŋ əvˈYdɪŋ ˈælkəhˌɔl, tə hɪz plˈAəɹz. +C hˌi pɹˈiʧt mˌɑdəɹˈAʃən ɪn sˈOʃəlˌIzɪŋ, ɪnklˈudɪŋ əvˈYdɪŋ ˈælkəhˌɔl, tə hɪz plˈAəɹz. +T He hˌi PRP +T preached pɹˈiʧt VBD +T moderation mˌɑdəɹˈAʃən NN +T in ɪn IN +T socializing sˈOʃəlˌIzɪŋ NN +T , , , +T including ɪnklˈudɪŋ VBG +T avoiding əvˈYdɪŋ VBG +T alcohol ˈælkəhˌɔl NN +T , , , +T to tə IN +T his hɪz PRP$ +T players plˈAəɹz NNS +T . . . +S wikitext_heldout_200:119 Later in 2002, Linkin Park released an album entitled Reanimation. +P lˈATəɹ ɪn tˈu θˈWzᵊnd tˈu, lˈɪŋkɪn pˈɑɹk ɹəlˈist ɐn ˈælbəm ɪntˈITᵊld ɹˌiˌænəmˈAʃən. +C lˈATəɹ ɪn tˈu θˈWzᵊnd tˈu, lˈɪŋkɪn pˈɑɹk ɹəlˈist ɐn ˈælbəm ɪntˈITᵊld ɹˌiˌænəmˈAʃən. +T Later lˈATəɹ RB +T in ɪn IN +T 2002 tˈu θˈWzᵊnd tˈu CD +T , , , +T Linkin lˈɪŋkɪn NNP +T Park pˈɑɹk NNP +T released ɹəlˈist VBD +T an ɐn DT +T album ˈælbəm NN +T entitled ɪntˈITᵊld VBN +T Reanimation ɹˌiˌænəmˈAʃən NNP +T . . . +S wikitext_heldout_200:120 The issue of piracy cropped up when a news article published in The Indian Express exposed the dark side of the film market. +P ði ˈɪʃu ʌv pˈIɹəsi kɹˈɑpt ˌʌp wˌɛn ɐ nˈuz ˈɑɹTəkᵊl pˈʌblɪʃt ɪn ði ˈɪndiən ɪkspɹˈɛs ɪkspˈOzd ðə dˈɑɹk sˈId ʌv ðə fˈɪlm mˈɑɹkət. +C ði ˈɪʃu ʌv pˈIɹəsi kɹˈɑpt ˌʌp wˌɛn ɐ nˈuz ˈɑɹTəkᵊl pˈʌblɪʃt ɪn ði ˈɪndiən ɪkspɹˈɛs ɪkspˈOzd ðə dˈɑɹk sˈId ʌv ðə fˈɪlm mˈɑɹkət. +T The ði DT +T issue ˈɪʃu NN +T of ʌv IN +T piracy pˈIɹəsi NN +T cropped kɹˈɑpt VBD +T up ˌʌp RP +T when wˌɛn WRB +T a ɐ DT +T news nˈuz NN +T article ˈɑɹTəkᵊl NN +T published pˈʌblɪʃt VBN +T in ɪn IN +T The ði DT +T Indian ˈɪndiən NNP +T Express ɪkspɹˈɛs NNP +T exposed ɪkspˈOzd VBD +T the ðə DT +T dark dˈɑɹk JJ +T side sˈId NN +T of ʌv IN +T the ðə DT +T film fˈɪlm NN +T market mˈɑɹkət NN +T . . . +S wikitext_heldout_200:121 The UK Defence Secretary, Michael Heseltine, who had supported the Agusta deal, resigned in protest. +P ðə jˌukˈA dəfˈɛns sˈɛkɹətˌɛɹi, mˈIkᵊl hˈɛsɪltˌin, hˌu hæd səpˈɔɹTᵻd ði ˈæɡʌstə dˈil, ɹəzˈInd ɪn pɹˈOtˌɛst. +C ðə jˌukˈA dəfˈɛns sˈɛkɹətˌɛɹi, mˈIkᵊl hˈɛsɪltˌin, hˌu hæd səpˈɔɹTᵻd ði ˈæɡʌstə dˈil, ɹəzˈInd ɪn pɹˈOtˌɛst. +T The ðə DT +T UK jˌukˈA NNP +T Defence dəfˈɛns NNP +T Secretary sˈɛkɹətˌɛɹi NNP +T , , , +T Michael mˈIkᵊl NNP +T Heseltine hˈɛsɪltˌin NNP +T , , , +T who hˌu WP +T had hæd VBD +T supported səpˈɔɹTᵻd VBN +T the ði DT +T Agusta ˈæɡʌstə NNP +T deal dˈil NN +T , , , +T resigned ɹəzˈInd VBD +T in ɪn IN +T protest pɹˈOtˌɛst NN +T . . . +S wikitext_heldout_200:122 Keyes, a television producer and director, who remained with the role for many years. +P kˈiz, ɐ tˈɛləvˌɪʒən pɹədˈusəɹ ænd dəɹˈɛktəɹ, hˌu ɹəmˈAnd wɪð ðə ɹˈOl fɔɹ mˈɛni jˈɪɹz. +C kˈiz, ɐ tˈɛləvˌɪʒən pɹədˈusəɹ ænd dəɹˈɛktəɹ, hˌu ɹəmˈAnd wɪð ðə ɹˈOl fɔɹ mˈɛni jˈɪɹz. +T Keyes kˈiz NNS +T , , , +T a ɐ DT +T television tˈɛləvˌɪʒən NN +T producer pɹədˈusəɹ NN +T and ænd CC +T director dəɹˈɛktəɹ NN +T , , , +T who hˌu WP +T remained ɹəmˈAnd VBD +T with wɪð IN +T the ðə DT +T role ɹˈOl NN +T for fɔɹ IN +T many mˈɛni JJ +T years jˈɪɹz NNS +T . . . +S wikitext_heldout_200:123 Large quantities of gold from Mexico also passed through its port annually. +P lˈɑɹʤ kwˈɑntəTiz ʌv ɡˈOld fɹʌm mˈɛksəkO ˈɔlsO pˈæst θɹu ɪts pˈɔɹt ˈænjəwəli. +C lˈɑɹʤ kwˈɑntəTiz ʌv ɡˈOld fɹʌm mˈɛksəkO ˈɔlsO pˈæst θɹu ɪts pˈɔɹt ˈænjəwəli. +T Large lˈɑɹʤ JJ +T quantities kwˈɑntəTiz NNS +T of ʌv IN +T gold ɡˈOld NN +T from fɹʌm IN +T Mexico mˈɛksəkO NNP +T also ˈɔlsO RB +T passed pˈæst VBD +T through θɹu IN +T its ɪts PRP$ +T port pˈɔɹt NN +T annually ˈænjəwəli RB +T . . . +S wikitext_heldout_200:124 It features production from Aftermath Entertainment producer DJ Khalil, who helped write the song along with Eminem, Erik Alcock, and Columbus " Rahki " Smith. +P ˌɪt fˈiʧəɹz pɹədˈʌkʃən fɹʌm ˈæftəɹmˌæθ ˌɛntəɹtˈAnmənt pɹədˈusəɹ dˈiʤˌA kˈɑlɪl, hˌu hˈɛlpt ɹˈIt ðə sˈɔŋ əlˈɔŋ wɪð ˈɛmInəm, ˈɛɹɪk ˈælkɑk, ænd kəlˈʌmbəs “ ɹˈɑki ” smˈɪθ. +C ˌɪt fˈiʧəɹz pɹədˈʌkʃən fɹʌm ˈæftəɹmˌæθ ˌɛntəɹtˈAnmənt pɹədˈusəɹ dˈiʤˌA kˈɑlɪl, hˌu hˈɛlpt ɹˈIt ðə sˈɔŋ əlˈɔŋ wɪð ˈɛmInəm, ˈɛɹɪk ˈælkɑk, ænd kəlˈʌmbəs “ ɹˈɑki ” smˈɪθ. +T It ˌɪt PRP +T features fˈiʧəɹz VBZ +T production pɹədˈʌkʃən NN +T from fɹʌm IN +T Aftermath ˈæftəɹmˌæθ NNP +T Entertainment ˌɛntəɹtˈAnmənt NNP +T producer pɹədˈusəɹ NN +T DJ dˈiʤˌA NNP +T Khalil kˈɑlɪl NNP +T , , , +T who hˌu WP +T helped hˈɛlpt VBD +T write ɹˈIt VB +T the ðə DT +T song sˈɔŋ NN +T along əlˈɔŋ IN +T with wɪð IN +T Eminem ˈɛmInəm NNP +T , , , +T Erik ˈɛɹɪk NNP +T Alcock ˈælkɑk NNP +T , , , +T and ænd CC +T Columbus kəlˈʌmbəs NNP +T " “ `` +T Rahki ɹˈɑki NNP +T " ” '' +T Smith smˈɪθ NNP +T . . . +S wikitext_heldout_200:125 One of the best examples of this was the defense of Ternovaya, where defending German units absolutely refused to surrender. +P wˈʌn ʌv ðə bˈɛst ɪɡzˈæmpəlz ʌv ðɪs wʌz ðə dəfˈɛns ʌv tˈɜɹnəvˌAə, wˌɛɹ dəfˈɛndɪŋ ʤˈɜɹmən jˈunəts ˈæbsəlˌutli ɹəfjˈuzd tə səɹˈɛndəɹ. +C wˈʌn ʌv ðə bˈɛst ɪɡzˈæmpəlz ʌv ðɪs wʌz ðə dəfˈɛns ʌv tˈɜɹnəvˌAə, wˌɛɹ dəfˈɛndɪŋ ʤˈɜɹmən jˈunəts ˈæbsəlˌutli ɹəfjˈuzd tə səɹˈɛndəɹ. +T One wˈʌn CD +T of ʌv IN +T the ðə DT +T best bˈɛst JJS +T examples ɪɡzˈæmpəlz NNS +T of ʌv IN +T this ðɪs DT +T was wʌz VBD +T the ðə DT +T defense dəfˈɛns NN +T of ʌv IN +T Ternovaya tˈɜɹnəvˌAə NNP +T , , , +T where wˌɛɹ WRB +T defending dəfˈɛndɪŋ VBG +T German ʤˈɜɹmən JJ +T units jˈunəts NNS +T absolutely ˈæbsəlˌutli RB +T refused ɹəfjˈuzd VBD +T to tə TO +T surrender səɹˈɛndəɹ VB +T . . . +S wikitext_heldout_200:126 Muter and Sebastian never filed formal charges against Marshall for perjury. +P mjˈuTəɹ ænd səbˈæsʧən nˈɛvəɹ fˈIld fˈɔɹmᵊl ʧˈɑɹʤᵻz əɡˈɛnst mˈɑɹʃəl fɔɹ pˈɜɹʤəɹi. +C mjˈuTəɹ ænd səbˈæsʧən nˈɛvəɹ fˈIld fˈɔɹmᵊl ʧˈɑɹʤᵻz əɡˈɛnst mˈɑɹʃəl fɔɹ pˈɜɹʤəɹi. +T Muter mjˈuTəɹ NNP +T and ænd CC +T Sebastian səbˈæsʧən NNP +T never nˈɛvəɹ RB +T filed fˈIld VBD +T formal fˈɔɹmᵊl JJ +T charges ʧˈɑɹʤᵻz NNS +T against əɡˈɛnst IN +T Marshall mˈɑɹʃəl NNP +T for fɔɹ IN +T perjury pˈɜɹʤəɹi NN +T . . . +S wikitext_heldout_200:127 A steel line engraving of the painting by the engraver Edward Goodall was also commissioned. +P ɐ stˈil lˈIn ɪnɡɹˈAvɪŋ ʌv ðə pˈAntɪŋ bI ði ɪnɡɹˈAvəɹ ˈɛdwəɹd ɡˈʊdɔl wʌz ˈɔlsO kəmˈɪʃənd. +C ɐ stˈil lˈIn ɪnɡɹˈAvɪŋ ʌv ðə pˈAntɪŋ bI ði ɪnɡɹˈAvəɹ ˈɛdwəɹd ɡˈʊdɔl wʌz ˈɔlsO kəmˈɪʃənd. +T A ɐ DT +T steel stˈil NN +T line lˈIn NN +T engraving ɪnɡɹˈAvɪŋ NN +T of ʌv IN +T the ðə DT +T painting pˈAntɪŋ NN +T by bI IN +T the ði DT +T engraver ɪnɡɹˈAvəɹ NN +T Edward ˈɛdwəɹd NNP +T Goodall ɡˈʊdɔl NNP +T was wʌz VBD +T also ˈɔlsO RB +T commissioned kəmˈɪʃənd VBN +T . . . +S wikitext_heldout_200:128 Kirk, Alpa, Jeff, and Kevin discover Flaming Dragon's heroin factory. +P kˈɜɹk, ˈælpə, ʤˈɛf, ænd kˈɛvɪn dəskˈʌvəɹ flˈAmɪŋ dɹˈæɡənz hˈɛɹəwən fˈæktəɹi. +C kˈɜɹk, ˈælpə, ʤˈɛf, ænd kˈɛvɪn dəskˈʌvəɹ flˈAmɪŋ dɹˈæɡənz hˈɛɹəwən fˈæktəɹi. +T Kirk kˈɜɹk NNP +T , , , +T Alpa ˈælpə NNP +T , , , +T Jeff ʤˈɛf NNP +T , , , +T and ænd CC +T Kevin kˈɛvɪn NNP +T discover dəskˈʌvəɹ VBP +T Flaming flˈAmɪŋ NNP +T Dragon's dɹˈæɡənz NNP +T heroin hˈɛɹəwən NN +T factory fˈæktəɹi NN +T . . . +S wikitext_heldout_200:129 Later, Gavin escapes from house arrest and shows up at the 30 Rock studios. +P lˈATəɹ, ɡˈævɪn əskˈAps fɹʌm hˈWs əɹˈɛst ænd ʃˈOz ˌʌp æt ðə θˈɜɹTi ɹˈɑk stˈudiOz. +C lˈATəɹ, ɡˈævɪn əskˈAps fɹʌm hˈWs əɹˈɛst ænd ʃˈOz ˌʌp æt ðə θˈɜɹTi ɹˈɑk stˈudiOz. +T Later lˈATəɹ RBR +T , , , +T Gavin ɡˈævɪn NNP +T escapes əskˈAps VBZ +T from fɹʌm IN +T house hˈWs NN +T arrest əɹˈɛst NN +T and ænd CC +T shows ʃˈOz VBZ +T up ˌʌp RP +T at æt IN +T the ðə DT +T 30 θˈɜɹTi CD +T Rock ɹˈɑk NNP +T studios stˈudiOz NNS +T . . . +S wikitext_heldout_200:130 And they practically raise themselves, what with the Internet and all ", from " Eight Misbehavin'" (season 11, 1999). +P ˌænd ðA pɹˈæktəkᵊli ɹˈAz ðəmsˈɛlvz, wˌʌt wɪð ði ˈɪntəɹnˌɛt ænd ˈɔl “, fɹʌm “ ˈAt mɪsbᵻhˈAvɪn”” (sˈizᵊn əlˈɛvᵊn, nˌIntˈin nˈIndi nˈIn). +C ˌænd ðA pɹˈæktəkᵊli ɹˈAz ðəmsˈɛlvz, wˌʌt wɪð ði ˈɪntəɹnˌɛt ænd ˈɔl “, fɹʌm “ ˈAt mɪsbᵻhˈAvɪn”” (sˈizᵊn əlˈɛvᵊn, nˌIntˈin nˈIndi nˈIn). +T And ˌænd CC +T they ðA PRP +T practically pɹˈæktəkᵊli RB +T raise ɹˈAz VBP +T themselves ðəmsˈɛlvz PRP +T , , , +T what wˌʌt WP +T with wɪð IN +T the ði DT +T Internet ˈɪntəɹnˌɛt NN +T and ænd CC +T all ˈɔl DT +T " “ `` +T , , , +T from fɹʌm IN +T " “ `` +T Eight ˈAt CD +T Misbehavin mɪsbᵻhˈAvɪn NNP +T ' ” '' +T " ” '' +T ( ( -LRB- +T season sˈizᵊn NN +T 11 əlˈɛvᵊn CD +T , , , +T 1999 nˌIntˈin nˈIndi nˈIn CD +T ) ) -RRB- +T . . . +S wikitext_heldout_200:131 Retrieved May 5, 2015. +P ɹətɹˈivd mˈA fˈIv, twˈɛnti fˌɪftˈin. +C ɹətɹˈivd mˈA fˈIv, twˈɛnti fˌɪftˈin. +T Retrieved ɹətɹˈivd VBN +T May mˈA NNP +T 5 fˈIv CD +T , , , +T 2015 twˈɛnti fˌɪftˈin CD +T . . . +S wikitext_heldout_200:132 The students rebelled and went on strike, an event Pierce was suspected of leading. +P ðə stˈudᵊnts ɹəbˈɛld ænd wˈɛnt ˌɔn stɹˈIk, ɐn əvˈɛnt pˈɪɹs wʌz səspˈɛktᵻd ʌv lˈidɪŋ. +C ðə stˈudᵊnts ɹəbˈɛld ænd wˈɛnt ˌɔn stɹˈIk, ɐn əvˈɛnt pˈɪɹs wʌz səspˈɛktᵻd ʌv lˈidɪŋ. +T The ðə DT +T students stˈudᵊnts NNS +T rebelled ɹəbˈɛld VBD +T and ænd CC +T went wˈɛnt VBD +T on ˌɔn IN +T strike stɹˈIk NN +T , , , +T an ɐn DT +T event əvˈɛnt NN +T Pierce pˈɪɹs NNP +T was wʌz VBD +T suspected səspˈɛktᵻd VBN +T of ʌv IN +T leading lˈidɪŋ VBG +T . . . +S wikitext_heldout_200:133 He had intended to stay in Dublin for a week, but Boycott was advised to cut his stay short. +P hˌi hæd ɪntˈɛndᵻd tə stˈA ɪn dˈʌblən fɔɹ ɐ wˈik, bˌʌt bˈYkˌɑt wʌz ədvˈIzd tə kˈʌt hɪz stˈA ʃˈɔɹt. +C hˌi hæd ɪntˈɛndᵻd tə stˈA ɪn dˈʌblən fɔɹ ɐ wˈik, bˌʌt bˈYkˌɑt wʌz ədvˈIzd tə kˈʌt hɪz stˈA ʃˈɔɹt. +T He hˌi PRP +T had hæd VBD +T intended ɪntˈɛndᵻd VBN +T to tə TO +T stay stˈA VB +T in ɪn IN +T Dublin dˈʌblən NNP +T for fɔɹ IN +T a ɐ DT +T week wˈik NN +T , , , +T but bˌʌt CC +T Boycott bˈYkˌɑt NNP +T was wʌz VBD +T advised ədvˈIzd VBN +T to tə TO +T cut kˈʌt VB +T his hɪz PRP$ +T stay stˈA NN +T short ʃˈɔɹt JJ +T . . . +S wikitext_heldout_200:134 She was the eldest daughter of Edward IV, and all their children were his cognatic heirs. +P ʃˌi wʌz ði ˈɛldᵻst dˈɔTəɹ ʌv ˈɛdwəɹd ˌIvˈi, ænd ˈɔl ðɛɹ ʧˈɪldɹᵊn wɜɹ hɪz kɑɡnˈæTɪk ˈɛɹz. +C ʃˌi wʌz ði ˈɛldᵻst dˈɔTəɹ ʌv ˈɛdwəɹd ˌIvˈi, ænd ˈɔl ðɛɹ ʧˈɪldɹᵊn wɜɹ hɪz kɑɡnˈæTɪk ˈɛɹz. +T She ʃˌi PRP +T was wʌz VBD +T the ði DT +T eldest ˈɛldᵻst JJS +T daughter dˈɔTəɹ NN +T of ʌv IN +T Edward ˈɛdwəɹd NNP +T IV ˌIvˈi NNP +T , , , +T and ænd CC +T all ˈɔl PDT +T their ðɛɹ PRP$ +T children ʧˈɪldɹᵊn NNS +T were wɜɹ VBD +T his hɪz PRP$ +T cognatic kɑɡnˈæTɪk JJ +T heirs ˈɛɹz NNS +T . . . +S wikitext_heldout_200:135 Early notable games were Play Zone!'s PC game Animaniacs Game Pack! +P ˈɜɹli nˈOTəbᵊl ɡˈAmz wɜɹ plˈA zˈOn!s pˌisˈi ɡˈAm ˌænɪmˈAnɪˌæks ɡˈAm pˈæk! +C ˈɜɹli nˈOTəbᵊl ɡˈAmz wɜɹ plˈA zˈOn!s pˌisˈi ɡˈAm ˌænɪmˈAnɪˌæks ɡˈAm pˈæk! +T Early ˈɜɹli RB +T notable nˈOTəbᵊl JJ +T games ɡˈAmz NNS +T were wɜɹ VBD +T Play plˈA NNP +T Zone zˈOn NNP +T ! ! . +T 's s POS +T PC pˌisˈi NN +T game ɡˈAm NN +T Animaniacs ˌænɪmˈAnɪˌæks NNP +T Game ɡˈAm NNP +T Pack pˈæk NNP +T ! ! . +S wikitext_heldout_200:136 When first entering the queue, guests are taken past a number of banners for the Triwizard Tournament showing support for the four contestants. +P wˌɛn fˈɜɹst ˈɛntəɹɪŋ ðə kjˈu, ɡˈɛsts ɑɹ tˈAkən pˈæst ɐ nˈʌmbəɹ ʌv bˈænəɹz fɔɹ ðə tɹˈIwɪzəɹd tˈɜɹnəmənt ʃˈOɪŋ səpˈɔɹt fɔɹ ðə fˈɔɹ kəntˈɛstᵊnts. +C wˌɛn fˈɜɹst ˈɛntəɹɪŋ ðə kjˈu, ɡˈɛsts ɑɹ tˈAkən pˈæst ɐ nˈʌmbəɹ ʌv bˈænəɹz fɔɹ ðə tɹˈIwɪzəɹd tˈɜɹnəmənt ʃˈOɪŋ səpˈɔɹt fɔɹ ðə fˈɔɹ kəntˈɛstᵊnts. +T When wˌɛn WRB +T first fˈɜɹst RB +T entering ˈɛntəɹɪŋ VBG +T the ðə DT +T queue kjˈu NN +T , , , +T guests ɡˈɛsts NNS +T are ɑɹ VBP +T taken tˈAkən VBN +T past pˈæst IN +T a ɐ DT +T number nˈʌmbəɹ NN +T of ʌv IN +T banners bˈænəɹz NNS +T for fɔɹ IN +T the ðə DT +T Triwizard tɹˈIwɪzəɹd NNP +T Tournament tˈɜɹnəmənt NNP +T showing ʃˈOɪŋ VBG +T support səpˈɔɹt NN +T for fɔɹ IN +T the ðə DT +T four fˈɔɹ CD +T contestants kəntˈɛstᵊnts NNS +T . . . +S wikitext_heldout_200:137 That's also why my work is inimitable. +P ðˈæts ˈɔlsO wˌI mI wˈɜɹk ɪz ɪnˈɪməTəbᵊl. +C ðˈæts ˈɔlsO wˌI mI wˈɜɹk ɪz ɪnˈɪməTəbᵊl. +T That's ðˈæts DT +T also ˈɔlsO RB +T why wˌI WRB +T my mI PRP$ +T work wˈɜɹk NN +T is ɪz VBZ +T inimitable ɪnˈɪməTəbᵊl JJ +T . . . +S wikitext_heldout_200:138 The BBC further defended the episode, by stating the Muslim involvement towards making it, and that it does not suggest that mosques breed terrorists. +P ðə bˌibˌisˈi fˈɜɹðəɹ dəfˈɛndᵻd ði ˈɛpəsˌOd, bI stˈATɪŋ ðə mˈʌzləm ɪnvˈɑlvmənt tˈɔɹdz mˈAkɪŋ ɪt, ænd ðæt ɪt dˈʌz nˌɑt səɡʤˈɛst ðæt mˈɑsks bɹˈid tˈɛɹəɹɪsts. +C ðə bˌibˌisˈi fˈɜɹðəɹ dəfˈɛndᵻd ði ˈɛpəsˌOd, bI stˈATɪŋ ðə mˈʌzləm ɪnvˈɑlvmənt tˈɔɹdz mˈAkɪŋ ɪt, ænd ðæt ɪt dˈʌz nˌɑt səɡʤˈɛst ðæt mˈɑsks bɹˈid tˈɛɹəɹɪsts. +T The ðə DT +T BBC bˌibˌisˈi NNP +T further fˈɜɹðəɹ RB +T defended dəfˈɛndᵻd VBD +T the ði DT +T episode ˈɛpəsˌOd NN +T , , , +T by bI IN +T stating stˈATɪŋ VBG +T the ðə DT +T Muslim mˈʌzləm JJ +T involvement ɪnvˈɑlvmənt NN +T towards tˈɔɹdz IN +T making mˈAkɪŋ VBG +T it ɪt PRP +T , , , +T and ænd CC +T that ðæt IN +T it ɪt PRP +T does dˈʌz VBZ +T not nˌɑt RB +T suggest səɡʤˈɛst VB +T that ðæt IN +T mosques mˈɑsks VBZ +T breed bɹˈid JJ +T terrorists tˈɛɹəɹɪsts NNS +T . . . +S wikitext_heldout_200:139 Kasagi took Yashima in tow, but the battleship's list continued to increase and she capsized about three hours later. +P kæsˈɑɡi tˈʊk jæʃˈimə ɪn tˈO, bˌʌt ðə bˈæTᵊlʃˌɪps lˈɪst kəntˈɪnjud tʊ ɪnkɹˈis ænd ʃi kˈæpsˌIzd əbˈWt θɹˈi ˈWəɹz lˈATəɹ. +C kæsˈɑɡi tˈʊk jæʃˈimə ɪn tˈO, bˌʌt ðə bˈæTᵊlʃˌɪps lˈɪst kəntˈɪnjud tʊ ɪnkɹˈis ænd ʃi kˈæpsˌIzd əbˈWt θɹˈi ˈWəɹz lˈATəɹ. +T Kasagi kæsˈɑɡi NNP +T took tˈʊk VBD +T Yashima jæʃˈimə NNP +T in ɪn IN +T tow tˈO NNP +T , , , +T but bˌʌt CC +T the ðə DT +T battleship's bˈæTᵊlʃˌɪps NN +T list lˈɪst NN +T continued kəntˈɪnjud VBD +T to tʊ TO +T increase ɪnkɹˈis VB +T and ænd CC +T she ʃi PRP +T capsized kˈæpsˌIzd VBD +T about əbˈWt RB +T three θɹˈi CD +T hours ˈWəɹz NNS +T later lˈATəɹ RB +T . . . +S wikitext_heldout_200:140 The escaping steam sprayed through the living compartments and decks. +P ði ɛskˈApɪŋ stˈim spɹˈAd θɹu ðə lˈɪvɪŋ kəmpˈɑɹtmənts ænd dˈɛks. +C ði ɛskˈApɪŋ stˈim spɹˈAd θɹu ðə lˈɪvɪŋ kəmpˈɑɹtmənts ænd dˈɛks. +T The ði DT +T escaping ɛskˈApɪŋ NN +T steam stˈim NN +T sprayed spɹˈAd VBN +T through θɹu IN +T the ðə DT +T living lˈɪvɪŋ VBG +T compartments kəmpˈɑɹtmənts NNS +T and ænd CC +T decks dˈɛks NNS +T . . . +S wikitext_heldout_200:141 The scenes at Reiden Lake were actually shot on a parking lot, and the crew placed a covering over it to simulate the cracks normally on a lake. +P ðə sˈinz æt ɹˌiˈIdən lˈAk wɜɹ ˈækʧəwəli ʃˈɑt ˌɔn ɐ pˈɑɹkɪŋ lˈɑt, ænd ðə kɹˈu plˈAst ɐ kˈʌvəɹɪŋ ˈOvəɹ ɪt tə sˈɪmjəlˌAt ðə kɹˈæks nˈɔɹməli ˌɔn ɐ lˈAk. +C ðə sˈinz æt ɹˌiˈIdən lˈAk wɜɹ ˈækʧəwəli ʃˈɑt ˌɔn ɐ pˈɑɹkɪŋ lˈɑt, ænd ðə kɹˈu plˈAst ɐ kˈʌvəɹɪŋ ˈOvəɹ ɪt tə sˈɪmjəlˌAt ðə kɹˈæks nˈɔɹməli ˌɔn ɐ lˈAk. +T The ðə DT +T scenes sˈinz NNS +T at æt IN +T Reiden ɹˌiˈIdən NNP +T Lake lˈAk NNP +T were wɜɹ VBD +T actually ˈækʧəwəli RB +T shot ʃˈɑt VBN +T on ˌɔn IN +T a ɐ DT +T parking pˈɑɹkɪŋ NN +T lot lˈɑt NN +T , , , +T and ænd CC +T the ðə DT +T crew kɹˈu NN +T placed plˈAst VBD +T a ɐ DT +T covering kˈʌvəɹɪŋ NN +T over ˈOvəɹ IN +T it ɪt PRP +T to tə TO +T simulate sˈɪmjəlˌAt VB +T the ðə DT +T cracks kɹˈæks NNS +T normally nˈɔɹməli RB +T on ˌɔn IN +T a ɐ DT +T lake lˈAk NN +T . . . +S wikitext_heldout_200:142 NY 122 serves as a northerly bypass of the village of Malone, situated 6 miles (10 km) to the south. +P ˌɛnwˈI wˈʌn hˈʌndɹəd twˈɛnti tˈu sˈɜɹvz æz ɐ nˈɔɹðəɹli bˈIpˌæs ʌv ðə vˈɪlɪʤ ʌv məlˈOn, sˈɪʧəwˌATᵻd sˈɪks mˈIlz (tˈɛn kˌAˈɛm) tə ðə sˈWθ. +C ˌɛnwˈI wˈʌn hˈʌndɹəd twˈɛnti tˈu sˈɜɹvz æz ɐ nˈɔɹðəɹli bˈIpˌæs ʌv ðə vˈɪlɪʤ ʌv məlˈOn, sˈɪʧəwˌATᵻd sˈɪks mˈIlz (tˈɛn kˌAˈɛm) tə ðə sˈWθ. +T NY ˌɛnwˈI NN +T 122 wˈʌn hˈʌndɹəd twˈɛnti tˈu CD +T serves sˈɜɹvz VBZ +T as æz IN +T a ɐ DT +T northerly nˈɔɹðəɹli JJ +T bypass bˈIpˌæs NN +T of ʌv IN +T the ðə DT +T village vˈɪlɪʤ NN +T of ʌv IN +T Malone məlˈOn NNP +T , , , +T situated sˈɪʧəwˌATᵻd VBD +T 6 sˈɪks CD +T miles mˈIlz NNS +T ( ( -LRB- +T 10 tˈɛn CD +T km kˌAˈɛm NNS +T ) ) -RRB- +T to tə IN +T the ðə DT +T south sˈWθ NN +T . . . +S wikitext_heldout_200:143 At the same time, Banner dreams that Chris committed the murders. +P ˌæt ðə sˈAm tˈIm, bˈænəɹ dɹˈimz ðæt kɹˈɪs kəmˈɪTᵻd ðə mˈɜɹdəɹz. +C ˌæt ðə sˈAm tˈIm, bˈænəɹ dɹˈimz ðæt kɹˈɪs kəmˈɪTᵻd ðə mˈɜɹdəɹz. +T At ˌæt IN +T the ðə DT +T same sˈAm JJ +T time tˈIm NN +T , , , +T Banner bˈænəɹ NNP +T dreams dɹˈimz VBZ +T that ðæt WDT +T Chris kɹˈɪs NNP +T committed kəmˈɪTᵻd VBD +T the ðə DT +T murders mˈɜɹdəɹz NNS +T . . . +S wikitext_heldout_200:144 It is revealed that Bill Mulder and the Smoking Man are two of the agents who are interviewing the crewman. +P ˌɪt ɪz ɹəvˈild ðæt bˈɪl mˈʌldəɹ ænd ðə smˈOkɪŋ mˈæn ɑɹ tˈu ʌv ði ˈAʤᵊnts hˌu ɑɹ ˈɪntəɹvjˌuɪŋ ðə kɹˈumən. +C ˌɪt ɪz ɹəvˈild ðæt bˈɪl mˈʌldəɹ ænd ðə smˈOkɪŋ mˈæn ɑɹ tˈu ʌv ði ˈAʤᵊnts hˌu ɑɹ ˈɪntəɹvjˌuɪŋ ðə kɹˈumən. +T It ˌɪt PRP +T is ɪz VBZ +T revealed ɹəvˈild VBN +T that ðæt IN +T Bill bˈɪl NNP +T Mulder mˈʌldəɹ NNP +T and ænd CC +T the ðə DT +T Smoking smˈOkɪŋ NNP +T Man mˈæn NNP +T are ɑɹ VBP +T two tˈu CD +T of ʌv IN +T the ði DT +T agents ˈAʤᵊnts NNS +T who hˌu WP +T are ɑɹ VBP +T interviewing ˈɪntəɹvjˌuɪŋ VBG +T the ðə DT +T crewman kɹˈumən NN +T . . . +S wikitext_heldout_200:145 John tries his best to make something good in his life, but most of it leading to failure. +P ʤˈɑn tɹˈIz hɪz bˈɛst tə mˌAk sˈʌmθˌɪŋ ɡˈʊd ɪn hɪz lˈIf, bˌʌt mˈOst ʌv ɪt lˈidɪŋ tə fˈAljəɹ. +C ʤˈɑn tɹˈIz hɪz bˈɛst tə mˌAk sˈʌmθˌɪŋ ɡˈʊd ɪn hɪz lˈIf, bˌʌt mˈOst ʌv ɪt lˈidɪŋ tə fˈAljəɹ. +T John ʤˈɑn NNP +T tries tɹˈIz VBZ +T his hɪz PRP$ +T best bˈɛst JJS +T to tə TO +T make mˌAk VB +T something sˈʌmθˌɪŋ NN +T good ɡˈʊd JJ +T in ɪn IN +T his hɪz PRP$ +T life lˈIf NN +T , , , +T but bˌʌt CC +T most mˈOst JJS +T of ʌv IN +T it ɪt PRP +T leading lˈidɪŋ VBG +T to tə IN +T failure fˈAljəɹ NN +T . . . +S wikitext_heldout_200:146 The composers started their writing separately, Cornell in his apartment in Paris, and Arnold in his house in London. +P ðə kəmpˈOzəɹz stˈɑɹTᵻd ðɛɹ ɹˈITɪŋ sˈɛpəɹətli, kɔɹnˈɛl ɪn hɪz əpˈɑɹtmənt ɪn pˈɛɹəs, ænd ˈɑɹnᵊld ɪn hɪz hˈWs ɪn lˈʌndən. +C ðə kəmpˈOzəɹz stˈɑɹTᵻd ðɛɹ ɹˈITɪŋ sˈɛpəɹətli, kɔɹnˈɛl ɪn hɪz əpˈɑɹtmənt ɪn pˈɛɹəs, ænd ˈɑɹnᵊld ɪn hɪz hˈWs ɪn lˈʌndən. +T The ðə DT +T composers kəmpˈOzəɹz NNS +T started stˈɑɹTᵻd VBD +T their ðɛɹ PRP$ +T writing ɹˈITɪŋ NN +T separately sˈɛpəɹətli RB +T , , , +T Cornell kɔɹnˈɛl NNP +T in ɪn IN +T his hɪz PRP$ +T apartment əpˈɑɹtmənt NN +T in ɪn IN +T Paris pˈɛɹəs NNP +T , , , +T and ænd CC +T Arnold ˈɑɹnᵊld NNP +T in ɪn IN +T his hɪz PRP$ +T house hˈWs NN +T in ɪn IN +T London lˈʌndən NNP +T . . . +S wikitext_heldout_200:147 When opened on the left, the front doors of the cabinet exposed a number of gears and cogs similar to clockwork. +P wˌɛn ˈOpᵊnd ˌɔn ðə lˈɛft, ðə fɹˈʌnt dˈɔɹz ʌv ðə kˈæbᵊnət ɪkspˈOzd ɐ nˈʌmbəɹ ʌv ɡˈɪɹz ænd kˈɔɡz sˈɪmᵊləɹ tə klˈɑkwˌɜɹk. +C wˌɛn ˈOpᵊnd ˌɔn ðə lˈɛft, ðə fɹˈʌnt dˈɔɹz ʌv ðə kˈæbᵊnət ɪkspˈOzd ɐ nˈʌmbəɹ ʌv ɡˈɪɹz ænd kˈɔɡz sˈɪmᵊləɹ tə klˈɑkwˌɜɹk. +T When wˌɛn WRB +T opened ˈOpᵊnd VBN +T on ˌɔn IN +T the ðə DT +T left lˈɛft NN +T , , , +T the ðə DT +T front fɹˈʌnt JJ +T doors dˈɔɹz NNS +T of ʌv IN +T the ðə DT +T cabinet kˈæbᵊnət NN +T exposed ɪkspˈOzd VBD +T a ɐ DT +T number nˈʌmbəɹ NN +T of ʌv IN +T gears ɡˈɪɹz NNS +T and ænd CC +T cogs kˈɔɡz NNS +T similar sˈɪmᵊləɹ JJ +T to tə IN +T clockwork klˈɑkwˌɜɹk NN +T . . . +S wikitext_heldout_200:148 Of the past 20 Grand Slam drawsheets, they have been drawn in the same half 16 times. +P ˌʌv ðə pˈæst twˈɛnti ɡɹˈænd slˈæm dɹˈɔʃˌits, ðA hæv bɪn dɹˈɔn ɪn ðə sˈAm hˈæf sˌɪkstˈin tˈImz. +C ˌʌv ðə pˈæst twˈɛnti ɡɹˈænd slˈæm dɹˈɔʃˌits, ðA hæv bɪn dɹˈɔn ɪn ðə sˈAm hˈæf sˌɪkstˈin tˈImz. +T Of ˌʌv IN +T the ðə DT +T past pˈæst JJ +T 20 twˈɛnti CD +T Grand ɡɹˈænd NNP +T Slam slˈæm NNP +T drawsheets dɹˈɔʃˌits NNS +T , , , +T they ðA PRP +T have hæv VBP +T been bɪn VBN +T drawn dɹˈɔn VBN +T in ɪn IN +T the ðə DT +T same sˈAm JJ +T half hˈæf NN +T 16 sˌɪkstˈin CD +T times tˈImz NNS +T . . . +S wikitext_heldout_200:149 Stone assigned these individuals to handle his business dealings, find drugs and protect him from those he considered enemies, among them his own bandmates and staff. +P stˈOn əsˈInd ðiz ˌɪndəvˈɪʤəwəlz tə hˈændəl hɪz bˈɪznəs dˈilɪŋz, fˈInd dɹˈʌɡz ænd pɹətˈɛkt hˌɪm fɹʌm ðOz hi kənsˈɪdəɹd ˈɛnəmiz, əmˈʌŋ ðˌɛm hɪz ˈOn bˈændmˌAts ænd stˈæf. +C stˈOn əsˈInd ðiz ˌɪndəvˈɪʤəwəlz tə hˈændəl hɪz bˈɪznəs dˈilɪŋz, fˈInd dɹˈʌɡz ænd pɹətˈɛkt hˌɪm fɹʌm ðOz hi kənsˈɪdəɹd ˈɛnəmiz, əmˈʌŋ ðˌɛm hɪz ˈOn bˈændmˌAts ænd stˈæf. +T Stone stˈOn NN +T assigned əsˈInd VBD +T these ðiz DT +T individuals ˌɪndəvˈɪʤəwəlz NNS +T to tə TO +T handle hˈændəl VB +T his hɪz PRP$ +T business bˈɪznəs NN +T dealings dˈilɪŋz NNS +T , , , +T find fˈInd VB +T drugs dɹˈʌɡz NNS +T and ænd CC +T protect pɹətˈɛkt VB +T him hˌɪm PRP +T from fɹʌm IN +T those ðOz DT +T he hi PRP +T considered kənsˈɪdəɹd VBD +T enemies ˈɛnəmiz NNS +T , , , +T among əmˈʌŋ IN +T them ðˌɛm PRP +T his hɪz PRP$ +T own ˈOn JJ +T bandmates bˈændmˌAts NNS +T and ænd CC +T staff stˈæf NN +T . . . +S wikitext_heldout_200:150 In TNA, he is the manager for former TNA X Division Champion Trevor Lee. +P ɪn tˌiˌɛnˈA, hi ɪz ðə mˈænɪʤəɹ fɔɹ fˈɔɹməɹ tˌiˌɛnˈA ˈɛks dəvˈɪʒən ʧˈæmpiən tɹˈɛvəɹ lˈi. +C ɪn tˌiˌɛnˈA, hi ɪz ðə mˈænɪʤəɹ fɔɹ fˈɔɹməɹ tˌiˌɛnˈA ˈɛks dəvˈɪʒən ʧˈæmpiən tɹˈɛvəɹ lˈi. +T In ɪn IN +T TNA tˌiˌɛnˈA NNP +T , , , +T he hi PRP +T is ɪz VBZ +T the ðə DT +T manager mˈænɪʤəɹ NN +T for fɔɹ IN +T former fˈɔɹməɹ JJ +T TNA tˌiˌɛnˈA NNP +T X ˈɛks NNP +T Division dəvˈɪʒən NNP +T Champion ʧˈæmpiən NNP +T Trevor tɹˈɛvəɹ NNP +T Lee lˈi NNP +T . . . +S wikitext_heldout_200:151 On 21 August, Newland led his company in an assault on a series of trenches slightly north east of the farm. +P ˌɔn twˈɛnti wˈʌn ˈɔɡəst, nˈulənd lˈɛd hɪz kˈʌmpᵊni ɪn ɐn əsˈɔlt ˌɔn ɐ sˈɪɹiz ʌv tɹˈɛnʧᵻz slˈItli nˈɔɹθ ˈist ʌv ðə fˈɑɹm. +C ˌɔn twˈɛnti wˈʌn ˈɔɡəst, nˈulənd lˈɛd hɪz kˈʌmpᵊni ɪn ɐn əsˈɔlt ˌɔn ɐ sˈɪɹiz ʌv tɹˈɛnʧᵻz slˈItli nˈɔɹθ ˈist ʌv ðə fˈɑɹm. +T On ˌɔn IN +T 21 twˈɛnti wˈʌn CD +T August ˈɔɡəst NNP +T , , , +T Newland nˈulənd NNP +T led lˈɛd VBD +T his hɪz PRP$ +T company kˈʌmpᵊni NN +T in ɪn IN +T an ɐn DT +T assault əsˈɔlt NN +T on ˌɔn IN +T a ɐ DT +T series sˈɪɹiz NN +T of ʌv IN +T trenches tɹˈɛnʧᵻz NNS +T slightly slˈItli RB +T north nˈɔɹθ NNP +T east ˈist NNP +T of ʌv IN +T the ðə DT +T farm fˈɑɹm NN +T . . . +S wikitext_heldout_200:152 Anouska Hempel as an Australian girl. +P ˈænWskə hɛmpˈɛl æz ɐn ɔstɹˈAljən ɡˈɜɹl. +C ˈænWskə hɛmpˈɛl æz ɐn ɔstɹˈAljən ɡˈɜɹl. +T Anouska ˈænWskə NNP +T Hempel hɛmpˈɛl NNP +T as æz IN +T an ɐn DT +T Australian ɔstɹˈAljən JJ +T girl ɡˈɜɹl NN +T . . . +S wikitext_heldout_200:153 Sledd died deep in debt, having lost the family home to foreclosure after the salaries of Candler professors were cut when financial support of the school fell during the 1930s. +P slˈɛd dˈId dˈip ɪn dˈɛt, hˈævɪŋ lˈɔst ðə fˈæmᵊli hˈOm tə fˌɔɹklˈOʒəɹ ˈæftəɹ ðə sˈæləɹiz ʌv kˈændləɹ pɹəfˈɛsəɹz wɜɹ kˈʌt wˌɛn fənˈænʃᵊl səpˈɔɹt ʌv ðə skˈul fˈɛl dˈʊɹɪŋ ðə nˌIntˈin θˈɜɹTiz. +C slˈɛd dˈId dˈip ɪn dˈɛt, hˈævɪŋ lˈɔst ðə fˈæmᵊli hˈOm tə fˌɔɹklˈOʒəɹ ˈæftəɹ ðə sˈæləɹiz ʌv kˈændləɹ pɹəfˈɛsəɹz wɜɹ kˈʌt wˌɛn fənˈænʃᵊl səpˈɔɹt ʌv ðə skˈul fˈɛl dˈʊɹɪŋ ðə nˌIntˈin θˈɜɹTiz. +T Sledd slˈɛd NNP +T died dˈId VBD +T deep dˈip RB +T in ɪn IN +T debt dˈɛt NN +T , , , +T having hˈævɪŋ VBG +T lost lˈɔst VBN +T the ðə DT +T family fˈæmᵊli NN +T home hˈOm NN +T to tə TO +T foreclosure fˌɔɹklˈOʒəɹ VB +T after ˈæftəɹ IN +T the ðə DT +T salaries sˈæləɹiz NNS +T of ʌv IN +T Candler kˈændləɹ NNP +T professors pɹəfˈɛsəɹz NNS +T were wɜɹ VBD +T cut kˈʌt VBN +T when wˌɛn WRB +T financial fənˈænʃᵊl JJ +T support səpˈɔɹt NN +T of ʌv IN +T the ðə DT +T school skˈul NN +T fell fˈɛl VBD +T during dˈʊɹɪŋ IN +T the ðə DT +T 1930s nˌIntˈin θˈɜɹTiz NNS +T . . . +S wikitext_heldout_200:154 They found a deserted village, as the St Kildans, fearing pirates, had fled to caves to the west. +P ðˌA fˈWnd ɐ dəzˈɜɹTᵻd vˈɪlɪʤ, æz ðə sənt kɪldˈænz, fˈɪɹɪŋ pˈIɹəts, hæd flˈɛd tə kˈAvz tə ðə wˈɛst. +C ðˌA fˈWnd ɐ dəzˈɜɹTᵻd vˈɪlɪʤ, æz ðə sənt kɪldˈænz, fˈɪɹɪŋ pˈIɹəts, hæd flˈɛd tə kˈAvz tə ðə wˈɛst. +T They ðˌA PRP +T found fˈWnd VBD +T a ɐ DT +T deserted dəzˈɜɹTᵻd JJ +T village vˈɪlɪʤ NN +T , , , +T as æz IN +T the ðə DT +T St sənt NNP +T Kildans kɪldˈænz NNP +T , , , +T fearing fˈɪɹɪŋ VBG +T pirates pˈIɹəts NNS +T , , , +T had hæd VBD +T fled flˈɛd VBN +T to tə IN +T caves kˈAvz NNS +T to tə IN +T the ðə DT +T west wˈɛst NN +T . . . +S wikitext_heldout_200:155 The diver obtains the depth and duration of each stop from a dive computer, decompression tables or dive planning computer software. +P ðə dˈIvəɹ əbtˈAnz ðə dˈɛpθ ænd dʊɹˈAʃən ʌv ˈiʧ stˈɑp fɹʌm ɐ dˈIv kəmpjˈuTəɹ, dˌikəmpɹˈɛʃən tˈAbᵊlz ɔɹ dˈIv plˈænɪŋ kəmpjˈuTəɹ sˈɔftwˌɛɹ. +C ðə dˈIvəɹ əbtˈAnz ðə dˈɛpθ ænd dʊɹˈAʃən ʌv ˈiʧ stˈɑp fɹʌm ɐ dˈIv kəmpjˈuTəɹ, dˌikəmpɹˈɛʃən tˈAbᵊlz ɔɹ dˈIv plˈænɪŋ kəmpjˈuTəɹ sˈɔftwˌɛɹ. +T The ðə DT +T diver dˈIvəɹ NN +T obtains əbtˈAnz VBZ +T the ðə DT +T depth dˈɛpθ NN +T and ænd CC +T duration dʊɹˈAʃən NN +T of ʌv IN +T each ˈiʧ DT +T stop stˈɑp NN +T from fɹʌm IN +T a ɐ DT +T dive dˈIv NN +T computer kəmpjˈuTəɹ NN +T , , , +T decompression dˌikəmpɹˈɛʃən NN +T tables tˈAbᵊlz NNS +T or ɔɹ CC +T dive dˈIv VB +T planning plˈænɪŋ NN +T computer kəmpjˈuTəɹ NN +T software sˈɔftwˌɛɹ NN +T . . . +S wikitext_heldout_200:156 Water pressure unseated the valve and allowed the compartment to flood as the receiving pipe had earlier been removed for repair. +P wˈɔTəɹ pɹˈɛʃəɹ ʌnsˈiTᵻd ðə vˈælv ænd əlˈWd ðə kəmpˈɑɹtmənt tə flˈʌd æz ðə ɹᵻsˈivɪŋ pˈIp hæd ˈɜɹliəɹ bɪn ɹəmˈuvd fɔɹ ɹəpˈɛɹ. +C wˈɔTəɹ pɹˈɛʃəɹ ʌnsˈiTᵻd ðə vˈælv ænd əlˈWd ðə kəmpˈɑɹtmənt tə flˈʌd æz ðə ɹᵻsˈivɪŋ pˈIp hæd ˈɜɹliəɹ bɪn ɹəmˈuvd fɔɹ ɹəpˈɛɹ. +T Water wˈɔTəɹ NN +T pressure pɹˈɛʃəɹ NN +T unseated ʌnsˈiTᵻd VBD +T the ðə DT +T valve vˈælv NN +T and ænd CC +T allowed əlˈWd VBD +T the ðə DT +T compartment kəmpˈɑɹtmənt NN +T to tə TO +T flood flˈʌd VB +T as æz IN +T the ðə DT +T receiving ɹᵻsˈivɪŋ NN +T pipe pˈIp NN +T had hæd VBD +T earlier ˈɜɹliəɹ RBR +T been bɪn VBN +T removed ɹəmˈuvd VBN +T for fɔɹ IN +T repair ɹəpˈɛɹ NN +T . . . +S wikitext_heldout_200:157 After Percy is attacked by a monster which shouldn 't have gotten through the camp's borders, Percy is publicly claimed by his father, the god Poseidon. +P ˈæftəɹ pˈɜɹsi ɪz ətˈækt bI ɐ mˈɑnstəɹ wˌɪʧ ʃˈʊdən t hæv ɡˈɑtn θɹu ðə kˈæmps bˈɔɹdəɹz, pˈɜɹsi ɪz pˈʌbləkli klˈAmd bI hɪz fˈɑðəɹ, ðə ɡˈɑd pəsˈIdᵊn. +C ˈæftəɹ pˈɜɹsi ɪz ətˈækt bI ɐ mˈɑnstəɹ wˌɪʧ ʃˈʊdən t hæv ɡˈɑtn θɹu ðə kˈæmps bˈɔɹdəɹz, pˈɜɹsi ɪz pˈʌbləkli klˈAmd bI hɪz fˈɑðəɹ, ðə ɡˈɑd pəsˈIdᵊn. +T After ˈæftəɹ IN +T Percy pˈɜɹsi NNP +T is ɪz VBZ +T attacked ətˈækt VBN +T by bI IN +T a ɐ DT +T monster mˈɑnstəɹ NN +T which wˌɪʧ WDT +T shouldn ʃˈʊdən NNP +T 't t NNP +T have hæv VBP +T gotten ɡˈɑtn VBN +T through θɹu IN +T the ðə DT +T camp's kˈæmps NN +T borders bˈɔɹdəɹz NNS +T , , , +T Percy pˈɜɹsi NNP +T is ɪz VBZ +T publicly pˈʌbləkli RB +T claimed klˈAmd VBN +T by bI IN +T his hɪz PRP$ +T father fˈɑðəɹ NN +T , , , +T the ðə DT +T god ɡˈɑd NNP +T Poseidon pəsˈIdᵊn NNP +T . . . +S wikitext_heldout_200:158 Congress on bankruptcy law. +P kˈɑŋɡɹəs ˌɔn bˈæŋkɹəptsi lˈɔ. +C kˈɑŋɡɹəs ˌɔn bˈæŋkɹəptsi lˈɔ. +T Congress kˈɑŋɡɹəs NNP +T on ˌɔn IN +T bankruptcy bˈæŋkɹəptsi NN +T law lˈɔ NN +T . . . +S wikitext_heldout_200:159 The Queen's School of Business has received significant recognition in the past years. +P ðə kwˈinz skˈul ʌv bˈɪznəs hæz ɹəsˈivd səɡnˈɪfəkᵊnt ɹˌɛkəɡnˈɪʃən ɪn ðə pˈæst jˈɪɹz. +C ðə kwˈinz skˈul ʌv bˈɪznəs hæz ɹəsˈivd səɡnˈɪfəkᵊnt ɹˌɛkəɡnˈɪʃən ɪn ðə pˈæst jˈɪɹz. +T The ðə DT +T Queen's kwˈinz NNP +T School skˈul NNP +T of ʌv IN +T Business bˈɪznəs NNP +T has hæz VBZ +T received ɹəsˈivd VBN +T significant səɡnˈɪfəkᵊnt JJ +T recognition ɹˌɛkəɡnˈɪʃən NN +T in ɪn IN +T the ðə DT +T past pˈæst JJ +T years jˈɪɹz NNS +T . . . +S wikitext_heldout_200:160 DE 2 was routed to bypass Newark and DE 2 Bus. +P dˌiˈi tˈu wʌz ɹˈuTᵻd tə bˈIpˌæs nˈuwəɹk ænd dˌiˈi tˈu bˈʌs. +C dˌiˈi tˈu wʌz ɹˈuTᵻd tə bˈIpˌæs nˈuwəɹk ænd dˌiˈi tˈu bˈʌs. +T DE dˌiˈi NNP +T 2 tˈu CD +T was wʌz VBD +T routed ɹˈuTᵻd VBN +T to tə IN +T bypass bˈIpˌæs VB +T Newark nˈuwəɹk NNP +T and ænd CC +T DE dˌiˈi NNP +T 2 tˈu NNP +T Bus bˈʌs NNP +T . . . +S wikitext_heldout_200:161 Martha and Clark drive up and catch him as he stumbles to the ground. +P mˈɑɹθə ænd klˈɑɹk dɹˈIv ˌʌp ænd kˈɛʧ hˌɪm æz hi stˈʌmbᵊlz tə ðə ɡɹˈWnd. +C mˈɑɹθə ænd klˈɑɹk dɹˈIv ˌʌp ænd kˈɛʧ hˌɪm æz hi stˈʌmbᵊlz tə ðə ɡɹˈWnd. +T Martha mˈɑɹθə NNP +T and ænd CC +T Clark klˈɑɹk NNP +T drive dɹˈIv VBP +T up ˌʌp RP +T and ænd CC +T catch kˈɛʧ VB +T him hˌɪm PRP +T as æz IN +T he hi PRP +T stumbles stˈʌmbᵊlz VBZ +T to tə IN +T the ðə DT +T ground ɡɹˈWnd NN +T . . . +S wikitext_heldout_200:162 The society ends up before the female mayor who jails all of them, save for Jack who she proposes to. +P ðə səsˈIəTi ˈɛndz ˌʌp bəfˈɔɹ ðə fˈimˌAl mˈAəɹ hˌu ʤˈAlz ˈɔl ʌv ðˌɛm, sˈAv fɔɹ ʤˈæk hˌu ʃi pɹəpˈOzᵻz tu. +C ðə səsˈIəTi ˈɛndz ˌʌp bəfˈɔɹ ðə fˈimˌAl mˈAəɹ hˌu ʤˈAlz ˈɔl ʌv ðˌɛm, sˈAv fɔɹ ʤˈæk hˌu ʃi pɹəpˈOzᵻz tu. +T The ðə DT +T society səsˈIəTi NN +T ends ˈɛndz VBZ +T up ˌʌp RP +T before bəfˈɔɹ IN +T the ðə DT +T female fˈimˌAl JJ +T mayor mˈAəɹ NN +T who hˌu WP +T jails ʤˈAlz VBZ +T all ˈɔl DT +T of ʌv IN +T them ðˌɛm PRP +T , , , +T save sˈAv VB +T for fɔɹ IN +T Jack ʤˈæk NNP +T who hˌu WP +T she ʃi PRP +T proposes pɹəpˈOzᵻz VBZ +T to tu IN +T . . . +S wikitext_heldout_200:163 I 've always felt the best kinds of songs are the ones where anybody can listen to it, put themselves in it and say,'Yeah, that's me.'" +P ˌI vˈi ˈɔlwˌAz fˈɛlt ðə bˈɛst kˈIndz ʌv sˈɔŋz ɑɹ ðə wˈʌnz wˌɛɹ ˈɛnibˌɑdi kæn lˈɪsᵊn tʊ ɪt, pˌʊt ðəmsˈɛlvz ɪn ɪt ænd sˌAjˈɛə, ðˈæts mˌi.”” +C ˌI vˈi ˈɔlwˌAz fˈɛlt ðə bˈɛst kˈIndz ʌv sˈɔŋz ɑɹ ðə wˈʌnz wˌɛɹ ˈɛnibˌɑdi kæn lˈɪsᵊn tʊ ɪt, pˌʊt ðəmsˈɛlvz ɪn ɪt ænd sˌAjˈɛə, ðˈæts mˌi.”” +T I ˌI PRP +T 've vˈi VBP +T always ˈɔlwˌAz RB +T felt fˈɛlt VBN +T the ðə DT +T best bˈɛst JJS +T kinds kˈIndz NNS +T of ʌv IN +T songs sˈɔŋz NNS +T are ɑɹ VBP +T the ðə DT +T ones wˈʌnz NNS +T where wˌɛɹ WRB +T anybody ˈɛnibˌɑdi NN +T can kæn MD +T listen lˈɪsᵊn VB +T to tʊ IN +T it ɪt PRP +T , , , +T put pˌʊt VB +T themselves ðəmsˈɛlvz PRP +T in ɪn IN +T it ɪt PRP +T and ænd CC +T say,Yeah sˌAjˈɛə UH +T , , , +T that's ðˈæts DT +T me mˌi PRP +T . . . +T ' ” '' +T " ” '' +S wikitext_heldout_200:164 The leak and subsequent events in the same match brought varied opinions from journalists and former players on Bodyline into the newspapers, both for and against Bodyline tactics. +P ðə lˈik ænd sˈʌbsəkwənt əvˈɛnts ɪn ðə sˈAm mˈæʧ bɹˈɔt vˈɛɹid əpˈɪnjᵊnz fɹʌm ʤˈɜɹnəlɪsts ænd fˈɔɹməɹ plˈAəɹz ˌɔn bˈɑdɪlˌIn ˈɪntu ðə nˈuzpˌApəɹz, bˈOθ fɔɹ ænd əɡˈɛnst bˈɑdɪlˌIn tˈæktɪks. +C ðə lˈik ænd sˈʌbsəkwənt əvˈɛnts ɪn ðə sˈAm mˈæʧ bɹˈɔt vˈɛɹid əpˈɪnjᵊnz fɹʌm ʤˈɜɹnəlɪsts ænd fˈɔɹməɹ plˈAəɹz ˌɔn bˈɑdɪlˌIn ˈɪntu ðə nˈuzpˌApəɹz, bˈOθ fɔɹ ænd əɡˈɛnst bˈɑdɪlˌIn tˈæktɪks. +T The ðə DT +T leak lˈik NN +T and ænd CC +T subsequent sˈʌbsəkwənt JJ +T events əvˈɛnts NNS +T in ɪn IN +T the ðə DT +T same sˈAm JJ +T match mˈæʧ NN +T brought bɹˈɔt VBD +T varied vˈɛɹid JJ +T opinions əpˈɪnjᵊnz NNS +T from fɹʌm IN +T journalists ʤˈɜɹnəlɪsts NNS +T and ænd CC +T former fˈɔɹməɹ JJ +T players plˈAəɹz NNS +T on ˌɔn IN +T Bodyline bˈɑdɪlˌIn NNP +T into ˈɪntu IN +T the ðə DT +T newspapers nˈuzpˌApəɹz NNS +T , , , +T both bˈOθ CC +T for fɔɹ IN +T and ænd CC +T against əɡˈɛnst IN +T Bodyline bˈɑdɪlˌIn NNP +T tactics tˈæktɪks NNS +T . . . +S wikitext_heldout_200:165 According to court testimony, the defendant in speaking made a gesture of sighting down the barrel of a rifle. +P əkˈɔɹdɪŋ tə kˈɔɹt tˈɛstəmˌOni, ðə dəfˈɛndᵊnt ɪn spˈikɪŋ mˌAd ɐ ʤˈɛsʧəɹ ʌv sˈITɪŋ dˌWn ðə bˈɛɹəl ʌv ɐ ɹˈIfᵊl. +C əkˈɔɹdɪŋ tə kˈɔɹt tˈɛstəmˌOni, ðə dəfˈɛndᵊnt ɪn spˈikɪŋ mˌAd ɐ ʤˈɛsʧəɹ ʌv sˈITɪŋ dˌWn ðə bˈɛɹəl ʌv ɐ ɹˈIfᵊl. +T According əkˈɔɹdɪŋ VBG +T to tə IN +T court kˈɔɹt NN +T testimony tˈɛstəmˌOni NN +T , , , +T the ðə DT +T defendant dəfˈɛndᵊnt NN +T in ɪn IN +T speaking spˈikɪŋ VBG +T made mˌAd VBD +T a ɐ DT +T gesture ʤˈɛsʧəɹ NN +T of ʌv IN +T sighting sˈITɪŋ VBG +T down dˌWn RP +T the ðə DT +T barrel bˈɛɹəl NN +T of ʌv IN +T a ɐ DT +T rifle ɹˈIfᵊl NN +T . . . +S wikitext_heldout_200:166 Although Kublai would not forget this slight of imprisoning his ambassadors, he nonetheless had to focus on more pressing affairs with the threat of his brother and rival Khan. +P ɔlðˈO kˈʌblI wʊd nˌɑt fəɹɡˈɛt ðɪs slˈIt ʌv ɪmpɹˈɪzənɪŋ hɪz æmbˈæsədəɹz, hi nˌʌnðəlˈɛs hæd tə fˈOkəs ˌɔn mˈɔɹ pɹˈɛsɪŋ əfˈɛɹz wɪð ðə θɹˈɛt ʌv hɪz bɹˈʌðəɹ ænd ɹˈIvᵊl kˈɑn. +C ɔlðˈO kˈʌblI wʊd nˌɑt fəɹɡˈɛt ðɪs slˈIt ʌv ɪmpɹˈɪzənɪŋ hɪz æmbˈæsədəɹz, hi nˌʌnðəlˈɛs hæd tə fˈOkəs ˌɔn mˈɔɹ pɹˈɛsɪŋ əfˈɛɹz wɪð ðə θɹˈɛt ʌv hɪz bɹˈʌðəɹ ænd ɹˈIvᵊl kˈɑn. +T Although ɔlðˈO IN +T Kublai kˈʌblI NNP +T would wʊd MD +T not nˌɑt RB +T forget fəɹɡˈɛt VB +T this ðɪs DT +T slight slˈIt NN +T of ʌv IN +T imprisoning ɪmpɹˈɪzənɪŋ VBG +T his hɪz PRP$ +T ambassadors æmbˈæsədəɹz NNS +T , , , +T he hi PRP +T nonetheless nˌʌnðəlˈɛs RB +T had hæd VBD +T to tə TO +T focus fˈOkəs VB +T on ˌɔn IN +T more mˈɔɹ RBR +T pressing pɹˈɛsɪŋ JJ +T affairs əfˈɛɹz NNS +T with wɪð IN +T the ðə DT +T threat θɹˈɛt NN +T of ʌv IN +T his hɪz PRP$ +T brother bɹˈʌðəɹ NN +T and ænd CC +T rival ɹˈIvᵊl JJ +T Khan kˈɑn NNP +T . . . +S wikitext_heldout_200:167 Credits adapted from the liner notes of Rated R, Def Jam Recordings, SRP. +P kɹˈɛdəts ədˈæptᵻd fɹʌm ðə lˈInəɹ nˈOts ʌv ɹˈATᵻd ˈɑɹ, dˈɛf ʤˈæm ɹəkˈɔɹdɪŋz, ˌɛsˌɑɹpˈi. +C kɹˈɛdəts ədˈæptᵻd fɹʌm ðə lˈInəɹ nˈOts ʌv ɹˈATᵻd ˈɑɹ, dˈɛf ʤˈæm ɹəkˈɔɹdɪŋz, ˌɛsˌɑɹpˈi. +T Credits kɹˈɛdəts NNS +T adapted ədˈæptᵻd VBD +T from fɹʌm IN +T the ðə DT +T liner lˈInəɹ NN +T notes nˈOts NNS +T of ʌv IN +T Rated ɹˈATᵻd NNP +T R ˈɑɹ NNP +T , , , +T Def dˈɛf NNP +T Jam ʤˈæm NNP +T Recordings ɹəkˈɔɹdɪŋz NNP +T , , , +T SRP ˌɛsˌɑɹpˈi NNP +T . . . +S wikitext_heldout_200:168 In 1970, American paddlefish were stocked in several rivers in Europe and Asia. +P ɪn nˌIntˈin sˈɛvənti, əmˈɛɹəkᵊn pˈædᵊlfˌɪʃ wɜɹ stˈɑkt ɪn sˈɛvəɹəl ɹˈɪvəɹz ɪn jˈʊɹəp ænd ˈAʒə. +C ɪn nˌIntˈin sˈɛvənti, əmˈɛɹəkᵊn pˈædᵊlfˌɪʃ wɜɹ stˈɑkt ɪn sˈɛvəɹəl ɹˈɪvəɹz ɪn jˈʊɹəp ænd ˈAʒə. +T In ɪn IN +T 1970 nˌIntˈin sˈɛvənti CD +T , , , +T American əmˈɛɹəkᵊn JJ +T paddlefish pˈædᵊlfˌɪʃ NN +T were wɜɹ VBD +T stocked stˈɑkt VBN +T in ɪn IN +T several sˈɛvəɹəl JJ +T rivers ɹˈɪvəɹz NNS +T in ɪn IN +T Europe jˈʊɹəp NNP +T and ænd CC +T Asia ˈAʒə NNP +T . . . +S wikitext_heldout_200:169 It's a race, I 'm here to win and so I approach it the same. +P ˌɪts ɐ ɹˈAs, ˌI m hˈɪɹ tə wˈɪn ænd sˌO ˌI əpɹˈOʧ ɪt ðə sˈAm. +C ˌɪts ɐ ɹˈAs, ˌI m hˈɪɹ tə wˈɪn ænd sˌO ˌI əpɹˈOʧ ɪt ðə sˈAm. +T It's ˌɪts PRP +T a ɐ DT +T race ɹˈAs NN +T , , , +T I ˌI PRP +T 'm m VBP +T here hˈɪɹ RB +T to tə TO +T win wˈɪn VB +T and ænd CC +T so sˌO RB +T I ˌI PRP +T approach əpɹˈOʧ VBP +T it ɪt PRP +T the ðə DT +T same sˈAm JJ +T . . . +S wikitext_heldout_200:170 She was hit twice in return, however; the first hit caused minimal damage, but the second struck her third funnel. +P ʃˌi wʌz hˈɪt twˈIs ɪn ɹətˈɜɹn, hWˈɛvəɹ; ðə fˈɜɹst hˈɪt kˈɔzd mˈɪnəmᵊl dˈæmɪʤ, bˌʌt ðə sˈɛkənd stɹˈʌk hɜɹ θˈɜɹd fˈʌnᵊl. +C ʃˌi wʌz hˈɪt twˈIs ɪn ɹətˈɜɹn, hWˈɛvəɹ; ðə fˈɜɹst hˈɪt kˈɔzd mˈɪnəmᵊl dˈæmɪʤ, bˌʌt ðə sˈɛkənd stɹˈʌk hɜɹ θˈɜɹd fˈʌnᵊl. +T She ʃˌi PRP +T was wʌz VBD +T hit hˈɪt VBN +T twice twˈIs RB +T in ɪn IN +T return ɹətˈɜɹn NN +T , , , +T however hWˈɛvəɹ RB +T ; ; : +T the ðə DT +T first fˈɜɹst JJ +T hit hˈɪt NN +T caused kˈɔzd VBD +T minimal mˈɪnəmᵊl JJ +T damage dˈæmɪʤ NN +T , , , +T but bˌʌt CC +T the ðə DT +T second sˈɛkənd JJ +T struck stɹˈʌk VBD +T her hɜɹ PRP$ +T third θˈɜɹd JJ +T funnel fˈʌnᵊl NN +T . . . +S wikitext_heldout_200:171 The launch track is equipped with retractable magnetic braking fins which are raised after the train is launched in order to slow one that did not crest the hill. +P ðə lˈɔnʧ tɹˈæk ɪz əkwˈɪpt wɪð ɹətɹˈæktəbᵊl mæɡnˈɛTɪk bɹˈAkɪŋ fˈɪnz wˌɪʧ ɑɹ ɹˈAzd ˈæftəɹ ðə tɹˈAn ɪz lˈɔnʧt ɪn ˈɔɹdəɹ tə slˈO wˈʌn ðæt dˈɪd nˌɑt kɹˈɛst ðə hˈɪl. +C ðə lˈɔnʧ tɹˈæk ɪz əkwˈɪpt wɪð ɹətɹˈæktəbᵊl mæɡnˈɛTɪk bɹˈAkɪŋ fˈɪnz wˌɪʧ ɑɹ ɹˈAzd ˈæftəɹ ðə tɹˈAn ɪz lˈɔnʧt ɪn ˈɔɹdəɹ tə slˈO wˈʌn ðæt dˈɪd nˌɑt kɹˈɛst ðə hˈɪl. +T The ðə DT +T launch lˈɔnʧ NN +T track tɹˈæk NN +T is ɪz VBZ +T equipped əkwˈɪpt VBN +T with wɪð IN +T retractable ɹətɹˈæktəbᵊl JJ +T magnetic mæɡnˈɛTɪk JJ +T braking bɹˈAkɪŋ VBG +T fins fˈɪnz NNS +T which wˌɪʧ WDT +T are ɑɹ VBP +T raised ɹˈAzd VBN +T after ˈæftəɹ IN +T the ðə DT +T train tɹˈAn NN +T is ɪz VBZ +T launched lˈɔnʧt VBN +T in ɪn IN +T order ˈɔɹdəɹ NN +T to tə TO +T slow slˈO VB +T one wˈʌn NN +T that ðæt WDT +T did dˈɪd VBD +T not nˌɑt RB +T crest kɹˈɛst VB +T the ðə DT +T hill hˈɪl NN +T . . . +S wikitext_heldout_200:172 Although Lady Penelope and Parker (the latter voiced by Graham) were among the first characters developed, neither was conceived as a major role. +P ɔlðˈO lˈAdi pənˈɛləpi ænd pˈɑɹkəɹ (ðə lˈæTəɹ vˈYst bI ɡɹˈæm) wɜɹ əmˈʌŋ ðə fˈɜɹst kˈɛɹəktəɹz dəvˈɛləpt, nˈiðəɹ wʌz kənsˈivd æz ɐ mˈAʤəɹ ɹˈOl. +C ɔlðˈO lˈAdi pənˈɛləpi ænd pˈɑɹkəɹ (ðə lˈæTəɹ vˈYst bI ɡɹˈæm) wɜɹ əmˈʌŋ ðə fˈɜɹst kˈɛɹəktəɹz dəvˈɛləpt, nˈiðəɹ wʌz kənsˈivd æz ɐ mˈAʤəɹ ɹˈOl. +T Although ɔlðˈO IN +T Lady lˈAdi NNP +T Penelope pənˈɛləpi NNP +T and ænd CC +T Parker pˈɑɹkəɹ NNP +T ( ( -LRB- +T the ðə DT +T latter lˈæTəɹ JJ +T voiced vˈYst VBN +T by bI IN +T Graham ɡɹˈæm NNP +T ) ) -RRB- +T were wɜɹ VBD +T among əmˈʌŋ IN +T the ðə DT +T first fˈɜɹst JJ +T characters kˈɛɹəktəɹz NNS +T developed dəvˈɛləpt VBN +T , , , +T neither nˈiðəɹ DT +T was wʌz VBD +T conceived kənsˈivd VBN +T as æz IN +T a ɐ DT +T major mˈAʤəɹ JJ +T role ɹˈOl NN +T . . . +S wikitext_heldout_200:173 After ten years, clearly struggling with his conscience, Wooden Leg resigned the post, but was later persuaded to take it on again by a new Indian agent. +P ˈæftəɹ tˈɛn jˈɪɹz, klˈɪɹli stɹˈʌɡᵊlɪŋ wɪð hɪz kˈɑnʃəns, wˈʊdᵊn lˈɛɡ ɹəzˈInd ðə pˈOst, bˌʌt wʌz lˈATəɹ pəɹswˈAdᵻd tə tˈAk ɪt ˌɔn əɡˈɛn bI ɐ nˈu ˈɪndiən ˈAʤᵊnt. +C ˈæftəɹ tˈɛn jˈɪɹz, klˈɪɹli stɹˈʌɡᵊlɪŋ wɪð hɪz kˈɑnʃəns, wˈʊdᵊn lˈɛɡ ɹəzˈInd ðə pˈOst, bˌʌt wʌz lˈATəɹ pəɹswˈAdᵻd tə tˈAk ɪt ˌɔn əɡˈɛn bI ɐ nˈu ˈɪndiən ˈAʤᵊnt. +T After ˈæftəɹ IN +T ten tˈɛn CD +T years jˈɪɹz NNS +T , , , +T clearly klˈɪɹli RB +T struggling stɹˈʌɡᵊlɪŋ VBG +T with wɪð IN +T his hɪz PRP$ +T conscience kˈɑnʃəns NN +T , , , +T Wooden wˈʊdᵊn NNP +T Leg lˈɛɡ NNP +T resigned ɹəzˈInd VBD +T the ðə DT +T post pˈOst NN +T , , , +T but bˌʌt CC +T was wʌz VBD +T later lˈATəɹ RB +T persuaded pəɹswˈAdᵻd VBN +T to tə TO +T take tˈAk VB +T it ɪt PRP +T on ˌɔn RP +T again əɡˈɛn RB +T by bI IN +T a ɐ DT +T new nˈu JJ +T Indian ˈɪndiən JJ +T agent ˈAʤᵊnt NN +T . . . +S wikitext_heldout_200:174 During the dance, Grey and Shepherd escape Dandridge and Montgomery to have a heated argument that leads to sexual intercourse. +P dˈʊɹɪŋ ðə dˈæns, ɡɹˈA ænd ʃˈɛpəɹd əskˈAp dˈændɹɪʤ ænd məntɡˈʌməɹi tə hæv ɐ hˈiTᵻd ˈɑɹɡjəmənt ðæt lˈidz tə sˈɛkʃəwəl ˈɪntəɹkˌɔɹs. +C dˈʊɹɪŋ ðə dˈæns, ɡɹˈA ænd ʃˈɛpəɹd əskˈAp dˈændɹɪʤ ænd məntɡˈʌməɹi tə hæv ɐ hˈiTᵻd ˈɑɹɡjəmənt ðæt lˈidz tə sˈɛkʃəwəl ˈɪntəɹkˌɔɹs. +T During dˈʊɹɪŋ IN +T the ðə DT +T dance dˈæns NN +T , , , +T Grey ɡɹˈA NNP +T and ænd CC +T Shepherd ʃˈɛpəɹd NNP +T escape əskˈAp VB +T Dandridge dˈændɹɪʤ NNP +T and ænd CC +T Montgomery məntɡˈʌməɹi NNP +T to tə TO +T have hæv VB +T a ɐ DT +T heated hˈiTᵻd JJ +T argument ˈɑɹɡjəmənt NN +T that ðæt WDT +T leads lˈidz VBZ +T to tə IN +T sexual sˈɛkʃəwəl JJ +T intercourse ˈɪntəɹkˌɔɹs NN +T . . . +S wikitext_heldout_200:175 Meanwhile, the other Huaorani warriors, led by Gikita, attacked the three missionaries still on the beach, spearing Saint first, then McCully as he rushed to stop them. +P mˈinhwˌIl, ði ˈʌðəɹ hjˌuAˈɔɹˈɑni wˈɔɹiəɹz, lˈɛd bI ʤɪkˈiTə, ətˈækt ðə θɹˈi mˈɪʃənˌɛɹiz stˈɪl ˌɔn ðə bˈiʧ, spˈɪɹɪŋ sˈAnt fˈɜɹst, ðˈɛn mə kˈʌli æz hi ɹˈʌʃt tə stˈɑp ðˌɛm. +C mˈinhwˌIl, ði ˈʌðəɹ hjˌuAˈɔɹˈɑni wˈɔɹiəɹz, lˈɛd bI ʤɪkˈiTə, ətˈækt ðə θɹˈi mˈɪʃənˌɛɹiz stˈɪl ˌɔn ðə bˈiʧ, spˈɪɹɪŋ sˈAnt fˈɜɹst, ðˈɛn mə kˈʌli æz hi ɹˈʌʃt tə stˈɑp ðˌɛm. +T Meanwhile mˈinhwˌIl RB +T , , , +T the ði DT +T other ˈʌðəɹ JJ +T Huaorani hjˌuAˈɔɹˈɑni NNP +T warriors wˈɔɹiəɹz NNS +T , , , +T led lˈɛd VBN +T by bI IN +T Gikita ʤɪkˈiTə NNP +T , , , +T attacked ətˈækt VBD +T the ðə DT +T three θɹˈi CD +T missionaries mˈɪʃənˌɛɹiz NNS +T still stˈɪl RB +T on ˌɔn IN +T the ðə DT +T beach bˈiʧ NN +T , , , +T spearing spˈɪɹɪŋ VBG +T Saint sˈAnt NNP +T first fˈɜɹst RB +T , , , +T then ðˈɛn RB +T McCully mə kˈʌli RB +T as æz IN +T he hi PRP +T rushed ɹˈʌʃt VBD +T to tə TO +T stop stˈɑp VB +T them ðˌɛm PRP +T . . . +S wikitext_heldout_200:176 The military band began to play the Victorian hymn " My Faith Looks Up to Thee " as the Reagan children said their goodbyes. +P ðə mˈɪlətˌɛɹi bˈænd bəɡˈæn tə plˈA ðə vɪktˈɔɹiən hˈɪm “ mˌI fˈAθ lˈʊks ˌʌp tə ðˌi ” æz ðə ɹˈAɡən ʧˈɪldɹᵊn sˈɛd ðɛɹ ɡʊdbˈIz. +C ðə mˈɪlətˌɛɹi bˈænd bəɡˈæn tə plˈA ðə vɪktˈɔɹiən hˈɪm “ mˌI fˈAθ lˈʊks ˌʌp tə ðˌi ” æz ðə ɹˈAɡən ʧˈɪldɹᵊn sˈɛd ðɛɹ ɡʊdbˈIz. +T The ðə DT +T military mˈɪlətˌɛɹi JJ +T band bˈænd NN +T began bəɡˈæn VBD +T to tə TO +T play plˈA VB +T the ðə DT +T Victorian vɪktˈɔɹiən JJ +T hymn hˈɪm NN +T " “ `` +T My mˌI PRP$ +T Faith fˈAθ NN +T Looks lˈʊks VBZ +T Up ˌʌp IN +T to tə IN +T Thee ðˌi NNP +T " ” '' +T as æz IN +T the ðə DT +T Reagan ɹˈAɡən NNP +T children ʧˈɪldɹᵊn NNS +T said sˈɛd VBD +T their ðɛɹ PRP$ +T goodbyes ɡʊdbˈIz NNS +T . . . +S wikitext_heldout_200:177 Following the divorce, Jackson would go on to have a third child. +P fˈɑlOɪŋ ðə dəvˈɔɹs, ʤˈæksᵊn wʊd ɡˌO ˌɔn tə hæv ɐ θˈɜɹd ʧˈIld. +C fˈɑlOɪŋ ðə dəvˈɔɹs, ʤˈæksᵊn wʊd ɡˌO ˌɔn tə hæv ɐ θˈɜɹd ʧˈIld. +T Following fˈɑlOɪŋ VBG +T the ðə DT +T divorce dəvˈɔɹs NN +T , , , +T Jackson ʤˈæksᵊn NNP +T would wʊd MD +T go ɡˌO VB +T on ˌɔn RP +T to tə TO +T have hæv VB +T a ɐ DT +T third θˈɜɹd JJ +T child ʧˈIld NN +T . . . +S wikitext_heldout_200:178 Fluor Corporation is a multinational engineering and construction firm headquartered in Irving, Texas. +P flˈʊɹ kˌɔɹpəɹˈAʃən ɪz ɐ mˌʌltinˈæʃənᵊl ˌɛnʤənˈɪɹɪŋ ænd kənstɹˈʌkʃən fˈɜɹm hˈɛdkwˌɔɹTəɹd ɪn ˈɜɹvɪŋ, tˈɛksəs. +C flˈʊɹ kˌɔɹpəɹˈAʃən ɪz ɐ mˌʌltinˈæʃənᵊl ˌɛnʤənˈɪɹɪŋ ænd kənstɹˈʌkʃən fˈɜɹm hˈɛdkwˌɔɹTəɹd ɪn ˈɜɹvɪŋ, tˈɛksəs. +T Fluor flˈʊɹ NNP +T Corporation kˌɔɹpəɹˈAʃən NNP +T is ɪz VBZ +T a ɐ DT +T multinational mˌʌltinˈæʃənᵊl JJ +T engineering ˌɛnʤənˈɪɹɪŋ NN +T and ænd CC +T construction kənstɹˈʌkʃən NN +T firm fˈɜɹm NN +T headquartered hˈɛdkwˌɔɹTəɹd VBN +T in ɪn IN +T Irving ˈɜɹvɪŋ NNP +T , , , +T Texas tˈɛksəs NNP +T . . . +S wikitext_heldout_200:179 The following credits are from AllMusic and from the Romance liner notes: +P ðə fˈɑlOɪŋ kɹˈɛdəts ɑɹ fɹʌm ˌɔlmjˈuzɪk ænd fɹʌm ðə ɹOmˈæns lˈInəɹ nˈOts: +C ðə fˈɑlOɪŋ kɹˈɛdəts ɑɹ fɹʌm ˌɔlmjˈuzɪk ænd fɹʌm ðə ɹOmˈæns lˈInəɹ nˈOts: +T The ðə DT +T following fˈɑlOɪŋ VBG +T credits kɹˈɛdəts NNS +T are ɑɹ VBP +T from fɹʌm IN +T AllMusic ˌɔlmjˈuzɪk NNP +T and ænd CC +T from fɹʌm IN +T the ðə DT +T Romance ɹOmˈæns NNP +T liner lˈInəɹ NN +T notes nˈOts VBZ +T : : : +S wikitext_heldout_200:180 The Somerset Miners'Association was founded in 1872, later becoming an area of the National Union of Mineworkers. +P ðə sˈʌməsˌɛt mˌInəɹsˌæsOsɪˈAʃən wʌz fˈWndᵻd ɪn ˌAtˈin sˈɛvənti tˈu, lˈATəɹ bəkˈʌmɪŋ ɐn ˈɛɹiə ʌv ðə nˈæʃənᵊl jˈunjən ʌv mˈInwˌɜɹkəɹz. +C ðə sˈʌməsˌɛt mˌInəɹsˌæsOsɪˈAʃən wʌz fˈWndᵻd ɪn ˌAtˈin sˈɛvənti tˈu, lˈATəɹ bəkˈʌmɪŋ ɐn ˈɛɹiə ʌv ðə nˈæʃənᵊl jˈunjən ʌv mˈInwˌɜɹkəɹz. +T The ðə DT +T Somerset sˈʌməsˌɛt NNP +T Miners'Association mˌInəɹsˌæsOsɪˈAʃən NN +T was wʌz VBD +T founded fˈWndᵻd VBN +T in ɪn IN +T 1872 ˌAtˈin sˈɛvənti tˈu CD +T , , , +T later lˈATəɹ RB +T becoming bəkˈʌmɪŋ VBG +T an ɐn DT +T area ˈɛɹiə NN +T of ʌv IN +T the ðə DT +T National nˈæʃənᵊl NNP +T Union jˈunjən NNP +T of ʌv IN +T Mineworkers mˈInwˌɜɹkəɹz NNPS +T . . . +S wikitext_heldout_200:181 The name Chataan means " rainy day " in the Chamorro language, which is spoken on Guam. +P ðə nˈAm ʧˈætɑn mˈinz “ ɹˈAni dˈA ” ɪn ðə ʧəmˈɔɹO lˈæŋɡwɪʤ, wˌɪʧ ɪz spˈOkən ˌɔn ɡwˈɑm. +C ðə nˈAm ʧˈætɑn mˈinz “ ɹˈAni dˈA ” ɪn ðə ʧəmˈɔɹO lˈæŋɡwɪʤ, wˌɪʧ ɪz spˈOkən ˌɔn ɡwˈɑm. +T The ðə DT +T name nˈAm NN +T Chataan ʧˈætɑn NNP +T means mˈinz VBZ +T " “ `` +T rainy ɹˈAni JJ +T day dˈA NN +T " ” '' +T in ɪn IN +T the ðə DT +T Chamorro ʧəmˈɔɹO NNP +T language lˈæŋɡwɪʤ NN +T , , , +T which wˌɪʧ WDT +T is ɪz VBZ +T spoken spˈOkən VBN +T on ˌɔn IN +T Guam ɡwˈɑm NNP +T . . . +S wikitext_heldout_200:182 The family home is now a museum. +P ðə fˈæmᵊli hˈOm ɪz nˈW ɐ mjuzˈiəm. +C ðə fˈæmᵊli hˈOm ɪz nˈW ɐ mjuzˈiəm. +T The ðə DT +T family fˈæmᵊli NN +T home hˈOm NN +T is ɪz VBZ +T now nˈW RB +T a ɐ DT +T museum mjuzˈiəm NN +T . . . +S wikitext_heldout_200:183 She reveals her errand, Kep sees through the fox's plan at once, and finds out from Jemima where the fox lives. +P ʃˌi ɹəvˈilz hɜɹ ˈɛɹənd, kˈɛp sˈiz θɹu ðə fˈɑksᵻz plˈæn æt wˈʌns, ænd fˈIndz ˈWt fɹʌm ʤˈɛmɪmə wˌɛɹ ðə fˈɑks lˈɪvz. +C ʃˌi ɹəvˈilz hɜɹ ˈɛɹənd, kˈɛp sˈiz θɹu ðə fˈɑksᵻz plˈæn æt wˈʌns, ænd fˈIndz ˈWt fɹʌm ʤˈɛmɪmə wˌɛɹ ðə fˈɑks lˈɪvz. +T She ʃˌi PRP +T reveals ɹəvˈilz VBZ +T her hɜɹ PRP$ +T errand ˈɛɹənd NN +T , , , +T Kep kˈɛp NNP +T sees sˈiz VBZ +T through θɹu IN +T the ðə DT +T fox's fˈɑksᵻz NN +T plan plˈæn NN +T at æt IN +T once wˈʌns RB +T , , , +T and ænd CC +T finds fˈIndz VBZ +T out ˈWt RP +T from fɹʌm IN +T Jemima ʤˈɛmɪmə NNP +T where wˌɛɹ WRB +T the ðə DT +T fox fˈɑks NN +T lives lˈɪvz VBZ +T . . . +S wikitext_heldout_200:184 The Bible is central in Zwingli's work as a reformer and is crucial in the development of his theology. +P ðə bˈIbᵊl ɪz sˈɛntɹəl ɪn zwˈɪŋɡliz wˈɜɹk æz ɐ ɹəfˈɔɹməɹ ænd ɪz kɹˈuʃᵊl ɪn ðə dəvˈɛləpmənt ʌv hɪz θiˈɑləʤi. +C ðə bˈIbᵊl ɪz sˈɛntɹəl ɪn zwˈɪŋɡliz wˈɜɹk æz ɐ ɹəfˈɔɹməɹ ænd ɪz kɹˈuʃᵊl ɪn ðə dəvˈɛləpmənt ʌv hɪz θiˈɑləʤi. +T The ðə DT +T Bible bˈIbᵊl NNP +T is ɪz VBZ +T central sˈɛntɹəl JJ +T in ɪn IN +T Zwingli's zwˈɪŋɡliz NNP +T work wˈɜɹk NN +T as æz IN +T a ɐ DT +T reformer ɹəfˈɔɹməɹ NN +T and ænd CC +T is ɪz VBZ +T crucial kɹˈuʃᵊl JJ +T in ɪn IN +T the ðə DT +T development dəvˈɛləpmənt NN +T of ʌv IN +T his hɪz PRP$ +T theology θiˈɑləʤi NN +T . . . +S wikitext_heldout_200:185 The classification of Deinocheirus was long uncertain, and it was initially placed in the theropod group carnosauria, but similarities with ornithomimosaurians were soon noted. +P ðə klˌæsəfəkˈAʃən ʌv dˈAnəʧˌɛɹəs wʌz lˈɔŋ ˌʌnsˈɜɹtn, ænd ɪt wʌz ɪnˈɪʃᵊli plˈAst ɪn ðə θˈɪɹəpˌɑd ɡɹˈup kˌɑɹnəsˈɔɹiə, bˌʌt sˌɪməlˈɛɹəTiz wɪð ˌɔɹnɪθˌɑmɪməsˈɔɹiənz wɜɹ sˈun nˈOTᵻd. +C ðə klˌæsəfəkˈAʃən ʌv dˈAnəʧˌɛɹəs wʌz lˈɔŋ ˌʌnsˈɜɹtn, ænd ɪt wʌz ɪnˈɪʃᵊli plˈAst ɪn ðə θˈɪɹəpˌɑd ɡɹˈup kˌɑɹnəsˈɔɹiə, bˌʌt sˌɪməlˈɛɹəTiz wɪð ˌɔɹnɪθˌɑmɪməsˈɔɹiənz wɜɹ sˈun nˈOTᵻd. +T The ðə DT +T classification klˌæsəfəkˈAʃən NN +T of ʌv IN +T Deinocheirus dˈAnəʧˌɛɹəs NNP +T was wʌz VBD +T long lˈɔŋ RB +T uncertain ˌʌnsˈɜɹtn JJ +T , , , +T and ænd CC +T it ɪt PRP +T was wʌz VBD +T initially ɪnˈɪʃᵊli RB +T placed plˈAst VBN +T in ɪn IN +T the ðə DT +T theropod θˈɪɹəpˌɑd JJ +T group ɡɹˈup NN +T carnosauria kˌɑɹnəsˈɔɹiə NNP +T , , , +T but bˌʌt CC +T similarities sˌɪməlˈɛɹəTiz NNS +T with wɪð IN +T ornithomimosaurians ˌɔɹnɪθˌɑmɪməsˈɔɹiənz NNS +T were wɜɹ VBD +T soon sˈun RB +T noted nˈOTᵻd VBN +T . . . +S wikitext_heldout_200:186 You 've seen a lot of people die. +P jˌu vˈi sˈin ɐ lˈɑt ʌv pˈipᵊl dˈI. +C jˌu vˈi sˈin ɐ lˈɑt ʌv pˈipᵊl dˈI. +T You jˌu PRP +T 've vˈi VBP +T seen sˈin VBN +T a ɐ DT +T lot lˈɑt NN +T of ʌv IN +T people pˈipᵊl NNS +T die dˈI VBP +T . . . +S wikitext_heldout_200:187 With the Army of the Potomac in disarray and the Confederates on the offensive, an attack on Washington was expected at any moment. +P wˌɪð ði ˈɑɹmi ʌv ðə pətˈOmək ɪn dˌɪsəɹˈA ænd ðə kənfˈɛdəɹəts ˌɔn ði əfˈɛnsɪv, ɐn ətˈæk ˌɔn wˈɔʃɪŋtən wʌz ɪkspˈɛktᵻd æt ˈɛni mˈOmᵊnt. +C wˌɪð ði ˈɑɹmi ʌv ðə pətˈOmək ɪn dˌɪsəɹˈA ænd ðə kənfˈɛdəɹəts ˌɔn ði əfˈɛnsɪv, ɐn ətˈæk ˌɔn wˈɔʃɪŋtən wʌz ɪkspˈɛktᵻd æt ˈɛni mˈOmᵊnt. +T With wˌɪð IN +T the ði DT +T Army ˈɑɹmi NNP +T of ʌv IN +T the ðə DT +T Potomac pətˈOmək NNP +T in ɪn IN +T disarray dˌɪsəɹˈA NN +T and ænd CC +T the ðə DT +T Confederates kənfˈɛdəɹəts NNPS +T on ˌɔn IN +T the ði DT +T offensive əfˈɛnsɪv NN +T , , , +T an ɐn DT +T attack ətˈæk NN +T on ˌɔn IN +T Washington wˈɔʃɪŋtən NNP +T was wʌz VBD +T expected ɪkspˈɛktᵻd VBN +T at æt IN +T any ˈɛni DT +T moment mˈOmᵊnt NN +T . . . +S wikitext_heldout_200:188 On one hand, due to a less specialized design, an OBO suffers more from wear and tear during dry cargo onload than a bulker. +P ˌɔn wˈʌn hˈænd, dˈu tə ɐ lˈɛs spˈɛʃəlˌIzd dəzˈIn, ɐn ˌObˌiˈO sˈʌfəɹz mˈɔɹ fɹʌm wˈɛɹ ænd tˈɛɹ dˈʊɹɪŋ dɹˈI kˈɑɹɡO ˌɔnlˈOd ðən ɐ bˈʌlkəɹ. +C ˌɔn wˈʌn hˈænd, dˈu tə ɐ lˈɛs spˈɛʃəlˌIzd dəzˈIn, ɐn ˌObˌiˈO sˈʌfəɹz mˈɔɹ fɹʌm wˈɛɹ ænd tˈɛɹ dˈʊɹɪŋ dɹˈI kˈɑɹɡO ˌɔnlˈOd ðən ɐ bˈʌlkəɹ. +T On ˌɔn IN +T one wˈʌn CD +T hand hˈænd NN +T , , , +T due dˈu IN +T to tə IN +T a ɐ DT +T less lˈɛs RBR +T specialized spˈɛʃəlˌIzd JJ +T design dəzˈIn NN +T , , , +T an ɐn DT +T OBO ˌObˌiˈO NN +T suffers sˈʌfəɹz VBZ +T more mˈɔɹ RBR +T from fɹʌm IN +T wear wˈɛɹ NN +T and ænd CC +T tear tˈɛɹ VB +T during dˈʊɹɪŋ IN +T dry dɹˈI JJ +T cargo kˈɑɹɡO NN +T onload ˌɔnlˈOd NN +T than ðən IN +T a ɐ DT +T bulker bˈʌlkəɹ NN +T . . . +S wikitext_heldout_200:189 This skull was taken out of Mr. +P ðˌɪs skˈʌl wʌz tˈAkən ˈWt ʌv mˈɪstəɹ +C ðˌɪs skˈʌl wʌz tˈAkən ˈWt ʌv mˈɪstəɹ +T This ðˌɪs DT +T skull skˈʌl NN +T was wʌz VBD +T taken tˈAkən VBN +T out ˈWt IN +T of ʌv IN +T Mr. mˈɪstəɹ NNP +S wikitext_heldout_200:190 Against his advice, Susan climbs a tall ladder next to the dinosaur to be closer to him. +P əɡˈɛnst hɪz ədvˈIs, sˈuzən klˈImz ɐ tˈɔl lˈædəɹ nˈɛkst tə ðə dˈInəsˌɔɹ tə bi klˈOsəɹ tə hˌɪm. +C əɡˈɛnst hɪz ədvˈIs, sˈuzən klˈImz ɐ tˈɔl lˈædəɹ nˈɛkst tə ðə dˈInəsˌɔɹ tə bi klˈOsəɹ tə hˌɪm. +T Against əɡˈɛnst IN +T his hɪz PRP$ +T advice ədvˈIs NN +T , , , +T Susan sˈuzən NNP +T climbs klˈImz VBZ +T a ɐ DT +T tall tˈɔl JJ +T ladder lˈædəɹ NN +T next nˈɛkst RB +T to tə IN +T the ðə DT +T dinosaur dˈInəsˌɔɹ NN +T to tə TO +T be bi VB +T closer klˈOsəɹ JJR +T to tə IN +T him hˌɪm PRP +T . . . +S wikitext_heldout_200:191 Brett Myers retired the first two batters in the top of the eighth, but Hideki Matsui then hit a solo home run pinch hitting for Chamberlain. +P bɹˈɛt mˈIəɹz ɹətˈIəɹd ðə fˈɜɹst tˈu bˈæTəɹz ɪn ðə tˈɑp ʌv ði ˈAθ, bˌʌt hˈIdki mˈætsui ðˈɛn hˈɪt ɐ sˈOlˌO hˈOm ɹˈʌn pˈɪnʧ hˈɪTɪŋ fɔɹ ʧˈAmbəɹlən. +C bɹˈɛt mˈIəɹz ɹətˈIəɹd ðə fˈɜɹst tˈu bˈæTəɹz ɪn ðə tˈɑp ʌv ði ˈAθ, bˌʌt hˈIdki mˈætsui ðˈɛn hˈɪt ɐ sˈOlˌO hˈOm ɹˈʌn pˈɪnʧ hˈɪTɪŋ fɔɹ ʧˈAmbəɹlən. +T Brett bɹˈɛt NNP +T Myers mˈIəɹz NNP +T retired ɹətˈIəɹd VBD +T the ðə DT +T first fˈɜɹst JJ +T two tˈu CD +T batters bˈæTəɹz NNS +T in ɪn IN +T the ðə DT +T top tˈɑp NN +T of ʌv IN +T the ði DT +T eighth ˈAθ JJ +T , , , +T but bˌʌt CC +T Hideki hˈIdki NNP +T Matsui mˈætsui NNP +T then ðˈɛn RB +T hit hˈɪt VBD +T a ɐ DT +T solo sˈOlˌO JJ +T home hˈOm NN +T run ɹˈʌn NN +T pinch pˈɪnʧ NN +T hitting hˈɪTɪŋ VBG +T for fɔɹ IN +T Chamberlain ʧˈAmbəɹlən NNP +T . . . +S wikitext_heldout_200:192 Nicola Stephenson as Julie Fitzjohn, Staff Nurse, Darwin +P nˈɪkələ stˈɛfɛnsən æz ʤˈuli fɪtsʤˈɑn, stˈæf nˈɜɹs, dˈɑɹwɪn +C nˈɪkələ stˈɛfɛnsən æz ʤˈuli fɪtsʤˈɑn, stˈæf nˈɜɹs, dˈɑɹwɪn +T Nicola nˈɪkələ NNP +T Stephenson stˈɛfɛnsən NNP +T as æz IN +T Julie ʤˈuli NNP +T Fitzjohn fɪtsʤˈɑn NNP +T , , , +T Staff stˈæf NNP +T Nurse nˈɜɹs NNP +T , , , +T Darwin dˈɑɹwɪn NNP +S wikitext_heldout_200:193 Much of the prison was demolished in the 1870s, though parts of it were used as shops and rooms into the 20th century. +P mˈʌʧ ʌv ðə pɹˈɪzᵊn wʌz dəmˈɑlɪʃt ɪn ði ˌAtˈin sˈɛvəntiz, ðˌO pˈɑɹts ʌv ɪt wɜɹ jˈuzd æz ʃˈɑps ænd ɹˈumz ˈɪntu ðə twˈɛntiəθ sˈɛnʧəɹi. +C mˈʌʧ ʌv ðə pɹˈɪzᵊn wʌz dəmˈɑlɪʃt ɪn ði ˌAtˈin sˈɛvəntiz, ðˌO pˈɑɹts ʌv ɪt wɜɹ jˈuzd æz ʃˈɑps ænd ɹˈumz ˈɪntu ðə twˈɛntiəθ sˈɛnʧəɹi. +T Much mˈʌʧ JJ +T of ʌv IN +T the ðə DT +T prison pɹˈɪzᵊn NN +T was wʌz VBD +T demolished dəmˈɑlɪʃt VBN +T in ɪn IN +T the ði DT +T 1870s ˌAtˈin sˈɛvəntiz NNS +T , , , +T though ðˌO IN +T parts pˈɑɹts NNS +T of ʌv IN +T it ɪt PRP +T were wɜɹ VBD +T used jˈuzd VBN +T as æz IN +T shops ʃˈɑps NNS +T and ænd CC +T rooms ɹˈumz NNS +T into ˈɪntu IN +T the ðə DT +T 20th twˈɛntiəθ JJ +T century sˈɛnʧəɹi NN +T . . . +S wikitext_heldout_200:194 Bollinger became the 19th President of Columbia University on June 1, 2002. +P bˈɑlɪŋɡəɹ bəkˈAm ðə nˌIntˈinθ pɹˈɛzədˌɛnt ʌv kəlˈʌmbiə jˌunəvˈɜɹsəTi ˌɔn ʤˈun wˈʌn, tˈu θˈWzᵊnd tˈu. +C bˈɑlɪŋɡəɹ bəkˈAm ðə nˌIntˈinθ pɹˈɛzədˌɛnt ʌv kəlˈʌmbiə jˌunəvˈɜɹsəTi ˌɔn ʤˈun wˈʌn, tˈu θˈWzᵊnd tˈu. +T Bollinger bˈɑlɪŋɡəɹ NNP +T became bəkˈAm VBD +T the ðə DT +T 19th nˌIntˈinθ JJ +T President pɹˈɛzədˌɛnt NNP +T of ʌv IN +T Columbia kəlˈʌmbiə NNP +T University jˌunəvˈɜɹsəTi NNP +T on ˌɔn IN +T June ʤˈun NNP +T 1 wˈʌn CD +T , , , +T 2002 tˈu θˈWzᵊnd tˈu CD +T . . . +S wikitext_heldout_200:195 Paton made 22 visits to the site, of a total duration of 267 days. +P pˈætən mˌAd twˈɛnti tˈu vˈɪzəts tə ðə sˈIt, ʌv ɐ tˈOTᵊl dʊɹˈAʃən ʌv tˈu hˈʌndɹəd sˈɪksti sˈɛvən dˈAz. +C pˈætən mˌAd twˈɛnti tˈu vˈɪzəts tə ðə sˈIt, ʌv ɐ tˈOTᵊl dʊɹˈAʃən ʌv tˈu hˈʌndɹəd sˈɪksti sˈɛvən dˈAz. +T Paton pˈætən NNP +T made mˌAd VBD +T 22 twˈɛnti tˈu CD +T visits vˈɪzəts NNS +T to tə IN +T the ðə DT +T site sˈIt NN +T , , , +T of ʌv IN +T a ɐ DT +T total tˈOTᵊl JJ +T duration dʊɹˈAʃən NN +T of ʌv IN +T 267 tˈu hˈʌndɹəd sˈɪksti sˈɛvən CD +T days dˈAz NNS +T . . . +S wikitext_heldout_200:196 On 26 February, Nasser accepted the resignation, put Naguib under house arrest, and the RCC proclaimed Nasser as both RCC chairman and prime minister. +P ˌɔn twˈɛnti sˈɪks fˈɛbjəwˌɛɹi, nˈæsəɹ əksˈɛptᵻd ðə ɹˌɛzəɡnˈAʃən, pˌʊt nˈæɡwɪb ˈʌndəɹ hˈWs əɹˈɛst, ænd ði ˌɑɹsˌisˈi pɹəklˈAmd nˈæsəɹ æz bˈOθ ˌɑɹsˌisˈi ʧˈɛɹmən ænd pɹˈIm mˈɪnəstəɹ. +C ˌɔn twˈɛnti sˈɪks fˈɛbjəwˌɛɹi, nˈæsəɹ əksˈɛptᵻd ðə ɹˌɛzəɡnˈAʃən, pˌʊt nˈæɡwɪb ˈʌndəɹ hˈWs əɹˈɛst, ænd ði ˌɑɹsˌisˈi pɹəklˈAmd nˈæsəɹ æz bˈOθ ˌɑɹsˌisˈi ʧˈɛɹmən ænd pɹˈIm mˈɪnəstəɹ. +T On ˌɔn IN +T 26 twˈɛnti sˈɪks CD +T February fˈɛbjəwˌɛɹi NNP +T , , , +T Nasser nˈæsəɹ NNP +T accepted əksˈɛptᵻd VBD +T the ðə DT +T resignation ɹˌɛzəɡnˈAʃən NN +T , , , +T put pˌʊt VBD +T Naguib nˈæɡwɪb NNP +T under ˈʌndəɹ IN +T house hˈWs NN +T arrest əɹˈɛst NN +T , , , +T and ænd CC +T the ði DT +T RCC ˌɑɹsˌisˈi NNP +T proclaimed pɹəklˈAmd VBD +T Nasser nˈæsəɹ NNP +T as æz IN +T both bˈOθ DT +T RCC ˌɑɹsˌisˈi NNP +T chairman ʧˈɛɹmən NN +T and ænd CC +T prime pɹˈIm JJ +T minister mˈɪnəstəɹ NN +T . . . +S wikitext_heldout_200:197 Since then, no serious attempt to restore the Stuart heir has been made. +P sˈɪns ðˈɛn, nˈO sˈɪɹiəs ətˈɛmpt tə ɹəstˈɔɹ ðə stˈuəɹt ˈɛɹ hæz bɪn mˌAd. +C sˈɪns ðˈɛn, nˈO sˈɪɹiəs ətˈɛmpt tə ɹəstˈɔɹ ðə stˈuəɹt ˈɛɹ hæz bɪn mˌAd. +T Since sˈɪns IN +T then ðˈɛn RB +T , , , +T no nˈO DT +T serious sˈɪɹiəs JJ +T attempt ətˈɛmpt NN +T to tə TO +T restore ɹəstˈɔɹ VB +T the ðə DT +T Stuart stˈuəɹt NNP +T heir ˈɛɹ NN +T has hæz VBZ +T been bɪn VBN +T made mˌAd VBN +T . . . +S wikitext_heldout_200:198 He qualified in 22nd place for the Italian Grand Prix, and finished 12 places higher. +P hˌi kwˈɑləfˌId ɪn twˈɛnti sˈɛkənd plˈAs fɔɹ ði ɪtˈæljən ɡɹˈænd pɹˈi, ænd fˈɪnəʃt twˈɛlv plˈAsᵻz hˈIəɹ. +C hˌi kwˈɑləfˌId ɪn twˈɛnti sˈɛkənd plˈAs fɔɹ ði ɪtˈæljən ɡɹˈænd pɹˈi, ænd fˈɪnəʃt twˈɛlv plˈAsᵻz hˈIəɹ. +T He hˌi PRP +T qualified kwˈɑləfˌId VBD +T in ɪn IN +T 22nd twˈɛnti sˈɛkənd JJ +T place plˈAs NN +T for fɔɹ IN +T the ði DT +T Italian ɪtˈæljən JJ +T Grand ɡɹˈænd NNP +T Prix pɹˈi NNP +T , , , +T and ænd CC +T finished fˈɪnəʃt VBD +T 12 twˈɛlv CD +T places plˈAsᵻz NNS +T higher hˈIəɹ RBR +T . . . +S wikitext_heldout_200:199 A viewer complained that the celebrities were likely to have used the US version of Proactiv, which differs from the UK version. +P ɐ vjˈuəɹ kəmplˈAnd ðæt ðə səlˈɛbɹəTiz wɜɹ lˈIkli tə hæv jˈuzd ðə jˌuˈɛs vˈɜɹʒən ʌv pɹˈOktɪv, wˌɪʧ dˈɪfəɹz fɹʌm ðə jˌukˈA vˈɜɹʒən. +C ɐ vjˈuəɹ kəmplˈAnd ðæt ðə səlˈɛbɹəTiz wɜɹ lˈIkli tə hæv jˈuzd ðə jˌuˈɛs vˈɜɹʒən ʌv pɹˈOktɪv, wˌɪʧ dˈɪfəɹz fɹʌm ðə jˌukˈA vˈɜɹʒən. +T A ɐ DT +T viewer vjˈuəɹ NN +T complained kəmplˈAnd VBD +T that ðæt IN +T the ðə DT +T celebrities səlˈɛbɹəTiz NNS +T were wɜɹ VBD +T likely lˈIkli JJ +T to tə TO +T have hæv VB +T used jˈuzd VBN +T the ðə DT +T US jˌuˈɛs NNP +T version vˈɜɹʒən NN +T of ʌv IN +T Proactiv pɹˈOktɪv NNP +T , , , +T which wˌɪʧ WDT +T differs dˈɪfəɹz VBZ +T from fɹʌm IN +T the ðə DT +T UK jˌukˈA NNP +T version vˈɜɹʒən NN +T . . . +S wikitext_heldout_200:200 Most of the inhabitants of these provinces were Monophysites who rejected the Council of Chalcedon. +P mˈOst ʌv ði ɪnhˈæbəTənts ʌv ðiz pɹˈɑvᵊnsᵻz wɜɹ mənˈɑfəsˌIts hˌu ɹəʤˈɛktᵻd ðə kˈWnsᵊl ʌv kˈælsədɑn. +C mˈOst ʌv ði ɪnhˈæbəTənts ʌv ðiz pɹˈɑvᵊnsᵻz wɜɹ mənˈɑfəsˌIts hˌu ɹəʤˈɛktᵻd ðə kˈWnsᵊl ʌv kˈælsədɑn. +T Most mˈOst JJS +T of ʌv IN +T the ði DT +T inhabitants ɪnhˈæbəTənts NNS +T of ʌv IN +T these ðiz DT +T provinces pɹˈɑvᵊnsᵻz NNS +T were wɜɹ VBD +T Monophysites mənˈɑfəsˌIts NNPS +T who hˌu WP +T rejected ɹəʤˈɛktᵻd VBD +T the ðə DT +T Council kˈWnsᵊl NNP +T of ʌv IN +T Chalcedon kˈælsədɑn NNP +T . . . +S eliza_android_sentences:1 Good morning. Let us set up your tablet together. +P ɡˈʊd mˈɔɹnɪŋ. lˈɛt ˌʌs sˈɛt ˌʌp jʊɹ tˈæblət təɡˈɛðəɹ. +C ɡˈʊd mˈɔɹnɪŋ. +C lˈɛt ˌʌs sˈɛt ˌʌp jʊɹ tˈæblət təɡˈɛðəɹ. +T Good ɡˈʊd JJ +T morning mˈɔɹnɪŋ NN +T . . . +T Let lˈɛt VB +T us ˌʌs PRP +T set sˈɛt VB +T up ˌʌp RP +T your jʊɹ PRP$ +T tablet tˈæblət NN +T together təɡˈɛðəɹ RB +T . . . +S eliza_android_sentences:2 Please connect to your home wireless network. +P plˈiz kənˈɛkt tə jʊɹ hˈOm wˈIəɹləs nˈɛtwˌɜɹk. +C plˈiz kənˈɛkt tə jʊɹ hˈOm wˈIəɹləs nˈɛtwˌɜɹk. +T Please plˈiz UH +T connect kənˈɛkt VB +T to tə IN +T your jʊɹ PRP$ +T home hˈOm NN +T wireless wˈIəɹləs JJ +T network nˈɛtwˌɜɹk NN +T . . . +S eliza_android_sentences:3 Tap the large green button when you are ready. +P tˈæp ðə lˈɑɹʤ ɡɹˈin bˈʌtn wˌɛn ju ɑɹ ɹˈɛdi. +C tˈæp ðə lˈɑɹʤ ɡɹˈin bˈʌtn wˌɛn ju ɑɹ ɹˈɛdi. +T Tap tˈæp VB +T the ðə DT +T large lˈɑɹʤ JJ +T green ɡɹˈin JJ +T button bˈʌtn NN +T when wˌɛn WRB +T you ju PRP +T are ɑɹ VBP +T ready ɹˈɛdi JJ +T . . . +S eliza_android_sentences:4 Your electric bill is due next Friday. +P jˌʊɹ əlˈɛktɹɪk bˈɪl ɪz dˈu nˈɛkst fɹˈIdˌA. +C jˌʊɹ əlˈɛktɹɪk bˈɪl ɪz dˈu nˈɛkst fɹˈIdˌA. +T Your jˌʊɹ PRP$ +T electric əlˈɛktɹɪk JJ +T bill bˈɪl NN +T is ɪz VBZ +T due dˈu JJ +T next nˈɛkst JJ +T Friday fɹˈIdˌA NNP +T . . . +S eliza_android_sentences:5 I can read your mail out loud whenever you like. +P ˌI kæn ɹˈid jʊɹ mˈAl ˈWt lˈWd wənˈɛvəɹ ju lˈIk. +C ˌI kæn ɹˈid jʊɹ mˈAl ˈWt lˈWd wənˈɛvəɹ ju lˈIk. +T I ˌI PRP +T can kæn MD +T read ɹˈid VB +T your jʊɹ PRP$ +T mail mˈAl NN +T out ˈWt RB +T loud lˈWd RB +T whenever wənˈɛvəɹ WRB +T you ju PRP +T like lˈIk VBP +T . . . +S eliza_android_sentences:6 Would you like me to call your daughter? +P wˌʊd ju lˈIk mˌi tə kˈɔl jʊɹ dˈɔTəɹ? +C wˌʊd ju lˈIk mˌi tə kˈɔl jʊɹ dˈɔTəɹ? +T Would wˌʊd MD +T you ju PRP +T like lˈIk VB +T me mˌi PRP +T to tə TO +T call kˈɔl VB +T your jʊɹ PRP$ +T daughter dˈɔTəɹ NN +T ? ? . +S eliza_android_sentences:7 The weather today is sunny and warm. +P ðə wˈɛðəɹ tədˈA ɪz sˈʌni ænd wˈɔɹm. +C ðə wˈɛðəɹ tədˈA ɪz sˈʌni ænd wˈɔɹm. +T The ðə DT +T weather wˈɛðəɹ NN +T today tədˈA NN +T is ɪz VBZ +T sunny sˈʌni JJ +T and ænd CC +T warm wˈɔɹm JJ +T . . . +S eliza_android_sentences:8 Remember to take your medicine after lunch. +P ɹəmˈɛmbəɹ tə tˈAk jʊɹ mˈɛdəsᵊn ˈæftəɹ lˈʌnʧ. +C ɹəmˈɛmbəɹ tə tˈAk jʊɹ mˈɛdəsᵊn ˈæftəɹ lˈʌnʧ. +T Remember ɹəmˈɛmbəɹ VB +T to tə TO +T take tˈAk VB +T your jʊɹ PRP$ +T medicine mˈɛdəsᵊn NN +T after ˈæftəɹ IN +T lunch lˈʌnʧ NN +T . . . +S eliza_android_sentences:9 Your doctor appointment is on Tuesday morning. +P jˌʊɹ dˈɑktəɹ əpˈYntmənt ɪz ˌɔn tˈuzdˌA mˈɔɹnɪŋ. +C jˌʊɹ dˈɑktəɹ əpˈYntmənt ɪz ˌɔn tˈuzdˌA mˈɔɹnɪŋ. +T Your jˌʊɹ PRP$ +T doctor dˈɑktəɹ NN +T appointment əpˈYntmənt NN +T is ɪz VBZ +T on ˌɔn IN +T Tuesday tˈuzdˌA NNP +T morning mˈɔɹnɪŋ NN +T . . . +S eliza_android_sentences:10 I did not hear you clearly. Could you say that again? +P ˌI dˈɪd nˌɑt hˈɪɹ ju klˈɪɹli. kˌʊd ju sˈA ðˈæt əɡˈɛn? +C ˌI dˈɪd nˌɑt hˈɪɹ ju klˈɪɹli. +C kˌʊd ju sˈA ðˈæt əɡˈɛn? +T I ˌI PRP +T did dˈɪd VBD +T not nˌɑt RB +T hear hˈɪɹ VB +T you ju PRP +T clearly klˈɪɹli RB +T . . . +T Could kˌʊd MD +T you ju PRP +T say sˈA VB +T that ðˈæt DT +T again əɡˈɛn RB +T ? ? . +S eliza_android_sentences:11 Please type the code that was sent to your email. +P plˈiz tˈIp ðə kˈOd ðæt wʌz sˈɛnt tə jʊɹ ˈimˌAl. +C plˈiz tˈIp ðə kˈOd ðæt wʌz sˈɛnt tə jʊɹ ˈimˌAl. +T Please plˈiz UH +T type tˈIp VB +T the ðə DT +T code kˈOd NN +T that ðæt WDT +T was wʌz VBD +T sent sˈɛnt VBN +T to tə IN +T your jʊɹ PRP$ +T email ˈimˌAl NN +T . . . +S eliza_android_sentences:12 Your payment was received and you are all set. +P jˌʊɹ pˈAmᵊnt wʌz ɹəsˈivd ænd ju ɑɹ ˈɔl sˈɛt. +C jˌʊɹ pˈAmᵊnt wʌz ɹəsˈivd ænd ju ɑɹ ˈɔl sˈɛt. +T Your jˌʊɹ PRP$ +T payment pˈAmᵊnt NN +T was wʌz VBD +T received ɹəsˈivd VBN +T and ænd CC +T you ju PRP +T are ɑɹ VBP +T all ˈɔl RB +T set sˈɛt VBN +T . . . +S eliza_android_sentences:13 We can stop here and finish this later. +P wˌi kæn stˈɑp hˈɪɹ ænd fˈɪnəʃ ðɪs lˈATəɹ. +C wˌi kæn stˈɑp hˈɪɹ ænd fˈɪnəʃ ðɪs lˈATəɹ. +T We wˌi PRP +T can kæn MD +T stop stˈɑp VB +T here hˈɪɹ RB +T and ænd CC +T finish fˈɪnəʃ VB +T this ðɪs DT +T later lˈATəɹ RB +T . . . +S eliza_android_sentences:14 Thank you for your patience while I check that. +P θˈæŋk ju fɔɹ jʊɹ pˈAʃəns wˌIl ˌI ʧˈɛk ðˈæt. +C θˈæŋk ju fɔɹ jʊɹ pˈAʃəns wˌIl ˌI ʧˈɛk ðˈæt. +T Thank θˈæŋk VBP +T you ju PRP +T for fɔɹ IN +T your jʊɹ PRP$ +T patience pˈAʃəns NN +T while wˌIl IN +T I ˌI PRP +T check ʧˈɛk VBP +T that ðˈæt DT +T . . . +S eliza_android_sentences:15 Turn the volume up if my voice is too quiet. +P tˈɜɹn ðə vˈɑljˌum ˌʌp ɪf mI vˈYs ɪz tˈu kwˈIət. +C tˈɜɹn ðə vˈɑljˌum ˌʌp ɪf mI vˈYs ɪz tˈu kwˈIət. +T Turn tˈɜɹn VB +T the ðə DT +T volume vˈɑljˌum NN +T up ˌʌp RP +T if ɪf IN +T my mI PRP$ +T voice vˈYs NN +T is ɪz VBZ +T too tˈu RB +T quiet kwˈIət JJ +T . . . +S eliza_android_sentences:16 This tablet works best when it stays plugged in. +P ðˌɪs tˈæblət wˈɜɹks bˈɛst wˌɛn ɪt stˈAz plˈʌɡd ˈɪn. +C ðˌɪs tˈæblət wˈɜɹks bˈɛst wˌɛn ɪt stˈAz plˈʌɡd ˈɪn. +T This ðˌɪs DT +T tablet tˈæblət NN +T works wˈɜɹks VBZ +T best bˈɛst RB +T when wˌɛn WRB +T it ɪt PRP +T stays stˈAz VBZ +T plugged plˈʌɡd VBN +T in ˈɪn RP +T . . . +S eliza_android_sentences:17 Goodbye for now. I will be here when you need me. +P ɡˌʊdbˈI fɔɹ nˈW. ˌI wɪl bi hˈɪɹ wˌɛn ju nˈid mˌi. +C ɡˌʊdbˈI fɔɹ nˈW. +C ˌI wɪl bi hˈɪɹ wˌɛn ju nˈid mˌi. +T Goodbye ɡˌʊdbˈI UH +T for fɔɹ IN +T now nˈW RB +T . . . +T I ˌI PRP +T will wɪl MD +T be bi VB +T here hˈɪɹ RB +T when wˌɛn WRB +T you ju PRP +T need nˈid VBP +T me mˌi PRP +T . . . +S eliza_android_sentences:18 The birch canoe slid on the smooth planks. +P ðə bˈɜɹʧ kənˈu slˈɪd ˌɔn ðə smˈuð plˈæŋks. +C ðə bˈɜɹʧ kənˈu slˈɪd ˌɔn ðə smˈuð plˈæŋks. +T The ðə DT +T birch bˈɜɹʧ NN +T canoe kənˈu NN +T slid slˈɪd VBD +T on ˌɔn IN +T the ðə DT +T smooth smˈuð JJ +T planks plˈæŋks NNS +T . . . +S eliza_android_sentences:19 Glue the sheet to the dark blue background. +P ɡlˈu ðə ʃˈit tə ðə dˈɑɹk blˈu bˈækɡɹˌWnd. +C ɡlˈu ðə ʃˈit tə ðə dˈɑɹk blˈu bˈækɡɹˌWnd. +T Glue ɡlˈu VB +T the ðə DT +T sheet ʃˈit NN +T to tə IN +T the ðə DT +T dark dˈɑɹk JJ +T blue blˈu JJ +T background bˈækɡɹˌWnd NN +T . . . +S eliza_android_sentences:20 It is easy to tell the depth of a well. +P ˌɪt ɪz ˈizi tə tˈɛl ðə dˈɛpθ ʌv ɐ wˈɛl. +C ˌɪt ɪz ˈizi tə tˈɛl ðə dˈɛpθ ʌv ɐ wˈɛl. +T It ˌɪt PRP +T is ɪz VBZ +T easy ˈizi JJ +T to tə TO +T tell tˈɛl VB +T the ðə DT +T depth dˈɛpθ NN +T of ʌv IN +T a ɐ DT +T well wˈɛl NN +T . . . +S eliza_android_sentences:21 These days a chicken leg is a rare dish. +P ðˌiz dˈAz ɐ ʧˈɪkən lˈɛɡ ɪz ɐ ɹˈɛɹ dˈɪʃ. +C ðˌiz dˈAz ɐ ʧˈɪkən lˈɛɡ ɪz ɐ ɹˈɛɹ dˈɪʃ. +T These ðˌiz DT +T days dˈAz NNS +T a ɐ DT +T chicken ʧˈɪkən NN +T leg lˈɛɡ NN +T is ɪz VBZ +T a ɐ DT +T rare ɹˈɛɹ JJ +T dish dˈɪʃ NN +T . . . +S eliza_android_sentences:22 Rice is often served in round bowls. +P ɹˈIs ɪz ˈɔfᵊn sˈɜɹvd ɪn ɹˈWnd bˈOlz. +C ɹˈIs ɪz ˈɔfᵊn sˈɜɹvd ɪn ɹˈWnd bˈOlz. +T Rice ɹˈIs NNP +T is ɪz VBZ +T often ˈɔfᵊn RB +T served sˈɜɹvd VBN +T in ɪn IN +T round ɹˈWnd JJ +T bowls bˈOlz NNS +T . . . +S eliza_android_sentences:23 The quick brown fox jumps over the lazy dog. +P ðə kwˈɪk bɹˈWn fˈɑks ʤˈʌmps ˈOvəɹ ðə lˈAzi dˈɔɡ. +C ðə kwˈɪk bɹˈWn fˈɑks ʤˈʌmps ˈOvəɹ ðə lˈAzi dˈɔɡ. +T The ðə DT +T quick kwˈɪk JJ +T brown bɹˈWn JJ +T fox fˈɑks NN +T jumps ʤˈʌmps VBZ +T over ˈOvəɹ IN +T the ðə DT +T lazy lˈAzi JJ +T dog dˈɔɡ NN +T . . . +S eliza_android_sentences:24 A large size in stockings is hard to sell. +P ɐ lˈɑɹʤ sˈIz ɪn stˈɑkɪŋz ɪz hˈɑɹd tə sˈɛl. +C ɐ lˈɑɹʤ sˈIz ɪn stˈɑkɪŋz ɪz hˈɑɹd tə sˈɛl. +T A ɐ DT +T large lˈɑɹʤ JJ +T size sˈIz NN +T in ɪn IN +T stockings stˈɑkɪŋz NNS +T is ɪz VBZ +T hard hˈɑɹd JJ +T to tə TO +T sell sˈɛl VB +T . . . +S eliza_android_sentences:25 The juice of lemons makes fine punch. +P ðə ʤˈus ʌv lˈɛmənz mˌAks fˈIn pˈʌnʧ. +C ðə ʤˈus ʌv lˈɛmənz mˌAks fˈIn pˈʌnʧ. +T The ðə DT +T juice ʤˈus NN +T of ʌv IN +T lemons lˈɛmənz NNS +T makes mˌAks VBZ +T fine fˈIn JJ +T punch pˈʌnʧ NN +T . . . diff --git a/tools/misaki-g2p/tests/fixtures/reference.txt.sha256 b/tools/misaki-g2p/tests/fixtures/reference.txt.sha256 new file mode 100644 index 0000000000..3ac2d2a7be --- /dev/null +++ b/tools/misaki-g2p/tests/fixtures/reference.txt.sha256 @@ -0,0 +1 @@ +073a90f89a2b8af01b26d9e2aade8b60ae7cadaecdfc1a459c21daeac7e7c19b reference.txt diff --git a/tools/misaki-g2p/tests/gen_unit_expectations.py b/tools/misaki-g2p/tests/gen_unit_expectations.py new file mode 100644 index 0000000000..87737e06cd --- /dev/null +++ b/tools/misaki-g2p/tests/gen_unit_expectations.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +"""Write the expectation tables test_misaki_g2p.cpp checks, from the pinned +reference implementations (same environment as compare_misaki.py): + + data/tokenizer.tsv text -> spaCy 3.8.16 tokens (en tokenizer, no model) + data/subtokenize.tsv word -> misaki en.subtokenize pieces + data/stress.tsv phonemes, stress -> misaki en.apply_stress + data/e2m.tsv phonemizer output -> misaki EspeakFallback E2M result + data/mini_gold.json / mini_silver.json a slice of us_gold/us_silver for unit tests + +usage: python3 tests/gen_unit_expectations.py MISAKI_DATA_DIR +""" +import json +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +DATA = os.path.join(HERE, "data") +SEP = "\x1f" + +TOKENIZER_CASES = [ + "I'm on it.", + "Don't stop, I can't hear you!", + "The U.S. Army and e.g. 10am or 5pm.", + "It costs $5.99 (about €5).", + "She co-founded the well-known start-up in 2015-16.", + "Xenoceratops - (Alberta, Canada)", + "Visit https://example.com/help?x=1 today.", + "Email bob@example.com, please.", + "Meet at 3:30 or 10:45.", + "He said \"hello\" and left...", + "Rock 'n' roll, y'all.", + "Mr. Smith vs. Mrs. Jones at St. Paul's.", + "It's 72°F outside :)", + "Wait—what? Really…", + "The 1990s and the '80s.", + "Ph.D. students in N.Y.", + "A 10-minute drive, 2.5 km/h, 30% off.", + "Gold'cars and type'Desert", + "I 've seen it , it 's fine .", + "C++ and C# are languages; so is F#.", +] + +SUBTOKEN_CASES = [ + "McCully", "co-founded", "don't", "rock'n'roll", "iPhone", "USA", "NASA's", "1,000.50", "-5", "3.14", + "'90s", "Ma'am", "''quoted''", "hello--world", "snake_case", "ABCDef", "e.g.", "U.S.", "x2y", "Se8", + "Heroes'Cemetery", "O'Brien", "fine", "naïve", "über", "72°F", "a-b-c", +] + +STRESS_CASES = [ + ("hɛlˈO", None), ("hɛlˈO", -2), ("hɛlˈO", -1), ("hɛlˈO", 0), ("hɛlˈO", 0.5), ("hɛlˈO", 1), ("hɛlˈO", 2), + ("ðə", 0), ("ðə", 0.5), ("ðə", 2), ("bʌt", 1), ("tˌu", 1), ("tˌu", 2), ("tˌu", -0.5), ("kˈæt", -0.5), + ("bdk", 2), ("ɐ", 0.5), ("ˌænd", -1), +] + +E2M_CASES = [ + "hˈɜːlbʌts", "v^ɛlʊvˈɑːnə", "ɹˈæfa^ɪˈɛl", "t^ʃˈuːk", "kˈo^ʊən", "nˈɪkələ", "mˈɛdə^l", "bˈʌʔn̩", + "ɹˈiːdɚ", "lˈɪndɪ", "ɡɹæn d^ʒˈɑːn", "ʔˌn̩ wˈʌn", "xˈɑːn", "ɬˈɑː", "ɔ^ɪl", "a^ʊt", "e^ɪ", "fˈiːʲo", + "bˈɜːɹd", "ɪə", "sˈe", "ɐbˈaʊt", "ɾˈæ", "kɐ̃", +] + + +def main(): + if len(sys.argv) != 2: + raise SystemExit(__doc__) + misaki_data = sys.argv[1] + os.makedirs(DATA, exist_ok=True) + import spacy + from misaki import en + from misaki.espeak import EspeakFallback + + nlp = spacy.blank("en") + with open(os.path.join(DATA, "tokenizer.tsv"), "w", encoding="utf-8") as f: + for text in TOKENIZER_CASES: + doc = nlp(text) + toks = [t.text + ("\x1e" if t.whitespace_ else "") for t in doc] + f.write(text + "\t" + SEP.join(toks) + "\n") + with open(os.path.join(DATA, "subtokenize.tsv"), "w", encoding="utf-8") as f: + for w in SUBTOKEN_CASES: + f.write(w + "\t" + SEP.join(en.subtokenize(w)) + "\n") + with open(os.path.join(DATA, "stress.tsv"), "w", encoding="utf-8") as f: + for ps, st in STRESS_CASES: + f.write(f"{ps}\t{'None' if st is None else st}\t{en.apply_stress(ps, st)}\n") + + class Fake(EspeakFallback): + def __init__(self): + self.british = False + self.version = None + + class B: + def phonemize(_, texts): + return [texts[0]] + self.backend = B() + + fb = Fake() + + class Tok: + def __init__(self, text): + self.text = text + + with open(os.path.join(DATA, "e2m.tsv"), "w", encoding="utf-8") as f: + for ps in E2M_CASES: + f.write(ps + "\t" + fb(Tok(ps))[0] + "\n") + + gold = json.load(open(os.path.join(misaki_data, "us_gold.json"), encoding="utf-8")) + silver = json.load(open(os.path.join(misaki_data, "us_silver.json"), encoding="utf-8")) + keep = ["hello", "world", "read", "the", "a", "to", "am", "used", "dollar", "cent", "and", "point", "minus", + "O", "percent", "versus", "dot", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", + "eight", "nine", "ten", "twenty", "hundred", "thousand", "that", "record", "walk", "I", "in", "is", + "it", "cat", "test", "this"] + keep += [chr(c) for c in range(ord("A"), ord("Z") + 1)] + mini_gold = {k: gold[k] for k in keep if k in gold} + mini_silver = {k: silver[k] for k in ["dollars", "testing", "cats"] if k in silver} + for name, obj in (("mini_gold.json", mini_gold), ("mini_silver.json", mini_silver)): + with open(os.path.join(DATA, name), "w", encoding="utf-8") as f: + f.write(json.dumps(obj, ensure_ascii=False, indent=0, sort_keys=True) + "\n") + print("wrote", DATA) + + +if __name__ == "__main__": + main() diff --git a/tools/misaki-g2p/tests/test_agreement.cpp b/tools/misaki-g2p/tests/test_agreement.cpp new file mode 100644 index 0000000000..8a930d977a --- /dev/null +++ b/tools/misaki-g2p/tests/test_agreement.cpp @@ -0,0 +1,271 @@ +// SPDX-License-Identifier: Apache-2.0 +// Agreement gate: native misaki_g2p against the pinned Python misaki 0.9.4 +// reference (fixtures written by compare_misaki.py reference). +// +// test-misaki-g2p-agreement --lex misaki-en-us.lex --fixture fixtures/reference.txt +// --espeak ESPEAK_NG_DATA_DIR [--report out.txt] +// +// Pass: >= 99.5% of reference words and >= 98% of sentences identical after +// Paradee's vocabulary filter, the C API giving the same chunks as paradee's +// _chunks(). Every mismatch is listed in the report. Exit 77 (skip) when +// eSpeak NG is not available: without it the fallback cannot match training. +#include "misaki-g2p.h" +#include "misaki-internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace misaki; + +namespace { + +// --- SHA-256 (FIPS 180-4), to check the fixture against its .sha256 file +struct Sha256 { + uint32_t h[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; + uint64_t len = 0; + uint8_t buf[64]; + size_t n = 0; + static uint32_t rotr(uint32_t x, int r) { return (x >> r) | (x << (32 - r)); } + void block(const uint8_t * p) { + static const uint32_t k[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, + 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, + 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2}; + uint32_t w[64]; + for (int i = 0; i < 16; i++) w[i] = (uint32_t) p[4 * i] << 24 | (uint32_t) p[4 * i + 1] << 16 | (uint32_t) p[4 * i + 2] << 8 | p[4 * i + 3]; + for (int i = 16; i < 64; i++) { + uint32_t s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >> 3); + uint32_t s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + s0 + w[i - 7] + s1; + } + uint32_t a = h[0], b = h[1], c = h[2], d = h[3], e = h[4], f = h[5], g = h[6], hh = h[7]; + for (int i = 0; i < 64; i++) { + uint32_t S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25); + uint32_t ch = (e & f) ^ (~e & g); + uint32_t t1 = hh + S1 + ch + k[i] + w[i]; + uint32_t S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22); + uint32_t mj = (a & b) ^ (a & c) ^ (b & c); + uint32_t t2 = S0 + mj; + hh = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; + } + h[0] += a; h[1] += b; h[2] += c; h[3] += d; h[4] += e; h[5] += f; h[6] += g; h[7] += hh; + } + void update(const uint8_t * p, size_t m) { + len += m; + while (m--) { + buf[n++] = *p++; + if (n == 64) { block(buf); n = 0; } + } + } + std::string hex() { + uint64_t bits = len * 8; + uint8_t pad = 0x80; + update(&pad, 1); + uint8_t z = 0; + while (n != 56) update(&z, 1); + for (int i = 7; i >= 0; i--) { uint8_t b = (uint8_t) (bits >> (8 * i)); update(&b, 1); } + char out[65]; + for (int i = 0; i < 8; i++) std::snprintf(out + 8 * i, 9, "%08x", h[i]); + return std::string(out, 64); + } +}; + +struct RefTok { + std::string text, ps, ws, tag; +}; +struct RefSent { + std::string id, text, ps; + std::vector chunks; + std::vector toks; +}; + +std::vector split_tab(const std::string & s) { + std::vector out; + size_t a = 0; + while (true) { + size_t b = s.find('\t', a); + out.push_back(s.substr(a, b == std::string::npos ? std::string::npos : b - a)); + if (b == std::string::npos) break; + a = b + 1; + } + return out; +} + +u32 vocab_filter(const std::string & s) { + u32 out; + for (char32_t c : from_utf8(s)) if (in_paradee_vocab(c)) out += c; + return out; +} + +bool is_word(const std::string & s) { + for (char32_t c : from_utf8(s)) if (py_isalpha(c) || py_digit_value(c) >= 0) return true; + return false; +} + +// LCS alignment of token texts: ref index -> native index +std::map align(const std::vector & a, const std::vector & b) { + size_t n = a.size(), m = b.size(); + std::vector> dp(n + 1, std::vector(m + 1, 0)); + for (size_t i = n; i-- > 0;) + for (size_t j = m; j-- > 0;) + dp[i][j] = a[i] == b[j] ? dp[i + 1][j + 1] + 1 : std::max(dp[i + 1][j], dp[i][j + 1]); + std::map out; + size_t i = 0, j = 0; + while (i < n && j < m) { + if (a[i] == b[j]) { out[i++] = j++; } + else if (dp[i + 1][j] >= dp[i][j + 1]) i++; + else j++; + } + return out; +} + +} // namespace + +int main(int argc, char ** argv) { + std::string lex, fixture, espeak, report_path; + double word_gate = 0.995, sent_gate = 0.98; + for (int i = 1; i + 1 < argc; i += 2) { + std::string a = argv[i]; + if (a == "--lex") lex = argv[i + 1]; + else if (a == "--fixture") fixture = argv[i + 1]; + else if (a == "--espeak") espeak = argv[i + 1]; + else if (a == "--report") report_path = argv[i + 1]; + } + if (lex.empty() || fixture.empty()) { + std::fprintf(stderr, "usage: %s --lex LEX --fixture FIXTURE --espeak DIR [--report FILE]\n", argv[0]); + return 2; + } + if (!espeak_linked() || espeak.empty()) { + std::printf("SKIP: the agreement gate needs libespeak-ng 1.52.0 and its data (misaki's fallback in training)\n"); + return 77; + } + // fixture integrity + std::ifstream fin(fixture, std::ios::binary); + if (!fin) { + std::fprintf(stderr, "cannot read %s\n", fixture.c_str()); + return 1; + } + std::string raw((std::istreambuf_iterator(fin)), std::istreambuf_iterator()); + { + Sha256 sh; + sh.update((const uint8_t *) raw.data(), raw.size()); + std::string got = sh.hex(); + std::ifstream sf(fixture + ".sha256"); + std::string want; + sf >> want; + if (want != got) { + std::fprintf(stderr, "fixture sha256 %s does not match %s.sha256 (%s)\n", got.c_str(), fixture.c_str(), want.c_str()); + return 1; + } + } + std::vector ref; + { + std::istringstream in(raw); + std::string line; + while (std::getline(in, line)) { + if (line.empty() || line[0] == '#') continue; + auto f = split_tab(line); + if (f[0] == "S" && f.size() >= 3) ref.push_back({f[1], f[2], "", {}, {}}); + else if (f[0] == "P" && !ref.empty()) ref.back().ps = f.size() > 1 ? f[1] : ""; + else if (f[0] == "C" && !ref.empty()) ref.back().chunks.push_back(f.size() > 1 ? f[1] : ""); + else if (f[0] == "T" && !ref.empty()) { + f.resize(5); + ref.back().toks.push_back({f[1], f[2], f[3], f[4]}); + } + } + } + std::string err; + auto lf = LexFile::open(lex, err); + if (!lf) { + std::fprintf(stderr, "%s\n", err.c_str()); + return 1; + } + auto fb = EspeakFallback::open(espeak, err); + if (!fb) { + std::fprintf(stderr, "%s\n", err.c_str()); + return 1; + } + G2P g2p(*lf, fb.get()); + char * cerr = nullptr; + misaki_g2p * api = misaki_g2p_open(lex.c_str(), espeak.c_str(), &cerr); + if (!api) { + std::fprintf(stderr, "misaki_g2p_open: %s\n", cerr ? cerr : "?"); + return 1; + } + size_t words = 0, word_ok = 0, sents = 0, sent_ok = 0, api_ok = 0; + std::ostringstream detail; + for (const RefSent & r : ref) { + sents++; + std::vector toks; + u32 got = g2p(from_utf8(r.text), &toks); + u32 want = vocab_filter(r.ps); + std::vector chunks = paradee_chunks(g2p, from_utf8(r.text)); + bool chunks_ok = chunks.size() == r.chunks.size(); + for (size_t c = 0; chunks_ok && c < chunks.size(); c++) chunks_ok = chunks[c] == vocab_filter(r.chunks[c]); + bool ok = got == want && chunks_ok; + sent_ok += ok; + // the C API must return exactly these chunks, '\n'-joined + std::string want_api; + for (size_t c = 0; c < chunks.size(); c++) want_api += (c ? "\n" : "") + to_utf8(chunks[c]); + char * out = nullptr; + char * e = nullptr; + int rc = misaki_g2p_phonemize(api, r.text.data(), r.text.size(), &out, &e); + bool api_same = rc == 0 && out && want_api == out; + api_ok += api_same; + misaki_g2p_free(out); + misaki_g2p_free(e); + std::vector rt, nt; + for (auto & t : r.toks) rt.push_back(t.text); + for (auto & t : toks) nt.push_back(to_utf8(t.text)); + auto pairs = align(rt, nt); + std::ostringstream bad; + for (size_t i = 0; i < r.toks.size(); i++) { + if (!is_word(r.toks[i].text)) continue; + words++; + auto it = pairs.find(i); + std::string got_ps = "(no matching token)", ntag = "-"; + if (it != pairs.end()) { + const MToken & nt_tok = toks[it->second]; + got_ps = nt_tok.phonemes ? to_utf8(*nt_tok.phonemes) : "(none)"; + ntag = nt_tok.tag; + if (nt_tok.phonemes && vocab_filter(r.toks[i].ps) == *nt_tok.phonemes) { + word_ok++; + continue; + } + } + bad << " word '" << r.toks[i].text << "' [" << r.toks[i].tag << " / native " << ntag << "]: misaki '" + << to_utf8(vocab_filter(r.toks[i].ps)) << "' native '" << got_ps << "'\n"; + } + if (!ok || !bad.str().empty() || !api_same) { + detail << "- " << r.id << " " << r.text << "\n misaki: " << to_utf8(want) << "\n native: " << to_utf8(got) << "\n" + << bad.str(); + if (!api_same) detail << " C API output differs from the chunker (rc " << rc << ")\n"; + } + } + misaki_g2p_close(api); + double wr = words ? (double) word_ok / words : 0, sr = sents ? (double) sent_ok / sents : 0; + bool pass = wr >= word_gate && sr >= sent_gate && api_ok == sents && sents > 0; + std::ostringstream rep; + rep << "misaki-g2p agreement gate: " << fixture << "\n"; + rep << "words: " << word_ok << "/" << words << " = " << 100.0 * wr << "% (gate >= " << 100 * word_gate << "%)\n"; + rep << "sentences: " << sent_ok << "/" << sents << " = " << 100.0 * sr << "% (gate >= " << 100 * sent_gate << "%)\n"; + rep << "C API: " << api_ok << "/" << sents << " sentences: misaki_g2p_phonemize equals the chunker output\n"; + rep << "result: " << (pass ? "PASS" : "FAIL") << "\n\nmismatches:\n" << detail.str(); + std::fputs(rep.str().c_str(), stdout); + if (!report_path.empty()) { + std::ofstream o(report_path); + o << rep.str(); + } + return pass ? 0 : 1; +} diff --git a/tools/misaki-g2p/tests/test_misaki_g2p.cpp b/tools/misaki-g2p/tests/test_misaki_g2p.cpp new file mode 100644 index 0000000000..0fb02b5166 --- /dev/null +++ b/tools/misaki-g2p/tests/test_misaki_g2p.cpp @@ -0,0 +1,254 @@ +// SPDX-License-Identifier: Apache-2.0 +// Unit tests for misaki_g2p. Expectation tables in data/ come from the pinned +// reference implementations (gen_unit_expectations.py); sentence expectations +// below were produced by Python misaki 0.9.4 with the full lexicon and use +// only words present in the small test lexicon. +// +// usage: test-misaki-g2p MINI_LEX DATA_DIR +#include "misaki-g2p.h" +#include "misaki-internal.h" + +#include +#include +#include +#include +#include + +using namespace misaki; + +static int g_fail = 0, g_pass = 0; + +#define CHECK(cond) \ + do { \ + if (cond) g_pass++; \ + else { \ + g_fail++; \ + std::fprintf(stderr, "%s:%d: CHECK(%s) failed\n", __FILE__, __LINE__, #cond); \ + } \ + } while (0) + +static void check_eq(const std::string & got, const std::string & want, const std::string & what) { + if (got == want) { + g_pass++; + } else { + g_fail++; + std::fprintf(stderr, "FAIL %s\n want: %s\n got: %s\n", what.c_str(), want.c_str(), got.c_str()); + } +} + +static std::vector> read_tsv(const std::string & path) { + std::vector> rows; + std::ifstream in(path); + if (!in) { + std::fprintf(stderr, "cannot read %s\n", path.c_str()); + g_fail++; + return rows; + } + std::string line; + while (std::getline(in, line)) { + std::vector f; + size_t a = 0; + while (true) { + size_t b = line.find('\t', a); + f.push_back(line.substr(a, b == std::string::npos ? std::string::npos : b - a)); + if (b == std::string::npos) break; + a = b + 1; + } + rows.push_back(f); + } + return rows; +} + +static std::vector split(const std::string & s, char sep) { + std::vector out; + size_t a = 0; + while (true) { + size_t b = s.find(sep, a); + out.push_back(s.substr(a, b == std::string::npos ? std::string::npos : b - a)); + if (b == std::string::npos) break; + a = b + 1; + } + return out; +} + +static void test_unicode() { + check_eq(to_utf8(py_lower(U("ÀÉÎ ΣΑ ЖЁ"))), "àéî σα жё", "py_lower"); + check_eq(to_utf8(py_upper(U("straße"))), "STRASSE", "py_upper multi"); + check_eq(to_utf8(py_capitalize(U("hELLO"))), "Hello", "capitalize"); + CHECK(py_isalpha(U'é') && py_isalpha(U'ж') && !py_isalpha(U'1') && !py_isalpha(U'-')); + CHECK(py_digit_value(U'²') == 2 && py_digit_value(U'٣') == 3 && py_digit_value(U'a') < 0); + check_eq(to_utf8(nfkc(U("fine"))), "fine", "nfkc ligature"); + check_eq(to_utf8(nfkc(U("é"))), "é", "nfkc compose"); + check_eq(to_utf8(nfkc(U("ABC1"))), "ABC1", "nfkc fullwidth"); + check_eq(to_utf8(from_utf8("a\xff" "b", 3)), "a\xef\xbf\xbd" "b", "invalid utf-8 -> U+FFFD"); +} + +static void test_numbers() { + check_eq(to_utf8(number_cardinal("0")), "zero", "cardinal 0"); + check_eq(to_utf8(number_cardinal("169")), "one hundred and sixty-nine", "cardinal 169"); + check_eq(to_utf8(number_cardinal("1234")), "one thousand, two hundred and thirty-four", "cardinal 1234"); + check_eq(to_utf8(number_cardinal("2000500")), "two million, five hundred", "cardinal 2000500"); + check_eq(to_utf8(number_cardinal("1000012")), "one million and twelve", "cardinal 1000012"); + check_eq(to_utf8(number_ordinal("21")), "twenty-first", "ordinal 21"); + check_eq(to_utf8(number_ordinal("112")), "one hundred and twelfth", "ordinal 112"); + check_eq(to_utf8(number_ordinal("230")), "two hundred and thirtieth", "ordinal 230"); + check_eq(to_utf8(number_year("2015")), "twenty fifteen", "year 2015"); + check_eq(to_utf8(number_year("2008")), "two thousand and eight", "year 2008"); + check_eq(to_utf8(number_year("1905")), "nineteen oh-five", "year 1905"); + check_eq(to_utf8(number_year("1900")), "nineteen hundred", "year 1900"); + check_eq(to_utf8(number_float("2.50")), "two point five", "float 2.50"); + check_eq(to_utf8(number_float("10.05")), "ten point zero five", "float 10.05"); + check_eq(to_utf8(number_float("3.0")), "three", "float 3.0"); + CHECK(number_fits(std::string(42, '9')) && !number_fits(std::string(43, '9'))); +} + +static void test_tables(const std::string & data) { + for (auto & r : read_tsv(data + "/tokenizer.tsv")) { + if (r.size() < 2) continue; + std::string got; + for (auto & t : spacy_tokenize(U(r[0].c_str()))) { + if (!got.empty()) got += '\x1f'; + got += to_utf8(t.text) + (t.space_after ? "\x1e" : ""); + } + check_eq(got, r[1], "tokenize: " + r[0]); + } + for (auto & r : read_tsv(data + "/subtokenize.tsv")) { + if (r.size() < 2) continue; + std::string got; + for (auto & t : subtokenize(U(r[0].c_str()))) { + if (!got.empty()) got += '\x1f'; + got += to_utf8(t); + } + check_eq(got, r[1], "subtokenize: " + r[0]); + } + for (auto & r : read_tsv(data + "/stress.tsv")) { + if (r.size() < 3) continue; + std::optional st; + if (r[1] != "None") st = std::stod(r[1]); + auto got = apply_stress_for_test(U(r[0].c_str()), st); + check_eq(got ? to_utf8(*got) : "None", r[2], "apply_stress: " + r[0] + " " + r[1]); + } + for (auto & r : read_tsv(data + "/e2m.tsv")) { + if (r.size() < 2) continue; + check_eq(to_utf8(EspeakFallback::e2m(U(r[0].c_str()))), r[1], "e2m: " + r[0]); + } +} + +static std::string phonemize(misaki_g2p * g, const std::string & text, int * rc = nullptr) { + char * out = nullptr; + char * err = nullptr; + int r = misaki_g2p_phonemize(g, text.data(), text.size(), &out, &err); + if (rc) *rc = r; + std::string s = r == 0 && out ? out : std::string("ERROR: ") + (err ? err : "?"); + misaki_g2p_free(out); + misaki_g2p_free(err); + return s; +} + +static void test_api(const std::string & lex) { + char * err = nullptr; + CHECK(misaki_g2p_open("/nonexistent/misaki.lex", nullptr, &err) == nullptr && err != nullptr); + misaki_g2p_free(err); + err = nullptr; + misaki_g2p * g = misaki_g2p_open(lex.c_str(), nullptr, &err); + CHECK(g != nullptr); + if (!g) { + std::fprintf(stderr, "open: %s\n", err ? err : "?"); + misaki_g2p_free(err); + return; + } + CHECK(misaki_g2p_fallback_kind(g) == MISAKI_G2P_FALLBACK_SPELL); + // Python misaki 0.9.4, full lexicon (paradee configuration) + check_eq(phonemize(g, "Hello world."), "həlˈO wˈɜɹld.", "hello world"); + check_eq(phonemize(g, "The cat is a test."), "ðə kˈæt ɪz ɐ tˈɛst.", "the cat"); + check_eq(phonemize(g, "I read that record."), "ˌI ɹˈɛd ðˈæt ɹˈɛkəɹd.", "read/that/record"); + check_eq(phonemize(g, "Hello, world! This is a test."), "həlˈO, wˈɜɹld!\nðˌɪs ɪz ɐ tˈɛst.", "two sentences"); + check_eq(phonemize(g, "It is 20."), "ˌɪt ɪz twˈɛnti.", "number"); + check_eq(phonemize(g, "That is $5."), "ðˈæt ɪz fˈIv dˈɑləɹz.", "currency"); + check_eq(phonemize(g, "To the cat, I am ten."), "tə ðə kˈæt, ˌI ɐm tˈɛn.", "to/the/am"); + check_eq(phonemize(g, "HELLO WORLD"), "həlˈO wˈɜɹld", "all caps"); + check_eq(phonemize(g, "Walking cats."), "wˈɔkɪŋ kˈæts.", "stems"); + // out of lexicon without eSpeak: letters, as misaki's get_NNP spells them + check_eq(phonemize(g, "Zyx"), "zˌiwˌIˈɛks", "spell-out fallback"); + check_eq(phonemize(g, ""), "", "empty"); + check_eq(phonemize(g, " \n\n "), "", "blank"); + // newlines split chunks like paradee's _chunks + check_eq(phonemize(g, "Hello\nworld"), "həlˈO\nwˈɜɹld", "newline split"); + // a very long sentence is cut at the last space within 510 symbols + { + std::string text; + for (int i = 0; i < 200; i++) text += "hello "; + text += "world."; + std::string out = phonemize(g, text); + auto chunks = split(out, '\n'); + CHECK(chunks.size() >= 2); + size_t total = 0; + for (auto & c : chunks) { + u32 u = from_utf8(c); + CHECK(u.size() <= MISAKI_G2P_MAX_CHUNK && !u.empty()); + CHECK(u.front() != U' '); + total += u.size(); + } + CHECK(total > 1000); + check_eq(chunks.back().substr(chunks.back().size() - std::strlen("wˈɜɹld.")), "wˈɜɹld.", "last chunk ends the sentence"); + } + // every output symbol is in the Paradee vocabulary + { + std::string out = phonemize(g, "Café naïve 😀 ✓ ® © ½ ⅓ – — … “quotes” ‘x’ [a] {b} 100% 3/4 @home #tag ^_^ ~"); + CHECK(out.rfind("ERROR", 0) != 0); + for (char32_t c : from_utf8(out)) CHECK(c == U'\n' || in_paradee_vocab(c)); + } + // explicit phonemes outside the vocabulary are rejected, not dropped + { + int rc = 0; + std::string out = phonemize(g, "[hello](/hɛ5o/)", &rc); + CHECK(rc != 0 && out.find("vocabulary") != std::string::npos); + check_eq(phonemize(g, "[hello](/hɛlˈO/) world"), "hɛlˈO wˈɜɹld", "phoneme override"); + } + // hostile input stays bounded: long runs, many subtokens, long numbers + { + std::string a(20000, 'a'), dots(5000, '.'), hy; + for (int i = 0; i < 3000; i++) hy += "a-"; + for (const std::string & s : {a, dots, hy, std::string(3000, '9'), std::string(1000, '@') + "x.com"}) { + int rc = 0; + phonemize(g, s, &rc); + CHECK(rc == 0); + } + } + // invalid arguments + { + char * out = nullptr; + char * e = nullptr; + CHECK(misaki_g2p_phonemize(nullptr, "x", 1, &out, &e) != 0); + misaki_g2p_free(e); + e = nullptr; + CHECK(misaki_g2p_phonemize(g, nullptr, 3, &out, &e) != 0); + misaki_g2p_free(e); + } + misaki_g2p_close(g); + // eSpeak availability is reported, and requesting it without the library fails cleanly + if (!misaki_g2p_espeak_linked()) { + err = nullptr; + CHECK(misaki_g2p_open(lex.c_str(), "/tmp", &err) == nullptr && err != nullptr); + misaki_g2p_free(err); + } +} + +static void test_bad_lexicon(const std::string & data) { + std::string err; + CHECK(LexFile::open(data + "/mini_gold.json", err) == nullptr && err.find("magic") != std::string::npos); +} + +int main(int argc, char ** argv) { + if (argc < 3) { + std::fprintf(stderr, "usage: %s MINI_LEX DATA_DIR\n", argv[0]); + return 2; + } + test_unicode(); + test_numbers(); + test_tables(argv[2]); + test_api(argv[1]); + test_bad_lexicon(argv[2]); + std::printf("%d passed, %d failed\n", g_pass, g_fail); + return g_fail ? 1 : 0; +} diff --git a/tools/misaki-g2p/tools/misaki-g2p-cli.cpp b/tools/misaki-g2p/tools/misaki-g2p-cli.cpp new file mode 100644 index 0000000000..d677e833e1 --- /dev/null +++ b/tools/misaki-g2p/tools/misaki-g2p-cli.cpp @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: Apache-2.0 +// misaki-g2p-cli: phonemize text from stdin, one input per line. +// +// misaki-g2p-cli --lex misaki-en-us.lex [--espeak DIR] [MODE] < text.txt +// +// MODE +// (default) Paradee chunks via the C API, one line per input ('\n' inside +// a result is printed as " | ") +// --dump misaki-style dump used by tests/compare_misaki.py: +// Stext, Pphonemes, Cchunk..., +// Ttokenphonemeswhitespacetag... +// --tokenize spaCy-compatible tokens and tags: texttagspace +// --numbers lines "cardinal N" / "ordinal N" / "year N" / "float X" +#include "misaki-g2p.h" +#include "misaki-internal.h" + +#include +#include +#include +#include + +using namespace misaki; + +static int usage() { + std::fprintf(stderr, "usage: misaki-g2p-cli --lex FILE [--espeak DIR] [--dump|--tokenize|--numbers] < lines\n"); + return 2; +} + +int main(int argc, char ** argv) { + std::string lex, espeak, mode = "chunks"; + for (int i = 1; i < argc; i++) { + std::string a = argv[i]; + if (a == "--lex" && i + 1 < argc) lex = argv[++i]; + else if (a == "--espeak" && i + 1 < argc) espeak = argv[++i]; + else if (a == "--dump") mode = "dump"; + else if (a == "--tokenize") mode = "tokenize"; + else if (a == "--numbers") mode = "numbers"; + else return usage(); + } + std::string line; + if (mode == "numbers") { + while (std::getline(std::cin, line)) { + size_t sp = line.find(' '); + if (sp == std::string::npos) continue; + std::string kind = line.substr(0, sp), v = line.substr(sp + 1); + u32 w; + if (kind == "cardinal") w = number_cardinal(v); + else if (kind == "ordinal") w = number_ordinal(v); + else if (kind == "year") w = number_year(v); + else w = number_float(v); + std::printf("%s\n", to_utf8(w).c_str()); + } + return 0; + } + if (lex.empty()) return usage(); + std::string err; + std::unique_ptr lf = LexFile::open(lex, err); + if (!lf) { + std::fprintf(stderr, "%s\n", err.c_str()); + return 1; + } + if (mode == "tokenize") { + while (std::getline(std::cin, line)) { + u32 text = from_utf8(line); + auto toks = spacy_tokenize(text); + auto tags = tag_tokens(toks, lf.get()); + for (size_t i = 0; i < toks.size(); i++) { + std::printf("%s\t%s\t%d\n", to_utf8(toks[i].text).c_str(), tags[i].c_str(), toks[i].space_after ? 1 : 0); + } + std::printf("\n"); + } + return 0; + } + if (mode == "dump") { + std::unique_ptr fb; + if (!espeak.empty()) { + fb = EspeakFallback::open(espeak, err); + if (!fb) { + std::fprintf(stderr, "%s\n", err.c_str()); + return 1; + } + } + G2P g2p(*lf, fb.get()); + while (std::getline(std::cin, line)) { + u32 text = from_utf8(line); + std::vector toks; + u32 ps = g2p(text, &toks); + std::printf("S\t%s\nP\t%s\n", line.c_str(), to_utf8(ps).c_str()); + for (const u32 & c : paradee_chunks(g2p, text)) std::printf("C\t%s\n", to_utf8(c).c_str()); + for (auto & t : toks) { + std::printf("T\t%s\t%s\t%s\t%s\n", to_utf8(t.text).c_str(), t.phonemes ? to_utf8(*t.phonemes).c_str() : "", + to_utf8(t.whitespace).c_str(), t.tag.c_str()); + } + } + return 0; + } + char * e = nullptr; + misaki_g2p * g = misaki_g2p_open(lex.c_str(), espeak.empty() ? nullptr : espeak.c_str(), &e); + if (!g) { + std::fprintf(stderr, "%s\n", e ? e : "open failed"); + misaki_g2p_free(e); + return 1; + } + int rc = 0; + while (std::getline(std::cin, line)) { + char * out = nullptr; + if (misaki_g2p_phonemize(g, line.data(), line.size(), &out, &e) != 0) { + std::fprintf(stderr, "%s\n", e ? e : "phonemize failed"); + misaki_g2p_free(e); + e = nullptr; + rc = 1; + std::printf("\n"); + continue; + } + std::string s = out; + for (size_t p; (p = s.find('\n')) != std::string::npos;) s.replace(p, 1, " | "); + std::printf("%s\n", s.c_str()); + misaki_g2p_free(out); + } + misaki_g2p_close(g); + return rc; +} From b46b1f5036b99f4a425519a7e3303b389ecc4f3a Mon Sep 17 00:00:00 2001 From: Shaw Date: Tue, 13 Oct 2026 22:53:28 -0400 Subject: [PATCH 2/4] misaki-g2p: add the eliza_misaki C++ interface libelizainference v17 calls misaki_phonemize returns paradee's chunks joined by spaces; misaki_phonemize_chunks keeps them separate, matching one forward pass per chunk in paradee/tts.py. Co-Authored-By: Claude Opus 5.5 --- tools/misaki-g2p/include/misaki-g2p.h | 42 +++++++++++ tools/misaki-g2p/src/misaki-g2p.cpp | 88 ++++++++++++++++++++++ tools/misaki-g2p/tests/test_misaki_g2p.cpp | 18 +++++ 3 files changed, 148 insertions(+) diff --git a/tools/misaki-g2p/include/misaki-g2p.h b/tools/misaki-g2p/include/misaki-g2p.h index 5e5cd65b43..9a4dd6cd78 100644 --- a/tools/misaki-g2p/include/misaki-g2p.h +++ b/tools/misaki-g2p/include/misaki-g2p.h @@ -68,6 +68,48 @@ MISAKI_G2P_API void misaki_g2p_close(misaki_g2p * g); #ifdef __cplusplus } + +/* C++ interface used by libelizainference (tools/omnivoice, ABI v17). Same + * engine as the C API above; declarations match + * tools/omnivoice/tests/paradee-contract/misaki-g2p.h. */ +# include +# include +# include + +namespace eliza_misaki { + +/* How words missing from the lexicon are phonemized. */ +enum misaki_fallback_kind { + MISAKI_FALLBACK_NONE = 0, /* no eSpeak: unknown words are spelled out with lexicon letters */ + MISAKI_FALLBACK_RULES = 1, /* not produced by this implementation */ + MISAKI_FALLBACK_ESPEAK = 2, /* eSpeak NG output converted to misaki spelling (as in training) */ +}; + +struct misaki_lexicon; +struct misaki_lexicon_deleter { + void operator()(misaki_lexicon *) const noexcept; +}; +using misaki_lexicon_ptr = std::unique_ptr; + +/* `espeak_data_dir` may be nullptr: unknown words are then spelled out. */ +misaki_lexicon_ptr misaki_load_lexicon(const std::string & lexicon_path, const char * espeak_data_dir, + std::string & err_out) noexcept; + +misaki_fallback_kind misaki_get_fallback_kind(const misaki_lexicon * lexicon) noexcept; + +/* English text -> misaki phonemes. The result is paradee's chunks (each at + * most 510 symbols, one sentence or less) joined by single spaces, so a + * chunker that splits after sentence-final punctuation recovers them. + * Returns false and sets `err_out` on failure. */ +bool misaki_phonemize(const misaki_lexicon * lexicon, const std::string & text, std::string & phonemes_out, + std::string & err_out) noexcept; + +/* The same, as separate chunks: paradee/tts.py synthesizes each one in its + * own forward pass. */ +bool misaki_phonemize_chunks(const misaki_lexicon * lexicon, const std::string & text, + std::vector & chunks_out, std::string & err_out) noexcept; + +} // namespace eliza_misaki #endif #endif /* MISAKI_G2P_H */ diff --git a/tools/misaki-g2p/src/misaki-g2p.cpp b/tools/misaki-g2p/src/misaki-g2p.cpp index 3323d60307..b1a76b7dd2 100644 --- a/tools/misaki-g2p/src/misaki-g2p.cpp +++ b/tools/misaki-g2p/src/misaki-g2p.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include struct misaki_g2p { @@ -128,3 +129,90 @@ void misaki_g2p_free(char * s) { std::free(s); } void misaki_g2p_close(misaki_g2p * g) { delete g; } } // extern "C" + +// ------------------------------------------------------------ C++ interface +struct eliza_misaki::misaki_lexicon { + misaki_g2p * g = nullptr; +}; + +void eliza_misaki::misaki_lexicon_deleter::operator()(misaki_lexicon * l) const noexcept { + if (l) { + misaki_g2p_close(l->g); + delete l; + } +} + +eliza_misaki::misaki_lexicon_ptr eliza_misaki::misaki_load_lexicon(const std::string & lexicon_path, + const char * espeak_data_dir, + std::string & err_out) noexcept { + char * err = nullptr; + misaki_g2p * g = misaki_g2p_open(lexicon_path.c_str(), espeak_data_dir, &err); + if (!g) { + try { + err_out = err ? err : "misaki_g2p_open failed"; + } catch (...) { + } + misaki_g2p_free(err); + return nullptr; + } + misaki_lexicon * l = new (std::nothrow) misaki_lexicon(); + if (!l) { + misaki_g2p_close(g); + return nullptr; + } + l->g = g; + return misaki_lexicon_ptr(l); +} + +eliza_misaki::misaki_fallback_kind eliza_misaki::misaki_get_fallback_kind(const misaki_lexicon * l) noexcept { + return (l && misaki_g2p_fallback_kind(l->g) == MISAKI_G2P_FALLBACK_ESPEAK) ? MISAKI_FALLBACK_ESPEAK + : MISAKI_FALLBACK_NONE; +} + +bool eliza_misaki::misaki_phonemize_chunks(const misaki_lexicon * l, const std::string & text, + std::vector & chunks_out, std::string & err_out) noexcept { + try { + chunks_out.clear(); + if (!l) { + err_out = "misaki_phonemize: no lexicon"; + return false; + } + char * out = nullptr; + char * err = nullptr; + if (misaki_g2p_phonemize(l->g, text.data(), text.size(), &out, &err) != 0) { + err_out = err ? err : "misaki_g2p_phonemize failed"; + misaki_g2p_free(err); + return false; + } + std::string all = out; + misaki_g2p_free(out); + size_t a = 0; + while (a <= all.size() && !all.empty()) { + size_t b = all.find('\n', a); + chunks_out.push_back(all.substr(a, b == std::string::npos ? std::string::npos : b - a)); + if (b == std::string::npos) break; + a = b + 1; + } + return true; + } catch (const std::exception & e) { + err_out = e.what(); + return false; + } +} + +bool eliza_misaki::misaki_phonemize(const misaki_lexicon * l, const std::string & text, std::string & phonemes_out, + std::string & err_out) noexcept { + std::vector chunks; + if (!misaki_phonemize_chunks(l, text, chunks, err_out)) return false; + try { + phonemes_out.clear(); + for (size_t i = 0; i < chunks.size(); i++) { + if (i) phonemes_out += ' '; + phonemes_out += chunks[i]; + } + return true; + } catch (const std::exception & e) { + err_out = e.what(); + return false; + } +} diff --git a/tools/misaki-g2p/tests/test_misaki_g2p.cpp b/tools/misaki-g2p/tests/test_misaki_g2p.cpp index 0fb02b5166..327d0781e0 100644 --- a/tools/misaki-g2p/tests/test_misaki_g2p.cpp +++ b/tools/misaki-g2p/tests/test_misaki_g2p.cpp @@ -234,6 +234,23 @@ static void test_api(const std::string & lex) { } } +static void test_cpp_api(const std::string & lex) { + std::string err; + CHECK(!eliza_misaki::misaki_load_lexicon("/nonexistent.lex", nullptr, err) && !err.empty()); + auto l = eliza_misaki::misaki_load_lexicon(lex, nullptr, err); + CHECK(l != nullptr); + if (!l) return; + CHECK(eliza_misaki::misaki_get_fallback_kind(l.get()) == eliza_misaki::MISAKI_FALLBACK_NONE); + std::string ps; + CHECK(eliza_misaki::misaki_phonemize(l.get(), "Hello, world! This is a test.", ps, err)); + check_eq(ps, "həlˈO, wˈɜɹld! ðˌɪs ɪz ɐ tˈɛst.", "C++ misaki_phonemize"); + std::vector chunks; + CHECK(eliza_misaki::misaki_phonemize_chunks(l.get(), "Hello, world! This is a test.", chunks, err)); + CHECK(chunks.size() == 2); + CHECK(eliza_misaki::misaki_phonemize_chunks(l.get(), "", chunks, err) && chunks.empty()); + CHECK(!eliza_misaki::misaki_phonemize(nullptr, "x", ps, err)); +} + static void test_bad_lexicon(const std::string & data) { std::string err; CHECK(LexFile::open(data + "/mini_gold.json", err) == nullptr && err.find("magic") != std::string::npos); @@ -248,6 +265,7 @@ int main(int argc, char ** argv) { test_numbers(); test_tables(argv[2]); test_api(argv[1]); + test_cpp_api(argv[1]); test_bad_lexicon(argv[2]); std::printf("%d passed, %d failed\n", g_pass, g_fail); return g_fail ? 1 : 0; From ed16d708f4a8368c31b52f629a8674ddb50d47b0 Mon Sep 17 00:00:00 2001 From: Shaw Date: Tue, 13 Oct 2026 23:08:28 -0400 Subject: [PATCH 3/4] misaki-g2p: keep user-derived text out of errors; re-init eSpeak per handle - misaki_g2p_phonemize's out-of-vocabulary error no longer embeds the offending chunk. The chunk is the caller's text in phonemes, and libelizainference passes this error up to callers that log it. - Each eSpeak fallback remembers its data directory and re-initialises libespeak-ng under the shared mutex when another handle switched it to a different directory, instead of silently phonemizing with the other handle's data. - The C entry points and the noexcept C++ wrappers catch every exception, not only std::exception, so nothing unwinds across the C ABI; an allocation failure in misaki_load_lexicon now sets err_out. Co-Authored-By: Claude Opus 5.5 --- tools/misaki-g2p/src/espeak.cpp | 39 +++++++++++++--------- tools/misaki-g2p/src/misaki-g2p.cpp | 28 +++++++++++++--- tools/misaki-g2p/src/misaki-internal.h | 5 ++- tools/misaki-g2p/tests/test_misaki_g2p.cpp | 2 ++ 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/tools/misaki-g2p/src/espeak.cpp b/tools/misaki-g2p/src/espeak.cpp index 83ed587149..8e62b175ca 100644 --- a/tools/misaki-g2p/src/espeak.cpp +++ b/tools/misaki-g2p/src/espeak.cpp @@ -7,6 +7,7 @@ #include "misaki-internal.h" #include +#include #if defined(MISAKI_G2P_USE_ESPEAK) # include @@ -157,6 +158,25 @@ std::mutex & espeak_mutex() { } bool g_espeak_ready = false; std::string g_espeak_path; + +// Caller holds espeak_mutex(). (Re)initialises libespeak-ng for data_dir. +bool ensure_espeak_locked(const std::string & data_dir, std::string & err) { + if (g_espeak_ready && g_espeak_path == data_dir) return true; + g_espeak_ready = false; + int rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 0, data_dir.empty() ? nullptr : data_dir.c_str(), 0); + if (rate <= 0) { + err = "espeak_Initialize failed for data dir '" + data_dir + "'"; + return false; + } + // phonemizer selects the first voice whose language is en-us + if (espeak_SetVoiceByName("gmw/en-US") != EE_OK) { + err = "eSpeak NG voice gmw/en-US not found under '" + data_dir + "'"; + return false; + } + g_espeak_ready = true; + g_espeak_path = data_dir; + return true; +} #endif } // namespace @@ -216,21 +236,8 @@ std::unique_ptr EspeakFallback::open(const std::string & data_di err = "eSpeak NG data path is too long for libespeak-ng (max ~135 bytes): " + data_dir; return nullptr; } - if (!g_espeak_ready || g_espeak_path != data_dir) { - int rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 0, data_dir.empty() ? nullptr : data_dir.c_str(), 0); - if (rate <= 0) { - err = "espeak_Initialize failed for data dir '" + data_dir + "'"; - return nullptr; - } - // phonemizer selects the first voice whose language is en-us - if (espeak_SetVoiceByName("gmw/en-US") != EE_OK) { - err = "eSpeak NG voice gmw/en-US not found under '" + data_dir + "'"; - return nullptr; - } - g_espeak_ready = true; - g_espeak_path = data_dir; - } - return std::unique_ptr(new EspeakFallback()); + if (!ensure_espeak_locked(data_dir, err)) return nullptr; + return std::unique_ptr(new EspeakFallback(data_dir)); #else (void) data_dir; err = "misaki_g2p was built without libespeak-ng (MISAKI_G2P_ESPEAK=OFF)"; @@ -243,6 +250,8 @@ EspeakFallback::~EspeakFallback() = default; u32 EspeakFallback::phonemize_line(const u32 & text) { #if defined(MISAKI_G2P_USE_ESPEAK) std::lock_guard lock(espeak_mutex()); + std::string init_err; + if (!ensure_espeak_locked(data_dir_, init_err)) throw std::runtime_error(init_err); std::string utf8 = to_utf8(text); const void * ptr = utf8.c_str(); // EspeakWrapper.text_to_phonemes(text, tie=True) diff --git a/tools/misaki-g2p/src/misaki-g2p.cpp b/tools/misaki-g2p/src/misaki-g2p.cpp index b1a76b7dd2..653ce2af01 100644 --- a/tools/misaki-g2p/src/misaki-g2p.cpp +++ b/tools/misaki-g2p/src/misaki-g2p.cpp @@ -4,6 +4,7 @@ #include "misaki-internal.h" +#include #include #include #include @@ -76,6 +77,9 @@ misaki_g2p * misaki_g2p_open(const char * lex_path, const char * espeak_data_dir } catch (const std::exception & ex) { set_err(err, std::string("misaki_g2p_open: ") + ex.what()); return nullptr; + } catch (...) { + set_err(err, "misaki_g2p_open: unknown error"); + return nullptr; } } @@ -98,8 +102,12 @@ int misaki_g2p_phonemize(misaki_g2p * g, const char * utf8, size_t len, char ** } for (char32_t ch : c) { if (!misaki::in_paradee_vocab(ch)) { - set_err(err, "misaki_g2p_phonemize: symbol U+" + std::to_string((unsigned) ch) + - " is not in the Paradee vocabulary (chunk: " + misaki::to_utf8(c) + ")"); + // The chunk itself is derived from the caller's text: keep it + // out of the error, which callers may log. + char hex[16]; + std::snprintf(hex, sizeof hex, "%04X", (unsigned) ch); + set_err(err, std::string("misaki_g2p_phonemize: symbol U+") + hex + + " is not in the Paradee vocabulary"); return -3; } } @@ -115,6 +123,9 @@ int misaki_g2p_phonemize(misaki_g2p * g, const char * utf8, size_t len, char ** } catch (const std::exception & ex) { set_err(err, std::string("misaki_g2p_phonemize: ") + ex.what()); return -5; + } catch (...) { + set_err(err, "misaki_g2p_phonemize: unknown error"); + return -5; } } @@ -158,6 +169,10 @@ eliza_misaki::misaki_lexicon_ptr eliza_misaki::misaki_load_lexicon(const std::st misaki_lexicon * l = new (std::nothrow) misaki_lexicon(); if (!l) { misaki_g2p_close(g); + try { + err_out = "misaki_load_lexicon: out of memory"; + } catch (...) { + } return nullptr; } l->g = g; @@ -197,6 +212,8 @@ bool eliza_misaki::misaki_phonemize_chunks(const misaki_lexicon * l, const std:: } catch (const std::exception & e) { err_out = e.what(); return false; + } catch (...) { + return false; } } @@ -211,8 +228,11 @@ bool eliza_misaki::misaki_phonemize(const misaki_lexicon * l, const std::string phonemes_out += chunks[i]; } return true; - } catch (const std::exception & e) { - err_out = e.what(); + } catch (...) { + try { + err_out = "misaki_phonemize: out of memory"; + } catch (...) { + } return false; } } diff --git a/tools/misaki-g2p/src/misaki-internal.h b/tools/misaki-g2p/src/misaki-internal.h index a039b109ab..7d9d7d3d1a 100644 --- a/tools/misaki-g2p/src/misaki-internal.h +++ b/tools/misaki-g2p/src/misaki-internal.h @@ -152,8 +152,11 @@ class EspeakFallback { // The E2M mapping alone, on phonemizer-style output (tests). static u32 e2m(const u32 & espeak_tied_ipa); private: - EspeakFallback() = default; + explicit EspeakFallback(std::string data_dir) : data_dir_(std::move(data_dir)) {} u32 phonemize_line(const u32 & text); + // libespeak-ng is process-global: another handle may have re-initialised + // it with a different data directory since this one was opened. + [[maybe_unused]] std::string data_dir_; }; bool espeak_linked(); diff --git a/tools/misaki-g2p/tests/test_misaki_g2p.cpp b/tools/misaki-g2p/tests/test_misaki_g2p.cpp index 327d0781e0..f2124d8675 100644 --- a/tools/misaki-g2p/tests/test_misaki_g2p.cpp +++ b/tools/misaki-g2p/tests/test_misaki_g2p.cpp @@ -203,6 +203,8 @@ static void test_api(const std::string & lex) { int rc = 0; std::string out = phonemize(g, "[hello](/hɛ5o/)", &rc); CHECK(rc != 0 && out.find("vocabulary") != std::string::npos); + // the error must not echo text derived from the caller's input (it may be logged) + CHECK(out.find("hɛ") == std::string::npos); check_eq(phonemize(g, "[hello](/hɛlˈO/) world"), "hɛlˈO wˈɜɹld", "phoneme override"); } // hostile input stays bounded: long runs, many subtokens, long numbers From a23188230867875c974cdf3d16fbd80ec099e3ec Mon Sep 17 00:00:00 2001 From: Shaw Date: Tue, 13 Oct 2026 23:48:39 -0400 Subject: [PATCH 4/4] ty: skip import resolution for misaki-g2p's reference-env scripts The table generators and the agreement-reference script import the pinned Python misaki/spaCy/phonemizer env, which CI does not install, so the python type-check job could not resolve them. Co-Authored-By: Claude Opus 5.5 --- ty.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ty.toml b/ty.toml index 927b8c9279..06cf2d8c50 100644 --- a/ty.toml +++ b/ty.toml @@ -19,6 +19,11 @@ include = [ # type-checker can't resolve it. It runs only against an installed # kokoro env, not under CI. "./tools/kokoro/tools/**", + # tools/misaki-g2p reference/table generators import the pinned Python + # misaki, spaCy, phonemizer-fork, espeakng-loader and num2words; they run + # only in that pinned env (see tools/misaki-g2p/README.md), not under CI. + "./tools/misaki-g2p/scripts/**", + "./tools/misaki-g2p/tests/**", # conversion/* defines mixins (e.g. _Qwen35MtpMixin) whose super() # chains resolve to attributes provided by the composed Model # subclasses in convert_hf_to_gguf.py. ty cannot see that