diff --git a/src/nfc.cc b/src/nfc.cc new file mode 100644 index 0000000..4050ff1 --- /dev/null +++ b/src/nfc.cc @@ -0,0 +1,505 @@ +// This file is under GNU General Public License 3.0 +// see LICENSE.txt + +// converts a C++ string into NFC form + +#include "nfc.hh" +#include +#include +#include +#include + +#include "nfc_sets.hh" + +namespace +{ + // unicode to hex string + std::string u2h(unsigned u) + { + char buf[16] = {0}; + snprintf(buf, 15, "", u ); + return buf; + } + + // octet to hex string + std::string o2h(uint8_t octet) + { + char buf[16] = {0}; + snprintf(buf, 15, "0x%02hhX", octet); + return buf; + } + + + class utf8_exception + { + public: + utf8_exception(uint8_t u) : octet(u) {} + virtual ~utf8_exception() = default; + virtual std::string reason() const = 0; + uint8_t octet; + }; + + + class cont_without_start : public utf8_exception + { + public: + cont_without_start(uint8_t u) : utf8_exception(u) {} + std::string reason() const override { return "Continuation octet " + o2h(octet) + " without start octet"; } + }; + + + class overlong_sequence : public utf8_exception + { + public: + overlong_sequence(uint8_t octet, unsigned u) : utf8_exception(octet), unicode(u) {} + std::string reason() const override { return "Overlong sequence for " + u2h(unicode); } + unsigned unicode; + }; + + + class unexpected_end : public utf8_exception + { + public: + unexpected_end(uint8_t u) : utf8_exception(u) {} + std::string reason() const override { return "Unexpected end of string"; } + }; + + class surrogate : public utf8_exception + { + public: + surrogate(uint8_t u, unsigned s) : utf8_exception(u), surr(s) {} + std::string reason() const override { return "UTF-8-encoded UTF-16 surrogate " + u2h(surr) + " detected"; } + private: + unsigned surr; + }; + + class no_unicode : public utf8_exception + { + public: + explicit no_unicode(uint8_t _octet) : utf8_exception(_octet) {} + std::string reason() const override { return "Octet " + o2h(octet) + " is illegal in UTF-8"; } + }; + + class too_big : public utf8_exception + { + public: + explicit too_big(uint8_t _octet, unsigned u) : utf8_exception(_octet), unicode(u) {} + std::string reason() const override { return "Value " + u2h(unicode) + " is too big for Unicode"; } + unsigned unicode; + }; + + + std::string escape(sv s) + { + std::string ret; ret.reserve(s.size() + 16 ); + for(char c : s) + { + const uint8_t u = c; + if(u>=32 && u<=126) + { + ret += c; + }else{ + char buf[16]; + snprintf(buf,15, "«%02x»", u ); + ret += buf; + } + } + return ret; + } + + // returns the "CanonicalCombinincClass" of the given Unicode codpoint u + unsigned canonicalClass(unsigned u) + { + const auto q = NFC_CombiningClass.find(u); + if(q==NFC_CombiningClass.end()) + { + return 0; // not found in map. + }else{ + return q->second; + } + } + + std::pair decompose(unsigned u) + { + const auto q = NFC_Decompose.find(u); + if(q==NFC_Decompose.end()) + { + return std::make_pair(-1, -1); + }else{ + return q->second; + } + } + + std::u32string decompose_full(unsigned u) + { + const std::pair d = decompose(u); + if(d.first<0) + { + return std::u32string( 1, char32_t(u) ); + }else{ + if(d.second<0) + { + return decompose_full(d.first); + } + } + return decompose_full(d.first) + decompose_full(d.second); + } + + + // according to Unicode Standard, clause D108: + bool isReorderablePair(unsigned a, unsigned b) + { + const unsigned cca = canonicalClass(a); + const unsigned ccb = canonicalClass(b); + + return (cca > ccb) && (ccb>0); + } + + // Unicode standard requires bubble sort, for stability reasons? + void canonicalOrdering(std::u32string& us) + { + if(us.size()<2) + return; + + for(unsigned n=us.size(); n>1; --n) + for(unsigned i=0; i=0xD800 && ret<=0xDFFF) throw surrogate(u, ret); + return ret; + } else if (u<=0xF4) // 4 octet sequence + { + ++c; + if(c==end) throw unexpected_end(u); + const uint8_t uu = uint8_t(*c); + if((uu & 0xC0) != 0x80) + { + throw unexpected_end(uu); + } + ++c; + if(c==end) throw unexpected_end(uu); + const uint8_t uuu = uint8_t(*c); + if((uuu & 0xC0) != 0x80) + { + throw unexpected_end(uuu); + } + ++c; + if(c==end) throw unexpected_end(uuu); + const uint8_t uuuu = uint8_t(*c); + if((uuuu & 0xC0) != 0x80) + { + throw unexpected_end(uuuu); + } + + const uint32_t ret = ((u & 0xF) << 18) + ((uu & 0x3F)<<12) + ((uuu & 0x3F)<<6) + (uuuu & 0x3F); + if(ret<0x10000) throw overlong_sequence(u, ret); + if(ret>0x10FFFF) throw too_big(u, ret); + return ret; + } else + { + throw no_unicode(u); + } + } + + throw unexpected_end(-1); +} + + +void toUtf8(const char32_t c, std::string& ret) +{ + if(c<=0x7F) + { + ret += char(c); + }else if(c<=0x7FF) + { + ret += char( 0xC0 + (c>>6) ); + ret += char( 0x80 + (c & 63)); + }else if(c<=0xFFFF) + { + ret += char( 0xE0 + (c>>12) ); + ret += char( 0x80 + ((c>>6) & 63)); + ret += char( 0x80 + (c & 63)); + }else if(c<=0x10FFFF) + { + ret += char( 0xF0 + (c>>18) ); + ret += char( 0x80 + ((c>>12) & 63)); + ret += char( 0x80 + ((c>>6) & 63)); + ret += char( 0x80 + (c & 63)); + }else{ + throw too_big(0, c); + } +} + + +std::string toUtf8(const std::u32string& u32) +{ + std::string ret; + for(char32_t c : u32) + { + toUtf8(c, ret); + } + return ret; +} + + +illegal_utf8::illegal_utf8( sv s, unsigned position, const std::string& reason) +: std::runtime_error( "Illegal UTF-8 string \"" + escape(s) + "\" at position " + std::to_string(position) + ": " + reason ) +{} + + +illegal_utf8::illegal_utf8( const std::string& msg ) +: std::runtime_error( msg ) +{} + + +void assert_utf8(sv s) +{ + const char* begin = s.data(); + const char* const end = s.data() + s.size(); + try + { + while(begin(s.size()*1.25) ); + const char* begin = s.data(); + const char* end = s.data() + s.size(); + for(; begin +bool blocked(Iter L, Iter C) +{ + Iter B = L; ++B; + for(;B!=C;++B) + { + if(canonicalClass(*B)==0 || canonicalClass(*B)==canonicalClass(*C)) + return true; + } + return false; +} + + +template +void combine(std::u32string& nfc, Iter starter, Iter next_starter) +{ + Iter c = starter; ++c; + for(;c!=next_starter; ++c) + { + if(!blocked(starter, c)) + { + const unsigned starter_u = *starter; + const unsigned c_u = *c; + + auto q = NFC_Compose.find( std::make_pair(starter_u,c_u) ); + if(q!=NFC_Compose.end()) + { + *starter = q->second; + *c = -1; + } + } + } + + // now add the remaining/changed characters to the NFC string: + for(Iter c = starter; c!=next_starter; ++c) + { + if( int(*c) >= 0) + { + nfc += *c; + } + } +} + +// the nfd string is changed during composing process. So it works on a copy or call with std::move(). +std::u32string createNFC(std::u32string nfd) +{ + if(nfd.size()<=1) + return nfd; + + std::u32string nfc; + nfc.reserve(nfd.size()); + auto starter = nfd.begin(); + while( starter != nfd.end() ) + { + if( canonicalClass(*starter)!=0 ) + { + nfc += *starter; + ++starter; + }else{ + auto next_starter = std::find_if(starter+1, nfd.end(), [](char32_t c){return canonicalClass(c)==0;} ); + combine(nfc, starter, next_starter); + starter = next_starter; + } + } + return nfc; +} + + +IsNFC isNFC_quick_check(sv s) +{ + const char* begin = s.data(); + const char* const end = s.data() + s.size(); + try + { + unsigned last_cc = 0; + while(begin cc) ) + { + return IsNFC::No; + } + if(NFC_No.count(u)) return IsNFC::No; + if(NFC_Maybe.count(u)) return IsNFC::Maybe; + ++begin; + last_cc = cc; + } + } + catch(const utf8_exception& e) + { + throw illegal_utf8(s, begin - s.data(), e.reason()); + } + return IsNFC::Yes; +} + + +bool isNFC(sv s) +{ + switch( isNFC_quick_check(s) ) + { + case IsNFC::Yes : return true; + case IsNFC::No : return false; + case IsNFC::Maybe: + { + return s == toNFC(s); // very expensive! + } + } + + throw -1; // could never happen, but compiler is too dumb to see this. +} + +bool isUtf8(const char* begin, const char* end) +try{ + for(; begin, unsigned> generate_nfc_compose() +{ + std::map< std::pair, unsigned> m; + for(const auto& decomp : NFC_Decompose) + { + if(decomp.second.second >= 0) // skip singleton decompositions + { + m[ decomp.second ] = decomp.first; + } + } + + return m; +} diff --git a/src/nfc.hh b/src/nfc.hh new file mode 100644 index 0000000..2cf3557 --- /dev/null +++ b/src/nfc.hh @@ -0,0 +1,60 @@ +// This file is under GNU General Public License 3.0 +// see LICENSE.txt + +#ifndef JSON_ADAPTER_NFC_HH +#define JSON_ADAPTER_NFC_HH + +#include "config.hh" // to switch between std::string_view or boost::string_view.hh +#include +#include +#include + +enum class IsNFC +{ + No=0, // contains a character that cannot occur in NFC + Maybe=1, // contains a character that is only allowed in certain positions in NFC + Yes=2 // contains no invalid or partially valid character +}; + +std::ostream& operator<<(std::ostream& o, IsNFC is_nfc); + + +class illegal_utf8 : public std::runtime_error +{ +public: + illegal_utf8(sv, unsigned position, const std::string& reason); +protected: + explicit illegal_utf8(const std::string& message); +}; + + +// scans the char sequences and parses UTF-8 sequences. Detect UTF-8 errors and throws exceptions. +uint32_t parseUtf8(const char*& c, const char* end); + +// converts 'c' into a UTF-8 sequence and adds it to 'ret' +void toUtf8(const char32_t c, std::string& ret); + +// throws illegal_utf8 exception if s is not valid UTF-8 +void assert_utf8(sv s); + +// creates an NFD u32string from UTF-8 input string s +std::u32string fromUtf8_decompose(sv s); + +// convert NFD to NFC +std::u32string createNFC(std::u32string nfd_string); + +// return No or Maybe, if at least one character with NFC_Quickcheck class is "No" or "Maybe" +// might throw illegal_utf8 exception +IsNFC isNFC_quick_check(sv s); + +// runs first quick check and a deep test if quick check returns "Maybe". +bool isNFC(sv s); + +// returns true if the sequence is valid UTF-8 +bool isUtf8(const char* begin, const char* end); + +// converts a C++ string (in UTF-8) into NFC form +// s is ''moved'' to the return value if possible so no copy is done here. +std::string toNFC(sv s); + +#endif // JSON_ADAPTER_NFC_HH diff --git a/src/nfc_sets.cc b/src/nfc_sets.cc new file mode 100644 index 0000000..b8a7ef6 --- /dev/null +++ b/src/nfc_sets.cc @@ -0,0 +1,3078 @@ +// This file is generated by scripts/gen_sets.sh +// DO NOT EDIT IT! + +#include "nfc_sets.hh" + + +const std::set NFC_No = { + 0x0340,0x0341,0x0343,0x0344,0x0374,0x037E,0x0387,0x0958,0x0959,0x095A, + 0x095B,0x095C,0x095D,0x095E,0x095F,0x09DC,0x09DD,0x09DF,0x0A33,0x0A36, + 0x0A59,0x0A5A,0x0A5B,0x0A5E,0x0B5C,0x0B5D,0x0F43,0x0F4D,0x0F52,0x0F57, + 0x0F5C,0x0F69,0x0F73,0x0F75,0x0F76,0x0F78,0x0F81,0x0F93,0x0F9D,0x0FA2, + 0x0FA7,0x0FAC,0x0FB9,0x1F71,0x1F73,0x1F75,0x1F77,0x1F79,0x1F7B,0x1F7D, + 0x1FBB,0x1FBE,0x1FC9,0x1FCB,0x1FD3,0x1FDB,0x1FE3,0x1FEB,0x1FEE,0x1FEF, + 0x1FF9,0x1FFB,0x1FFD,0x2000,0x2001,0x2126,0x212A,0x212B,0x2329,0x232A, + 0x2ADC,0xF900,0xF901,0xF902,0xF903,0xF904,0xF905,0xF906,0xF907,0xF908, + 0xF909,0xF90A,0xF90B,0xF90C,0xF90D,0xF90E,0xF90F,0xF910,0xF911,0xF912, + 0xF913,0xF914,0xF915,0xF916,0xF917,0xF918,0xF919,0xF91A,0xF91B,0xF91C, + 0xF91D,0xF91E,0xF91F,0xF920,0xF921,0xF922,0xF923,0xF924,0xF925,0xF926, + 0xF927,0xF928,0xF929,0xF92A,0xF92B,0xF92C,0xF92D,0xF92E,0xF92F,0xF930, + 0xF931,0xF932,0xF933,0xF934,0xF935,0xF936,0xF937,0xF938,0xF939,0xF93A, + 0xF93B,0xF93C,0xF93D,0xF93E,0xF93F,0xF940,0xF941,0xF942,0xF943,0xF944, + 0xF945,0xF946,0xF947,0xF948,0xF949,0xF94A,0xF94B,0xF94C,0xF94D,0xF94E, + 0xF94F,0xF950,0xF951,0xF952,0xF953,0xF954,0xF955,0xF956,0xF957,0xF958, + 0xF959,0xF95A,0xF95B,0xF95C,0xF95D,0xF95E,0xF95F,0xF960,0xF961,0xF962, + 0xF963,0xF964,0xF965,0xF966,0xF967,0xF968,0xF969,0xF96A,0xF96B,0xF96C, + 0xF96D,0xF96E,0xF96F,0xF970,0xF971,0xF972,0xF973,0xF974,0xF975,0xF976, + 0xF977,0xF978,0xF979,0xF97A,0xF97B,0xF97C,0xF97D,0xF97E,0xF97F,0xF980, + 0xF981,0xF982,0xF983,0xF984,0xF985,0xF986,0xF987,0xF988,0xF989,0xF98A, + 0xF98B,0xF98C,0xF98D,0xF98E,0xF98F,0xF990,0xF991,0xF992,0xF993,0xF994, + 0xF995,0xF996,0xF997,0xF998,0xF999,0xF99A,0xF99B,0xF99C,0xF99D,0xF99E, + 0xF99F,0xF9A0,0xF9A1,0xF9A2,0xF9A3,0xF9A4,0xF9A5,0xF9A6,0xF9A7,0xF9A8, + 0xF9A9,0xF9AA,0xF9AB,0xF9AC,0xF9AD,0xF9AE,0xF9AF,0xF9B0,0xF9B1,0xF9B2, + 0xF9B3,0xF9B4,0xF9B5,0xF9B6,0xF9B7,0xF9B8,0xF9B9,0xF9BA,0xF9BB,0xF9BC, + 0xF9BD,0xF9BE,0xF9BF,0xF9C0,0xF9C1,0xF9C2,0xF9C3,0xF9C4,0xF9C5,0xF9C6, + 0xF9C7,0xF9C8,0xF9C9,0xF9CA,0xF9CB,0xF9CC,0xF9CD,0xF9CE,0xF9CF,0xF9D0, + 0xF9D1,0xF9D2,0xF9D3,0xF9D4,0xF9D5,0xF9D6,0xF9D7,0xF9D8,0xF9D9,0xF9DA, + 0xF9DB,0xF9DC,0xF9DD,0xF9DE,0xF9DF,0xF9E0,0xF9E1,0xF9E2,0xF9E3,0xF9E4, + 0xF9E5,0xF9E6,0xF9E7,0xF9E8,0xF9E9,0xF9EA,0xF9EB,0xF9EC,0xF9ED,0xF9EE, + 0xF9EF,0xF9F0,0xF9F1,0xF9F2,0xF9F3,0xF9F4,0xF9F5,0xF9F6,0xF9F7,0xF9F8, + 0xF9F9,0xF9FA,0xF9FB,0xF9FC,0xF9FD,0xF9FE,0xF9FF,0xFA00,0xFA01,0xFA02, + 0xFA03,0xFA04,0xFA05,0xFA06,0xFA07,0xFA08,0xFA09,0xFA0A,0xFA0B,0xFA0C, + 0xFA0D,0xFA10,0xFA12,0xFA15,0xFA16,0xFA17,0xFA18,0xFA19,0xFA1A,0xFA1B, + 0xFA1C,0xFA1D,0xFA1E,0xFA20,0xFA22,0xFA25,0xFA26,0xFA2A,0xFA2B,0xFA2C, + 0xFA2D,0xFA2E,0xFA2F,0xFA30,0xFA31,0xFA32,0xFA33,0xFA34,0xFA35,0xFA36, + 0xFA37,0xFA38,0xFA39,0xFA3A,0xFA3B,0xFA3C,0xFA3D,0xFA3E,0xFA3F,0xFA40, + 0xFA41,0xFA42,0xFA43,0xFA44,0xFA45,0xFA46,0xFA47,0xFA48,0xFA49,0xFA4A, + 0xFA4B,0xFA4C,0xFA4D,0xFA4E,0xFA4F,0xFA50,0xFA51,0xFA52,0xFA53,0xFA54, + 0xFA55,0xFA56,0xFA57,0xFA58,0xFA59,0xFA5A,0xFA5B,0xFA5C,0xFA5D,0xFA5E, + 0xFA5F,0xFA60,0xFA61,0xFA62,0xFA63,0xFA64,0xFA65,0xFA66,0xFA67,0xFA68, + 0xFA69,0xFA6A,0xFA6B,0xFA6C,0xFA6D,0xFA70,0xFA71,0xFA72,0xFA73,0xFA74, + 0xFA75,0xFA76,0xFA77,0xFA78,0xFA79,0xFA7A,0xFA7B,0xFA7C,0xFA7D,0xFA7E, + 0xFA7F,0xFA80,0xFA81,0xFA82,0xFA83,0xFA84,0xFA85,0xFA86,0xFA87,0xFA88, + 0xFA89,0xFA8A,0xFA8B,0xFA8C,0xFA8D,0xFA8E,0xFA8F,0xFA90,0xFA91,0xFA92, + 0xFA93,0xFA94,0xFA95,0xFA96,0xFA97,0xFA98,0xFA99,0xFA9A,0xFA9B,0xFA9C, + 0xFA9D,0xFA9E,0xFA9F,0xFAA0,0xFAA1,0xFAA2,0xFAA3,0xFAA4,0xFAA5,0xFAA6, + 0xFAA7,0xFAA8,0xFAA9,0xFAAA,0xFAAB,0xFAAC,0xFAAD,0xFAAE,0xFAAF,0xFAB0, + 0xFAB1,0xFAB2,0xFAB3,0xFAB4,0xFAB5,0xFAB6,0xFAB7,0xFAB8,0xFAB9,0xFABA, + 0xFABB,0xFABC,0xFABD,0xFABE,0xFABF,0xFAC0,0xFAC1,0xFAC2,0xFAC3,0xFAC4, + 0xFAC5,0xFAC6,0xFAC7,0xFAC8,0xFAC9,0xFACA,0xFACB,0xFACC,0xFACD,0xFACE, + 0xFACF,0xFAD0,0xFAD1,0xFAD2,0xFAD3,0xFAD4,0xFAD5,0xFAD6,0xFAD7,0xFAD8, + 0xFAD9,0xFB1D,0xFB1F,0xFB2A,0xFB2B,0xFB2C,0xFB2D,0xFB2E,0xFB2F,0xFB30, + 0xFB31,0xFB32,0xFB33,0xFB34,0xFB35,0xFB36,0xFB38,0xFB39,0xFB3A,0xFB3B, + 0xFB3C,0xFB3E,0xFB40,0xFB41,0xFB43,0xFB44,0xFB46,0xFB47,0xFB48,0xFB49, + 0xFB4A,0xFB4B,0xFB4C,0xFB4D,0xFB4E,0x1D15E,0x1D15F,0x1D160,0x1D161,0x1D162, + 0x1D163,0x1D164,0x1D1BB,0x1D1BC,0x1D1BD,0x1D1BE,0x1D1BF,0x1D1C0,0x2F800,0x2F801, + 0x2F802,0x2F803,0x2F804,0x2F805,0x2F806,0x2F807,0x2F808,0x2F809,0x2F80A,0x2F80B, + 0x2F80C,0x2F80D,0x2F80E,0x2F80F,0x2F810,0x2F811,0x2F812,0x2F813,0x2F814,0x2F815, + 0x2F816,0x2F817,0x2F818,0x2F819,0x2F81A,0x2F81B,0x2F81C,0x2F81D,0x2F81E,0x2F81F, + 0x2F820,0x2F821,0x2F822,0x2F823,0x2F824,0x2F825,0x2F826,0x2F827,0x2F828,0x2F829, + 0x2F82A,0x2F82B,0x2F82C,0x2F82D,0x2F82E,0x2F82F,0x2F830,0x2F831,0x2F832,0x2F833, + 0x2F834,0x2F835,0x2F836,0x2F837,0x2F838,0x2F839,0x2F83A,0x2F83B,0x2F83C,0x2F83D, + 0x2F83E,0x2F83F,0x2F840,0x2F841,0x2F842,0x2F843,0x2F844,0x2F845,0x2F846,0x2F847, + 0x2F848,0x2F849,0x2F84A,0x2F84B,0x2F84C,0x2F84D,0x2F84E,0x2F84F,0x2F850,0x2F851, + 0x2F852,0x2F853,0x2F854,0x2F855,0x2F856,0x2F857,0x2F858,0x2F859,0x2F85A,0x2F85B, + 0x2F85C,0x2F85D,0x2F85E,0x2F85F,0x2F860,0x2F861,0x2F862,0x2F863,0x2F864,0x2F865, + 0x2F866,0x2F867,0x2F868,0x2F869,0x2F86A,0x2F86B,0x2F86C,0x2F86D,0x2F86E,0x2F86F, + 0x2F870,0x2F871,0x2F872,0x2F873,0x2F874,0x2F875,0x2F876,0x2F877,0x2F878,0x2F879, + 0x2F87A,0x2F87B,0x2F87C,0x2F87D,0x2F87E,0x2F87F,0x2F880,0x2F881,0x2F882,0x2F883, + 0x2F884,0x2F885,0x2F886,0x2F887,0x2F888,0x2F889,0x2F88A,0x2F88B,0x2F88C,0x2F88D, + 0x2F88E,0x2F88F,0x2F890,0x2F891,0x2F892,0x2F893,0x2F894,0x2F895,0x2F896,0x2F897, + 0x2F898,0x2F899,0x2F89A,0x2F89B,0x2F89C,0x2F89D,0x2F89E,0x2F89F,0x2F8A0,0x2F8A1, + 0x2F8A2,0x2F8A3,0x2F8A4,0x2F8A5,0x2F8A6,0x2F8A7,0x2F8A8,0x2F8A9,0x2F8AA,0x2F8AB, + 0x2F8AC,0x2F8AD,0x2F8AE,0x2F8AF,0x2F8B0,0x2F8B1,0x2F8B2,0x2F8B3,0x2F8B4,0x2F8B5, + 0x2F8B6,0x2F8B7,0x2F8B8,0x2F8B9,0x2F8BA,0x2F8BB,0x2F8BC,0x2F8BD,0x2F8BE,0x2F8BF, + 0x2F8C0,0x2F8C1,0x2F8C2,0x2F8C3,0x2F8C4,0x2F8C5,0x2F8C6,0x2F8C7,0x2F8C8,0x2F8C9, + 0x2F8CA,0x2F8CB,0x2F8CC,0x2F8CD,0x2F8CE,0x2F8CF,0x2F8D0,0x2F8D1,0x2F8D2,0x2F8D3, + 0x2F8D4,0x2F8D5,0x2F8D6,0x2F8D7,0x2F8D8,0x2F8D9,0x2F8DA,0x2F8DB,0x2F8DC,0x2F8DD, + 0x2F8DE,0x2F8DF,0x2F8E0,0x2F8E1,0x2F8E2,0x2F8E3,0x2F8E4,0x2F8E5,0x2F8E6,0x2F8E7, + 0x2F8E8,0x2F8E9,0x2F8EA,0x2F8EB,0x2F8EC,0x2F8ED,0x2F8EE,0x2F8EF,0x2F8F0,0x2F8F1, + 0x2F8F2,0x2F8F3,0x2F8F4,0x2F8F5,0x2F8F6,0x2F8F7,0x2F8F8,0x2F8F9,0x2F8FA,0x2F8FB, + 0x2F8FC,0x2F8FD,0x2F8FE,0x2F8FF,0x2F900,0x2F901,0x2F902,0x2F903,0x2F904,0x2F905, + 0x2F906,0x2F907,0x2F908,0x2F909,0x2F90A,0x2F90B,0x2F90C,0x2F90D,0x2F90E,0x2F90F, + 0x2F910,0x2F911,0x2F912,0x2F913,0x2F914,0x2F915,0x2F916,0x2F917,0x2F918,0x2F919, + 0x2F91A,0x2F91B,0x2F91C,0x2F91D,0x2F91E,0x2F91F,0x2F920,0x2F921,0x2F922,0x2F923, + 0x2F924,0x2F925,0x2F926,0x2F927,0x2F928,0x2F929,0x2F92A,0x2F92B,0x2F92C,0x2F92D, + 0x2F92E,0x2F92F,0x2F930,0x2F931,0x2F932,0x2F933,0x2F934,0x2F935,0x2F936,0x2F937, + 0x2F938,0x2F939,0x2F93A,0x2F93B,0x2F93C,0x2F93D,0x2F93E,0x2F93F,0x2F940,0x2F941, + 0x2F942,0x2F943,0x2F944,0x2F945,0x2F946,0x2F947,0x2F948,0x2F949,0x2F94A,0x2F94B, + 0x2F94C,0x2F94D,0x2F94E,0x2F94F,0x2F950,0x2F951,0x2F952,0x2F953,0x2F954,0x2F955, + 0x2F956,0x2F957,0x2F958,0x2F959,0x2F95A,0x2F95B,0x2F95C,0x2F95D,0x2F95E,0x2F95F, + 0x2F960,0x2F961,0x2F962,0x2F963,0x2F964,0x2F965,0x2F966,0x2F967,0x2F968,0x2F969, + 0x2F96A,0x2F96B,0x2F96C,0x2F96D,0x2F96E,0x2F96F,0x2F970,0x2F971,0x2F972,0x2F973, + 0x2F974,0x2F975,0x2F976,0x2F977,0x2F978,0x2F979,0x2F97A,0x2F97B,0x2F97C,0x2F97D, + 0x2F97E,0x2F97F,0x2F980,0x2F981,0x2F982,0x2F983,0x2F984,0x2F985,0x2F986,0x2F987, + 0x2F988,0x2F989,0x2F98A,0x2F98B,0x2F98C,0x2F98D,0x2F98E,0x2F98F,0x2F990,0x2F991, + 0x2F992,0x2F993,0x2F994,0x2F995,0x2F996,0x2F997,0x2F998,0x2F999,0x2F99A,0x2F99B, + 0x2F99C,0x2F99D,0x2F99E,0x2F99F,0x2F9A0,0x2F9A1,0x2F9A2,0x2F9A3,0x2F9A4,0x2F9A5, + 0x2F9A6,0x2F9A7,0x2F9A8,0x2F9A9,0x2F9AA,0x2F9AB,0x2F9AC,0x2F9AD,0x2F9AE,0x2F9AF, + 0x2F9B0,0x2F9B1,0x2F9B2,0x2F9B3,0x2F9B4,0x2F9B5,0x2F9B6,0x2F9B7,0x2F9B8,0x2F9B9, + 0x2F9BA,0x2F9BB,0x2F9BC,0x2F9BD,0x2F9BE,0x2F9BF,0x2F9C0,0x2F9C1,0x2F9C2,0x2F9C3, + 0x2F9C4,0x2F9C5,0x2F9C6,0x2F9C7,0x2F9C8,0x2F9C9,0x2F9CA,0x2F9CB,0x2F9CC,0x2F9CD, + 0x2F9CE,0x2F9CF,0x2F9D0,0x2F9D1,0x2F9D2,0x2F9D3,0x2F9D4,0x2F9D5,0x2F9D6,0x2F9D7, + 0x2F9D8,0x2F9D9,0x2F9DA,0x2F9DB,0x2F9DC,0x2F9DD,0x2F9DE,0x2F9DF,0x2F9E0,0x2F9E1, + 0x2F9E2,0x2F9E3,0x2F9E4,0x2F9E5,0x2F9E6,0x2F9E7,0x2F9E8,0x2F9E9,0x2F9EA,0x2F9EB, + 0x2F9EC,0x2F9ED,0x2F9EE,0x2F9EF,0x2F9F0,0x2F9F1,0x2F9F2,0x2F9F3,0x2F9F4,0x2F9F5, + 0x2F9F6,0x2F9F7,0x2F9F8,0x2F9F9,0x2F9FA,0x2F9FB,0x2F9FC,0x2F9FD,0x2F9FE,0x2F9FF, + 0x2FA00,0x2FA01,0x2FA02,0x2FA03,0x2FA04,0x2FA05,0x2FA06,0x2FA07,0x2FA08,0x2FA09, + 0x2FA0A,0x2FA0B,0x2FA0C,0x2FA0D,0x2FA0E,0x2FA0F,0x2FA10,0x2FA11,0x2FA12,0x2FA13, + 0x2FA14,0x2FA15,0x2FA16,0x2FA17,0x2FA18,0x2FA19,0x2FA1A,0x2FA1B,0x2FA1C,0x2FA1D, + }; + +const std::set NFC_Maybe = { + 0x0300,0x0301,0x0302,0x0303,0x0304,0x0306,0x0307,0x0308,0x0309,0x030A, + 0x030B,0x030C,0x030F,0x0311,0x0313,0x0314,0x031B,0x0323,0x0324,0x0325, + 0x0326,0x0327,0x0328,0x032D,0x032E,0x0330,0x0331,0x0338,0x0342,0x0345, + 0x0653,0x0654,0x0655,0x093C,0x09BE,0x09D7,0x0B3E,0x0B56,0x0B57,0x0BBE, + 0x0BD7,0x0C56,0x0CC2,0x0CD5,0x0CD6,0x0D3E,0x0D57,0x0DCA,0x0DCF,0x0DDF, + 0x102E,0x1161,0x1162,0x1163,0x1164,0x1165,0x1166,0x1167,0x1168,0x1169, + 0x116A,0x116B,0x116C,0x116D,0x116E,0x116F,0x1170,0x1171,0x1172,0x1173, + 0x1174,0x1175,0x11A8,0x11A9,0x11AA,0x11AB,0x11AC,0x11AD,0x11AE,0x11AF, + 0x11B0,0x11B1,0x11B2,0x11B3,0x11B4,0x11B5,0x11B6,0x11B7,0x11B8,0x11B9, + 0x11BA,0x11BB,0x11BC,0x11BD,0x11BE,0x11BF,0x11C0,0x11C1,0x11C2,0x1B35, + 0x3099,0x309A,0x110BA,0x11127,0x1133E,0x11357,0x114B0,0x114BA,0x114BD,0x115AF, + 0x11930, + }; + +const std::map NFC_CombiningClass = { + {0x0300, 230}, + {0x0301, 230}, + {0x0302, 230}, + {0x0303, 230}, + {0x0304, 230}, + {0x0305, 230}, + {0x0306, 230}, + {0x0307, 230}, + {0x0308, 230}, + {0x0309, 230}, + {0x030A, 230}, + {0x030B, 230}, + {0x030C, 230}, + {0x030D, 230}, + {0x030E, 230}, + {0x030F, 230}, + {0x0310, 230}, + {0x0311, 230}, + {0x0312, 230}, + {0x0313, 230}, + {0x0314, 230}, + {0x0315, 232}, + {0x0316, 220}, + {0x0317, 220}, + {0x0318, 220}, + {0x0319, 220}, + {0x031A, 232}, + {0x031B, 216}, + {0x031C, 220}, + {0x031D, 220}, + {0x031E, 220}, + {0x031F, 220}, + {0x0320, 220}, + {0x0321, 202}, + {0x0322, 202}, + {0x0323, 220}, + {0x0324, 220}, + {0x0325, 220}, + {0x0326, 220}, + {0x0327, 202}, + {0x0328, 202}, + {0x0329, 220}, + {0x032A, 220}, + {0x032B, 220}, + {0x032C, 220}, + {0x032D, 220}, + {0x032E, 220}, + {0x032F, 220}, + {0x0330, 220}, + {0x0331, 220}, + {0x0332, 220}, + {0x0333, 220}, + {0x0334, 1}, + {0x0335, 1}, + {0x0336, 1}, + {0x0337, 1}, + {0x0338, 1}, + {0x0339, 220}, + {0x033A, 220}, + {0x033B, 220}, + {0x033C, 220}, + {0x033D, 230}, + {0x033E, 230}, + {0x033F, 230}, + {0x0340, 230}, + {0x0341, 230}, + {0x0342, 230}, + {0x0343, 230}, + {0x0344, 230}, + {0x0345, 240}, + {0x0346, 230}, + {0x0347, 220}, + {0x0348, 220}, + {0x0349, 220}, + {0x034A, 230}, + {0x034B, 230}, + {0x034C, 230}, + {0x034D, 220}, + {0x034E, 220}, + {0x0350, 230}, + {0x0351, 230}, + {0x0352, 230}, + {0x0353, 220}, + {0x0354, 220}, + {0x0355, 220}, + {0x0356, 220}, + {0x0357, 230}, + {0x0358, 232}, + {0x0359, 220}, + {0x035A, 220}, + {0x035B, 230}, + {0x035C, 233}, + {0x035D, 234}, + {0x035E, 234}, + {0x035F, 233}, + {0x0360, 234}, + {0x0361, 234}, + {0x0362, 233}, + {0x0363, 230}, + {0x0364, 230}, + {0x0365, 230}, + {0x0366, 230}, + {0x0367, 230}, + {0x0368, 230}, + {0x0369, 230}, + {0x036A, 230}, + {0x036B, 230}, + {0x036C, 230}, + {0x036D, 230}, + {0x036E, 230}, + {0x036F, 230}, + {0x0483, 230}, + {0x0484, 230}, + {0x0485, 230}, + {0x0486, 230}, + {0x0487, 230}, + {0x0591, 220}, + {0x0592, 230}, + {0x0593, 230}, + {0x0594, 230}, + {0x0595, 230}, + {0x0596, 220}, + {0x0597, 230}, + {0x0598, 230}, + {0x0599, 230}, + {0x059A, 222}, + {0x059B, 220}, + {0x059C, 230}, + {0x059D, 230}, + {0x059E, 230}, + {0x059F, 230}, + {0x05A0, 230}, + {0x05A1, 230}, + {0x05A2, 220}, + {0x05A3, 220}, + {0x05A4, 220}, + {0x05A5, 220}, + {0x05A6, 220}, + {0x05A7, 220}, + {0x05A8, 230}, + {0x05A9, 230}, + {0x05AA, 220}, + {0x05AB, 230}, + {0x05AC, 230}, + {0x05AD, 222}, + {0x05AE, 228}, + {0x05AF, 230}, + {0x05B0, 10}, + {0x05B1, 11}, + {0x05B2, 12}, + {0x05B3, 13}, + {0x05B4, 14}, + {0x05B5, 15}, + {0x05B6, 16}, + {0x05B7, 17}, + {0x05B8, 18}, + {0x05B9, 19}, + {0x05BA, 19}, + {0x05BB, 20}, + {0x05BC, 21}, + {0x05BD, 22}, + {0x05BF, 23}, + {0x05C1, 24}, + {0x05C2, 25}, + {0x05C4, 230}, + {0x05C5, 220}, + {0x05C7, 18}, + {0x0610, 230}, + {0x0611, 230}, + {0x0612, 230}, + {0x0613, 230}, + {0x0614, 230}, + {0x0615, 230}, + {0x0616, 230}, + {0x0617, 230}, + {0x0618, 30}, + {0x0619, 31}, + {0x061A, 32}, + {0x064B, 27}, + {0x064C, 28}, + {0x064D, 29}, + {0x064E, 30}, + {0x064F, 31}, + {0x0650, 32}, + {0x0651, 33}, + {0x0652, 34}, + {0x0653, 230}, + {0x0654, 230}, + {0x0655, 220}, + {0x0656, 220}, + {0x0657, 230}, + {0x0658, 230}, + {0x0659, 230}, + {0x065A, 230}, + {0x065B, 230}, + {0x065C, 220}, + {0x065D, 230}, + {0x065E, 230}, + {0x065F, 220}, + {0x0670, 35}, + {0x06D6, 230}, + {0x06D7, 230}, + {0x06D8, 230}, + {0x06D9, 230}, + {0x06DA, 230}, + {0x06DB, 230}, + {0x06DC, 230}, + {0x06DF, 230}, + {0x06E0, 230}, + {0x06E1, 230}, + {0x06E2, 230}, + {0x06E3, 220}, + {0x06E4, 230}, + {0x06E7, 230}, + {0x06E8, 230}, + {0x06EA, 220}, + {0x06EB, 230}, + {0x06EC, 230}, + {0x06ED, 220}, + {0x0711, 36}, + {0x0730, 230}, + {0x0731, 220}, + {0x0732, 230}, + {0x0733, 230}, + {0x0734, 220}, + {0x0735, 230}, + {0x0736, 230}, + {0x0737, 220}, + {0x0738, 220}, + {0x0739, 220}, + {0x073A, 230}, + {0x073B, 220}, + {0x073C, 220}, + {0x073D, 230}, + {0x073E, 220}, + {0x073F, 230}, + {0x0740, 230}, + {0x0741, 230}, + {0x0742, 220}, + {0x0743, 230}, + {0x0744, 220}, + {0x0745, 230}, + {0x0746, 220}, + {0x0747, 230}, + {0x0748, 220}, + {0x0749, 230}, + {0x074A, 230}, + {0x07EB, 230}, + {0x07EC, 230}, + {0x07ED, 230}, + {0x07EE, 230}, + {0x07EF, 230}, + {0x07F0, 230}, + {0x07F1, 230}, + {0x07F2, 220}, + {0x07F3, 230}, + {0x07FD, 220}, + {0x0816, 230}, + {0x0817, 230}, + {0x0818, 230}, + {0x0819, 230}, + {0x081B, 230}, + {0x081C, 230}, + {0x081D, 230}, + {0x081E, 230}, + {0x081F, 230}, + {0x0820, 230}, + {0x0821, 230}, + {0x0822, 230}, + {0x0823, 230}, + {0x0825, 230}, + {0x0826, 230}, + {0x0827, 230}, + {0x0829, 230}, + {0x082A, 230}, + {0x082B, 230}, + {0x082C, 230}, + {0x082D, 230}, + {0x0859, 220}, + {0x085A, 220}, + {0x085B, 220}, + {0x08D3, 220}, + {0x08D4, 230}, + {0x08D5, 230}, + {0x08D6, 230}, + {0x08D7, 230}, + {0x08D8, 230}, + {0x08D9, 230}, + {0x08DA, 230}, + {0x08DB, 230}, + {0x08DC, 230}, + {0x08DD, 230}, + {0x08DE, 230}, + {0x08DF, 230}, + {0x08E0, 230}, + {0x08E1, 230}, + {0x08E3, 220}, + {0x08E4, 230}, + {0x08E5, 230}, + {0x08E6, 220}, + {0x08E7, 230}, + {0x08E8, 230}, + {0x08E9, 220}, + {0x08EA, 230}, + {0x08EB, 230}, + {0x08EC, 230}, + {0x08ED, 220}, + {0x08EE, 220}, + {0x08EF, 220}, + {0x08F0, 27}, + {0x08F1, 28}, + {0x08F2, 29}, + {0x08F3, 230}, + {0x08F4, 230}, + {0x08F5, 230}, + {0x08F6, 220}, + {0x08F7, 230}, + {0x08F8, 230}, + {0x08F9, 220}, + {0x08FA, 220}, + {0x08FB, 230}, + {0x08FC, 230}, + {0x08FD, 230}, + {0x08FE, 230}, + {0x08FF, 230}, + {0x093C, 7}, + {0x094D, 9}, + {0x0951, 230}, + {0x0952, 220}, + {0x0953, 230}, + {0x0954, 230}, + {0x09BC, 7}, + {0x09CD, 9}, + {0x09FE, 230}, + {0x0A3C, 7}, + {0x0A4D, 9}, + {0x0ABC, 7}, + {0x0ACD, 9}, + {0x0B3C, 7}, + {0x0B4D, 9}, + {0x0BCD, 9}, + {0x0C4D, 9}, + {0x0C55, 84}, + {0x0C56, 91}, + {0x0CBC, 7}, + {0x0CCD, 9}, + {0x0D3B, 9}, + {0x0D3C, 9}, + {0x0D4D, 9}, + {0x0DCA, 9}, + {0x0E38, 103}, + {0x0E39, 103}, + {0x0E3A, 9}, + {0x0E48, 107}, + {0x0E49, 107}, + {0x0E4A, 107}, + {0x0E4B, 107}, + {0x0EB8, 118}, + {0x0EB9, 118}, + {0x0EBA, 9}, + {0x0EC8, 122}, + {0x0EC9, 122}, + {0x0ECA, 122}, + {0x0ECB, 122}, + {0x0F18, 220}, + {0x0F19, 220}, + {0x0F35, 220}, + {0x0F37, 220}, + {0x0F39, 216}, + {0x0F71, 129}, + {0x0F72, 130}, + {0x0F74, 132}, + {0x0F7A, 130}, + {0x0F7B, 130}, + {0x0F7C, 130}, + {0x0F7D, 130}, + {0x0F80, 130}, + {0x0F82, 230}, + {0x0F83, 230}, + {0x0F84, 9}, + {0x0F86, 230}, + {0x0F87, 230}, + {0x0FC6, 220}, + {0x1037, 7}, + {0x1039, 9}, + {0x103A, 9}, + {0x108D, 220}, + {0x135D, 230}, + {0x135E, 230}, + {0x135F, 230}, + {0x1714, 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}, + {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}, + {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}, + {0x10F46, 220}, + {0x10F47, 220}, + {0x10F48, 230}, + {0x10F49, 230}, + {0x10F4A, 230}, + {0x10F4B, 220}, + {0x10F4C, 230}, + {0x10F4D, 220}, + {0x10F4E, 220}, + {0x10F4F, 220}, + {0x10F50, 220}, + {0x11046, 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}, + {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}, + {0x1E130, 230}, + {0x1E131, 230}, + {0x1E132, 230}, + {0x1E133, 230}, + {0x1E134, 230}, + {0x1E135, 230}, + {0x1E136, 230}, + {0x1E2EC, 230}, + {0x1E2ED, 230}, + {0x1E2EE, 230}, + {0x1E2EF, 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}, +}; + +const std::map> NFC_Decompose = { +{0x00C0, {0x0041, 0x0300}}, +{0x00C1, {0x0041, 0x0301}}, +{0x00C2, {0x0041, 0x0302}}, +{0x00C3, {0x0041, 0x0303}}, +{0x00C4, {0x0041, 0x0308}}, +{0x00C5, {0x0041, 0x030A}}, +{0x00C7, {0x0043, 0x0327}}, +{0x00C8, {0x0045, 0x0300}}, +{0x00C9, {0x0045, 0x0301}}, +{0x00CA, {0x0045, 0x0302}}, +{0x00CB, {0x0045, 0x0308}}, +{0x00CC, {0x0049, 0x0300}}, +{0x00CD, {0x0049, 0x0301}}, +{0x00CE, {0x0049, 0x0302}}, +{0x00CF, {0x0049, 0x0308}}, +{0x00D1, {0x004E, 0x0303}}, +{0x00D2, {0x004F, 0x0300}}, +{0x00D3, {0x004F, 0x0301}}, +{0x00D4, {0x004F, 0x0302}}, +{0x00D5, {0x004F, 0x0303}}, +{0x00D6, {0x004F, 0x0308}}, +{0x00D9, {0x0055, 0x0300}}, +{0x00DA, {0x0055, 0x0301}}, +{0x00DB, {0x0055, 0x0302}}, +{0x00DC, {0x0055, 0x0308}}, +{0x00DD, {0x0059, 0x0301}}, +{0x00E0, {0x0061, 0x0300}}, +{0x00E1, {0x0061, 0x0301}}, +{0x00E2, {0x0061, 0x0302}}, +{0x00E3, {0x0061, 0x0303}}, +{0x00E4, {0x0061, 0x0308}}, +{0x00E5, {0x0061, 0x030A}}, +{0x00E7, {0x0063, 0x0327}}, +{0x00E8, {0x0065, 0x0300}}, +{0x00E9, {0x0065, 0x0301}}, +{0x00EA, {0x0065, 0x0302}}, +{0x00EB, {0x0065, 0x0308}}, +{0x00EC, {0x0069, 0x0300}}, +{0x00ED, {0x0069, 0x0301}}, +{0x00EE, {0x0069, 0x0302}}, +{0x00EF, {0x0069, 0x0308}}, +{0x00F1, {0x006E, 0x0303}}, +{0x00F2, {0x006F, 0x0300}}, +{0x00F3, {0x006F, 0x0301}}, +{0x00F4, {0x006F, 0x0302}}, +{0x00F5, {0x006F, 0x0303}}, +{0x00F6, {0x006F, 0x0308}}, +{0x00F9, {0x0075, 0x0300}}, +{0x00FA, {0x0075, 0x0301}}, +{0x00FB, {0x0075, 0x0302}}, +{0x00FC, {0x0075, 0x0308}}, +{0x00FD, {0x0079, 0x0301}}, +{0x00FF, {0x0079, 0x0308}}, +{0x0100, {0x0041, 0x0304}}, +{0x0101, {0x0061, 0x0304}}, +{0x0102, {0x0041, 0x0306}}, +{0x0103, {0x0061, 0x0306}}, +{0x0104, {0x0041, 0x0328}}, +{0x0105, {0x0061, 0x0328}}, +{0x0106, {0x0043, 0x0301}}, +{0x0107, {0x0063, 0x0301}}, +{0x0108, {0x0043, 0x0302}}, +{0x0109, {0x0063, 0x0302}}, +{0x010A, {0x0043, 0x0307}}, +{0x010B, {0x0063, 0x0307}}, +{0x010C, {0x0043, 0x030C}}, +{0x010D, {0x0063, 0x030C}}, +{0x010E, {0x0044, 0x030C}}, +{0x010F, {0x0064, 0x030C}}, +{0x0112, {0x0045, 0x0304}}, +{0x0113, {0x0065, 0x0304}}, +{0x0114, {0x0045, 0x0306}}, +{0x0115, {0x0065, 0x0306}}, +{0x0116, {0x0045, 0x0307}}, +{0x0117, {0x0065, 0x0307}}, +{0x0118, {0x0045, 0x0328}}, +{0x0119, {0x0065, 0x0328}}, +{0x011A, {0x0045, 0x030C}}, +{0x011B, {0x0065, 0x030C}}, +{0x011C, {0x0047, 0x0302}}, +{0x011D, {0x0067, 0x0302}}, +{0x011E, {0x0047, 0x0306}}, +{0x011F, {0x0067, 0x0306}}, +{0x0120, {0x0047, 0x0307}}, +{0x0121, {0x0067, 0x0307}}, +{0x0122, {0x0047, 0x0327}}, +{0x0123, {0x0067, 0x0327}}, +{0x0124, {0x0048, 0x0302}}, +{0x0125, {0x0068, 0x0302}}, +{0x0128, {0x0049, 0x0303}}, +{0x0129, {0x0069, 0x0303}}, +{0x012A, {0x0049, 0x0304}}, +{0x012B, {0x0069, 0x0304}}, +{0x012C, {0x0049, 0x0306}}, +{0x012D, {0x0069, 0x0306}}, +{0x012E, {0x0049, 0x0328}}, +{0x012F, {0x0069, 0x0328}}, +{0x0130, {0x0049, 0x0307}}, +{0x0134, {0x004A, 0x0302}}, +{0x0135, {0x006A, 0x0302}}, +{0x0136, {0x004B, 0x0327}}, +{0x0137, {0x006B, 0x0327}}, +{0x0139, {0x004C, 0x0301}}, +{0x013A, {0x006C, 0x0301}}, +{0x013B, {0x004C, 0x0327}}, +{0x013C, {0x006C, 0x0327}}, +{0x013D, {0x004C, 0x030C}}, +{0x013E, {0x006C, 0x030C}}, +{0x0143, {0x004E, 0x0301}}, +{0x0144, {0x006E, 0x0301}}, +{0x0145, {0x004E, 0x0327}}, +{0x0146, {0x006E, 0x0327}}, +{0x0147, {0x004E, 0x030C}}, +{0x0148, {0x006E, 0x030C}}, +{0x014C, {0x004F, 0x0304}}, +{0x014D, {0x006F, 0x0304}}, +{0x014E, {0x004F, 0x0306}}, +{0x014F, {0x006F, 0x0306}}, +{0x0150, {0x004F, 0x030B}}, +{0x0151, {0x006F, 0x030B}}, +{0x0154, {0x0052, 0x0301}}, +{0x0155, {0x0072, 0x0301}}, +{0x0156, {0x0052, 0x0327}}, +{0x0157, {0x0072, 0x0327}}, +{0x0158, {0x0052, 0x030C}}, +{0x0159, {0x0072, 0x030C}}, +{0x015A, {0x0053, 0x0301}}, +{0x015B, {0x0073, 0x0301}}, +{0x015C, {0x0053, 0x0302}}, +{0x015D, {0x0073, 0x0302}}, +{0x015E, {0x0053, 0x0327}}, +{0x015F, {0x0073, 0x0327}}, +{0x0160, {0x0053, 0x030C}}, +{0x0161, {0x0073, 0x030C}}, +{0x0162, {0x0054, 0x0327}}, +{0x0163, {0x0074, 0x0327}}, +{0x0164, {0x0054, 0x030C}}, +{0x0165, {0x0074, 0x030C}}, +{0x0168, {0x0055, 0x0303}}, +{0x0169, {0x0075, 0x0303}}, +{0x016A, {0x0055, 0x0304}}, +{0x016B, {0x0075, 0x0304}}, +{0x016C, {0x0055, 0x0306}}, +{0x016D, {0x0075, 0x0306}}, +{0x016E, {0x0055, 0x030A}}, +{0x016F, {0x0075, 0x030A}}, +{0x0170, {0x0055, 0x030B}}, +{0x0171, {0x0075, 0x030B}}, +{0x0172, {0x0055, 0x0328}}, +{0x0173, {0x0075, 0x0328}}, +{0x0174, {0x0057, 0x0302}}, +{0x0175, {0x0077, 0x0302}}, +{0x0176, {0x0059, 0x0302}}, +{0x0177, {0x0079, 0x0302}}, +{0x0178, {0x0059, 0x0308}}, +{0x0179, {0x005A, 0x0301}}, +{0x017A, {0x007A, 0x0301}}, +{0x017B, {0x005A, 0x0307}}, +{0x017C, {0x007A, 0x0307}}, +{0x017D, {0x005A, 0x030C}}, +{0x017E, {0x007A, 0x030C}}, +{0x01A0, {0x004F, 0x031B}}, +{0x01A1, {0x006F, 0x031B}}, +{0x01AF, {0x0055, 0x031B}}, +{0x01B0, {0x0075, 0x031B}}, +{0x01CD, {0x0041, 0x030C}}, +{0x01CE, {0x0061, 0x030C}}, +{0x01CF, {0x0049, 0x030C}}, +{0x01D0, {0x0069, 0x030C}}, +{0x01D1, {0x004F, 0x030C}}, +{0x01D2, {0x006F, 0x030C}}, +{0x01D3, {0x0055, 0x030C}}, +{0x01D4, {0x0075, 0x030C}}, +{0x01D5, {0x00DC, 0x0304}}, +{0x01D6, {0x00FC, 0x0304}}, +{0x01D7, {0x00DC, 0x0301}}, +{0x01D8, {0x00FC, 0x0301}}, +{0x01D9, {0x00DC, 0x030C}}, +{0x01DA, {0x00FC, 0x030C}}, +{0x01DB, {0x00DC, 0x0300}}, +{0x01DC, {0x00FC, 0x0300}}, +{0x01DE, {0x00C4, 0x0304}}, +{0x01DF, {0x00E4, 0x0304}}, +{0x01E0, {0x0226, 0x0304}}, +{0x01E1, {0x0227, 0x0304}}, +{0x01E2, {0x00C6, 0x0304}}, +{0x01E3, {0x00E6, 0x0304}}, +{0x01E6, {0x0047, 0x030C}}, +{0x01E7, {0x0067, 0x030C}}, +{0x01E8, {0x004B, 0x030C}}, +{0x01E9, {0x006B, 0x030C}}, +{0x01EA, {0x004F, 0x0328}}, +{0x01EB, {0x006F, 0x0328}}, +{0x01EC, {0x01EA, 0x0304}}, +{0x01ED, {0x01EB, 0x0304}}, +{0x01EE, {0x01B7, 0x030C}}, +{0x01EF, {0x0292, 0x030C}}, +{0x01F0, {0x006A, 0x030C}}, +{0x01F4, {0x0047, 0x0301}}, +{0x01F5, {0x0067, 0x0301}}, +{0x01F8, {0x004E, 0x0300}}, +{0x01F9, {0x006E, 0x0300}}, +{0x01FA, {0x00C5, 0x0301}}, +{0x01FB, {0x00E5, 0x0301}}, +{0x01FC, {0x00C6, 0x0301}}, +{0x01FD, {0x00E6, 0x0301}}, +{0x01FE, {0x00D8, 0x0301}}, +{0x01FF, {0x00F8, 0x0301}}, +{0x0200, {0x0041, 0x030F}}, +{0x0201, {0x0061, 0x030F}}, +{0x0202, {0x0041, 0x0311}}, +{0x0203, {0x0061, 0x0311}}, +{0x0204, {0x0045, 0x030F}}, +{0x0205, {0x0065, 0x030F}}, +{0x0206, {0x0045, 0x0311}}, +{0x0207, {0x0065, 0x0311}}, +{0x0208, {0x0049, 0x030F}}, +{0x0209, {0x0069, 0x030F}}, +{0x020A, {0x0049, 0x0311}}, +{0x020B, {0x0069, 0x0311}}, +{0x020C, {0x004F, 0x030F}}, +{0x020D, {0x006F, 0x030F}}, +{0x020E, {0x004F, 0x0311}}, +{0x020F, {0x006F, 0x0311}}, +{0x0210, {0x0052, 0x030F}}, +{0x0211, {0x0072, 0x030F}}, +{0x0212, {0x0052, 0x0311}}, +{0x0213, {0x0072, 0x0311}}, +{0x0214, {0x0055, 0x030F}}, +{0x0215, {0x0075, 0x030F}}, +{0x0216, {0x0055, 0x0311}}, +{0x0217, {0x0075, 0x0311}}, +{0x0218, {0x0053, 0x0326}}, +{0x0219, {0x0073, 0x0326}}, +{0x021A, {0x0054, 0x0326}}, +{0x021B, {0x0074, 0x0326}}, +{0x021E, {0x0048, 0x030C}}, +{0x021F, {0x0068, 0x030C}}, +{0x0226, {0x0041, 0x0307}}, +{0x0227, {0x0061, 0x0307}}, +{0x0228, {0x0045, 0x0327}}, +{0x0229, {0x0065, 0x0327}}, +{0x022A, {0x00D6, 0x0304}}, +{0x022B, {0x00F6, 0x0304}}, +{0x022C, {0x00D5, 0x0304}}, +{0x022D, {0x00F5, 0x0304}}, +{0x022E, {0x004F, 0x0307}}, +{0x022F, {0x006F, 0x0307}}, +{0x0230, {0x022E, 0x0304}}, +{0x0231, {0x022F, 0x0304}}, +{0x0232, {0x0059, 0x0304}}, +{0x0233, {0x0079, 0x0304}}, +{0x0340, {0x0300, -1}}, +{0x0341, {0x0301, -1}}, +{0x0343, {0x0313, -1}}, +{0x0344, {0x0308, 0x0301}}, +{0x0374, {0x02B9, -1}}, +{0x037E, {0x003B, -1}}, +{0x0385, {0x00A8, 0x0301}}, +{0x0386, {0x0391, 0x0301}}, +{0x0387, {0x00B7, -1}}, +{0x0388, {0x0395, 0x0301}}, +{0x0389, {0x0397, 0x0301}}, +{0x038A, {0x0399, 0x0301}}, +{0x038C, {0x039F, 0x0301}}, +{0x038E, {0x03A5, 0x0301}}, +{0x038F, {0x03A9, 0x0301}}, +{0x0390, {0x03CA, 0x0301}}, +{0x03AA, {0x0399, 0x0308}}, +{0x03AB, {0x03A5, 0x0308}}, +{0x03AC, {0x03B1, 0x0301}}, +{0x03AD, {0x03B5, 0x0301}}, +{0x03AE, {0x03B7, 0x0301}}, +{0x03AF, {0x03B9, 0x0301}}, +{0x03B0, {0x03CB, 0x0301}}, +{0x03CA, {0x03B9, 0x0308}}, +{0x03CB, {0x03C5, 0x0308}}, +{0x03CC, {0x03BF, 0x0301}}, +{0x03CD, {0x03C5, 0x0301}}, +{0x03CE, {0x03C9, 0x0301}}, +{0x03D3, {0x03D2, 0x0301}}, +{0x03D4, {0x03D2, 0x0308}}, +{0x0400, {0x0415, 0x0300}}, +{0x0401, {0x0415, 0x0308}}, +{0x0403, {0x0413, 0x0301}}, +{0x0407, {0x0406, 0x0308}}, +{0x040C, {0x041A, 0x0301}}, +{0x040D, {0x0418, 0x0300}}, +{0x040E, {0x0423, 0x0306}}, +{0x0419, {0x0418, 0x0306}}, +{0x0439, {0x0438, 0x0306}}, +{0x0450, {0x0435, 0x0300}}, +{0x0451, {0x0435, 0x0308}}, +{0x0453, {0x0433, 0x0301}}, +{0x0457, {0x0456, 0x0308}}, +{0x045C, {0x043A, 0x0301}}, +{0x045D, {0x0438, 0x0300}}, +{0x045E, {0x0443, 0x0306}}, +{0x0476, {0x0474, 0x030F}}, +{0x0477, {0x0475, 0x030F}}, +{0x04C1, {0x0416, 0x0306}}, +{0x04C2, {0x0436, 0x0306}}, +{0x04D0, {0x0410, 0x0306}}, +{0x04D1, {0x0430, 0x0306}}, +{0x04D2, {0x0410, 0x0308}}, +{0x04D3, {0x0430, 0x0308}}, +{0x04D6, {0x0415, 0x0306}}, +{0x04D7, {0x0435, 0x0306}}, +{0x04DA, {0x04D8, 0x0308}}, +{0x04DB, {0x04D9, 0x0308}}, +{0x04DC, {0x0416, 0x0308}}, +{0x04DD, {0x0436, 0x0308}}, +{0x04DE, {0x0417, 0x0308}}, +{0x04DF, {0x0437, 0x0308}}, +{0x04E2, {0x0418, 0x0304}}, +{0x04E3, {0x0438, 0x0304}}, +{0x04E4, {0x0418, 0x0308}}, +{0x04E5, {0x0438, 0x0308}}, +{0x04E6, {0x041E, 0x0308}}, +{0x04E7, {0x043E, 0x0308}}, +{0x04EA, {0x04E8, 0x0308}}, +{0x04EB, {0x04E9, 0x0308}}, +{0x04EC, {0x042D, 0x0308}}, +{0x04ED, {0x044D, 0x0308}}, +{0x04EE, {0x0423, 0x0304}}, +{0x04EF, {0x0443, 0x0304}}, +{0x04F0, {0x0423, 0x0308}}, +{0x04F1, {0x0443, 0x0308}}, +{0x04F2, {0x0423, 0x030B}}, +{0x04F3, {0x0443, 0x030B}}, +{0x04F4, {0x0427, 0x0308}}, +{0x04F5, {0x0447, 0x0308}}, +{0x04F8, {0x042B, 0x0308}}, +{0x04F9, {0x044B, 0x0308}}, +{0x0622, {0x0627, 0x0653}}, +{0x0623, {0x0627, 0x0654}}, +{0x0624, {0x0648, 0x0654}}, +{0x0625, {0x0627, 0x0655}}, +{0x0626, {0x064A, 0x0654}}, +{0x06C0, {0x06D5, 0x0654}}, +{0x06C2, {0x06C1, 0x0654}}, +{0x06D3, {0x06D2, 0x0654}}, +{0x0929, {0x0928, 0x093C}}, +{0x0931, {0x0930, 0x093C}}, +{0x0934, {0x0933, 0x093C}}, +{0x0958, {0x0915, 0x093C}}, +{0x0959, {0x0916, 0x093C}}, +{0x095A, {0x0917, 0x093C}}, +{0x095B, {0x091C, 0x093C}}, +{0x095C, {0x0921, 0x093C}}, +{0x095D, {0x0922, 0x093C}}, +{0x095E, {0x092B, 0x093C}}, +{0x095F, {0x092F, 0x093C}}, +{0x09CB, {0x09C7, 0x09BE}}, +{0x09CC, {0x09C7, 0x09D7}}, +{0x09DC, {0x09A1, 0x09BC}}, +{0x09DD, {0x09A2, 0x09BC}}, +{0x09DF, {0x09AF, 0x09BC}}, +{0x0A33, {0x0A32, 0x0A3C}}, +{0x0A36, {0x0A38, 0x0A3C}}, +{0x0A59, {0x0A16, 0x0A3C}}, +{0x0A5A, {0x0A17, 0x0A3C}}, +{0x0A5B, {0x0A1C, 0x0A3C}}, +{0x0A5E, {0x0A2B, 0x0A3C}}, +{0x0B48, {0x0B47, 0x0B56}}, +{0x0B4B, {0x0B47, 0x0B3E}}, +{0x0B4C, {0x0B47, 0x0B57}}, +{0x0B5C, {0x0B21, 0x0B3C}}, +{0x0B5D, {0x0B22, 0x0B3C}}, +{0x0B94, {0x0B92, 0x0BD7}}, +{0x0BCA, {0x0BC6, 0x0BBE}}, +{0x0BCB, {0x0BC7, 0x0BBE}}, +{0x0BCC, {0x0BC6, 0x0BD7}}, +{0x0C48, {0x0C46, 0x0C56}}, +{0x0CC0, {0x0CBF, 0x0CD5}}, +{0x0CC7, {0x0CC6, 0x0CD5}}, +{0x0CC8, {0x0CC6, 0x0CD6}}, +{0x0CCA, {0x0CC6, 0x0CC2}}, +{0x0CCB, {0x0CCA, 0x0CD5}}, +{0x0D4A, {0x0D46, 0x0D3E}}, +{0x0D4B, {0x0D47, 0x0D3E}}, +{0x0D4C, {0x0D46, 0x0D57}}, +{0x0DDA, {0x0DD9, 0x0DCA}}, +{0x0DDC, {0x0DD9, 0x0DCF}}, +{0x0DDD, {0x0DDC, 0x0DCA}}, +{0x0DDE, {0x0DD9, 0x0DDF}}, +{0x0F43, {0x0F42, 0x0FB7}}, +{0x0F4D, {0x0F4C, 0x0FB7}}, +{0x0F52, {0x0F51, 0x0FB7}}, +{0x0F57, {0x0F56, 0x0FB7}}, +{0x0F5C, {0x0F5B, 0x0FB7}}, +{0x0F69, {0x0F40, 0x0FB5}}, +{0x0F73, {0x0F71, 0x0F72}}, +{0x0F75, {0x0F71, 0x0F74}}, +{0x0F76, {0x0FB2, 0x0F80}}, +{0x0F78, {0x0FB3, 0x0F80}}, +{0x0F81, {0x0F71, 0x0F80}}, +{0x0F93, {0x0F92, 0x0FB7}}, +{0x0F9D, {0x0F9C, 0x0FB7}}, +{0x0FA2, {0x0FA1, 0x0FB7}}, +{0x0FA7, {0x0FA6, 0x0FB7}}, +{0x0FAC, {0x0FAB, 0x0FB7}}, +{0x0FB9, {0x0F90, 0x0FB5}}, +{0x1026, {0x1025, 0x102E}}, +{0x1B06, {0x1B05, 0x1B35}}, +{0x1B08, {0x1B07, 0x1B35}}, +{0x1B0A, {0x1B09, 0x1B35}}, +{0x1B0C, {0x1B0B, 0x1B35}}, +{0x1B0E, {0x1B0D, 0x1B35}}, +{0x1B12, {0x1B11, 0x1B35}}, +{0x1B3B, {0x1B3A, 0x1B35}}, +{0x1B3D, {0x1B3C, 0x1B35}}, +{0x1B40, {0x1B3E, 0x1B35}}, +{0x1B41, {0x1B3F, 0x1B35}}, +{0x1B43, {0x1B42, 0x1B35}}, +{0x1E00, {0x0041, 0x0325}}, +{0x1E01, {0x0061, 0x0325}}, +{0x1E02, {0x0042, 0x0307}}, +{0x1E03, {0x0062, 0x0307}}, +{0x1E04, {0x0042, 0x0323}}, +{0x1E05, {0x0062, 0x0323}}, +{0x1E06, {0x0042, 0x0331}}, +{0x1E07, {0x0062, 0x0331}}, +{0x1E08, {0x00C7, 0x0301}}, +{0x1E09, {0x00E7, 0x0301}}, +{0x1E0A, {0x0044, 0x0307}}, +{0x1E0B, {0x0064, 0x0307}}, +{0x1E0C, {0x0044, 0x0323}}, +{0x1E0D, {0x0064, 0x0323}}, +{0x1E0E, {0x0044, 0x0331}}, +{0x1E0F, {0x0064, 0x0331}}, +{0x1E10, {0x0044, 0x0327}}, +{0x1E11, {0x0064, 0x0327}}, +{0x1E12, {0x0044, 0x032D}}, +{0x1E13, {0x0064, 0x032D}}, +{0x1E14, {0x0112, 0x0300}}, +{0x1E15, {0x0113, 0x0300}}, +{0x1E16, {0x0112, 0x0301}}, +{0x1E17, {0x0113, 0x0301}}, +{0x1E18, {0x0045, 0x032D}}, +{0x1E19, {0x0065, 0x032D}}, +{0x1E1A, {0x0045, 0x0330}}, +{0x1E1B, {0x0065, 0x0330}}, +{0x1E1C, {0x0228, 0x0306}}, +{0x1E1D, {0x0229, 0x0306}}, +{0x1E1E, {0x0046, 0x0307}}, +{0x1E1F, {0x0066, 0x0307}}, +{0x1E20, {0x0047, 0x0304}}, +{0x1E21, {0x0067, 0x0304}}, +{0x1E22, {0x0048, 0x0307}}, +{0x1E23, {0x0068, 0x0307}}, +{0x1E24, {0x0048, 0x0323}}, +{0x1E25, {0x0068, 0x0323}}, +{0x1E26, {0x0048, 0x0308}}, +{0x1E27, {0x0068, 0x0308}}, +{0x1E28, {0x0048, 0x0327}}, +{0x1E29, {0x0068, 0x0327}}, +{0x1E2A, {0x0048, 0x032E}}, +{0x1E2B, {0x0068, 0x032E}}, +{0x1E2C, {0x0049, 0x0330}}, +{0x1E2D, {0x0069, 0x0330}}, +{0x1E2E, {0x00CF, 0x0301}}, +{0x1E2F, {0x00EF, 0x0301}}, +{0x1E30, {0x004B, 0x0301}}, +{0x1E31, {0x006B, 0x0301}}, +{0x1E32, {0x004B, 0x0323}}, +{0x1E33, {0x006B, 0x0323}}, +{0x1E34, {0x004B, 0x0331}}, +{0x1E35, {0x006B, 0x0331}}, +{0x1E36, {0x004C, 0x0323}}, +{0x1E37, {0x006C, 0x0323}}, +{0x1E38, {0x1E36, 0x0304}}, +{0x1E39, {0x1E37, 0x0304}}, +{0x1E3A, {0x004C, 0x0331}}, +{0x1E3B, {0x006C, 0x0331}}, +{0x1E3C, {0x004C, 0x032D}}, +{0x1E3D, {0x006C, 0x032D}}, +{0x1E3E, {0x004D, 0x0301}}, +{0x1E3F, {0x006D, 0x0301}}, +{0x1E40, {0x004D, 0x0307}}, +{0x1E41, {0x006D, 0x0307}}, +{0x1E42, {0x004D, 0x0323}}, +{0x1E43, {0x006D, 0x0323}}, +{0x1E44, {0x004E, 0x0307}}, +{0x1E45, {0x006E, 0x0307}}, +{0x1E46, {0x004E, 0x0323}}, +{0x1E47, {0x006E, 0x0323}}, +{0x1E48, {0x004E, 0x0331}}, +{0x1E49, {0x006E, 0x0331}}, +{0x1E4A, {0x004E, 0x032D}}, +{0x1E4B, {0x006E, 0x032D}}, +{0x1E4C, {0x00D5, 0x0301}}, +{0x1E4D, {0x00F5, 0x0301}}, +{0x1E4E, {0x00D5, 0x0308}}, +{0x1E4F, {0x00F5, 0x0308}}, +{0x1E50, {0x014C, 0x0300}}, +{0x1E51, {0x014D, 0x0300}}, +{0x1E52, {0x014C, 0x0301}}, +{0x1E53, {0x014D, 0x0301}}, +{0x1E54, {0x0050, 0x0301}}, +{0x1E55, {0x0070, 0x0301}}, +{0x1E56, {0x0050, 0x0307}}, +{0x1E57, {0x0070, 0x0307}}, +{0x1E58, {0x0052, 0x0307}}, +{0x1E59, {0x0072, 0x0307}}, +{0x1E5A, {0x0052, 0x0323}}, +{0x1E5B, {0x0072, 0x0323}}, +{0x1E5C, {0x1E5A, 0x0304}}, +{0x1E5D, {0x1E5B, 0x0304}}, +{0x1E5E, {0x0052, 0x0331}}, +{0x1E5F, {0x0072, 0x0331}}, +{0x1E60, {0x0053, 0x0307}}, +{0x1E61, {0x0073, 0x0307}}, +{0x1E62, {0x0053, 0x0323}}, +{0x1E63, {0x0073, 0x0323}}, +{0x1E64, {0x015A, 0x0307}}, +{0x1E65, {0x015B, 0x0307}}, +{0x1E66, {0x0160, 0x0307}}, +{0x1E67, {0x0161, 0x0307}}, +{0x1E68, {0x1E62, 0x0307}}, +{0x1E69, {0x1E63, 0x0307}}, +{0x1E6A, {0x0054, 0x0307}}, +{0x1E6B, {0x0074, 0x0307}}, +{0x1E6C, {0x0054, 0x0323}}, +{0x1E6D, {0x0074, 0x0323}}, +{0x1E6E, {0x0054, 0x0331}}, +{0x1E6F, {0x0074, 0x0331}}, +{0x1E70, {0x0054, 0x032D}}, +{0x1E71, {0x0074, 0x032D}}, +{0x1E72, {0x0055, 0x0324}}, +{0x1E73, {0x0075, 0x0324}}, +{0x1E74, {0x0055, 0x0330}}, +{0x1E75, {0x0075, 0x0330}}, +{0x1E76, {0x0055, 0x032D}}, +{0x1E77, {0x0075, 0x032D}}, +{0x1E78, {0x0168, 0x0301}}, +{0x1E79, {0x0169, 0x0301}}, +{0x1E7A, {0x016A, 0x0308}}, +{0x1E7B, {0x016B, 0x0308}}, +{0x1E7C, {0x0056, 0x0303}}, +{0x1E7D, {0x0076, 0x0303}}, +{0x1E7E, {0x0056, 0x0323}}, +{0x1E7F, {0x0076, 0x0323}}, +{0x1E80, {0x0057, 0x0300}}, +{0x1E81, {0x0077, 0x0300}}, +{0x1E82, {0x0057, 0x0301}}, +{0x1E83, {0x0077, 0x0301}}, +{0x1E84, {0x0057, 0x0308}}, +{0x1E85, {0x0077, 0x0308}}, +{0x1E86, {0x0057, 0x0307}}, +{0x1E87, {0x0077, 0x0307}}, +{0x1E88, {0x0057, 0x0323}}, +{0x1E89, {0x0077, 0x0323}}, +{0x1E8A, {0x0058, 0x0307}}, +{0x1E8B, {0x0078, 0x0307}}, +{0x1E8C, {0x0058, 0x0308}}, +{0x1E8D, {0x0078, 0x0308}}, +{0x1E8E, {0x0059, 0x0307}}, +{0x1E8F, {0x0079, 0x0307}}, +{0x1E90, {0x005A, 0x0302}}, +{0x1E91, {0x007A, 0x0302}}, +{0x1E92, {0x005A, 0x0323}}, +{0x1E93, {0x007A, 0x0323}}, +{0x1E94, {0x005A, 0x0331}}, +{0x1E95, {0x007A, 0x0331}}, +{0x1E96, {0x0068, 0x0331}}, +{0x1E97, {0x0074, 0x0308}}, +{0x1E98, {0x0077, 0x030A}}, +{0x1E99, {0x0079, 0x030A}}, +{0x1E9B, {0x017F, 0x0307}}, +{0x1EA0, {0x0041, 0x0323}}, +{0x1EA1, {0x0061, 0x0323}}, +{0x1EA2, {0x0041, 0x0309}}, +{0x1EA3, {0x0061, 0x0309}}, +{0x1EA4, {0x00C2, 0x0301}}, +{0x1EA5, {0x00E2, 0x0301}}, +{0x1EA6, {0x00C2, 0x0300}}, +{0x1EA7, {0x00E2, 0x0300}}, +{0x1EA8, {0x00C2, 0x0309}}, +{0x1EA9, {0x00E2, 0x0309}}, +{0x1EAA, {0x00C2, 0x0303}}, +{0x1EAB, {0x00E2, 0x0303}}, +{0x1EAC, {0x1EA0, 0x0302}}, +{0x1EAD, {0x1EA1, 0x0302}}, +{0x1EAE, {0x0102, 0x0301}}, +{0x1EAF, {0x0103, 0x0301}}, +{0x1EB0, {0x0102, 0x0300}}, +{0x1EB1, {0x0103, 0x0300}}, +{0x1EB2, {0x0102, 0x0309}}, +{0x1EB3, {0x0103, 0x0309}}, +{0x1EB4, {0x0102, 0x0303}}, +{0x1EB5, {0x0103, 0x0303}}, +{0x1EB6, {0x1EA0, 0x0306}}, +{0x1EB7, {0x1EA1, 0x0306}}, +{0x1EB8, {0x0045, 0x0323}}, +{0x1EB9, {0x0065, 0x0323}}, +{0x1EBA, {0x0045, 0x0309}}, +{0x1EBB, {0x0065, 0x0309}}, +{0x1EBC, {0x0045, 0x0303}}, +{0x1EBD, {0x0065, 0x0303}}, +{0x1EBE, {0x00CA, 0x0301}}, +{0x1EBF, {0x00EA, 0x0301}}, +{0x1EC0, {0x00CA, 0x0300}}, +{0x1EC1, {0x00EA, 0x0300}}, +{0x1EC2, {0x00CA, 0x0309}}, +{0x1EC3, {0x00EA, 0x0309}}, +{0x1EC4, {0x00CA, 0x0303}}, +{0x1EC5, {0x00EA, 0x0303}}, +{0x1EC6, {0x1EB8, 0x0302}}, +{0x1EC7, {0x1EB9, 0x0302}}, +{0x1EC8, {0x0049, 0x0309}}, +{0x1EC9, {0x0069, 0x0309}}, +{0x1ECA, {0x0049, 0x0323}}, +{0x1ECB, {0x0069, 0x0323}}, +{0x1ECC, {0x004F, 0x0323}}, +{0x1ECD, {0x006F, 0x0323}}, +{0x1ECE, {0x004F, 0x0309}}, +{0x1ECF, {0x006F, 0x0309}}, +{0x1ED0, {0x00D4, 0x0301}}, +{0x1ED1, {0x00F4, 0x0301}}, +{0x1ED2, {0x00D4, 0x0300}}, +{0x1ED3, {0x00F4, 0x0300}}, +{0x1ED4, {0x00D4, 0x0309}}, +{0x1ED5, {0x00F4, 0x0309}}, +{0x1ED6, {0x00D4, 0x0303}}, +{0x1ED7, {0x00F4, 0x0303}}, +{0x1ED8, {0x1ECC, 0x0302}}, +{0x1ED9, {0x1ECD, 0x0302}}, +{0x1EDA, {0x01A0, 0x0301}}, +{0x1EDB, {0x01A1, 0x0301}}, +{0x1EDC, {0x01A0, 0x0300}}, +{0x1EDD, {0x01A1, 0x0300}}, +{0x1EDE, {0x01A0, 0x0309}}, +{0x1EDF, {0x01A1, 0x0309}}, +{0x1EE0, {0x01A0, 0x0303}}, +{0x1EE1, {0x01A1, 0x0303}}, +{0x1EE2, {0x01A0, 0x0323}}, +{0x1EE3, {0x01A1, 0x0323}}, +{0x1EE4, {0x0055, 0x0323}}, +{0x1EE5, {0x0075, 0x0323}}, +{0x1EE6, {0x0055, 0x0309}}, +{0x1EE7, {0x0075, 0x0309}}, +{0x1EE8, {0x01AF, 0x0301}}, +{0x1EE9, {0x01B0, 0x0301}}, +{0x1EEA, {0x01AF, 0x0300}}, +{0x1EEB, {0x01B0, 0x0300}}, +{0x1EEC, {0x01AF, 0x0309}}, +{0x1EED, {0x01B0, 0x0309}}, +{0x1EEE, {0x01AF, 0x0303}}, +{0x1EEF, {0x01B0, 0x0303}}, +{0x1EF0, {0x01AF, 0x0323}}, +{0x1EF1, {0x01B0, 0x0323}}, +{0x1EF2, {0x0059, 0x0300}}, +{0x1EF3, {0x0079, 0x0300}}, +{0x1EF4, {0x0059, 0x0323}}, +{0x1EF5, {0x0079, 0x0323}}, +{0x1EF6, {0x0059, 0x0309}}, +{0x1EF7, {0x0079, 0x0309}}, +{0x1EF8, {0x0059, 0x0303}}, +{0x1EF9, {0x0079, 0x0303}}, +{0x1F00, {0x03B1, 0x0313}}, +{0x1F01, {0x03B1, 0x0314}}, +{0x1F02, {0x1F00, 0x0300}}, +{0x1F03, {0x1F01, 0x0300}}, +{0x1F04, {0x1F00, 0x0301}}, +{0x1F05, {0x1F01, 0x0301}}, +{0x1F06, {0x1F00, 0x0342}}, +{0x1F07, {0x1F01, 0x0342}}, +{0x1F08, {0x0391, 0x0313}}, +{0x1F09, {0x0391, 0x0314}}, +{0x1F0A, {0x1F08, 0x0300}}, +{0x1F0B, {0x1F09, 0x0300}}, +{0x1F0C, {0x1F08, 0x0301}}, +{0x1F0D, {0x1F09, 0x0301}}, +{0x1F0E, {0x1F08, 0x0342}}, +{0x1F0F, {0x1F09, 0x0342}}, +{0x1F10, {0x03B5, 0x0313}}, +{0x1F11, {0x03B5, 0x0314}}, +{0x1F12, {0x1F10, 0x0300}}, +{0x1F13, {0x1F11, 0x0300}}, +{0x1F14, {0x1F10, 0x0301}}, +{0x1F15, {0x1F11, 0x0301}}, +{0x1F18, {0x0395, 0x0313}}, +{0x1F19, {0x0395, 0x0314}}, +{0x1F1A, {0x1F18, 0x0300}}, +{0x1F1B, {0x1F19, 0x0300}}, +{0x1F1C, {0x1F18, 0x0301}}, +{0x1F1D, {0x1F19, 0x0301}}, +{0x1F20, {0x03B7, 0x0313}}, +{0x1F21, {0x03B7, 0x0314}}, +{0x1F22, {0x1F20, 0x0300}}, +{0x1F23, {0x1F21, 0x0300}}, +{0x1F24, {0x1F20, 0x0301}}, +{0x1F25, {0x1F21, 0x0301}}, +{0x1F26, {0x1F20, 0x0342}}, +{0x1F27, {0x1F21, 0x0342}}, +{0x1F28, {0x0397, 0x0313}}, +{0x1F29, {0x0397, 0x0314}}, +{0x1F2A, {0x1F28, 0x0300}}, +{0x1F2B, {0x1F29, 0x0300}}, +{0x1F2C, {0x1F28, 0x0301}}, +{0x1F2D, {0x1F29, 0x0301}}, +{0x1F2E, {0x1F28, 0x0342}}, +{0x1F2F, {0x1F29, 0x0342}}, +{0x1F30, {0x03B9, 0x0313}}, +{0x1F31, {0x03B9, 0x0314}}, +{0x1F32, {0x1F30, 0x0300}}, +{0x1F33, {0x1F31, 0x0300}}, +{0x1F34, {0x1F30, 0x0301}}, +{0x1F35, {0x1F31, 0x0301}}, +{0x1F36, {0x1F30, 0x0342}}, +{0x1F37, {0x1F31, 0x0342}}, +{0x1F38, {0x0399, 0x0313}}, +{0x1F39, {0x0399, 0x0314}}, +{0x1F3A, {0x1F38, 0x0300}}, +{0x1F3B, {0x1F39, 0x0300}}, +{0x1F3C, {0x1F38, 0x0301}}, +{0x1F3D, {0x1F39, 0x0301}}, +{0x1F3E, {0x1F38, 0x0342}}, +{0x1F3F, {0x1F39, 0x0342}}, +{0x1F40, {0x03BF, 0x0313}}, +{0x1F41, {0x03BF, 0x0314}}, +{0x1F42, {0x1F40, 0x0300}}, +{0x1F43, {0x1F41, 0x0300}}, +{0x1F44, {0x1F40, 0x0301}}, +{0x1F45, {0x1F41, 0x0301}}, +{0x1F48, {0x039F, 0x0313}}, +{0x1F49, {0x039F, 0x0314}}, +{0x1F4A, {0x1F48, 0x0300}}, +{0x1F4B, {0x1F49, 0x0300}}, +{0x1F4C, {0x1F48, 0x0301}}, +{0x1F4D, {0x1F49, 0x0301}}, +{0x1F50, {0x03C5, 0x0313}}, +{0x1F51, {0x03C5, 0x0314}}, +{0x1F52, {0x1F50, 0x0300}}, +{0x1F53, {0x1F51, 0x0300}}, +{0x1F54, {0x1F50, 0x0301}}, +{0x1F55, {0x1F51, 0x0301}}, +{0x1F56, {0x1F50, 0x0342}}, +{0x1F57, {0x1F51, 0x0342}}, +{0x1F59, {0x03A5, 0x0314}}, +{0x1F5B, {0x1F59, 0x0300}}, +{0x1F5D, {0x1F59, 0x0301}}, +{0x1F5F, {0x1F59, 0x0342}}, +{0x1F60, {0x03C9, 0x0313}}, +{0x1F61, {0x03C9, 0x0314}}, +{0x1F62, {0x1F60, 0x0300}}, +{0x1F63, {0x1F61, 0x0300}}, +{0x1F64, {0x1F60, 0x0301}}, +{0x1F65, {0x1F61, 0x0301}}, +{0x1F66, {0x1F60, 0x0342}}, +{0x1F67, {0x1F61, 0x0342}}, +{0x1F68, {0x03A9, 0x0313}}, +{0x1F69, {0x03A9, 0x0314}}, +{0x1F6A, {0x1F68, 0x0300}}, +{0x1F6B, {0x1F69, 0x0300}}, +{0x1F6C, {0x1F68, 0x0301}}, +{0x1F6D, {0x1F69, 0x0301}}, +{0x1F6E, {0x1F68, 0x0342}}, +{0x1F6F, {0x1F69, 0x0342}}, +{0x1F70, {0x03B1, 0x0300}}, +{0x1F71, {0x03AC, -1}}, +{0x1F72, {0x03B5, 0x0300}}, +{0x1F73, {0x03AD, -1}}, +{0x1F74, {0x03B7, 0x0300}}, +{0x1F75, {0x03AE, -1}}, +{0x1F76, {0x03B9, 0x0300}}, +{0x1F77, {0x03AF, -1}}, +{0x1F78, {0x03BF, 0x0300}}, +{0x1F79, {0x03CC, -1}}, +{0x1F7A, {0x03C5, 0x0300}}, +{0x1F7B, {0x03CD, -1}}, +{0x1F7C, {0x03C9, 0x0300}}, +{0x1F7D, {0x03CE, -1}}, +{0x1F80, {0x1F00, 0x0345}}, +{0x1F81, {0x1F01, 0x0345}}, +{0x1F82, {0x1F02, 0x0345}}, +{0x1F83, {0x1F03, 0x0345}}, +{0x1F84, {0x1F04, 0x0345}}, +{0x1F85, {0x1F05, 0x0345}}, +{0x1F86, {0x1F06, 0x0345}}, +{0x1F87, {0x1F07, 0x0345}}, +{0x1F88, {0x1F08, 0x0345}}, +{0x1F89, {0x1F09, 0x0345}}, +{0x1F8A, {0x1F0A, 0x0345}}, +{0x1F8B, {0x1F0B, 0x0345}}, +{0x1F8C, {0x1F0C, 0x0345}}, +{0x1F8D, {0x1F0D, 0x0345}}, +{0x1F8E, {0x1F0E, 0x0345}}, +{0x1F8F, {0x1F0F, 0x0345}}, +{0x1F90, {0x1F20, 0x0345}}, +{0x1F91, {0x1F21, 0x0345}}, +{0x1F92, {0x1F22, 0x0345}}, +{0x1F93, {0x1F23, 0x0345}}, +{0x1F94, {0x1F24, 0x0345}}, +{0x1F95, {0x1F25, 0x0345}}, +{0x1F96, {0x1F26, 0x0345}}, +{0x1F97, {0x1F27, 0x0345}}, +{0x1F98, {0x1F28, 0x0345}}, +{0x1F99, {0x1F29, 0x0345}}, +{0x1F9A, {0x1F2A, 0x0345}}, +{0x1F9B, {0x1F2B, 0x0345}}, +{0x1F9C, {0x1F2C, 0x0345}}, +{0x1F9D, {0x1F2D, 0x0345}}, +{0x1F9E, {0x1F2E, 0x0345}}, +{0x1F9F, {0x1F2F, 0x0345}}, +{0x1FA0, {0x1F60, 0x0345}}, +{0x1FA1, {0x1F61, 0x0345}}, +{0x1FA2, {0x1F62, 0x0345}}, +{0x1FA3, {0x1F63, 0x0345}}, +{0x1FA4, {0x1F64, 0x0345}}, +{0x1FA5, {0x1F65, 0x0345}}, +{0x1FA6, {0x1F66, 0x0345}}, +{0x1FA7, {0x1F67, 0x0345}}, +{0x1FA8, {0x1F68, 0x0345}}, +{0x1FA9, {0x1F69, 0x0345}}, +{0x1FAA, {0x1F6A, 0x0345}}, +{0x1FAB, {0x1F6B, 0x0345}}, +{0x1FAC, {0x1F6C, 0x0345}}, +{0x1FAD, {0x1F6D, 0x0345}}, +{0x1FAE, {0x1F6E, 0x0345}}, +{0x1FAF, {0x1F6F, 0x0345}}, +{0x1FB0, {0x03B1, 0x0306}}, +{0x1FB1, {0x03B1, 0x0304}}, +{0x1FB2, {0x1F70, 0x0345}}, +{0x1FB3, {0x03B1, 0x0345}}, +{0x1FB4, {0x03AC, 0x0345}}, +{0x1FB6, {0x03B1, 0x0342}}, +{0x1FB7, {0x1FB6, 0x0345}}, +{0x1FB8, {0x0391, 0x0306}}, +{0x1FB9, {0x0391, 0x0304}}, +{0x1FBA, {0x0391, 0x0300}}, +{0x1FBB, {0x0386, -1}}, +{0x1FBC, {0x0391, 0x0345}}, +{0x1FBE, {0x03B9, -1}}, +{0x1FC1, {0x00A8, 0x0342}}, +{0x1FC2, {0x1F74, 0x0345}}, +{0x1FC3, {0x03B7, 0x0345}}, +{0x1FC4, {0x03AE, 0x0345}}, +{0x1FC6, {0x03B7, 0x0342}}, +{0x1FC7, {0x1FC6, 0x0345}}, +{0x1FC8, {0x0395, 0x0300}}, +{0x1FC9, {0x0388, -1}}, +{0x1FCA, {0x0397, 0x0300}}, +{0x1FCB, {0x0389, -1}}, +{0x1FCC, {0x0397, 0x0345}}, +{0x1FCD, {0x1FBF, 0x0300}}, +{0x1FCE, {0x1FBF, 0x0301}}, +{0x1FCF, {0x1FBF, 0x0342}}, +{0x1FD0, {0x03B9, 0x0306}}, +{0x1FD1, {0x03B9, 0x0304}}, +{0x1FD2, {0x03CA, 0x0300}}, +{0x1FD3, {0x0390, -1}}, +{0x1FD6, {0x03B9, 0x0342}}, +{0x1FD7, {0x03CA, 0x0342}}, +{0x1FD8, {0x0399, 0x0306}}, +{0x1FD9, {0x0399, 0x0304}}, +{0x1FDA, {0x0399, 0x0300}}, +{0x1FDB, {0x038A, -1}}, +{0x1FDD, {0x1FFE, 0x0300}}, +{0x1FDE, {0x1FFE, 0x0301}}, +{0x1FDF, {0x1FFE, 0x0342}}, +{0x1FE0, {0x03C5, 0x0306}}, +{0x1FE1, {0x03C5, 0x0304}}, +{0x1FE2, {0x03CB, 0x0300}}, +{0x1FE3, {0x03B0, -1}}, +{0x1FE4, {0x03C1, 0x0313}}, +{0x1FE5, {0x03C1, 0x0314}}, +{0x1FE6, {0x03C5, 0x0342}}, +{0x1FE7, {0x03CB, 0x0342}}, +{0x1FE8, {0x03A5, 0x0306}}, +{0x1FE9, {0x03A5, 0x0304}}, +{0x1FEA, {0x03A5, 0x0300}}, +{0x1FEB, {0x038E, -1}}, +{0x1FEC, {0x03A1, 0x0314}}, +{0x1FED, {0x00A8, 0x0300}}, +{0x1FEE, {0x0385, -1}}, +{0x1FEF, {0x0060, -1}}, +{0x1FF2, {0x1F7C, 0x0345}}, +{0x1FF3, {0x03C9, 0x0345}}, +{0x1FF4, {0x03CE, 0x0345}}, +{0x1FF6, {0x03C9, 0x0342}}, +{0x1FF7, {0x1FF6, 0x0345}}, +{0x1FF8, {0x039F, 0x0300}}, +{0x1FF9, {0x038C, -1}}, +{0x1FFA, {0x03A9, 0x0300}}, +{0x1FFB, {0x038F, -1}}, +{0x1FFC, {0x03A9, 0x0345}}, +{0x1FFD, {0x00B4, -1}}, +{0x2000, {0x2002, -1}}, +{0x2001, {0x2003, -1}}, +{0x2126, {0x03A9, -1}}, +{0x212A, {0x004B, -1}}, +{0x212B, {0x00C5, -1}}, +{0x219A, {0x2190, 0x0338}}, +{0x219B, {0x2192, 0x0338}}, +{0x21AE, {0x2194, 0x0338}}, +{0x21CD, {0x21D0, 0x0338}}, +{0x21CE, {0x21D4, 0x0338}}, +{0x21CF, {0x21D2, 0x0338}}, +{0x2204, {0x2203, 0x0338}}, +{0x2209, {0x2208, 0x0338}}, +{0x220C, {0x220B, 0x0338}}, +{0x2224, {0x2223, 0x0338}}, +{0x2226, {0x2225, 0x0338}}, +{0x2241, {0x223C, 0x0338}}, +{0x2244, {0x2243, 0x0338}}, +{0x2247, {0x2245, 0x0338}}, +{0x2249, {0x2248, 0x0338}}, +{0x2260, {0x003D, 0x0338}}, +{0x2262, {0x2261, 0x0338}}, +{0x226D, {0x224D, 0x0338}}, +{0x226E, {0x003C, 0x0338}}, +{0x226F, {0x003E, 0x0338}}, +{0x2270, {0x2264, 0x0338}}, +{0x2271, {0x2265, 0x0338}}, +{0x2274, {0x2272, 0x0338}}, +{0x2275, {0x2273, 0x0338}}, +{0x2278, {0x2276, 0x0338}}, +{0x2279, {0x2277, 0x0338}}, +{0x2280, {0x227A, 0x0338}}, +{0x2281, {0x227B, 0x0338}}, +{0x2284, {0x2282, 0x0338}}, +{0x2285, {0x2283, 0x0338}}, +{0x2288, {0x2286, 0x0338}}, +{0x2289, {0x2287, 0x0338}}, +{0x22AC, {0x22A2, 0x0338}}, +{0x22AD, {0x22A8, 0x0338}}, +{0x22AE, {0x22A9, 0x0338}}, +{0x22AF, {0x22AB, 0x0338}}, +{0x22E0, {0x227C, 0x0338}}, +{0x22E1, {0x227D, 0x0338}}, +{0x22E2, {0x2291, 0x0338}}, +{0x22E3, {0x2292, 0x0338}}, +{0x22EA, {0x22B2, 0x0338}}, +{0x22EB, {0x22B3, 0x0338}}, +{0x22EC, {0x22B4, 0x0338}}, +{0x22ED, {0x22B5, 0x0338}}, +{0x2329, {0x3008, -1}}, +{0x232A, {0x3009, -1}}, +{0x2ADC, {0x2ADD, 0x0338}}, +{0x304C, {0x304B, 0x3099}}, +{0x304E, {0x304D, 0x3099}}, +{0x3050, {0x304F, 0x3099}}, +{0x3052, {0x3051, 0x3099}}, +{0x3054, {0x3053, 0x3099}}, +{0x3056, {0x3055, 0x3099}}, +{0x3058, {0x3057, 0x3099}}, +{0x305A, {0x3059, 0x3099}}, +{0x305C, {0x305B, 0x3099}}, +{0x305E, {0x305D, 0x3099}}, +{0x3060, {0x305F, 0x3099}}, +{0x3062, {0x3061, 0x3099}}, +{0x3065, {0x3064, 0x3099}}, +{0x3067, {0x3066, 0x3099}}, +{0x3069, {0x3068, 0x3099}}, +{0x3070, {0x306F, 0x3099}}, +{0x3071, {0x306F, 0x309A}}, +{0x3073, {0x3072, 0x3099}}, +{0x3074, {0x3072, 0x309A}}, +{0x3076, {0x3075, 0x3099}}, +{0x3077, {0x3075, 0x309A}}, +{0x3079, {0x3078, 0x3099}}, +{0x307A, {0x3078, 0x309A}}, +{0x307C, {0x307B, 0x3099}}, +{0x307D, {0x307B, 0x309A}}, +{0x3094, {0x3046, 0x3099}}, +{0x309E, {0x309D, 0x3099}}, +{0x30AC, {0x30AB, 0x3099}}, +{0x30AE, {0x30AD, 0x3099}}, +{0x30B0, {0x30AF, 0x3099}}, +{0x30B2, {0x30B1, 0x3099}}, +{0x30B4, {0x30B3, 0x3099}}, +{0x30B6, {0x30B5, 0x3099}}, +{0x30B8, {0x30B7, 0x3099}}, +{0x30BA, {0x30B9, 0x3099}}, +{0x30BC, {0x30BB, 0x3099}}, +{0x30BE, {0x30BD, 0x3099}}, +{0x30C0, {0x30BF, 0x3099}}, +{0x30C2, {0x30C1, 0x3099}}, +{0x30C5, {0x30C4, 0x3099}}, +{0x30C7, {0x30C6, 0x3099}}, +{0x30C9, {0x30C8, 0x3099}}, +{0x30D0, {0x30CF, 0x3099}}, +{0x30D1, {0x30CF, 0x309A}}, +{0x30D3, {0x30D2, 0x3099}}, +{0x30D4, {0x30D2, 0x309A}}, +{0x30D6, {0x30D5, 0x3099}}, +{0x30D7, {0x30D5, 0x309A}}, +{0x30D9, {0x30D8, 0x3099}}, +{0x30DA, {0x30D8, 0x309A}}, +{0x30DC, {0x30DB, 0x3099}}, +{0x30DD, {0x30DB, 0x309A}}, +{0x30F4, {0x30A6, 0x3099}}, +{0x30F7, {0x30EF, 0x3099}}, +{0x30F8, {0x30F0, 0x3099}}, +{0x30F9, {0x30F1, 0x3099}}, +{0x30FA, {0x30F2, 0x3099}}, +{0x30FE, {0x30FD, 0x3099}}, +{0xF900, {0x8C48, -1}}, +{0xF901, {0x66F4, -1}}, +{0xF902, {0x8ECA, -1}}, +{0xF903, {0x8CC8, -1}}, +{0xF904, {0x6ED1, -1}}, +{0xF905, {0x4E32, -1}}, +{0xF906, {0x53E5, -1}}, +{0xF907, {0x9F9C, -1}}, +{0xF908, {0x9F9C, -1}}, +{0xF909, {0x5951, -1}}, +{0xF90A, {0x91D1, -1}}, +{0xF90B, {0x5587, -1}}, +{0xF90C, {0x5948, -1}}, +{0xF90D, {0x61F6, -1}}, +{0xF90E, {0x7669, -1}}, +{0xF90F, {0x7F85, -1}}, +{0xF910, {0x863F, -1}}, +{0xF911, {0x87BA, -1}}, +{0xF912, {0x88F8, -1}}, +{0xF913, {0x908F, -1}}, +{0xF914, {0x6A02, -1}}, +{0xF915, {0x6D1B, -1}}, +{0xF916, {0x70D9, -1}}, +{0xF917, {0x73DE, -1}}, +{0xF918, {0x843D, -1}}, +{0xF919, {0x916A, -1}}, +{0xF91A, {0x99F1, -1}}, +{0xF91B, {0x4E82, -1}}, +{0xF91C, {0x5375, -1}}, +{0xF91D, {0x6B04, -1}}, +{0xF91E, {0x721B, -1}}, +{0xF91F, {0x862D, -1}}, +{0xF920, {0x9E1E, -1}}, +{0xF921, {0x5D50, -1}}, +{0xF922, {0x6FEB, -1}}, +{0xF923, {0x85CD, -1}}, +{0xF924, {0x8964, -1}}, +{0xF925, {0x62C9, -1}}, +{0xF926, {0x81D8, -1}}, +{0xF927, {0x881F, -1}}, +{0xF928, {0x5ECA, -1}}, +{0xF929, {0x6717, -1}}, +{0xF92A, {0x6D6A, -1}}, +{0xF92B, {0x72FC, -1}}, +{0xF92C, {0x90CE, -1}}, +{0xF92D, {0x4F86, -1}}, +{0xF92E, {0x51B7, -1}}, +{0xF92F, {0x52DE, -1}}, +{0xF930, {0x64C4, -1}}, +{0xF931, {0x6AD3, -1}}, +{0xF932, {0x7210, -1}}, +{0xF933, {0x76E7, -1}}, +{0xF934, {0x8001, -1}}, +{0xF935, {0x8606, -1}}, +{0xF936, {0x865C, -1}}, +{0xF937, {0x8DEF, -1}}, +{0xF938, {0x9732, -1}}, +{0xF939, {0x9B6F, -1}}, +{0xF93A, {0x9DFA, -1}}, +{0xF93B, {0x788C, -1}}, +{0xF93C, {0x797F, -1}}, +{0xF93D, {0x7DA0, -1}}, +{0xF93E, {0x83C9, -1}}, +{0xF93F, {0x9304, -1}}, +{0xF940, {0x9E7F, -1}}, +{0xF941, {0x8AD6, -1}}, +{0xF942, {0x58DF, -1}}, +{0xF943, {0x5F04, -1}}, +{0xF944, {0x7C60, -1}}, +{0xF945, {0x807E, -1}}, +{0xF946, {0x7262, -1}}, +{0xF947, {0x78CA, -1}}, +{0xF948, {0x8CC2, -1}}, +{0xF949, {0x96F7, -1}}, +{0xF94A, {0x58D8, -1}}, +{0xF94B, {0x5C62, -1}}, +{0xF94C, {0x6A13, -1}}, +{0xF94D, {0x6DDA, -1}}, +{0xF94E, {0x6F0F, -1}}, +{0xF94F, {0x7D2F, -1}}, +{0xF950, {0x7E37, -1}}, +{0xF951, {0x964B, -1}}, +{0xF952, {0x52D2, -1}}, +{0xF953, {0x808B, -1}}, +{0xF954, {0x51DC, -1}}, +{0xF955, {0x51CC, -1}}, +{0xF956, {0x7A1C, -1}}, +{0xF957, {0x7DBE, -1}}, +{0xF958, {0x83F1, -1}}, +{0xF959, {0x9675, -1}}, +{0xF95A, {0x8B80, -1}}, +{0xF95B, {0x62CF, -1}}, +{0xF95C, {0x6A02, -1}}, +{0xF95D, {0x8AFE, -1}}, +{0xF95E, {0x4E39, -1}}, +{0xF95F, {0x5BE7, -1}}, +{0xF960, {0x6012, -1}}, +{0xF961, {0x7387, -1}}, +{0xF962, {0x7570, -1}}, +{0xF963, {0x5317, -1}}, +{0xF964, {0x78FB, -1}}, +{0xF965, {0x4FBF, -1}}, +{0xF966, {0x5FA9, -1}}, +{0xF967, {0x4E0D, -1}}, +{0xF968, {0x6CCC, -1}}, +{0xF969, {0x6578, -1}}, +{0xF96A, {0x7D22, -1}}, +{0xF96B, {0x53C3, -1}}, +{0xF96C, {0x585E, -1}}, +{0xF96D, {0x7701, -1}}, +{0xF96E, {0x8449, -1}}, +{0xF96F, {0x8AAA, -1}}, +{0xF970, {0x6BBA, -1}}, +{0xF971, {0x8FB0, -1}}, +{0xF972, {0x6C88, -1}}, +{0xF973, {0x62FE, -1}}, +{0xF974, {0x82E5, -1}}, +{0xF975, {0x63A0, -1}}, +{0xF976, {0x7565, -1}}, +{0xF977, {0x4EAE, -1}}, +{0xF978, {0x5169, -1}}, +{0xF979, {0x51C9, -1}}, +{0xF97A, {0x6881, -1}}, +{0xF97B, {0x7CE7, -1}}, +{0xF97C, {0x826F, -1}}, +{0xF97D, {0x8AD2, -1}}, +{0xF97E, {0x91CF, -1}}, +{0xF97F, {0x52F5, -1}}, +{0xF980, {0x5442, -1}}, +{0xF981, {0x5973, -1}}, +{0xF982, {0x5EEC, -1}}, +{0xF983, {0x65C5, -1}}, +{0xF984, {0x6FFE, -1}}, +{0xF985, {0x792A, -1}}, +{0xF986, {0x95AD, -1}}, +{0xF987, {0x9A6A, -1}}, +{0xF988, {0x9E97, -1}}, +{0xF989, {0x9ECE, -1}}, +{0xF98A, {0x529B, -1}}, +{0xF98B, {0x66C6, -1}}, +{0xF98C, {0x6B77, -1}}, +{0xF98D, {0x8F62, -1}}, +{0xF98E, {0x5E74, -1}}, +{0xF98F, {0x6190, -1}}, +{0xF990, {0x6200, -1}}, +{0xF991, {0x649A, -1}}, +{0xF992, {0x6F23, -1}}, +{0xF993, {0x7149, -1}}, +{0xF994, {0x7489, -1}}, +{0xF995, {0x79CA, -1}}, +{0xF996, {0x7DF4, -1}}, +{0xF997, {0x806F, -1}}, +{0xF998, {0x8F26, -1}}, +{0xF999, {0x84EE, -1}}, +{0xF99A, {0x9023, -1}}, +{0xF99B, {0x934A, -1}}, +{0xF99C, {0x5217, -1}}, +{0xF99D, {0x52A3, -1}}, +{0xF99E, {0x54BD, -1}}, +{0xF99F, {0x70C8, -1}}, +{0xF9A0, {0x88C2, -1}}, +{0xF9A1, {0x8AAA, -1}}, +{0xF9A2, {0x5EC9, -1}}, +{0xF9A3, {0x5FF5, -1}}, +{0xF9A4, {0x637B, -1}}, +{0xF9A5, {0x6BAE, -1}}, +{0xF9A6, {0x7C3E, -1}}, +{0xF9A7, {0x7375, -1}}, +{0xF9A8, {0x4EE4, -1}}, +{0xF9A9, {0x56F9, -1}}, +{0xF9AA, {0x5BE7, -1}}, +{0xF9AB, {0x5DBA, -1}}, +{0xF9AC, {0x601C, -1}}, +{0xF9AD, {0x73B2, -1}}, +{0xF9AE, {0x7469, -1}}, +{0xF9AF, {0x7F9A, -1}}, +{0xF9B0, {0x8046, -1}}, +{0xF9B1, {0x9234, -1}}, +{0xF9B2, {0x96F6, -1}}, +{0xF9B3, {0x9748, -1}}, +{0xF9B4, {0x9818, -1}}, +{0xF9B5, {0x4F8B, -1}}, +{0xF9B6, {0x79AE, -1}}, +{0xF9B7, {0x91B4, -1}}, +{0xF9B8, {0x96B8, -1}}, +{0xF9B9, {0x60E1, -1}}, +{0xF9BA, {0x4E86, -1}}, +{0xF9BB, {0x50DA, -1}}, +{0xF9BC, {0x5BEE, -1}}, +{0xF9BD, {0x5C3F, -1}}, +{0xF9BE, {0x6599, -1}}, +{0xF9BF, {0x6A02, -1}}, +{0xF9C0, {0x71CE, -1}}, +{0xF9C1, {0x7642, -1}}, +{0xF9C2, {0x84FC, -1}}, +{0xF9C3, {0x907C, -1}}, +{0xF9C4, {0x9F8D, -1}}, +{0xF9C5, {0x6688, -1}}, +{0xF9C6, {0x962E, -1}}, +{0xF9C7, {0x5289, -1}}, +{0xF9C8, {0x677B, -1}}, +{0xF9C9, {0x67F3, -1}}, +{0xF9CA, {0x6D41, -1}}, +{0xF9CB, {0x6E9C, -1}}, +{0xF9CC, {0x7409, -1}}, +{0xF9CD, {0x7559, -1}}, +{0xF9CE, {0x786B, -1}}, +{0xF9CF, {0x7D10, -1}}, +{0xF9D0, {0x985E, -1}}, +{0xF9D1, {0x516D, -1}}, +{0xF9D2, {0x622E, -1}}, +{0xF9D3, {0x9678, -1}}, +{0xF9D4, {0x502B, -1}}, +{0xF9D5, {0x5D19, -1}}, +{0xF9D6, {0x6DEA, -1}}, +{0xF9D7, {0x8F2A, -1}}, +{0xF9D8, {0x5F8B, -1}}, +{0xF9D9, {0x6144, -1}}, +{0xF9DA, {0x6817, -1}}, +{0xF9DB, {0x7387, -1}}, +{0xF9DC, {0x9686, -1}}, +{0xF9DD, {0x5229, -1}}, +{0xF9DE, {0x540F, -1}}, +{0xF9DF, {0x5C65, -1}}, +{0xF9E0, {0x6613, -1}}, +{0xF9E1, {0x674E, -1}}, +{0xF9E2, {0x68A8, -1}}, +{0xF9E3, {0x6CE5, -1}}, +{0xF9E4, {0x7406, -1}}, +{0xF9E5, {0x75E2, -1}}, +{0xF9E6, {0x7F79, -1}}, +{0xF9E7, {0x88CF, -1}}, +{0xF9E8, {0x88E1, -1}}, +{0xF9E9, {0x91CC, -1}}, +{0xF9EA, {0x96E2, -1}}, +{0xF9EB, {0x533F, -1}}, +{0xF9EC, {0x6EBA, -1}}, +{0xF9ED, {0x541D, -1}}, +{0xF9EE, {0x71D0, -1}}, +{0xF9EF, {0x7498, -1}}, +{0xF9F0, {0x85FA, -1}}, +{0xF9F1, {0x96A3, -1}}, +{0xF9F2, {0x9C57, -1}}, +{0xF9F3, {0x9E9F, -1}}, +{0xF9F4, {0x6797, -1}}, +{0xF9F5, {0x6DCB, -1}}, +{0xF9F6, {0x81E8, -1}}, +{0xF9F7, {0x7ACB, -1}}, +{0xF9F8, {0x7B20, -1}}, +{0xF9F9, {0x7C92, -1}}, +{0xF9FA, {0x72C0, -1}}, +{0xF9FB, {0x7099, -1}}, +{0xF9FC, {0x8B58, -1}}, +{0xF9FD, {0x4EC0, -1}}, +{0xF9FE, {0x8336, -1}}, +{0xF9FF, {0x523A, -1}}, +{0xFA00, {0x5207, -1}}, +{0xFA01, {0x5EA6, -1}}, +{0xFA02, {0x62D3, -1}}, +{0xFA03, {0x7CD6, -1}}, +{0xFA04, {0x5B85, -1}}, +{0xFA05, {0x6D1E, -1}}, +{0xFA06, {0x66B4, -1}}, +{0xFA07, {0x8F3B, -1}}, +{0xFA08, {0x884C, -1}}, +{0xFA09, {0x964D, -1}}, +{0xFA0A, {0x898B, -1}}, +{0xFA0B, {0x5ED3, -1}}, +{0xFA0C, {0x5140, -1}}, +{0xFA0D, {0x55C0, -1}}, +{0xFA10, {0x585A, -1}}, +{0xFA12, {0x6674, -1}}, +{0xFA15, {0x51DE, -1}}, +{0xFA16, {0x732A, -1}}, +{0xFA17, {0x76CA, -1}}, +{0xFA18, {0x793C, -1}}, +{0xFA19, {0x795E, -1}}, +{0xFA1A, {0x7965, -1}}, +{0xFA1B, {0x798F, -1}}, +{0xFA1C, {0x9756, -1}}, +{0xFA1D, {0x7CBE, -1}}, +{0xFA1E, {0x7FBD, -1}}, +{0xFA20, {0x8612, -1}}, +{0xFA22, {0x8AF8, -1}}, +{0xFA25, {0x9038, -1}}, +{0xFA26, {0x90FD, -1}}, +{0xFA2A, {0x98EF, -1}}, +{0xFA2B, {0x98FC, -1}}, +{0xFA2C, {0x9928, -1}}, +{0xFA2D, {0x9DB4, -1}}, +{0xFA2E, {0x90DE, -1}}, +{0xFA2F, {0x96B7, -1}}, +{0xFA30, {0x4FAE, -1}}, +{0xFA31, {0x50E7, -1}}, +{0xFA32, {0x514D, -1}}, +{0xFA33, {0x52C9, -1}}, +{0xFA34, {0x52E4, -1}}, +{0xFA35, {0x5351, -1}}, +{0xFA36, {0x559D, -1}}, +{0xFA37, {0x5606, -1}}, +{0xFA38, {0x5668, -1}}, +{0xFA39, {0x5840, -1}}, +{0xFA3A, {0x58A8, -1}}, +{0xFA3B, {0x5C64, -1}}, +{0xFA3C, {0x5C6E, -1}}, +{0xFA3D, {0x6094, -1}}, +{0xFA3E, {0x6168, -1}}, +{0xFA3F, {0x618E, -1}}, +{0xFA40, {0x61F2, -1}}, +{0xFA41, {0x654F, -1}}, +{0xFA42, {0x65E2, -1}}, +{0xFA43, {0x6691, -1}}, +{0xFA44, {0x6885, -1}}, +{0xFA45, {0x6D77, -1}}, +{0xFA46, {0x6E1A, -1}}, +{0xFA47, {0x6F22, -1}}, +{0xFA48, {0x716E, -1}}, +{0xFA49, {0x722B, -1}}, +{0xFA4A, {0x7422, -1}}, +{0xFA4B, {0x7891, -1}}, +{0xFA4C, {0x793E, -1}}, +{0xFA4D, {0x7949, -1}}, +{0xFA4E, {0x7948, -1}}, +{0xFA4F, {0x7950, -1}}, +{0xFA50, {0x7956, -1}}, +{0xFA51, {0x795D, -1}}, +{0xFA52, {0x798D, -1}}, +{0xFA53, {0x798E, -1}}, +{0xFA54, {0x7A40, -1}}, +{0xFA55, {0x7A81, -1}}, +{0xFA56, {0x7BC0, -1}}, +{0xFA57, {0x7DF4, -1}}, +{0xFA58, {0x7E09, -1}}, +{0xFA59, {0x7E41, -1}}, +{0xFA5A, {0x7F72, -1}}, +{0xFA5B, {0x8005, -1}}, +{0xFA5C, {0x81ED, -1}}, +{0xFA5D, {0x8279, -1}}, +{0xFA5E, {0x8279, -1}}, +{0xFA5F, {0x8457, -1}}, +{0xFA60, {0x8910, -1}}, +{0xFA61, {0x8996, -1}}, +{0xFA62, {0x8B01, -1}}, +{0xFA63, {0x8B39, -1}}, +{0xFA64, {0x8CD3, -1}}, +{0xFA65, {0x8D08, -1}}, +{0xFA66, {0x8FB6, -1}}, +{0xFA67, {0x9038, -1}}, +{0xFA68, {0x96E3, -1}}, +{0xFA69, {0x97FF, -1}}, +{0xFA6A, {0x983B, -1}}, +{0xFA6B, {0x6075, -1}}, +{0xFA6C, {0x242EE, -1}}, +{0xFA6D, {0x8218, -1}}, +{0xFA70, {0x4E26, -1}}, +{0xFA71, {0x51B5, -1}}, +{0xFA72, {0x5168, -1}}, +{0xFA73, {0x4F80, -1}}, +{0xFA74, {0x5145, -1}}, +{0xFA75, {0x5180, -1}}, +{0xFA76, {0x52C7, -1}}, +{0xFA77, {0x52FA, -1}}, +{0xFA78, {0x559D, -1}}, +{0xFA79, {0x5555, -1}}, +{0xFA7A, {0x5599, -1}}, +{0xFA7B, {0x55E2, -1}}, +{0xFA7C, {0x585A, -1}}, +{0xFA7D, {0x58B3, -1}}, +{0xFA7E, {0x5944, -1}}, +{0xFA7F, {0x5954, -1}}, +{0xFA80, {0x5A62, -1}}, +{0xFA81, {0x5B28, -1}}, +{0xFA82, {0x5ED2, -1}}, +{0xFA83, {0x5ED9, -1}}, +{0xFA84, {0x5F69, -1}}, +{0xFA85, {0x5FAD, -1}}, +{0xFA86, {0x60D8, -1}}, +{0xFA87, {0x614E, -1}}, +{0xFA88, {0x6108, -1}}, +{0xFA89, {0x618E, -1}}, +{0xFA8A, {0x6160, -1}}, +{0xFA8B, {0x61F2, -1}}, +{0xFA8C, {0x6234, -1}}, +{0xFA8D, {0x63C4, -1}}, +{0xFA8E, {0x641C, -1}}, +{0xFA8F, {0x6452, -1}}, +{0xFA90, {0x6556, -1}}, +{0xFA91, {0x6674, -1}}, +{0xFA92, {0x6717, -1}}, +{0xFA93, {0x671B, -1}}, +{0xFA94, {0x6756, -1}}, +{0xFA95, {0x6B79, -1}}, +{0xFA96, {0x6BBA, -1}}, +{0xFA97, {0x6D41, -1}}, +{0xFA98, {0x6EDB, -1}}, +{0xFA99, {0x6ECB, -1}}, +{0xFA9A, {0x6F22, -1}}, +{0xFA9B, {0x701E, -1}}, +{0xFA9C, {0x716E, -1}}, +{0xFA9D, {0x77A7, -1}}, +{0xFA9E, {0x7235, -1}}, +{0xFA9F, {0x72AF, -1}}, +{0xFAA0, {0x732A, -1}}, +{0xFAA1, {0x7471, -1}}, +{0xFAA2, {0x7506, -1}}, +{0xFAA3, {0x753B, -1}}, +{0xFAA4, {0x761D, -1}}, +{0xFAA5, {0x761F, -1}}, +{0xFAA6, {0x76CA, -1}}, +{0xFAA7, {0x76DB, -1}}, +{0xFAA8, {0x76F4, -1}}, +{0xFAA9, {0x774A, -1}}, +{0xFAAA, {0x7740, -1}}, +{0xFAAB, {0x78CC, -1}}, +{0xFAAC, {0x7AB1, -1}}, +{0xFAAD, {0x7BC0, -1}}, +{0xFAAE, {0x7C7B, -1}}, +{0xFAAF, {0x7D5B, -1}}, +{0xFAB0, {0x7DF4, -1}}, +{0xFAB1, {0x7F3E, -1}}, +{0xFAB2, {0x8005, -1}}, +{0xFAB3, {0x8352, -1}}, +{0xFAB4, {0x83EF, -1}}, +{0xFAB5, {0x8779, -1}}, +{0xFAB6, {0x8941, -1}}, +{0xFAB7, {0x8986, -1}}, +{0xFAB8, {0x8996, -1}}, +{0xFAB9, {0x8ABF, -1}}, +{0xFABA, {0x8AF8, -1}}, +{0xFABB, {0x8ACB, -1}}, +{0xFABC, {0x8B01, -1}}, +{0xFABD, {0x8AFE, -1}}, +{0xFABE, {0x8AED, -1}}, +{0xFABF, {0x8B39, -1}}, +{0xFAC0, {0x8B8A, -1}}, +{0xFAC1, {0x8D08, -1}}, +{0xFAC2, {0x8F38, -1}}, +{0xFAC3, {0x9072, -1}}, +{0xFAC4, {0x9199, -1}}, +{0xFAC5, {0x9276, -1}}, +{0xFAC6, {0x967C, -1}}, +{0xFAC7, {0x96E3, -1}}, +{0xFAC8, {0x9756, -1}}, +{0xFAC9, {0x97DB, -1}}, +{0xFACA, {0x97FF, -1}}, +{0xFACB, {0x980B, -1}}, +{0xFACC, {0x983B, -1}}, +{0xFACD, {0x9B12, -1}}, +{0xFACE, {0x9F9C, -1}}, +{0xFACF, {0x2284A, -1}}, +{0xFAD0, {0x22844, -1}}, +{0xFAD1, {0x233D5, -1}}, +{0xFAD2, {0x3B9D, -1}}, +{0xFAD3, {0x4018, -1}}, +{0xFAD4, {0x4039, -1}}, +{0xFAD5, {0x25249, -1}}, +{0xFAD6, {0x25CD0, -1}}, +{0xFAD7, {0x27ED3, -1}}, +{0xFAD8, {0x9F43, -1}}, +{0xFAD9, {0x9F8E, -1}}, +{0xFB1D, {0x05D9, 0x05B4}}, +{0xFB1F, {0x05F2, 0x05B7}}, +{0xFB2A, {0x05E9, 0x05C1}}, +{0xFB2B, {0x05E9, 0x05C2}}, +{0xFB2C, {0xFB49, 0x05C1}}, +{0xFB2D, {0xFB49, 0x05C2}}, +{0xFB2E, {0x05D0, 0x05B7}}, +{0xFB2F, {0x05D0, 0x05B8}}, +{0xFB30, {0x05D0, 0x05BC}}, +{0xFB31, {0x05D1, 0x05BC}}, +{0xFB32, {0x05D2, 0x05BC}}, +{0xFB33, {0x05D3, 0x05BC}}, +{0xFB34, {0x05D4, 0x05BC}}, +{0xFB35, {0x05D5, 0x05BC}}, +{0xFB36, {0x05D6, 0x05BC}}, +{0xFB38, {0x05D8, 0x05BC}}, +{0xFB39, {0x05D9, 0x05BC}}, +{0xFB3A, {0x05DA, 0x05BC}}, +{0xFB3B, {0x05DB, 0x05BC}}, +{0xFB3C, {0x05DC, 0x05BC}}, +{0xFB3E, {0x05DE, 0x05BC}}, +{0xFB40, {0x05E0, 0x05BC}}, +{0xFB41, {0x05E1, 0x05BC}}, +{0xFB43, {0x05E3, 0x05BC}}, +{0xFB44, {0x05E4, 0x05BC}}, +{0xFB46, {0x05E6, 0x05BC}}, +{0xFB47, {0x05E7, 0x05BC}}, +{0xFB48, {0x05E8, 0x05BC}}, +{0xFB49, {0x05E9, 0x05BC}}, +{0xFB4A, {0x05EA, 0x05BC}}, +{0xFB4B, {0x05D5, 0x05B9}}, +{0xFB4C, {0x05D1, 0x05BF}}, +{0xFB4D, {0x05DB, 0x05BF}}, +{0xFB4E, {0x05E4, 0x05BF}}, +{0x1109A, {0x11099, 0x110BA}}, +{0x1109C, {0x1109B, 0x110BA}}, +{0x110AB, {0x110A5, 0x110BA}}, +{0x1112E, {0x11131, 0x11127}}, +{0x1112F, {0x11132, 0x11127}}, +{0x1134B, {0x11347, 0x1133E}}, +{0x1134C, {0x11347, 0x11357}}, +{0x114BB, {0x114B9, 0x114BA}}, +{0x114BC, {0x114B9, 0x114B0}}, +{0x114BE, {0x114B9, 0x114BD}}, +{0x115BA, {0x115B8, 0x115AF}}, +{0x115BB, {0x115B9, 0x115AF}}, +{0x11938, {0x11935, 0x11930}}, +{0x1D15E, {0x1D157, 0x1D165}}, +{0x1D15F, {0x1D158, 0x1D165}}, +{0x1D160, {0x1D15F, 0x1D16E}}, +{0x1D161, {0x1D15F, 0x1D16F}}, +{0x1D162, {0x1D15F, 0x1D170}}, +{0x1D163, {0x1D15F, 0x1D171}}, +{0x1D164, {0x1D15F, 0x1D172}}, +{0x1D1BB, {0x1D1B9, 0x1D165}}, +{0x1D1BC, {0x1D1BA, 0x1D165}}, +{0x1D1BD, {0x1D1BB, 0x1D16E}}, +{0x1D1BE, {0x1D1BC, 0x1D16E}}, +{0x1D1BF, {0x1D1BB, 0x1D16F}}, +{0x1D1C0, {0x1D1BC, 0x1D16F}}, +{0x2F800, {0x4E3D, -1}}, +{0x2F801, {0x4E38, -1}}, +{0x2F802, {0x4E41, -1}}, +{0x2F803, {0x20122, -1}}, +{0x2F804, {0x4F60, -1}}, +{0x2F805, {0x4FAE, -1}}, +{0x2F806, {0x4FBB, -1}}, +{0x2F807, {0x5002, -1}}, +{0x2F808, {0x507A, -1}}, +{0x2F809, {0x5099, -1}}, +{0x2F80A, {0x50E7, -1}}, +{0x2F80B, {0x50CF, -1}}, +{0x2F80C, {0x349E, -1}}, +{0x2F80D, {0x2063A, -1}}, +{0x2F80E, {0x514D, -1}}, +{0x2F80F, {0x5154, -1}}, +{0x2F810, {0x5164, -1}}, +{0x2F811, {0x5177, -1}}, +{0x2F812, {0x2051C, -1}}, +{0x2F813, {0x34B9, -1}}, +{0x2F814, {0x5167, -1}}, +{0x2F815, {0x518D, -1}}, +{0x2F816, {0x2054B, -1}}, +{0x2F817, {0x5197, -1}}, +{0x2F818, {0x51A4, -1}}, +{0x2F819, {0x4ECC, -1}}, +{0x2F81A, {0x51AC, -1}}, +{0x2F81B, {0x51B5, -1}}, +{0x2F81C, {0x291DF, -1}}, +{0x2F81D, {0x51F5, -1}}, +{0x2F81E, {0x5203, -1}}, +{0x2F81F, {0x34DF, -1}}, +{0x2F820, {0x523B, -1}}, +{0x2F821, {0x5246, -1}}, +{0x2F822, {0x5272, -1}}, +{0x2F823, {0x5277, -1}}, +{0x2F824, {0x3515, -1}}, +{0x2F825, {0x52C7, -1}}, +{0x2F826, {0x52C9, -1}}, +{0x2F827, {0x52E4, -1}}, +{0x2F828, {0x52FA, -1}}, +{0x2F829, {0x5305, -1}}, +{0x2F82A, {0x5306, -1}}, +{0x2F82B, {0x5317, -1}}, +{0x2F82C, {0x5349, -1}}, +{0x2F82D, {0x5351, -1}}, +{0x2F82E, {0x535A, -1}}, +{0x2F82F, {0x5373, -1}}, +{0x2F830, {0x537D, -1}}, +{0x2F831, {0x537F, -1}}, +{0x2F832, {0x537F, -1}}, +{0x2F833, {0x537F, -1}}, +{0x2F834, {0x20A2C, -1}}, +{0x2F835, {0x7070, -1}}, +{0x2F836, {0x53CA, -1}}, +{0x2F837, {0x53DF, -1}}, +{0x2F838, {0x20B63, -1}}, +{0x2F839, {0x53EB, -1}}, +{0x2F83A, {0x53F1, -1}}, +{0x2F83B, {0x5406, -1}}, +{0x2F83C, {0x549E, -1}}, +{0x2F83D, {0x5438, -1}}, +{0x2F83E, {0x5448, -1}}, +{0x2F83F, {0x5468, -1}}, +{0x2F840, {0x54A2, -1}}, +{0x2F841, {0x54F6, -1}}, +{0x2F842, {0x5510, -1}}, +{0x2F843, {0x5553, -1}}, +{0x2F844, {0x5563, -1}}, +{0x2F845, {0x5584, -1}}, +{0x2F846, {0x5584, -1}}, +{0x2F847, {0x5599, -1}}, +{0x2F848, {0x55AB, -1}}, +{0x2F849, {0x55B3, -1}}, +{0x2F84A, {0x55C2, -1}}, +{0x2F84B, {0x5716, -1}}, +{0x2F84C, {0x5606, -1}}, +{0x2F84D, {0x5717, -1}}, +{0x2F84E, {0x5651, -1}}, +{0x2F84F, {0x5674, -1}}, +{0x2F850, {0x5207, -1}}, +{0x2F851, {0x58EE, -1}}, +{0x2F852, {0x57CE, -1}}, +{0x2F853, {0x57F4, -1}}, +{0x2F854, {0x580D, -1}}, +{0x2F855, {0x578B, -1}}, +{0x2F856, {0x5832, -1}}, +{0x2F857, {0x5831, -1}}, +{0x2F858, {0x58AC, -1}}, +{0x2F859, {0x214E4, -1}}, +{0x2F85A, {0x58F2, -1}}, +{0x2F85B, {0x58F7, -1}}, +{0x2F85C, {0x5906, -1}}, +{0x2F85D, {0x591A, -1}}, +{0x2F85E, {0x5922, -1}}, +{0x2F85F, {0x5962, -1}}, +{0x2F860, {0x216A8, -1}}, +{0x2F861, {0x216EA, -1}}, +{0x2F862, {0x59EC, -1}}, +{0x2F863, {0x5A1B, -1}}, +{0x2F864, {0x5A27, -1}}, +{0x2F865, {0x59D8, -1}}, +{0x2F866, {0x5A66, -1}}, +{0x2F867, {0x36EE, -1}}, +{0x2F868, {0x36FC, -1}}, +{0x2F869, {0x5B08, -1}}, +{0x2F86A, {0x5B3E, -1}}, +{0x2F86B, {0x5B3E, -1}}, +{0x2F86C, {0x219C8, -1}}, +{0x2F86D, {0x5BC3, -1}}, +{0x2F86E, {0x5BD8, -1}}, +{0x2F86F, {0x5BE7, -1}}, +{0x2F870, {0x5BF3, -1}}, +{0x2F871, {0x21B18, -1}}, +{0x2F872, {0x5BFF, -1}}, +{0x2F873, {0x5C06, -1}}, +{0x2F874, {0x5F53, -1}}, +{0x2F875, {0x5C22, -1}}, +{0x2F876, {0x3781, -1}}, +{0x2F877, {0x5C60, -1}}, +{0x2F878, {0x5C6E, -1}}, +{0x2F879, {0x5CC0, -1}}, +{0x2F87A, {0x5C8D, -1}}, +{0x2F87B, {0x21DE4, -1}}, +{0x2F87C, {0x5D43, -1}}, +{0x2F87D, {0x21DE6, -1}}, +{0x2F87E, {0x5D6E, -1}}, +{0x2F87F, {0x5D6B, -1}}, +{0x2F880, {0x5D7C, -1}}, +{0x2F881, {0x5DE1, -1}}, +{0x2F882, {0x5DE2, -1}}, +{0x2F883, {0x382F, -1}}, +{0x2F884, {0x5DFD, -1}}, +{0x2F885, {0x5E28, -1}}, +{0x2F886, {0x5E3D, -1}}, +{0x2F887, {0x5E69, -1}}, +{0x2F888, {0x3862, -1}}, +{0x2F889, {0x22183, -1}}, +{0x2F88A, {0x387C, -1}}, +{0x2F88B, {0x5EB0, -1}}, +{0x2F88C, {0x5EB3, -1}}, +{0x2F88D, {0x5EB6, -1}}, +{0x2F88E, {0x5ECA, -1}}, +{0x2F88F, {0x2A392, -1}}, +{0x2F890, {0x5EFE, -1}}, +{0x2F891, {0x22331, -1}}, +{0x2F892, {0x22331, -1}}, +{0x2F893, {0x8201, -1}}, +{0x2F894, {0x5F22, -1}}, +{0x2F895, {0x5F22, -1}}, +{0x2F896, {0x38C7, -1}}, +{0x2F897, {0x232B8, -1}}, +{0x2F898, {0x261DA, -1}}, +{0x2F899, {0x5F62, -1}}, +{0x2F89A, {0x5F6B, -1}}, +{0x2F89B, {0x38E3, -1}}, +{0x2F89C, {0x5F9A, -1}}, +{0x2F89D, {0x5FCD, -1}}, +{0x2F89E, {0x5FD7, -1}}, +{0x2F89F, {0x5FF9, -1}}, +{0x2F8A0, {0x6081, -1}}, +{0x2F8A1, {0x393A, -1}}, +{0x2F8A2, {0x391C, -1}}, +{0x2F8A3, {0x6094, -1}}, +{0x2F8A4, {0x226D4, -1}}, +{0x2F8A5, {0x60C7, -1}}, +{0x2F8A6, {0x6148, -1}}, +{0x2F8A7, {0x614C, -1}}, +{0x2F8A8, {0x614E, -1}}, +{0x2F8A9, {0x614C, -1}}, +{0x2F8AA, {0x617A, -1}}, +{0x2F8AB, {0x618E, -1}}, +{0x2F8AC, {0x61B2, -1}}, +{0x2F8AD, {0x61A4, -1}}, +{0x2F8AE, {0x61AF, -1}}, +{0x2F8AF, {0x61DE, -1}}, +{0x2F8B0, {0x61F2, -1}}, +{0x2F8B1, {0x61F6, -1}}, +{0x2F8B2, {0x6210, -1}}, +{0x2F8B3, {0x621B, -1}}, +{0x2F8B4, {0x625D, -1}}, +{0x2F8B5, {0x62B1, -1}}, +{0x2F8B6, {0x62D4, -1}}, +{0x2F8B7, {0x6350, -1}}, +{0x2F8B8, {0x22B0C, -1}}, +{0x2F8B9, {0x633D, -1}}, +{0x2F8BA, {0x62FC, -1}}, +{0x2F8BB, {0x6368, -1}}, +{0x2F8BC, {0x6383, -1}}, +{0x2F8BD, {0x63E4, -1}}, +{0x2F8BE, {0x22BF1, -1}}, +{0x2F8BF, {0x6422, -1}}, +{0x2F8C0, {0x63C5, -1}}, +{0x2F8C1, {0x63A9, -1}}, +{0x2F8C2, {0x3A2E, -1}}, +{0x2F8C3, {0x6469, -1}}, +{0x2F8C4, {0x647E, -1}}, +{0x2F8C5, {0x649D, -1}}, +{0x2F8C6, {0x6477, -1}}, +{0x2F8C7, {0x3A6C, -1}}, +{0x2F8C8, {0x654F, -1}}, +{0x2F8C9, {0x656C, -1}}, +{0x2F8CA, {0x2300A, -1}}, +{0x2F8CB, {0x65E3, -1}}, +{0x2F8CC, {0x66F8, -1}}, +{0x2F8CD, {0x6649, -1}}, +{0x2F8CE, {0x3B19, -1}}, +{0x2F8CF, {0x6691, -1}}, +{0x2F8D0, {0x3B08, -1}}, +{0x2F8D1, {0x3AE4, -1}}, +{0x2F8D2, {0x5192, -1}}, +{0x2F8D3, {0x5195, -1}}, +{0x2F8D4, {0x6700, -1}}, +{0x2F8D5, {0x669C, -1}}, +{0x2F8D6, {0x80AD, -1}}, +{0x2F8D7, {0x43D9, -1}}, +{0x2F8D8, {0x6717, -1}}, +{0x2F8D9, {0x671B, -1}}, +{0x2F8DA, {0x6721, -1}}, +{0x2F8DB, {0x675E, -1}}, +{0x2F8DC, {0x6753, -1}}, +{0x2F8DD, {0x233C3, -1}}, +{0x2F8DE, {0x3B49, -1}}, +{0x2F8DF, {0x67FA, -1}}, +{0x2F8E0, {0x6785, -1}}, +{0x2F8E1, {0x6852, -1}}, +{0x2F8E2, {0x6885, -1}}, +{0x2F8E3, {0x2346D, -1}}, +{0x2F8E4, {0x688E, -1}}, +{0x2F8E5, {0x681F, -1}}, +{0x2F8E6, {0x6914, -1}}, +{0x2F8E7, {0x3B9D, -1}}, +{0x2F8E8, {0x6942, -1}}, +{0x2F8E9, {0x69A3, -1}}, +{0x2F8EA, {0x69EA, -1}}, +{0x2F8EB, {0x6AA8, -1}}, +{0x2F8EC, {0x236A3, -1}}, +{0x2F8ED, {0x6ADB, -1}}, +{0x2F8EE, {0x3C18, -1}}, +{0x2F8EF, {0x6B21, -1}}, +{0x2F8F0, {0x238A7, -1}}, +{0x2F8F1, {0x6B54, -1}}, +{0x2F8F2, {0x3C4E, -1}}, +{0x2F8F3, {0x6B72, -1}}, +{0x2F8F4, {0x6B9F, -1}}, +{0x2F8F5, {0x6BBA, -1}}, +{0x2F8F6, {0x6BBB, -1}}, +{0x2F8F7, {0x23A8D, -1}}, +{0x2F8F8, {0x21D0B, -1}}, +{0x2F8F9, {0x23AFA, -1}}, +{0x2F8FA, {0x6C4E, -1}}, +{0x2F8FB, {0x23CBC, -1}}, +{0x2F8FC, {0x6CBF, -1}}, +{0x2F8FD, {0x6CCD, -1}}, +{0x2F8FE, {0x6C67, -1}}, +{0x2F8FF, {0x6D16, -1}}, +{0x2F900, {0x6D3E, -1}}, +{0x2F901, {0x6D77, -1}}, +{0x2F902, {0x6D41, -1}}, +{0x2F903, {0x6D69, -1}}, +{0x2F904, {0x6D78, -1}}, +{0x2F905, {0x6D85, -1}}, +{0x2F906, {0x23D1E, -1}}, +{0x2F907, {0x6D34, -1}}, +{0x2F908, {0x6E2F, -1}}, +{0x2F909, {0x6E6E, -1}}, +{0x2F90A, {0x3D33, -1}}, +{0x2F90B, {0x6ECB, -1}}, +{0x2F90C, {0x6EC7, -1}}, +{0x2F90D, {0x23ED1, -1}}, +{0x2F90E, {0x6DF9, -1}}, +{0x2F90F, {0x6F6E, -1}}, +{0x2F910, {0x23F5E, -1}}, +{0x2F911, {0x23F8E, -1}}, +{0x2F912, {0x6FC6, -1}}, +{0x2F913, {0x7039, -1}}, +{0x2F914, {0x701E, -1}}, +{0x2F915, {0x701B, -1}}, +{0x2F916, {0x3D96, -1}}, +{0x2F917, {0x704A, -1}}, +{0x2F918, {0x707D, -1}}, +{0x2F919, {0x7077, -1}}, +{0x2F91A, {0x70AD, -1}}, +{0x2F91B, {0x20525, -1}}, +{0x2F91C, {0x7145, -1}}, +{0x2F91D, {0x24263, -1}}, +{0x2F91E, {0x719C, -1}}, +{0x2F91F, {0x243AB, -1}}, +{0x2F920, {0x7228, -1}}, +{0x2F921, {0x7235, -1}}, +{0x2F922, {0x7250, -1}}, +{0x2F923, {0x24608, -1}}, +{0x2F924, {0x7280, -1}}, +{0x2F925, {0x7295, -1}}, +{0x2F926, {0x24735, -1}}, +{0x2F927, {0x24814, -1}}, +{0x2F928, {0x737A, -1}}, +{0x2F929, {0x738B, -1}}, +{0x2F92A, {0x3EAC, -1}}, +{0x2F92B, {0x73A5, -1}}, +{0x2F92C, {0x3EB8, -1}}, +{0x2F92D, {0x3EB8, -1}}, +{0x2F92E, {0x7447, -1}}, +{0x2F92F, {0x745C, -1}}, +{0x2F930, {0x7471, -1}}, +{0x2F931, {0x7485, -1}}, +{0x2F932, {0x74CA, -1}}, +{0x2F933, {0x3F1B, -1}}, +{0x2F934, {0x7524, -1}}, +{0x2F935, {0x24C36, -1}}, +{0x2F936, {0x753E, -1}}, +{0x2F937, {0x24C92, -1}}, +{0x2F938, {0x7570, -1}}, +{0x2F939, {0x2219F, -1}}, +{0x2F93A, {0x7610, -1}}, +{0x2F93B, {0x24FA1, -1}}, +{0x2F93C, {0x24FB8, -1}}, +{0x2F93D, {0x25044, -1}}, +{0x2F93E, {0x3FFC, -1}}, +{0x2F93F, {0x4008, -1}}, +{0x2F940, {0x76F4, -1}}, +{0x2F941, {0x250F3, -1}}, +{0x2F942, {0x250F2, -1}}, +{0x2F943, {0x25119, -1}}, +{0x2F944, {0x25133, -1}}, +{0x2F945, {0x771E, -1}}, +{0x2F946, {0x771F, -1}}, +{0x2F947, {0x771F, -1}}, +{0x2F948, {0x774A, -1}}, +{0x2F949, {0x4039, -1}}, +{0x2F94A, {0x778B, -1}}, +{0x2F94B, {0x4046, -1}}, +{0x2F94C, {0x4096, -1}}, +{0x2F94D, {0x2541D, -1}}, +{0x2F94E, {0x784E, -1}}, +{0x2F94F, {0x788C, -1}}, +{0x2F950, {0x78CC, -1}}, +{0x2F951, {0x40E3, -1}}, +{0x2F952, {0x25626, -1}}, +{0x2F953, {0x7956, -1}}, +{0x2F954, {0x2569A, -1}}, +{0x2F955, {0x256C5, -1}}, +{0x2F956, {0x798F, -1}}, +{0x2F957, {0x79EB, -1}}, +{0x2F958, {0x412F, -1}}, +{0x2F959, {0x7A40, -1}}, +{0x2F95A, {0x7A4A, -1}}, +{0x2F95B, {0x7A4F, -1}}, +{0x2F95C, {0x2597C, -1}}, +{0x2F95D, {0x25AA7, -1}}, +{0x2F95E, {0x25AA7, -1}}, +{0x2F95F, {0x7AEE, -1}}, +{0x2F960, {0x4202, -1}}, +{0x2F961, {0x25BAB, -1}}, +{0x2F962, {0x7BC6, -1}}, +{0x2F963, {0x7BC9, -1}}, +{0x2F964, {0x4227, -1}}, +{0x2F965, {0x25C80, -1}}, +{0x2F966, {0x7CD2, -1}}, +{0x2F967, {0x42A0, -1}}, +{0x2F968, {0x7CE8, -1}}, +{0x2F969, {0x7CE3, -1}}, +{0x2F96A, {0x7D00, -1}}, +{0x2F96B, {0x25F86, -1}}, +{0x2F96C, {0x7D63, -1}}, +{0x2F96D, {0x4301, -1}}, +{0x2F96E, {0x7DC7, -1}}, +{0x2F96F, {0x7E02, -1}}, +{0x2F970, {0x7E45, -1}}, +{0x2F971, {0x4334, -1}}, +{0x2F972, {0x26228, -1}}, +{0x2F973, {0x26247, -1}}, +{0x2F974, {0x4359, -1}}, +{0x2F975, {0x262D9, -1}}, +{0x2F976, {0x7F7A, -1}}, +{0x2F977, {0x2633E, -1}}, +{0x2F978, {0x7F95, -1}}, +{0x2F979, {0x7FFA, -1}}, +{0x2F97A, {0x8005, -1}}, +{0x2F97B, {0x264DA, -1}}, +{0x2F97C, {0x26523, -1}}, +{0x2F97D, {0x8060, -1}}, +{0x2F97E, {0x265A8, -1}}, +{0x2F97F, {0x8070, -1}}, +{0x2F980, {0x2335F, -1}}, +{0x2F981, {0x43D5, -1}}, +{0x2F982, {0x80B2, -1}}, +{0x2F983, {0x8103, -1}}, +{0x2F984, {0x440B, -1}}, +{0x2F985, {0x813E, -1}}, +{0x2F986, {0x5AB5, -1}}, +{0x2F987, {0x267A7, -1}}, +{0x2F988, {0x267B5, -1}}, +{0x2F989, {0x23393, -1}}, +{0x2F98A, {0x2339C, -1}}, +{0x2F98B, {0x8201, -1}}, +{0x2F98C, {0x8204, -1}}, +{0x2F98D, {0x8F9E, -1}}, +{0x2F98E, {0x446B, -1}}, +{0x2F98F, {0x8291, -1}}, +{0x2F990, {0x828B, -1}}, +{0x2F991, {0x829D, -1}}, +{0x2F992, {0x52B3, -1}}, +{0x2F993, {0x82B1, -1}}, +{0x2F994, {0x82B3, -1}}, +{0x2F995, {0x82BD, -1}}, +{0x2F996, {0x82E6, -1}}, +{0x2F997, {0x26B3C, -1}}, +{0x2F998, {0x82E5, -1}}, +{0x2F999, {0x831D, -1}}, +{0x2F99A, {0x8363, -1}}, +{0x2F99B, {0x83AD, -1}}, +{0x2F99C, {0x8323, -1}}, +{0x2F99D, {0x83BD, -1}}, +{0x2F99E, {0x83E7, -1}}, +{0x2F99F, {0x8457, -1}}, +{0x2F9A0, {0x8353, -1}}, +{0x2F9A1, {0x83CA, -1}}, +{0x2F9A2, {0x83CC, -1}}, +{0x2F9A3, {0x83DC, -1}}, +{0x2F9A4, {0x26C36, -1}}, +{0x2F9A5, {0x26D6B, -1}}, +{0x2F9A6, {0x26CD5, -1}}, +{0x2F9A7, {0x452B, -1}}, +{0x2F9A8, {0x84F1, -1}}, +{0x2F9A9, {0x84F3, -1}}, +{0x2F9AA, {0x8516, -1}}, +{0x2F9AB, {0x273CA, -1}}, +{0x2F9AC, {0x8564, -1}}, +{0x2F9AD, {0x26F2C, -1}}, +{0x2F9AE, {0x455D, -1}}, +{0x2F9AF, {0x4561, -1}}, +{0x2F9B0, {0x26FB1, -1}}, +{0x2F9B1, {0x270D2, -1}}, +{0x2F9B2, {0x456B, -1}}, +{0x2F9B3, {0x8650, -1}}, +{0x2F9B4, {0x865C, -1}}, +{0x2F9B5, {0x8667, -1}}, +{0x2F9B6, {0x8669, -1}}, +{0x2F9B7, {0x86A9, -1}}, +{0x2F9B8, {0x8688, -1}}, +{0x2F9B9, {0x870E, -1}}, +{0x2F9BA, {0x86E2, -1}}, +{0x2F9BB, {0x8779, -1}}, +{0x2F9BC, {0x8728, -1}}, +{0x2F9BD, {0x876B, -1}}, +{0x2F9BE, {0x8786, -1}}, +{0x2F9BF, {0x45D7, -1}}, +{0x2F9C0, {0x87E1, -1}}, +{0x2F9C1, {0x8801, -1}}, +{0x2F9C2, {0x45F9, -1}}, +{0x2F9C3, {0x8860, -1}}, +{0x2F9C4, {0x8863, -1}}, +{0x2F9C5, {0x27667, -1}}, +{0x2F9C6, {0x88D7, -1}}, +{0x2F9C7, {0x88DE, -1}}, +{0x2F9C8, {0x4635, -1}}, +{0x2F9C9, {0x88FA, -1}}, +{0x2F9CA, {0x34BB, -1}}, +{0x2F9CB, {0x278AE, -1}}, +{0x2F9CC, {0x27966, -1}}, +{0x2F9CD, {0x46BE, -1}}, +{0x2F9CE, {0x46C7, -1}}, +{0x2F9CF, {0x8AA0, -1}}, +{0x2F9D0, {0x8AED, -1}}, +{0x2F9D1, {0x8B8A, -1}}, +{0x2F9D2, {0x8C55, -1}}, +{0x2F9D3, {0x27CA8, -1}}, +{0x2F9D4, {0x8CAB, -1}}, +{0x2F9D5, {0x8CC1, -1}}, +{0x2F9D6, {0x8D1B, -1}}, +{0x2F9D7, {0x8D77, -1}}, +{0x2F9D8, {0x27F2F, -1}}, +{0x2F9D9, {0x20804, -1}}, +{0x2F9DA, {0x8DCB, -1}}, +{0x2F9DB, {0x8DBC, -1}}, +{0x2F9DC, {0x8DF0, -1}}, +{0x2F9DD, {0x208DE, -1}}, +{0x2F9DE, {0x8ED4, -1}}, +{0x2F9DF, {0x8F38, -1}}, +{0x2F9E0, {0x285D2, -1}}, +{0x2F9E1, {0x285ED, -1}}, +{0x2F9E2, {0x9094, -1}}, +{0x2F9E3, {0x90F1, -1}}, +{0x2F9E4, {0x9111, -1}}, +{0x2F9E5, {0x2872E, -1}}, +{0x2F9E6, {0x911B, -1}}, +{0x2F9E7, {0x9238, -1}}, +{0x2F9E8, {0x92D7, -1}}, +{0x2F9E9, {0x92D8, -1}}, +{0x2F9EA, {0x927C, -1}}, +{0x2F9EB, {0x93F9, -1}}, +{0x2F9EC, {0x9415, -1}}, +{0x2F9ED, {0x28BFA, -1}}, +{0x2F9EE, {0x958B, -1}}, +{0x2F9EF, {0x4995, -1}}, +{0x2F9F0, {0x95B7, -1}}, +{0x2F9F1, {0x28D77, -1}}, +{0x2F9F2, {0x49E6, -1}}, +{0x2F9F3, {0x96C3, -1}}, +{0x2F9F4, {0x5DB2, -1}}, +{0x2F9F5, {0x9723, -1}}, +{0x2F9F6, {0x29145, -1}}, +{0x2F9F7, {0x2921A, -1}}, +{0x2F9F8, {0x4A6E, -1}}, +{0x2F9F9, {0x4A76, -1}}, +{0x2F9FA, {0x97E0, -1}}, +{0x2F9FB, {0x2940A, -1}}, +{0x2F9FC, {0x4AB2, -1}}, +{0x2F9FD, {0x29496, -1}}, +{0x2F9FE, {0x980B, -1}}, +{0x2F9FF, {0x980B, -1}}, +{0x2FA00, {0x9829, -1}}, +{0x2FA01, {0x295B6, -1}}, +{0x2FA02, {0x98E2, -1}}, +{0x2FA03, {0x4B33, -1}}, +{0x2FA04, {0x9929, -1}}, +{0x2FA05, {0x99A7, -1}}, +{0x2FA06, {0x99C2, -1}}, +{0x2FA07, {0x99FE, -1}}, +{0x2FA08, {0x4BCE, -1}}, +{0x2FA09, {0x29B30, -1}}, +{0x2FA0A, {0x9B12, -1}}, +{0x2FA0B, {0x9C40, -1}}, +{0x2FA0C, {0x9CFD, -1}}, +{0x2FA0D, {0x4CCE, -1}}, +{0x2FA0E, {0x4CED, -1}}, +{0x2FA0F, {0x9D67, -1}}, +{0x2FA10, {0x2A0CE, -1}}, +{0x2FA11, {0x4CF8, -1}}, +{0x2FA12, {0x2A105, -1}}, +{0x2FA13, {0x2A20E, -1}}, +{0x2FA14, {0x2A291, -1}}, +{0x2FA15, {0x9EBB, -1}}, +{0x2FA16, {0x4D56, -1}}, +{0x2FA17, {0x9EF9, -1}}, +{0x2FA18, {0x9EFE, -1}}, +{0x2FA19, {0x9F05, -1}}, +{0x2FA1A, {0x9F0F, -1}}, +{0x2FA1B, {0x9F16, -1}}, +{0x2FA1C, {0x9F3B, -1}}, +{0x2FA1D, {0x2A600, -1}}, +}; + +std::map< std::pair, unsigned> generate_nfc_compose(); +const std::map< std::pair, unsigned> NFC_Compose = generate_nfc_compose(); + diff --git a/src/nfc_sets.hh b/src/nfc_sets.hh new file mode 100644 index 0000000..a4ad706 --- /dev/null +++ b/src/nfc_sets.hh @@ -0,0 +1,28 @@ +#ifndef NFC_SETS_HH +#define NFC_SETS_HH + +#include +#include + +// These data structures are filled by code generated automatically +// from Unicode's DerivedNormalizationProps.txt and UnicodeData.txt. +// see scripts/ subdirectory + +// TODO: (maybe) Replace them by flat_map or sorted arrays, because these might be faster. But make benchmarks first! + +// Contains all codepoints with NFC_No property. +extern const std::set NFC_No; + +// Contains all codepoints with NFC_Maybe property. +extern const std::set NFC_Maybe; + +// Contains CanonicalCombiningClass for given codepoints. All others have value 0. +extern const std::map NFC_CombiningClass; + +// Contains the canonical decomposing pairs. second member might be -1 for single decompositions. +extern const std::map> NFC_Decompose; + +// canonical composing mapping, except excluded ones according to Unicode TR-15 +extern const std::map< std::pair, unsigned> NFC_Compose; + +#endif // NFC_SETS_HH